[PATCH 18/48] drm: omapdrm: displays: Get panel source at connect time
Sebastian Reichel
sebastian.reichel at collabora.co.uk
Sat Oct 14 12:55:57 UTC 2017
Hi,
On Fri, Oct 13, 2017 at 05:59:14PM +0300, Laurent Pinchart wrote:
> The connector drivers need a handle to the source they are connected to
> in order to control the source.
>
> All drivers get that handle at probe time, resulting in probe deferral
> when the source hasn't been probed yet. However they don't need the
> handle until their connect handler is called.
>
> Move retrieval of the source handle to the connect handler to avoid
> probe deferrals.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.co.uk>
-- Sebastian
> drivers/gpu/drm/omapdrm/displays/panel-dpi.c | 35 +++++++---------
> drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 27 +++++++------
> .../omapdrm/displays/panel-lgphilips-lb035q02.c | 35 +++++++---------
> .../drm/omapdrm/displays/panel-nec-nl8048hl11.c | 39 ++++++++----------
> .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c | 35 +++++++---------
> .../drm/omapdrm/displays/panel-sony-acx565akm.c | 26 ++++++------
> .../drm/omapdrm/displays/panel-tpo-td028ttec1.c | 46 +++++++---------------
> .../drm/omapdrm/displays/panel-tpo-td043mtea1.c | 29 +++++++-------
> 8 files changed, 119 insertions(+), 153 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 6468a765f3d1..e48c4a7d5276 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -38,16 +38,25 @@ struct panel_drv_data {
> static int panel_dpi_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -60,6 +69,9 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int panel_dpi_enable(struct omap_dss_device *dssdev)
> @@ -165,7 +177,6 @@ static int panel_dpi_probe_of(struct platform_device *pdev)
> struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> struct device_node *node = pdev->dev.of_node;
> struct device_node *bl_node;
> - struct omap_dss_device *in;
> int r;
> struct display_timing timing;
> struct gpio_desc *gpio;
> @@ -207,15 +218,6 @@ static int panel_dpi_probe_of(struct platform_device *pdev)
>
> videomode_from_timing(&timing, &ddata->vm);
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&pdev->dev, "failed to find video source\n");
> - r = PTR_ERR(in);
> - goto error_free_backlight;
> - }
> -
> - ddata->in = in;
> -
> return 0;
>
> error_free_backlight:
> @@ -251,29 +253,22 @@ static int panel_dpi_probe(struct platform_device *pdev)
> r = omapdss_register_display(dssdev);
> if (r) {
> dev_err(&pdev->dev, "Failed to register panel\n");
> - goto err_reg;
> + return r;
> }
>
> return 0;
> -
> -err_reg:
> - omap_dss_put_device(ddata->in);
> - return r;
> }
>
> static int __exit panel_dpi_remove(struct platform_device *pdev)
> {
> struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> omapdss_unregister_display(dssdev);
>
> panel_dpi_disable(dssdev);
> panel_dpi_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> if (ddata->backlight)
> put_device(&ddata->backlight->dev);
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index aac14f399657..1262b7b08ba2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -703,17 +703,23 @@ static int dsicm_panel_reset(struct panel_drv_data *ddata)
> static int dsicm_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> struct device *dev = &ddata->pdev->dev;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dsi->connect(in, dssdev);
> if (r) {
> dev_err(dev, "Failed to connect to video source\n");
> - return r;
> + goto err_connect;
> }
>
> r = in->ops.dsi->request_vc(ddata->in, &ddata->channel);
> @@ -728,12 +734,15 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
> goto err_vc_id;
> }
>
> + ddata->in = in;
> return 0;
>
> err_vc_id:
> in->ops.dsi->release_vc(ddata->in, ddata->channel);
> err_req_vc:
> in->ops.dsi->disconnect(in, dssdev);
> +err_connect:
> + omap_dss_put_device(in);
> return r;
> }
>
> @@ -747,6 +756,9 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
>
> in->ops.dsi->release_vc(in, ddata->channel);
> in->ops.dsi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int dsicm_enable(struct omap_dss_device *dssdev)
> @@ -1119,7 +1131,6 @@ static int dsicm_probe_of(struct platform_device *pdev)
> {
> struct device_node *node = pdev->dev.of_node;
> struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> - struct omap_dss_device *in;
> int gpio;
>
> gpio = of_get_named_gpio(node, "reset-gpios", 0);
> @@ -1137,14 +1148,6 @@ static int dsicm_probe_of(struct platform_device *pdev)
> return gpio;
> }
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&pdev->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> /* TODO: ulps, backlight */
>
> return 0;
> @@ -1298,8 +1301,6 @@ static int __exit dsicm_remove(struct platform_device *pdev)
> backlight_device_unregister(bldev);
> }
>
> - omap_dss_put_device(ddata->in);
> -
> dsicm_cancel_ulps_work(ddata);
> destroy_workqueue(ddata->workqueue);
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index b955aa615a5f..bbcf18672433 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -119,18 +119,27 @@ static void init_lb035q02_panel(struct spi_device *spi)
> static int lb035q02_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> init_lb035q02_panel(ddata->spi);
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -143,6 +152,9 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int lb035q02_enable(struct omap_dss_device *dssdev)
> @@ -230,9 +242,7 @@ static struct omap_dss_driver lb035q02_ops = {
>
> static int lb035q02_probe_of(struct spi_device *spi)
> {
> - struct device_node *node = spi->dev.of_node;
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> - struct omap_dss_device *in;
> struct gpio_desc *gpio;
>
> gpio = devm_gpiod_get(&spi->dev, "enable", GPIOD_OUT_LOW);
> @@ -243,14 +253,6 @@ static int lb035q02_probe_of(struct spi_device *spi)
>
> ddata->enable_gpio = gpio;
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&spi->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> return 0;
> }
>
> @@ -284,29 +286,22 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
> r = omapdss_register_display(dssdev);
> if (r) {
> dev_err(&spi->dev, "Failed to register panel\n");
> - goto err_reg;
> + return r;
> }
>
> return 0;
> -
> -err_reg:
> - omap_dss_put_device(ddata->in);
> - return r;
> }
>
> static int lb035q02_panel_spi_remove(struct spi_device *spi)
> {
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> omapdss_unregister_display(dssdev);
>
> lb035q02_disable(dssdev);
> lb035q02_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 70fa5a04c00e..9e717cd4f194 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -115,16 +115,25 @@ static int init_nec_8048_wvga_lcd(struct spi_device *spi)
> static int nec_8048_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -137,6 +146,9 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int nec_8048_enable(struct omap_dss_device *dssdev)
> @@ -226,7 +238,6 @@ static int nec_8048_probe_of(struct spi_device *spi)
> {
> struct device_node *node = spi->dev.of_node;
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> - struct omap_dss_device *in;
> int gpio;
>
> gpio = of_get_named_gpio(node, "reset-gpios", 0);
> @@ -239,14 +250,6 @@ static int nec_8048_probe_of(struct spi_device *spi)
> /* XXX the panel spec doesn't mention any QVGA pin?? */
> ddata->qvga_gpio = -ENOENT;
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&spi->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> return 0;
> }
>
> @@ -285,14 +288,14 @@ static int nec_8048_probe(struct spi_device *spi)
> r = devm_gpio_request_one(&spi->dev, ddata->qvga_gpio,
> GPIOF_OUT_INIT_HIGH, "lcd QVGA");
> if (r)
> - goto err_gpio;
> + return r;
> }
>
> if (gpio_is_valid(ddata->res_gpio)) {
> r = devm_gpio_request_one(&spi->dev, ddata->res_gpio,
> GPIOF_OUT_INIT_LOW, "lcd RES");
> if (r)
> - goto err_gpio;
> + return r;
> }
>
> ddata->vm = nec_8048_panel_vm;
> @@ -307,22 +310,16 @@ static int nec_8048_probe(struct spi_device *spi)
> r = omapdss_register_display(dssdev);
> if (r) {
> dev_err(&spi->dev, "Failed to register panel\n");
> - goto err_reg;
> + return r;
> }
>
> return 0;
> -
> -err_reg:
> -err_gpio:
> - omap_dss_put_device(ddata->in);
> - return r;
> }
>
> static int nec_8048_remove(struct spi_device *spi)
> {
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>
> @@ -331,8 +328,6 @@ static int nec_8048_remove(struct spi_device *spi)
> nec_8048_disable(dssdev);
> nec_8048_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 99048e430871..d67f09a7ba4f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -61,16 +61,25 @@ static const struct videomode sharp_ls_vm = {
> static int sharp_ls_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -83,6 +92,9 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int sharp_ls_enable(struct omap_dss_device *dssdev)
> @@ -210,8 +222,6 @@ static int sharp_ls_get_gpio_of(struct device *dev, int index, int val,
> static int sharp_ls_probe_of(struct platform_device *pdev)
> {
> struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> - struct device_node *node = pdev->dev.of_node;
> - struct omap_dss_device *in;
> int r;
>
> ddata->vcc = devm_regulator_get(&pdev->dev, "envdd");
> @@ -245,14 +255,6 @@ static int sharp_ls_probe_of(struct platform_device *pdev)
> if (r)
> return r;
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&pdev->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> return 0;
> }
>
> @@ -284,29 +286,22 @@ static int sharp_ls_probe(struct platform_device *pdev)
> r = omapdss_register_display(dssdev);
> if (r) {
> dev_err(&pdev->dev, "Failed to register panel\n");
> - goto err_reg;
> + return r;
> }
>
> return 0;
> -
> -err_reg:
> - omap_dss_put_device(ddata->in);
> - return r;
> }
>
> static int __exit sharp_ls_remove(struct platform_device *pdev)
> {
> struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> omapdss_unregister_display(dssdev);
>
> sharp_ls_disable(dssdev);
> sharp_ls_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index cc5e9a68726a..c4bb33a247d0 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -510,16 +510,25 @@ static const struct attribute_group bldev_attr_group = {
> static int acx565akm_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.sdi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -532,6 +541,9 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.sdi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
> @@ -700,12 +712,6 @@ static int acx565akm_probe_of(struct spi_device *spi)
>
> ddata->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0);
>
> - ddata->in = omapdss_of_find_source_for_first_ep(np);
> - if (IS_ERR(ddata->in)) {
> - dev_err(&spi->dev, "failed to find video source\n");
> - return PTR_ERR(ddata->in);
> - }
> -
> return 0;
> }
>
> @@ -823,7 +829,6 @@ static int acx565akm_probe(struct spi_device *spi)
> err_reg_bl:
> err_detect:
> err_gpio:
> - omap_dss_put_device(ddata->in);
> return r;
> }
>
> @@ -831,7 +836,6 @@ static int acx565akm_remove(struct spi_device *spi)
> {
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>
> @@ -843,8 +847,6 @@ static int acx565akm_remove(struct spi_device *spi)
> acx565akm_disable(dssdev);
> acx565akm_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 34d8f42fefbe..f49127afd17a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -169,16 +169,25 @@ enum jbt_register {
> static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -191,6 +200,9 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
> @@ -362,23 +374,6 @@ static struct omap_dss_driver td028ttec1_ops = {
> .check_timings = td028ttec1_panel_check_timings,
> };
>
> -static int td028ttec1_probe_of(struct spi_device *spi)
> -{
> - struct device_node *node = spi->dev.of_node;
> - struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> - struct omap_dss_device *in;
> -
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&spi->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> - return 0;
> -}
> -
> static int td028ttec1_panel_probe(struct spi_device *spi)
> {
> struct panel_drv_data *ddata;
> @@ -404,10 +399,6 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>
> ddata->spi_dev = spi;
>
> - r = td028ttec1_probe_of(spi);
> - if (r)
> - return r;
> -
> ddata->vm = td028ttec1_panel_vm;
>
> dssdev = &ddata->dssdev;
> @@ -420,21 +411,16 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
> r = omapdss_register_display(dssdev);
> if (r) {
> dev_err(&spi->dev, "Failed to register panel\n");
> - goto err_reg;
> + return r;
> }
>
> return 0;
> -
> -err_reg:
> - omap_dss_put_device(ddata->in);
> - return r;
> }
>
> static int td028ttec1_panel_remove(struct spi_device *spi)
> {
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> dev_dbg(&ddata->spi_dev->dev, "%s\n", __func__);
>
> @@ -443,8 +429,6 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
> td028ttec1_panel_disable(dssdev);
> td028ttec1_panel_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 06fb5a995002..c08e22b43447 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -340,16 +340,25 @@ static void tpo_td043_power_off(struct panel_drv_data *ddata)
> static int tpo_td043_connect(struct omap_dss_device *dssdev)
> {
> struct panel_drv_data *ddata = to_panel_data(dssdev);
> - struct omap_dss_device *in = ddata->in;
> + struct omap_dss_device *in;
> int r;
>
> if (omapdss_device_is_connected(dssdev))
> return 0;
>
> + in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> + if (IS_ERR(in)) {
> + dev_err(dssdev->dev, "failed to find video source\n");
> + return PTR_ERR(in);
> + }
> +
> r = in->ops.dpi->connect(in, dssdev);
> - if (r)
> + if (r) {
> + omap_dss_put_device(in);
> return r;
> + }
>
> + ddata->in = in;
> return 0;
> }
>
> @@ -362,6 +371,9 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
> return;
>
> in->ops.dpi->disconnect(in, dssdev);
> +
> + omap_dss_put_device(in);
> + ddata->in = NULL;
> }
>
> static int tpo_td043_enable(struct omap_dss_device *dssdev)
> @@ -463,7 +475,6 @@ static int tpo_td043_probe_of(struct spi_device *spi)
> {
> struct device_node *node = spi->dev.of_node;
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> - struct omap_dss_device *in;
> int gpio;
>
> gpio = of_get_named_gpio(node, "reset-gpios", 0);
> @@ -473,14 +484,6 @@ static int tpo_td043_probe_of(struct spi_device *spi)
> }
> ddata->nreset_gpio = gpio;
>
> - in = omapdss_of_find_source_for_first_ep(node);
> - if (IS_ERR(in)) {
> - dev_err(&spi->dev, "failed to find video source\n");
> - return PTR_ERR(in);
> - }
> -
> - ddata->in = in;
> -
> return 0;
> }
>
> @@ -561,7 +564,6 @@ static int tpo_td043_probe(struct spi_device *spi)
> err_sysfs:
> err_gpio_req:
> err_regulator:
> - omap_dss_put_device(ddata->in);
> return r;
> }
>
> @@ -569,7 +571,6 @@ static int tpo_td043_remove(struct spi_device *spi)
> {
> struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
> struct omap_dss_device *dssdev = &ddata->dssdev;
> - struct omap_dss_device *in = ddata->in;
>
> dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>
> @@ -578,8 +579,6 @@ static int tpo_td043_remove(struct spi_device *spi)
> tpo_td043_disable(dssdev);
> tpo_td043_disconnect(dssdev);
>
> - omap_dss_put_device(in);
> -
> sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
>
> return 0;
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20171014/0c408800/attachment-0001.sig>
More information about the dri-devel
mailing list