diff options
Diffstat (limited to 'drivers/gpu/drm/tegra/dsi.c')
| -rw-r--r-- | drivers/gpu/drm/tegra/dsi.c | 51 | 
1 files changed, 24 insertions, 27 deletions
diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c index de1333dc0d86..a9870c828374 100644 --- a/drivers/gpu/drm/tegra/dsi.c +++ b/drivers/gpu/drm/tegra/dsi.c @@ -912,6 +912,15 @@ static void tegra_dsi_encoder_enable(struct drm_encoder *encoder)  	u32 value;  	int err; +	/* If the bootloader enabled DSI it needs to be disabled +	 * in order for the panel initialization commands to be +	 * properly sent. +	 */ +	value = tegra_dsi_readl(dsi, DSI_POWER_CONTROL); + +	if (value & DSI_POWER_CONTROL_ENABLE) +		tegra_dsi_disable(dsi); +  	err = tegra_dsi_prepare(dsi);  	if (err < 0) {  		dev_err(dsi->dev, "failed to prepare: %d\n", err); @@ -1589,28 +1598,24 @@ static int tegra_dsi_probe(struct platform_device *pdev)  	}  	dsi->clk = devm_clk_get(&pdev->dev, NULL); -	if (IS_ERR(dsi->clk)) { -		dev_err(&pdev->dev, "cannot get DSI clock\n"); -		return PTR_ERR(dsi->clk); -	} +	if (IS_ERR(dsi->clk)) +		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), +				     "cannot get DSI clock\n");  	dsi->clk_lp = devm_clk_get(&pdev->dev, "lp"); -	if (IS_ERR(dsi->clk_lp)) { -		dev_err(&pdev->dev, "cannot get low-power clock\n"); -		return PTR_ERR(dsi->clk_lp); -	} +	if (IS_ERR(dsi->clk_lp)) +		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), +				     "cannot get low-power clock\n");  	dsi->clk_parent = devm_clk_get(&pdev->dev, "parent"); -	if (IS_ERR(dsi->clk_parent)) { -		dev_err(&pdev->dev, "cannot get parent clock\n"); -		return PTR_ERR(dsi->clk_parent); -	} +	if (IS_ERR(dsi->clk_parent)) +		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), +				     "cannot get parent clock\n");  	dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi"); -	if (IS_ERR(dsi->vdd)) { -		dev_err(&pdev->dev, "cannot get VDD supply\n"); -		return PTR_ERR(dsi->vdd); -	} +	if (IS_ERR(dsi->vdd)) +		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), +				     "cannot get VDD supply\n");  	err = tegra_dsi_setup_clocks(dsi);  	if (err < 0) { @@ -1659,26 +1664,18 @@ mipi_free:  	return err;  } -static int tegra_dsi_remove(struct platform_device *pdev) +static void tegra_dsi_remove(struct platform_device *pdev)  {  	struct tegra_dsi *dsi = platform_get_drvdata(pdev); -	int err;  	pm_runtime_disable(&pdev->dev); -	err = host1x_client_unregister(&dsi->client); -	if (err < 0) { -		dev_err(&pdev->dev, "failed to unregister host1x client: %d\n", -			err); -		return err; -	} +	host1x_client_unregister(&dsi->client);  	tegra_output_remove(&dsi->output);  	mipi_dsi_host_unregister(&dsi->host);  	tegra_mipi_free(dsi->mipi); - -	return 0;  }  static const struct of_device_id tegra_dsi_of_match[] = { @@ -1696,5 +1693,5 @@ struct platform_driver tegra_dsi_driver = {  		.of_match_table = tegra_dsi_of_match,  	},  	.probe = tegra_dsi_probe, -	.remove = tegra_dsi_remove, +	.remove_new = tegra_dsi_remove,  };  | 
