diff options
Diffstat (limited to 'drivers/gpu/drm/tegra/dsi.c')
| -rw-r--r-- | drivers/gpu/drm/tegra/dsi.c | 59 | 
1 files changed, 39 insertions, 20 deletions
diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c index fbfe92a816d4..db606e151afc 100644 --- a/drivers/gpu/drm/tegra/dsi.c +++ b/drivers/gpu/drm/tegra/dsi.c @@ -1544,9 +1544,11 @@ static int tegra_dsi_ganged_probe(struct tegra_dsi *dsi)  	np = of_parse_phandle(dsi->dev->of_node, "nvidia,ganged-mode", 0);  	if (np) {  		struct platform_device *gangster = of_find_device_by_node(np); +		of_node_put(np); +		if (!gangster) +			return -EPROBE_DEFER;  		dsi->slave = platform_get_drvdata(gangster); -		of_node_put(np);  		if (!dsi->slave) {  			put_device(&gangster->dev); @@ -1594,44 +1596,58 @@ static int tegra_dsi_probe(struct platform_device *pdev)  	if (!pdev->dev.pm_domain) {  		dsi->rst = devm_reset_control_get(&pdev->dev, "dsi"); -		if (IS_ERR(dsi->rst)) -			return PTR_ERR(dsi->rst); +		if (IS_ERR(dsi->rst)) { +			err = PTR_ERR(dsi->rst); +			goto remove; +		}  	}  	dsi->clk = devm_clk_get(&pdev->dev, NULL); -	if (IS_ERR(dsi->clk)) -		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), -				     "cannot get DSI clock\n"); +	if (IS_ERR(dsi->clk)) { +		err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), +				    "cannot get DSI clock\n"); +		goto remove; +	}  	dsi->clk_lp = devm_clk_get(&pdev->dev, "lp"); -	if (IS_ERR(dsi->clk_lp)) -		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), -				     "cannot get low-power clock\n"); +	if (IS_ERR(dsi->clk_lp)) { +		err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), +				    "cannot get low-power clock\n"); +		goto remove; +	}  	dsi->clk_parent = devm_clk_get(&pdev->dev, "parent"); -	if (IS_ERR(dsi->clk_parent)) -		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), -				     "cannot get parent clock\n"); +	if (IS_ERR(dsi->clk_parent)) { +		err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), +				    "cannot get parent clock\n"); +		goto remove; +	}  	dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi"); -	if (IS_ERR(dsi->vdd)) -		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), -				     "cannot get VDD supply\n"); +	if (IS_ERR(dsi->vdd)) { +		err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), +				    "cannot get VDD supply\n"); +		goto remove; +	}  	err = tegra_dsi_setup_clocks(dsi);  	if (err < 0) {  		dev_err(&pdev->dev, "cannot setup clocks\n"); -		return err; +		goto remove;  	}  	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	dsi->regs = devm_ioremap_resource(&pdev->dev, regs); -	if (IS_ERR(dsi->regs)) -		return PTR_ERR(dsi->regs); +	if (IS_ERR(dsi->regs)) { +		err = PTR_ERR(dsi->regs); +		goto remove; +	}  	dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node); -	if (IS_ERR(dsi->mipi)) -		return PTR_ERR(dsi->mipi); +	if (IS_ERR(dsi->mipi)) { +		err = PTR_ERR(dsi->mipi); +		goto remove; +	}  	dsi->host.ops = &tegra_dsi_host_ops;  	dsi->host.dev = &pdev->dev; @@ -1659,9 +1675,12 @@ static int tegra_dsi_probe(struct platform_device *pdev)  	return 0;  unregister: +	pm_runtime_disable(&pdev->dev);  	mipi_dsi_host_unregister(&dsi->host);  mipi_free:  	tegra_mipi_free(dsi->mipi); +remove: +	tegra_output_remove(&dsi->output);  	return err;  }  | 
