[PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations

Sebastian Reichel sebastian.reichel at collabora.com
Sun Dec 9 21:59:43 UTC 2018


Hi,

On Wed, Dec 05, 2018 at 05:00:02PM +0200, Laurent Pinchart wrote:
> The omapdrm and omapdss drivers are architectured based on display
> pipelines made of multiple components handled from sink (display) to
> source (DSS output). This is incompatible with the DRM bridge and panel
> APIs that handle components from source to sink.
> 
> Reconcile the omapdrm and omapdss drivers with the DRM bridge and panel
> model by reversing the direction of the DSS device .enable() and
> .disable() operations. This completes the move to the DRM bridge model,
> with the notable exception of the DSI pipelines that will require more
> work.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.com>

-- Sebastian

>  .../omapdrm/displays/connector-analog-tv.c    | 21 --------
>  .../gpu/drm/omapdrm/displays/connector-dvi.c  | 21 --------
>  .../gpu/drm/omapdrm/displays/connector-hdmi.c | 21 --------
>  .../gpu/drm/omapdrm/displays/encoder-opa362.c | 25 +--------
>  .../gpu/drm/omapdrm/displays/encoder-tfp410.c | 21 +-------
>  .../drm/omapdrm/displays/encoder-tpd12s015.c  | 35 -------------
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c  | 18 ++-----
>  .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 22 +++-----
>  .../displays/panel-lgphilips-lb035q02.c       | 16 +-----
>  .../omapdrm/displays/panel-nec-nl8048hl11.c   | 16 +-----
>  .../displays/panel-sharp-ls037v7dw01.c        | 32 ++++++------
>  .../omapdrm/displays/panel-sony-acx565akm.c   | 18 +------
>  .../omapdrm/displays/panel-tpo-td028ttec1.c   | 25 +++------
>  .../omapdrm/displays/panel-tpo-td043mtea1.c   | 17 ++----
>  drivers/gpu/drm/omapdrm/dss/base.c            | 52 +++++++++++++++++++
>  drivers/gpu/drm/omapdrm/dss/dpi.c             |  5 +-
>  drivers/gpu/drm/omapdrm/dss/dsi.c             |  7 ++-
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c           | 12 ++---
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c           | 12 ++---
>  drivers/gpu/drm/omapdrm/dss/omapdss.h         |  8 ++-
>  drivers/gpu/drm/omapdrm/dss/sdi.c             |  8 ++-
>  drivers/gpu/drm/omapdrm/dss/venc.c            | 12 +----
>  drivers/gpu/drm/omapdrm/omap_encoder.c        | 49 +++++++++++++----
>  23 files changed, 163 insertions(+), 310 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 2b5b77627cfb..1503563117f3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -35,26 +35,9 @@ static void tvc_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int tvc_enable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	return src->ops->enable(src);
> -}
> -
> -static void tvc_disable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	src->ops->disable(src);
> -}
> -
>  static const struct omap_dss_device_ops tvc_ops = {
>  	.connect		= tvc_connect,
>  	.disconnect		= tvc_disconnect,
> -
> -	.enable			= tvc_enable,
> -	.disable		= tvc_disable,
>  };
>  
>  static int tvc_probe(struct platform_device *pdev)
> @@ -85,13 +68,9 @@ static int tvc_probe(struct platform_device *pdev)
>  static int __exit tvc_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		tvc_disable(dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index a1784e263835..bf5ee50ce5fe 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -46,20 +46,6 @@ static void dvic_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int dvic_enable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	return src->ops->enable(src);
> -}
> -
> -static void dvic_disable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	src->ops->disable(src);
> -}
> -
>  static int dvic_ddc_read(struct i2c_adapter *adapter,
>  		unsigned char *buf, u16 count, u8 offset)
>  {
> @@ -163,9 +149,6 @@ static const struct omap_dss_device_ops dvic_ops = {
>  	.connect	= dvic_connect,
>  	.disconnect	= dvic_disconnect,
>  
> -	.enable		= dvic_enable,
> -	.disable	= dvic_disable,
> -
>  	.read_edid	= dvic_read_edid,
>  	.detect		= dvic_detect,
>  
> @@ -275,13 +258,9 @@ static int dvic_probe(struct platform_device *pdev)
>  static int __exit dvic_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		dvic_disable(dssdev);
> -
>  	i2c_put_adapter(ddata->i2c_adapter);
>  
>  	mutex_destroy(&ddata->hpd_lock);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 05cd503c4d29..797da4a3f22e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -41,20 +41,6 @@ static void hdmic_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int hdmic_enable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	return src->ops->enable(src);
> -}
> -
> -static void hdmic_disable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	src->ops->disable(src);
> -}
> -
>  static bool hdmic_detect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> @@ -89,9 +75,6 @@ static const struct omap_dss_device_ops hdmic_ops = {
>  	.connect		= hdmic_connect,
>  	.disconnect		= hdmic_disconnect,
>  
> -	.enable			= hdmic_enable,
> -	.disable		= hdmic_disable,
> -
>  	.detect			= hdmic_detect,
>  	.register_hpd_cb	= hdmic_register_hpd_cb,
>  	.unregister_hpd_cb	= hdmic_unregister_hpd_cb,
> @@ -172,13 +155,9 @@ static int hdmic_probe(struct platform_device *pdev)
>  static int __exit hdmic_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		hdmic_disable(dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index ce116c28479f..fc5e0c47054d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -41,39 +41,20 @@ static void opa362_disconnect(struct omap_dss_device *src,
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> -static int opa362_enable(struct omap_dss_device *dssdev)
> +static void opa362_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	dev_dbg(dssdev->dev, "enable\n");
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
>  
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 1);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return 0;
>  }
>  
>  static void opa362_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	dev_dbg(dssdev->dev, "disable\n");
>  
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
> -
> -	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static const struct omap_dss_device_ops opa362_ops = {
> @@ -132,9 +113,7 @@ static int __exit opa362_remove(struct platform_device *pdev)
>  		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	WARN_ON(omapdss_device_is_enabled(dssdev));
> -	if (omapdss_device_is_enabled(dssdev))
> -		opa362_disable(dssdev);
> +	opa362_disable(dssdev);
>  
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index d51410ed1e13..82035078377a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -36,35 +36,20 @@ static void tfp410_disconnect(struct omap_dss_device *src,
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> -static int tfp410_enable(struct omap_dss_device *dssdev)
> +static void tfp410_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
>  
>  	if (ddata->pd_gpio)
>  		gpiod_set_value_cansleep(ddata->pd_gpio, 0);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return 0;
>  }
>  
>  static void tfp410_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	if (ddata->pd_gpio)
>  		gpiod_set_value_cansleep(ddata->pd_gpio, 0);
> -
> -	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static const struct omap_dss_device_ops tfp410_ops = {
> @@ -126,9 +111,7 @@ static int __exit tfp410_remove(struct platform_device *pdev)
>  		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	WARN_ON(omapdss_device_is_enabled(dssdev));
> -	if (omapdss_device_is_enabled(dssdev))
> -		tfp410_disable(dssdev);
> +	tfp410_disable(dssdev);
>  
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 1a2bc59bf104..ced36718a95f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -62,35 +62,6 @@ static void tpd_disconnect(struct omap_dss_device *src,
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> -static int tpd_enable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
> -		return 0;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return r;
> -}
> -
> -static void tpd_disable(struct omap_dss_device *dssdev)
> -{
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> -		return;
> -
> -	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> -}
> -
>  static bool tpd_detect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> @@ -124,8 +95,6 @@ static void tpd_unregister_hpd_cb(struct omap_dss_device *dssdev)
>  static const struct omap_dss_device_ops tpd_ops = {
>  	.connect		= tpd_connect,
>  	.disconnect		= tpd_disconnect,
> -	.enable			= tpd_enable,
> -	.disable		= tpd_disable,
>  	.detect			= tpd_detect,
>  	.register_hpd_cb	= tpd_register_hpd_cb,
>  	.unregister_hpd_cb	= tpd_unregister_hpd_cb,
> @@ -225,10 +194,6 @@ static int __exit tpd_remove(struct platform_device *pdev)
>  		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	WARN_ON(omapdss_device_is_enabled(dssdev));
> -	if (omapdss_device_is_enabled(dssdev))
> -		tpd_disable(dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 5ca774c712a6..c9d736f5eac0 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -45,39 +45,27 @@ static void panel_dpi_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int panel_dpi_enable(struct omap_dss_device *dssdev)
> +static void panel_dpi_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
>  	r = regulator_enable(ddata->vcc_supply);
> -	if (r) {
> -		src->ops->disable(src);
> -		return r;
> -	}
> +	if (r)
> +		return;
>  
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 1);
>  	backlight_enable(ddata->backlight);
> -
> -	return 0;
>  }
>  
>  static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	backlight_disable(ddata->backlight);
>  
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  	regulator_disable(ddata->vcc_supply);
> -
> -	src->ops->disable(src);
>  }
>  
>  static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index a7c8688237fb..ffbf20e6ebe9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -315,12 +315,7 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
>  	if (!ddata->ulps_enabled)
>  		return 0;
>  
> -	r = src->ops->enable(src);
> -	if (r) {
> -		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
> -		goto err1;
> -	}
> -
> +	src->ops->enable(src);
>  	src->ops->dsi.enable_hs(src, ddata->channel, true);
>  
>  	r = _dsicm_enable_te(ddata, true);
> @@ -347,7 +342,7 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
>  			enable_irq(gpiod_to_irq(ddata->ext_te_gpio));
>  		ddata->ulps_enabled = false;
>  	}
> -err1:
> +
>  	dsicm_queue_ulps_work(ddata);
>  
>  	return r;
> @@ -649,11 +644,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  		goto err_vddi;
>  	}
>  
> -	r = src->ops->enable(src);
> -	if (r) {
> -		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
> -		goto err_vddi;
> -	}
> +	src->ops->enable(src);
>  
>  	dsicm_hw_reset(ddata);
>  
> @@ -787,7 +778,7 @@ static void dsicm_disconnect(struct omap_dss_device *src,
>  	src->ops->dsi.release_vc(src, ddata->channel);
>  }
>  
> -static int dsicm_enable(struct omap_dss_device *dssdev)
> +static void dsicm_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *src = dssdev->src;
> @@ -808,11 +799,10 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
>  
>  	dsicm_bl_power(ddata, true);
>  
> -	return 0;
> +	return;
>  err:
> -	dev_dbg(&ddata->pdev->dev, "enable failed\n");
> +	dev_dbg(&ddata->pdev->dev, "enable failed (%d)\n", r);
>  	mutex_unlock(&ddata->lock);
> -	return r;
>  }
>  
>  static void dsicm_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 2c3b15ba5a39..e043cab0a0c9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -123,31 +123,20 @@ static void lb035q02_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int lb035q02_enable(struct omap_dss_device *dssdev)
> +static void lb035q02_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
>  
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 1);
> -
> -	return 0;
>  }
>  
>  static void lb035q02_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
> -
> -	src->ops->disable(src);
>  }
>  
>  static void lb035q02_get_timings(struct omap_dss_device *dssdev,
> @@ -232,8 +221,7 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		lb035q02_disable(dssdev);
> +	lb035q02_disable(dssdev);
>  
>  	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 ef83459611be..44fd6134317d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -118,29 +118,18 @@ static void nec_8048_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int nec_8048_enable(struct omap_dss_device *dssdev)
> +static void nec_8048_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
>  
>  	gpiod_set_value_cansleep(ddata->res_gpio, 1);
> -
> -	return 0;
>  }
>  
>  static void nec_8048_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	gpiod_set_value_cansleep(ddata->res_gpio, 0);
> -
> -	src->ops->disable(src);
>  }
>  
>  static void nec_8048_get_timings(struct omap_dss_device *dssdev,
> @@ -223,8 +212,7 @@ static int nec_8048_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		nec_8048_disable(dssdev);
> +	nec_8048_disable(dssdev);
>  
>  	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 0c5b405b4c9e..907abf8ef4e6 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -62,23 +62,22 @@ static void sharp_ls_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int sharp_ls_enable(struct omap_dss_device *dssdev)
> +static void sharp_ls_pre_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (ddata->vcc) {
>  		r = regulator_enable(ddata->vcc);
> -		if (r != 0)
> -			return r;
> +		if (r)
> +			dev_err(dssdev->dev, "%s: failed to enable regulator\n",
> +				__func__);
>  	}
> +}
>  
> -	r = src->ops->enable(src);
> -	if (r) {
> -		regulator_disable(ddata->vcc);
> -		return r;
> -	}
> +static void sharp_ls_enable(struct omap_dss_device *dssdev)
> +{
> +	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
>  	/* wait couple of vsyncs until enabling the LCD */
>  	msleep(50);
> @@ -88,14 +87,11 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  
>  	if (ddata->ini_gpio)
>  		gpiod_set_value_cansleep(ddata->ini_gpio, 1);
> -
> -	return 0;
>  }
>  
>  static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	if (ddata->ini_gpio)
>  		gpiod_set_value_cansleep(ddata->ini_gpio, 0);
> @@ -104,10 +100,12 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  		gpiod_set_value_cansleep(ddata->resb_gpio, 0);
>  
>  	/* wait at least 5 vsyncs after disabling the LCD */
> -
>  	msleep(100);
> +}
>  
> -	src->ops->disable(src);
> +static void sharp_ls_post_disable(struct omap_dss_device *dssdev)
> +{
> +	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
>  	if (ddata->vcc)
>  		regulator_disable(ddata->vcc);
> @@ -125,8 +123,10 @@ static const struct omap_dss_device_ops sharp_ls_ops = {
>  	.connect	= sharp_ls_connect,
>  	.disconnect	= sharp_ls_disconnect,
>  
> +	.pre_enable	= sharp_ls_pre_enable,
>  	.enable		= sharp_ls_enable,
>  	.disable	= sharp_ls_disable,
> +	.post_disable	= sharp_ls_post_disable,
>  
>  	.get_timings	= sharp_ls_get_timings,
>  };
> @@ -230,8 +230,10 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> +	if (omapdss_device_is_enabled(dssdev)) {
>  		sharp_ls_disable(dssdev);
> +		sharp_ls_post_disable(dssdev);
> +	}
>  
>  	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 99c2c4f27dd5..eeaea752f171 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -516,17 +516,9 @@ static void acx565akm_disconnect(struct omap_dss_device *src,
>  static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
>  
>  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>  
> -	r = src->ops->enable(src);
> -	if (r) {
> -		pr_err("%s sdi enable failed\n", __func__);
> -		return r;
> -	}
> -
>  	/*FIXME tweak me */
>  	msleep(50);
>  
> @@ -562,7 +554,6 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
>  static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "%s\n", __func__);
>  
> @@ -585,20 +576,15 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
>  
>  	/* FIXME need to tweak this delay */
>  	msleep(100);
> -
> -	src->ops->disable(src);
>  }
>  
> -static int acx565akm_enable(struct omap_dss_device *dssdev)
> +static void acx565akm_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	int r;
>  
>  	mutex_lock(&ddata->mutex);
> -	r = acx565akm_panel_power_on(dssdev);
> +	acx565akm_panel_power_on(dssdev);
>  	mutex_unlock(&ddata->mutex);
> -
> -	return r;
>  }
>  
>  static void acx565akm_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 8551a1df3ad6..f1a5c14407a4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -169,18 +169,12 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
> +static void td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -	int r;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> +	int r = 0;
>  
> -	dev_dbg(dssdev->dev, "td028ttec1_panel_enable() - state %d\n",
> -		dssdev->state);
> +	dev_dbg(dssdev->dev, "%s: state %d\n", __func__, dssdev->state);
>  
>  	/* three times command zero */
>  	r |= jbt_ret_write_0(ddata, 0x00);
> @@ -191,8 +185,8 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  	usleep_range(1000, 2000);
>  
>  	if (r) {
> -		dev_warn(dssdev->dev, "transfer error\n");
> -		return -EIO;
> +		dev_warn(dssdev->dev, "%s: transfer error\n", __func__);
> +		return;
>  	}
>  
>  	/* deep standby out */
> @@ -262,13 +256,13 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  
>  	r |= jbt_ret_write_0(ddata, JBT_REG_DISPLAY_ON);
>  
> -	return r ? -EIO : 0;
> +	if (r)
> +		dev_err(dssdev->dev, "%s: write error\n", __func__);
>  }
>  
>  static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "td028ttec1_panel_disable()\n");
>  
> @@ -276,8 +270,6 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  	jbt_reg_write_2(ddata, JBT_REG_OUTPUT_CONTROL, 0x8002);
>  	jbt_ret_write_0(ddata, JBT_REG_SLEEP_IN);
>  	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
> -
> -	src->ops->disable(src);
>  }
>  
>  static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
> @@ -354,8 +346,7 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		td028ttec1_panel_disable(dssdev);
> +	td028ttec1_panel_disable(dssdev);
>  
>  	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 527abed69d34..996a16736d10 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -320,16 +320,11 @@ static void tpo_td043_disconnect(struct omap_dss_device *src,
>  {
>  }
>  
> -static int tpo_td043_enable(struct omap_dss_device *dssdev)
> +static void tpo_td043_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
>  	/*
>  	 * If we are resuming from system suspend, SPI clocks might not be
>  	 * enabled yet, so we'll program the LCD from SPI PM resume callback.
> @@ -337,20 +332,16 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	if (!ddata->spi_suspended) {
>  		r = tpo_td043_power_on(ddata);
>  		if (r) {
> -			src->ops->disable(src);
> -			return r;
> +			dev_err(&ddata->spi->dev, "%s: power on failed (%d)\n",
> +				__func__, r);
> +			return;
>  		}
>  	}
> -
> -	return 0;
>  }
>  
>  static void tpo_td043_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> -
> -	src->ops->disable(src);
>  
>  	if (!ddata->spi_suspended)
>  		tpo_td043_power_off(ddata);
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 787157b00694..61a231d2fef3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -244,6 +244,58 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
>  
> +void omapdss_device_pre_enable(struct omap_dss_device *dssdev)
> +{
> +	if (!dssdev)
> +		return;
> +
> +	omapdss_device_pre_enable(dssdev->next);
> +
> +	if (dssdev->ops->pre_enable)
> +		dssdev->ops->pre_enable(dssdev);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_pre_enable);
> +
> +void omapdss_device_enable(struct omap_dss_device *dssdev)
> +{
> +	if (!dssdev)
> +		return;
> +
> +	if (dssdev->ops->enable)
> +		dssdev->ops->enable(dssdev);
> +
> +	omapdss_device_enable(dssdev->next);
> +
> +	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_enable);
> +
> +void omapdss_device_disable(struct omap_dss_device *dssdev)
> +{
> +	if (!dssdev)
> +		return;
> +
> +	omapdss_device_disable(dssdev->next);
> +
> +	if (dssdev->ops->disable)
> +		dssdev->ops->disable(dssdev);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_disable);
> +
> +void omapdss_device_post_disable(struct omap_dss_device *dssdev)
> +{
> +	if (!dssdev)
> +		return;
> +
> +	if (dssdev->ops->post_disable)
> +		dssdev->ops->post_disable(dssdev);
> +
> +	omapdss_device_post_disable(dssdev->next);
> +
> +	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_post_disable);
> +
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 0cf3b220e35f..74e841a2b4eb 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -378,7 +378,7 @@ static void dpi_config_lcd_manager(struct dpi_data *dpi)
>  	dss_mgr_set_lcd_config(&dpi->output, &dpi->mgr_config);
>  }
>  
> -static int dpi_display_enable(struct omap_dss_device *dssdev)
> +static void dpi_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
>  	struct omap_dss_device *out = &dpi->output;
> @@ -420,7 +420,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_unlock(&dpi->lock);
>  
> -	return 0;
> +	return;
>  
>  err_mgr_enable:
>  err_set_mode:
> @@ -434,7 +434,6 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
>  		regulator_disable(dpi->vdds_dsi_reg);
>  err_reg_enable:
>  	mutex_unlock(&dpi->lock);
> -	return r;
>  }
>  
>  static void dpi_display_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 180951eb161c..99b34e409159 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4154,10 +4154,10 @@ static void dsi_display_uninit_dsi(struct dsi_data *dsi, bool disconnect_lanes,
>  	dsi_pll_uninit(dsi, disconnect_lanes);
>  }
>  
> -static int dsi_display_enable(struct omap_dss_device *dssdev)
> +static void dsi_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct dsi_data *dsi = to_dsi_data(dssdev);
> -	int r = 0;
> +	int r;
>  
>  	DSSDBG("dsi_display_enable\n");
>  
> @@ -4177,14 +4177,13 @@ static int dsi_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_unlock(&dsi->lock);
>  
> -	return 0;
> +	return;
>  
>  err_init_dsi:
>  	dsi_runtime_put(dsi);
>  err_get_dsi:
>  	mutex_unlock(&dsi->lock);
>  	DSSDBG("dsi_display_enable FAILED\n");
> -	return r;
>  }
>  
>  static void dsi_display_disable(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index b6b44f07c74e..6f88fb4d6344 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -312,11 +312,11 @@ static void hdmi_stop_audio_stream(struct omap_hdmi *hd)
>  	hdmi_wp_audio_enable(&hd->wp, false);
>  }
>  
> -static int hdmi_display_enable(struct omap_dss_device *dssdev)
> +static void hdmi_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  	unsigned long flags;
> -	int r = 0;
> +	int r;
>  
>  	DSSDBG("ENTER hdmi_display_enable\n");
>  
> @@ -325,7 +325,7 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  	r = hdmi_power_on_full(hdmi);
>  	if (r) {
>  		DSSERR("failed to power on device\n");
> -		goto err0;
> +		goto done;
>  	}
>  
>  	if (hdmi->audio_configured) {
> @@ -345,12 +345,8 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  	hdmi->display_enabled = true;
>  	spin_unlock_irqrestore(&hdmi->audio_playing_lock, flags);
>  
> +done:
>  	mutex_unlock(&hdmi->lock);
> -	return 0;
> -
> -err0:
> -	mutex_unlock(&hdmi->lock);
> -	return r;
>  }
>  
>  static void hdmi_display_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index beef25703eab..28cf1c32b158 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -320,11 +320,11 @@ static void hdmi_stop_audio_stream(struct omap_hdmi *hd)
>  	REG_FLD_MOD(hd->wp.base, HDMI_WP_SYSCONFIG, hd->wp_idlemode, 3, 2);
>  }
>  
> -static int hdmi_display_enable(struct omap_dss_device *dssdev)
> +static void hdmi_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  	unsigned long flags;
> -	int r = 0;
> +	int r;
>  
>  	DSSDBG("ENTER hdmi_display_enable\n");
>  
> @@ -333,7 +333,7 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  	r = hdmi_power_on_full(hdmi);
>  	if (r) {
>  		DSSERR("failed to power on device\n");
> -		goto err0;
> +		goto done;
>  	}
>  
>  	if (hdmi->audio_configured) {
> @@ -353,12 +353,8 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  	hdmi->display_enabled = true;
>  	spin_unlock_irqrestore(&hdmi->audio_playing_lock, flags);
>  
> +done:
>  	mutex_unlock(&hdmi->lock);
> -	return 0;
> -
> -err0:
> -	mutex_unlock(&hdmi->lock);
> -	return r;
>  }
>  
>  static void hdmi_display_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index bd21387ba494..4c0980999576 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -359,8 +359,10 @@ struct omap_dss_device_ops {
>  	void (*disconnect)(struct omap_dss_device *dssdev,
>  			struct omap_dss_device *dst);
>  
> -	int (*enable)(struct omap_dss_device *dssdev);
> +	void (*pre_enable)(struct omap_dss_device *dssdev);
> +	void (*enable)(struct omap_dss_device *dssdev);
>  	void (*disable)(struct omap_dss_device *dssdev);
> +	void (*post_disable)(struct omap_dss_device *dssdev);
>  
>  	int (*check_timings)(struct omap_dss_device *dssdev,
>  			     struct videomode *vm);
> @@ -489,6 +491,10 @@ int omapdss_device_connect(struct dss_device *dss,
>  			   struct omap_dss_device *dst);
>  void omapdss_device_disconnect(struct omap_dss_device *src,
>  			       struct omap_dss_device *dst);
> +void omapdss_device_pre_enable(struct omap_dss_device *dssdev);
> +void omapdss_device_enable(struct omap_dss_device *dssdev);
> +void omapdss_device_disable(struct omap_dss_device *dssdev);
> +void omapdss_device_post_disable(struct omap_dss_device *dssdev);
>  
>  int omap_dss_get_num_overlay_managers(void);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 7de817c69913..20e88c6e3d98 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -129,7 +129,7 @@ static void sdi_config_lcd_manager(struct sdi_device *sdi)
>  	dss_mgr_set_lcd_config(&sdi->output, &sdi->mgr_config);
>  }
>  
> -static int sdi_display_enable(struct omap_dss_device *dssdev)
> +static void sdi_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
>  	struct dispc_clock_info dispc_cinfo;
> @@ -138,7 +138,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
>  
>  	r = regulator_enable(sdi->vdds_sdi_reg);
>  	if (r)
> -		goto err_reg_enable;
> +		return;
>  
>  	r = dispc_runtime_get(sdi->dss->dispc);
>  	if (r)
> @@ -180,7 +180,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
>  	if (r)
>  		goto err_mgr_enable;
>  
> -	return 0;
> +	return;
>  
>  err_mgr_enable:
>  	dss_sdi_disable(sdi->dss);
> @@ -190,8 +190,6 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
>  	dispc_runtime_put(sdi->dss->dispc);
>  err_get_dispc:
>  	regulator_disable(sdi->vdds_sdi_reg);
> -err_reg_enable:
> -	return r;
>  }
>  
>  static void sdi_display_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index bc9a3d52f34d..dc4133718875 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -522,25 +522,17 @@ static void venc_power_off(struct venc_device *venc)
>  	venc_runtime_put(venc);
>  }
>  
> -static int venc_display_enable(struct omap_dss_device *dssdev)
> +static void venc_display_enable(struct omap_dss_device *dssdev)
>  {
>  	struct venc_device *venc = dssdev_to_venc(dssdev);
> -	int r;
>  
>  	DSSDBG("venc_display_enable\n");
>  
>  	mutex_lock(&venc->venc_lock);
>  
> -	r = venc_power_on(venc);
> -	if (r)
> -		goto err0;
> -
> -	mutex_unlock(&venc->venc_lock);
> +	venc_power_on(venc);
>  
> -	return 0;
> -err0:
>  	mutex_unlock(&venc->venc_lock);
> -	return r;
>  }
>  
>  static void venc_display_disable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index b0c06103b5cd..5765e3ae5b16 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -138,33 +138,60 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
>  static void omap_encoder_disable(struct drm_encoder *encoder)
>  {
>  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> -	struct omap_dss_device *dssdev = omap_encoder->display;
> +	struct omap_dss_device *dssdev = omap_encoder->output;
>  	struct drm_device *dev = encoder->dev;
>  
>  	dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
>  
> -	dssdev->ops->disable(dssdev);
> +	/*
> +	 * Disable the chain of external devices, starting at the one at the
> +	 * internal encoder's output.
> +	 */
> +	omapdss_device_disable(dssdev->next);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> +	/*
> +	 * Disable the internal encoder. This will disable the DSS output. The
> +	 * DSI is treated as an exception as DSI pipelines still use the legacy
> +	 * flow where the pipeline output controls the encoder.
> +	 */
> +	if (dssdev->output_type != OMAP_DISPLAY_TYPE_DSI) {
> +		dssdev->ops->disable(dssdev);
> +		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> +	}
> +
> +	/*
> +	 * Perform the post-disable operations on the chain of external devices
> +	 * to complete the display pipeline disable.
> +	 */
> +	omapdss_device_post_disable(dssdev->next);
>  }
>  
>  static void omap_encoder_enable(struct drm_encoder *encoder)
>  {
>  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> -	struct omap_dss_device *dssdev = omap_encoder->display;
> +	struct omap_dss_device *dssdev = omap_encoder->output;
>  	struct drm_device *dev = encoder->dev;
> -	int r;
>  
>  	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
>  
> -	r = dssdev->ops->enable(dssdev);
> -	if (r) {
> -		dev_err(dev->dev, "Failed to enable display '%s': %d\n",
> -			dssdev->name, r);
> -		return;
> +	/* Prepare the chain of external devices for pipeline enable. */
> +	omapdss_device_pre_enable(dssdev->next);
> +
> +	/*
> +	 * Enable the internal encoder. This will enable the DSS output. The
> +	 * DSI is treated as an exception as DSI pipelines still use the legacy
> +	 * flow where the pipeline output controls the encoder.
> +	 */
> +	if (dssdev->output_type != OMAP_DISPLAY_TYPE_DSI) {
> +		dssdev->ops->enable(dssdev);
> +		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
>  	}
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> +	/*
> +	 * Enable the chain of external devices, starting at the one at the
> +	 * internal encoder's output.
> +	 */
> +	omapdss_device_enable(dssdev->next);
>  }
>  
>  static int omap_encoder_atomic_check(struct drm_encoder *encoder,
> -- 
> 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/20181209/2f0436ec/attachment-0001.sig>


More information about the dri-devel mailing list