All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition
@ 2018-12-05 14:59 Laurent Pinchart
  2018-12-05 14:59 ` [PATCH 01/29] drm/omap: Remove declaration of nonexisting function Laurent Pinchart
                   ` (29 more replies)
  0 siblings, 30 replies; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Hello,

This patch series finishes the large omapdrm refactoring started in v4.17 to
transition from the omapdrm-specific encoder and panel drivers to drm_bridge
and drm_panel. While more changes will follow, the next patch series will
focus on the usage of the first drm_bridge driver (for the tftp410).

The series starts with a few miscalleanous cleanups (01/29 to 04/29) and then
reverses the direction of the DSS device .enable() and .disable() operations
(05/29 to 09/29). All DSS device operations now match the drm_bridge model.

After a bit of further cleanups (10/29 and 11/29), the next step is to move
from struct videomode to struct drm_display_mode in the encoder and panel
drivers (12/29 to 14/29). This allows the VENC encoder to report all supported
modes (PAL and NTSC), not just the active mode (15/29).

We then move to removing access to the component at the end of the pipeline,
as the bridge API doesn't give us easy access to it (patches 16/29 to 18/29).
The next three patches (19/29 to 21/29) remove the src field from the
omap_dss_device structure, again to align with drm_bridge.

Additional miscellaneous refactoring follows to simplify the code (22/29 to
24/29), and the next patch (25/29) replaces usage of struct videomode with
struct drm_display_mode for the .check_timings() and .set_timings()
operations. The VENC encoder can then use struct drm_display_mode internally
(26/29) and the DPI and SDI drivers can avoid storing the full mode
(27/29).

Finally patches 28/29 and 29/29 simplify and refactor the omapdrm
initialization sequence to prepare for drm_bridge usage.

With these changes in place, the next series will fix a few issues in the
tfp410 drm_bridge driver, add direct support for drm_bridge in omapdrm, and
remove the internal tfp410 and DVI connector drivers.

Laurent Pinchart (29):
  drm/omap: Remove declaration of nonexisting function
  drm/omap: Remove unused kobj field from struct omap_dss_device
  drm/omap: venc: Remove wss_data field from venc_device structure
  drm/omap: Use atomic suspend/resume helpers
  drm/omap: Move common display enable/disable code to encoder
  drm/omap: Remove connection checks from internal encoders .enable()
  drm/omap: Remove connection checks from display .enable() and
    .remove()
  drm/omap: Remove enable checks from display .enable() and .remove()
  drm/omap: Reverse direction of the DSS device enable/disable
    operations
  drm/omap: Remove omap_dss_device dst field
  drm/omap: Factor out common init/cleanup code for output devices
  drm/omap: Expose DRM modes instead of timings in display devices
  drm/omap: Merge display .get_modes() and .get_size() operations
  drm/omap: Add a dss device operation flag for .get_modes()
  drm/omap: venc: List both PAL and NTSC modes
  drm/omap: Don't pass display pointer to encoder init function
  drm/omap: Move display alias ID to omap_drm_pipeline
  drm/omap: Don't store display pointer in omap_connector structure
  drm/omap: panel-dsi-cm: Store source pointer internally
  drm/omap: Notify all devices in the pipeline of output disconnection
  drm/omap: Remove src field from omap_dss_device structure
  drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  drm/omap: venc: Simplify mode setting by caching configuration
  drm/omap: Factor out common mode validation code
  drm/omap: Pass drm_display_mode to .check_timings() and .set_timings()
  drm/omap: venc: Use drm_display_mode natively
  drm/omap: Store pixel clock instead of full mode in DPI and SDI
    encoders
  drm/omap: Simplify OF lookup of DSS devices
  drm/omap: Refactor initialization sequence

 .../omapdrm/displays/connector-analog-tv.c    |  44 ----
 .../gpu/drm/omapdrm/displays/connector-dvi.c  |  38 ---
 .../gpu/drm/omapdrm/displays/connector-hdmi.c |  44 ----
 .../gpu/drm/omapdrm/displays/encoder-opa362.c |  38 +--
 .../gpu/drm/omapdrm/displays/encoder-tfp410.c |  34 +--
 .../drm/omapdrm/displays/encoder-tpd12s015.c  |  39 ----
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c  |  43 +---
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 139 +++++------
 .../displays/panel-lgphilips-lb035q02.c       |  35 +--
 .../omapdrm/displays/panel-nec-nl8048hl11.c   |  35 +--
 .../displays/panel-sharp-ls037v7dw01.c        |  55 ++---
 .../omapdrm/displays/panel-sony-acx565akm.c   |  49 +---
 .../omapdrm/displays/panel-tpo-td028ttec1.c   |  46 +---
 .../omapdrm/displays/panel-tpo-td043mtea1.c   |  42 +---
 drivers/gpu/drm/omapdrm/dss/base.c            |  76 ++++--
 drivers/gpu/drm/omapdrm/dss/display.c         |  24 +-
 drivers/gpu/drm/omapdrm/dss/dpi.c             |  62 ++---
 drivers/gpu/drm/omapdrm/dss/dsi.c             |  44 +---
 drivers/gpu/drm/omapdrm/dss/dss-of.c          |  60 +----
 drivers/gpu/drm/omapdrm/dss/hdmi4.c           |  52 +----
 drivers/gpu/drm/omapdrm/dss/hdmi5.c           |  52 +----
 drivers/gpu/drm/omapdrm/dss/omapdss.h         |  48 ++--
 drivers/gpu/drm/omapdrm/dss/output.c          |  18 +-
 drivers/gpu/drm/omapdrm/dss/sdi.c             |  62 ++---
 drivers/gpu/drm/omapdrm/dss/venc.c            | 219 ++++++++----------
 drivers/gpu/drm/omapdrm/omap_connector.c      | 158 ++++++-------
 drivers/gpu/drm/omapdrm/omap_connector.h      |   7 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c           |   9 +
 drivers/gpu/drm/omapdrm/omap_drv.c            | 170 ++++++--------
 drivers/gpu/drm/omapdrm/omap_drv.h            |   3 +
 drivers/gpu/drm/omapdrm/omap_encoder.c        |  99 ++++----
 drivers/gpu/drm/omapdrm/omap_encoder.h        |   3 +-
 32 files changed, 625 insertions(+), 1222 deletions(-)

-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* [PATCH 01/29] drm/omap: Remove declaration of nonexisting function
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:44   ` Sebastian Reichel
  2018-12-05 14:59 ` [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device Laurent Pinchart
                   ` (28 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_connector_attached_encoder() doesn't exist anymore, remove its
declaration from omap_connector.h.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_connector.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
index 854099801649..4a1dcd0f031b 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.h
+++ b/drivers/gpu/drm/omapdrm/omap_connector.h
@@ -31,8 +31,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 					  struct omap_dss_device *output,
 					  struct omap_dss_device *display,
 					  struct drm_encoder *encoder);
-struct drm_encoder *omap_connector_attached_encoder(
-		struct drm_connector *connector);
 bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
 void omap_connector_enable_hpd(struct drm_connector *connector);
 void omap_connector_disable_hpd(struct drm_connector *connector);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
  2018-12-05 14:59 ` [PATCH 01/29] drm/omap: Remove declaration of nonexisting function Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:44   ` Sebastian Reichel
  2018-12-05 14:59 ` [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure Laurent Pinchart
                   ` (27 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The kobj field from struct omap_dss_device is not used. Remove it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 1f698a95a94a..d3b576e6edf5 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -19,7 +19,6 @@
 #define __OMAP_DRM_DSS_H
 
 #include <linux/list.h>
-#include <linux/kobject.h>
 #include <linux/device.h>
 #include <linux/interrupt.h>
 #include <video/videomode.h>
@@ -404,7 +403,6 @@ enum omap_dss_device_type {
 };
 
 struct omap_dss_device {
-	struct kobject kobj;
 	struct device *dev;
 
 	struct module *owner;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
  2018-12-05 14:59 ` [PATCH 01/29] drm/omap: Remove declaration of nonexisting function Laurent Pinchart
  2018-12-05 14:59 ` [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:45   ` Sebastian Reichel
  2018-12-05 14:59 ` [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers Laurent Pinchart
                   ` (26 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The venc_device structure wss_data field is set to 0 and never otherwise
modified, remove it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/venc.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index b5f52727f8b1..fbe9d42dbdb6 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -323,7 +323,6 @@ struct venc_device {
 	struct platform_device *pdev;
 	void __iomem *base;
 	struct mutex venc_lock;
-	u32 wss_data;
 	struct regulator *vdda_dac_reg;
 	struct dss_device *dss;
 
@@ -367,8 +366,7 @@ static void venc_write_config(struct venc_device *venc,
 	venc_write_reg(venc, VENC_BLACK_LEVEL, config->black_level);
 	venc_write_reg(venc, VENC_BLANK_LEVEL, config->blank_level);
 	venc_write_reg(venc, VENC_M_CONTROL, config->m_control);
-	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
-		       venc->wss_data);
+	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data);
 	venc_write_reg(venc, VENC_S_CARR, config->s_carr);
 	venc_write_reg(venc, VENC_L21__WC_CTL, config->l21__wc_ctl);
 	venc_write_reg(venc, VENC_SAVID__EAVID, config->savid__eavid);
@@ -543,8 +541,6 @@ static int venc_display_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err0;
 
-	venc->wss_data = 0;
-
 	mutex_unlock(&venc->venc_lock);
 
 	return 0;
@@ -585,10 +581,6 @@ static void venc_set_timings(struct omap_dss_device *dssdev,
 
 	mutex_lock(&venc->venc_lock);
 
-	/* Reset WSS data when the TV standard changes. */
-	if (memcmp(&venc->vm, vm, sizeof(*vm)))
-		venc->wss_data = 0;
-
 	venc->vm = *vm;
 
 	dispc_set_tv_pclk(venc->dss->dispc, 13500000);
@@ -878,7 +870,6 @@ static int venc_probe(struct platform_device *pdev)
 
 	mutex_init(&venc->venc_lock);
 
-	venc->wss_data = 0;
 	venc->vm = omap_dss_pal_vm;
 
 	venc_mem = platform_get_resource(venc->pdev, IORESOURCE_MEM, 0);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (2 preceding siblings ...)
  2018-12-05 14:59 ` [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:53   ` Sebastian Reichel
  2018-12-05 14:59 ` [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder Laurent Pinchart
                   ` (25 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Instead of rolling out custom suspend/resume implementations based on
state information stored in the driver's data structures, use the atomic
suspend/resume helpers that rely on a DRM atomic state object.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 --
 drivers/gpu/drm/omapdrm/omap_drv.c    | 52 +++++----------------------
 drivers/gpu/drm/omapdrm/omap_drv.h    |  2 ++
 3 files changed, 11 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index d3b576e6edf5..149a0f09adbc 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -432,9 +432,6 @@ struct omap_dss_device {
 	unsigned long ops_flags;
 	unsigned long bus_flags;
 
-	/* helper variable for driver suspend/resume */
-	bool activate_after_resume;
-
 	enum omap_display_caps caps;
 
 	enum omap_dss_display_state state;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 5e67d58cbc28..66c4cedb5539 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -685,52 +685,21 @@ static int pdev_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int omap_drm_suspend_all_displays(struct drm_device *ddev)
-{
-	struct omap_drm_private *priv = ddev->dev_private;
-	int i;
-
-	for (i = 0; i < priv->num_pipes; i++) {
-		struct omap_dss_device *display = priv->pipes[i].display;
-
-		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
-			display->ops->disable(display);
-			display->activate_after_resume = true;
-		} else {
-			display->activate_after_resume = false;
-		}
-	}
-
-	return 0;
-}
-
-static int omap_drm_resume_all_displays(struct drm_device *ddev)
-{
-	struct omap_drm_private *priv = ddev->dev_private;
-	int i;
-
-	for (i = 0; i < priv->num_pipes; i++) {
-		struct omap_dss_device *display = priv->pipes[i].display;
-
-		if (display->activate_after_resume) {
-			display->ops->enable(display);
-			display->activate_after_resume = false;
-		}
-	}
-
-	return 0;
-}
-
 static int omap_drm_suspend(struct device *dev)
 {
 	struct omap_drm_private *priv = dev_get_drvdata(dev);
 	struct drm_device *drm_dev = priv->ddev;
+	struct drm_atomic_state *state;
 
 	drm_kms_helper_poll_disable(drm_dev);
 
-	drm_modeset_lock_all(drm_dev);
-	omap_drm_suspend_all_displays(drm_dev);
-	drm_modeset_unlock_all(drm_dev);
+	state = drm_atomic_helper_suspend(drm_dev);
+	if (IS_ERR(state)) {
+		drm_kms_helper_poll_enable(drm_dev);
+		return PTR_ERR(state);
+	}
+
+	priv->suspend_state = state;
 
 	return 0;
 }
@@ -740,10 +709,7 @@ static int omap_drm_resume(struct device *dev)
 	struct omap_drm_private *priv = dev_get_drvdata(dev);
 	struct drm_device *drm_dev = priv->ddev;
 
-	drm_modeset_lock_all(drm_dev);
-	omap_drm_resume_all_displays(drm_dev);
-	drm_modeset_unlock_all(drm_dev);
-
+	drm_atomic_helper_resume(drm_dev, priv->suspend_state);
 	drm_kms_helper_poll_enable(drm_dev);
 
 	return omap_gem_resume(drm_dev);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index bd7f2c227a25..788aa9f7e6df 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -73,6 +73,8 @@ struct omap_drm_private {
 
 	struct workqueue_struct *wq;
 
+	struct drm_atomic_state *suspend_state;
+
 	/* lock for obj_list below */
 	struct mutex list_lock;
 
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (3 preceding siblings ...)
  2018-12-05 14:59 ` [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:53   ` Sebastian Reichel
  2018-12-05 14:59 ` [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable() Laurent Pinchart
                   ` (24 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

All .enable() and .disable() handlers for panels and connectors share
common code that validates and updates the device's state. Move it to
common locations in the omap_encoder_enable() and omap_encoder_disable()
handlers.

The enabled check in the .disable() handler is left untouched, it will
be addressed separately.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../omapdrm/displays/connector-analog-tv.c    | 23 +-------------
 .../gpu/drm/omapdrm/displays/connector-dvi.c  | 17 +----------
 .../gpu/drm/omapdrm/displays/connector-hdmi.c | 23 +-------------
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c  | 10 -------
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 18 -----------
 .../displays/panel-lgphilips-lb035q02.c       | 10 -------
 .../omapdrm/displays/panel-nec-nl8048hl11.c   | 10 -------
 .../displays/panel-sharp-ls037v7dw01.c        | 10 -------
 .../omapdrm/displays/panel-sony-acx565akm.c   | 18 +----------
 .../omapdrm/displays/panel-tpo-td028ttec1.c   | 14 +--------
 .../omapdrm/displays/panel-tpo-td043mtea1.c   | 10 -------
 drivers/gpu/drm/omapdrm/omap_encoder.c        | 30 +++++++++++++++++--
 12 files changed, 32 insertions(+), 161 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 28a3ce8f88d2..910a5b9c036a 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -37,40 +37,19 @@ static void tvc_disconnect(struct omap_dss_device *src,
 
 static int tvc_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(ddata->dev, "enable\n");
-
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
-	r = src->ops->enable(src);
-	if (r)
-		return r;
-
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
-	return r;
+	return src->ops->enable(src);
 }
 
 static void tvc_disable(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *src = dssdev->src;
 
-	dev_dbg(ddata->dev, "disable\n");
-
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static const struct omap_dss_device_ops tvc_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 24b14f44248e..1e0925791c3d 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -49,21 +49,8 @@ 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;
-	int r;
-
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
 
-	r = src->ops->enable(src);
-	if (r)
-		return r;
-
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
-	return 0;
+	return src->ops->enable(src);
 }
 
 static void dvic_disable(struct omap_dss_device *dssdev)
@@ -74,8 +61,6 @@ static void dvic_disable(struct omap_dss_device *dssdev)
 		return;
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static int dvic_ddc_read(struct i2c_adapter *adapter,
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index e602fa4a50a4..649364e04edd 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -43,40 +43,19 @@ static void hdmic_disconnect(struct omap_dss_device *src,
 
 static int hdmic_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(ddata->dev, "enable\n");
-
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
 
-	r = src->ops->enable(src);
-	if (r)
-		return r;
-
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
-	return r;
+	return src->ops->enable(src);
 }
 
 static void hdmic_disable(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *src = dssdev->src;
 
-	dev_dbg(ddata->dev, "disable\n");
-
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static bool hdmic_detect(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 1f8161b041be..9439054de8b9 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -51,12 +51,6 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -70,8 +64,6 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 	gpiod_set_value_cansleep(ddata->enable_gpio, 1);
 	backlight_enable(ddata->backlight);
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	return 0;
 }
 
@@ -89,8 +81,6 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
 	regulator_disable(ddata->vcc_supply);
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 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 29692a5217c5..e346451647c4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -793,20 +793,8 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	dev_dbg(&ddata->pdev->dev, "enable\n");
-
 	mutex_lock(&ddata->lock);
 
-	if (!omapdss_device_is_connected(dssdev)) {
-		r = -ENODEV;
-		goto err;
-	}
-
-	if (omapdss_device_is_enabled(dssdev)) {
-		r = 0;
-		goto err;
-	}
-
 	src->ops->dsi.bus_lock(src);
 
 	r = dsicm_power_on(ddata);
@@ -816,8 +804,6 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err;
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	mutex_unlock(&ddata->lock);
 
 	dsicm_bl_power(ddata, true);
@@ -835,8 +821,6 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	dev_dbg(&ddata->pdev->dev, "disable\n");
-
 	dsicm_bl_power(ddata, false);
 
 	mutex_lock(&ddata->lock);
@@ -853,8 +837,6 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 
 	src->ops->dsi.bus_unlock(src);
 
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
-
 	mutex_unlock(&ddata->lock);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index f6ef8ff964dd..19c0c3e85aa5 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -129,12 +129,6 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -142,8 +136,6 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 1);
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	return 0;
 }
 
@@ -159,8 +151,6 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void lb035q02_get_timings(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index f445de6369f7..9cef1d16d7d3 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -124,20 +124,12 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
 
 	gpiod_set_value_cansleep(ddata->res_gpio, 1);
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	return 0;
 }
 
@@ -152,8 +144,6 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
 	gpiod_set_value_cansleep(ddata->res_gpio, 0);
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void nec_8048_get_timings(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 64b1369cb274..5a06fbb7984a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -68,12 +68,6 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	if (ddata->vcc) {
 		r = regulator_enable(ddata->vcc);
 		if (r != 0)
@@ -95,8 +89,6 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 	if (ddata->ini_gpio)
 		gpiod_set_value_cansleep(ddata->ini_gpio, 1);
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	return 0;
 }
 
@@ -122,8 +114,6 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
 
 	if (ddata->vcc)
 		regulator_disable(ddata->vcc);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index e04663856b31..209a87c70c99 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -594,39 +594,23 @@ static int acx565akm_enable(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	int r;
 
-	dev_dbg(dssdev->dev, "%s\n", __func__);
-
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	mutex_lock(&ddata->mutex);
 	r = acx565akm_panel_power_on(dssdev);
 	mutex_unlock(&ddata->mutex);
-	if (r)
-		return r;
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
-	return 0;
+	return r;
 }
 
 static void acx565akm_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	dev_dbg(dssdev->dev, "%s\n", __func__);
-
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
 	mutex_lock(&ddata->mutex);
 	acx565akm_panel_power_off(dssdev);
 	mutex_unlock(&ddata->mutex);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void acx565akm_get_timings(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 7ddc8c574a61..b09fea97a441 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -175,12 +175,6 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -198,7 +192,7 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 
 	if (r) {
 		dev_warn(dssdev->dev, "transfer error\n");
-		goto transfer_err;
+		return -EIO;
 	}
 
 	/* deep standby out */
@@ -268,10 +262,6 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 
 	r |= jbt_ret_write_0(ddata, JBT_REG_DISPLAY_ON);
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
-transfer_err:
-
 	return r ? -EIO : 0;
 }
 
@@ -291,8 +281,6 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
 	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
 
 	src->ops->disable(src);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 8440fcb744d9..998f21f7701a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -326,12 +326,6 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -348,8 +342,6 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 		}
 	}
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-
 	return 0;
 }
 
@@ -365,8 +357,6 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
 
 	if (!ddata->spi_suspended)
 		tpo_td043_power_off(ddata);
-
-	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 452e625f6ce3..e3290f26abab 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -139,21 +139,45 @@ 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 drm_device *dev = encoder->dev;
+
+	dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
+
+	if (!omapdss_device_is_enabled(dssdev))
+		return;
 
 	dssdev->ops->disable(dssdev);
+
+	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
 
 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 drm_device *dev = encoder->dev;
 	int r;
 
+	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
+
+	if (!omapdss_device_is_connected(dssdev)) {
+		r = -ENODEV;
+		goto error;
+	}
+
+	if (omapdss_device_is_enabled(dssdev))
+		return;
+
 	r = dssdev->ops->enable(dssdev);
 	if (r)
-		dev_err(encoder->dev->dev,
-			"Failed to enable display '%s': %d\n",
-			dssdev->name, r);
+		goto error;
+
+	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+	return;
+
+error:
+	dev_err(dev->dev, "Failed to enable display '%s': %d\n",
+		dssdev->name, r);
 }
 
 static int omap_encoder_atomic_check(struct drm_encoder *encoder,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable()
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (4 preceding siblings ...)
  2018-12-05 14:59 ` [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder Laurent Pinchart
@ 2018-12-05 14:59 ` Laurent Pinchart
  2018-12-09 21:54   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove() Laurent Pinchart
                   ` (23 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 14:59 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The internal encoders return an error from their .enable() handler when
their are not connected to a dss manager. As the flag used is set and
cleared in the connect and disconnect handlers, this effectively checks
whether the omap_dss_device is connected.

The .enable() handler is called from code paths that access the dss
devices chain from the display device, which is set to NULL when the
device isn't connected, making it impossible to access the device in
that case.

The safety check is thus not needed, remove it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dpi.c     | 17 +----------------
 drivers/gpu/drm/omapdrm/dss/dsi.c     | 20 ++------------------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 17 +----------------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 17 +----------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
 drivers/gpu/drm/omapdrm/dss/sdi.c     | 16 +---------------
 drivers/gpu/drm/omapdrm/dss/venc.c    | 17 +----------------
 7 files changed, 7 insertions(+), 98 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index ca4f3c4c6318..0cf3b220e35f 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -386,12 +386,6 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&dpi->lock);
 
-	if (!out->dispc_channel_connected) {
-		DSSERR("failed to enable display: no output/manager\n");
-		r = -ENODEV;
-		goto err_no_out_mgr;
-	}
-
 	if (dpi->vdds_dsi_reg) {
 		r = regulator_enable(dpi->vdds_dsi_reg);
 		if (r)
@@ -439,7 +433,6 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
 	if (dpi->vdds_dsi_reg)
 		regulator_disable(dpi->vdds_dsi_reg);
 err_reg_enable:
-err_no_out_mgr:
 	mutex_unlock(&dpi->lock);
 	return r;
 }
@@ -596,23 +589,15 @@ static int dpi_connect(struct omap_dss_device *src,
 		       struct omap_dss_device *dst)
 {
 	struct dpi_data *dpi = dpi_get_data_from_dssdev(dst);
-	int r;
 
 	dpi_init_pll(dpi);
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void dpi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 0a485c5b982e..180951eb161c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -3753,19 +3753,13 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 	int bpp = dsi_get_pixel_size(dsi->pix_fmt);
-	struct omap_dss_device *out = &dsi->output;
 	u8 data_type;
 	u16 word_count;
 	int r;
 
-	if (!out->dispc_channel_connected) {
-		DSSERR("failed to enable display: no output/manager\n");
-		return -ENODEV;
-	}
-
 	r = dsi_display_init_dispc(dsi);
 	if (r)
-		goto err_init_dispc;
+		return r;
 
 	if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
 		switch (dsi->pix_fmt) {
@@ -3814,7 +3808,6 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
 	}
 err_pix_fmt:
 	dsi_display_uninit_dispc(dsi);
-err_init_dispc:
 	return r;
 }
 
@@ -4877,21 +4870,12 @@ static int dsi_get_clocks(struct dsi_data *dsi)
 static int dsi_connect(struct omap_dss_device *src,
 		       struct omap_dss_device *dst)
 {
-	int r;
-
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void dsi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index aabdda394c9c..b6b44f07c74e 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -322,12 +322,6 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&hdmi->lock);
 
-	if (!dssdev->dispc_channel_connected) {
-		DSSERR("failed to enable display: no output/manager\n");
-		r = -ENODEV;
-		goto err0;
-	}
-
 	r = hdmi_power_on_full(hdmi);
 	if (r) {
 		DSSERR("failed to power on device\n");
@@ -417,21 +411,12 @@ void hdmi4_core_disable(struct hdmi_core_data *core)
 static int hdmi_connect(struct omap_dss_device *src,
 			struct omap_dss_device *dst)
 {
-	int r;
-
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void hdmi_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 9e8556f67a29..beef25703eab 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -330,12 +330,6 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&hdmi->lock);
 
-	if (!dssdev->dispc_channel_connected) {
-		DSSERR("failed to enable display: no output/manager\n");
-		r = -ENODEV;
-		goto err0;
-	}
-
 	r = hdmi_power_on_full(hdmi);
 	if (r) {
 		DSSERR("failed to power on device\n");
@@ -422,21 +416,12 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi)
 static int hdmi_connect(struct omap_dss_device *src,
 			struct omap_dss_device *dst)
 {
-	int r;
-
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void hdmi_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 149a0f09adbc..4e1e58e85429 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -440,7 +440,6 @@ struct omap_dss_device {
 
 	/* DISPC channel for this output */
 	enum omap_channel dispc_channel;
-	bool dispc_channel_connected;
 
 	/* output instance */
 	enum omap_dss_output_id id;
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index b2fe2387037a..7de817c69913 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -136,11 +136,6 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
 	unsigned long fck;
 	int r;
 
-	if (!sdi->output.dispc_channel_connected) {
-		DSSERR("failed to enable display: no output/manager\n");
-		return -ENODEV;
-	}
-
 	r = regulator_enable(sdi->vdds_sdi_reg);
 	if (r)
 		goto err_reg_enable;
@@ -251,21 +246,12 @@ static int sdi_check_timings(struct omap_dss_device *dssdev,
 static int sdi_connect(struct omap_dss_device *src,
 		       struct omap_dss_device *dst)
 {
-	int r;
-
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void sdi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index fbe9d42dbdb6..bc9a3d52f34d 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -531,12 +531,6 @@ static int venc_display_enable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&venc->venc_lock);
 
-	if (!dssdev->dispc_channel_connected) {
-		DSSERR("Failed to enable display: no output/manager\n");
-		r = -ENODEV;
-		goto err0;
-	}
-
 	r = venc_power_on(venc);
 	if (r)
 		goto err0;
@@ -687,21 +681,12 @@ static int venc_get_clocks(struct venc_device *venc)
 static int venc_connect(struct omap_dss_device *src,
 			struct omap_dss_device *dst)
 {
-	int r;
-
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		return r;
-
-	dst->dispc_channel_connected = true;
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
 static void venc_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
-
 	omapdss_device_disconnect(dst, dst->next);
 }
 
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove()
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (5 preceding siblings ...)
  2018-12-05 14:59 ` [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable() Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 21:54   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 08/29] drm/omap: Remove enable " Laurent Pinchart
                   ` (22 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The displays (connectors, panels and encoders) return an error from
their .enable() handler when the dss device is not connected. They also
disconnect the dss device explicitly from their .remove() handler if it
is still connected.

Those safety checks are not needed:

- The .enable() handler is called from code paths that access the dss
  devices chain from the display device, which is set to NULL when the
  device isn't connected.

- The .remove() handler can only be called when unloading the module as
  the driver has the suppress_bind_attrs attribute set, and a reference
  to the module is taken when constructing the dss devices chain, so the
  module can only be unloaded when the dss device is disconnected.

Remove the safety checks.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/encoder-opa362.c   |  7 -------
 .../gpu/drm/omapdrm/displays/encoder-tfp410.c   |  7 -------
 .../drm/omapdrm/displays/encoder-tpd12s015.c    |  4 ----
 drivers/gpu/drm/omapdrm/dss/base.c              |  5 +++++
 drivers/gpu/drm/omapdrm/dss/omapdss.h           |  5 -----
 drivers/gpu/drm/omapdrm/omap_encoder.c          | 17 +++++------------
 6 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 4fefd80f53bb..0b1032625e42 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -49,9 +49,6 @@ static int opa362_enable(struct omap_dss_device *dssdev)
 
 	dev_dbg(dssdev->dev, "enable\n");
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
@@ -145,10 +142,6 @@ static int __exit opa362_remove(struct platform_device *pdev)
 	if (omapdss_device_is_enabled(dssdev))
 		opa362_disable(dssdev);
 
-	WARN_ON(omapdss_device_is_connected(dssdev));
-	if (omapdss_device_is_connected(dssdev))
-		omapdss_device_disconnect(NULL, dssdev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index f1a748353279..fcc2dc5188a2 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -42,9 +42,6 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return -ENODEV;
-
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
@@ -139,10 +136,6 @@ static int __exit tfp410_remove(struct platform_device *pdev)
 	if (omapdss_device_is_enabled(dssdev))
 		tfp410_disable(dssdev);
 
-	WARN_ON(omapdss_device_is_connected(dssdev));
-	if (omapdss_device_is_connected(dssdev))
-		omapdss_device_disconnect(NULL, dssdev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 94de55fd8884..1a2bc59bf104 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -229,10 +229,6 @@ static int __exit tpd_remove(struct platform_device *pdev)
 	if (omapdss_device_is_enabled(dssdev))
 		tpd_disable(dssdev);
 
-	WARN_ON(omapdss_device_is_connected(dssdev));
-	if (omapdss_device_is_connected(dssdev))
-		omapdss_device_disconnect(NULL, dssdev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 472f56e3de70..787157b00694 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -185,6 +185,11 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 }
 EXPORT_SYMBOL(omapdss_device_get_next);
 
+static bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
+{
+	return dssdev->src;
+}
+
 int omapdss_device_connect(struct dss_device *dss,
 			   struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4e1e58e85429..bd21387ba494 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -505,11 +505,6 @@ int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
 int omapdss_compat_init(void);
 void omapdss_compat_uninit(void);
 
-static inline bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
-{
-	return dssdev->src;
-}
-
 static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
 {
 	return dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index e3290f26abab..936756b18545 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -160,24 +160,17 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
 
 	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
 
-	if (!omapdss_device_is_connected(dssdev)) {
-		r = -ENODEV;
-		goto error;
-	}
-
 	if (omapdss_device_is_enabled(dssdev))
 		return;
 
 	r = dssdev->ops->enable(dssdev);
-	if (r)
-		goto error;
+	if (r) {
+		dev_err(dev->dev, "Failed to enable display '%s': %d\n",
+			dssdev->name, r);
+		return;
+	}
 
 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-	return;
-
-error:
-	dev_err(dev->dev, "Failed to enable display '%s': %d\n",
-		dssdev->name, r);
 }
 
 static int omap_encoder_atomic_check(struct drm_encoder *encoder,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 08/29] drm/omap: Remove enable checks from display .enable() and .remove()
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (6 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove() Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 21:55   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations Laurent Pinchart
                   ` (21 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The displays (connectors, panels and encoders) bail out from their
.enable() and .disable() handlers if the dss device is already enabled
or disabled. Those safety checks are not needed when the functions are
called through the omapdss_device_ops, as the .enable() and .disable()
handlers are called from the DRM atomic helpers that already guarantee
that no double enabling or disabling can occur.

However, the handlers are also called directly from the .remove()
handler. While this shouldn't be needed either as the modules can't be
removed as long as the device is in use, it's still a good practice to
disable the device explicitly. There is currently a safety check in
.remove() in some drivers but not all of them.

Remove the safety checks from the .enable() and .disable() handlers, and
add missing ones in the .remove() handler.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c    |  6 ++----
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c      |  6 ++----
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c     |  6 ++----
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c     |  6 ------
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c     |  6 ------
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c          |  6 ++----
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c       | 11 +++++------
 .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c   |  6 ++----
 .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   |  6 ++----
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    |  6 ++----
 .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   |  6 ++----
 .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   |  6 ++----
 .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   |  6 ++----
 drivers/gpu/drm/omapdrm/omap_encoder.c                |  6 ------
 14 files changed, 25 insertions(+), 64 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 910a5b9c036a..2b5b77627cfb 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -46,9 +46,6 @@ static void tvc_disable(struct omap_dss_device *dssdev)
 {
 	struct omap_dss_device *src = dssdev->src;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	src->ops->disable(src);
 }
 
@@ -92,7 +89,8 @@ static int __exit tvc_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(&ddata->dssdev);
 
-	tvc_disable(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 1e0925791c3d..a1784e263835 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -57,9 +57,6 @@ static void dvic_disable(struct omap_dss_device *dssdev)
 {
 	struct omap_dss_device *src = dssdev->src;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	src->ops->disable(src);
 }
 
@@ -282,7 +279,8 @@ static int __exit dvic_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(&ddata->dssdev);
 
-	dvic_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		dvic_disable(dssdev);
 
 	i2c_put_adapter(ddata->i2c_adapter);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 649364e04edd..05cd503c4d29 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -52,9 +52,6 @@ static void hdmic_disable(struct omap_dss_device *dssdev)
 {
 	struct omap_dss_device *src = dssdev->src;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	src->ops->disable(src);
 }
 
@@ -179,7 +176,8 @@ static int __exit hdmic_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(&ddata->dssdev);
 
-	hdmic_disable(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 0b1032625e42..ce116c28479f 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -49,9 +49,6 @@ static int opa362_enable(struct omap_dss_device *dssdev)
 
 	dev_dbg(dssdev->dev, "enable\n");
 
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -71,9 +68,6 @@ static void opa362_disable(struct omap_dss_device *dssdev)
 
 	dev_dbg(dssdev->dev, "disable\n");
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index fcc2dc5188a2..d51410ed1e13 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -42,9 +42,6 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src = dssdev->src;
 	int r;
 
-	if (omapdss_device_is_enabled(dssdev))
-		return 0;
-
 	r = src->ops->enable(src);
 	if (r)
 		return r;
@@ -62,9 +59,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	if (ddata->pd_gpio)
 		gpiod_set_value_cansleep(ddata->pd_gpio, 0);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 9439054de8b9..5ca774c712a6 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -72,9 +72,6 @@ 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;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	backlight_disable(ddata->backlight);
 
 	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
@@ -181,7 +178,8 @@ static int __exit panel_dpi_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(dssdev);
 
-	panel_dpi_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		panel_dpi_disable(dssdev);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index e346451647c4..a7c8688237fb 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -829,11 +829,9 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 
 	src->ops->dsi.bus_lock(src);
 
-	if (omapdss_device_is_enabled(dssdev)) {
-		r = dsicm_wake_up(ddata);
-		if (!r)
-			dsicm_power_off(ddata);
-	}
+	r = dsicm_wake_up(ddata);
+	if (!r)
+		dsicm_power_off(ddata);
 
 	src->ops->dsi.bus_unlock(src);
 
@@ -1367,7 +1365,8 @@ static int __exit dsicm_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(dssdev);
 
-	dsicm_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		dsicm_disable(dssdev);
 	omapdss_device_disconnect(dssdev->src, dssdev);
 
 	sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 19c0c3e85aa5..2c3b15ba5a39 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -144,9 +144,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
@@ -235,7 +232,8 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
 
 	omapdss_device_unregister(dssdev);
 
-	lb035q02_disable(dssdev);
+	if (omapdss_device_is_enabled(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 9cef1d16d7d3..ef83459611be 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -138,9 +138,6 @@ 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;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	gpiod_set_value_cansleep(ddata->res_gpio, 0);
 
 	src->ops->disable(src);
@@ -226,7 +223,8 @@ static int nec_8048_remove(struct spi_device *spi)
 
 	omapdss_device_unregister(dssdev);
 
-	nec_8048_disable(dssdev);
+	if (omapdss_device_is_enabled(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 5a06fbb7984a..0c5b405b4c9e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -97,9 +97,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	if (ddata->ini_gpio)
 		gpiod_set_value_cansleep(ddata->ini_gpio, 0);
 
@@ -233,7 +230,8 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
 
 	omapdss_device_unregister(dssdev);
 
-	sharp_ls_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		sharp_ls_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 209a87c70c99..99c2c4f27dd5 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -605,9 +605,6 @@ static void acx565akm_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	mutex_lock(&ddata->mutex);
 	acx565akm_panel_power_off(dssdev);
 	mutex_unlock(&ddata->mutex);
@@ -750,7 +747,8 @@ static int acx565akm_remove(struct spi_device *spi)
 
 	omapdss_device_unregister(dssdev);
 
-	acx565akm_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		acx565akm_disable(dssdev);
 
 	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 b09fea97a441..8551a1df3ad6 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -270,9 +270,6 @@ 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;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	dev_dbg(dssdev->dev, "td028ttec1_panel_disable()\n");
 
 	jbt_ret_write_0(ddata, JBT_REG_DISPLAY_OFF);
@@ -357,7 +354,8 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
 
 	omapdss_device_unregister(dssdev);
 
-	td028ttec1_panel_disable(dssdev);
+	if (omapdss_device_is_enabled(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 998f21f7701a..527abed69d34 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -350,9 +350,6 @@ 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;
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	src->ops->disable(src);
 
 	if (!ddata->spi_suspended)
@@ -457,7 +454,8 @@ static int tpo_td043_remove(struct spi_device *spi)
 
 	omapdss_device_unregister(dssdev);
 
-	tpo_td043_disable(dssdev);
+	if (omapdss_device_is_enabled(dssdev))
+		tpo_td043_disable(dssdev);
 
 	sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
 
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 936756b18545..b0c06103b5cd 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -143,9 +143,6 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
 
 	dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
 
-	if (!omapdss_device_is_enabled(dssdev))
-		return;
-
 	dssdev->ops->disable(dssdev);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
@@ -160,9 +157,6 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
 
 	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
 
-	if (omapdss_device_is_enabled(dssdev))
-		return;
-
 	r = dssdev->ops->enable(dssdev);
 	if (r) {
 		dev_err(dev->dev, "Failed to enable display '%s': %d\n",
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (7 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 08/29] drm/omap: Remove enable " Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 21:59   ` Sebastian Reichel
  2018-12-10  1:01   ` [PATCH v1.1 " Laurent Pinchart
  2018-12-05 15:00 ` [PATCH 10/29] drm/omap: Remove omap_dss_device dst field Laurent Pinchart
                   ` (20 subsequent siblings)
  29 siblings, 2 replies; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

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@ideasonboard.com>
---
 .../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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 10/29] drm/omap: Remove omap_dss_device dst field
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (8 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:00   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices Laurent Pinchart
                   ` (19 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The field is only used in a safety check during device
connection/disconnection, where the src field can be easily used
instead. Remove it and use src.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    | 6 ++----
 drivers/gpu/drm/omapdrm/dss/omapdss.h | 1 -
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 61a231d2fef3..8454e505b282 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -210,9 +210,8 @@ int omapdss_device_connect(struct dss_device *dss,
 	}
 
 	if (src) {
-		WARN_ON(src->dst);
+		WARN_ON(dst->src);
 		dst->src = src;
-		src->dst = dst;
 	}
 
 	return 0;
@@ -230,11 +229,10 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 	}
 
 	if (src) {
-		if (WARN_ON(dst != src->dst))
+		if (WARN_ON(dst->src != src))
 			return;
 
 		dst->src = NULL;
-		src->dst = NULL;
 	}
 
 	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4c0980999576..28e24d65f211 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -411,7 +411,6 @@ struct omap_dss_device {
 
 	struct dss_device *dss;
 	struct omap_dss_device *src;
-	struct omap_dss_device *dst;
 	struct omap_dss_device *next;
 
 	struct list_head list;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (9 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 10/29] drm/omap: Remove omap_dss_device dst field Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:01   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices Laurent Pinchart
                   ` (18 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

All the internal encoders share common init and cleanup code. Factor it
out to separate functions.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dpi.c     | 17 +++--------------
 drivers/gpu/drm/omapdrm/dss/dsi.c     | 17 +++--------------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 17 +++--------------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 17 +++--------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 ++-
 drivers/gpu/drm/omapdrm/dss/output.c  | 18 ++++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/sdi.c     | 17 +++--------------
 drivers/gpu/drm/omapdrm/dss/venc.c    | 17 +++--------------
 8 files changed, 36 insertions(+), 87 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 74e841a2b4eb..0db01cadf09f 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -641,19 +641,9 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 	out->ops = &dpi_ops;
 	out->owner = THIS_MODULE;
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -665,9 +655,8 @@ static void dpi_uninit_output_port(struct device_node *port)
 	struct dpi_data *dpi = port->data;
 	struct omap_dss_device *out = &dpi->output;
 
-	if (out->next)
-		omapdss_device_put(out->next);
 	omapdss_device_unregister(out);
+	omapdss_device_cleanup_output(out);
 }
 
 static const struct soc_device_attribute dpi_soc_devices[] = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 99b34e409159..0ba4670fd6cf 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5122,19 +5122,9 @@ static int dsi_init_output(struct dsi_data *dsi)
 		       | DRM_BUS_FLAG_DE_HIGH
 		       | DRM_BUS_FLAG_SYNC_NEGEDGE;
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -5145,9 +5135,8 @@ static void dsi_uninit_output(struct dsi_data *dsi)
 {
 	struct omap_dss_device *out = &dsi->output;
 
-	if (out->next)
-		omapdss_device_put(out->next);
 	omapdss_device_unregister(out);
+	omapdss_device_cleanup_output(out);
 }
 
 static int dsi_probe_of(struct dsi_data *dsi)
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 6f88fb4d6344..60792981a33f 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -687,19 +687,9 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
 	out->of_ports = BIT(0);
 	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -710,9 +700,8 @@ static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
-	if (out->next)
-		omapdss_device_put(out->next);
 	omapdss_device_unregister(out);
+	omapdss_device_cleanup_output(out);
 }
 
 static int hdmi4_probe_of(struct omap_hdmi *hdmi)
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 28cf1c32b158..d7d33b4d2bed 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -671,19 +671,9 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
 	out->of_ports = BIT(0);
 	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -694,9 +684,8 @@ static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
-	if (out->next)
-		omapdss_device_put(out->next);
 	omapdss_device_unregister(out);
+	omapdss_device_cleanup_output(out);
 }
 
 static int hdmi5_probe_of(struct omap_hdmi *hdmi)
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 28e24d65f211..723a9b5060f5 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -501,7 +501,8 @@ int omap_dss_get_num_overlays(void);
 
 #define for_each_dss_output(d) \
 	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_OUTPUT)) != NULL)
-int omapdss_output_validate(struct omap_dss_device *out);
+int omapdss_device_init_output(struct omap_dss_device *out);
+void omapdss_device_cleanup_output(struct omap_dss_device *out);
 
 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
 int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 18505bc70f7e..0ac400a521f3 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -24,8 +24,15 @@
 #include "dss.h"
 #include "omapdss.h"
 
-int omapdss_output_validate(struct omap_dss_device *out)
+int omapdss_device_init_output(struct omap_dss_device *out)
 {
+	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
+	if (IS_ERR(out->next)) {
+		if (PTR_ERR(out->next) != -EPROBE_DEFER)
+			dev_err(out->dev, "failed to find video sink\n");
+		return PTR_ERR(out->next);
+	}
+
 	if (out->next && out->output_type != out->next->type) {
 		dev_err(out->dev, "output type and display type don't match\n");
 		return -EINVAL;
@@ -33,7 +40,14 @@ int omapdss_output_validate(struct omap_dss_device *out)
 
 	return 0;
 }
-EXPORT_SYMBOL(omapdss_output_validate);
+EXPORT_SYMBOL(omapdss_device_init_output);
+
+void omapdss_device_cleanup_output(struct omap_dss_device *out)
+{
+	if (out->next)
+		omapdss_device_put(out->next);
+}
+EXPORT_SYMBOL(omapdss_device_cleanup_output);
 
 int dss_install_mgr_ops(struct dss_device *dss,
 			const struct dss_mgr_ops *mgr_ops,
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 20e88c6e3d98..58c17566a4cb 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -281,19 +281,9 @@ static int sdi_init_output(struct sdi_device *sdi)
 	out->bus_flags = DRM_BUS_FLAG_PIXDATA_POSEDGE	/* 15.5.9.1.2 */
 		       | DRM_BUS_FLAG_SYNC_POSEDGE;
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 1);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -302,9 +292,8 @@ static int sdi_init_output(struct sdi_device *sdi)
 
 static void sdi_uninit_output(struct sdi_device *sdi)
 {
-	if (sdi->output.next)
-		omapdss_device_put(sdi->output.next);
 	omapdss_device_unregister(&sdi->output);
+	omapdss_device_cleanup_output(&sdi->output);
 }
 
 int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index dc4133718875..3fc776c45c4f 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -752,19 +752,9 @@ static int venc_init_output(struct venc_device *venc)
 	out->owner = THIS_MODULE;
 	out->of_ports = BIT(0);
 
-	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
-	if (IS_ERR(out->next)) {
-		if (PTR_ERR(out->next) != -EPROBE_DEFER)
-			dev_err(out->dev, "failed to find video sink\n");
-		return PTR_ERR(out->next);
-	}
-
-	r = omapdss_output_validate(out);
-	if (r) {
-		omapdss_device_put(out->next);
-		out->next = NULL;
+	r = omapdss_device_init_output(out);
+	if (r < 0)
 		return r;
-	}
 
 	omapdss_device_register(out);
 
@@ -773,9 +763,8 @@ static int venc_init_output(struct venc_device *venc)
 
 static void venc_uninit_output(struct venc_device *venc)
 {
-	if (venc->output.next)
-		omapdss_device_put(venc->output.next);
 	omapdss_device_unregister(&venc->output);
+	omapdss_device_cleanup_output(&venc->output);
 }
 
 static int venc_probe_of(struct venc_device *venc)
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (10 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:02   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations Laurent Pinchart
                   ` (17 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

omap_dss_device operations expose fixed video timings through a
.get_timings() operation that return a single timing for the device. To
prepare for the move to drm_bridge, modify the API to instead add DRM
modes directly to the connector.

As this puts more burden on display devices, we also create a helper
function for panels to add a single DRM mode from the panel video
timings.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c  |  8 ++---
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 10 +++---
 .../displays/panel-lgphilips-lb035q02.c       |  8 ++---
 .../omapdrm/displays/panel-nec-nl8048hl11.c   |  8 ++---
 .../displays/panel-sharp-ls037v7dw01.c        |  8 ++---
 .../omapdrm/displays/panel-sony-acx565akm.c   |  8 ++---
 .../omapdrm/displays/panel-tpo-td028ttec1.c   |  8 ++---
 .../omapdrm/displays/panel-tpo-td043mtea1.c   |  8 ++---
 drivers/gpu/drm/omapdrm/dss/display.c         | 22 +++++++++++++
 drivers/gpu/drm/omapdrm/dss/omapdss.h         |  8 +++--
 drivers/gpu/drm/omapdrm/dss/venc.c            | 12 ++++---
 drivers/gpu/drm/omapdrm/omap_connector.c      | 33 ++++++-------------
 12 files changed, 80 insertions(+), 61 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index c9d736f5eac0..2bda6d4fdb16 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -68,12 +68,12 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
 	regulator_disable(ddata->vcc_supply);
 }
 
-static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
-				  struct videomode *vm)
+static int panel_dpi_get_modes(struct omap_dss_device *dssdev,
+			       struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops panel_dpi_ops = {
@@ -83,7 +83,7 @@ static const struct omap_dss_device_ops panel_dpi_ops = {
 	.enable		= panel_dpi_enable,
 	.disable	= panel_dpi_disable,
 
-	.get_timings	= panel_dpi_get_timings,
+	.get_modes	= panel_dpi_get_modes,
 };
 
 static int panel_dpi_probe_of(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index ffbf20e6ebe9..9cd9ab487a24 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -24,6 +24,8 @@
 #include <linux/of_device.h>
 #include <linux/regulator/consumer.h>
 
+#include <drm/drm_connector.h>
+
 #include <video/mipi_display.h>
 #include <video/of_display_timing.h>
 
@@ -1110,12 +1112,12 @@ static void dsicm_ulps_work(struct work_struct *work)
 	mutex_unlock(&ddata->lock);
 }
 
-static void dsicm_get_timings(struct omap_dss_device *dssdev,
-			      struct videomode *vm)
+static int dsicm_get_modes(struct omap_dss_device *dssdev,
+			   struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static int dsicm_check_timings(struct omap_dss_device *dssdev,
@@ -1156,7 +1158,7 @@ static const struct omap_dss_device_ops dsicm_ops = {
 	.enable		= dsicm_enable,
 	.disable	= dsicm_disable,
 
-	.get_timings	= dsicm_get_timings,
+	.get_modes	= dsicm_get_modes,
 	.check_timings	= dsicm_check_timings,
 };
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index e043cab0a0c9..e05b7f80416e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -139,12 +139,12 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 }
 
-static void lb035q02_get_timings(struct omap_dss_device *dssdev,
-				 struct videomode *vm)
+static int lb035q02_get_modes(struct omap_dss_device *dssdev,
+			      struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops lb035q02_ops = {
@@ -154,7 +154,7 @@ static const struct omap_dss_device_ops lb035q02_ops = {
 	.enable		= lb035q02_enable,
 	.disable	= lb035q02_disable,
 
-	.get_timings	= lb035q02_get_timings,
+	.get_modes	= lb035q02_get_modes,
 };
 
 static int lb035q02_probe_of(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 44fd6134317d..cf2127837e67 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -132,12 +132,12 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
 	gpiod_set_value_cansleep(ddata->res_gpio, 0);
 }
 
-static void nec_8048_get_timings(struct omap_dss_device *dssdev,
-				 struct videomode *vm)
+static int nec_8048_get_modes(struct omap_dss_device *dssdev,
+			      struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops nec_8048_ops = {
@@ -147,7 +147,7 @@ static const struct omap_dss_device_ops nec_8048_ops = {
 	.enable		= nec_8048_enable,
 	.disable	= nec_8048_disable,
 
-	.get_timings	= nec_8048_get_timings,
+	.get_modes	= nec_8048_get_modes,
 };
 
 static int nec_8048_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 907abf8ef4e6..30320cee1e56 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -111,12 +111,12 @@ static void sharp_ls_post_disable(struct omap_dss_device *dssdev)
 		regulator_disable(ddata->vcc);
 }
 
-static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
-				 struct videomode *vm)
+static int sharp_ls_get_modes(struct omap_dss_device *dssdev,
+			      struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops sharp_ls_ops = {
@@ -128,7 +128,7 @@ static const struct omap_dss_device_ops sharp_ls_ops = {
 	.disable	= sharp_ls_disable,
 	.post_disable	= sharp_ls_post_disable,
 
-	.get_timings	= sharp_ls_get_timings,
+	.get_modes	= sharp_ls_get_modes,
 };
 
 static  int sharp_ls_get_gpio_of(struct device *dev, int index, int val,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index eeaea752f171..8debe77f92ff 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -596,12 +596,12 @@ static void acx565akm_disable(struct omap_dss_device *dssdev)
 	mutex_unlock(&ddata->mutex);
 }
 
-static void acx565akm_get_timings(struct omap_dss_device *dssdev,
-				  struct videomode *vm)
+static int acx565akm_get_modes(struct omap_dss_device *dssdev,
+			       struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops acx565akm_ops = {
@@ -611,7 +611,7 @@ static const struct omap_dss_device_ops acx565akm_ops = {
 	.enable		= acx565akm_enable,
 	.disable	= acx565akm_disable,
 
-	.get_timings	= acx565akm_get_timings,
+	.get_modes	= acx565akm_get_modes,
 };
 
 static int acx565akm_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index f1a5c14407a4..c8b15f19a166 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -272,12 +272,12 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
 	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
 }
 
-static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
-					 struct videomode *vm)
+static int td028ttec1_panel_get_modes(struct omap_dss_device *dssdev,
+				      struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops td028ttec1_ops = {
@@ -287,7 +287,7 @@ static const struct omap_dss_device_ops td028ttec1_ops = {
 	.enable		= td028ttec1_panel_enable,
 	.disable	= td028ttec1_panel_disable,
 
-	.get_timings	= td028ttec1_panel_get_timings,
+	.get_modes	= td028ttec1_panel_get_modes,
 };
 
 static int td028ttec1_panel_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 996a16736d10..9ecc4c7bee67 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -347,12 +347,12 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
 		tpo_td043_power_off(ddata);
 }
 
-static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
-				  struct videomode *vm)
+static int tpo_td043_get_modes(struct omap_dss_device *dssdev,
+			       struct drm_connector *connector)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
-	*vm = ddata->vm;
+	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
 static const struct omap_dss_device_ops tpo_td043_ops = {
@@ -362,7 +362,7 @@ static const struct omap_dss_device_ops tpo_td043_ops = {
 	.enable		= tpo_td043_enable,
 	.disable	= tpo_td043_disable,
 
-	.get_timings	= tpo_td043_get_timings,
+	.get_modes	= tpo_td043_get_modes,
 };
 
 static int tpo_td043_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 34b2a4ef63a4..398964358386 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -23,6 +23,9 @@
 #include <linux/kernel.h>
 #include <linux/of.h>
 
+#include <drm/drm_connector.h>
+#include <drm/drm_modes.h>
+
 #include "omapdss.h"
 
 static int disp_num_counter;
@@ -58,3 +61,22 @@ struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output)
 	return omapdss_device_get(output);
 }
 EXPORT_SYMBOL_GPL(omapdss_display_get);
+
+int omapdss_display_get_modes(struct drm_connector *connector,
+			      const struct videomode *vm)
+{
+	struct drm_display_mode *mode;
+
+	mode = drm_mode_create(connector->dev);
+	if (!mode)
+		return 0;
+
+	drm_display_mode_from_videomode(vm, mode);
+
+	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+	drm_mode_set_name(mode);
+	drm_mode_probed_add(connector, mode);
+
+	return 1;
+}
+EXPORT_SYMBOL_GPL(omapdss_display_get_modes);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 723a9b5060f5..3be8d3153d1a 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -67,6 +67,7 @@ struct dss_lcd_mgr_config;
 struct snd_aes_iec958;
 struct snd_cea_861_aud_if;
 struct hdmi_avi_infoframe;
+struct drm_connector;
 
 enum omap_display_type {
 	OMAP_DISPLAY_TYPE_NONE		= 0,
@@ -366,8 +367,6 @@ struct omap_dss_device_ops {
 
 	int (*check_timings)(struct omap_dss_device *dssdev,
 			     struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    const struct videomode *vm);
 
@@ -381,6 +380,9 @@ struct omap_dss_device_ops {
 
 	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
 
+	int (*get_modes)(struct omap_dss_device *dssdev,
+			 struct drm_connector *connector);
+
 	union {
 		const struct omapdss_hdmi_ops hdmi;
 		const struct omapdss_dsi_ops dsi;
@@ -476,6 +478,8 @@ static inline bool omapdss_is_initialized(void)
 	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_DISPLAY)) != NULL)
 void omapdss_display_init(struct omap_dss_device *dssdev);
 struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output);
+int omapdss_display_get_modes(struct drm_connector *connector,
+			      const struct videomode *vm);
 
 void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(struct omap_dss_device *dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 3fc776c45c4f..cefefe6d6fcb 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -548,14 +548,17 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
 	mutex_unlock(&venc->venc_lock);
 }
 
-static void venc_get_timings(struct omap_dss_device *dssdev,
-			     struct videomode *vm)
+static int venc_get_modes(struct omap_dss_device *dssdev,
+			  struct drm_connector *connector)
 {
 	struct venc_device *venc = dssdev_to_venc(dssdev);
+	int r;
 
 	mutex_lock(&venc->venc_lock);
-	*vm = venc->vm;
+	r = omapdss_display_get_modes(connector, &venc->vm);
 	mutex_unlock(&venc->venc_lock);
+
+	return r;
 }
 
 static void venc_set_timings(struct omap_dss_device *dssdev,
@@ -690,8 +693,9 @@ static const struct omap_dss_device_ops venc_ops = {
 	.disable = venc_display_disable,
 
 	.check_timings = venc_check_timings,
-	.get_timings = venc_get_timings,
 	.set_timings = venc_set_timings,
+
+	.get_modes = venc_get_modes,
 };
 
 /* -----------------------------------------------------------------------------
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index b81302c4bf9e..93b31bf07d05 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -212,8 +212,6 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev;
-	struct drm_display_mode *mode;
-	struct videomode vm = {0};
 
 	DBG("%s", omap_connector->display->name);
 
@@ -238,31 +236,20 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 					 &connector->display_info.height_mm);
 
 	/*
-	 * Iterate over the pipeline to find the first device that can provide
-	 * timing information. If we can't find any, we just let the KMS core
-	 * add the default modes.
+	 * If the display pipeline reports modes (e.g. with a fixed resolution
+	 * panel or an analog TV output), query it.
 	 */
 	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
-		if (dssdev->ops->get_timings)
-			break;
+		if (dssdev->ops->get_modes)
+			return dssdev->ops->get_modes(dssdev, connector);
 	}
-	if (!dssdev)
-		return 0;
-
-	/* Add a single mode corresponding to the fixed panel timings. */
-	mode = drm_mode_create(connector->dev);
-	if (!mode)
-		return 0;
-
-	dssdev->ops->get_timings(dssdev, &vm);
-
-	drm_display_mode_from_videomode(&vm, mode);
 
-	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
-	drm_mode_set_name(mode);
-	drm_mode_probed_add(connector, mode);
-
-	return 1;
+	/*
+	 * We can't retrieve modes, which can happen for instance for a DVI or
+	 * VGA output with the DDC bus unconnected. The KMS core will add the
+	 * default modes.
+	 */
+	return 0;
 }
 
 static int omap_connector_mode_valid(struct drm_connector *connector,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (11 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:02   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes() Laurent Pinchart
                   ` (16 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Now that the .get_modes() operations takes a drm_connector and fills it
with modes, it becomes easy to fill display information in the same
operation without requiring a separate .get_size() opearation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 14 +++-----------
 drivers/gpu/drm/omapdrm/dss/omapdss.h           |  3 ---
 drivers/gpu/drm/omapdrm/omap_connector.c        | 15 ++-------------
 3 files changed, 5 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 9cd9ab487a24..c5f570106a17 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1117,6 +1117,9 @@ static int dsicm_get_modes(struct omap_dss_device *dssdev,
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 
+	connector->display_info.width_mm = ddata->width_mm;
+	connector->display_info.height_mm = ddata->height_mm;
+
 	return omapdss_display_get_modes(connector, &ddata->vm);
 }
 
@@ -1142,15 +1145,6 @@ static int dsicm_check_timings(struct omap_dss_device *dssdev,
 	return ret;
 }
 
-static void dsicm_get_size(struct omap_dss_device *dssdev,
-			  unsigned int *width, unsigned int *height)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-
-	*width = ddata->width_mm;
-	*height = ddata->height_mm;
-}
-
 static const struct omap_dss_device_ops dsicm_ops = {
 	.connect	= dsicm_connect,
 	.disconnect	= dsicm_disconnect,
@@ -1166,8 +1160,6 @@ static const struct omap_dss_driver dsicm_dss_driver = {
 	.update		= dsicm_update,
 	.sync		= dsicm_sync,
 
-	.get_size	= dsicm_get_size,
-
 	.enable_te	= dsicm_enable_te,
 	.get_te		= dsicm_get_te,
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 3be8d3153d1a..561f404a58f2 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -462,9 +462,6 @@ struct omap_dss_driver {
 	int (*memory_read)(struct omap_dss_device *dssdev,
 			void *buf, size_t size,
 			u16 x, u16 y, u16 w, u16 h);
-
-	void (*get_size)(struct omap_dss_device *dssdev,
-			 unsigned int *width, unsigned int *height);
 };
 
 struct dss_device *omapdss_get_dss(void);
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 93b31bf07d05..c21a2016d03f 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -225,19 +225,8 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 		return omap_connector_get_modes_edid(connector, dssdev);
 
 	/*
-	 * Otherwise we have either a fixed resolution panel or an output that
-	 * doesn't support modes discovery (e.g. DVI or VGA with the DDC bus
-	 * unconnected, or analog TV). Start by querying the size.
-	 */
-	dssdev = omap_connector->display;
-	if (dssdev->driver && dssdev->driver->get_size)
-		dssdev->driver->get_size(dssdev,
-					 &connector->display_info.width_mm,
-					 &connector->display_info.height_mm);
-
-	/*
-	 * If the display pipeline reports modes (e.g. with a fixed resolution
-	 * panel or an analog TV output), query it.
+	 * Otherwise if the display pipeline reports modes (e.g. with a fixed
+	 * resolution panel or an analog TV output), query it.
 	 */
 	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
 		if (dssdev->ops->get_modes)
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes()
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (12 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:02   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes Laurent Pinchart
                   ` (15 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Instead of manually iterating over the dss devices in the pipeline to
find the first one that implements the .get_modes() operation, add a new
operation flag for .get_modes() and use the omap_connector_find_device()
helper function to locate the right dss device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c              | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c           | 1 +
 .../gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c   | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   | 1 +
 .../gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   | 1 +
 drivers/gpu/drm/omapdrm/dss/omapdss.h                     | 4 +++-
 drivers/gpu/drm/omapdrm/dss/venc.c                        | 1 +
 drivers/gpu/drm/omapdrm/omap_connector.c                  | 8 ++++----
 11 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 2bda6d4fdb16..3b3570cb0d9a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -152,6 +152,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index c5f570106a17..fe9d9f847d2e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1271,6 +1271,7 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
 		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index e05b7f80416e..f37931bf1c5f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -199,6 +199,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	/*
 	 * Note: According to the panel documentation:
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index cf2127837e67..8f2fb3d0492f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -194,6 +194,7 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_POSEDGE
 			  | DRM_BUS_FLAG_PIXDATA_POSEDGE;
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 30320cee1e56..8d5d7f775b55 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -209,6 +209,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	/*
 	 * Note: According to the panel documentation:
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 8debe77f92ff..b8360cef3754 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -708,6 +708,7 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_NEGEDGE
 			  | DRM_BUS_FLAG_PIXDATA_POSEDGE;
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index c8b15f19a166..721c5bb3bdef 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -323,6 +323,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	/*
 	 * Note: According to the panel documentation:
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 9ecc4c7bee67..50960018dbe8 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -422,6 +422,7 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
+	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	/*
 	 * Note: According to the panel documentation:
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 561f404a58f2..5dac69519d7e 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -393,12 +393,14 @@ struct omap_dss_device_ops {
  * enum omap_dss_device_ops_flag - Indicates which device ops are supported
  * @OMAP_DSS_DEVICE_OP_DETECT: The device supports output connection detection
  * @OMAP_DSS_DEVICE_OP_HPD: The device supports all hot-plug-related operations
- * @OMAP_DSS_DEVICE_OP_EDID: The device supports readind EDID
+ * @OMAP_DSS_DEVICE_OP_EDID: The device supports reading EDID
+ * @OMAP_DSS_DEVICE_OP_MODES: The device supports reading modes
  */
 enum omap_dss_device_ops_flag {
 	OMAP_DSS_DEVICE_OP_DETECT = BIT(0),
 	OMAP_DSS_DEVICE_OP_HPD = BIT(1),
 	OMAP_DSS_DEVICE_OP_EDID = BIT(2),
+	OMAP_DSS_DEVICE_OP_MODES = BIT(3),
 };
 
 enum omap_dss_device_type {
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index cefefe6d6fcb..f1abb4195a76 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -755,6 +755,7 @@ static int venc_init_output(struct venc_device *venc)
 	out->ops = &venc_ops;
 	out->owner = THIS_MODULE;
 	out->of_ports = BIT(0);
+	out->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
 	r = omapdss_device_init_output(out);
 	if (r < 0)
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index c21a2016d03f..0bbbf4d0502d 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -228,10 +228,10 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 	 * Otherwise if the display pipeline reports modes (e.g. with a fixed
 	 * resolution panel or an analog TV output), query it.
 	 */
-	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
-		if (dssdev->ops->get_modes)
-			return dssdev->ops->get_modes(dssdev, connector);
-	}
+	dssdev = omap_connector_find_device(connector,
+					    OMAP_DSS_DEVICE_OP_MODES);
+	if (dssdev)
+		return dssdev->ops->get_modes(dssdev, connector);
 
 	/*
 	 * We can't retrieve modes, which can happen for instance for a DVI or
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (13 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes() Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:03   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function Laurent Pinchart
                   ` (14 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The TV encoder supports both PAL and NTSC modes, but when queried for
the list of modes it supports, only the currently selected mode is
reported. Fix it and report the two modes unconditionally.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/venc.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index f1abb4195a76..638cfd69ccf6 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -551,14 +551,27 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
 static int venc_get_modes(struct omap_dss_device *dssdev,
 			  struct drm_connector *connector)
 {
-	struct venc_device *venc = dssdev_to_venc(dssdev);
-	int r;
+	static const struct videomode *modes[] = {
+		&omap_dss_pal_vm,
+		&omap_dss_ntsc_vm,
+	};
+	unsigned int i;
 
-	mutex_lock(&venc->venc_lock);
-	r = omapdss_display_get_modes(connector, &venc->vm);
-	mutex_unlock(&venc->venc_lock);
+	for (i = 0; i < ARRAY_SIZE(modes); ++i) {
+		struct drm_display_mode *mode;
 
-	return r;
+		mode = drm_mode_create(connector->dev);
+		if (!mode)
+			return i;
+
+		drm_display_mode_from_videomode(modes[i], mode);
+
+		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+		drm_mode_set_name(mode);
+		drm_mode_probed_add(connector, mode);
+	}
+
+	return ARRAY_SIZE(modes);
 }
 
 static void venc_set_timings(struct omap_dss_device *dssdev,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (14 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:03   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline Laurent Pinchart
                   ` (13 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The display isn't used by the encoder implementation, don't pass it to
the initialization function and store it internally needlessly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.c     | 2 +-
 drivers/gpu/drm/omapdrm/omap_encoder.c | 5 +----
 drivers/gpu/drm/omapdrm/omap_encoder.h | 3 +--
 3 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 66c4cedb5539..286590657d44 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -296,7 +296,7 @@ static int omap_modeset_init(struct drm_device *dev)
 		struct drm_encoder *encoder;
 		struct drm_crtc *crtc;
 
-		encoder = omap_encoder_init(dev, pipe->output, display);
+		encoder = omap_encoder_init(dev, pipe->output);
 		if (!encoder)
 			return -ENOMEM;
 
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 5765e3ae5b16..79ee927cd905 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -37,7 +37,6 @@
 struct omap_encoder {
 	struct drm_encoder base;
 	struct omap_dss_device *output;
-	struct omap_dss_device *display;
 };
 
 static void omap_encoder_destroy(struct drm_encoder *encoder)
@@ -239,8 +238,7 @@ static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
 
 /* initialize encoder */
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
-				      struct omap_dss_device *output,
-				      struct omap_dss_device *display)
+				      struct omap_dss_device *output)
 {
 	struct drm_encoder *encoder = NULL;
 	struct omap_encoder *omap_encoder;
@@ -250,7 +248,6 @@ struct drm_encoder *omap_encoder_init(struct drm_device *dev,
 		goto fail;
 
 	omap_encoder->output = output;
-	omap_encoder->display = display;
 
 	encoder = &omap_encoder->base;
 
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.h b/drivers/gpu/drm/omapdrm/omap_encoder.h
index a7b5dde63ecb..4aefb3142886 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.h
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.h
@@ -25,7 +25,6 @@ struct drm_encoder;
 struct omap_dss_device;
 
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
-				      struct omap_dss_device *output,
-				      struct omap_dss_device *display);
+				      struct omap_dss_device *output);
 
 #endif /* __OMAPDRM_ENCODER_H__ */
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (15 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:03   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure Laurent Pinchart
                   ` (12 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DT bindings for the OMAP DSS allow assigning numerical IDs to
display outputs through display entries in the alias node. The driver
uses this information to sort pipelines according to the order specified
in DT, making it possible for a system to give a priority order to
outputs.

Retrieval of the alias ID is done when initializing display dss devices.
That code will be removed when moving to drm_bridge and drm_panel. Move
retrieval of the alias ID to display pipeline connection time and store
it in the pipeline structure instead to keep the feature.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/display.c | 2 --
 drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 --
 drivers/gpu/drm/omapdrm/omap_drv.c    | 9 +++++++--
 drivers/gpu/drm/omapdrm/omap_drv.h    | 1 +
 4 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 398964358386..e93f61a567a8 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -42,8 +42,6 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
 	if (id < 0)
 		id = disp_num_counter++;
 
-	dssdev->alias_id = id;
-
 	/* Use 'label' property for name, if it exists */
 	of_property_read_string(dssdev->dev->of_node, "label", &dssdev->name);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 5dac69519d7e..7c9f8a5ceb37 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -419,8 +419,6 @@ struct omap_dss_device {
 
 	struct list_head list;
 
-	unsigned int alias_id;
-
 	enum omap_display_type type;
 	/*
 	 * DSS output type that this device generates (for DSS internal devices)
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 286590657d44..c9b578a49b24 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -155,9 +155,9 @@ static int omap_compare_pipes(const void *a, const void *b)
 	const struct omap_drm_pipeline *pipe1 = a;
 	const struct omap_drm_pipeline *pipe2 = b;
 
-	if (pipe1->display->alias_id > pipe2->display->alias_id)
+	if (pipe1->alias_id > pipe2->alias_id)
 		return 1;
-	else if (pipe1->display->alias_id < pipe2->display->alias_id)
+	else if (pipe1->alias_id < pipe2->alias_id)
 		return -1;
 	return 0;
 }
@@ -182,11 +182,16 @@ static int omap_connect_pipelines(struct drm_device *ddev)
 				 output->name);
 		} else {
 			struct omap_drm_pipeline *pipe;
+			int id;
 
 			pipe = &priv->pipes[priv->num_pipes++];
 			pipe->output = omapdss_device_get(output);
 			pipe->display = omapdss_display_get(output);
 
+			id = of_alias_get_id(pipe->display->dev->of_node,
+					     "display");
+			pipe->alias_id = id >= 0 ? id : priv->num_pipes - 1;
+
 			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
 				/* To balance the 'for_each_dss_output' loop */
 				omapdss_device_put(output);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 788aa9f7e6df..a169de3ed95d 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -51,6 +51,7 @@ struct omap_drm_pipeline {
 	struct drm_connector *connector;
 	struct omap_dss_device *output;
 	struct omap_dss_device *display;
+	unsigned int alias_id;
 };
 
 struct omap_drm_private {
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (16 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:04   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally Laurent Pinchart
                   ` (11 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Display pipelines based on drm_bridge are handled from the bridge
closest to the CRTC. To move to that model we thus need to transition
away from walking pipelines in the other direction, and from accessing
the device at the end of the pipeline when possible.

Remove most accesses to the display device from the omap_connector
implementation, and don't store it in the omap_connector structure.

- For debug messages we can simply use the connector name instead.
- For type checks we can use the drm_connector type.
- For operation lookup we can start at the other end of the pipeline and
  locate the last matching device.

The display device is still passed to the connector init function in
order to find its type, which requires access to the end of the
pipeline.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_connector.c | 31 ++++++++++--------------
 1 file changed, 13 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 0bbbf4d0502d..31b6d6d1def3 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -30,7 +30,6 @@
 struct omap_connector {
 	struct drm_connector base;
 	struct omap_dss_device *output;
-	struct omap_dss_device *display;
 	struct omap_dss_device *hpd;
 	bool hdmi_mode;
 };
@@ -103,20 +102,20 @@ omap_connector_find_device(struct drm_connector *connector,
 			   enum omap_dss_device_ops_flag op)
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
-	struct omap_dss_device *dssdev;
+	struct omap_dss_device *dssdev = NULL;
+	struct omap_dss_device *d;
 
-	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
-		if (dssdev->ops_flags & op)
-			return dssdev;
+	for (d = omap_connector->output; d; d = d->next) {
+		if (d->ops_flags & op)
+			dssdev = d;
 	}
 
-	return NULL;
+	return dssdev;
 }
 
 static enum drm_connector_status omap_connector_detect(
 		struct drm_connector *connector, bool force)
 {
-	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev;
 	enum drm_connector_status status;
 
@@ -130,11 +129,10 @@ static enum drm_connector_status omap_connector_detect(
 
 		omap_connector_hpd_notify(connector, dssdev->src, status);
 	} else {
-		switch (omap_connector->display->type) {
-		case OMAP_DISPLAY_TYPE_DPI:
-		case OMAP_DISPLAY_TYPE_DBI:
-		case OMAP_DISPLAY_TYPE_SDI:
-		case OMAP_DISPLAY_TYPE_DSI:
+		switch (connector->connector_type) {
+		case DRM_MODE_CONNECTOR_DPI:
+		case DRM_MODE_CONNECTOR_LVDS:
+		case DRM_MODE_CONNECTOR_DSI:
 			status = connector_status_connected;
 			break;
 		default:
@@ -143,7 +141,7 @@ static enum drm_connector_status omap_connector_detect(
 		}
 	}
 
-	VERB("%s: %d (force=%d)", omap_connector->display->name, status, force);
+	VERB("%s: %d (force=%d)", connector->name, status, force);
 
 	return status;
 }
@@ -152,7 +150,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 
-	DBG("%s", omap_connector->display->name);
+	DBG("%s", connector->name);
 
 	if (omap_connector->hpd) {
 		struct omap_dss_device *hpd = omap_connector->hpd;
@@ -166,7 +164,6 @@ static void omap_connector_destroy(struct drm_connector *connector)
 	drm_connector_cleanup(connector);
 
 	omapdss_device_put(omap_connector->output);
-	omapdss_device_put(omap_connector->display);
 
 	kfree(omap_connector);
 }
@@ -210,10 +207,9 @@ static int omap_connector_get_modes_edid(struct drm_connector *connector,
 
 static int omap_connector_get_modes(struct drm_connector *connector)
 {
-	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev;
 
-	DBG("%s", omap_connector->display->name);
+	DBG("%s", connector->name);
 
 	/*
 	 * If display exposes EDID, then we parse that in the normal way to
@@ -346,7 +342,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 		goto fail;
 
 	omap_connector->output = omapdss_device_get(output);
-	omap_connector->display = omapdss_device_get(display);
 
 	connector = &omap_connector->base;
 	connector->interlace_allowed = 1;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (17 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:04   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection Laurent Pinchart
                   ` (10 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The source pointer will be removed to the omap_dss_device structure.
Store it internally in the DSI panel driver data.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 55 ++++++++++---------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index fe9d9f847d2e..ce812094177c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -43,6 +43,7 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
+	struct omap_dss_device *src;
 
 	struct videomode vm;
 
@@ -143,7 +144,7 @@ static void hw_guard_wait(struct panel_drv_data *ddata)
 
 static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 	u8 buf[1];
 
@@ -159,14 +160,14 @@ static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
 
 static int dsicm_dcs_write_0(struct panel_drv_data *ddata, u8 dcs_cmd)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 
 	return src->ops->dsi.dcs_write(src, ddata->channel, &dcs_cmd, 1);
 }
 
 static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	u8 buf[2] = { dcs_cmd, param };
 
 	return src->ops->dsi.dcs_write(src, ddata->channel, buf, 2);
@@ -175,7 +176,7 @@ static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
 static int dsicm_sleep_in(struct panel_drv_data *ddata)
 
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	u8 cmd;
 	int r;
 
@@ -230,7 +231,7 @@ static int dsicm_get_id(struct panel_drv_data *ddata, u8 *id1, u8 *id2, u8 *id3)
 static int dsicm_set_update_window(struct panel_drv_data *ddata,
 		u16 x, u16 y, u16 w, u16 h)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 	u16 x1 = x;
 	u16 x2 = x + w - 1;
@@ -277,7 +278,7 @@ static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
 
 static int dsicm_enter_ulps(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	if (ddata->ulps_enabled)
@@ -311,7 +312,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
 
 static int dsicm_exit_ulps(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	if (!ddata->ulps_enabled)
@@ -363,7 +364,7 @@ static int dsicm_wake_up(struct panel_drv_data *ddata)
 static int dsicm_bl_update_status(struct backlight_device *dev)
 {
 	struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r = 0;
 	int level;
 
@@ -411,7 +412,7 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	u8 errors = 0;
 	int r;
 
@@ -443,7 +444,7 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	u8 id1, id2, id3;
 	int r;
 
@@ -475,7 +476,7 @@ static ssize_t dsicm_store_ulps(struct device *dev,
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	unsigned long t;
 	int r;
 
@@ -525,7 +526,7 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	unsigned long t;
 	int r;
 
@@ -600,7 +601,7 @@ static void dsicm_hw_reset(struct panel_drv_data *ddata)
 
 static int dsicm_power_on(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	u8 id1, id2, id3;
 	int r;
 	struct omap_dss_dsi_config dsi_config = {
@@ -715,7 +716,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 static void dsicm_power_off(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	src->ops->dsi.disable_video_output(src, ddata->channel);
@@ -769,6 +770,7 @@ static int dsicm_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	ddata->src = src;
 	return 0;
 }
 
@@ -778,12 +780,13 @@ static void dsicm_disconnect(struct omap_dss_device *src,
 	struct panel_drv_data *ddata = to_panel_data(dst);
 
 	src->ops->dsi.release_vc(src, ddata->channel);
+	ddata->src = NULL;
 }
 
 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;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	mutex_lock(&ddata->lock);
@@ -810,7 +813,7 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
 static void dsicm_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	dsicm_bl_power(ddata, false);
@@ -833,7 +836,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 static void dsicm_framedone_cb(int err, void *data)
 {
 	struct panel_drv_data *ddata = data;
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 
 	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
 	src->ops->dsi.bus_unlock(src);
@@ -842,7 +845,7 @@ static void dsicm_framedone_cb(int err, void *data)
 static irqreturn_t dsicm_te_isr(int irq, void *data)
 {
 	struct panel_drv_data *ddata = data;
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int old;
 	int r;
 
@@ -868,7 +871,7 @@ static void dsicm_te_timeout_work_callback(struct work_struct *work)
 {
 	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
 					te_timeout_work.work);
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 
 	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
 
@@ -880,7 +883,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 				    u16 x, u16 y, u16 w, u16 h)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
@@ -926,7 +929,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 static int dsicm_sync(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 
 	dev_dbg(&ddata->pdev->dev, "sync\n");
 
@@ -942,7 +945,7 @@ static int dsicm_sync(struct omap_dss_device *dssdev)
 
 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 {
-	struct omap_dss_device *src = ddata->dssdev.src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	if (enable)
@@ -962,7 +965,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 
 	mutex_lock(&ddata->lock);
@@ -1013,7 +1016,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 		u16 x, u16 y, u16 w, u16 h)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 	int r;
 	int first = 1;
 	int plen;
@@ -1095,7 +1098,7 @@ static void dsicm_ulps_work(struct work_struct *work)
 	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
 			ulps_work.work);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
-	struct omap_dss_device *src = dssdev->src;
+	struct omap_dss_device *src = ddata->src;
 
 	mutex_lock(&ddata->lock);
 
@@ -1352,7 +1355,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
 
 	if (omapdss_device_is_enabled(dssdev))
 		dsicm_disable(dssdev);
-	omapdss_device_disconnect(dssdev->src, dssdev);
+	omapdss_device_disconnect(ddata->src, dssdev);
 
 	sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
 
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (18 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:04   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure Laurent Pinchart
                   ` (9 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

For HDMI pipelines, when the output gets disconnected the device
handling CEC needs to be notified. Instead of guessing which device that
would be (and sometimes getting it wrong), notify all devices in the
pipeline.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_connector.c | 28 ++++++++++++++----------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 31b6d6d1def3..8db1f2fbcf43 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -35,18 +35,22 @@ struct omap_connector {
 };
 
 static void omap_connector_hpd_notify(struct drm_connector *connector,
-				      struct omap_dss_device *src,
 				      enum drm_connector_status status)
 {
-	if (status == connector_status_disconnected) {
-		/*
-		 * If the source is an HDMI encoder, notify it of disconnection.
-		 * This is required to let the HDMI encoder reset any internal
-		 * state related to connection status, such as the CEC address.
-		 */
-		if (src && src->type == OMAP_DISPLAY_TYPE_HDMI &&
-		    src->ops->hdmi.lost_hotplug)
-			src->ops->hdmi.lost_hotplug(src);
+	struct omap_connector *omap_connector = to_omap_connector(connector);
+	struct omap_dss_device *dssdev;
+
+	if (status != connector_status_disconnected)
+		return;
+
+	/*
+	 * Notify all devics in the pipeline of disconnection. This is required
+	 * to let the HDMI encoders reset their internal state related to
+	 * connection status, such as the CEC address.
+	 */
+	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
+		if (dssdev->ops && dssdev->ops->hdmi.lost_hotplug)
+			dssdev->ops->hdmi.lost_hotplug(dssdev);
 	}
 }
 
@@ -66,7 +70,7 @@ static void omap_connector_hpd_cb(void *cb_data,
 	if (old_status == status)
 		return;
 
-	omap_connector_hpd_notify(connector, omap_connector->hpd, status);
+	omap_connector_hpd_notify(connector, status);
 
 	drm_kms_helper_hotplug_event(dev);
 }
@@ -127,7 +131,7 @@ static enum drm_connector_status omap_connector_detect(
 		       ? connector_status_connected
 		       : connector_status_disconnected;
 
-		omap_connector_hpd_notify(connector, dssdev->src, status);
+		omap_connector_hpd_notify(connector, status);
 	} else {
 		switch (connector->connector_type) {
 		case DRM_MODE_CONNECTOR_DPI:
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (19 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:04   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation Laurent Pinchart
                   ` (8 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The field is only used to check whether the device is connected, and we
can do so by checking the dss field instead. Remove the src field.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    | 14 +-------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
 2 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 8454e505b282..36f2d41c9935 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -187,7 +187,7 @@ EXPORT_SYMBOL(omapdss_device_get_next);
 
 static bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
 {
-	return dssdev->src;
+	return dssdev->dss;
 }
 
 int omapdss_device_connect(struct dss_device *dss,
@@ -209,11 +209,6 @@ int omapdss_device_connect(struct dss_device *dss,
 		return ret;
 	}
 
-	if (src) {
-		WARN_ON(dst->src);
-		dst->src = src;
-	}
-
 	return 0;
 }
 EXPORT_SYMBOL_GPL(omapdss_device_connect);
@@ -228,13 +223,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 		return;
 	}
 
-	if (src) {
-		if (WARN_ON(dst->src != src))
-			return;
-
-		dst->src = NULL;
-	}
-
 	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
 
 	dst->ops->disconnect(src, dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 7c9f8a5ceb37..80db32bc896f 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -414,7 +414,6 @@ struct omap_dss_device {
 	struct module *owner;
 
 	struct dss_device *dss;
-	struct omap_dss_device *src;
 	struct omap_dss_device *next;
 
 	struct list_head list;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (20 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:07   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration Laurent Pinchart
                   ` (7 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DISPC timings checks relate to the CRTC, but they're performed in
the encoder and connector .atomic_check() and .mode_valid() operations.
Move them to the CRTC .mode_valid() operation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_connector.c | 6 ------
 drivers/gpu/drm/omapdrm/omap_crtc.c      | 9 +++++++++
 drivers/gpu/drm/omapdrm/omap_encoder.c   | 6 ------
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 8db1f2fbcf43..dd1e0f2e8ffc 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -245,8 +245,6 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
 				 struct drm_display_mode *mode)
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
-	enum omap_channel channel = omap_connector->output->dispc_channel;
-	struct omap_drm_private *priv = connector->dev->dev_private;
 	struct omap_dss_device *dssdev;
 	struct videomode vm = {0};
 	struct drm_device *dev = connector->dev;
@@ -256,10 +254,6 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
 	drm_display_mode_to_videomode(mode, &vm);
 	mode->vrefresh = drm_mode_vrefresh(mode);
 
-	r = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
-	if (r)
-		goto done;
-
 	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
 		if (!dssdev->ops->check_timings)
 			continue;
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index caffc547ef97..51036e6fca1c 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -391,6 +391,15 @@ static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc,
 					const struct drm_display_mode *mode)
 {
 	struct omap_drm_private *priv = crtc->dev->dev_private;
+	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+	struct videomode vm = {0};
+	int r;
+
+	drm_display_mode_to_videomode(mode, &vm);
+	r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel,
+					       &vm);
+	if (r)
+		return r;
 
 	/* Check for bandwidth limit */
 	if (priv->max_bandwidth) {
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 79ee927cd905..7d01df6fa723 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -198,19 +198,13 @@ static int omap_encoder_atomic_check(struct drm_encoder *encoder,
 				     struct drm_connector_state *conn_state)
 {
 	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-	enum omap_channel channel = omap_encoder->output->dispc_channel;
 	struct drm_device *dev = encoder->dev;
-	struct omap_drm_private *priv = dev->dev_private;
 	struct omap_dss_device *dssdev;
 	struct videomode vm = { 0 };
 	int ret;
 
 	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
 
-	ret = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
-	if (ret)
-		goto done;
-
 	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
 		if (!dssdev->ops->check_timings)
 			continue;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (21 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:08   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 24/29] drm/omap: Factor out common mode validation code Laurent Pinchart
                   ` (6 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The mode setting handler of the VENC stores the video mode internally,
to then convert it to a configuration when programming the hardware. The
stored mode is otherwise unused. Cache the configuration directly
instead.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/venc.c | 68 +++++++++++++++---------------
 1 file changed, 34 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 638cfd69ccf6..6cb708e1944e 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -301,24 +301,6 @@ static const struct videomode omap_dss_ntsc_vm = {
 			  DISPLAY_FLAGS_SYNC_NEGEDGE,
 };
 
-static enum venc_videomode venc_get_videomode(const struct videomode *vm)
-{
-	if (!(vm->flags & DISPLAY_FLAGS_INTERLACED))
-		return VENC_MODE_UNKNOWN;
-
-	if (vm->pixelclock == omap_dss_pal_vm.pixelclock &&
-	    vm->hactive == omap_dss_pal_vm.hactive &&
-	    vm->vactive == omap_dss_pal_vm.vactive)
-		return VENC_MODE_PAL;
-
-	if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock &&
-	    vm->hactive == omap_dss_ntsc_vm.hactive &&
-	    vm->vactive == omap_dss_ntsc_vm.vactive)
-		return VENC_MODE_NTSC;
-
-	return VENC_MODE_UNKNOWN;
-}
-
 struct venc_device {
 	struct platform_device *pdev;
 	void __iomem *base;
@@ -330,7 +312,7 @@ struct venc_device {
 
 	struct clk	*tv_dac_clk;
 
-	struct videomode vm;
+	const struct venc_config *config;
 	enum omap_dss_venc_type type;
 	bool invert_polarity;
 	bool requires_tv_dac_clk;
@@ -450,18 +432,6 @@ static void venc_runtime_put(struct venc_device *venc)
 	WARN_ON(r < 0 && r != -ENOSYS);
 }
 
-static const struct venc_config *venc_timings_to_config(const struct videomode *vm)
-{
-	switch (venc_get_videomode(vm)) {
-	default:
-		WARN_ON_ONCE(1);
-	case VENC_MODE_PAL:
-		return &venc_config_pal_trm;
-	case VENC_MODE_NTSC:
-		return &venc_config_ntsc_trm;
-	}
-}
-
 static int venc_power_on(struct venc_device *venc)
 {
 	u32 l;
@@ -472,7 +442,7 @@ static int venc_power_on(struct venc_device *venc)
 		goto err0;
 
 	venc_reset(venc);
-	venc_write_config(venc, venc_timings_to_config(&venc->vm));
+	venc_write_config(venc, venc->config);
 
 	dss_set_venc_output(venc->dss, venc->type);
 	dss_set_dac_pwrdn_bgz(venc->dss, 1);
@@ -574,16 +544,46 @@ static int venc_get_modes(struct omap_dss_device *dssdev,
 	return ARRAY_SIZE(modes);
 }
 
+static enum venc_videomode venc_get_videomode(const struct videomode *vm)
+{
+	if (!(vm->flags & DISPLAY_FLAGS_INTERLACED))
+		return VENC_MODE_UNKNOWN;
+
+	if (vm->pixelclock == omap_dss_pal_vm.pixelclock &&
+	    vm->hactive == omap_dss_pal_vm.hactive &&
+	    vm->vactive == omap_dss_pal_vm.vactive)
+		return VENC_MODE_PAL;
+
+	if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock &&
+	    vm->hactive == omap_dss_ntsc_vm.hactive &&
+	    vm->vactive == omap_dss_ntsc_vm.vactive)
+		return VENC_MODE_NTSC;
+
+	return VENC_MODE_UNKNOWN;
+}
+
 static void venc_set_timings(struct omap_dss_device *dssdev,
 			     const struct videomode *vm)
 {
 	struct venc_device *venc = dssdev_to_venc(dssdev);
+	enum venc_videomode venc_mode = venc_get_videomode(vm);
 
 	DSSDBG("venc_set_timings\n");
 
 	mutex_lock(&venc->venc_lock);
 
-	venc->vm = *vm;
+	switch (venc_mode) {
+	default:
+		WARN_ON_ONCE(1);
+		/* Fall-through */
+	case VENC_MODE_PAL:
+		venc->config = &venc_config_pal_trm;
+		break;
+
+	case VENC_MODE_NTSC:
+		venc->config = &venc_config_ntsc_trm;
+		break;
+	}
 
 	dispc_set_tv_pclk(venc->dss->dispc, 13500000);
 
@@ -854,7 +854,7 @@ static int venc_probe(struct platform_device *pdev)
 
 	mutex_init(&venc->venc_lock);
 
-	venc->vm = omap_dss_pal_vm;
+	venc->config = &venc_config_pal_trm;
 
 	venc_mem = platform_get_resource(venc->pdev, IORESOURCE_MEM, 0);
 	venc->base = devm_ioremap_resource(&pdev->dev, venc_mem);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 24/29] drm/omap: Factor out common mode validation code
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (22 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:19   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings() Laurent Pinchart
                   ` (5 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The encoder .atomic_check() and connector .mode_valid() operations both
walk through the dss devices in the pipeline to validate the mode.
Factor out the common code in a new omap_drm_connector_mode_fixup()
function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_connector.c | 55 +++++++++++++-----------
 drivers/gpu/drm/omapdrm/omap_connector.h |  5 +++
 drivers/gpu/drm/omapdrm/omap_encoder.c   | 30 ++++---------
 3 files changed, 45 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index dd1e0f2e8ffc..9882a4b1402b 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -241,50 +241,57 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 	return 0;
 }
 
-static int omap_connector_mode_valid(struct drm_connector *connector,
-				 struct drm_display_mode *mode)
+enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
+					const struct drm_display_mode *mode,
+					struct drm_display_mode *adjusted_mode)
 {
-	struct omap_connector *omap_connector = to_omap_connector(connector);
-	struct omap_dss_device *dssdev;
-	struct videomode vm = {0};
-	struct drm_device *dev = connector->dev;
-	struct drm_display_mode *new_mode;
-	int r, ret = MODE_BAD;
+	struct videomode vm = { 0 };
+	int ret;
 
 	drm_display_mode_to_videomode(mode, &vm);
-	mode->vrefresh = drm_mode_vrefresh(mode);
 
-	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
+	for (; dssdev; dssdev = dssdev->next) {
 		if (!dssdev->ops->check_timings)
 			continue;
 
-		r = dssdev->ops->check_timings(dssdev, &vm);
-		if (r)
-			goto done;
+		ret = dssdev->ops->check_timings(dssdev, &vm);
+		if (ret)
+			return MODE_BAD;
 	}
 
-	/* check if vrefresh is still valid */
-	new_mode = drm_mode_duplicate(dev, mode);
-	if (!new_mode)
-		return MODE_BAD;
+	if (adjusted_mode)
+		drm_display_mode_from_videomode(&vm, adjusted_mode);
 
-	new_mode->clock = vm.pixelclock / 1000;
-	new_mode->vrefresh = 0;
-	if (mode->vrefresh == drm_mode_vrefresh(new_mode))
-		ret = MODE_OK;
-	drm_mode_destroy(dev, new_mode);
+	return MODE_OK;
+}
+
+static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *connector,
+				 struct drm_display_mode *mode)
+{
+	struct omap_connector *omap_connector = to_omap_connector(connector);
+	struct drm_display_mode new_mode = { { 0 } };
+	enum drm_mode_status status;
+
+	status = omap_connector_mode_fixup(omap_connector->output, mode,
+					   &new_mode);
+	if (status != MODE_OK)
+		goto done;
+
+	/* Check if vrefresh is still valid. */
+	if (drm_mode_vrefresh(mode) != drm_mode_vrefresh(&new_mode))
+		status = MODE_NOCLOCK;
 
 done:
 	DBG("connector: mode %s: "
 			"%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
-			(ret == MODE_OK) ? "valid" : "invalid",
+			(status == MODE_OK) ? "valid" : "invalid",
 			mode->base.id, mode->name, mode->vrefresh, mode->clock,
 			mode->hdisplay, mode->hsync_start,
 			mode->hsync_end, mode->htotal,
 			mode->vdisplay, mode->vsync_start,
 			mode->vsync_end, mode->vtotal, mode->type, mode->flags);
 
-	return ret;
+	return status;
 }
 
 static const struct drm_connector_funcs omap_connector_funcs = {
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
index 4a1dcd0f031b..6b7d4d95e32b 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.h
+++ b/drivers/gpu/drm/omapdrm/omap_connector.h
@@ -22,6 +22,8 @@
 
 #include <linux/types.h>
 
+enum drm_mode_status;
+
 struct drm_connector;
 struct drm_device;
 struct drm_encoder;
@@ -34,5 +36,8 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
 void omap_connector_enable_hpd(struct drm_connector *connector);
 void omap_connector_disable_hpd(struct drm_connector *connector);
+enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
+					const struct drm_display_mode *mode,
+					struct drm_display_mode *adjusted_mode);
 
 #endif /* __OMAPDRM_CONNECTOR_H__ */
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 7d01df6fa723..086963088201 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -198,29 +198,17 @@ static int omap_encoder_atomic_check(struct drm_encoder *encoder,
 				     struct drm_connector_state *conn_state)
 {
 	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-	struct drm_device *dev = encoder->dev;
-	struct omap_dss_device *dssdev;
-	struct videomode vm = { 0 };
-	int ret;
-
-	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
-
-	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
-		if (!dssdev->ops->check_timings)
-			continue;
-
-		ret = dssdev->ops->check_timings(dssdev, &vm);
-		if (ret)
-			goto done;
+	enum drm_mode_status status;
+
+	status = omap_connector_mode_fixup(omap_encoder->output,
+					   &crtc_state->mode,
+					   &crtc_state->adjusted_mode);
+	if (status != MODE_OK) {
+		dev_err(encoder->dev->dev, "invalid timings: %d\n", status);
+		return -EINVAL;
 	}
 
-	drm_display_mode_from_videomode(&vm, &crtc_state->adjusted_mode);
-
-done:
-	if (ret)
-		dev_err(dev->dev, "invalid timings: %d\n", ret);
-
-	return ret;
+	return 0;
 }
 
 static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings()
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (23 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 24/29] drm/omap: Factor out common mode validation code Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:26   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 26/29] drm/omap: venc: Use drm_display_mode natively Laurent Pinchart
                   ` (4 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device .check_timings() and .set_timings() operations
operate on struct videomode, while the DRM API operates on struct
drm_display_mode. This forces conversion from to videomode in the
callers. While that's not a problem per se, it creates a difference with
the drm_bridge API.

Replace the videomode parameter to the .check_timings() and
.set_timings() operations with a drm_display_mode. This pushed the
conversion to videomode down to the DSS devices in some cases. If needed
they will be converted to operate on drm_display_mode natively.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   |  8 +++---
 drivers/gpu/drm/omapdrm/dss/dpi.c             | 16 +++++------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c           |  6 ++--
 drivers/gpu/drm/omapdrm/dss/hdmi5.c           |  6 ++--
 drivers/gpu/drm/omapdrm/dss/omapdss.h         |  4 +--
 drivers/gpu/drm/omapdrm/dss/sdi.c             | 17 +++++------
 drivers/gpu/drm/omapdrm/dss/venc.c            | 28 +++++++++----------
 drivers/gpu/drm/omapdrm/omap_connector.c      |  8 ++----
 drivers/gpu/drm/omapdrm/omap_encoder.c        |  2 +-
 9 files changed, 46 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index ce812094177c..d9f10f41ddfb 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1127,20 +1127,20 @@ static int dsicm_get_modes(struct omap_dss_device *dssdev,
 }
 
 static int dsicm_check_timings(struct omap_dss_device *dssdev,
-			       struct videomode *vm)
+			       struct drm_display_mode *mode)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	int ret = 0;
 
-	if (vm->hactive != ddata->vm.hactive)
+	if (mode->hdisplay != ddata->vm.hactive)
 		ret = -EINVAL;
 
-	if (vm->vactive != ddata->vm.vactive)
+	if (mode->vdisplay != ddata->vm.vactive)
 		ret = -EINVAL;
 
 	if (ret) {
 		dev_warn(dssdev->dev, "wrong resolution: %d x %d",
-			 vm->hactive, vm->vactive);
+			 mode->hdisplay, mode->vdisplay);
 		dev_warn(dssdev->dev, "panel resolution: %d x %d",
 			 ddata->vm.hactive, ddata->vm.vactive);
 	}
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 0db01cadf09f..0cb3cb72f15f 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -459,7 +459,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev)
 }
 
 static void dpi_set_timings(struct omap_dss_device *dssdev,
-			    const struct videomode *vm)
+			    const struct drm_display_mode *mode)
 {
 	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
 
@@ -467,13 +467,13 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,
 
 	mutex_lock(&dpi->lock);
 
-	dpi->vm = *vm;
+	drm_display_mode_to_videomode(mode, &dpi->vm);
 
 	mutex_unlock(&dpi->lock);
 }
 
 static int dpi_check_timings(struct omap_dss_device *dssdev,
-			     struct videomode *vm)
+			     struct drm_display_mode *mode)
 {
 	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
 	int lck_div, pck_div;
@@ -482,20 +482,20 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,
 	struct dpi_clk_calc_ctx ctx;
 	bool ok;
 
-	if (vm->hactive % 8 != 0)
+	if (mode->hdisplay % 8 != 0)
 		return -EINVAL;
 
-	if (vm->pixelclock == 0)
+	if (mode->clock == 0)
 		return -EINVAL;
 
 	if (dpi->pll) {
-		ok = dpi_pll_clk_calc(dpi, vm->pixelclock, &ctx);
+		ok = dpi_pll_clk_calc(dpi, mode->clock * 1000, &ctx);
 		if (!ok)
 			return -EINVAL;
 
 		fck = ctx.pll_cinfo.clkout[ctx.clkout_idx];
 	} else {
-		ok = dpi_dss_clk_calc(dpi, vm->pixelclock, &ctx);
+		ok = dpi_dss_clk_calc(dpi, mode->clock * 1000, &ctx);
 		if (!ok)
 			return -EINVAL;
 
@@ -507,7 +507,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,
 
 	pck = fck / lck_div / pck_div;
 
-	vm->pixelclock = pck;
+	mode->clock = pck / 1000;
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 60792981a33f..4337380b1bf7 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -249,15 +249,15 @@ static void hdmi_power_off_full(struct omap_hdmi *hdmi)
 }
 
 static void hdmi_display_set_timings(struct omap_dss_device *dssdev,
-				     const struct videomode *vm)
+				     const struct drm_display_mode *mode)
 {
 	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 
 	mutex_lock(&hdmi->lock);
 
-	hdmi->cfg.vm = *vm;
+	drm_display_mode_to_videomode(mode, &hdmi->cfg.vm);
 
-	dispc_set_tv_pclk(hdmi->dss->dispc, vm->pixelclock);
+	dispc_set_tv_pclk(hdmi->dss->dispc, mode->clock * 1000);
 
 	mutex_unlock(&hdmi->lock);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index d7d33b4d2bed..b94f884c5c1a 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -248,15 +248,15 @@ static void hdmi_power_off_full(struct omap_hdmi *hdmi)
 }
 
 static void hdmi_display_set_timings(struct omap_dss_device *dssdev,
-				     const struct videomode *vm)
+				     const struct drm_display_mode *mode)
 {
 	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 
 	mutex_lock(&hdmi->lock);
 
-	hdmi->cfg.vm = *vm;
+	drm_display_mode_to_videomode(mode, &hdmi->cfg.vm);
 
-	dispc_set_tv_pclk(hdmi->dss->dispc, vm->pixelclock);
+	dispc_set_tv_pclk(hdmi->dss->dispc, mode->clock * 1000);
 
 	mutex_unlock(&hdmi->lock);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 80db32bc896f..d990009ddbbd 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -366,9 +366,9 @@ struct omap_dss_device_ops {
 	void (*post_disable)(struct omap_dss_device *dssdev);
 
 	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
+			     struct drm_display_mode *mode);
 	void (*set_timings)(struct omap_dss_device *dssdev,
-			    const struct videomode *vm);
+			    const struct drm_display_mode *mode);
 
 	bool (*detect)(struct omap_dss_device *dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 58c17566a4cb..f096a7f77e5f 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -206,36 +206,37 @@ static void sdi_display_disable(struct omap_dss_device *dssdev)
 }
 
 static void sdi_set_timings(struct omap_dss_device *dssdev,
-			    const struct videomode *vm)
+			    const struct drm_display_mode *mode)
 {
 	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
 
-	sdi->vm = *vm;
+	drm_display_mode_to_videomode(mode, &sdi->vm);
 }
 
 static int sdi_check_timings(struct omap_dss_device *dssdev,
-			     struct videomode *vm)
+			     struct drm_display_mode *mode)
 {
 	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
 	struct dispc_clock_info dispc_cinfo;
+	unsigned long pixelclock = mode->clock * 1000;
 	unsigned long fck;
 	unsigned long pck;
 	int r;
 
-	if (vm->pixelclock == 0)
+	if (pixelclock == 0)
 		return -EINVAL;
 
-	r = sdi_calc_clock_div(sdi, vm->pixelclock, &fck, &dispc_cinfo);
+	r = sdi_calc_clock_div(sdi, pixelclock, &fck, &dispc_cinfo);
 	if (r)
 		return r;
 
 	pck = fck / dispc_cinfo.lck_div / dispc_cinfo.pck_div;
 
-	if (pck != vm->pixelclock) {
+	if (pck != pixelclock) {
 		DSSWARN("Pixel clock adjusted from %lu Hz to %lu Hz\n",
-			vm->pixelclock, pck);
+			pixelclock, pck);
 
-		vm->pixelclock = pck;
+		mode->clock = pck / 1000;
 	}
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 6cb708e1944e..7bce5898654a 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -544,29 +544,29 @@ static int venc_get_modes(struct omap_dss_device *dssdev,
 	return ARRAY_SIZE(modes);
 }
 
-static enum venc_videomode venc_get_videomode(const struct videomode *vm)
+static enum venc_videomode venc_get_videomode(const struct drm_display_mode *mode)
 {
-	if (!(vm->flags & DISPLAY_FLAGS_INTERLACED))
+	if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
 		return VENC_MODE_UNKNOWN;
 
-	if (vm->pixelclock == omap_dss_pal_vm.pixelclock &&
-	    vm->hactive == omap_dss_pal_vm.hactive &&
-	    vm->vactive == omap_dss_pal_vm.vactive)
+	if (mode->clock == omap_dss_pal_vm.pixelclock / 1000 &&
+	    mode->hdisplay == omap_dss_pal_vm.hactive &&
+	    mode->vdisplay == omap_dss_pal_vm.vactive)
 		return VENC_MODE_PAL;
 
-	if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock &&
-	    vm->hactive == omap_dss_ntsc_vm.hactive &&
-	    vm->vactive == omap_dss_ntsc_vm.vactive)
+	if (mode->clock == omap_dss_ntsc_vm.pixelclock / 1000 &&
+	    mode->hdisplay == omap_dss_ntsc_vm.hactive &&
+	    mode->vdisplay == omap_dss_ntsc_vm.vactive)
 		return VENC_MODE_NTSC;
 
 	return VENC_MODE_UNKNOWN;
 }
 
 static void venc_set_timings(struct omap_dss_device *dssdev,
-			     const struct videomode *vm)
+			     const struct drm_display_mode *mode)
 {
 	struct venc_device *venc = dssdev_to_venc(dssdev);
-	enum venc_videomode venc_mode = venc_get_videomode(vm);
+	enum venc_videomode venc_mode = venc_get_videomode(mode);
 
 	DSSDBG("venc_set_timings\n");
 
@@ -591,17 +591,17 @@ static void venc_set_timings(struct omap_dss_device *dssdev,
 }
 
 static int venc_check_timings(struct omap_dss_device *dssdev,
-			      struct videomode *vm)
+			      struct drm_display_mode *mode)
 {
 	DSSDBG("venc_check_timings\n");
 
-	switch (venc_get_videomode(vm)) {
+	switch (venc_get_videomode(mode)) {
 	case VENC_MODE_PAL:
-		*vm = omap_dss_pal_vm;
+		drm_display_mode_from_videomode(&omap_dss_pal_vm, mode);
 		return 0;
 
 	case VENC_MODE_NTSC:
-		*vm = omap_dss_ntsc_vm;
+		drm_display_mode_from_videomode(&omap_dss_ntsc_vm, mode);
 		return 0;
 
 	default:
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 9882a4b1402b..487603c56b08 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -245,23 +245,19 @@ enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
 					const struct drm_display_mode *mode,
 					struct drm_display_mode *adjusted_mode)
 {
-	struct videomode vm = { 0 };
 	int ret;
 
-	drm_display_mode_to_videomode(mode, &vm);
+	drm_mode_copy(adjusted_mode, mode);
 
 	for (; dssdev; dssdev = dssdev->next) {
 		if (!dssdev->ops->check_timings)
 			continue;
 
-		ret = dssdev->ops->check_timings(dssdev, &vm);
+		ret = dssdev->ops->check_timings(dssdev, adjusted_mode);
 		if (ret)
 			return MODE_BAD;
 	}
 
-	if (adjusted_mode)
-		drm_display_mode_from_videomode(&vm, adjusted_mode);
-
 	return MODE_OK;
 }
 
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 086963088201..4fb8b3fbd688 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -107,7 +107,7 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
 
 	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
 		if (dssdev->ops->set_timings)
-			dssdev->ops->set_timings(dssdev, &vm);
+			dssdev->ops->set_timings(dssdev, adjusted_mode);
 	}
 
 	/* Set the HDMI mode and HDMI infoframe if applicable. */
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 26/29] drm/omap: venc: Use drm_display_mode natively
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (24 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings() Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-06 16:23   ` [PATCH v1.1 " Laurent Pinchart
  2018-12-05 15:00 ` [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders Laurent Pinchart
                   ` (3 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Replace internal usage of struct videomode with struct drm_display_mode
in order to avoid converting needlessly between the data structures.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/venc.c | 82 ++++++++++++++----------------
 1 file changed, 38 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 7bce5898654a..12306e1e2109 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -267,38 +267,34 @@ enum venc_videomode {
 	VENC_MODE_NTSC,
 };
 
-static const struct videomode omap_dss_pal_vm = {
-	.hactive	= 720,
-	.vactive	= 574,
-	.pixelclock	= 13500000,
-	.hsync_len	= 64,
-	.hfront_porch	= 12,
-	.hback_porch	= 68,
-	.vsync_len	= 5,
-	.vfront_porch	= 5,
-	.vback_porch	= 41,
-
-	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
-			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
-			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
-			  DISPLAY_FLAGS_SYNC_NEGEDGE,
+static const struct drm_display_mode omap_dss_pal_mode = {
+	.hdisplay	= 720,
+	.hsync_start	= 732,
+	.hsync_end	= 796,
+	.htotal		= 864,
+	.vdisplay	= 574,
+	.vsync_start	= 579,
+	.vsync_end	= 584,
+	.vtotal		= 625,
+	.clock		= 13500,
+
+	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
+			  DRM_MODE_FLAG_NVSYNC,
 };
 
-static const struct videomode omap_dss_ntsc_vm = {
-	.hactive	= 720,
-	.vactive	= 482,
-	.pixelclock	= 13500000,
-	.hsync_len	= 64,
-	.hfront_porch	= 16,
-	.hback_porch	= 58,
-	.vsync_len	= 6,
-	.vfront_porch	= 6,
-	.vback_porch	= 31,
-
-	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
-			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
-			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
-			  DISPLAY_FLAGS_SYNC_NEGEDGE,
+static const struct drm_display_mode omap_dss_ntsc_mode = {
+	.hdisplay	= 720,
+	.hsync_start	= 736,
+	.hsync_end	= 800,
+	.htotal		= 858,
+	.vdisplay	= 482,
+	.vsync_start	= 488,
+	.vsync_end	= 494,
+	.vtotal		= 525,
+	.clock		= 13500,
+
+	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
+			  DRM_MODE_FLAG_NVSYNC,
 };
 
 struct venc_device {
@@ -521,21 +517,19 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
 static int venc_get_modes(struct omap_dss_device *dssdev,
 			  struct drm_connector *connector)
 {
-	static const struct videomode *modes[] = {
-		&omap_dss_pal_vm,
-		&omap_dss_ntsc_vm,
+	static const struct drm_display_mode *modes[] = {
+		&omap_dss_pal_mode,
+		&omap_dss_ntsc_mode,
 	};
 	unsigned int i;
 
 	for (i = 0; i < ARRAY_SIZE(modes); ++i) {
 		struct drm_display_mode *mode;
 
-		mode = drm_mode_create(connector->dev);
+		mode = drm_mode_duplicate(connector->dev, modes[i]);
 		if (!mode)
 			return i;
 
-		drm_display_mode_from_videomode(modes[i], mode);
-
 		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
 		drm_mode_set_name(mode);
 		drm_mode_probed_add(connector, mode);
@@ -549,14 +543,14 @@ static enum venc_videomode venc_get_videomode(const struct drm_display_mode *mod
 	if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
 		return VENC_MODE_UNKNOWN;
 
-	if (mode->clock == omap_dss_pal_vm.pixelclock / 1000 &&
-	    mode->hdisplay == omap_dss_pal_vm.hactive &&
-	    mode->vdisplay == omap_dss_pal_vm.vactive)
+	if (mode->clock == omap_dss_pal_mode.clock &&
+	    mode->hdisplay == omap_dss_pal_mode.hdisplay &&
+	    mode->vdisplay == omap_dss_pal_mode.vdisplay)
 		return VENC_MODE_PAL;
 
-	if (mode->clock == omap_dss_ntsc_vm.pixelclock / 1000 &&
-	    mode->hdisplay == omap_dss_ntsc_vm.hactive &&
-	    mode->vdisplay == omap_dss_ntsc_vm.vactive)
+	if (mode->clock == omap_dss_ntsc_mode.clock &&
+	    mode->hdisplay == omap_dss_ntsc_mode.hdisplay &&
+	    mode->vdisplay == omap_dss_ntsc_mode.vdisplay)
 		return VENC_MODE_NTSC;
 
 	return VENC_MODE_UNKNOWN;
@@ -597,11 +591,11 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
 
 	switch (venc_get_videomode(mode)) {
 	case VENC_MODE_PAL:
-		drm_display_mode_from_videomode(&omap_dss_pal_vm, mode);
+		drm_mode_copy(mode, &omap_dss_pal_mode);
 		return 0;
 
 	case VENC_MODE_NTSC:
-		drm_display_mode_from_videomode(&omap_dss_ntsc_vm, mode);
+		drm_mode_copy(mode, &omap_dss_ntsc_mode);
 		return 0;
 
 	default:
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (25 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 26/29] drm/omap: venc: Use drm_display_mode natively Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:27   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices Laurent Pinchart
                   ` (2 subsequent siblings)
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DPI and SDI encoders store the full videomode upon mode set, to only
use the value of the pixel clock when enabling the encoder. This wastes
memory. Store the pixel clock value only.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dpi.c | 9 ++++-----
 drivers/gpu/drm/omapdrm/dss/sdi.c | 6 +++---
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 0cb3cb72f15f..295bc3eeea80 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -47,8 +47,8 @@ struct dpi_data {
 
 	struct mutex lock;
 
-	struct videomode vm;
 	struct dss_lcd_mgr_config mgr_config;
+	unsigned long pixelclock;
 	int data_lines;
 
 	struct omap_dss_device output;
@@ -347,16 +347,15 @@ static int dpi_set_dispc_clk(struct dpi_data *dpi, unsigned long pck_req,
 
 static int dpi_set_mode(struct dpi_data *dpi)
 {
-	const struct videomode *vm = &dpi->vm;
 	int lck_div = 0, pck_div = 0;
 	unsigned long fck = 0;
 	int r = 0;
 
 	if (dpi->pll)
 		r = dpi_set_pll_clk(dpi, dpi->output.dispc_channel,
-				    vm->pixelclock, &fck, &lck_div, &pck_div);
+				    dpi->pixelclock, &fck, &lck_div, &pck_div);
 	else
-		r = dpi_set_dispc_clk(dpi, vm->pixelclock, &fck,
+		r = dpi_set_dispc_clk(dpi, dpi->pixelclock, &fck,
 				&lck_div, &pck_div);
 	if (r)
 		return r;
@@ -467,7 +466,7 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,
 
 	mutex_lock(&dpi->lock);
 
-	drm_display_mode_to_videomode(mode, &dpi->vm);
+	dpi->pixelclock = mode->clock * 1000;
 
 	mutex_unlock(&dpi->lock);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index f096a7f77e5f..38b0bf19538d 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -37,7 +37,7 @@ struct sdi_device {
 	struct regulator *vdds_sdi_reg;
 
 	struct dss_lcd_mgr_config mgr_config;
-	struct videomode vm;
+	unsigned long pixelclock;
 	int datapairs;
 
 	struct omap_dss_device output;
@@ -144,7 +144,7 @@ static void sdi_display_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err_get_dispc;
 
-	r = sdi_calc_clock_div(sdi, sdi->vm.pixelclock, &fck, &dispc_cinfo);
+	r = sdi_calc_clock_div(sdi, sdi->pixelclock, &fck, &dispc_cinfo);
 	if (r)
 		goto err_calc_clock_div;
 
@@ -210,7 +210,7 @@ static void sdi_set_timings(struct omap_dss_device *dssdev,
 {
 	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
 
-	drm_display_mode_to_videomode(mode, &sdi->vm);
+	sdi->pixelclock = mode->clock * 1000;
 }
 
 static int sdi_check_timings(struct omap_dss_device *dssdev,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (26 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:27   ` Sebastian Reichel
  2018-12-05 15:00 ` [PATCH 29/29] drm/omap: Refactor initialization sequence Laurent Pinchart
  2018-12-10 12:28 ` [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields Laurent Pinchart
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Now that the direction of OF graph walk has been reversed, there's no
need to lookup devices by port as we have no sink device connected
through multiple sink ports. Simplify OF lookup of the DSS devices to
look them up by node only.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    |  5 +--
 drivers/gpu/drm/omapdrm/dss/dss-of.c  | 60 ++++-----------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 +-
 3 files changed, 10 insertions(+), 58 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 36f2d41c9935..4d7f999c8e29 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -112,13 +112,12 @@ void omapdss_device_put(struct omap_dss_device *dssdev)
 }
 EXPORT_SYMBOL(omapdss_device_put);
 
-struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
-						    unsigned int port)
+struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node)
 {
 	struct omap_dss_device *dssdev;
 
 	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
-		if (dssdev->dev->of_node == src && dssdev->of_ports & BIT(port))
+		if (dssdev->dev->of_node == node)
 			return omapdss_device_get(dssdev);
 	}
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
index 0422597ac6b0..b2094055c5fc 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
@@ -12,71 +12,25 @@
  * more details.
  */
 
-#include <linux/device.h>
 #include <linux/err.h>
-#include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_graph.h>
-#include <linux/seq_file.h>
 
 #include "omapdss.h"
 
-static struct device_node *
-dss_of_port_get_parent_device(struct device_node *port)
-{
-	struct device_node *np;
-	int i;
-
-	if (!port)
-		return NULL;
-
-	np = of_get_parent(port);
-
-	for (i = 0; i < 2 && np; ++i) {
-		struct property *prop;
-
-		prop = of_find_property(np, "compatible", NULL);
-
-		if (prop)
-			return np;
-
-		np = of_get_next_parent(np);
-	}
-
-	return NULL;
-}
-
 struct omap_dss_device *
 omapdss_of_find_connected_device(struct device_node *node, unsigned int port)
 {
-	struct device_node *src_node;
-	struct device_node *src_port;
-	struct device_node *ep;
-	struct omap_dss_device *src;
-	u32 port_number = 0;
+	struct device_node *remote_node;
+	struct omap_dss_device *dssdev;
 
-	/* Get the endpoint... */
-	ep = of_graph_get_endpoint_by_regs(node, port, 0);
-	if (!ep)
+	remote_node = of_graph_get_remote_node(node, port, 0);
+	if (!remote_node)
 		return NULL;
 
-	/* ... and its remote port... */
-	src_port = of_graph_get_remote_port(ep);
-	of_node_put(ep);
-	if (!src_port)
-		return NULL;
-
-	/* ... and the remote port's number and parent... */
-	of_property_read_u32(src_port, "reg", &port_number);
-	src_node = dss_of_port_get_parent_device(src_port);
-	of_node_put(src_port);
-	if (!src_node)
-		return ERR_PTR(-EINVAL);
-
-	/* ... and finally the connected device. */
-	src = omapdss_find_device_by_port(src_node, port_number);
-	of_node_put(src_node);
+	dssdev = omapdss_find_device_by_node(remote_node);
+	of_node_put(remote_node);
 
-	return src ? src : ERR_PTR(-EPROBE_DEFER);
+	return dssdev ? dssdev : ERR_PTR(-EPROBE_DEFER);
 }
 EXPORT_SYMBOL_GPL(omapdss_of_find_connected_device);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index d990009ddbbd..d51cb181e2cc 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -481,8 +481,7 @@ void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(struct omap_dss_device *dssdev);
 struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);
 void omapdss_device_put(struct omap_dss_device *dssdev);
-struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
-						    unsigned int port);
+struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node);
 struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 						enum omap_dss_device_type type);
 int omapdss_device_connect(struct dss_device *dss,
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 29/29] drm/omap: Refactor initialization sequence
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (27 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices Laurent Pinchart
@ 2018-12-05 15:00 ` Laurent Pinchart
  2018-12-09 22:27   ` Sebastian Reichel
  2018-12-10 12:28 ` [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields Laurent Pinchart
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-05 15:00 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omapdrm driver initialization procedure starts by connecting all
available pipelines, gathering related information (such as output and
display DSS devices, and DT aliases), sorting them by alias, and finally
creates all the DRM/KMS objects.

When using DRM bridges instead of DSS devices, we will need to attach to
the bridges before getting the aliases. As attaching to bridges requires
an encoder object, we have to reorganize the initialization sequence to
create encoders before getting aliases and sorting the pipelines.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.c | 123 +++++++++++++----------------
 1 file changed, 56 insertions(+), 67 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index c9b578a49b24..4cd4fb47660a 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -150,48 +150,27 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)
 	priv->num_pipes = 0;
 }
 
-static int omap_compare_pipes(const void *a, const void *b)
-{
-	const struct omap_drm_pipeline *pipe1 = a;
-	const struct omap_drm_pipeline *pipe2 = b;
-
-	if (pipe1->alias_id > pipe2->alias_id)
-		return 1;
-	else if (pipe1->alias_id < pipe2->alias_id)
-		return -1;
-	return 0;
-}
-
 static int omap_connect_pipelines(struct drm_device *ddev)
 {
 	struct omap_drm_private *priv = ddev->dev_private;
 	struct omap_dss_device *output = NULL;
-	unsigned int i;
 	int r;
 
-	if (!omapdss_stack_is_ready())
-		return -EPROBE_DEFER;
-
 	for_each_dss_output(output) {
 		r = omapdss_device_connect(priv->dss, NULL, output);
 		if (r == -EPROBE_DEFER) {
 			omapdss_device_put(output);
-			goto cleanup;
+			return r;
 		} else if (r) {
 			dev_warn(output->dev, "could not connect output %s\n",
 				 output->name);
 		} else {
 			struct omap_drm_pipeline *pipe;
-			int id;
 
 			pipe = &priv->pipes[priv->num_pipes++];
 			pipe->output = omapdss_device_get(output);
 			pipe->display = omapdss_display_get(output);
 
-			id = of_alias_get_id(pipe->display->dev->of_node,
-					     "display");
-			pipe->alias_id = id >= 0 ? id : priv->num_pipes - 1;
-
 			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
 				/* To balance the 'for_each_dss_output' loop */
 				omapdss_device_put(output);
@@ -200,36 +179,19 @@ static int omap_connect_pipelines(struct drm_device *ddev)
 		}
 	}
 
-	/* Sort the list by DT aliases */
-	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
-	     omap_compare_pipes, NULL);
-
-	/*
-	 * Populate the pipeline lookup table by DISPC channel. Only one display
-	 * is allowed per channel.
-	 */
-	for (i = 0; i < priv->num_pipes; ++i) {
-		struct omap_drm_pipeline *pipe = &priv->pipes[i];
-		enum omap_channel channel = pipe->output->dispc_channel;
-
-		if (WARN_ON(priv->channels[channel] != NULL)) {
-			r = -EINVAL;
-			goto cleanup;
-		}
-
-		priv->channels[channel] = pipe;
-	}
-
 	return 0;
+}
 
-cleanup:
-	/*
-	 * if we are deferring probe, we disconnect the devices we previously
-	 * connected
-	 */
-	omap_disconnect_pipelines(ddev);
+static int omap_compare_pipelines(const void *a, const void *b)
+{
+	const struct omap_drm_pipeline *pipe1 = a;
+	const struct omap_drm_pipeline *pipe2 = b;
 
-	return r;
+	if (pipe1->alias_id > pipe2->alias_id)
+		return 1;
+	else if (pipe1->alias_id < pipe2->alias_id)
+		return -1;
+	return 0;
 }
 
 static int omap_modeset_init_properties(struct drm_device *dev)
@@ -254,6 +216,9 @@ static int omap_modeset_init(struct drm_device *dev)
 	int ret;
 	u32 plane_crtc_mask;
 
+	if (!omapdss_stack_is_ready())
+		return -EPROBE_DEFER;
+
 	drm_mode_config_init(dev);
 
 	ret = omap_modeset_init_properties(dev);
@@ -268,6 +233,10 @@ static int omap_modeset_init(struct drm_device *dev)
 	 * configuration does not match the expectations or exceeds
 	 * the available resources, the configuration is rejected.
 	 */
+	ret = omap_connect_pipelines(dev);
+	if (ret < 0)
+		return ret;
+
 	if (priv->num_pipes > num_mgrs || priv->num_pipes > num_ovls) {
 		dev_err(dev->dev, "%s(): Too many connected displays\n",
 			__func__);
@@ -293,33 +262,58 @@ static int omap_modeset_init(struct drm_device *dev)
 		priv->planes[priv->num_planes++] = plane;
 	}
 
-	/* Create the CRTCs, encoders and connectors. */
+	/* Create the encoders and get the pipelines aliases. */
 	for (i = 0; i < priv->num_pipes; i++) {
 		struct omap_drm_pipeline *pipe = &priv->pipes[i];
-		struct omap_dss_device *display = pipe->display;
-		struct drm_connector *connector;
-		struct drm_encoder *encoder;
-		struct drm_crtc *crtc;
+		int id;
 
-		encoder = omap_encoder_init(dev, pipe->output);
-		if (!encoder)
+		pipe->encoder = omap_encoder_init(dev, pipe->output);
+		if (!pipe->encoder)
 			return -ENOMEM;
 
-		connector = omap_connector_init(dev, pipe->output, display,
-						encoder);
+		id = of_alias_get_id(pipe->display->dev->of_node, "display");
+		pipe->alias_id = id >= 0 ? id : i;
+	}
+
+	/* Sort the pipelines by DT aliases. */
+	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
+	     omap_compare_pipelines, NULL);
+
+	/*
+	 * Populate the pipeline lookup table by DISPC channel. Only one display
+	 * is allowed per channel.
+	 */
+	for (i = 0; i < priv->num_pipes; ++i) {
+		struct omap_drm_pipeline *pipe = &priv->pipes[i];
+		enum omap_channel channel = pipe->output->dispc_channel;
+
+		if (WARN_ON(priv->channels[channel] != NULL))
+			return -EINVAL;
+
+		priv->channels[channel] = pipe;
+	}
+
+	/* Create the connectors and CRTCs. */
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_drm_pipeline *pipe = &priv->pipes[i];
+		struct drm_encoder *encoder = pipe->encoder;
+		struct drm_connector *connector;
+		struct drm_crtc *crtc;
+
+		connector = omap_connector_init(dev, pipe->output,
+						pipe->display, encoder);
 		if (!connector)
 			return -ENOMEM;
 
+		drm_connector_attach_encoder(connector, encoder);
+		pipe->connector = connector;
+
 		crtc = omap_crtc_init(dev, pipe, priv->planes[i]);
 		if (IS_ERR(crtc))
 			return PTR_ERR(crtc);
 
-		drm_connector_attach_encoder(connector, encoder);
 		encoder->possible_crtcs = 1 << i;
-
 		pipe->crtc = crtc;
-		pipe->encoder = encoder;
-		pipe->connector = connector;
 	}
 
 	DBG("registered %u planes, %u crtcs/encoders/connectors\n",
@@ -556,10 +550,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 
 	omap_crtc_pre_init(priv);
 
-	ret = omap_connect_pipelines(ddev);
-	if (ret)
-		goto err_crtc_uninit;
-
 	soc = soc_device_match(omapdrm_soc_devices);
 	priv->omaprev = soc ? (unsigned int)soc->data : 0;
 	priv->wq = alloc_ordered_workqueue("omapdrm", 0);
@@ -617,7 +607,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	omap_gem_deinit(ddev);
 	destroy_workqueue(priv->wq);
 	omap_disconnect_pipelines(ddev);
-err_crtc_uninit:
 	omap_crtc_pre_uninit(priv);
 	drm_dev_put(ddev);
 	return ret;
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH v1.1 26/29] drm/omap: venc: Use drm_display_mode natively
  2018-12-05 15:00 ` [PATCH 26/29] drm/omap: venc: Use drm_display_mode natively Laurent Pinchart
@ 2018-12-06 16:23   ` Laurent Pinchart
  2018-12-09 22:27     ` Sebastian Reichel
  0 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-06 16:23 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Replace internal usage of struct videomode with struct drm_display_mode
in order to avoid converting needlessly between the data structures.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Set mode.crtc_* fields and mode name in venc_check_timings()
---
 drivers/gpu/drm/omapdrm/dss/venc.c | 90 +++++++++++++++---------------
 1 file changed, 44 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 7bce5898654a..f2cbecfd05b5 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -267,38 +267,34 @@ enum venc_videomode {
 	VENC_MODE_NTSC,
 };
 
-static const struct videomode omap_dss_pal_vm = {
-	.hactive	= 720,
-	.vactive	= 574,
-	.pixelclock	= 13500000,
-	.hsync_len	= 64,
-	.hfront_porch	= 12,
-	.hback_porch	= 68,
-	.vsync_len	= 5,
-	.vfront_porch	= 5,
-	.vback_porch	= 41,
-
-	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
-			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
-			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
-			  DISPLAY_FLAGS_SYNC_NEGEDGE,
+static const struct drm_display_mode omap_dss_pal_mode = {
+	.hdisplay	= 720,
+	.hsync_start	= 732,
+	.hsync_end	= 796,
+	.htotal		= 864,
+	.vdisplay	= 574,
+	.vsync_start	= 579,
+	.vsync_end	= 584,
+	.vtotal		= 625,
+	.clock		= 13500,
+
+	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
+			  DRM_MODE_FLAG_NVSYNC,
 };
 
-static const struct videomode omap_dss_ntsc_vm = {
-	.hactive	= 720,
-	.vactive	= 482,
-	.pixelclock	= 13500000,
-	.hsync_len	= 64,
-	.hfront_porch	= 16,
-	.hback_porch	= 58,
-	.vsync_len	= 6,
-	.vfront_porch	= 6,
-	.vback_porch	= 31,
-
-	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
-			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
-			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
-			  DISPLAY_FLAGS_SYNC_NEGEDGE,
+static const struct drm_display_mode omap_dss_ntsc_mode = {
+	.hdisplay	= 720,
+	.hsync_start	= 736,
+	.hsync_end	= 800,
+	.htotal		= 858,
+	.vdisplay	= 482,
+	.vsync_start	= 488,
+	.vsync_end	= 494,
+	.vtotal		= 525,
+	.clock		= 13500,
+
+	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
+			  DRM_MODE_FLAG_NVSYNC,
 };
 
 struct venc_device {
@@ -521,21 +517,19 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
 static int venc_get_modes(struct omap_dss_device *dssdev,
 			  struct drm_connector *connector)
 {
-	static const struct videomode *modes[] = {
-		&omap_dss_pal_vm,
-		&omap_dss_ntsc_vm,
+	static const struct drm_display_mode *modes[] = {
+		&omap_dss_pal_mode,
+		&omap_dss_ntsc_mode,
 	};
 	unsigned int i;
 
 	for (i = 0; i < ARRAY_SIZE(modes); ++i) {
 		struct drm_display_mode *mode;
 
-		mode = drm_mode_create(connector->dev);
+		mode = drm_mode_duplicate(connector->dev, modes[i]);
 		if (!mode)
 			return i;
 
-		drm_display_mode_from_videomode(modes[i], mode);
-
 		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
 		drm_mode_set_name(mode);
 		drm_mode_probed_add(connector, mode);
@@ -549,14 +543,14 @@ static enum venc_videomode venc_get_videomode(const struct drm_display_mode *mod
 	if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
 		return VENC_MODE_UNKNOWN;
 
-	if (mode->clock == omap_dss_pal_vm.pixelclock / 1000 &&
-	    mode->hdisplay == omap_dss_pal_vm.hactive &&
-	    mode->vdisplay == omap_dss_pal_vm.vactive)
+	if (mode->clock == omap_dss_pal_mode.clock &&
+	    mode->hdisplay == omap_dss_pal_mode.hdisplay &&
+	    mode->vdisplay == omap_dss_pal_mode.vdisplay)
 		return VENC_MODE_PAL;
 
-	if (mode->clock == omap_dss_ntsc_vm.pixelclock / 1000 &&
-	    mode->hdisplay == omap_dss_ntsc_vm.hactive &&
-	    mode->vdisplay == omap_dss_ntsc_vm.vactive)
+	if (mode->clock == omap_dss_ntsc_mode.clock &&
+	    mode->hdisplay == omap_dss_ntsc_mode.hdisplay &&
+	    mode->vdisplay == omap_dss_ntsc_mode.vdisplay)
 		return VENC_MODE_NTSC;
 
 	return VENC_MODE_UNKNOWN;
@@ -597,16 +591,20 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
 
 	switch (venc_get_videomode(mode)) {
 	case VENC_MODE_PAL:
-		drm_display_mode_from_videomode(&omap_dss_pal_vm, mode);
-		return 0;
+		drm_mode_copy(mode, &omap_dss_pal_mode);
+		break;
 
 	case VENC_MODE_NTSC:
-		drm_display_mode_from_videomode(&omap_dss_ntsc_vm, mode);
-		return 0;
+		drm_mode_copy(mode, &omap_dss_ntsc_mode);
+		break;
 
 	default:
 		return -EINVAL;
 	}
+
+	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
+	drm_mode_set_name(mode);
+	return 0;
 }
 
 static int venc_dump_regs(struct seq_file *s, void *p)
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* Re: [PATCH 01/29] drm/omap: Remove declaration of nonexisting function
  2018-12-05 14:59 ` [PATCH 01/29] drm/omap: Remove declaration of nonexisting function Laurent Pinchart
@ 2018-12-09 21:44   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:44 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1431 bytes --]

Hi,

On Wed, Dec 05, 2018 at 04:59:54PM +0200, Laurent Pinchart wrote:
> The omap_connector_attached_encoder() doesn't exist anymore, remove its
> declaration from omap_connector.h.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_connector.h | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
> index 854099801649..4a1dcd0f031b 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.h
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.h
> @@ -31,8 +31,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
>  					  struct omap_dss_device *output,
>  					  struct omap_dss_device *display,
>  					  struct drm_encoder *encoder);
> -struct drm_encoder *omap_connector_attached_encoder(
> -		struct drm_connector *connector);
>  bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
>  void omap_connector_enable_hpd(struct drm_connector *connector);
>  void omap_connector_disable_hpd(struct drm_connector *connector);
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device
  2018-12-05 14:59 ` [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device Laurent Pinchart
@ 2018-12-09 21:44   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:44 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1228 bytes --]

On Wed, Dec 05, 2018 at 04:59:55PM +0200, Laurent Pinchart wrote:
> The kobj field from struct omap_dss_device is not used. Remove it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 1f698a95a94a..d3b576e6edf5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -19,7 +19,6 @@
>  #define __OMAP_DRM_DSS_H
>  
>  #include <linux/list.h>
> -#include <linux/kobject.h>
>  #include <linux/device.h>
>  #include <linux/interrupt.h>
>  #include <video/videomode.h>
> @@ -404,7 +403,6 @@ enum omap_dss_device_type {
>  };
>  
>  struct omap_dss_device {
> -	struct kobject kobj;
>  	struct device *dev;
>  
>  	struct module *owner;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure
  2018-12-05 14:59 ` [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure Laurent Pinchart
@ 2018-12-09 21:45   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:45 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 2549 bytes --]

On Wed, Dec 05, 2018 at 04:59:56PM +0200, Laurent Pinchart wrote:
> The venc_device structure wss_data field is set to 0 and never otherwise
> modified, remove it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/venc.c | 11 +----------
>  1 file changed, 1 insertion(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index b5f52727f8b1..fbe9d42dbdb6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -323,7 +323,6 @@ struct venc_device {
>  	struct platform_device *pdev;
>  	void __iomem *base;
>  	struct mutex venc_lock;
> -	u32 wss_data;
>  	struct regulator *vdda_dac_reg;
>  	struct dss_device *dss;
>  
> @@ -367,8 +366,7 @@ static void venc_write_config(struct venc_device *venc,
>  	venc_write_reg(venc, VENC_BLACK_LEVEL, config->black_level);
>  	venc_write_reg(venc, VENC_BLANK_LEVEL, config->blank_level);
>  	venc_write_reg(venc, VENC_M_CONTROL, config->m_control);
> -	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
> -		       venc->wss_data);
> +	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data);
>  	venc_write_reg(venc, VENC_S_CARR, config->s_carr);
>  	venc_write_reg(venc, VENC_L21__WC_CTL, config->l21__wc_ctl);
>  	venc_write_reg(venc, VENC_SAVID__EAVID, config->savid__eavid);
> @@ -543,8 +541,6 @@ static int venc_display_enable(struct omap_dss_device *dssdev)
>  	if (r)
>  		goto err0;
>  
> -	venc->wss_data = 0;
> -
>  	mutex_unlock(&venc->venc_lock);
>  
>  	return 0;
> @@ -585,10 +581,6 @@ static void venc_set_timings(struct omap_dss_device *dssdev,
>  
>  	mutex_lock(&venc->venc_lock);
>  
> -	/* Reset WSS data when the TV standard changes. */
> -	if (memcmp(&venc->vm, vm, sizeof(*vm)))
> -		venc->wss_data = 0;
> -
>  	venc->vm = *vm;
>  
>  	dispc_set_tv_pclk(venc->dss->dispc, 13500000);
> @@ -878,7 +870,6 @@ static int venc_probe(struct platform_device *pdev)
>  
>  	mutex_init(&venc->venc_lock);
>  
> -	venc->wss_data = 0;
>  	venc->vm = omap_dss_pal_vm;
>  
>  	venc_mem = platform_get_resource(venc->pdev, IORESOURCE_MEM, 0);
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers
  2018-12-05 14:59 ` [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers Laurent Pinchart
@ 2018-12-09 21:53   ` Sebastian Reichel
  2018-12-10  6:49     ` Laurent Pinchart
  0 siblings, 1 reply; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:53 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 4338 bytes --]

Hi,

On Wed, Dec 05, 2018 at 04:59:57PM +0200, Laurent Pinchart wrote:
> Instead of rolling out custom suspend/resume implementations based on
> state information stored in the driver's data structures, use the atomic
> suspend/resume helpers that rely on a DRM atomic state object.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

Documentation/gpu/todo.rst says, that this should be converted to
drm_mode_config_helper_suspend, but at least it's no longer open
coded after your change.

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 --
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 52 +++++----------------------
>  drivers/gpu/drm/omapdrm/omap_drv.h    |  2 ++
>  3 files changed, 11 insertions(+), 46 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index d3b576e6edf5..149a0f09adbc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -432,9 +432,6 @@ struct omap_dss_device {
>  	unsigned long ops_flags;
>  	unsigned long bus_flags;
>  
> -	/* helper variable for driver suspend/resume */
> -	bool activate_after_resume;
> -
>  	enum omap_display_caps caps;
>  
>  	enum omap_dss_display_state state;
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 5e67d58cbc28..66c4cedb5539 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -685,52 +685,21 @@ static int pdev_remove(struct platform_device *pdev)
>  }
>  
>  #ifdef CONFIG_PM_SLEEP
> -static int omap_drm_suspend_all_displays(struct drm_device *ddev)
> -{
> -	struct omap_drm_private *priv = ddev->dev_private;
> -	int i;
> -
> -	for (i = 0; i < priv->num_pipes; i++) {
> -		struct omap_dss_device *display = priv->pipes[i].display;
> -
> -		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
> -			display->ops->disable(display);
> -			display->activate_after_resume = true;
> -		} else {
> -			display->activate_after_resume = false;
> -		}
> -	}
> -
> -	return 0;
> -}
> -
> -static int omap_drm_resume_all_displays(struct drm_device *ddev)
> -{
> -	struct omap_drm_private *priv = ddev->dev_private;
> -	int i;
> -
> -	for (i = 0; i < priv->num_pipes; i++) {
> -		struct omap_dss_device *display = priv->pipes[i].display;
> -
> -		if (display->activate_after_resume) {
> -			display->ops->enable(display);
> -			display->activate_after_resume = false;
> -		}
> -	}
> -
> -	return 0;
> -}
> -
>  static int omap_drm_suspend(struct device *dev)
>  {
>  	struct omap_drm_private *priv = dev_get_drvdata(dev);
>  	struct drm_device *drm_dev = priv->ddev;
> +	struct drm_atomic_state *state;
>  
>  	drm_kms_helper_poll_disable(drm_dev);
>  
> -	drm_modeset_lock_all(drm_dev);
> -	omap_drm_suspend_all_displays(drm_dev);
> -	drm_modeset_unlock_all(drm_dev);
> +	state = drm_atomic_helper_suspend(drm_dev);
> +	if (IS_ERR(state)) {
> +		drm_kms_helper_poll_enable(drm_dev);
> +		return PTR_ERR(state);
> +	}
> +
> +	priv->suspend_state = state;
>  
>  	return 0;
>  }
> @@ -740,10 +709,7 @@ static int omap_drm_resume(struct device *dev)
>  	struct omap_drm_private *priv = dev_get_drvdata(dev);
>  	struct drm_device *drm_dev = priv->ddev;
>  
> -	drm_modeset_lock_all(drm_dev);
> -	omap_drm_resume_all_displays(drm_dev);
> -	drm_modeset_unlock_all(drm_dev);
> -
> +	drm_atomic_helper_resume(drm_dev, priv->suspend_state);
>  	drm_kms_helper_poll_enable(drm_dev);
>  
>  	return omap_gem_resume(drm_dev);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index bd7f2c227a25..788aa9f7e6df 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -73,6 +73,8 @@ struct omap_drm_private {
>  
>  	struct workqueue_struct *wq;
>  
> +	struct drm_atomic_state *suspend_state;
> +
>  	/* lock for obj_list below */
>  	struct mutex list_lock;
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder
  2018-12-05 14:59 ` [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder Laurent Pinchart
@ 2018-12-09 21:53   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:53 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 17256 bytes --]

Hi,

On Wed, Dec 05, 2018 at 04:59:58PM +0200, Laurent Pinchart wrote:
> All .enable() and .disable() handlers for panels and connectors share
> common code that validates and updates the device's state. Move it to
> common locations in the omap_encoder_enable() and omap_encoder_disable()
> handlers.
> 
> The enabled check in the .disable() handler is left untouched, it will
> be addressed separately.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../omapdrm/displays/connector-analog-tv.c    | 23 +-------------
>  .../gpu/drm/omapdrm/displays/connector-dvi.c  | 17 +----------
>  .../gpu/drm/omapdrm/displays/connector-hdmi.c | 23 +-------------
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c  | 10 -------
>  .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 18 -----------
>  .../displays/panel-lgphilips-lb035q02.c       | 10 -------
>  .../omapdrm/displays/panel-nec-nl8048hl11.c   | 10 -------
>  .../displays/panel-sharp-ls037v7dw01.c        | 10 -------
>  .../omapdrm/displays/panel-sony-acx565akm.c   | 18 +----------
>  .../omapdrm/displays/panel-tpo-td028ttec1.c   | 14 +--------
>  .../omapdrm/displays/panel-tpo-td043mtea1.c   | 10 -------
>  drivers/gpu/drm/omapdrm/omap_encoder.c        | 30 +++++++++++++++++--
>  12 files changed, 32 insertions(+), 161 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 28a3ce8f88d2..910a5b9c036a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -37,40 +37,19 @@ static void tvc_disconnect(struct omap_dss_device *src,
>  
>  static int tvc_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(ddata->dev, "enable\n");
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return r;
> +	return src->ops->enable(src);
>  }
>  
>  static void tvc_disable(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *src = dssdev->src;
>  
> -	dev_dbg(ddata->dev, "disable\n");
> -
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static const struct omap_dss_device_ops tvc_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 24b14f44248e..1e0925791c3d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -49,21 +49,8 @@ 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;
> -	int r;
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
>  
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return 0;
> +	return src->ops->enable(src);
>  }
>  
>  static void dvic_disable(struct omap_dss_device *dssdev)
> @@ -74,8 +61,6 @@ static void dvic_disable(struct omap_dss_device *dssdev)
>  		return;
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static int dvic_ddc_read(struct i2c_adapter *adapter,
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index e602fa4a50a4..649364e04edd 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -43,40 +43,19 @@ static void hdmic_disconnect(struct omap_dss_device *src,
>  
>  static int hdmic_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(ddata->dev, "enable\n");
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
>  
> -	r = src->ops->enable(src);
> -	if (r)
> -		return r;
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return r;
> +	return src->ops->enable(src);
>  }
>  
>  static void hdmic_disable(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *src = dssdev->src;
>  
> -	dev_dbg(ddata->dev, "disable\n");
> -
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static bool hdmic_detect(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 1f8161b041be..9439054de8b9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -51,12 +51,6 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -70,8 +64,6 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 1);
>  	backlight_enable(ddata->backlight);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	return 0;
>  }
>  
> @@ -89,8 +81,6 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  	regulator_disable(ddata->vcc_supply);
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  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 29692a5217c5..e346451647c4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -793,20 +793,8 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	dev_dbg(&ddata->pdev->dev, "enable\n");
> -
>  	mutex_lock(&ddata->lock);
>  
> -	if (!omapdss_device_is_connected(dssdev)) {
> -		r = -ENODEV;
> -		goto err;
> -	}
> -
> -	if (omapdss_device_is_enabled(dssdev)) {
> -		r = 0;
> -		goto err;
> -	}
> -
>  	src->ops->dsi.bus_lock(src);
>  
>  	r = dsicm_power_on(ddata);
> @@ -816,8 +804,6 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
>  	if (r)
>  		goto err;
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	mutex_unlock(&ddata->lock);
>  
>  	dsicm_bl_power(ddata, true);
> @@ -835,8 +821,6 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	dev_dbg(&ddata->pdev->dev, "disable\n");
> -
>  	dsicm_bl_power(ddata, false);
>  
>  	mutex_lock(&ddata->lock);
> @@ -853,8 +837,6 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  
>  	src->ops->dsi.bus_unlock(src);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> -
>  	mutex_unlock(&ddata->lock);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index f6ef8ff964dd..19c0c3e85aa5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -129,12 +129,6 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -142,8 +136,6 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 1);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	return 0;
>  }
>  
> @@ -159,8 +151,6 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void lb035q02_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index f445de6369f7..9cef1d16d7d3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -124,20 +124,12 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
>  	gpiod_set_value_cansleep(ddata->res_gpio, 1);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	return 0;
>  }
>  
> @@ -152,8 +144,6 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
>  	gpiod_set_value_cansleep(ddata->res_gpio, 0);
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void nec_8048_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 64b1369cb274..5a06fbb7984a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -68,12 +68,6 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	if (ddata->vcc) {
>  		r = regulator_enable(ddata->vcc);
>  		if (r != 0)
> @@ -95,8 +89,6 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  	if (ddata->ini_gpio)
>  		gpiod_set_value_cansleep(ddata->ini_gpio, 1);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	return 0;
>  }
>  
> @@ -122,8 +114,6 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  
>  	if (ddata->vcc)
>  		regulator_disable(ddata->vcc);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index e04663856b31..209a87c70c99 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -594,39 +594,23 @@ static int acx565akm_enable(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	int r;
>  
> -	dev_dbg(dssdev->dev, "%s\n", __func__);
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	mutex_lock(&ddata->mutex);
>  	r = acx565akm_panel_power_on(dssdev);
>  	mutex_unlock(&ddata->mutex);
> -	if (r)
> -		return r;
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -	return 0;
> +	return r;
>  }
>  
>  static void acx565akm_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	dev_dbg(dssdev->dev, "%s\n", __func__);
> -
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
>  	mutex_lock(&ddata->mutex);
>  	acx565akm_panel_power_off(dssdev);
>  	mutex_unlock(&ddata->mutex);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void acx565akm_get_timings(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 7ddc8c574a61..b09fea97a441 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -175,12 +175,6 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -198,7 +192,7 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  
>  	if (r) {
>  		dev_warn(dssdev->dev, "transfer error\n");
> -		goto transfer_err;
> +		return -EIO;
>  	}
>  
>  	/* deep standby out */
> @@ -268,10 +262,6 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  
>  	r |= jbt_ret_write_0(ddata, JBT_REG_DISPLAY_ON);
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
> -transfer_err:
> -
>  	return r ? -EIO : 0;
>  }
>  
> @@ -291,8 +281,6 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
>  
>  	src->ops->disable(src);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 8440fcb744d9..998f21f7701a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -326,12 +326,6 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -348,8 +342,6 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  		}
>  	}
>  
> -	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -
>  	return 0;
>  }
>  
> @@ -365,8 +357,6 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
>  
>  	if (!ddata->spi_suspended)
>  		tpo_td043_power_off(ddata);
> -
> -	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 452e625f6ce3..e3290f26abab 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -139,21 +139,45 @@ 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 drm_device *dev = encoder->dev;
> +
> +	dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
> +
> +	if (!omapdss_device_is_enabled(dssdev))
> +		return;
>  
>  	dssdev->ops->disable(dssdev);
> +
> +	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
>  
>  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 drm_device *dev = encoder->dev;
>  	int r;
>  
> +	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
> +
> +	if (!omapdss_device_is_connected(dssdev)) {
> +		r = -ENODEV;
> +		goto error;
> +	}
> +
> +	if (omapdss_device_is_enabled(dssdev))
> +		return;
> +
>  	r = dssdev->ops->enable(dssdev);
>  	if (r)
> -		dev_err(encoder->dev->dev,
> -			"Failed to enable display '%s': %d\n",
> -			dssdev->name, r);
> +		goto error;
> +
> +	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> +	return;
> +
> +error:
> +	dev_err(dev->dev, "Failed to enable display '%s': %d\n",
> +		dssdev->name, r);
>  }
>  
>  static int omap_encoder_atomic_check(struct drm_encoder *encoder,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable()
  2018-12-05 14:59 ` [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable() Laurent Pinchart
@ 2018-12-09 21:54   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:54 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 10045 bytes --]

Hi,

On Wed, Dec 05, 2018 at 04:59:59PM +0200, Laurent Pinchart wrote:
> The internal encoders return an error from their .enable() handler when
> their are not connected to a dss manager. As the flag used is set and
> cleared in the connect and disconnect handlers, this effectively checks
> whether the omap_dss_device is connected.
> 
> The .enable() handler is called from code paths that access the dss
> devices chain from the display device, which is set to NULL when the
> device isn't connected, making it impossible to access the device in
> that case.
> 
> The safety check is thus not needed, remove it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c     | 17 +----------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c     | 20 ++------------------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 17 +----------------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 17 +----------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
>  drivers/gpu/drm/omapdrm/dss/sdi.c     | 16 +---------------
>  drivers/gpu/drm/omapdrm/dss/venc.c    | 17 +----------------
>  7 files changed, 7 insertions(+), 98 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index ca4f3c4c6318..0cf3b220e35f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -386,12 +386,6 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_lock(&dpi->lock);
>  
> -	if (!out->dispc_channel_connected) {
> -		DSSERR("failed to enable display: no output/manager\n");
> -		r = -ENODEV;
> -		goto err_no_out_mgr;
> -	}
> -
>  	if (dpi->vdds_dsi_reg) {
>  		r = regulator_enable(dpi->vdds_dsi_reg);
>  		if (r)
> @@ -439,7 +433,6 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
>  	if (dpi->vdds_dsi_reg)
>  		regulator_disable(dpi->vdds_dsi_reg);
>  err_reg_enable:
> -err_no_out_mgr:
>  	mutex_unlock(&dpi->lock);
>  	return r;
>  }
> @@ -596,23 +589,15 @@ static int dpi_connect(struct omap_dss_device *src,
>  		       struct omap_dss_device *dst)
>  {
>  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dst);
> -	int r;
>  
>  	dpi_init_pll(dpi);
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void dpi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 0a485c5b982e..180951eb161c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -3753,19 +3753,13 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
>  {
>  	struct dsi_data *dsi = to_dsi_data(dssdev);
>  	int bpp = dsi_get_pixel_size(dsi->pix_fmt);
> -	struct omap_dss_device *out = &dsi->output;
>  	u8 data_type;
>  	u16 word_count;
>  	int r;
>  
> -	if (!out->dispc_channel_connected) {
> -		DSSERR("failed to enable display: no output/manager\n");
> -		return -ENODEV;
> -	}
> -
>  	r = dsi_display_init_dispc(dsi);
>  	if (r)
> -		goto err_init_dispc;
> +		return r;
>  
>  	if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
>  		switch (dsi->pix_fmt) {
> @@ -3814,7 +3808,6 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
>  	}
>  err_pix_fmt:
>  	dsi_display_uninit_dispc(dsi);
> -err_init_dispc:
>  	return r;
>  }
>  
> @@ -4877,21 +4870,12 @@ static int dsi_get_clocks(struct dsi_data *dsi)
>  static int dsi_connect(struct omap_dss_device *src,
>  		       struct omap_dss_device *dst)
>  {
> -	int r;
> -
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void dsi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index aabdda394c9c..b6b44f07c74e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -322,12 +322,6 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_lock(&hdmi->lock);
>  
> -	if (!dssdev->dispc_channel_connected) {
> -		DSSERR("failed to enable display: no output/manager\n");
> -		r = -ENODEV;
> -		goto err0;
> -	}
> -
>  	r = hdmi_power_on_full(hdmi);
>  	if (r) {
>  		DSSERR("failed to power on device\n");
> @@ -417,21 +411,12 @@ void hdmi4_core_disable(struct hdmi_core_data *core)
>  static int hdmi_connect(struct omap_dss_device *src,
>  			struct omap_dss_device *dst)
>  {
> -	int r;
> -
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void hdmi_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 9e8556f67a29..beef25703eab 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -330,12 +330,6 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_lock(&hdmi->lock);
>  
> -	if (!dssdev->dispc_channel_connected) {
> -		DSSERR("failed to enable display: no output/manager\n");
> -		r = -ENODEV;
> -		goto err0;
> -	}
> -
>  	r = hdmi_power_on_full(hdmi);
>  	if (r) {
>  		DSSERR("failed to power on device\n");
> @@ -422,21 +416,12 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi)
>  static int hdmi_connect(struct omap_dss_device *src,
>  			struct omap_dss_device *dst)
>  {
> -	int r;
> -
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void hdmi_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 149a0f09adbc..4e1e58e85429 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -440,7 +440,6 @@ struct omap_dss_device {
>  
>  	/* DISPC channel for this output */
>  	enum omap_channel dispc_channel;
> -	bool dispc_channel_connected;
>  
>  	/* output instance */
>  	enum omap_dss_output_id id;
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index b2fe2387037a..7de817c69913 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -136,11 +136,6 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
>  	unsigned long fck;
>  	int r;
>  
> -	if (!sdi->output.dispc_channel_connected) {
> -		DSSERR("failed to enable display: no output/manager\n");
> -		return -ENODEV;
> -	}
> -
>  	r = regulator_enable(sdi->vdds_sdi_reg);
>  	if (r)
>  		goto err_reg_enable;
> @@ -251,21 +246,12 @@ static int sdi_check_timings(struct omap_dss_device *dssdev,
>  static int sdi_connect(struct omap_dss_device *src,
>  		       struct omap_dss_device *dst)
>  {
> -	int r;
> -
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void sdi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index fbe9d42dbdb6..bc9a3d52f34d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -531,12 +531,6 @@ static int venc_display_enable(struct omap_dss_device *dssdev)
>  
>  	mutex_lock(&venc->venc_lock);
>  
> -	if (!dssdev->dispc_channel_connected) {
> -		DSSERR("Failed to enable display: no output/manager\n");
> -		r = -ENODEV;
> -		goto err0;
> -	}
> -
>  	r = venc_power_on(venc);
>  	if (r)
>  		goto err0;
> @@ -687,21 +681,12 @@ static int venc_get_clocks(struct venc_device *venc)
>  static int venc_connect(struct omap_dss_device *src,
>  			struct omap_dss_device *dst)
>  {
> -	int r;
> -
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		return r;
> -
> -	dst->dispc_channel_connected = true;
> -	return 0;
> +	return omapdss_device_connect(dst->dss, dst, dst->next);
>  }
>  
>  static void venc_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
> -
>  	omapdss_device_disconnect(dst, dst->next);
>  }
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove()
  2018-12-05 15:00 ` [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove() Laurent Pinchart
@ 2018-12-09 21:54   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:54 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 6408 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:00PM +0200, Laurent Pinchart wrote:
> The displays (connectors, panels and encoders) return an error from
> their .enable() handler when the dss device is not connected. They also
> disconnect the dss device explicitly from their .remove() handler if it
> is still connected.
> 
> Those safety checks are not needed:
> 
> - The .enable() handler is called from code paths that access the dss
>   devices chain from the display device, which is set to NULL when the
>   device isn't connected.
> 
> - The .remove() handler can only be called when unloading the module as
>   the driver has the suppress_bind_attrs attribute set, and a reference
>   to the module is taken when constructing the dss devices chain, so the
>   module can only be unloaded when the dss device is disconnected.
> 
> Remove the safety checks.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/encoder-opa362.c   |  7 -------
>  .../gpu/drm/omapdrm/displays/encoder-tfp410.c   |  7 -------
>  .../drm/omapdrm/displays/encoder-tpd12s015.c    |  4 ----
>  drivers/gpu/drm/omapdrm/dss/base.c              |  5 +++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h           |  5 -----
>  drivers/gpu/drm/omapdrm/omap_encoder.c          | 17 +++++------------
>  6 files changed, 10 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 4fefd80f53bb..0b1032625e42 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -49,9 +49,6 @@ static int opa362_enable(struct omap_dss_device *dssdev)
>  
>  	dev_dbg(dssdev->dev, "enable\n");
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> @@ -145,10 +142,6 @@ static int __exit opa362_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		opa362_disable(dssdev);
>  
> -	WARN_ON(omapdss_device_is_connected(dssdev));
> -	if (omapdss_device_is_connected(dssdev))
> -		omapdss_device_disconnect(NULL, dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index f1a748353279..fcc2dc5188a2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -42,9 +42,6 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return -ENODEV;
> -
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> @@ -139,10 +136,6 @@ static int __exit tfp410_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		tfp410_disable(dssdev);
>  
> -	WARN_ON(omapdss_device_is_connected(dssdev));
> -	if (omapdss_device_is_connected(dssdev))
> -		omapdss_device_disconnect(NULL, dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 94de55fd8884..1a2bc59bf104 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -229,10 +229,6 @@ static int __exit tpd_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		tpd_disable(dssdev);
>  
> -	WARN_ON(omapdss_device_is_connected(dssdev));
> -	if (omapdss_device_is_connected(dssdev))
> -		omapdss_device_disconnect(NULL, dssdev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 472f56e3de70..787157b00694 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -185,6 +185,11 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
>  }
>  EXPORT_SYMBOL(omapdss_device_get_next);
>  
> +static bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
> +{
> +	return dssdev->src;
> +}
> +
>  int omapdss_device_connect(struct dss_device *dss,
>  			   struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 4e1e58e85429..bd21387ba494 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -505,11 +505,6 @@ int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
>  int omapdss_compat_init(void);
>  void omapdss_compat_uninit(void);
>  
> -static inline bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
> -{
> -	return dssdev->src;
> -}
> -
>  static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
>  {
>  	return dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index e3290f26abab..936756b18545 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -160,24 +160,17 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
>  
>  	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
>  
> -	if (!omapdss_device_is_connected(dssdev)) {
> -		r = -ENODEV;
> -		goto error;
> -	}
> -
>  	if (omapdss_device_is_enabled(dssdev))
>  		return;
>  
>  	r = dssdev->ops->enable(dssdev);
> -	if (r)
> -		goto error;
> +	if (r) {
> +		dev_err(dev->dev, "Failed to enable display '%s': %d\n",
> +			dssdev->name, r);
> +		return;
> +	}
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> -	return;
> -
> -error:
> -	dev_err(dev->dev, "Failed to enable display '%s': %d\n",
> -		dssdev->name, r);
>  }
>  
>  static int omap_encoder_atomic_check(struct drm_encoder *encoder,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 08/29] drm/omap: Remove enable checks from display .enable() and .remove()
  2018-12-05 15:00 ` [PATCH 08/29] drm/omap: Remove enable " Laurent Pinchart
@ 2018-12-09 21:55   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:55 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 14803 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:01PM +0200, Laurent Pinchart wrote:
> The displays (connectors, panels and encoders) bail out from their
> .enable() and .disable() handlers if the dss device is already enabled
> or disabled. Those safety checks are not needed when the functions are
> called through the omapdss_device_ops, as the .enable() and .disable()
> handlers are called from the DRM atomic helpers that already guarantee
> that no double enabling or disabling can occur.
> 
> However, the handlers are also called directly from the .remove()
> handler. While this shouldn't be needed either as the modules can't be
> removed as long as the device is in use, it's still a good practice to
> disable the device explicitly. There is currently a safety check in
> .remove() in some drivers but not all of them.
> 
> Remove the safety checks from the .enable() and .disable() handlers, and
> add missing ones in the .remove() handler.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c    |  6 ++----
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c      |  6 ++----
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c     |  6 ++----
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c     |  6 ------
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c     |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c          |  6 ++----
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c       | 11 +++++------
>  .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c   |  6 ++----
>  .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   |  6 ++----
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    |  6 ++----
>  .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   |  6 ++----
>  .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   |  6 ++----
>  .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   |  6 ++----
>  drivers/gpu/drm/omapdrm/omap_encoder.c                |  6 ------
>  14 files changed, 25 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 910a5b9c036a..2b5b77627cfb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -46,9 +46,6 @@ static void tvc_disable(struct omap_dss_device *dssdev)
>  {
>  	struct omap_dss_device *src = dssdev->src;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	src->ops->disable(src);
>  }
>  
> @@ -92,7 +89,8 @@ static int __exit tvc_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	tvc_disable(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 1e0925791c3d..a1784e263835 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -57,9 +57,6 @@ static void dvic_disable(struct omap_dss_device *dssdev)
>  {
>  	struct omap_dss_device *src = dssdev->src;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	src->ops->disable(src);
>  }
>  
> @@ -282,7 +279,8 @@ static int __exit dvic_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	dvic_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		dvic_disable(dssdev);
>  
>  	i2c_put_adapter(ddata->i2c_adapter);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 649364e04edd..05cd503c4d29 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -52,9 +52,6 @@ static void hdmic_disable(struct omap_dss_device *dssdev)
>  {
>  	struct omap_dss_device *src = dssdev->src;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	src->ops->disable(src);
>  }
>  
> @@ -179,7 +176,8 @@ static int __exit hdmic_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(&ddata->dssdev);
>  
> -	hdmic_disable(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 0b1032625e42..ce116c28479f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -49,9 +49,6 @@ static int opa362_enable(struct omap_dss_device *dssdev)
>  
>  	dev_dbg(dssdev->dev, "enable\n");
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -71,9 +68,6 @@ static void opa362_disable(struct omap_dss_device *dssdev)
>  
>  	dev_dbg(dssdev->dev, "disable\n");
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index fcc2dc5188a2..d51410ed1e13 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -42,9 +42,6 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		return 0;
> -
>  	r = src->ops->enable(src);
>  	if (r)
>  		return r;
> @@ -62,9 +59,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	if (ddata->pd_gpio)
>  		gpiod_set_value_cansleep(ddata->pd_gpio, 0);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 9439054de8b9..5ca774c712a6 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -72,9 +72,6 @@ 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;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	backlight_disable(ddata->backlight);
>  
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
> @@ -181,7 +178,8 @@ static int __exit panel_dpi_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	panel_dpi_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		panel_dpi_disable(dssdev);
>  
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index e346451647c4..a7c8688237fb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -829,11 +829,9 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  
>  	src->ops->dsi.bus_lock(src);
>  
> -	if (omapdss_device_is_enabled(dssdev)) {
> -		r = dsicm_wake_up(ddata);
> -		if (!r)
> -			dsicm_power_off(ddata);
> -	}
> +	r = dsicm_wake_up(ddata);
> +	if (!r)
> +		dsicm_power_off(ddata);
>  
>  	src->ops->dsi.bus_unlock(src);
>  
> @@ -1367,7 +1365,8 @@ static int __exit dsicm_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	dsicm_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		dsicm_disable(dssdev);
>  	omapdss_device_disconnect(dssdev->src, dssdev);
>  
>  	sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 19c0c3e85aa5..2c3b15ba5a39 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -144,9 +144,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> @@ -235,7 +232,8 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	lb035q02_disable(dssdev);
> +	if (omapdss_device_is_enabled(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 9cef1d16d7d3..ef83459611be 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -138,9 +138,6 @@ 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;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	gpiod_set_value_cansleep(ddata->res_gpio, 0);
>  
>  	src->ops->disable(src);
> @@ -226,7 +223,8 @@ static int nec_8048_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	nec_8048_disable(dssdev);
> +	if (omapdss_device_is_enabled(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 5a06fbb7984a..0c5b405b4c9e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -97,9 +97,6 @@ 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 (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	if (ddata->ini_gpio)
>  		gpiod_set_value_cansleep(ddata->ini_gpio, 0);
>  
> @@ -233,7 +230,8 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	sharp_ls_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		sharp_ls_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 209a87c70c99..99c2c4f27dd5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -605,9 +605,6 @@ static void acx565akm_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	mutex_lock(&ddata->mutex);
>  	acx565akm_panel_power_off(dssdev);
>  	mutex_unlock(&ddata->mutex);
> @@ -750,7 +747,8 @@ static int acx565akm_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	acx565akm_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		acx565akm_disable(dssdev);
>  
>  	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 b09fea97a441..8551a1df3ad6 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -270,9 +270,6 @@ 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;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	dev_dbg(dssdev->dev, "td028ttec1_panel_disable()\n");
>  
>  	jbt_ret_write_0(ddata, JBT_REG_DISPLAY_OFF);
> @@ -357,7 +354,8 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	td028ttec1_panel_disable(dssdev);
> +	if (omapdss_device_is_enabled(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 998f21f7701a..527abed69d34 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -350,9 +350,6 @@ 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;
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	src->ops->disable(src);
>  
>  	if (!ddata->spi_suspended)
> @@ -457,7 +454,8 @@ static int tpo_td043_remove(struct spi_device *spi)
>  
>  	omapdss_device_unregister(dssdev);
>  
> -	tpo_td043_disable(dssdev);
> +	if (omapdss_device_is_enabled(dssdev))
> +		tpo_td043_disable(dssdev);
>  
>  	sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 936756b18545..b0c06103b5cd 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -143,9 +143,6 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
>  
>  	dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
>  
> -	if (!omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	dssdev->ops->disable(dssdev);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> @@ -160,9 +157,6 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
>  
>  	dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
>  
> -	if (omapdss_device_is_enabled(dssdev))
> -		return;
> -
>  	r = dssdev->ops->enable(dssdev);
>  	if (r) {
>  		dev_err(dev->dev, "Failed to enable display '%s': %d\n",
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations
  2018-12-05 15:00 ` [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations Laurent Pinchart
@ 2018-12-09 21:59   ` Sebastian Reichel
  2018-12-10  1:01   ` [PATCH v1.1 " Laurent Pinchart
  1 sibling, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 21:59 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 40434 bytes --]

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@ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 10/29] drm/omap: Remove omap_dss_device dst field
  2018-12-05 15:00 ` [PATCH 10/29] drm/omap: Remove omap_dss_device dst field Laurent Pinchart
@ 2018-12-09 22:00   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1989 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:03PM +0200, Laurent Pinchart wrote:
> The field is only used in a safety check during device
> connection/disconnection, where the src field can be easily used
> instead. Remove it and use src.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 6 ++----
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 1 -
>  2 files changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 61a231d2fef3..8454e505b282 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -210,9 +210,8 @@ int omapdss_device_connect(struct dss_device *dss,
>  	}
>  
>  	if (src) {
> -		WARN_ON(src->dst);
> +		WARN_ON(dst->src);
>  		dst->src = src;
> -		src->dst = dst;
>  	}
>  
>  	return 0;
> @@ -230,11 +229,10 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  	}
>  
>  	if (src) {
> -		if (WARN_ON(dst != src->dst))
> +		if (WARN_ON(dst->src != src))
>  			return;
>  
>  		dst->src = NULL;
> -		src->dst = NULL;
>  	}
>  
>  	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 4c0980999576..28e24d65f211 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -411,7 +411,6 @@ struct omap_dss_device {
>  
>  	struct dss_device *dss;
>  	struct omap_dss_device *src;
> -	struct omap_dss_device *dst;
>  	struct omap_dss_device *next;
>  
>  	struct list_head list;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices
  2018-12-05 15:00 ` [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices Laurent Pinchart
@ 2018-12-09 22:01   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:01 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 10631 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:04PM +0200, Laurent Pinchart wrote:
> All the internal encoders share common init and cleanup code. Factor it
> out to separate functions.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c     | 17 +++--------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c     | 17 +++--------------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 17 +++--------------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 17 +++--------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 ++-
>  drivers/gpu/drm/omapdrm/dss/output.c  | 18 ++++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/sdi.c     | 17 +++--------------
>  drivers/gpu/drm/omapdrm/dss/venc.c    | 17 +++--------------
>  8 files changed, 36 insertions(+), 87 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 74e841a2b4eb..0db01cadf09f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -641,19 +641,9 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  	out->ops = &dpi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -665,9 +655,8 @@ static void dpi_uninit_output_port(struct device_node *port)
>  	struct dpi_data *dpi = port->data;
>  	struct omap_dss_device *out = &dpi->output;
>  
> -	if (out->next)
> -		omapdss_device_put(out->next);
>  	omapdss_device_unregister(out);
> +	omapdss_device_cleanup_output(out);
>  }
>  
>  static const struct soc_device_attribute dpi_soc_devices[] = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 99b34e409159..0ba4670fd6cf 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5122,19 +5122,9 @@ static int dsi_init_output(struct dsi_data *dsi)
>  		       | DRM_BUS_FLAG_DE_HIGH
>  		       | DRM_BUS_FLAG_SYNC_NEGEDGE;
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -5145,9 +5135,8 @@ static void dsi_uninit_output(struct dsi_data *dsi)
>  {
>  	struct omap_dss_device *out = &dsi->output;
>  
> -	if (out->next)
> -		omapdss_device_put(out->next);
>  	omapdss_device_unregister(out);
> +	omapdss_device_cleanup_output(out);
>  }
>  
>  static int dsi_probe_of(struct dsi_data *dsi)
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 6f88fb4d6344..60792981a33f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -687,19 +687,9 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
>  	out->of_ports = BIT(0);
>  	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -710,9 +700,8 @@ static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> -	if (out->next)
> -		omapdss_device_put(out->next);
>  	omapdss_device_unregister(out);
> +	omapdss_device_cleanup_output(out);
>  }
>  
>  static int hdmi4_probe_of(struct omap_hdmi *hdmi)
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 28cf1c32b158..d7d33b4d2bed 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -671,19 +671,9 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
>  	out->of_ports = BIT(0);
>  	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -694,9 +684,8 @@ static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> -	if (out->next)
> -		omapdss_device_put(out->next);
>  	omapdss_device_unregister(out);
> +	omapdss_device_cleanup_output(out);
>  }
>  
>  static int hdmi5_probe_of(struct omap_hdmi *hdmi)
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 28e24d65f211..723a9b5060f5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -501,7 +501,8 @@ int omap_dss_get_num_overlays(void);
>  
>  #define for_each_dss_output(d) \
>  	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_OUTPUT)) != NULL)
> -int omapdss_output_validate(struct omap_dss_device *out);
> +int omapdss_device_init_output(struct omap_dss_device *out);
> +void omapdss_device_cleanup_output(struct omap_dss_device *out);
>  
>  typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
>  int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 18505bc70f7e..0ac400a521f3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -24,8 +24,15 @@
>  #include "dss.h"
>  #include "omapdss.h"
>  
> -int omapdss_output_validate(struct omap_dss_device *out)
> +int omapdss_device_init_output(struct omap_dss_device *out)
>  {
> +	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> +	if (IS_ERR(out->next)) {
> +		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> +			dev_err(out->dev, "failed to find video sink\n");
> +		return PTR_ERR(out->next);
> +	}
> +
>  	if (out->next && out->output_type != out->next->type) {
>  		dev_err(out->dev, "output type and display type don't match\n");
>  		return -EINVAL;
> @@ -33,7 +40,14 @@ int omapdss_output_validate(struct omap_dss_device *out)
>  
>  	return 0;
>  }
> -EXPORT_SYMBOL(omapdss_output_validate);
> +EXPORT_SYMBOL(omapdss_device_init_output);
> +
> +void omapdss_device_cleanup_output(struct omap_dss_device *out)
> +{
> +	if (out->next)
> +		omapdss_device_put(out->next);
> +}
> +EXPORT_SYMBOL(omapdss_device_cleanup_output);
>  
>  int dss_install_mgr_ops(struct dss_device *dss,
>  			const struct dss_mgr_ops *mgr_ops,
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 20e88c6e3d98..58c17566a4cb 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -281,19 +281,9 @@ static int sdi_init_output(struct sdi_device *sdi)
>  	out->bus_flags = DRM_BUS_FLAG_PIXDATA_POSEDGE	/* 15.5.9.1.2 */
>  		       | DRM_BUS_FLAG_SYNC_POSEDGE;
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 1);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -302,9 +292,8 @@ static int sdi_init_output(struct sdi_device *sdi)
>  
>  static void sdi_uninit_output(struct sdi_device *sdi)
>  {
> -	if (sdi->output.next)
> -		omapdss_device_put(sdi->output.next);
>  	omapdss_device_unregister(&sdi->output);
> +	omapdss_device_cleanup_output(&sdi->output);
>  }
>  
>  int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index dc4133718875..3fc776c45c4f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -752,19 +752,9 @@ static int venc_init_output(struct venc_device *venc)
>  	out->owner = THIS_MODULE;
>  	out->of_ports = BIT(0);
>  
> -	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
> -	if (IS_ERR(out->next)) {
> -		if (PTR_ERR(out->next) != -EPROBE_DEFER)
> -			dev_err(out->dev, "failed to find video sink\n");
> -		return PTR_ERR(out->next);
> -	}
> -
> -	r = omapdss_output_validate(out);
> -	if (r) {
> -		omapdss_device_put(out->next);
> -		out->next = NULL;
> +	r = omapdss_device_init_output(out);
> +	if (r < 0)
>  		return r;
> -	}
>  
>  	omapdss_device_register(out);
>  
> @@ -773,9 +763,8 @@ static int venc_init_output(struct venc_device *venc)
>  
>  static void venc_uninit_output(struct venc_device *venc)
>  {
> -	if (venc->output.next)
> -		omapdss_device_put(venc->output.next);
>  	omapdss_device_unregister(&venc->output);
> +	omapdss_device_cleanup_output(&venc->output);
>  }
>  
>  static int venc_probe_of(struct venc_device *venc)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices
  2018-12-05 15:00 ` [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices Laurent Pinchart
@ 2018-12-09 22:02   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:02 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 17522 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:05PM +0200, Laurent Pinchart wrote:
> omap_dss_device operations expose fixed video timings through a
> .get_timings() operation that return a single timing for the device. To
> prepare for the move to drm_bridge, modify the API to instead add DRM
> modes directly to the connector.
> 
> As this puts more burden on display devices, we also create a helper
> function for panels to add a single DRM mode from the panel video
> timings.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c  |  8 ++---
>  .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 10 +++---
>  .../displays/panel-lgphilips-lb035q02.c       |  8 ++---
>  .../omapdrm/displays/panel-nec-nl8048hl11.c   |  8 ++---
>  .../displays/panel-sharp-ls037v7dw01.c        |  8 ++---
>  .../omapdrm/displays/panel-sony-acx565akm.c   |  8 ++---
>  .../omapdrm/displays/panel-tpo-td028ttec1.c   |  8 ++---
>  .../omapdrm/displays/panel-tpo-td043mtea1.c   |  8 ++---
>  drivers/gpu/drm/omapdrm/dss/display.c         | 22 +++++++++++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h         |  8 +++--
>  drivers/gpu/drm/omapdrm/dss/venc.c            | 12 ++++---
>  drivers/gpu/drm/omapdrm/omap_connector.c      | 33 ++++++-------------
>  12 files changed, 80 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index c9d736f5eac0..2bda6d4fdb16 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -68,12 +68,12 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  	regulator_disable(ddata->vcc_supply);
>  }
>  
> -static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
> -				  struct videomode *vm)
> +static int panel_dpi_get_modes(struct omap_dss_device *dssdev,
> +			       struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops panel_dpi_ops = {
> @@ -83,7 +83,7 @@ static const struct omap_dss_device_ops panel_dpi_ops = {
>  	.enable		= panel_dpi_enable,
>  	.disable	= panel_dpi_disable,
>  
> -	.get_timings	= panel_dpi_get_timings,
> +	.get_modes	= panel_dpi_get_modes,
>  };
>  
>  static int panel_dpi_probe_of(struct platform_device *pdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index ffbf20e6ebe9..9cd9ab487a24 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -24,6 +24,8 @@
>  #include <linux/of_device.h>
>  #include <linux/regulator/consumer.h>
>  
> +#include <drm/drm_connector.h>
> +
>  #include <video/mipi_display.h>
>  #include <video/of_display_timing.h>
>  
> @@ -1110,12 +1112,12 @@ static void dsicm_ulps_work(struct work_struct *work)
>  	mutex_unlock(&ddata->lock);
>  }
>  
> -static void dsicm_get_timings(struct omap_dss_device *dssdev,
> -			      struct videomode *vm)
> +static int dsicm_get_modes(struct omap_dss_device *dssdev,
> +			   struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static int dsicm_check_timings(struct omap_dss_device *dssdev,
> @@ -1156,7 +1158,7 @@ static const struct omap_dss_device_ops dsicm_ops = {
>  	.enable		= dsicm_enable,
>  	.disable	= dsicm_disable,
>  
> -	.get_timings	= dsicm_get_timings,
> +	.get_modes	= dsicm_get_modes,
>  	.check_timings	= dsicm_check_timings,
>  };
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index e043cab0a0c9..e05b7f80416e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -139,12 +139,12 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  }
>  
> -static void lb035q02_get_timings(struct omap_dss_device *dssdev,
> -				 struct videomode *vm)
> +static int lb035q02_get_modes(struct omap_dss_device *dssdev,
> +			      struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops lb035q02_ops = {
> @@ -154,7 +154,7 @@ static const struct omap_dss_device_ops lb035q02_ops = {
>  	.enable		= lb035q02_enable,
>  	.disable	= lb035q02_disable,
>  
> -	.get_timings	= lb035q02_get_timings,
> +	.get_modes	= lb035q02_get_modes,
>  };
>  
>  static int lb035q02_probe_of(struct spi_device *spi)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 44fd6134317d..cf2127837e67 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -132,12 +132,12 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
>  	gpiod_set_value_cansleep(ddata->res_gpio, 0);
>  }
>  
> -static void nec_8048_get_timings(struct omap_dss_device *dssdev,
> -				 struct videomode *vm)
> +static int nec_8048_get_modes(struct omap_dss_device *dssdev,
> +			      struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops nec_8048_ops = {
> @@ -147,7 +147,7 @@ static const struct omap_dss_device_ops nec_8048_ops = {
>  	.enable		= nec_8048_enable,
>  	.disable	= nec_8048_disable,
>  
> -	.get_timings	= nec_8048_get_timings,
> +	.get_modes	= nec_8048_get_modes,
>  };
>  
>  static int nec_8048_probe(struct spi_device *spi)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 907abf8ef4e6..30320cee1e56 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -111,12 +111,12 @@ static void sharp_ls_post_disable(struct omap_dss_device *dssdev)
>  		regulator_disable(ddata->vcc);
>  }
>  
> -static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
> -				 struct videomode *vm)
> +static int sharp_ls_get_modes(struct omap_dss_device *dssdev,
> +			      struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops sharp_ls_ops = {
> @@ -128,7 +128,7 @@ static const struct omap_dss_device_ops sharp_ls_ops = {
>  	.disable	= sharp_ls_disable,
>  	.post_disable	= sharp_ls_post_disable,
>  
> -	.get_timings	= sharp_ls_get_timings,
> +	.get_modes	= sharp_ls_get_modes,
>  };
>  
>  static  int sharp_ls_get_gpio_of(struct device *dev, int index, int val,
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index eeaea752f171..8debe77f92ff 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -596,12 +596,12 @@ static void acx565akm_disable(struct omap_dss_device *dssdev)
>  	mutex_unlock(&ddata->mutex);
>  }
>  
> -static void acx565akm_get_timings(struct omap_dss_device *dssdev,
> -				  struct videomode *vm)
> +static int acx565akm_get_modes(struct omap_dss_device *dssdev,
> +			       struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops acx565akm_ops = {
> @@ -611,7 +611,7 @@ static const struct omap_dss_device_ops acx565akm_ops = {
>  	.enable		= acx565akm_enable,
>  	.disable	= acx565akm_disable,
>  
> -	.get_timings	= acx565akm_get_timings,
> +	.get_modes	= acx565akm_get_modes,
>  };
>  
>  static int acx565akm_probe(struct spi_device *spi)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index f1a5c14407a4..c8b15f19a166 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -272,12 +272,12 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
>  }
>  
> -static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
> -					 struct videomode *vm)
> +static int td028ttec1_panel_get_modes(struct omap_dss_device *dssdev,
> +				      struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops td028ttec1_ops = {
> @@ -287,7 +287,7 @@ static const struct omap_dss_device_ops td028ttec1_ops = {
>  	.enable		= td028ttec1_panel_enable,
>  	.disable	= td028ttec1_panel_disable,
>  
> -	.get_timings	= td028ttec1_panel_get_timings,
> +	.get_modes	= td028ttec1_panel_get_modes,
>  };
>  
>  static int td028ttec1_panel_probe(struct spi_device *spi)
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 996a16736d10..9ecc4c7bee67 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -347,12 +347,12 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
>  		tpo_td043_power_off(ddata);
>  }
>  
> -static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
> -				  struct videomode *vm)
> +static int tpo_td043_get_modes(struct omap_dss_device *dssdev,
> +			       struct drm_connector *connector)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> -	*vm = ddata->vm;
> +	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
>  static const struct omap_dss_device_ops tpo_td043_ops = {
> @@ -362,7 +362,7 @@ static const struct omap_dss_device_ops tpo_td043_ops = {
>  	.enable		= tpo_td043_enable,
>  	.disable	= tpo_td043_disable,
>  
> -	.get_timings	= tpo_td043_get_timings,
> +	.get_modes	= tpo_td043_get_modes,
>  };
>  
>  static int tpo_td043_probe(struct spi_device *spi)
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 34b2a4ef63a4..398964358386 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -23,6 +23,9 @@
>  #include <linux/kernel.h>
>  #include <linux/of.h>
>  
> +#include <drm/drm_connector.h>
> +#include <drm/drm_modes.h>
> +
>  #include "omapdss.h"
>  
>  static int disp_num_counter;
> @@ -58,3 +61,22 @@ struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output)
>  	return omapdss_device_get(output);
>  }
>  EXPORT_SYMBOL_GPL(omapdss_display_get);
> +
> +int omapdss_display_get_modes(struct drm_connector *connector,
> +			      const struct videomode *vm)
> +{
> +	struct drm_display_mode *mode;
> +
> +	mode = drm_mode_create(connector->dev);
> +	if (!mode)
> +		return 0;
> +
> +	drm_display_mode_from_videomode(vm, mode);
> +
> +	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
> +	drm_mode_set_name(mode);
> +	drm_mode_probed_add(connector, mode);
> +
> +	return 1;
> +}
> +EXPORT_SYMBOL_GPL(omapdss_display_get_modes);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 723a9b5060f5..3be8d3153d1a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -67,6 +67,7 @@ struct dss_lcd_mgr_config;
>  struct snd_aes_iec958;
>  struct snd_cea_861_aud_if;
>  struct hdmi_avi_infoframe;
> +struct drm_connector;
>  
>  enum omap_display_type {
>  	OMAP_DISPLAY_TYPE_NONE		= 0,
> @@ -366,8 +367,6 @@ struct omap_dss_device_ops {
>  
>  	int (*check_timings)(struct omap_dss_device *dssdev,
>  			     struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    const struct videomode *vm);
>  
> @@ -381,6 +380,9 @@ struct omap_dss_device_ops {
>  
>  	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
>  
> +	int (*get_modes)(struct omap_dss_device *dssdev,
> +			 struct drm_connector *connector);
> +
>  	union {
>  		const struct omapdss_hdmi_ops hdmi;
>  		const struct omapdss_dsi_ops dsi;
> @@ -476,6 +478,8 @@ static inline bool omapdss_is_initialized(void)
>  	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_DISPLAY)) != NULL)
>  void omapdss_display_init(struct omap_dss_device *dssdev);
>  struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output);
> +int omapdss_display_get_modes(struct drm_connector *connector,
> +			      const struct videomode *vm);
>  
>  void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(struct omap_dss_device *dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 3fc776c45c4f..cefefe6d6fcb 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -548,14 +548,17 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
>  	mutex_unlock(&venc->venc_lock);
>  }
>  
> -static void venc_get_timings(struct omap_dss_device *dssdev,
> -			     struct videomode *vm)
> +static int venc_get_modes(struct omap_dss_device *dssdev,
> +			  struct drm_connector *connector)
>  {
>  	struct venc_device *venc = dssdev_to_venc(dssdev);
> +	int r;
>  
>  	mutex_lock(&venc->venc_lock);
> -	*vm = venc->vm;
> +	r = omapdss_display_get_modes(connector, &venc->vm);
>  	mutex_unlock(&venc->venc_lock);
> +
> +	return r;
>  }
>  
>  static void venc_set_timings(struct omap_dss_device *dssdev,
> @@ -690,8 +693,9 @@ static const struct omap_dss_device_ops venc_ops = {
>  	.disable = venc_display_disable,
>  
>  	.check_timings = venc_check_timings,
> -	.get_timings = venc_get_timings,
>  	.set_timings = venc_set_timings,
> +
> +	.get_modes = venc_get_modes,
>  };
>  
>  /* -----------------------------------------------------------------------------
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index b81302c4bf9e..93b31bf07d05 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -212,8 +212,6 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev;
> -	struct drm_display_mode *mode;
> -	struct videomode vm = {0};
>  
>  	DBG("%s", omap_connector->display->name);
>  
> @@ -238,31 +236,20 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  					 &connector->display_info.height_mm);
>  
>  	/*
> -	 * Iterate over the pipeline to find the first device that can provide
> -	 * timing information. If we can't find any, we just let the KMS core
> -	 * add the default modes.
> +	 * If the display pipeline reports modes (e.g. with a fixed resolution
> +	 * panel or an analog TV output), query it.
>  	 */
>  	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
> -		if (dssdev->ops->get_timings)
> -			break;
> +		if (dssdev->ops->get_modes)
> +			return dssdev->ops->get_modes(dssdev, connector);
>  	}
> -	if (!dssdev)
> -		return 0;
> -
> -	/* Add a single mode corresponding to the fixed panel timings. */
> -	mode = drm_mode_create(connector->dev);
> -	if (!mode)
> -		return 0;
> -
> -	dssdev->ops->get_timings(dssdev, &vm);
> -
> -	drm_display_mode_from_videomode(&vm, mode);
>  
> -	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
> -	drm_mode_set_name(mode);
> -	drm_mode_probed_add(connector, mode);
> -
> -	return 1;
> +	/*
> +	 * We can't retrieve modes, which can happen for instance for a DVI or
> +	 * VGA output with the DDC bus unconnected. The KMS core will add the
> +	 * default modes.
> +	 */
> +	return 0;
>  }
>  
>  static int omap_connector_mode_valid(struct drm_connector *connector,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations
  2018-12-05 15:00 ` [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations Laurent Pinchart
@ 2018-12-09 22:02   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:02 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 4131 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:06PM +0200, Laurent Pinchart wrote:
> Now that the .get_modes() operations takes a drm_connector and fills it
> with modes, it becomes easy to fill display information in the same
> operation without requiring a separate .get_size() opearation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 14 +++-----------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h           |  3 ---
>  drivers/gpu/drm/omapdrm/omap_connector.c        | 15 ++-------------
>  3 files changed, 5 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 9cd9ab487a24..c5f570106a17 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1117,6 +1117,9 @@ static int dsicm_get_modes(struct omap_dss_device *dssdev,
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  
> +	connector->display_info.width_mm = ddata->width_mm;
> +	connector->display_info.height_mm = ddata->height_mm;
> +
>  	return omapdss_display_get_modes(connector, &ddata->vm);
>  }
>  
> @@ -1142,15 +1145,6 @@ static int dsicm_check_timings(struct omap_dss_device *dssdev,
>  	return ret;
>  }
>  
> -static void dsicm_get_size(struct omap_dss_device *dssdev,
> -			  unsigned int *width, unsigned int *height)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -
> -	*width = ddata->width_mm;
> -	*height = ddata->height_mm;
> -}
> -
>  static const struct omap_dss_device_ops dsicm_ops = {
>  	.connect	= dsicm_connect,
>  	.disconnect	= dsicm_disconnect,
> @@ -1166,8 +1160,6 @@ static const struct omap_dss_driver dsicm_dss_driver = {
>  	.update		= dsicm_update,
>  	.sync		= dsicm_sync,
>  
> -	.get_size	= dsicm_get_size,
> -
>  	.enable_te	= dsicm_enable_te,
>  	.get_te		= dsicm_get_te,
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 3be8d3153d1a..561f404a58f2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -462,9 +462,6 @@ struct omap_dss_driver {
>  	int (*memory_read)(struct omap_dss_device *dssdev,
>  			void *buf, size_t size,
>  			u16 x, u16 y, u16 w, u16 h);
> -
> -	void (*get_size)(struct omap_dss_device *dssdev,
> -			 unsigned int *width, unsigned int *height);
>  };
>  
>  struct dss_device *omapdss_get_dss(void);
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 93b31bf07d05..c21a2016d03f 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -225,19 +225,8 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  		return omap_connector_get_modes_edid(connector, dssdev);
>  
>  	/*
> -	 * Otherwise we have either a fixed resolution panel or an output that
> -	 * doesn't support modes discovery (e.g. DVI or VGA with the DDC bus
> -	 * unconnected, or analog TV). Start by querying the size.
> -	 */
> -	dssdev = omap_connector->display;
> -	if (dssdev->driver && dssdev->driver->get_size)
> -		dssdev->driver->get_size(dssdev,
> -					 &connector->display_info.width_mm,
> -					 &connector->display_info.height_mm);
> -
> -	/*
> -	 * If the display pipeline reports modes (e.g. with a fixed resolution
> -	 * panel or an analog TV output), query it.
> +	 * Otherwise if the display pipeline reports modes (e.g. with a fixed
> +	 * resolution panel or an analog TV output), query it.
>  	 */
>  	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
>  		if (dssdev->ops->get_modes)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes()
  2018-12-05 15:00 ` [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes() Laurent Pinchart
@ 2018-12-09 22:02   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:02 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 8884 bytes --]

On Wed, Dec 05, 2018 at 05:00:07PM +0200, Laurent Pinchart wrote:
> Instead of manually iterating over the dss devices in the pipeline to
> find the first one that implements the .get_modes() operation, add a new
> operation flag for .get_modes() and use the omap_connector_find_device()
> helper function to locate the right dss device.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c              | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c           | 1 +
>  .../gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c   | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   | 1 +
>  .../gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   | 1 +
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                     | 4 +++-
>  drivers/gpu/drm/omapdrm/dss/venc.c                        | 1 +
>  drivers/gpu/drm/omapdrm/omap_connector.c                  | 8 ++++----
>  11 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 2bda6d4fdb16..3b3570cb0d9a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -152,6 +152,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index c5f570106a17..fe9d9f847d2e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1271,6 +1271,7 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
>  		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index e05b7f80416e..f37931bf1c5f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -199,6 +199,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	/*
>  	 * Note: According to the panel documentation:
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index cf2127837e67..8f2fb3d0492f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -194,6 +194,7 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_POSEDGE
>  			  | DRM_BUS_FLAG_PIXDATA_POSEDGE;
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 30320cee1e56..8d5d7f775b55 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -209,6 +209,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	/*
>  	 * Note: According to the panel documentation:
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 8debe77f92ff..b8360cef3754 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -708,6 +708,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_NEGEDGE
>  			  | DRM_BUS_FLAG_PIXDATA_POSEDGE;
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index c8b15f19a166..721c5bb3bdef 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -323,6 +323,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	/*
>  	 * Note: According to the panel documentation:
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 9ecc4c7bee67..50960018dbe8 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -422,6 +422,7 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
> +	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	/*
>  	 * Note: According to the panel documentation:
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 561f404a58f2..5dac69519d7e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -393,12 +393,14 @@ struct omap_dss_device_ops {
>   * enum omap_dss_device_ops_flag - Indicates which device ops are supported
>   * @OMAP_DSS_DEVICE_OP_DETECT: The device supports output connection detection
>   * @OMAP_DSS_DEVICE_OP_HPD: The device supports all hot-plug-related operations
> - * @OMAP_DSS_DEVICE_OP_EDID: The device supports readind EDID
> + * @OMAP_DSS_DEVICE_OP_EDID: The device supports reading EDID
> + * @OMAP_DSS_DEVICE_OP_MODES: The device supports reading modes
>   */
>  enum omap_dss_device_ops_flag {
>  	OMAP_DSS_DEVICE_OP_DETECT = BIT(0),
>  	OMAP_DSS_DEVICE_OP_HPD = BIT(1),
>  	OMAP_DSS_DEVICE_OP_EDID = BIT(2),
> +	OMAP_DSS_DEVICE_OP_MODES = BIT(3),
>  };
>  
>  enum omap_dss_device_type {
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index cefefe6d6fcb..f1abb4195a76 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -755,6 +755,7 @@ static int venc_init_output(struct venc_device *venc)
>  	out->ops = &venc_ops;
>  	out->owner = THIS_MODULE;
>  	out->of_ports = BIT(0);
> +	out->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
>  
>  	r = omapdss_device_init_output(out);
>  	if (r < 0)
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index c21a2016d03f..0bbbf4d0502d 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -228,10 +228,10 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  	 * Otherwise if the display pipeline reports modes (e.g. with a fixed
>  	 * resolution panel or an analog TV output), query it.
>  	 */
> -	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
> -		if (dssdev->ops->get_modes)
> -			return dssdev->ops->get_modes(dssdev, connector);
> -	}
> +	dssdev = omap_connector_find_device(connector,
> +					    OMAP_DSS_DEVICE_OP_MODES);
> +	if (dssdev)
> +		return dssdev->ops->get_modes(dssdev, connector);
>  
>  	/*
>  	 * We can't retrieve modes, which can happen for instance for a DVI or
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes
  2018-12-05 15:00 ` [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes Laurent Pinchart
@ 2018-12-09 22:03   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:03 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 2051 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:08PM +0200, Laurent Pinchart wrote:
> The TV encoder supports both PAL and NTSC modes, but when queried for
> the list of modes it supports, only the currently selected mode is
> reported. Fix it and report the two modes unconditionally.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/venc.c | 25 +++++++++++++++++++------
>  1 file changed, 19 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index f1abb4195a76..638cfd69ccf6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -551,14 +551,27 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
>  static int venc_get_modes(struct omap_dss_device *dssdev,
>  			  struct drm_connector *connector)
>  {
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
> -	int r;
> +	static const struct videomode *modes[] = {
> +		&omap_dss_pal_vm,
> +		&omap_dss_ntsc_vm,
> +	};
> +	unsigned int i;
>  
> -	mutex_lock(&venc->venc_lock);
> -	r = omapdss_display_get_modes(connector, &venc->vm);
> -	mutex_unlock(&venc->venc_lock);
> +	for (i = 0; i < ARRAY_SIZE(modes); ++i) {
> +		struct drm_display_mode *mode;
>  
> -	return r;
> +		mode = drm_mode_create(connector->dev);
> +		if (!mode)
> +			return i;
> +
> +		drm_display_mode_from_videomode(modes[i], mode);
> +
> +		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
> +		drm_mode_set_name(mode);
> +		drm_mode_probed_add(connector, mode);
> +	}
> +
> +	return ARRAY_SIZE(modes);
>  }
>  
>  static void venc_set_timings(struct omap_dss_device *dssdev,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function
  2018-12-05 15:00 ` [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function Laurent Pinchart
@ 2018-12-09 22:03   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:03 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 3018 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:09PM +0200, Laurent Pinchart wrote:
> The display isn't used by the encoder implementation, don't pass it to
> the initialization function and store it internally needlessly.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c     | 2 +-
>  drivers/gpu/drm/omapdrm/omap_encoder.c | 5 +----
>  drivers/gpu/drm/omapdrm/omap_encoder.h | 3 +--
>  3 files changed, 3 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 66c4cedb5539..286590657d44 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -296,7 +296,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  		struct drm_encoder *encoder;
>  		struct drm_crtc *crtc;
>  
> -		encoder = omap_encoder_init(dev, pipe->output, display);
> +		encoder = omap_encoder_init(dev, pipe->output);
>  		if (!encoder)
>  			return -ENOMEM;
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 5765e3ae5b16..79ee927cd905 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -37,7 +37,6 @@
>  struct omap_encoder {
>  	struct drm_encoder base;
>  	struct omap_dss_device *output;
> -	struct omap_dss_device *display;
>  };
>  
>  static void omap_encoder_destroy(struct drm_encoder *encoder)
> @@ -239,8 +238,7 @@ static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
>  
>  /* initialize encoder */
>  struct drm_encoder *omap_encoder_init(struct drm_device *dev,
> -				      struct omap_dss_device *output,
> -				      struct omap_dss_device *display)
> +				      struct omap_dss_device *output)
>  {
>  	struct drm_encoder *encoder = NULL;
>  	struct omap_encoder *omap_encoder;
> @@ -250,7 +248,6 @@ struct drm_encoder *omap_encoder_init(struct drm_device *dev,
>  		goto fail;
>  
>  	omap_encoder->output = output;
> -	omap_encoder->display = display;
>  
>  	encoder = &omap_encoder->base;
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.h b/drivers/gpu/drm/omapdrm/omap_encoder.h
> index a7b5dde63ecb..4aefb3142886 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.h
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.h
> @@ -25,7 +25,6 @@ struct drm_encoder;
>  struct omap_dss_device;
>  
>  struct drm_encoder *omap_encoder_init(struct drm_device *dev,
> -				      struct omap_dss_device *output,
> -				      struct omap_dss_device *display);
> +				      struct omap_dss_device *output);
>  
>  #endif /* __OMAPDRM_ENCODER_H__ */
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline
  2018-12-05 15:00 ` [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline Laurent Pinchart
@ 2018-12-09 22:03   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:03 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 4075 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:10PM +0200, Laurent Pinchart wrote:
> The DT bindings for the OMAP DSS allow assigning numerical IDs to
> display outputs through display entries in the alias node. The driver
> uses this information to sort pipelines according to the order specified
> in DT, making it possible for a system to give a priority order to
> outputs.
> 
> Retrieval of the alias ID is done when initializing display dss devices.
> That code will be removed when moving to drm_bridge and drm_panel. Move
> retrieval of the alias ID to display pipeline connection time and store
> it in the pipeline structure instead to keep the feature.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/display.c | 2 --
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 --
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 9 +++++++--
>  drivers/gpu/drm/omapdrm/omap_drv.h    | 1 +
>  4 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 398964358386..e93f61a567a8 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -42,8 +42,6 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
>  	if (id < 0)
>  		id = disp_num_counter++;
>  
> -	dssdev->alias_id = id;
> -
>  	/* Use 'label' property for name, if it exists */
>  	of_property_read_string(dssdev->dev->of_node, "label", &dssdev->name);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 5dac69519d7e..7c9f8a5ceb37 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -419,8 +419,6 @@ struct omap_dss_device {
>  
>  	struct list_head list;
>  
> -	unsigned int alias_id;
> -
>  	enum omap_display_type type;
>  	/*
>  	 * DSS output type that this device generates (for DSS internal devices)
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 286590657d44..c9b578a49b24 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -155,9 +155,9 @@ static int omap_compare_pipes(const void *a, const void *b)
>  	const struct omap_drm_pipeline *pipe1 = a;
>  	const struct omap_drm_pipeline *pipe2 = b;
>  
> -	if (pipe1->display->alias_id > pipe2->display->alias_id)
> +	if (pipe1->alias_id > pipe2->alias_id)
>  		return 1;
> -	else if (pipe1->display->alias_id < pipe2->display->alias_id)
> +	else if (pipe1->alias_id < pipe2->alias_id)
>  		return -1;
>  	return 0;
>  }
> @@ -182,11 +182,16 @@ static int omap_connect_pipelines(struct drm_device *ddev)
>  				 output->name);
>  		} else {
>  			struct omap_drm_pipeline *pipe;
> +			int id;
>  
>  			pipe = &priv->pipes[priv->num_pipes++];
>  			pipe->output = omapdss_device_get(output);
>  			pipe->display = omapdss_display_get(output);
>  
> +			id = of_alias_get_id(pipe->display->dev->of_node,
> +					     "display");
> +			pipe->alias_id = id >= 0 ? id : priv->num_pipes - 1;
> +
>  			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
>  				/* To balance the 'for_each_dss_output' loop */
>  				omapdss_device_put(output);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index 788aa9f7e6df..a169de3ed95d 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -51,6 +51,7 @@ struct omap_drm_pipeline {
>  	struct drm_connector *connector;
>  	struct omap_dss_device *output;
>  	struct omap_dss_device *display;
> +	unsigned int alias_id;
>  };
>  
>  struct omap_drm_private {
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure
  2018-12-05 15:00 ` [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure Laurent Pinchart
@ 2018-12-09 22:04   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 5014 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:11PM +0200, Laurent Pinchart wrote:
> Display pipelines based on drm_bridge are handled from the bridge
> closest to the CRTC. To move to that model we thus need to transition
> away from walking pipelines in the other direction, and from accessing
> the device at the end of the pipeline when possible.
> 
> Remove most accesses to the display device from the omap_connector
> implementation, and don't store it in the omap_connector structure.
> 
> - For debug messages we can simply use the connector name instead.
> - For type checks we can use the drm_connector type.
> - For operation lookup we can start at the other end of the pipeline and
>   locate the last matching device.
> 
> The display device is still passed to the connector init function in
> order to find its type, which requires access to the end of the
> pipeline.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_connector.c | 31 ++++++++++--------------
>  1 file changed, 13 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 0bbbf4d0502d..31b6d6d1def3 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -30,7 +30,6 @@
>  struct omap_connector {
>  	struct drm_connector base;
>  	struct omap_dss_device *output;
> -	struct omap_dss_device *display;
>  	struct omap_dss_device *hpd;
>  	bool hdmi_mode;
>  };
> @@ -103,20 +102,20 @@ omap_connector_find_device(struct drm_connector *connector,
>  			   enum omap_dss_device_ops_flag op)
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
> -	struct omap_dss_device *dssdev;
> +	struct omap_dss_device *dssdev = NULL;
> +	struct omap_dss_device *d;
>  
> -	for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
> -		if (dssdev->ops_flags & op)
> -			return dssdev;
> +	for (d = omap_connector->output; d; d = d->next) {
> +		if (d->ops_flags & op)
> +			dssdev = d;
>  	}
>  
> -	return NULL;
> +	return dssdev;
>  }
>  
>  static enum drm_connector_status omap_connector_detect(
>  		struct drm_connector *connector, bool force)
>  {
> -	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev;
>  	enum drm_connector_status status;
>  
> @@ -130,11 +129,10 @@ static enum drm_connector_status omap_connector_detect(
>  
>  		omap_connector_hpd_notify(connector, dssdev->src, status);
>  	} else {
> -		switch (omap_connector->display->type) {
> -		case OMAP_DISPLAY_TYPE_DPI:
> -		case OMAP_DISPLAY_TYPE_DBI:
> -		case OMAP_DISPLAY_TYPE_SDI:
> -		case OMAP_DISPLAY_TYPE_DSI:
> +		switch (connector->connector_type) {
> +		case DRM_MODE_CONNECTOR_DPI:
> +		case DRM_MODE_CONNECTOR_LVDS:
> +		case DRM_MODE_CONNECTOR_DSI:
>  			status = connector_status_connected;
>  			break;
>  		default:
> @@ -143,7 +141,7 @@ static enum drm_connector_status omap_connector_detect(
>  		}
>  	}
>  
> -	VERB("%s: %d (force=%d)", omap_connector->display->name, status, force);
> +	VERB("%s: %d (force=%d)", connector->name, status, force);
>  
>  	return status;
>  }
> @@ -152,7 +150,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
>  
> -	DBG("%s", omap_connector->display->name);
> +	DBG("%s", connector->name);
>  
>  	if (omap_connector->hpd) {
>  		struct omap_dss_device *hpd = omap_connector->hpd;
> @@ -166,7 +164,6 @@ static void omap_connector_destroy(struct drm_connector *connector)
>  	drm_connector_cleanup(connector);
>  
>  	omapdss_device_put(omap_connector->output);
> -	omapdss_device_put(omap_connector->display);
>  
>  	kfree(omap_connector);
>  }
> @@ -210,10 +207,9 @@ static int omap_connector_get_modes_edid(struct drm_connector *connector,
>  
>  static int omap_connector_get_modes(struct drm_connector *connector)
>  {
> -	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev;
>  
> -	DBG("%s", omap_connector->display->name);
> +	DBG("%s", connector->name);
>  
>  	/*
>  	 * If display exposes EDID, then we parse that in the normal way to
> @@ -346,7 +342,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
>  		goto fail;
>  
>  	omap_connector->output = omapdss_device_get(output);
> -	omap_connector->display = omapdss_device_get(display);
>  
>  	connector = &omap_connector->base;
>  	connector->interlace_allowed = 1;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally
  2018-12-05 15:00 ` [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally Laurent Pinchart
@ 2018-12-09 22:04   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 10369 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:12PM +0200, Laurent Pinchart wrote:
> The source pointer will be removed to the omap_dss_device structure.
> Store it internally in the DSI panel driver data.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/panel-dsi-cm.c   | 55 ++++++++++---------
>  1 file changed, 29 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index fe9d9f847d2e..ce812094177c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -43,6 +43,7 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> +	struct omap_dss_device *src;
>  
>  	struct videomode vm;
>  
> @@ -143,7 +144,7 @@ static void hw_guard_wait(struct panel_drv_data *ddata)
>  
>  static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  	u8 buf[1];
>  
> @@ -159,14 +160,14 @@ static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
>  
>  static int dsicm_dcs_write_0(struct panel_drv_data *ddata, u8 dcs_cmd)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  
>  	return src->ops->dsi.dcs_write(src, ddata->channel, &dcs_cmd, 1);
>  }
>  
>  static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	u8 buf[2] = { dcs_cmd, param };
>  
>  	return src->ops->dsi.dcs_write(src, ddata->channel, buf, 2);
> @@ -175,7 +176,7 @@ static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
>  static int dsicm_sleep_in(struct panel_drv_data *ddata)
>  
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	u8 cmd;
>  	int r;
>  
> @@ -230,7 +231,7 @@ static int dsicm_get_id(struct panel_drv_data *ddata, u8 *id1, u8 *id2, u8 *id3)
>  static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  		u16 x, u16 y, u16 w, u16 h)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  	u16 x1 = x;
>  	u16 x2 = x + w - 1;
> @@ -277,7 +278,7 @@ static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
>  
>  static int dsicm_enter_ulps(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	if (ddata->ulps_enabled)
> @@ -311,7 +312,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
>  
>  static int dsicm_exit_ulps(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	if (!ddata->ulps_enabled)
> @@ -363,7 +364,7 @@ static int dsicm_wake_up(struct panel_drv_data *ddata)
>  static int dsicm_bl_update_status(struct backlight_device *dev)
>  {
>  	struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r = 0;
>  	int level;
>  
> @@ -411,7 +412,7 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	u8 errors = 0;
>  	int r;
>  
> @@ -443,7 +444,7 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	u8 id1, id2, id3;
>  	int r;
>  
> @@ -475,7 +476,7 @@ static ssize_t dsicm_store_ulps(struct device *dev,
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	unsigned long t;
>  	int r;
>  
> @@ -525,7 +526,7 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	unsigned long t;
>  	int r;
>  
> @@ -600,7 +601,7 @@ static void dsicm_hw_reset(struct panel_drv_data *ddata)
>  
>  static int dsicm_power_on(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	u8 id1, id2, id3;
>  	int r;
>  	struct omap_dss_dsi_config dsi_config = {
> @@ -715,7 +716,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  static void dsicm_power_off(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	src->ops->dsi.disable_video_output(src, ddata->channel);
> @@ -769,6 +770,7 @@ static int dsicm_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	ddata->src = src;
>  	return 0;
>  }
>  
> @@ -778,12 +780,13 @@ static void dsicm_disconnect(struct omap_dss_device *src,
>  	struct panel_drv_data *ddata = to_panel_data(dst);
>  
>  	src->ops->dsi.release_vc(src, ddata->channel);
> +	ddata->src = NULL;
>  }
>  
>  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;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	mutex_lock(&ddata->lock);
> @@ -810,7 +813,7 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
>  static void dsicm_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	dsicm_bl_power(ddata, false);
> @@ -833,7 +836,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  static void dsicm_framedone_cb(int err, void *data)
>  {
>  	struct panel_drv_data *ddata = data;
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  
>  	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
>  	src->ops->dsi.bus_unlock(src);
> @@ -842,7 +845,7 @@ static void dsicm_framedone_cb(int err, void *data)
>  static irqreturn_t dsicm_te_isr(int irq, void *data)
>  {
>  	struct panel_drv_data *ddata = data;
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int old;
>  	int r;
>  
> @@ -868,7 +871,7 @@ static void dsicm_te_timeout_work_callback(struct work_struct *work)
>  {
>  	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
>  					te_timeout_work.work);
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  
>  	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
>  
> @@ -880,7 +883,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  				    u16 x, u16 y, u16 w, u16 h)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
> @@ -926,7 +929,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  static int dsicm_sync(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  
>  	dev_dbg(&ddata->pdev->dev, "sync\n");
>  
> @@ -942,7 +945,7 @@ static int dsicm_sync(struct omap_dss_device *dssdev)
>  
>  static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  {
> -	struct omap_dss_device *src = ddata->dssdev.src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	if (enable)
> @@ -962,7 +965,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  
>  	mutex_lock(&ddata->lock);
> @@ -1013,7 +1016,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  		u16 x, u16 y, u16 w, u16 h)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  	int r;
>  	int first = 1;
>  	int plen;
> @@ -1095,7 +1098,7 @@ static void dsicm_ulps_work(struct work_struct *work)
>  	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
>  			ulps_work.work);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
> -	struct omap_dss_device *src = dssdev->src;
> +	struct omap_dss_device *src = ddata->src;
>  
>  	mutex_lock(&ddata->lock);
>  
> @@ -1352,7 +1355,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
>  
>  	if (omapdss_device_is_enabled(dssdev))
>  		dsicm_disable(dssdev);
> -	omapdss_device_disconnect(dssdev->src, dssdev);
> +	omapdss_device_disconnect(ddata->src, dssdev);
>  
>  	sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection
  2018-12-05 15:00 ` [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection Laurent Pinchart
@ 2018-12-09 22:04   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 2990 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:13PM +0200, Laurent Pinchart wrote:
> For HDMI pipelines, when the output gets disconnected the device
> handling CEC needs to be notified. Instead of guessing which device that
> would be (and sometimes getting it wrong), notify all devices in the
> pipeline.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_connector.c | 28 ++++++++++++++----------
>  1 file changed, 16 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 31b6d6d1def3..8db1f2fbcf43 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -35,18 +35,22 @@ struct omap_connector {
>  };
>  
>  static void omap_connector_hpd_notify(struct drm_connector *connector,
> -				      struct omap_dss_device *src,
>  				      enum drm_connector_status status)
>  {
> -	if (status == connector_status_disconnected) {
> -		/*
> -		 * If the source is an HDMI encoder, notify it of disconnection.
> -		 * This is required to let the HDMI encoder reset any internal
> -		 * state related to connection status, such as the CEC address.
> -		 */
> -		if (src && src->type == OMAP_DISPLAY_TYPE_HDMI &&
> -		    src->ops->hdmi.lost_hotplug)
> -			src->ops->hdmi.lost_hotplug(src);
> +	struct omap_connector *omap_connector = to_omap_connector(connector);
> +	struct omap_dss_device *dssdev;
> +
> +	if (status != connector_status_disconnected)
> +		return;
> +
> +	/*
> +	 * Notify all devics in the pipeline of disconnection. This is required
> +	 * to let the HDMI encoders reset their internal state related to
> +	 * connection status, such as the CEC address.
> +	 */
> +	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
> +		if (dssdev->ops && dssdev->ops->hdmi.lost_hotplug)
> +			dssdev->ops->hdmi.lost_hotplug(dssdev);
>  	}
>  }
>  
> @@ -66,7 +70,7 @@ static void omap_connector_hpd_cb(void *cb_data,
>  	if (old_status == status)
>  		return;
>  
> -	omap_connector_hpd_notify(connector, omap_connector->hpd, status);
> +	omap_connector_hpd_notify(connector, status);
>  
>  	drm_kms_helper_hotplug_event(dev);
>  }
> @@ -127,7 +131,7 @@ static enum drm_connector_status omap_connector_detect(
>  		       ? connector_status_connected
>  		       : connector_status_disconnected;
>  
> -		omap_connector_hpd_notify(connector, dssdev->src, status);
> +		omap_connector_hpd_notify(connector, status);
>  	} else {
>  		switch (connector->connector_type) {
>  		case DRM_MODE_CONNECTOR_DPI:
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure
  2018-12-05 15:00 ` [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure Laurent Pinchart
@ 2018-12-09 22:04   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 2263 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:14PM +0200, Laurent Pinchart wrote:
> The field is only used to check whether the device is connected, and we
> can do so by checking the dss field instead. Remove the src field.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 14 +-------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
>  2 files changed, 1 insertion(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 8454e505b282..36f2d41c9935 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -187,7 +187,7 @@ EXPORT_SYMBOL(omapdss_device_get_next);
>  
>  static bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
>  {
> -	return dssdev->src;
> +	return dssdev->dss;
>  }
>  
>  int omapdss_device_connect(struct dss_device *dss,
> @@ -209,11 +209,6 @@ int omapdss_device_connect(struct dss_device *dss,
>  		return ret;
>  	}
>  
> -	if (src) {
> -		WARN_ON(dst->src);
> -		dst->src = src;
> -	}
> -
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_connect);
> @@ -228,13 +223,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  		return;
>  	}
>  
> -	if (src) {
> -		if (WARN_ON(dst->src != src))
> -			return;
> -
> -		dst->src = NULL;
> -	}
> -
>  	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
>  
>  	dst->ops->disconnect(src, dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 7c9f8a5ceb37..80db32bc896f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -414,7 +414,6 @@ struct omap_dss_device {
>  	struct module *owner;
>  
>  	struct dss_device *dss;
> -	struct omap_dss_device *src;
>  	struct omap_dss_device *next;
>  
>  	struct list_head list;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-05 15:00 ` [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation Laurent Pinchart
@ 2018-12-09 22:07   ` Sebastian Reichel
  2018-12-10  7:50     ` Laurent Pinchart
  0 siblings, 1 reply; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 3970 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:15PM +0200, Laurent Pinchart wrote:
> The DISPC timings checks relate to the CRTC, but they're performed in
> the encoder and connector .atomic_check() and .mode_valid() operations.
> Move them to the CRTC .mode_valid() operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

This should also fix the issue with DSI in a less ugly way:

https://lists.freedesktop.org/archives/dri-devel/2018-November/196622.html

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_connector.c | 6 ------
>  drivers/gpu/drm/omapdrm/omap_crtc.c      | 9 +++++++++
>  drivers/gpu/drm/omapdrm/omap_encoder.c   | 6 ------
>  3 files changed, 9 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 8db1f2fbcf43..dd1e0f2e8ffc 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -245,8 +245,6 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
>  				 struct drm_display_mode *mode)
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
> -	enum omap_channel channel = omap_connector->output->dispc_channel;
> -	struct omap_drm_private *priv = connector->dev->dev_private;
>  	struct omap_dss_device *dssdev;
>  	struct videomode vm = {0};
>  	struct drm_device *dev = connector->dev;
> @@ -256,10 +254,6 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
>  	drm_display_mode_to_videomode(mode, &vm);
>  	mode->vrefresh = drm_mode_vrefresh(mode);
>  
> -	r = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> -	if (r)
> -		goto done;
> -
>  	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
>  		if (!dssdev->ops->check_timings)
>  			continue;
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index caffc547ef97..51036e6fca1c 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -391,6 +391,15 @@ static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc,
>  					const struct drm_display_mode *mode)
>  {
>  	struct omap_drm_private *priv = crtc->dev->dev_private;
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> +	struct videomode vm = {0};
> +	int r;
> +
> +	drm_display_mode_to_videomode(mode, &vm);
> +	r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel,
> +					       &vm);
> +	if (r)
> +		return r;
>  
>  	/* Check for bandwidth limit */
>  	if (priv->max_bandwidth) {
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 79ee927cd905..7d01df6fa723 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -198,19 +198,13 @@ static int omap_encoder_atomic_check(struct drm_encoder *encoder,
>  				     struct drm_connector_state *conn_state)
>  {
>  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> -	enum omap_channel channel = omap_encoder->output->dispc_channel;
>  	struct drm_device *dev = encoder->dev;
> -	struct omap_drm_private *priv = dev->dev_private;
>  	struct omap_dss_device *dssdev;
>  	struct videomode vm = { 0 };
>  	int ret;
>  
>  	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
>  
> -	ret = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> -	if (ret)
> -		goto done;
> -
>  	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
>  		if (!dssdev->ops->check_timings)
>  			continue;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration
  2018-12-05 15:00 ` [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration Laurent Pinchart
@ 2018-12-09 22:08   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:08 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 4640 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:16PM +0200, Laurent Pinchart wrote:
> The mode setting handler of the VENC stores the video mode internally,
> to then convert it to a configuration when programming the hardware. The
> stored mode is otherwise unused. Cache the configuration directly
> instead.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/venc.c | 68 +++++++++++++++---------------
>  1 file changed, 34 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 638cfd69ccf6..6cb708e1944e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -301,24 +301,6 @@ static const struct videomode omap_dss_ntsc_vm = {
>  			  DISPLAY_FLAGS_SYNC_NEGEDGE,
>  };
>  
> -static enum venc_videomode venc_get_videomode(const struct videomode *vm)
> -{
> -	if (!(vm->flags & DISPLAY_FLAGS_INTERLACED))
> -		return VENC_MODE_UNKNOWN;
> -
> -	if (vm->pixelclock == omap_dss_pal_vm.pixelclock &&
> -	    vm->hactive == omap_dss_pal_vm.hactive &&
> -	    vm->vactive == omap_dss_pal_vm.vactive)
> -		return VENC_MODE_PAL;
> -
> -	if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock &&
> -	    vm->hactive == omap_dss_ntsc_vm.hactive &&
> -	    vm->vactive == omap_dss_ntsc_vm.vactive)
> -		return VENC_MODE_NTSC;
> -
> -	return VENC_MODE_UNKNOWN;
> -}
> -
>  struct venc_device {
>  	struct platform_device *pdev;
>  	void __iomem *base;
> @@ -330,7 +312,7 @@ struct venc_device {
>  
>  	struct clk	*tv_dac_clk;
>  
> -	struct videomode vm;
> +	const struct venc_config *config;
>  	enum omap_dss_venc_type type;
>  	bool invert_polarity;
>  	bool requires_tv_dac_clk;
> @@ -450,18 +432,6 @@ static void venc_runtime_put(struct venc_device *venc)
>  	WARN_ON(r < 0 && r != -ENOSYS);
>  }
>  
> -static const struct venc_config *venc_timings_to_config(const struct videomode *vm)
> -{
> -	switch (venc_get_videomode(vm)) {
> -	default:
> -		WARN_ON_ONCE(1);
> -	case VENC_MODE_PAL:
> -		return &venc_config_pal_trm;
> -	case VENC_MODE_NTSC:
> -		return &venc_config_ntsc_trm;
> -	}
> -}
> -
>  static int venc_power_on(struct venc_device *venc)
>  {
>  	u32 l;
> @@ -472,7 +442,7 @@ static int venc_power_on(struct venc_device *venc)
>  		goto err0;
>  
>  	venc_reset(venc);
> -	venc_write_config(venc, venc_timings_to_config(&venc->vm));
> +	venc_write_config(venc, venc->config);
>  
>  	dss_set_venc_output(venc->dss, venc->type);
>  	dss_set_dac_pwrdn_bgz(venc->dss, 1);
> @@ -574,16 +544,46 @@ static int venc_get_modes(struct omap_dss_device *dssdev,
>  	return ARRAY_SIZE(modes);
>  }
>  
> +static enum venc_videomode venc_get_videomode(const struct videomode *vm)
> +{
> +	if (!(vm->flags & DISPLAY_FLAGS_INTERLACED))
> +		return VENC_MODE_UNKNOWN;
> +
> +	if (vm->pixelclock == omap_dss_pal_vm.pixelclock &&
> +	    vm->hactive == omap_dss_pal_vm.hactive &&
> +	    vm->vactive == omap_dss_pal_vm.vactive)
> +		return VENC_MODE_PAL;
> +
> +	if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock &&
> +	    vm->hactive == omap_dss_ntsc_vm.hactive &&
> +	    vm->vactive == omap_dss_ntsc_vm.vactive)
> +		return VENC_MODE_NTSC;
> +
> +	return VENC_MODE_UNKNOWN;
> +}
> +
>  static void venc_set_timings(struct omap_dss_device *dssdev,
>  			     const struct videomode *vm)
>  {
>  	struct venc_device *venc = dssdev_to_venc(dssdev);
> +	enum venc_videomode venc_mode = venc_get_videomode(vm);
>  
>  	DSSDBG("venc_set_timings\n");
>  
>  	mutex_lock(&venc->venc_lock);
>  
> -	venc->vm = *vm;
> +	switch (venc_mode) {
> +	default:
> +		WARN_ON_ONCE(1);
> +		/* Fall-through */
> +	case VENC_MODE_PAL:
> +		venc->config = &venc_config_pal_trm;
> +		break;
> +
> +	case VENC_MODE_NTSC:
> +		venc->config = &venc_config_ntsc_trm;
> +		break;
> +	}
>  
>  	dispc_set_tv_pclk(venc->dss->dispc, 13500000);
>  
> @@ -854,7 +854,7 @@ static int venc_probe(struct platform_device *pdev)
>  
>  	mutex_init(&venc->venc_lock);
>  
> -	venc->vm = omap_dss_pal_vm;
> +	venc->config = &venc_config_pal_trm;
>  
>  	venc_mem = platform_get_resource(venc->pdev, IORESOURCE_MEM, 0);
>  	venc->base = devm_ioremap_resource(&pdev->dev, venc_mem);
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 24/29] drm/omap: Factor out common mode validation code
  2018-12-05 15:00 ` [PATCH 24/29] drm/omap: Factor out common mode validation code Laurent Pinchart
@ 2018-12-09 22:19   ` Sebastian Reichel
  2018-12-10  8:27     ` Laurent Pinchart
  2018-12-10  8:27     ` [PATCH] " Laurent Pinchart
  0 siblings, 2 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:19 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 6604 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:17PM +0200, Laurent Pinchart wrote:
> The encoder .atomic_check() and connector .mode_valid() operations both
> walk through the dss devices in the pipeline to validate the mode.
> Factor out the common code in a new omap_drm_connector_mode_fixup()
> function.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

This is a bit tricky to review. It would probably be easier to
review, if the changes were split into two commits:

1. introduce common function
2. move drm_display_mode/videomode conversion further up the stack

Anyways:

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_connector.c | 55 +++++++++++++-----------
>  drivers/gpu/drm/omapdrm/omap_connector.h |  5 +++
>  drivers/gpu/drm/omapdrm/omap_encoder.c   | 30 ++++---------
>  3 files changed, 45 insertions(+), 45 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index dd1e0f2e8ffc..9882a4b1402b 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -241,50 +241,57 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  	return 0;
>  }
>  
> -static int omap_connector_mode_valid(struct drm_connector *connector,
> -				 struct drm_display_mode *mode)
> +enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
> +					const struct drm_display_mode *mode,
> +					struct drm_display_mode *adjusted_mode)
>  {
> -	struct omap_connector *omap_connector = to_omap_connector(connector);
> -	struct omap_dss_device *dssdev;
> -	struct videomode vm = {0};
> -	struct drm_device *dev = connector->dev;
> -	struct drm_display_mode *new_mode;
> -	int r, ret = MODE_BAD;
> +	struct videomode vm = { 0 };
> +	int ret;
>  
>  	drm_display_mode_to_videomode(mode, &vm);
> -	mode->vrefresh = drm_mode_vrefresh(mode);
>  
> -	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
> +	for (; dssdev; dssdev = dssdev->next) {
>  		if (!dssdev->ops->check_timings)
>  			continue;
>  
> -		r = dssdev->ops->check_timings(dssdev, &vm);
> -		if (r)
> -			goto done;
> +		ret = dssdev->ops->check_timings(dssdev, &vm);
> +		if (ret)
> +			return MODE_BAD;
>  	}
>  
> -	/* check if vrefresh is still valid */
> -	new_mode = drm_mode_duplicate(dev, mode);
> -	if (!new_mode)
> -		return MODE_BAD;
> +	if (adjusted_mode)
> +		drm_display_mode_from_videomode(&vm, adjusted_mode);
>  
> -	new_mode->clock = vm.pixelclock / 1000;
> -	new_mode->vrefresh = 0;
> -	if (mode->vrefresh == drm_mode_vrefresh(new_mode))
> -		ret = MODE_OK;
> -	drm_mode_destroy(dev, new_mode);
> +	return MODE_OK;
> +}
> +
> +static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *connector,
> +				 struct drm_display_mode *mode)
> +{
> +	struct omap_connector *omap_connector = to_omap_connector(connector);
> +	struct drm_display_mode new_mode = { { 0 } };
> +	enum drm_mode_status status;
> +
> +	status = omap_connector_mode_fixup(omap_connector->output, mode,
> +					   &new_mode);
> +	if (status != MODE_OK)
> +		goto done;
> +
> +	/* Check if vrefresh is still valid. */
> +	if (drm_mode_vrefresh(mode) != drm_mode_vrefresh(&new_mode))
> +		status = MODE_NOCLOCK;
>  
>  done:
>  	DBG("connector: mode %s: "
>  			"%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
> -			(ret == MODE_OK) ? "valid" : "invalid",
> +			(status == MODE_OK) ? "valid" : "invalid",
>  			mode->base.id, mode->name, mode->vrefresh, mode->clock,
>  			mode->hdisplay, mode->hsync_start,
>  			mode->hsync_end, mode->htotal,
>  			mode->vdisplay, mode->vsync_start,
>  			mode->vsync_end, mode->vtotal, mode->type, mode->flags);
>  
> -	return ret;
> +	return status;
>  }
>  
>  static const struct drm_connector_funcs omap_connector_funcs = {
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
> index 4a1dcd0f031b..6b7d4d95e32b 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.h
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.h
> @@ -22,6 +22,8 @@
>  
>  #include <linux/types.h>
>  
> +enum drm_mode_status;
> +
>  struct drm_connector;
>  struct drm_device;
>  struct drm_encoder;
> @@ -34,5 +36,8 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
>  bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
>  void omap_connector_enable_hpd(struct drm_connector *connector);
>  void omap_connector_disable_hpd(struct drm_connector *connector);
> +enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
> +					const struct drm_display_mode *mode,
> +					struct drm_display_mode *adjusted_mode);
>  
>  #endif /* __OMAPDRM_CONNECTOR_H__ */
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 7d01df6fa723..086963088201 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -198,29 +198,17 @@ static int omap_encoder_atomic_check(struct drm_encoder *encoder,
>  				     struct drm_connector_state *conn_state)
>  {
>  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> -	struct drm_device *dev = encoder->dev;
> -	struct omap_dss_device *dssdev;
> -	struct videomode vm = { 0 };
> -	int ret;
> -
> -	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
> -
> -	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
> -		if (!dssdev->ops->check_timings)
> -			continue;
> -
> -		ret = dssdev->ops->check_timings(dssdev, &vm);
> -		if (ret)
> -			goto done;
> +	enum drm_mode_status status;
> +
> +	status = omap_connector_mode_fixup(omap_encoder->output,
> +					   &crtc_state->mode,
> +					   &crtc_state->adjusted_mode);
> +	if (status != MODE_OK) {
> +		dev_err(encoder->dev->dev, "invalid timings: %d\n", status);
> +		return -EINVAL;
>  	}
>  
> -	drm_display_mode_from_videomode(&vm, &crtc_state->adjusted_mode);
> -
> -done:
> -	if (ret)
> -		dev_err(dev->dev, "invalid timings: %d\n", ret);
> -
> -	return ret;
> +	return 0;
>  }
>  
>  static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings()
  2018-12-05 15:00 ` [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings() Laurent Pinchart
@ 2018-12-09 22:26   ` Sebastian Reichel
  2018-12-10  8:07     ` Laurent Pinchart
  0 siblings, 1 reply; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:26 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1930 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:18PM +0200, Laurent Pinchart wrote:
> The omap_dss_device .check_timings() and .set_timings() operations
> operate on struct videomode, while the DRM API operates on struct
> drm_display_mode. This forces conversion from to videomode in the
> callers. While that's not a problem per se, it creates a difference with
> the drm_bridge API.
> 
> Replace the videomode parameter to the .check_timings() and
> .set_timings() operations with a drm_display_mode. This pushed the
> conversion to videomode down to the DSS devices in some cases. If needed
> they will be converted to operate on drm_display_mode natively.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> [...]
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 9882a4b1402b..487603c56b08 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -245,23 +245,19 @@ enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
>  					const struct drm_display_mode *mode,
>  					struct drm_display_mode *adjusted_mode)
>  {
> -	struct videomode vm = { 0 };
>  	int ret;
>  
> -	drm_display_mode_to_videomode(mode, &vm);
> +	drm_mode_copy(adjusted_mode, mode);

This will explode if adjusted_mode is NULL?

>  	for (; dssdev; dssdev = dssdev->next) {
>  		if (!dssdev->ops->check_timings)
>  			continue;
>  
> -		ret = dssdev->ops->check_timings(dssdev, &vm);
> +		ret = dssdev->ops->check_timings(dssdev, adjusted_mode);
>  		if (ret)
>  			return MODE_BAD;
>  	}
>  
> -	if (adjusted_mode)
> -		drm_display_mode_from_videomode(&vm, adjusted_mode);
> -
>  	return MODE_OK;
>  }

Old code assumed, that adjusted_mode may be NULL. If adjusted_mode
cannot be NULL, it should be mentioned in the patch description.

-- Sebastian

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH v1.1 26/29] drm/omap: venc: Use drm_display_mode natively
  2018-12-06 16:23   ` [PATCH v1.1 " Laurent Pinchart
@ 2018-12-09 22:27     ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:27 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 5400 bytes --]

Hi,

On Thu, Dec 06, 2018 at 06:23:46PM +0200, Laurent Pinchart wrote:
> Replace internal usage of struct videomode with struct drm_display_mode
> in order to avoid converting needlessly between the data structures.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> Changes since v1:
> 
> - Set mode.crtc_* fields and mode name in venc_check_timings()
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/venc.c | 90 +++++++++++++++---------------
>  1 file changed, 44 insertions(+), 46 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 7bce5898654a..f2cbecfd05b5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -267,38 +267,34 @@ enum venc_videomode {
>  	VENC_MODE_NTSC,
>  };
>  
> -static const struct videomode omap_dss_pal_vm = {
> -	.hactive	= 720,
> -	.vactive	= 574,
> -	.pixelclock	= 13500000,
> -	.hsync_len	= 64,
> -	.hfront_porch	= 12,
> -	.hback_porch	= 68,
> -	.vsync_len	= 5,
> -	.vfront_porch	= 5,
> -	.vback_porch	= 41,
> -
> -	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
> -			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
> -			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
> -			  DISPLAY_FLAGS_SYNC_NEGEDGE,
> +static const struct drm_display_mode omap_dss_pal_mode = {
> +	.hdisplay	= 720,
> +	.hsync_start	= 732,
> +	.hsync_end	= 796,
> +	.htotal		= 864,
> +	.vdisplay	= 574,
> +	.vsync_start	= 579,
> +	.vsync_end	= 584,
> +	.vtotal		= 625,
> +	.clock		= 13500,
> +
> +	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
> +			  DRM_MODE_FLAG_NVSYNC,
>  };
>  
> -static const struct videomode omap_dss_ntsc_vm = {
> -	.hactive	= 720,
> -	.vactive	= 482,
> -	.pixelclock	= 13500000,
> -	.hsync_len	= 64,
> -	.hfront_porch	= 16,
> -	.hback_porch	= 58,
> -	.vsync_len	= 6,
> -	.vfront_porch	= 6,
> -	.vback_porch	= 31,
> -
> -	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW |
> -			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH |
> -			  DISPLAY_FLAGS_PIXDATA_POSEDGE |
> -			  DISPLAY_FLAGS_SYNC_NEGEDGE,
> +static const struct drm_display_mode omap_dss_ntsc_mode = {
> +	.hdisplay	= 720,
> +	.hsync_start	= 736,
> +	.hsync_end	= 800,
> +	.htotal		= 858,
> +	.vdisplay	= 482,
> +	.vsync_start	= 488,
> +	.vsync_end	= 494,
> +	.vtotal		= 525,
> +	.clock		= 13500,
> +
> +	.flags		= DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_NHSYNC |
> +			  DRM_MODE_FLAG_NVSYNC,
>  };
>  
>  struct venc_device {
> @@ -521,21 +517,19 @@ static void venc_display_disable(struct omap_dss_device *dssdev)
>  static int venc_get_modes(struct omap_dss_device *dssdev,
>  			  struct drm_connector *connector)
>  {
> -	static const struct videomode *modes[] = {
> -		&omap_dss_pal_vm,
> -		&omap_dss_ntsc_vm,
> +	static const struct drm_display_mode *modes[] = {
> +		&omap_dss_pal_mode,
> +		&omap_dss_ntsc_mode,
>  	};
>  	unsigned int i;
>  
>  	for (i = 0; i < ARRAY_SIZE(modes); ++i) {
>  		struct drm_display_mode *mode;
>  
> -		mode = drm_mode_create(connector->dev);
> +		mode = drm_mode_duplicate(connector->dev, modes[i]);
>  		if (!mode)
>  			return i;
>  
> -		drm_display_mode_from_videomode(modes[i], mode);
> -
>  		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
>  		drm_mode_set_name(mode);
>  		drm_mode_probed_add(connector, mode);
> @@ -549,14 +543,14 @@ static enum venc_videomode venc_get_videomode(const struct drm_display_mode *mod
>  	if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
>  		return VENC_MODE_UNKNOWN;
>  
> -	if (mode->clock == omap_dss_pal_vm.pixelclock / 1000 &&
> -	    mode->hdisplay == omap_dss_pal_vm.hactive &&
> -	    mode->vdisplay == omap_dss_pal_vm.vactive)
> +	if (mode->clock == omap_dss_pal_mode.clock &&
> +	    mode->hdisplay == omap_dss_pal_mode.hdisplay &&
> +	    mode->vdisplay == omap_dss_pal_mode.vdisplay)
>  		return VENC_MODE_PAL;
>  
> -	if (mode->clock == omap_dss_ntsc_vm.pixelclock / 1000 &&
> -	    mode->hdisplay == omap_dss_ntsc_vm.hactive &&
> -	    mode->vdisplay == omap_dss_ntsc_vm.vactive)
> +	if (mode->clock == omap_dss_ntsc_mode.clock &&
> +	    mode->hdisplay == omap_dss_ntsc_mode.hdisplay &&
> +	    mode->vdisplay == omap_dss_ntsc_mode.vdisplay)
>  		return VENC_MODE_NTSC;
>  
>  	return VENC_MODE_UNKNOWN;
> @@ -597,16 +591,20 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
>  
>  	switch (venc_get_videomode(mode)) {
>  	case VENC_MODE_PAL:
> -		drm_display_mode_from_videomode(&omap_dss_pal_vm, mode);
> -		return 0;
> +		drm_mode_copy(mode, &omap_dss_pal_mode);
> +		break;
>  
>  	case VENC_MODE_NTSC:
> -		drm_display_mode_from_videomode(&omap_dss_ntsc_vm, mode);
> -		return 0;
> +		drm_mode_copy(mode, &omap_dss_ntsc_mode);
> +		break;
>  
>  	default:
>  		return -EINVAL;
>  	}
> +
> +	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
> +	drm_mode_set_name(mode);
> +	return 0;
>  }
>  
>  static int venc_dump_regs(struct seq_file *s, void *p)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders
  2018-12-05 15:00 ` [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders Laurent Pinchart
@ 2018-12-09 22:27   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:27 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 3277 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:20PM +0200, Laurent Pinchart wrote:
> The DPI and SDI encoders store the full videomode upon mode set, to only
> use the value of the pixel clock when enabling the encoder. This wastes
> memory. Store the pixel clock value only.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c | 9 ++++-----
>  drivers/gpu/drm/omapdrm/dss/sdi.c | 6 +++---
>  2 files changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 0cb3cb72f15f..295bc3eeea80 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -47,8 +47,8 @@ struct dpi_data {
>  
>  	struct mutex lock;
>  
> -	struct videomode vm;
>  	struct dss_lcd_mgr_config mgr_config;
> +	unsigned long pixelclock;
>  	int data_lines;
>  
>  	struct omap_dss_device output;
> @@ -347,16 +347,15 @@ static int dpi_set_dispc_clk(struct dpi_data *dpi, unsigned long pck_req,
>  
>  static int dpi_set_mode(struct dpi_data *dpi)
>  {
> -	const struct videomode *vm = &dpi->vm;
>  	int lck_div = 0, pck_div = 0;
>  	unsigned long fck = 0;
>  	int r = 0;
>  
>  	if (dpi->pll)
>  		r = dpi_set_pll_clk(dpi, dpi->output.dispc_channel,
> -				    vm->pixelclock, &fck, &lck_div, &pck_div);
> +				    dpi->pixelclock, &fck, &lck_div, &pck_div);
>  	else
> -		r = dpi_set_dispc_clk(dpi, vm->pixelclock, &fck,
> +		r = dpi_set_dispc_clk(dpi, dpi->pixelclock, &fck,
>  				&lck_div, &pck_div);
>  	if (r)
>  		return r;
> @@ -467,7 +466,7 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,
>  
>  	mutex_lock(&dpi->lock);
>  
> -	drm_display_mode_to_videomode(mode, &dpi->vm);
> +	dpi->pixelclock = mode->clock * 1000;
>  
>  	mutex_unlock(&dpi->lock);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index f096a7f77e5f..38b0bf19538d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -37,7 +37,7 @@ struct sdi_device {
>  	struct regulator *vdds_sdi_reg;
>  
>  	struct dss_lcd_mgr_config mgr_config;
> -	struct videomode vm;
> +	unsigned long pixelclock;
>  	int datapairs;
>  
>  	struct omap_dss_device output;
> @@ -144,7 +144,7 @@ static void sdi_display_enable(struct omap_dss_device *dssdev)
>  	if (r)
>  		goto err_get_dispc;
>  
> -	r = sdi_calc_clock_div(sdi, sdi->vm.pixelclock, &fck, &dispc_cinfo);
> +	r = sdi_calc_clock_div(sdi, sdi->pixelclock, &fck, &dispc_cinfo);
>  	if (r)
>  		goto err_calc_clock_div;
>  
> @@ -210,7 +210,7 @@ static void sdi_set_timings(struct omap_dss_device *dssdev,
>  {
>  	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
>  
> -	drm_display_mode_to_videomode(mode, &sdi->vm);
> +	sdi->pixelclock = mode->clock * 1000;
>  }
>  
>  static int sdi_check_timings(struct omap_dss_device *dssdev,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices
  2018-12-05 15:00 ` [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices Laurent Pinchart
@ 2018-12-09 22:27   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:27 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 4998 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:21PM +0200, Laurent Pinchart wrote:
> Now that the direction of OF graph walk has been reversed, there's no
> need to lookup devices by port as we have no sink device connected
> through multiple sink ports. Simplify OF lookup of the DSS devices to
> look them up by node only.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    |  5 +--
>  drivers/gpu/drm/omapdrm/dss/dss-of.c  | 60 ++++-----------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 +-
>  3 files changed, 10 insertions(+), 58 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 36f2d41c9935..4d7f999c8e29 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -112,13 +112,12 @@ void omapdss_device_put(struct omap_dss_device *dssdev)
>  }
>  EXPORT_SYMBOL(omapdss_device_put);
>  
> -struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
> -						    unsigned int port)
> +struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node)
>  {
>  	struct omap_dss_device *dssdev;
>  
>  	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
> -		if (dssdev->dev->of_node == src && dssdev->of_ports & BIT(port))
> +		if (dssdev->dev->of_node == node)
>  			return omapdss_device_get(dssdev);
>  	}
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> index 0422597ac6b0..b2094055c5fc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> @@ -12,71 +12,25 @@
>   * more details.
>   */
>  
> -#include <linux/device.h>
>  #include <linux/err.h>
> -#include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/of_graph.h>
> -#include <linux/seq_file.h>
>  
>  #include "omapdss.h"
>  
> -static struct device_node *
> -dss_of_port_get_parent_device(struct device_node *port)
> -{
> -	struct device_node *np;
> -	int i;
> -
> -	if (!port)
> -		return NULL;
> -
> -	np = of_get_parent(port);
> -
> -	for (i = 0; i < 2 && np; ++i) {
> -		struct property *prop;
> -
> -		prop = of_find_property(np, "compatible", NULL);
> -
> -		if (prop)
> -			return np;
> -
> -		np = of_get_next_parent(np);
> -	}
> -
> -	return NULL;
> -}
> -
>  struct omap_dss_device *
>  omapdss_of_find_connected_device(struct device_node *node, unsigned int port)
>  {
> -	struct device_node *src_node;
> -	struct device_node *src_port;
> -	struct device_node *ep;
> -	struct omap_dss_device *src;
> -	u32 port_number = 0;
> +	struct device_node *remote_node;
> +	struct omap_dss_device *dssdev;
>  
> -	/* Get the endpoint... */
> -	ep = of_graph_get_endpoint_by_regs(node, port, 0);
> -	if (!ep)
> +	remote_node = of_graph_get_remote_node(node, port, 0);
> +	if (!remote_node)
>  		return NULL;
>  
> -	/* ... and its remote port... */
> -	src_port = of_graph_get_remote_port(ep);
> -	of_node_put(ep);
> -	if (!src_port)
> -		return NULL;
> -
> -	/* ... and the remote port's number and parent... */
> -	of_property_read_u32(src_port, "reg", &port_number);
> -	src_node = dss_of_port_get_parent_device(src_port);
> -	of_node_put(src_port);
> -	if (!src_node)
> -		return ERR_PTR(-EINVAL);
> -
> -	/* ... and finally the connected device. */
> -	src = omapdss_find_device_by_port(src_node, port_number);
> -	of_node_put(src_node);
> +	dssdev = omapdss_find_device_by_node(remote_node);
> +	of_node_put(remote_node);
>  
> -	return src ? src : ERR_PTR(-EPROBE_DEFER);
> +	return dssdev ? dssdev : ERR_PTR(-EPROBE_DEFER);
>  }
>  EXPORT_SYMBOL_GPL(omapdss_of_find_connected_device);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index d990009ddbbd..d51cb181e2cc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -481,8 +481,7 @@ void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(struct omap_dss_device *dssdev);
>  struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);
>  void omapdss_device_put(struct omap_dss_device *dssdev);
> -struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
> -						    unsigned int port);
> +struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node);
>  struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
>  						enum omap_dss_device_type type);
>  int omapdss_device_connect(struct dss_device *dss,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 29/29] drm/omap: Refactor initialization sequence
  2018-12-05 15:00 ` [PATCH 29/29] drm/omap: Refactor initialization sequence Laurent Pinchart
@ 2018-12-09 22:27   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-09 22:27 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 8027 bytes --]

Hi,

On Wed, Dec 05, 2018 at 05:00:22PM +0200, Laurent Pinchart wrote:
> The omapdrm driver initialization procedure starts by connecting all
> available pipelines, gathering related information (such as output and
> display DSS devices, and DT aliases), sorting them by alias, and finally
> creates all the DRM/KMS objects.
> 
> When using DRM bridges instead of DSS devices, we will need to attach to
> the bridges before getting the aliases. As attaching to bridges requires
> an encoder object, we have to reorganize the initialization sequence to
> create encoders before getting aliases and sorting the pipelines.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c | 123 +++++++++++++----------------
>  1 file changed, 56 insertions(+), 67 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index c9b578a49b24..4cd4fb47660a 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -150,48 +150,27 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)
>  	priv->num_pipes = 0;
>  }
>  
> -static int omap_compare_pipes(const void *a, const void *b)
> -{
> -	const struct omap_drm_pipeline *pipe1 = a;
> -	const struct omap_drm_pipeline *pipe2 = b;
> -
> -	if (pipe1->alias_id > pipe2->alias_id)
> -		return 1;
> -	else if (pipe1->alias_id < pipe2->alias_id)
> -		return -1;
> -	return 0;
> -}
> -
>  static int omap_connect_pipelines(struct drm_device *ddev)
>  {
>  	struct omap_drm_private *priv = ddev->dev_private;
>  	struct omap_dss_device *output = NULL;
> -	unsigned int i;
>  	int r;
>  
> -	if (!omapdss_stack_is_ready())
> -		return -EPROBE_DEFER;
> -
>  	for_each_dss_output(output) {
>  		r = omapdss_device_connect(priv->dss, NULL, output);
>  		if (r == -EPROBE_DEFER) {
>  			omapdss_device_put(output);
> -			goto cleanup;
> +			return r;
>  		} else if (r) {
>  			dev_warn(output->dev, "could not connect output %s\n",
>  				 output->name);
>  		} else {
>  			struct omap_drm_pipeline *pipe;
> -			int id;
>  
>  			pipe = &priv->pipes[priv->num_pipes++];
>  			pipe->output = omapdss_device_get(output);
>  			pipe->display = omapdss_display_get(output);
>  
> -			id = of_alias_get_id(pipe->display->dev->of_node,
> -					     "display");
> -			pipe->alias_id = id >= 0 ? id : priv->num_pipes - 1;
> -
>  			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
>  				/* To balance the 'for_each_dss_output' loop */
>  				omapdss_device_put(output);
> @@ -200,36 +179,19 @@ static int omap_connect_pipelines(struct drm_device *ddev)
>  		}
>  	}
>  
> -	/* Sort the list by DT aliases */
> -	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
> -	     omap_compare_pipes, NULL);
> -
> -	/*
> -	 * Populate the pipeline lookup table by DISPC channel. Only one display
> -	 * is allowed per channel.
> -	 */
> -	for (i = 0; i < priv->num_pipes; ++i) {
> -		struct omap_drm_pipeline *pipe = &priv->pipes[i];
> -		enum omap_channel channel = pipe->output->dispc_channel;
> -
> -		if (WARN_ON(priv->channels[channel] != NULL)) {
> -			r = -EINVAL;
> -			goto cleanup;
> -		}
> -
> -		priv->channels[channel] = pipe;
> -	}
> -
>  	return 0;
> +}
>  
> -cleanup:
> -	/*
> -	 * if we are deferring probe, we disconnect the devices we previously
> -	 * connected
> -	 */
> -	omap_disconnect_pipelines(ddev);
> +static int omap_compare_pipelines(const void *a, const void *b)
> +{
> +	const struct omap_drm_pipeline *pipe1 = a;
> +	const struct omap_drm_pipeline *pipe2 = b;
>  
> -	return r;
> +	if (pipe1->alias_id > pipe2->alias_id)
> +		return 1;
> +	else if (pipe1->alias_id < pipe2->alias_id)
> +		return -1;
> +	return 0;
>  }
>  
>  static int omap_modeset_init_properties(struct drm_device *dev)
> @@ -254,6 +216,9 @@ static int omap_modeset_init(struct drm_device *dev)
>  	int ret;
>  	u32 plane_crtc_mask;
>  
> +	if (!omapdss_stack_is_ready())
> +		return -EPROBE_DEFER;
> +
>  	drm_mode_config_init(dev);
>  
>  	ret = omap_modeset_init_properties(dev);
> @@ -268,6 +233,10 @@ static int omap_modeset_init(struct drm_device *dev)
>  	 * configuration does not match the expectations or exceeds
>  	 * the available resources, the configuration is rejected.
>  	 */
> +	ret = omap_connect_pipelines(dev);
> +	if (ret < 0)
> +		return ret;
> +
>  	if (priv->num_pipes > num_mgrs || priv->num_pipes > num_ovls) {
>  		dev_err(dev->dev, "%s(): Too many connected displays\n",
>  			__func__);
> @@ -293,33 +262,58 @@ static int omap_modeset_init(struct drm_device *dev)
>  		priv->planes[priv->num_planes++] = plane;
>  	}
>  
> -	/* Create the CRTCs, encoders and connectors. */
> +	/* Create the encoders and get the pipelines aliases. */
>  	for (i = 0; i < priv->num_pipes; i++) {
>  		struct omap_drm_pipeline *pipe = &priv->pipes[i];
> -		struct omap_dss_device *display = pipe->display;
> -		struct drm_connector *connector;
> -		struct drm_encoder *encoder;
> -		struct drm_crtc *crtc;
> +		int id;
>  
> -		encoder = omap_encoder_init(dev, pipe->output);
> -		if (!encoder)
> +		pipe->encoder = omap_encoder_init(dev, pipe->output);
> +		if (!pipe->encoder)
>  			return -ENOMEM;
>  
> -		connector = omap_connector_init(dev, pipe->output, display,
> -						encoder);
> +		id = of_alias_get_id(pipe->display->dev->of_node, "display");
> +		pipe->alias_id = id >= 0 ? id : i;
> +	}
> +
> +	/* Sort the pipelines by DT aliases. */
> +	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
> +	     omap_compare_pipelines, NULL);
> +
> +	/*
> +	 * Populate the pipeline lookup table by DISPC channel. Only one display
> +	 * is allowed per channel.
> +	 */
> +	for (i = 0; i < priv->num_pipes; ++i) {
> +		struct omap_drm_pipeline *pipe = &priv->pipes[i];
> +		enum omap_channel channel = pipe->output->dispc_channel;
> +
> +		if (WARN_ON(priv->channels[channel] != NULL))
> +			return -EINVAL;
> +
> +		priv->channels[channel] = pipe;
> +	}
> +
> +	/* Create the connectors and CRTCs. */
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_drm_pipeline *pipe = &priv->pipes[i];
> +		struct drm_encoder *encoder = pipe->encoder;
> +		struct drm_connector *connector;
> +		struct drm_crtc *crtc;
> +
> +		connector = omap_connector_init(dev, pipe->output,
> +						pipe->display, encoder);
>  		if (!connector)
>  			return -ENOMEM;
>  
> +		drm_connector_attach_encoder(connector, encoder);
> +		pipe->connector = connector;
> +
>  		crtc = omap_crtc_init(dev, pipe, priv->planes[i]);
>  		if (IS_ERR(crtc))
>  			return PTR_ERR(crtc);
>  
> -		drm_connector_attach_encoder(connector, encoder);
>  		encoder->possible_crtcs = 1 << i;
> -
>  		pipe->crtc = crtc;
> -		pipe->encoder = encoder;
> -		pipe->connector = connector;
>  	}
>  
>  	DBG("registered %u planes, %u crtcs/encoders/connectors\n",
> @@ -556,10 +550,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  
>  	omap_crtc_pre_init(priv);
>  
> -	ret = omap_connect_pipelines(ddev);
> -	if (ret)
> -		goto err_crtc_uninit;
> -
>  	soc = soc_device_match(omapdrm_soc_devices);
>  	priv->omaprev = soc ? (unsigned int)soc->data : 0;
>  	priv->wq = alloc_ordered_workqueue("omapdrm", 0);
> @@ -617,7 +607,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	omap_gem_deinit(ddev);
>  	destroy_workqueue(priv->wq);
>  	omap_disconnect_pipelines(ddev);
> -err_crtc_uninit:
>  	omap_crtc_pre_uninit(priv);
>  	drm_dev_put(ddev);
>  	return ret;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* [PATCH v1.1 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations
  2018-12-05 15:00 ` [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations Laurent Pinchart
  2018-12-09 21:59   ` Sebastian Reichel
@ 2018-12-10  1:01   ` Laurent Pinchart
  1 sibling, 0 replies; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  1:01 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

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.

We also adapt the omapdss shutdown handler dss_shutdown() to shut down
all active pipelines starting from the pipeline output device instead of
the display device.

As a consequence the for_each_dss_display() macro isn't used and can be
removed, and the omapdss_device_get_next() function underlying the macro
can be simplified to search for output devices only.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Shutdown pipelines starting at the output device
---
 .../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            | 73 +++++++++++++++----
 drivers/gpu/drm/omapdrm/dss/dpi.c             |  5 +-
 drivers/gpu/drm/omapdrm/dss/dsi.c             |  7 +-
 drivers/gpu/drm/omapdrm/dss/dss.c             |  2 +-
 drivers/gpu/drm/omapdrm/dss/hdmi4.c           | 12 +--
 drivers/gpu/drm/omapdrm/dss/hdmi5.c           | 12 +--
 drivers/gpu/drm/omapdrm/dss/omapdss.h         | 20 +++--
 drivers/gpu/drm/omapdrm/dss/sdi.c             |  8 +-
 drivers/gpu/drm/omapdrm/dss/venc.c            | 12 +--
 drivers/gpu/drm/omapdrm/omap_encoder.c        | 49 ++++++++++---
 24 files changed, 171 insertions(+), 337 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..916225d62cc2 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -126,13 +126,10 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 }
 
 /*
- * Search for the next device starting at @from. The type argument specfies
- * which device types to consider when searching. Searching for multiple types
- * is supported by and'ing their type flags. Release the reference to the @from
- * device, and acquire a reference to the returned device if found.
+ * Search for the next output device starting at @from. Release the reference to
+ * the @from device, and acquire a reference to the returned device if found.
  */
-struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
-						enum omap_dss_device_type type)
+struct omap_dss_device *omapdss_device_next_output(struct omap_dss_device *from)
 {
 	struct omap_dss_device *dssdev;
 	struct list_head *list;
@@ -160,15 +157,7 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 			goto done;
 		}
 
-		/*
-		 * Accept display entities if the display type is requested,
-		 * and output entities if the output type is requested.
-		 */
-		if ((type & OMAP_DSS_DEVICE_TYPE_DISPLAY) &&
-		    !dssdev->output_type)
-			goto done;
-		if ((type & OMAP_DSS_DEVICE_TYPE_OUTPUT) && dssdev->id &&
-		    dssdev->next)
+		if (dssdev->id && dssdev->next)
 			goto done;
 	}
 
@@ -183,7 +172,7 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 	mutex_unlock(&omapdss_devices_lock);
 	return dssdev;
 }
-EXPORT_SYMBOL(omapdss_device_get_next);
+EXPORT_SYMBOL(omapdss_device_next_output);
 
 static bool omapdss_device_is_connected(struct omap_dss_device *dssdev)
 {
@@ -244,6 +233,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/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 7553c7fc1c45..55e68863ef15 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1560,7 +1560,7 @@ static void dss_shutdown(struct platform_device *pdev)
 
 	DSSDBG("shutdown\n");
 
-	for_each_dss_display(dssdev) {
+	for_each_dss_output(dssdev) {
 		if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
 			dssdev->ops->disable(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..d40c2a3ec33c 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);
@@ -397,11 +399,6 @@ enum omap_dss_device_ops_flag {
 	OMAP_DSS_DEVICE_OP_EDID = BIT(2),
 };
 
-enum omap_dss_device_type {
-	OMAP_DSS_DEVICE_TYPE_OUTPUT = (1 << 0),
-	OMAP_DSS_DEVICE_TYPE_DISPLAY = (1 << 1),
-};
-
 struct omap_dss_device {
 	struct device *dev;
 
@@ -471,8 +468,6 @@ static inline bool omapdss_is_initialized(void)
 	return !!omapdss_get_dss();
 }
 
-#define for_each_dss_display(d) \
-	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_DISPLAY)) != NULL)
 void omapdss_display_init(struct omap_dss_device *dssdev);
 struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output);
 
@@ -482,20 +477,23 @@ struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);
 void omapdss_device_put(struct omap_dss_device *dssdev);
 struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 						    unsigned int port);
-struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
-						enum omap_dss_device_type type);
 int omapdss_device_connect(struct dss_device *dss,
 			   struct omap_dss_device *src,
 			   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);
 
 int omap_dss_get_num_overlays(void);
 
 #define for_each_dss_output(d) \
-	while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_OUTPUT)) != NULL)
+	while ((d = omapdss_device_next_output(d)) != NULL)
+struct omap_dss_device *omapdss_device_next_output(struct omap_dss_device *from);
 int omapdss_output_validate(struct omap_dss_device *out);
 
 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* Re: [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers
  2018-12-09 21:53   ` Sebastian Reichel
@ 2018-12-10  6:49     ` Laurent Pinchart
  2018-12-10  8:01       ` [PATCH v1.1 " Laurent Pinchart
  0 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  6:49 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Sunday, 9 December 2018 23:53:09 EET Sebastian Reichel wrote:
> Hi,
> 
> On Wed, Dec 05, 2018 at 04:59:57PM +0200, Laurent Pinchart wrote:
> > Instead of rolling out custom suspend/resume implementations based on
> > state information stored in the driver's data structures, use the atomic
> > suspend/resume helpers that rely on a DRM atomic state object.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> 
> Documentation/gpu/todo.rst says, that this should be converted to
> drm_mode_config_helper_suspend, but at least it's no longer open
> coded after your change.

Good point. I'll fix this in the next version. Thank you for pointing it out.

> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> 
> >  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 --
> >  drivers/gpu/drm/omapdrm/omap_drv.c    | 52 +++++----------------------
> >  drivers/gpu/drm/omapdrm/omap_drv.h    |  2 ++
> >  3 files changed, 11 insertions(+), 46 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > b/drivers/gpu/drm/omapdrm/dss/omapdss.h index d3b576e6edf5..149a0f09adbc
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > @@ -432,9 +432,6 @@ struct omap_dss_device {
> > 
> >  	unsigned long ops_flags;
> >  	unsigned long bus_flags;
> > 
> > -	/* helper variable for driver suspend/resume */
> > -	bool activate_after_resume;
> > -
> > 
> >  	enum omap_display_caps caps;
> >  	
> >  	enum omap_dss_display_state state;
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c
> > b/drivers/gpu/drm/omapdrm/omap_drv.c index 5e67d58cbc28..66c4cedb5539
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> > @@ -685,52 +685,21 @@ static int pdev_remove(struct platform_device *pdev)
> > 
> >  }
> >  
> >  #ifdef CONFIG_PM_SLEEP
> > 
> > -static int omap_drm_suspend_all_displays(struct drm_device *ddev)
> > -{
> > -	struct omap_drm_private *priv = ddev->dev_private;
> > -	int i;
> > -
> > -	for (i = 0; i < priv->num_pipes; i++) {
> > -		struct omap_dss_device *display = priv->pipes[i].display;
> > -
> > -		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
> > -			display->ops->disable(display);
> > -			display->activate_after_resume = true;
> > -		} else {
> > -			display->activate_after_resume = false;
> > -		}
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int omap_drm_resume_all_displays(struct drm_device *ddev)
> > -{
> > -	struct omap_drm_private *priv = ddev->dev_private;
> > -	int i;
> > -
> > -	for (i = 0; i < priv->num_pipes; i++) {
> > -		struct omap_dss_device *display = priv->pipes[i].display;
> > -
> > -		if (display->activate_after_resume) {
> > -			display->ops->enable(display);
> > -			display->activate_after_resume = false;
> > -		}
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > 
> >  static int omap_drm_suspend(struct device *dev)
> >  {
> >  
> >  	struct omap_drm_private *priv = dev_get_drvdata(dev);
> >  	struct drm_device *drm_dev = priv->ddev;
> > 
> > +	struct drm_atomic_state *state;
> > 
> >  	drm_kms_helper_poll_disable(drm_dev);
> > 
> > -	drm_modeset_lock_all(drm_dev);
> > -	omap_drm_suspend_all_displays(drm_dev);
> > -	drm_modeset_unlock_all(drm_dev);
> > +	state = drm_atomic_helper_suspend(drm_dev);
> > +	if (IS_ERR(state)) {
> > +		drm_kms_helper_poll_enable(drm_dev);
> > +		return PTR_ERR(state);
> > +	}
> > +
> > +	priv->suspend_state = state;
> > 
> >  	return 0;
> >  
> >  }
> > 
> > @@ -740,10 +709,7 @@ static int omap_drm_resume(struct device *dev)
> > 
> >  	struct omap_drm_private *priv = dev_get_drvdata(dev);
> >  	struct drm_device *drm_dev = priv->ddev;
> > 
> > -	drm_modeset_lock_all(drm_dev);
> > -	omap_drm_resume_all_displays(drm_dev);
> > -	drm_modeset_unlock_all(drm_dev);
> > -
> > +	drm_atomic_helper_resume(drm_dev, priv->suspend_state);
> > 
> >  	drm_kms_helper_poll_enable(drm_dev);
> >  	
> >  	return omap_gem_resume(drm_dev);
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h
> > b/drivers/gpu/drm/omapdrm/omap_drv.h index bd7f2c227a25..788aa9f7e6df
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> > +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> > @@ -73,6 +73,8 @@ struct omap_drm_private {
> > 
> >  	struct workqueue_struct *wq;
> > 
> > +	struct drm_atomic_state *suspend_state;
> > +
> > 
> >  	/* lock for obj_list below */
> >  	struct mutex list_lock;

-- 
Regards,

Laurent Pinchart



_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-09 22:07   ` Sebastian Reichel
@ 2018-12-10  7:50     ` Laurent Pinchart
  2018-12-10 13:14       ` Sebastian Reichel
  0 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  7:50 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 10 December 2018 00:07:55 EET Sebastian Reichel wrote:
> On Wed, Dec 05, 2018 at 05:00:15PM +0200, Laurent Pinchart wrote:
> > The DISPC timings checks relate to the CRTC, but they're performed in
> > the encoder and connector .atomic_check() and .mode_valid() operations.
> > Move them to the CRTC .mode_valid() operation.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> 
> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> 
> This should also fix the issue with DSI in a less ugly way:
> 
> https://lists.freedesktop.org/archives/dri-devel/2018-November/196622.html

Should I add the

Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation directly")

tag to this patch ?

> >  drivers/gpu/drm/omapdrm/omap_connector.c | 6 ------
> >  drivers/gpu/drm/omapdrm/omap_crtc.c      | 9 +++++++++
> >  drivers/gpu/drm/omapdrm/omap_encoder.c   | 6 ------
> >  3 files changed, 9 insertions(+), 12 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c
> > b/drivers/gpu/drm/omapdrm/omap_connector.c index
> > 8db1f2fbcf43..dd1e0f2e8ffc 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> > @@ -245,8 +245,6 @@ static int omap_connector_mode_valid(struct
> > drm_connector *connector,> 
> >  				 struct drm_display_mode *mode)
> >  
> >  {
> >  
> >  	struct omap_connector *omap_connector = to_omap_connector(connector);
> > 
> > -	enum omap_channel channel = omap_connector->output->dispc_channel;
> > -	struct omap_drm_private *priv = connector->dev->dev_private;
> > 
> >  	struct omap_dss_device *dssdev;
> >  	struct videomode vm = {0};
> >  	struct drm_device *dev = connector->dev;
> > 
> > @@ -256,10 +254,6 @@ static int omap_connector_mode_valid(struct
> > drm_connector *connector,> 
> >  	drm_display_mode_to_videomode(mode, &vm);
> >  	mode->vrefresh = drm_mode_vrefresh(mode);
> > 
> > -	r = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> > -	if (r)
> > -		goto done;
> > -
> > 
> >  	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
> >  	
> >  		if (!dssdev->ops->check_timings)
> >  		
> >  			continue;
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > b/drivers/gpu/drm/omapdrm/omap_crtc.c index caffc547ef97..51036e6fca1c
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> > @@ -391,6 +391,15 @@ static enum drm_mode_status
> > omap_crtc_mode_valid(struct drm_crtc *crtc,> 
> >  					const struct drm_display_mode *mode)
> >  
> >  {
> >  
> >  	struct omap_drm_private *priv = crtc->dev->dev_private;
> > 
> > +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> > +	struct videomode vm = {0};
> > +	int r;
> > +
> > +	drm_display_mode_to_videomode(mode, &vm);
> > +	r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel,
> > +					       &vm);
> > +	if (r)
> > +		return r;
> > 
> >  	/* Check for bandwidth limit */
> >  	if (priv->max_bandwidth) {
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > b/drivers/gpu/drm/omapdrm/omap_encoder.c index 79ee927cd905..7d01df6fa723
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> > @@ -198,19 +198,13 @@ static int omap_encoder_atomic_check(struct
> > drm_encoder *encoder,> 
> >  				     struct drm_connector_state *conn_state)
> >  
> >  {
> >  
> >  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> > 
> > -	enum omap_channel channel = omap_encoder->output->dispc_channel;
> > 
> >  	struct drm_device *dev = encoder->dev;
> > 
> > -	struct omap_drm_private *priv = dev->dev_private;
> > 
> >  	struct omap_dss_device *dssdev;
> >  	struct videomode vm = { 0 };
> >  	int ret;
> >  	
> >  	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
> > 
> > -	ret = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> > -	if (ret)
> > -		goto done;
> > -
> > 
> >  	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
> >  	
> >  		if (!dssdev->ops->check_timings)
> >  		
> >  			continue;


-- 
Regards,

Laurent Pinchart



_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* [PATCH v1.1 04/29] drm/omap: Use atomic suspend/resume helpers
  2018-12-10  6:49     ` Laurent Pinchart
@ 2018-12-10  8:01       ` Laurent Pinchart
  2018-12-10 13:08         ` Sebastian Reichel
  0 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  8:01 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen, Sebastian Reichel

Instead of rolling out custom suspend/resume implementations based on
state information stored in the driver's data structures, use the atomic
suspend/resume helpers that rely on a DRM atomic state object.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Use drm_mode_config_helper_suspend()
---
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 --
 drivers/gpu/drm/omapdrm/omap_drv.c    | 50 ++-------------------------
 2 files changed, 2 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index d3b576e6edf5..149a0f09adbc 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -432,9 +432,6 @@ struct omap_dss_device {
 	unsigned long ops_flags;
 	unsigned long bus_flags;
 
-	/* helper variable for driver suspend/resume */
-	bool activate_after_resume;
-
 	enum omap_display_caps caps;
 
 	enum omap_dss_display_state state;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 5e67d58cbc28..8a4dd737d88c 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -685,54 +685,12 @@ static int pdev_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int omap_drm_suspend_all_displays(struct drm_device *ddev)
-{
-	struct omap_drm_private *priv = ddev->dev_private;
-	int i;
-
-	for (i = 0; i < priv->num_pipes; i++) {
-		struct omap_dss_device *display = priv->pipes[i].display;
-
-		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
-			display->ops->disable(display);
-			display->activate_after_resume = true;
-		} else {
-			display->activate_after_resume = false;
-		}
-	}
-
-	return 0;
-}
-
-static int omap_drm_resume_all_displays(struct drm_device *ddev)
-{
-	struct omap_drm_private *priv = ddev->dev_private;
-	int i;
-
-	for (i = 0; i < priv->num_pipes; i++) {
-		struct omap_dss_device *display = priv->pipes[i].display;
-
-		if (display->activate_after_resume) {
-			display->ops->enable(display);
-			display->activate_after_resume = false;
-		}
-	}
-
-	return 0;
-}
-
 static int omap_drm_suspend(struct device *dev)
 {
 	struct omap_drm_private *priv = dev_get_drvdata(dev);
 	struct drm_device *drm_dev = priv->ddev;
 
-	drm_kms_helper_poll_disable(drm_dev);
-
-	drm_modeset_lock_all(drm_dev);
-	omap_drm_suspend_all_displays(drm_dev);
-	drm_modeset_unlock_all(drm_dev);
-
-	return 0;
+	return drm_mode_config_helper_suspend(drm_dev);
 }
 
 static int omap_drm_resume(struct device *dev)
@@ -740,11 +698,7 @@ static int omap_drm_resume(struct device *dev)
 	struct omap_drm_private *priv = dev_get_drvdata(dev);
 	struct drm_device *drm_dev = priv->ddev;
 
-	drm_modeset_lock_all(drm_dev);
-	omap_drm_resume_all_displays(drm_dev);
-	drm_modeset_unlock_all(drm_dev);
-
-	drm_kms_helper_poll_enable(drm_dev);
+	drm_mode_config_helper_resume(drm_dev);
 
 	return omap_gem_resume(drm_dev);
 }
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* Re: [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings()
  2018-12-09 22:26   ` Sebastian Reichel
@ 2018-12-10  8:07     ` Laurent Pinchart
  0 siblings, 0 replies; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  8:07 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 10 December 2018 00:26:28 EET Sebastian Reichel wrote:
> On Wed, Dec 05, 2018 at 05:00:18PM +0200, Laurent Pinchart wrote:
> > The omap_dss_device .check_timings() and .set_timings() operations
> > operate on struct videomode, while the DRM API operates on struct
> > drm_display_mode. This forces conversion from to videomode in the
> > callers. While that's not a problem per se, it creates a difference with
> > the drm_bridge API.
> > 
> > Replace the videomode parameter to the .check_timings() and
> > .set_timings() operations with a drm_display_mode. This pushed the
> > conversion to videomode down to the DSS devices in some cases. If needed
> > they will be converted to operate on drm_display_mode natively.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> > [...]
> > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c
> > b/drivers/gpu/drm/omapdrm/omap_connector.c index
> > 9882a4b1402b..487603c56b08 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> > @@ -245,23 +245,19 @@ enum drm_mode_status
> > omap_connector_mode_fixup(struct omap_dss_device *dssdev,
> >  					const struct drm_display_mode *mode,
> >  					struct drm_display_mode *adjusted_mode)
 >  {
> > -	struct videomode vm = { 0 };
> >  	int ret;
> > 
> > -	drm_display_mode_to_videomode(mode, &vm);
> > +	drm_mode_copy(adjusted_mode, mode);
> 
> This will explode if adjusted_mode is NULL?

Correct, but this function should never (and is never as far as I can tell) 
called with adjusted_mode equal to NULL.

> >  	for (; dssdev; dssdev = dssdev->next) {
> >  		if (!dssdev->ops->check_timings)
> >  			continue;
> > 
> > -		ret = dssdev->ops->check_timings(dssdev, &vm);
> > +		ret = dssdev->ops->check_timings(dssdev, adjusted_mode);
> > 
> >  		if (ret)
> >  			return MODE_BAD;
> >  	}
> > 
> > -	if (adjusted_mode)
> > -		drm_display_mode_from_videomode(&vm, adjusted_mode);
> > -
> >  	return MODE_OK;
> >  }
> 
> Old code assumed, that adjusted_mode may be NULL. If adjusted_mode
> cannot be NULL, it should be mentioned in the patch description.

I will instead remove the check in the previous patch where it was needlessly 
introduced.

-- 
Regards,

Laurent Pinchart



_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 24/29] drm/omap: Factor out common mode validation code
  2018-12-09 22:19   ` Sebastian Reichel
@ 2018-12-10  8:27     ` Laurent Pinchart
  2018-12-10 13:16       ` Sebastian Reichel
  2018-12-10  8:27     ` [PATCH] " Laurent Pinchart
  1 sibling, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  8:27 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 10 December 2018 00:19:22 EET Sebastian Reichel wrote:
> Hi,
> 
> On Wed, Dec 05, 2018 at 05:00:17PM +0200, Laurent Pinchart wrote:
> > The encoder .atomic_check() and connector .mode_valid() operations both
> > walk through the dss devices in the pipeline to validate the mode.
> > Factor out the common code in a new omap_drm_connector_mode_fixup()
> > function.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> 
> This is a bit tricky to review. It would probably be easier to
> review, if the changes were split into two commits:
> 
> 1. introduce common function
> 2. move drm_display_mode/videomode conversion further up the stack

I agree that the connector changes are not very nicely formatted. I however 
don't like splitting patches, especially when small, in such a way.

One issue preventing a better diff formatting is the change from int to enum 
drm_mode_status for the omap_connector_mode_valid() function. Without that 
change, the patch can be better formatted with

git diff --anchored="static int omap_connector_mode_valid"

I agree it's still not perfect.

If you think the above change is worth it I'll submit a split version, 
otherwise I'll leave it as is.

> Anyways:
> 
> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> 
> -- Sebastian
> 
> >  drivers/gpu/drm/omapdrm/omap_connector.c | 55 +++++++++++++-----------
> >  drivers/gpu/drm/omapdrm/omap_connector.h |  5 +++
> >  drivers/gpu/drm/omapdrm/omap_encoder.c   | 30 ++++---------
> >  3 files changed, 45 insertions(+), 45 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c
> > b/drivers/gpu/drm/omapdrm/omap_connector.c index
> > dd1e0f2e8ffc..9882a4b1402b 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> > @@ -241,50 +241,57 @@ static int omap_connector_get_modes(struct
> > drm_connector *connector)> 
> >  	return 0;
> >  
> >  }
> > 
> > -static int omap_connector_mode_valid(struct drm_connector *connector,
> > -				 struct drm_display_mode *mode)
> > +enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device
> > *dssdev, +					const struct drm_display_mode *mode,
> > +					struct drm_display_mode *adjusted_mode)
> > 
> >  {
> > 
> > -	struct omap_connector *omap_connector = to_omap_connector(connector);
> > -	struct omap_dss_device *dssdev;
> > -	struct videomode vm = {0};
> > -	struct drm_device *dev = connector->dev;
> > -	struct drm_display_mode *new_mode;
> > -	int r, ret = MODE_BAD;
> > +	struct videomode vm = { 0 };
> > +	int ret;
> > 
> >  	drm_display_mode_to_videomode(mode, &vm);
> > 
> > -	mode->vrefresh = drm_mode_vrefresh(mode);
> > 
> > -	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
> > +	for (; dssdev; dssdev = dssdev->next) {
> > 
> >  		if (!dssdev->ops->check_timings)
> >  		
> >  			continue;
> > 
> > -		r = dssdev->ops->check_timings(dssdev, &vm);
> > -		if (r)
> > -			goto done;
> > +		ret = dssdev->ops->check_timings(dssdev, &vm);
> > +		if (ret)
> > +			return MODE_BAD;
> > 
> >  	}
> > 
> > -	/* check if vrefresh is still valid */
> > -	new_mode = drm_mode_duplicate(dev, mode);
> > -	if (!new_mode)
> > -		return MODE_BAD;
> > +	if (adjusted_mode)
> > +		drm_display_mode_from_videomode(&vm, adjusted_mode);
> > 
> > -	new_mode->clock = vm.pixelclock / 1000;
> > -	new_mode->vrefresh = 0;
> > -	if (mode->vrefresh == drm_mode_vrefresh(new_mode))
> > -		ret = MODE_OK;
> > -	drm_mode_destroy(dev, new_mode);
> > +	return MODE_OK;
> > +}
> > +
> > +static enum drm_mode_status omap_connector_mode_valid(struct
> > drm_connector *connector, +				 struct drm_display_mode *mode)
> > +{
> > +	struct omap_connector *omap_connector = to_omap_connector(connector);
> > +	struct drm_display_mode new_mode = { { 0 } };
> > +	enum drm_mode_status status;
> > +
> > +	status = omap_connector_mode_fixup(omap_connector->output, mode,
> > +					   &new_mode);
> > +	if (status != MODE_OK)
> > +		goto done;
> > +
> > +	/* Check if vrefresh is still valid. */
> > +	if (drm_mode_vrefresh(mode) != drm_mode_vrefresh(&new_mode))
> > +		status = MODE_NOCLOCK;
> > 
> >  done:
> >  	DBG("connector: mode %s: "
> >  	
> >  			"%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
> > 
> > -			(ret == MODE_OK) ? "valid" : "invalid",
> > +			(status == MODE_OK) ? "valid" : "invalid",
> > 
> >  			mode->base.id, mode->name, mode->vrefresh, mode->clock,
> >  			mode->hdisplay, mode->hsync_start,
> >  			mode->hsync_end, mode->htotal,
> >  			mode->vdisplay, mode->vsync_start,
> >  			mode->vsync_end, mode->vtotal, mode->type, mode->flags);
> > 
> > -	return ret;
> > +	return status;
> > 
> >  }
> >  
> >  static const struct drm_connector_funcs omap_connector_funcs = {
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h
> > b/drivers/gpu/drm/omapdrm/omap_connector.h index
> > 4a1dcd0f031b..6b7d4d95e32b 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_connector.h
> > +++ b/drivers/gpu/drm/omapdrm/omap_connector.h
> > @@ -22,6 +22,8 @@
> > 
> >  #include <linux/types.h>
> > 
> > +enum drm_mode_status;
> > +
> > 
> >  struct drm_connector;
> >  struct drm_device;
> >  struct drm_encoder;
> > 
> > @@ -34,5 +36,8 @@ struct drm_connector *omap_connector_init(struct
> > drm_device *dev,> 
> >  bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
> >  void omap_connector_enable_hpd(struct drm_connector *connector);
> >  void omap_connector_disable_hpd(struct drm_connector *connector);
> > 
> > +enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device
> > *dssdev, +					const struct drm_display_mode *mode,
> > +					struct drm_display_mode *adjusted_mode);
> > 
> >  #endif /* __OMAPDRM_CONNECTOR_H__ */
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > b/drivers/gpu/drm/omapdrm/omap_encoder.c index 7d01df6fa723..086963088201
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> > @@ -198,29 +198,17 @@ static int omap_encoder_atomic_check(struct
> > drm_encoder *encoder,> 
> >  				     struct drm_connector_state *conn_state)
> >  
> >  {
> >  
> >  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> > 
> > -	struct drm_device *dev = encoder->dev;
> > -	struct omap_dss_device *dssdev;
> > -	struct videomode vm = { 0 };
> > -	int ret;
> > -
> > -	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
> > -
> > -	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
> > -		if (!dssdev->ops->check_timings)
> > -			continue;
> > -
> > -		ret = dssdev->ops->check_timings(dssdev, &vm);
> > -		if (ret)
> > -			goto done;
> > +	enum drm_mode_status status;
> > +
> > +	status = omap_connector_mode_fixup(omap_encoder->output,
> > +					   &crtc_state->mode,
> > +					   &crtc_state->adjusted_mode);
> > +	if (status != MODE_OK) {
> > +		dev_err(encoder->dev->dev, "invalid timings: %d\n", status);
> > +		return -EINVAL;
> > 
> >  	}
> > 
> > -	drm_display_mode_from_videomode(&vm, &crtc_state->adjusted_mode);
> > -
> > -done:
> > -	if (ret)
> > -		dev_err(dev->dev, "invalid timings: %d\n", ret);
> > -
> > -	return ret;
> > +	return 0;
> > 
> >  }
> >  
> >  static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs =
> >  {


-- 
Regards,

Laurent Pinchart



_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* [PATCH] drm/omap: Factor out common mode validation code
  2018-12-09 22:19   ` Sebastian Reichel
  2018-12-10  8:27     ` Laurent Pinchart
@ 2018-12-10  8:27     ` Laurent Pinchart
  1 sibling, 0 replies; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10  8:27 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen, Sebastian Reichel

The encoder .atomic_check() and connector .mode_valid() operations both
walk through the dss devices in the pipeline to validate the mode.
Factor out the common code in a new omap_drm_connector_mode_fixup()
function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
---
Changes since v1:

- Remove unneeded NULL check for adjusted_mode in
  omap_connector_mode_fixup()
---
 drivers/gpu/drm/omapdrm/omap_connector.c | 54 +++++++++++++-----------
 drivers/gpu/drm/omapdrm/omap_connector.h |  5 +++
 drivers/gpu/drm/omapdrm/omap_encoder.c   | 30 ++++---------
 3 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index dd1e0f2e8ffc..b6433c55419e 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -241,50 +241,56 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 	return 0;
 }
 
-static int omap_connector_mode_valid(struct drm_connector *connector,
-				 struct drm_display_mode *mode)
+enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
+					const struct drm_display_mode *mode,
+					struct drm_display_mode *adjusted_mode)
 {
-	struct omap_connector *omap_connector = to_omap_connector(connector);
-	struct omap_dss_device *dssdev;
-	struct videomode vm = {0};
-	struct drm_device *dev = connector->dev;
-	struct drm_display_mode *new_mode;
-	int r, ret = MODE_BAD;
+	struct videomode vm = { 0 };
+	int ret;
 
 	drm_display_mode_to_videomode(mode, &vm);
-	mode->vrefresh = drm_mode_vrefresh(mode);
 
-	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
+	for (; dssdev; dssdev = dssdev->next) {
 		if (!dssdev->ops->check_timings)
 			continue;
 
-		r = dssdev->ops->check_timings(dssdev, &vm);
-		if (r)
-			goto done;
+		ret = dssdev->ops->check_timings(dssdev, &vm);
+		if (ret)
+			return MODE_BAD;
 	}
 
-	/* check if vrefresh is still valid */
-	new_mode = drm_mode_duplicate(dev, mode);
-	if (!new_mode)
-		return MODE_BAD;
+	drm_display_mode_from_videomode(&vm, adjusted_mode);
 
-	new_mode->clock = vm.pixelclock / 1000;
-	new_mode->vrefresh = 0;
-	if (mode->vrefresh == drm_mode_vrefresh(new_mode))
-		ret = MODE_OK;
-	drm_mode_destroy(dev, new_mode);
+	return MODE_OK;
+}
+
+static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *connector,
+				 struct drm_display_mode *mode)
+{
+	struct omap_connector *omap_connector = to_omap_connector(connector);
+	struct drm_display_mode new_mode = { { 0 } };
+	enum drm_mode_status status;
+
+	status = omap_connector_mode_fixup(omap_connector->output, mode,
+					   &new_mode);
+	if (status != MODE_OK)
+		goto done;
+
+	/* Check if vrefresh is still valid. */
+	if (drm_mode_vrefresh(mode) != drm_mode_vrefresh(&new_mode))
+		status = MODE_NOCLOCK;
 
 done:
 	DBG("connector: mode %s: "
 			"%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
-			(ret == MODE_OK) ? "valid" : "invalid",
+			(status == MODE_OK) ? "valid" : "invalid",
 			mode->base.id, mode->name, mode->vrefresh, mode->clock,
 			mode->hdisplay, mode->hsync_start,
 			mode->hsync_end, mode->htotal,
 			mode->vdisplay, mode->vsync_start,
 			mode->vsync_end, mode->vtotal, mode->type, mode->flags);
 
-	return ret;
+	return status;
 }
 
 static const struct drm_connector_funcs omap_connector_funcs = {
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
index 4a1dcd0f031b..6b7d4d95e32b 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.h
+++ b/drivers/gpu/drm/omapdrm/omap_connector.h
@@ -22,6 +22,8 @@
 
 #include <linux/types.h>
 
+enum drm_mode_status;
+
 struct drm_connector;
 struct drm_device;
 struct drm_encoder;
@@ -34,5 +36,8 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
 void omap_connector_enable_hpd(struct drm_connector *connector);
 void omap_connector_disable_hpd(struct drm_connector *connector);
+enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev,
+					const struct drm_display_mode *mode,
+					struct drm_display_mode *adjusted_mode);
 
 #endif /* __OMAPDRM_CONNECTOR_H__ */
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 7d01df6fa723..086963088201 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -198,29 +198,17 @@ static int omap_encoder_atomic_check(struct drm_encoder *encoder,
 				     struct drm_connector_state *conn_state)
 {
 	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-	struct drm_device *dev = encoder->dev;
-	struct omap_dss_device *dssdev;
-	struct videomode vm = { 0 };
-	int ret;
-
-	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
-
-	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
-		if (!dssdev->ops->check_timings)
-			continue;
-
-		ret = dssdev->ops->check_timings(dssdev, &vm);
-		if (ret)
-			goto done;
+	enum drm_mode_status status;
+
+	status = omap_connector_mode_fixup(omap_encoder->output,
+					   &crtc_state->mode,
+					   &crtc_state->adjusted_mode);
+	if (status != MODE_OK) {
+		dev_err(encoder->dev->dev, "invalid timings: %d\n", status);
+		return -EINVAL;
 	}
 
-	drm_display_mode_from_videomode(&vm, &crtc_state->adjusted_mode);
-
-done:
-	if (ret)
-		dev_err(dev->dev, "invalid timings: %d\n", ret);
-
-	return ret;
+	return 0;
 }
 
 static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields
  2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
                   ` (28 preceding siblings ...)
  2018-12-05 15:00 ` [PATCH 29/29] drm/omap: Refactor initialization sequence Laurent Pinchart
@ 2018-12-10 12:28 ` Laurent Pinchart
  2018-12-10 13:20   ` Sebastian Reichel
  29 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-10 12:28 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device type and output_type fields differ mostly for
historical reasons. The output_type field is required for all devices
but the display at the end of the pipeline, and must be set to
OMAP_DISPLAY_TYPE_NONE for the latter. The type field is required for
all devices but the internal encoder, for which it is ignored.

The only reason why the output_type field must be set to
OMAP_DISPLAY_TYPE_NONE for the display at the end of the pipeline is to
identify omap_dss_device instances corresponding to displays. This is
not documented and confusing.

Clean the code by adding a new display field to the omap_dss_device
structure to identify displays, and merge the type and output_type
fields.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  1 +
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  1 +
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  1 +
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  1 -
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  1 -
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  1 -
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  1 +
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  1 +
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  1 +
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  1 +
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  1 +
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  1 +
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  1 +
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  1 +
 drivers/gpu/drm/omapdrm/dss/base.c                 |  2 +-
 drivers/gpu/drm/omapdrm/dss/dpi.c                  |  2 +-
 drivers/gpu/drm/omapdrm/dss/dsi.c                  |  2 +-
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  2 +-
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  2 +-
 drivers/gpu/drm/omapdrm/dss/omapdss.h              | 14 +++++++++-----
 drivers/gpu/drm/omapdrm/dss/output.c               |  2 +-
 drivers/gpu/drm/omapdrm/dss/sdi.c                  |  2 +-
 drivers/gpu/drm/omapdrm/dss/venc.c                 |  2 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c                |  2 +-
 drivers/gpu/drm/omapdrm/omap_encoder.c             |  4 ++--
 25 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 1503563117f3..6c0561101874 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -56,6 +56,7 @@ static int tvc_probe(struct platform_device *pdev)
 	dssdev->ops = &tvc_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index bf5ee50ce5fe..fa3a69bf8a04 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -239,6 +239,7 @@ static int dvic_probe(struct platform_device *pdev)
 	dssdev->ops = &dvic_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 797da4a3f22e..68d6f6e44b03 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -140,6 +140,7 @@ static int hdmic_probe(struct platform_device *pdev)
 	dssdev->ops = &hdmic_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = ddata->hpd_gpio
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index fc5e0c47054d..29a5a130ebd1 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -88,7 +88,6 @@ static int opa362_probe(struct platform_device *pdev)
 	dssdev->ops = &opa362_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
-	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 82035078377a..fb88537de1cc 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -84,7 +84,6 @@ static int tfp410_probe(struct platform_device *pdev)
 	dssdev->ops = &tfp410_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
-	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_POSEDGE
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index ced36718a95f..bc03752d2762 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -167,7 +167,6 @@ static int tpd_probe(struct platform_device *pdev)
 	dssdev->ops = &tpd_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
-	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 3b3570cb0d9a..c95afbe90d77 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -150,6 +150,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->ops = &panel_dpi_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index d9f10f41ddfb..741a5e324767 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1272,6 +1272,7 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev->ops = &dsicm_ops;
 	dssdev->driver = &dsicm_dss_driver;
 	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index f37931bf1c5f..4133351924be 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -197,6 +197,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->dev = &spi->dev;
 	dssdev->ops = &lb035q02_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 8f2fb3d0492f..498a88307f04 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -192,6 +192,7 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->dev = &spi->dev;
 	dssdev->ops = &nec_8048_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 8d5d7f775b55..1e68e0d14f87 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -207,6 +207,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->ops = &sharp_ls_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index b8360cef3754..abee0b348cff 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -706,6 +706,7 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->dev = &spi->dev;
 	dssdev->ops = &acx565akm_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 721c5bb3bdef..5b4fbcc196bc 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -321,6 +321,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->dev = &spi->dev;
 	dssdev->ops = &td028ttec1_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 50960018dbe8..781dc8b0afe7 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -420,6 +420,7 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->dev = &spi->dev;
 	dssdev->ops = &tpo_td043_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
+	dssdev->display = true;
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(0);
 	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index d14abde3c5f0..81ea0f55cd75 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -207,7 +207,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 	dev_dbg(dst->dev, "disconnect\n");
 
 	if (!dst->id && !omapdss_device_is_connected(dst)) {
-		WARN_ON(dst->output_type);
+		WARN_ON(!dst->display);
 		return;
 	}
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 295bc3eeea80..cc78dfa07f04 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -634,7 +634,7 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 
 	out->dev = &dpi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_DPI;
-	out->output_type = OMAP_DISPLAY_TYPE_DPI;
+	out->type = OMAP_DISPLAY_TYPE_DPI;
 	out->dispc_channel = dpi_get_channel(dpi);
 	out->of_ports = BIT(port_num);
 	out->ops = &dpi_ops;
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 0ba4670fd6cf..fd5b37ba8562 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5112,7 +5112,7 @@ static int dsi_init_output(struct dsi_data *dsi)
 	out->id = dsi->module_id == 0 ?
 			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
 
-	out->output_type = OMAP_DISPLAY_TYPE_DSI;
+	out->type = OMAP_DISPLAY_TYPE_DSI;
 	out->name = dsi->module_id == 0 ? "dsi.0" : "dsi.1";
 	out->dispc_channel = dsi_get_channel(dsi);
 	out->ops = &dsi_ops;
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 4337380b1bf7..6339e2756b34 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -679,7 +679,7 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
 
 	out->dev = &hdmi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_HDMI;
-	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
+	out->type = OMAP_DISPLAY_TYPE_HDMI;
 	out->name = "hdmi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &hdmi_ops;
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index b94f884c5c1a..2955bbad13bb 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -663,7 +663,7 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
 
 	out->dev = &hdmi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_HDMI;
-	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
+	out->type = OMAP_DISPLAY_TYPE_HDMI;
 	out->name = "hdmi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &hdmi_ops;
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 33648445f50b..cc5b6eca3701 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -413,14 +413,18 @@ struct omap_dss_device {
 
 	struct list_head list;
 
+	/*
+	 * DSS type that this device generates (for DSS internal devices) or
+	 * requires (for external encoders, connectors and panels). Must be a
+	 * non-zero (different than OMAP_DISPLAY_TYPE_NONE) value.
+	 */
 	enum omap_display_type type;
+
 	/*
-	 * DSS output type that this device generates (for DSS internal devices)
-	 * or requires (for external encoders). Must be OMAP_DISPLAY_TYPE_NONE
-	 * for display devices (connectors and panels) and to non-zero value for
-	 * all other devices.
+	 * True if the device is a display (panel or connector) at the end of
+	 * the pipeline, false otherwise.
 	 */
-	enum omap_display_type output_type;
+	bool display;
 
 	const char *name;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 0ac400a521f3..f25ecfd26534 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -33,7 +33,7 @@ int omapdss_device_init_output(struct omap_dss_device *out)
 		return PTR_ERR(out->next);
 	}
 
-	if (out->next && out->output_type != out->next->type) {
+	if (out->next && out->type != out->next->type) {
 		dev_err(out->dev, "output type and display type don't match\n");
 		return -EINVAL;
 	}
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 38b0bf19538d..e7945322c471 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -272,7 +272,7 @@ static int sdi_init_output(struct sdi_device *sdi)
 
 	out->dev = &sdi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_SDI;
-	out->output_type = OMAP_DISPLAY_TYPE_SDI;
+	out->type = OMAP_DISPLAY_TYPE_SDI;
 	out->name = "sdi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
 	/* We have SDI only on OMAP3, where it's on port 1 */
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index f2cbecfd05b5..da43b865d973 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -760,7 +760,7 @@ static int venc_init_output(struct venc_device *venc)
 
 	out->dev = &venc->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_VENC;
-	out->output_type = OMAP_DISPLAY_TYPE_VENC;
+	out->type = OMAP_DISPLAY_TYPE_VENC;
 	out->name = "venc.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &venc_ops;
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 51036e6fca1c..0cea3824d3a6 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -129,7 +129,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
 	if (WARN_ON(omap_crtc->enabled == enable))
 		return;
 
-	if (omap_crtc->pipe->output->output_type == OMAP_DISPLAY_TYPE_HDMI) {
+	if (omap_crtc->pipe->output->type == OMAP_DISPLAY_TYPE_HDMI) {
 		priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
 		omap_crtc->enabled = enable;
 		return;
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 4fb8b3fbd688..21175499ecd1 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -153,7 +153,7 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
 	 * 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) {
+	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
 		dssdev->ops->disable(dssdev);
 		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 	}
@@ -181,7 +181,7 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
 	 * 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) {
+	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
 		dssdev->ops->enable(dssdev);
 		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 	}
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 75+ messages in thread

* Re: [PATCH v1.1 04/29] drm/omap: Use atomic suspend/resume helpers
  2018-12-10  8:01       ` [PATCH v1.1 " Laurent Pinchart
@ 2018-12-10 13:08         ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-10 13:08 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 3640 bytes --]

Hi,

On Mon, Dec 10, 2018 at 10:01:19AM +0200, Laurent Pinchart wrote:
> Instead of rolling out custom suspend/resume implementations based on
> state information stored in the driver's data structures, use the atomic
> suspend/resume helpers that rely on a DRM atomic state object.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

> Changes since v1:
> 
> - Use drm_mode_config_helper_suspend()
> ---
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 --
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 50 ++-------------------------
>  2 files changed, 2 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index d3b576e6edf5..149a0f09adbc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -432,9 +432,6 @@ struct omap_dss_device {
>  	unsigned long ops_flags;
>  	unsigned long bus_flags;
>  
> -	/* helper variable for driver suspend/resume */
> -	bool activate_after_resume;
> -
>  	enum omap_display_caps caps;
>  
>  	enum omap_dss_display_state state;
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 5e67d58cbc28..8a4dd737d88c 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -685,54 +685,12 @@ static int pdev_remove(struct platform_device *pdev)
>  }
>  
>  #ifdef CONFIG_PM_SLEEP
> -static int omap_drm_suspend_all_displays(struct drm_device *ddev)
> -{
> -	struct omap_drm_private *priv = ddev->dev_private;
> -	int i;
> -
> -	for (i = 0; i < priv->num_pipes; i++) {
> -		struct omap_dss_device *display = priv->pipes[i].display;
> -
> -		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
> -			display->ops->disable(display);
> -			display->activate_after_resume = true;
> -		} else {
> -			display->activate_after_resume = false;
> -		}
> -	}
> -
> -	return 0;
> -}
> -
> -static int omap_drm_resume_all_displays(struct drm_device *ddev)
> -{
> -	struct omap_drm_private *priv = ddev->dev_private;
> -	int i;
> -
> -	for (i = 0; i < priv->num_pipes; i++) {
> -		struct omap_dss_device *display = priv->pipes[i].display;
> -
> -		if (display->activate_after_resume) {
> -			display->ops->enable(display);
> -			display->activate_after_resume = false;
> -		}
> -	}
> -
> -	return 0;
> -}
> -
>  static int omap_drm_suspend(struct device *dev)
>  {
>  	struct omap_drm_private *priv = dev_get_drvdata(dev);
>  	struct drm_device *drm_dev = priv->ddev;
>  
> -	drm_kms_helper_poll_disable(drm_dev);
> -
> -	drm_modeset_lock_all(drm_dev);
> -	omap_drm_suspend_all_displays(drm_dev);
> -	drm_modeset_unlock_all(drm_dev);
> -
> -	return 0;
> +	return drm_mode_config_helper_suspend(drm_dev);
>  }
>  
>  static int omap_drm_resume(struct device *dev)
> @@ -740,11 +698,7 @@ static int omap_drm_resume(struct device *dev)
>  	struct omap_drm_private *priv = dev_get_drvdata(dev);
>  	struct drm_device *drm_dev = priv->ddev;
>  
> -	drm_modeset_lock_all(drm_dev);
> -	omap_drm_resume_all_displays(drm_dev);
> -	drm_modeset_unlock_all(drm_dev);
> -
> -	drm_kms_helper_poll_enable(drm_dev);
> +	drm_mode_config_helper_resume(drm_dev);
>  
>  	return omap_gem_resume(drm_dev);
>  }
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-10  7:50     ` Laurent Pinchart
@ 2018-12-10 13:14       ` Sebastian Reichel
  2018-12-11  1:07         ` Sebastian Reichel
  0 siblings, 1 reply; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-10 13:14 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 5288 bytes --]

Hi,

On Mon, Dec 10, 2018 at 09:50:08AM +0200, Laurent Pinchart wrote:
> Hi Sebastian,
> 
> On Monday, 10 December 2018 00:07:55 EET Sebastian Reichel wrote:
> > On Wed, Dec 05, 2018 at 05:00:15PM +0200, Laurent Pinchart wrote:
> > > The DISPC timings checks relate to the CRTC, but they're performed in
> > > the encoder and connector .atomic_check() and .mode_valid() operations.
> > > Move them to the CRTC .mode_valid() operation.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > ---
> > 
> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> > 
> > This should also fix the issue with DSI in a less ugly way:
> > 
> > https://lists.freedesktop.org/archives/dri-devel/2018-November/196622.html
> 
> Should I add the
> 
> Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation directly")
> 
> tag to this patch ?

I plan to test this series in combination with my DSI patches today
or tomorrow evening. If it works, probably the following should be
added to the patch description:

--------------------
As a side-effect this fixes DSI, which uses slightly different mode
configuration for the DSI encoder and the DISPC.

Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation directly")
--------------------

-- Sebastian

> > >  drivers/gpu/drm/omapdrm/omap_connector.c | 6 ------
> > >  drivers/gpu/drm/omapdrm/omap_crtc.c      | 9 +++++++++
> > >  drivers/gpu/drm/omapdrm/omap_encoder.c   | 6 ------
> > >  3 files changed, 9 insertions(+), 12 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c
> > > b/drivers/gpu/drm/omapdrm/omap_connector.c index
> > > 8db1f2fbcf43..dd1e0f2e8ffc 100644
> > > --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> > > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> > > @@ -245,8 +245,6 @@ static int omap_connector_mode_valid(struct
> > > drm_connector *connector,> 
> > >  				 struct drm_display_mode *mode)
> > >  
> > >  {
> > >  
> > >  	struct omap_connector *omap_connector = to_omap_connector(connector);
> > > 
> > > -	enum omap_channel channel = omap_connector->output->dispc_channel;
> > > -	struct omap_drm_private *priv = connector->dev->dev_private;
> > > 
> > >  	struct omap_dss_device *dssdev;
> > >  	struct videomode vm = {0};
> > >  	struct drm_device *dev = connector->dev;
> > > 
> > > @@ -256,10 +254,6 @@ static int omap_connector_mode_valid(struct
> > > drm_connector *connector,> 
> > >  	drm_display_mode_to_videomode(mode, &vm);
> > >  	mode->vrefresh = drm_mode_vrefresh(mode);
> > > 
> > > -	r = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> > > -	if (r)
> > > -		goto done;
> > > -
> > > 
> > >  	for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
> > >  	
> > >  		if (!dssdev->ops->check_timings)
> > >  		
> > >  			continue;
> > > 
> > > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > > b/drivers/gpu/drm/omapdrm/omap_crtc.c index caffc547ef97..51036e6fca1c
> > > 100644
> > > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> > > @@ -391,6 +391,15 @@ static enum drm_mode_status
> > > omap_crtc_mode_valid(struct drm_crtc *crtc,> 
> > >  					const struct drm_display_mode *mode)
> > >  
> > >  {
> > >  
> > >  	struct omap_drm_private *priv = crtc->dev->dev_private;
> > > 
> > > +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> > > +	struct videomode vm = {0};
> > > +	int r;
> > > +
> > > +	drm_display_mode_to_videomode(mode, &vm);
> > > +	r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel,
> > > +					       &vm);
> > > +	if (r)
> > > +		return r;
> > > 
> > >  	/* Check for bandwidth limit */
> > >  	if (priv->max_bandwidth) {
> > > 
> > > diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > > b/drivers/gpu/drm/omapdrm/omap_encoder.c index 79ee927cd905..7d01df6fa723
> > > 100644
> > > --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> > > +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> > > @@ -198,19 +198,13 @@ static int omap_encoder_atomic_check(struct
> > > drm_encoder *encoder,> 
> > >  				     struct drm_connector_state *conn_state)
> > >  
> > >  {
> > >  
> > >  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
> > > 
> > > -	enum omap_channel channel = omap_encoder->output->dispc_channel;
> > > 
> > >  	struct drm_device *dev = encoder->dev;
> > > 
> > > -	struct omap_drm_private *priv = dev->dev_private;
> > > 
> > >  	struct omap_dss_device *dssdev;
> > >  	struct videomode vm = { 0 };
> > >  	int ret;
> > >  	
> > >  	drm_display_mode_to_videomode(&crtc_state->mode, &vm);
> > > 
> > > -	ret = priv->dispc_ops->mgr_check_timings(priv->dispc, channel, &vm);
> > > -	if (ret)
> > > -		goto done;
> > > -
> > > 
> > >  	for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
> > >  	
> > >  		if (!dssdev->ops->check_timings)
> > >  		
> > >  			continue;
> 
> 
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> 
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 24/29] drm/omap: Factor out common mode validation code
  2018-12-10  8:27     ` Laurent Pinchart
@ 2018-12-10 13:16       ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-10 13:16 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1500 bytes --]

Hi Laurent,

On Mon, Dec 10, 2018 at 10:27:05AM +0200, Laurent Pinchart wrote:
> On Monday, 10 December 2018 00:19:22 EET Sebastian Reichel wrote:
> > On Wed, Dec 05, 2018 at 05:00:17PM +0200, Laurent Pinchart wrote:
> > > The encoder .atomic_check() and connector .mode_valid() operations both
> > > walk through the dss devices in the pipeline to validate the mode.
> > > Factor out the common code in a new omap_drm_connector_mode_fixup()
> > > function.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > ---
> > 
> > This is a bit tricky to review. It would probably be easier to
> > review, if the changes were split into two commits:
> > 
> > 1. introduce common function
> > 2. move drm_display_mode/videomode conversion further up the stack
> 
> I agree that the connector changes are not very nicely formatted. I however 
> don't like splitting patches, especially when small, in such a way.
> 
> One issue preventing a better diff formatting is the change from int to enum 
> drm_mode_status for the omap_connector_mode_valid() function. Without that 
> change, the patch can be better formatted with
> 
> git diff --anchored="static int omap_connector_mode_valid"
> 
> I agree it's still not perfect.
> 
> If you think the above change is worth it I'll submit a split version, 
> otherwise I'll leave it as is.

You don't have to change it for me. I just asked for better
formating in future patches.

-- Sebastian

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields
  2018-12-10 12:28 ` [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields Laurent Pinchart
@ 2018-12-10 13:20   ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-10 13:20 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 18845 bytes --]

Hi,

On Mon, Dec 10, 2018 at 02:28:43PM +0200, Laurent Pinchart wrote:
> The omap_dss_device type and output_type fields differ mostly for
> historical reasons. The output_type field is required for all devices
> but the display at the end of the pipeline, and must be set to
> OMAP_DISPLAY_TYPE_NONE for the latter. The type field is required for
> all devices but the internal encoder, for which it is ignored.
> 
> The only reason why the output_type field must be set to
> OMAP_DISPLAY_TYPE_NONE for the display at the end of the pipeline is to
> identify omap_dss_device instances corresponding to displays. This is
> not documented and confusing.
> 
> Clean the code by adding a new display field to the omap_dss_device
> structure to identify displays, and merge the type and output_type
> fields.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  1 +
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  1 +
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  1 +
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  1 -
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  1 -
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  1 -
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  1 +
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  1 +
>  .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  1 +
>  .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  1 +
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  1 +
>  .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  1 +
>  .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  1 +
>  .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  1 +
>  drivers/gpu/drm/omapdrm/dss/base.c                 |  2 +-
>  drivers/gpu/drm/omapdrm/dss/dpi.c                  |  2 +-
>  drivers/gpu/drm/omapdrm/dss/dsi.c                  |  2 +-
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  2 +-
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  2 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              | 14 +++++++++-----
>  drivers/gpu/drm/omapdrm/dss/output.c               |  2 +-
>  drivers/gpu/drm/omapdrm/dss/sdi.c                  |  2 +-
>  drivers/gpu/drm/omapdrm/dss/venc.c                 |  2 +-
>  drivers/gpu/drm/omapdrm/omap_crtc.c                |  2 +-
>  drivers/gpu/drm/omapdrm/omap_encoder.c             |  4 ++--
>  25 files changed, 31 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 1503563117f3..6c0561101874 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -56,6 +56,7 @@ static int tvc_probe(struct platform_device *pdev)
>  	dssdev->ops = &tvc_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index bf5ee50ce5fe..fa3a69bf8a04 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -239,6 +239,7 @@ static int dvic_probe(struct platform_device *pdev)
>  	dssdev->ops = &dvic_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 797da4a3f22e..68d6f6e44b03 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -140,6 +140,7 @@ static int hdmic_probe(struct platform_device *pdev)
>  	dssdev->ops = &hdmic_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = ddata->hpd_gpio
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index fc5e0c47054d..29a5a130ebd1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -88,7 +88,6 @@ static int opa362_probe(struct platform_device *pdev)
>  	dssdev->ops = &opa362_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
> -	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 82035078377a..fb88537de1cc 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -84,7 +84,6 @@ static int tfp410_probe(struct platform_device *pdev)
>  	dssdev->ops = &tfp410_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> -	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  	dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_POSEDGE
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index ced36718a95f..bc03752d2762 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -167,7 +167,6 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->ops = &tpd_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
> -	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 3b3570cb0d9a..c95afbe90d77 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -150,6 +150,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->ops = &panel_dpi_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index d9f10f41ddfb..741a5e324767 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1272,6 +1272,7 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev->ops = &dsicm_ops;
>  	dssdev->driver = &dsicm_dss_driver;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index f37931bf1c5f..4133351924be 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -197,6 +197,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->dev = &spi->dev;
>  	dssdev->ops = &lb035q02_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 8f2fb3d0492f..498a88307f04 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -192,6 +192,7 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->dev = &spi->dev;
>  	dssdev->ops = &nec_8048_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 8d5d7f775b55..1e68e0d14f87 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -207,6 +207,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->ops = &sharp_ls_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index b8360cef3754..abee0b348cff 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -706,6 +706,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->dev = &spi->dev;
>  	dssdev->ops = &acx565akm_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 721c5bb3bdef..5b4fbcc196bc 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -321,6 +321,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->dev = &spi->dev;
>  	dssdev->ops = &td028ttec1_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 50960018dbe8..781dc8b0afe7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -420,6 +420,7 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->dev = &spi->dev;
>  	dssdev->ops = &tpo_td043_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
> +	dssdev->display = true;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(0);
>  	dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index d14abde3c5f0..81ea0f55cd75 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -207,7 +207,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  	dev_dbg(dst->dev, "disconnect\n");
>  
>  	if (!dst->id && !omapdss_device_is_connected(dst)) {
> -		WARN_ON(dst->output_type);
> +		WARN_ON(!dst->display);
>  		return;
>  	}
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 295bc3eeea80..cc78dfa07f04 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -634,7 +634,7 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  
>  	out->dev = &dpi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_DPI;
> -	out->output_type = OMAP_DISPLAY_TYPE_DPI;
> +	out->type = OMAP_DISPLAY_TYPE_DPI;
>  	out->dispc_channel = dpi_get_channel(dpi);
>  	out->of_ports = BIT(port_num);
>  	out->ops = &dpi_ops;
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 0ba4670fd6cf..fd5b37ba8562 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5112,7 +5112,7 @@ static int dsi_init_output(struct dsi_data *dsi)
>  	out->id = dsi->module_id == 0 ?
>  			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
>  
> -	out->output_type = OMAP_DISPLAY_TYPE_DSI;
> +	out->type = OMAP_DISPLAY_TYPE_DSI;
>  	out->name = dsi->module_id == 0 ? "dsi.0" : "dsi.1";
>  	out->dispc_channel = dsi_get_channel(dsi);
>  	out->ops = &dsi_ops;
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 4337380b1bf7..6339e2756b34 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -679,7 +679,7 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
>  
>  	out->dev = &hdmi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_HDMI;
> -	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> +	out->type = OMAP_DISPLAY_TYPE_HDMI;
>  	out->name = "hdmi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &hdmi_ops;
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index b94f884c5c1a..2955bbad13bb 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -663,7 +663,7 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
>  
>  	out->dev = &hdmi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_HDMI;
> -	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> +	out->type = OMAP_DISPLAY_TYPE_HDMI;
>  	out->name = "hdmi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &hdmi_ops;
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 33648445f50b..cc5b6eca3701 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -413,14 +413,18 @@ struct omap_dss_device {
>  
>  	struct list_head list;
>  
> +	/*
> +	 * DSS type that this device generates (for DSS internal devices) or
> +	 * requires (for external encoders, connectors and panels). Must be a
> +	 * non-zero (different than OMAP_DISPLAY_TYPE_NONE) value.
> +	 */
>  	enum omap_display_type type;
> +
>  	/*
> -	 * DSS output type that this device generates (for DSS internal devices)
> -	 * or requires (for external encoders). Must be OMAP_DISPLAY_TYPE_NONE
> -	 * for display devices (connectors and panels) and to non-zero value for
> -	 * all other devices.
> +	 * True if the device is a display (panel or connector) at the end of
> +	 * the pipeline, false otherwise.
>  	 */
> -	enum omap_display_type output_type;
> +	bool display;
>  
>  	const char *name;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 0ac400a521f3..f25ecfd26534 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -33,7 +33,7 @@ int omapdss_device_init_output(struct omap_dss_device *out)
>  		return PTR_ERR(out->next);
>  	}
>  
> -	if (out->next && out->output_type != out->next->type) {
> +	if (out->next && out->type != out->next->type) {
>  		dev_err(out->dev, "output type and display type don't match\n");
>  		return -EINVAL;
>  	}
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 38b0bf19538d..e7945322c471 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -272,7 +272,7 @@ static int sdi_init_output(struct sdi_device *sdi)
>  
>  	out->dev = &sdi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_SDI;
> -	out->output_type = OMAP_DISPLAY_TYPE_SDI;
> +	out->type = OMAP_DISPLAY_TYPE_SDI;
>  	out->name = "sdi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
>  	/* We have SDI only on OMAP3, where it's on port 1 */
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index f2cbecfd05b5..da43b865d973 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -760,7 +760,7 @@ static int venc_init_output(struct venc_device *venc)
>  
>  	out->dev = &venc->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_VENC;
> -	out->output_type = OMAP_DISPLAY_TYPE_VENC;
> +	out->type = OMAP_DISPLAY_TYPE_VENC;
>  	out->name = "venc.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &venc_ops;
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 51036e6fca1c..0cea3824d3a6 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -129,7 +129,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
>  	if (WARN_ON(omap_crtc->enabled == enable))
>  		return;
>  
> -	if (omap_crtc->pipe->output->output_type == OMAP_DISPLAY_TYPE_HDMI) {
> +	if (omap_crtc->pipe->output->type == OMAP_DISPLAY_TYPE_HDMI) {
>  		priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
>  		omap_crtc->enabled = enable;
>  		return;
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index 4fb8b3fbd688..21175499ecd1 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -153,7 +153,7 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
>  	 * 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) {
> +	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
>  		dssdev->ops->disable(dssdev);
>  		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  	}
> @@ -181,7 +181,7 @@ static void omap_encoder_enable(struct drm_encoder *encoder)
>  	 * 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) {
> +	if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
>  		dssdev->ops->enable(dssdev);
>  		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
>  	}
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-10 13:14       ` Sebastian Reichel
@ 2018-12-11  1:07         ` Sebastian Reichel
  2018-12-11  8:06           ` Laurent Pinchart
  0 siblings, 1 reply; 75+ messages in thread
From: Sebastian Reichel @ 2018-12-11  1:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 2147 bytes --]

Hi,

On Mon, Dec 10, 2018 at 02:14:01PM +0100, Sebastian Reichel wrote:
> On Mon, Dec 10, 2018 at 09:50:08AM +0200, Laurent Pinchart wrote:
> > Hi Sebastian,
> > 
> > On Monday, 10 December 2018 00:07:55 EET Sebastian Reichel wrote:
> > > On Wed, Dec 05, 2018 at 05:00:15PM +0200, Laurent Pinchart wrote:
> > > > The DISPC timings checks relate to the CRTC, but they're performed in
> > > > the encoder and connector .atomic_check() and .mode_valid() operations.
> > > > Move them to the CRTC .mode_valid() operation.
> > > > 
> > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > > ---
> > > 
> > > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> > > 
> > > This should also fix the issue with DSI in a less ugly way:
> > > 
> > > https://lists.freedesktop.org/archives/dri-devel/2018-November/196622.html
> > 
> > Should I add the
> > 
> > Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation directly")
> > 
> > tag to this patch ?
> 
> I plan to test this series in combination with my DSI patches today
> or tomorrow evening. If it works, probably the following should be
> added to the patch description:
> 
> --------------------
> As a side-effect this fixes DSI, which uses slightly different mode
> configuration for the DSI encoder and the DISPC.
> 
> Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation directly")
> --------------------

I merged this series with my remaining DSI command mode patches
(btw. this series does not apply cleanly to master due to a recent
patch from Tomi). Unfortunately this patch does not fix the issue.
After this patch the mgr_check_timings() call in omap_crtc_mode_valid()
will fail.

The good news: The Droid 4 display worked again after dropping the
mgr_check_timings call as a quick hack. So the other patches from
this set are

Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>

The problem is, that DISPC timings for DSI are not directly
calculated from mode. Instead DSI code does some modifications
before applying the DISPC settings.

-- Sebastian

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-11  1:07         ` Sebastian Reichel
@ 2018-12-11  8:06           ` Laurent Pinchart
  2019-02-11 20:30             ` Sebastian Reichel
  0 siblings, 1 reply; 75+ messages in thread
From: Laurent Pinchart @ 2018-12-11  8:06 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

(CC'ing Daniel)

On Tuesday, 11 December 2018 03:07:45 EET Sebastian Reichel wrote:
> On Mon, Dec 10, 2018 at 02:14:01PM +0100, Sebastian Reichel wrote:
> > On Mon, Dec 10, 2018 at 09:50:08AM +0200, Laurent Pinchart wrote:
> >> On Monday, 10 December 2018 00:07:55 EET Sebastian Reichel wrote:
> >>> On Wed, Dec 05, 2018 at 05:00:15PM +0200, Laurent Pinchart wrote:
> >>>> The DISPC timings checks relate to the CRTC, but they're performed
> >>>> in the encoder and connector .atomic_check() and .mode_valid()
> >>>> operations. Move them to the CRTC .mode_valid() operation.
> >>>> 
> >>>> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >>>> ---
> >>> 
> >>> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> >>> 
> >>> This should also fix the issue with DSI in a less ugly way:
> >>> 
> >>> https://lists.freedesktop.org/archives/dri-devel/2018-November/196622.
> >>> html
> >> 
> >> Should I add the
> >> 
> >> Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation
> >> directly")
> >> 
> >> tag to this patch ?
> > 
> > I plan to test this series in combination with my DSI patches today
> > or tomorrow evening. If it works, probably the following should be
> > added to the patch description:
> > 
> > --------------------
> > As a side-effect this fixes DSI, which uses slightly different mode
> > configuration for the DSI encoder and the DISPC.
> > 
> > Fixes: 7c27fa57ef31 ("drm/omap: Call dispc timings check operation
> > directly")
> > --------------------
> 
> I merged this series with my remaining DSI command mode patches
> (btw. this series does not apply cleanly to master due to a recent
> patch from Tomi).

I'll fix that, thank you for the notice.

> Unfortunately this patch does not fix the issue. After this patch the
> mgr_check_timings() call in omap_crtc_mode_valid() will fail.
> 
> The good news: The Droid 4 display worked again after dropping the
> mgr_check_timings call as a quick hack. So the other patches from
> this set are
> 
> Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>

Thank you for testing this.

> The problem is, that DISPC timings for DSI are not directly
> calculated from mode. Instead DSI code does some modifications
> before applying the DISPC settings.

I wonder what the best way to fix this would be. DSI isn't so special in this 
regard, any encoder can modify modes, resulting in the CRTC outputting a mode 
significantly different than the mode being displayed. This is handled by the 
DRM helpers through the .mode_fixup() operations, which can mangle modes along 
the pipeline.

At atomic commit time the atomic helpers call .mode_valid() first, followed by 
.mode_fixup(). An easy fix would be to remove our .mode_valid() handlers 
completely and perform both fixup and validation in the .mode_fixup() 
handlers.

However, the .mode_valid() operations are also used in 
drm_helper_probe_single_connector_modes(), where no mode fixup is performed. 
We can't drop .mode_valid() for that code path (at least not as anything else 
than a hack). Daniel, what's the expected way to handle this ?

-- 
Regards,

Laurent Pinchart



_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

* Re: [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation
  2018-12-11  8:06           ` Laurent Pinchart
@ 2019-02-11 20:30             ` Sebastian Reichel
  0 siblings, 0 replies; 75+ messages in thread
From: Sebastian Reichel @ 2019-02-11 20:30 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1234 bytes --]

Hi,

ping & actually add the cc :)

-- Sebastian

On Tue, Dec 11, 2018 at 10:06:07AM +0200, Laurent Pinchart wrote:
>> The problem is, that DISPC timings for DSI are not directly
>> calculated from mode. Instead DSI code does some modifications
>> before applying the DISPC settings.
> 
> I wonder what the best way to fix this would be. DSI isn't so special in this 
> regard, any encoder can modify modes, resulting in the CRTC outputting a mode 
> significantly different than the mode being displayed. This is handled by the 
> DRM helpers through the .mode_fixup() operations, which can mangle modes along 
> the pipeline.
> 
> At atomic commit time the atomic helpers call .mode_valid() first, followed by 
> .mode_fixup(). An easy fix would be to remove our .mode_valid() handlers 
> completely and perform both fixup and validation in the .mode_fixup() 
> handlers.
> 
> However, the .mode_valid() operations are also used in 
> drm_helper_probe_single_connector_modes(), where no mode fixup is performed. 
> We can't drop .mode_valid() for that code path (at least not as anything else 
> than a hack). Daniel, what's the expected way to handle this ?
> 
> -- 
> Regards,
> 
> Laurent Pinchart

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 75+ messages in thread

end of thread, other threads:[~2019-02-11 20:38 UTC | newest]

Thread overview: 75+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-05 14:59 [PATCH 00/29] omapdrm: Last large refactoring for drm_bridge transition Laurent Pinchart
2018-12-05 14:59 ` [PATCH 01/29] drm/omap: Remove declaration of nonexisting function Laurent Pinchart
2018-12-09 21:44   ` Sebastian Reichel
2018-12-05 14:59 ` [PATCH 02/29] drm/omap: Remove unused kobj field from struct omap_dss_device Laurent Pinchart
2018-12-09 21:44   ` Sebastian Reichel
2018-12-05 14:59 ` [PATCH 03/29] drm/omap: venc: Remove wss_data field from venc_device structure Laurent Pinchart
2018-12-09 21:45   ` Sebastian Reichel
2018-12-05 14:59 ` [PATCH 04/29] drm/omap: Use atomic suspend/resume helpers Laurent Pinchart
2018-12-09 21:53   ` Sebastian Reichel
2018-12-10  6:49     ` Laurent Pinchart
2018-12-10  8:01       ` [PATCH v1.1 " Laurent Pinchart
2018-12-10 13:08         ` Sebastian Reichel
2018-12-05 14:59 ` [PATCH 05/29] drm/omap: Move common display enable/disable code to encoder Laurent Pinchart
2018-12-09 21:53   ` Sebastian Reichel
2018-12-05 14:59 ` [PATCH 06/29] drm/omap: Remove connection checks from internal encoders .enable() Laurent Pinchart
2018-12-09 21:54   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 07/29] drm/omap: Remove connection checks from display .enable() and .remove() Laurent Pinchart
2018-12-09 21:54   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 08/29] drm/omap: Remove enable " Laurent Pinchart
2018-12-09 21:55   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 09/29] drm/omap: Reverse direction of the DSS device enable/disable operations Laurent Pinchart
2018-12-09 21:59   ` Sebastian Reichel
2018-12-10  1:01   ` [PATCH v1.1 " Laurent Pinchart
2018-12-05 15:00 ` [PATCH 10/29] drm/omap: Remove omap_dss_device dst field Laurent Pinchart
2018-12-09 22:00   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 11/29] drm/omap: Factor out common init/cleanup code for output devices Laurent Pinchart
2018-12-09 22:01   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 12/29] drm/omap: Expose DRM modes instead of timings in display devices Laurent Pinchart
2018-12-09 22:02   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 13/29] drm/omap: Merge display .get_modes() and .get_size() operations Laurent Pinchart
2018-12-09 22:02   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 14/29] drm/omap: Add a dss device operation flag for .get_modes() Laurent Pinchart
2018-12-09 22:02   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 15/29] drm/omap: venc: List both PAL and NTSC modes Laurent Pinchart
2018-12-09 22:03   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 16/29] drm/omap: Don't pass display pointer to encoder init function Laurent Pinchart
2018-12-09 22:03   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 17/29] drm/omap: Move display alias ID to omap_drm_pipeline Laurent Pinchart
2018-12-09 22:03   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure Laurent Pinchart
2018-12-09 22:04   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 19/29] drm/omap: panel-dsi-cm: Store source pointer internally Laurent Pinchart
2018-12-09 22:04   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 20/29] drm/omap: Notify all devices in the pipeline of output disconnection Laurent Pinchart
2018-12-09 22:04   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 21/29] drm/omap: Remove src field from omap_dss_device structure Laurent Pinchart
2018-12-09 22:04   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 22/29] drm/omap: Move DISPC timing checks to CRTC .mode_valid() operation Laurent Pinchart
2018-12-09 22:07   ` Sebastian Reichel
2018-12-10  7:50     ` Laurent Pinchart
2018-12-10 13:14       ` Sebastian Reichel
2018-12-11  1:07         ` Sebastian Reichel
2018-12-11  8:06           ` Laurent Pinchart
2019-02-11 20:30             ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 23/29] drm/omap: venc: Simplify mode setting by caching configuration Laurent Pinchart
2018-12-09 22:08   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 24/29] drm/omap: Factor out common mode validation code Laurent Pinchart
2018-12-09 22:19   ` Sebastian Reichel
2018-12-10  8:27     ` Laurent Pinchart
2018-12-10 13:16       ` Sebastian Reichel
2018-12-10  8:27     ` [PATCH] " Laurent Pinchart
2018-12-05 15:00 ` [PATCH 25/29] drm/omap: Pass drm_display_mode to .check_timings() and .set_timings() Laurent Pinchart
2018-12-09 22:26   ` Sebastian Reichel
2018-12-10  8:07     ` Laurent Pinchart
2018-12-05 15:00 ` [PATCH 26/29] drm/omap: venc: Use drm_display_mode natively Laurent Pinchart
2018-12-06 16:23   ` [PATCH v1.1 " Laurent Pinchart
2018-12-09 22:27     ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 27/29] drm/omap: Store pixel clock instead of full mode in DPI and SDI encoders Laurent Pinchart
2018-12-09 22:27   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 28/29] drm/omap: Simplify OF lookup of DSS devices Laurent Pinchart
2018-12-09 22:27   ` Sebastian Reichel
2018-12-05 15:00 ` [PATCH 29/29] drm/omap: Refactor initialization sequence Laurent Pinchart
2018-12-09 22:27   ` Sebastian Reichel
2018-12-10 12:28 ` [PATCH 30/29] drm/omap: Merge omap_dss_device type and output_type fields Laurent Pinchart
2018-12-10 13:20   ` Sebastian Reichel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.