static int rk32_lvds_probe(struct platform_device *pdev)
{
	struct rk32_lvds *lvds;
	struct resource *res;
	struct device_node *np = pdev->dev.of_node;

	if (!np) {
		dev_err(&pdev->dev, "Missing device tree node.\n");
		return -EINVAL;
	}

	lvds = devm_kzalloc(&pdev->dev, sizeof(struct rk32_lvds), GFP_KERNEL);
	if (!lvds) {
		dev_err(&pdev->dev, "no memory for state\n");
		return -ENOMEM;
	}
	lvds->dev = &pdev->dev;
	rk_fb_get_prmry_screen(&lvds->screen);
	if ((lvds->screen.type != SCREEN_RGB) && 
		(lvds->screen.type != SCREEN_LVDS) &&
		(lvds->screen.type != SCREEN_DUAL_LVDS)) {
		dev_err(&pdev->dev, "screen is not lvds/rgb!\n");		
		writel_relaxed(0xffff8000, RK_GRF_VIRT + RK3288_GRF_SOC_CON7);
		return -EINVAL;
	}
	platform_set_drvdata(pdev, lvds);
	dev_set_name(lvds->dev, "rk32-lvds");
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	lvds->regs = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(lvds->regs)) {
		dev_err(&pdev->dev, "ioremap reg failed\n");
		return PTR_ERR(lvds->regs);
	}
	lvds->pclk = devm_clk_get(&pdev->dev,"pclk_lvds");
	if (IS_ERR(lvds->pclk)) {
		dev_err(&pdev->dev, "get clk failed\n");
		return PTR_ERR(lvds->pclk);
	}
	lvds->pd = devm_clk_get(&pdev->dev,"pd_lvds");
	if (IS_ERR(lvds->pd)) {
		dev_err(&pdev->dev, "get clk failed\n");
		return PTR_ERR(lvds->pd);
	}	
	if (support_uboot_display()) {
		rk32_lvds_clk_enable(lvds);
	}

	rk32_lvds = lvds;
	rk_fb_trsm_ops_register(&trsm_lvds_ops,SCREEN_LVDS);
	dev_info(&pdev->dev, "rk32 lvds driver probe success\n");

	return 0;
}
Exemple #2
0
static int rk32_edp_probe(struct platform_device *pdev)
{
	struct rk32_edp *edp;
	struct resource *res;
	struct device_node *np = pdev->dev.of_node;
	int ret;

	if (!np) {
		dev_err(&pdev->dev, "Missing device tree node.\n");
		return -EINVAL;
	}

	edp = devm_kzalloc(&pdev->dev, sizeof(struct rk32_edp), GFP_KERNEL);
	if (!edp) {
		dev_err(&pdev->dev, "no memory for state\n");
		return -ENOMEM;
	}
	edp->dev = &pdev->dev;
	edp->video_info.h_sync_polarity	= 0;
	edp->video_info.v_sync_polarity	= 0;
	edp->video_info.interlaced	= 0;
	edp->video_info.color_space	= CS_RGB;
	edp->video_info.dynamic_range	= VESA;
	edp->video_info.ycbcr_coeff	= COLOR_YCBCR601;
	edp->video_info.color_depth	= COLOR_8;

	edp->video_info.link_rate	= LINK_RATE_1_62GBPS;
	edp->video_info.lane_count	= LANE_CNT4;
	rk_fb_get_prmry_screen(&edp->screen);
	if (edp->screen.type != SCREEN_EDP) {
		dev_err(&pdev->dev, "screen is not edp!\n");
		return -EINVAL;
	}
	platform_set_drvdata(pdev, edp);
	dev_set_name(edp->dev, "rk32-edp");
	
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	edp->regs = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(edp->regs)) {
		dev_err(&pdev->dev, "ioremap reg failed\n");
		return PTR_ERR(edp->regs);
	}

	edp->clk_edp = devm_clk_get(&pdev->dev,"clk_edp");
	if (IS_ERR(edp->clk_edp)) {
		dev_err(&pdev->dev, "cannot get clk_edp\n");
		return PTR_ERR(edp->clk_edp);
	}

	edp->clk_24m = devm_clk_get(&pdev->dev,"clk_edp_24m");
	if (IS_ERR(edp->clk_24m)) {
		dev_err(&pdev->dev, "cannot get clk_edp_24m\n");
		return PTR_ERR(edp->clk_24m);
	}

	edp->pclk = devm_clk_get(&pdev->dev,"pclk_edp");
	if (IS_ERR(edp->pclk)) {
		dev_err(&pdev->dev, "cannot get pclk\n");
		return PTR_ERR(edp->pclk);
	}

	clk_prepare(edp->pclk);
	clk_prepare(edp->clk_edp);
	clk_prepare(edp->clk_24m);
	rk32_edp_clk_enable(edp);
	rk32_edp_pre_init();
	edp->irq = platform_get_irq(pdev, 0);
	if (edp->irq < 0) {
		dev_err(&pdev->dev, "cannot find IRQ\n");
		return edp->irq;
	}
	ret = devm_request_irq(&pdev->dev, edp->irq, rk32_edp_isr, 0,
			dev_name(&pdev->dev), edp);
	if (ret) {
		dev_err(&pdev->dev, "cannot claim IRQ %d\n", edp->irq);
		return ret;
	}
	disable_irq_nosync(edp->irq);
	rk32_edp_clk_disable(edp);
	rk32_edp = edp;
	rk_fb_trsm_ops_register(&trsm_edp_ops, SCREEN_EDP);
	dev_info(&pdev->dev, "rk32 edp driver probe success\n");

	return 0;
}