Re: [PATCH v3 02/56] Revert "drm/omap: dss: Remove unused omap_dss_device operations"

2020-11-05 Thread Laurent Pinchart
Hi Tomi and Sebastian,

Thank you for the patch.

On Thu, Nov 05, 2020 at 02:02:39PM +0200, Tomi Valkeinen wrote:
> From: Sebastian Reichel 
> 
> This reverts commit 4ff8e98879e6eeae9d125dfcf3b642075d00089d.

With this fixed as requested by Sam,

Reviewed-by: Laurent Pinchart 

> This is still needed by DSI. E.g. unloading modules without this will
> cause a crash.
> 
> Signed-off-by: Sebastian Reichel 
> Signed-off-by: Tomi Valkeinen 
> ---
>  drivers/gpu/drm/omapdrm/dss/base.c | 26 +++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h  |  6 
>  drivers/gpu/drm/omapdrm/omap_encoder.c | 44 +++---
>  3 files changed, 71 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c 
> b/drivers/gpu/drm/omapdrm/dss/base.c
> index c7650a7c155d..455b410f7401 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -234,6 +234,18 @@ 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 && 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)
> @@ -260,6 +272,20 @@ void omapdss_device_disable(struct omap_dss_device 
> *dssdev)
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disable);
>  
> +void omapdss_device_post_disable(struct omap_dss_device *dssdev)
> +{
> + if (!dssdev)
> + return;
> +
> + if (dssdev->ops && 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/omapdss.h 
> b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index ab19d4af8de7..cbbe10b2b60d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -342,11 +342,15 @@ struct omap_dss_device_ops {
>   void (*disconnect)(struct omap_dss_device *dssdev,
>   struct omap_dss_device *dst);
>  
> + 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 drm_display_mode *mode);
> + void (*set_timings)(struct omap_dss_device *dssdev,
> + const struct drm_display_mode *mode);
>  
>   int (*get_modes)(struct omap_dss_device *dssdev,
>struct drm_connector *connector);
> @@ -445,8 +449,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/omap_encoder.c 
> b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index ae4b867a67a3..18a79dde6815 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -113,8 +113,13 @@ static void omap_encoder_mode_set(struct drm_encoder 
> *encoder,
>   bus_flags = connector->display_info.bus_flags;
>   omap_encoder_update_videomode_flags(, bus_flags);
>  
> - /* Set timings for the dss manager. */
> + /* Set timings for all devices in the display pipeline. */
>   dss_mgr_set_timings(output, );
> +
> + for (dssdev = output; dssdev; dssdev = dssdev->next) {
> + if (dssdev->ops && dssdev->ops->set_timings)
> + dssdev->ops->set_timings(dssdev, adjusted_mode);
> + }
>  }
>  
>  static void omap_encoder_disable(struct drm_encoder *encoder)
> @@ -127,10 +132,26 @@ static void omap_encoder_disable(struct drm_encoder 
> *encoder)
>  
>   /*
>* Disable the chain of external devices, starting at the one at the
> -  * internal encoder's output. This is used for DSI outputs only, as
> -  * dssdev->next is NULL for all other outputs.
> +  * internal encoder's output.
>*/
>   omapdss_device_disable(dssdev->next);

Re: [PATCH v3 02/56] Revert "drm/omap: dss: Remove unused omap_dss_device operations"

2020-11-05 Thread Sam Ravnborg
Hi Tomi

On Thu, Nov 05, 2020 at 02:02:39PM +0200, Tomi Valkeinen wrote:
> From: Sebastian Reichel 
> 
> This reverts commit 4ff8e98879e6eeae9d125dfcf3b642075d00089d.

Please use proper commit reference like:
2f62f4990dca ("gpu: drm: bridge: bla bla)

The above commit-id does not exist in my drm-misc-next tree.

Sam

> 
> This is still needed by DSI. E.g. unloading modules without this will
> cause a crash.
> 
> Signed-off-by: Sebastian Reichel 
> Signed-off-by: Tomi Valkeinen 
> ---
>  drivers/gpu/drm/omapdrm/dss/base.c | 26 +++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h  |  6 
>  drivers/gpu/drm/omapdrm/omap_encoder.c | 44 +++---
>  3 files changed, 71 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c 
> b/drivers/gpu/drm/omapdrm/dss/base.c
> index c7650a7c155d..455b410f7401 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -234,6 +234,18 @@ 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 && 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)
> @@ -260,6 +272,20 @@ void omapdss_device_disable(struct omap_dss_device 
> *dssdev)
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disable);
>  
> +void omapdss_device_post_disable(struct omap_dss_device *dssdev)
> +{
> + if (!dssdev)
> + return;
> +
> + if (dssdev->ops && 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/omapdss.h 
> b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index ab19d4af8de7..cbbe10b2b60d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -342,11 +342,15 @@ struct omap_dss_device_ops {
>   void (*disconnect)(struct omap_dss_device *dssdev,
>   struct omap_dss_device *dst);
>  
> + 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 drm_display_mode *mode);
> + void (*set_timings)(struct omap_dss_device *dssdev,
> + const struct drm_display_mode *mode);
>  
>   int (*get_modes)(struct omap_dss_device *dssdev,
>struct drm_connector *connector);
> @@ -445,8 +449,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/omap_encoder.c 
> b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index ae4b867a67a3..18a79dde6815 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -113,8 +113,13 @@ static void omap_encoder_mode_set(struct drm_encoder 
> *encoder,
>   bus_flags = connector->display_info.bus_flags;
>   omap_encoder_update_videomode_flags(, bus_flags);
>  
> - /* Set timings for the dss manager. */
> + /* Set timings for all devices in the display pipeline. */
>   dss_mgr_set_timings(output, );
> +
> + for (dssdev = output; dssdev; dssdev = dssdev->next) {
> + if (dssdev->ops && dssdev->ops->set_timings)
> + dssdev->ops->set_timings(dssdev, adjusted_mode);
> + }
>  }
>  
>  static void omap_encoder_disable(struct drm_encoder *encoder)
> @@ -127,10 +132,26 @@ static void omap_encoder_disable(struct drm_encoder 
> *encoder)
>  
>   /*
>* Disable the chain of external devices, starting at the one at the
> -  * internal encoder's output. This is used for DSI outputs only, as
> -  * dssdev->next is NULL for all other outputs.
> +  * internal encoder's output.
>   

[PATCH v3 02/56] Revert "drm/omap: dss: Remove unused omap_dss_device operations"

2020-11-05 Thread Tomi Valkeinen
From: Sebastian Reichel 

This reverts commit 4ff8e98879e6eeae9d125dfcf3b642075d00089d.

This is still needed by DSI. E.g. unloading modules without this will
cause a crash.

Signed-off-by: Sebastian Reichel 
Signed-off-by: Tomi Valkeinen 
---
 drivers/gpu/drm/omapdrm/dss/base.c | 26 +++
 drivers/gpu/drm/omapdrm/dss/omapdss.h  |  6 
 drivers/gpu/drm/omapdrm/omap_encoder.c | 44 +++---
 3 files changed, 71 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c 
b/drivers/gpu/drm/omapdrm/dss/base.c
index c7650a7c155d..455b410f7401 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -234,6 +234,18 @@ 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 && 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)
@@ -260,6 +272,20 @@ void omapdss_device_disable(struct omap_dss_device *dssdev)
 }
 EXPORT_SYMBOL_GPL(omapdss_device_disable);
 
+void omapdss_device_post_disable(struct omap_dss_device *dssdev)
+{
+   if (!dssdev)
+   return;
+
+   if (dssdev->ops && 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/omapdss.h 
b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index ab19d4af8de7..cbbe10b2b60d 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -342,11 +342,15 @@ struct omap_dss_device_ops {
void (*disconnect)(struct omap_dss_device *dssdev,
struct omap_dss_device *dst);
 
+   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 drm_display_mode *mode);
+   void (*set_timings)(struct omap_dss_device *dssdev,
+   const struct drm_display_mode *mode);
 
int (*get_modes)(struct omap_dss_device *dssdev,
 struct drm_connector *connector);
@@ -445,8 +449,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/omap_encoder.c 
b/drivers/gpu/drm/omapdrm/omap_encoder.c
index ae4b867a67a3..18a79dde6815 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -113,8 +113,13 @@ static void omap_encoder_mode_set(struct drm_encoder 
*encoder,
bus_flags = connector->display_info.bus_flags;
omap_encoder_update_videomode_flags(, bus_flags);
 
-   /* Set timings for the dss manager. */
+   /* Set timings for all devices in the display pipeline. */
dss_mgr_set_timings(output, );
+
+   for (dssdev = output; dssdev; dssdev = dssdev->next) {
+   if (dssdev->ops && dssdev->ops->set_timings)
+   dssdev->ops->set_timings(dssdev, adjusted_mode);
+   }
 }
 
 static void omap_encoder_disable(struct drm_encoder *encoder)
@@ -127,10 +132,26 @@ static void omap_encoder_disable(struct drm_encoder 
*encoder)
 
/*
 * Disable the chain of external devices, starting at the one at the
-* internal encoder's output. This is used for DSI outputs only, as
-* dssdev->next is NULL for all other outputs.
+* internal encoder's output.
 */
omapdss_device_disable(dssdev->next);
+
+   /*
+* 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->type != OMAP_DISPLAY_TYPE_DSI) {
+   if (dssdev->ops &&