All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations
@ 2018-05-26 17:24 Laurent Pinchart
  2018-05-26 17:24 ` [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step Laurent Pinchart
                   ` (60 more replies)
  0 siblings, 61 replies; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Hello,

This patch series is a first step towards moving the omapdrm driver away from
the custom bridge and panel drivers to drm_bridge and drm_panel.

The main blocker to transition to drm_bridge and drm_panel is the direction of
the bridge operations. While the omapdrm driver manages its components from
sink to source (panel to DSS output), the drm_bridge API is manages bridges in
the source to sink direction. This makes the two models incompatible, and
requires reversing the direction of operations inside omapdrm.

Don't rejoice too fast, we're still far from a complete transition, but this
first step paves the way by reworking the driver's internals to make source to
sink order possible. It then transitions the connect and disconnect operations
(the omapdrm equivalent of the drm_bridge attach and detach operations) to the
new direction.

The series contains patches previously posted by Jyri and Peter that I have
found helpful. Please see the individual patches for changes compared to the
original versions (trivial conflict resolutions caused by a rebase are not
mentioned).

The patches are based on top of the "[PATCH v2 0/6] omapdrm: struct_mutex
removal" patch series I've sent yesterday, itself based on top of Dave's
drm-next branch. They can be found at

        git://linuxtv.org/pinchartl/media.git omapdrm/bridge

The series has been tested on a Pandaboard with the HDMI and DVI outputs, and
on a TI AM57xx EVM with the LCD and HDMI outputs. All patches have been tested
individually on the Pandaboard.

Compared to v1, patch "drm/omap: dss: Remove omapdss_hdmi_ops set_infoframe
operation" has been dropped, and patch "drm/omap: dss: Handle DPI and SDI port
initialization failures" added. Other small changes are documented in
individual patches.

Jyri Sarha (1):
  drm/omap: dss: Move platform_device_register from core.c to dss.c
    probe

Laurent Pinchart (55):
  drm/omap: dss: Gather OMAP DSS components at probe time
  drm/omap: dss: Handle DPI and SDI port initialization failures
  drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations
  drm/omap: dss: Remove DSS encoders get_timings operation
  drm/omap: dss: Remove unused omapdss_default_get_timings()
  drm/omap: dss: Constify omap_dss_driver operations structure
  drm/omap: displays: Remove videomode from omap_dss_device structure
  drm/omap: dss: Remove omap_dss_device panel fields
  drm/omap: dss: Rename omap_dss_device list field to output_list
  drm/omap: dss: Create global list of all omap_dss_device instances
  drm/omap: dss: Create and use omapdss_device_is_registered()
  drm/omap: dss: Rework output lookup by port node
  drm/omap: dss: Allow looking up any device by port
  drm/omap: dss: Move common device operations to common structure
  drm/omap: dss: Add functions to connect and disconnect devices
  drm/omap: dss: Move debug message and checks to connection handlers
  drm/omap: dss: Move src and dst check and set to connection handlers
  drm/omap: displays: Remove input omap_dss_device from panel data
  drm/omap: dsi: Simplify debugfs implementation
  drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files
  drm/omap: dss: Remove output devices list
  drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display
  drm/omap: dss: Make omap_dss_get_next_device() more generic
  drm/omap: dss: Split omapdss_register_display()
  drm/omap: dss: Remove panel devices list
  drm/omap: dss: Move and rename omap_dss_(get|put)_device()
  drm/omap: dss: Store dss_device pointer in omap_dss_device
  drm/omap: dss: Move DSS mgr ops and private data to dss_device
  drm/omap: dss: Modify omapdss_find_output_from_display() to return
    channel
  drm/omap: dss: Replace omap_dss_device port number with bitmask
  drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks
  drm/omap: displays: Don't cast dssdev to panel data unnecessarily
  drm/omap: dss: Cleanup error paths in output init functions
  drm/omap: dss: dsi: Move initialization code from bind to probe
  drm/omap: dss: hdmi4: Move initialization code from bind to probe
  drm/omap: dss: hdmi5: Move initialization code from bind to probe
  drm/omap: dss: venc: Move initialization code from bind to probe
  drm/omap: dss: Acquire next dssdev at probe time
  drm/omap: dss: Add for_each_dss_output() macro
  drm/omap: dss: Add function to retrieve display for an output
  drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect()
  drm/omap: dss: Get regulators at probe time
  drm/omap: Remove unneeded variable assignments in omap_modeset_init
  drm/omap: Create all planes before CRTCs
  drm/omap: Group CRTC, encoder, connector and dssdev in a structure
  drm/omap: Reverse direction of DSS device (dis)connect operations
  drm/omap: dss: Move connection checks to omapdss_device_(dis)connect
  drm/omap: dss: Move display type validation to initialization time
  drm/omap: dss: Merge two disconnection helpers
  drm/omap: Pass pipe pointer to omap_crtc_init()
  drm/omap: Store CRTC lookup by channel table in omap_drm_private
  drm/omap: Remove omap_crtc_output global array
  drm/omap: Remove supported output check in CRTC connect handler
  drm/omap: Set dispc_channel_connect from DSS output connect handlers
  drm/omap: dss: Remove the dss_mgr_(dis)connect() operations

Peter Ujfalusi (4):
  drm/omap: Allocate drm_device earlier and unref it as last step
  drm/omap: Manage the usable omap_dss_device list within
    omap_drm_private
  drm/omap: Do dss_device (display) ordering in omap_drv.c
  drm/omap: dss: Remove display ordering from dss/display.c

 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  95 +---
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  78 +--
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  | 122 ++---
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  | 113 ++---
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  | 107 ++---
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   | 146 +++---
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  73 +--
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 237 ++++-----
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  71 +--
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  71 +--
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  71 +--
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  90 +---
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  71 +--
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  87 +---
 drivers/gpu/drm/omapdrm/dss/base.c                 | 225 ++++++++-
 drivers/gpu/drm/omapdrm/dss/core.c                 |  26 +-
 drivers/gpu/drm/omapdrm/dss/dispc.c                |   8 -
 drivers/gpu/drm/omapdrm/dss/display.c              | 134 +-----
 drivers/gpu/drm/omapdrm/dss/dpi.c                  | 172 +++----
 drivers/gpu/drm/omapdrm/dss/dsi.c                  | 527 ++++++++++-----------
 drivers/gpu/drm/omapdrm/dss/dss-of.c               |  47 +-
 drivers/gpu/drm/omapdrm/dss/dss.c                  |  40 +-
 drivers/gpu/drm/omapdrm/dss/dss.h                  |   8 +-
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                | 328 ++++++-------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                | 311 ++++++------
 drivers/gpu/drm/omapdrm/dss/omapdss.h              | 225 +++------
 drivers/gpu/drm/omapdrm/dss/output.c               | 208 ++------
 drivers/gpu/drm/omapdrm/dss/sdi.c                  | 113 ++---
 drivers/gpu/drm/omapdrm/dss/venc.c                 | 252 ++++------
 drivers/gpu/drm/omapdrm/omap_connector.c           |  10 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c                |  78 +--
 drivers/gpu/drm/omapdrm/omap_crtc.h                |   6 +-
 drivers/gpu/drm/omapdrm/omap_drv.c                 | 296 +++++++-----
 drivers/gpu/drm/omapdrm/omap_drv.h                 |  19 +-
 drivers/gpu/drm/omapdrm/omap_encoder.c             |   6 +-
 drivers/gpu/drm/omapdrm/omap_fbdev.c               |   4 +-
 drivers/gpu/drm/omapdrm/omap_irq.c                 |   4 +-
 37 files changed, 1800 insertions(+), 2679 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] 127+ messages in thread

* [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 14:16   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private Laurent Pinchart
                   ` (59 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

From: Peter Ujfalusi <peter.ujfalusi@ti.com>

If we allocate the drm_device earlier we can just return the error code
without the need to use goto.
Do the unref of the drm_device as a last step when cleaning up. This will
make the drm_device available longer for us and makes sure that we only
free up the memory when all other cleanups have been already done.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 5005ecc284d2..244ed3707589 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -525,6 +525,14 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 
 	DBG("%s", dev_name(dev));
 
+	/* Allocate and initialize the DRM device. */
+	ddev = drm_dev_alloc(&omap_drm_driver, dev);
+	if (IS_ERR(ddev))
+		return PTR_ERR(ddev);
+
+	priv->ddev = ddev;
+	ddev->dev_private = priv;
+
 	priv->dev = dev;
 	priv->dss = omapdss_get_dss();
 	priv->dispc = dispc_get_dispc(priv->dss);
@@ -543,16 +551,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	mutex_init(&priv->list_lock);
 	INIT_LIST_HEAD(&priv->obj_list);
 
-	/* Allocate and initialize the DRM device. */
-	ddev = drm_dev_alloc(&omap_drm_driver, priv->dev);
-	if (IS_ERR(ddev)) {
-		ret = PTR_ERR(ddev);
-		goto err_destroy_wq;
-	}
-
-	priv->ddev = ddev;
-	ddev->dev_private = priv;
-
 	/* Get memory bandwidth limits */
 	if (priv->dispc_ops->get_memory_bandwidth_limit)
 		priv->max_bandwidth =
@@ -563,7 +561,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	ret = omap_modeset_init(ddev);
 	if (ret) {
 		dev_err(priv->dev, "omap_modeset_init failed: ret=%d\n", ret);
-		goto err_free_drm_dev;
+		goto err_gem_deinit;
 	}
 
 	/* Initialize vblank handling, start with all CRTCs disabled. */
@@ -599,14 +597,13 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 err_cleanup_modeset:
 	drm_mode_config_cleanup(ddev);
 	omap_drm_irq_uninstall(ddev);
-err_free_drm_dev:
+err_gem_deinit:
 	omap_gem_deinit(ddev);
-	drm_dev_unref(ddev);
-err_destroy_wq:
 	destroy_workqueue(priv->wq);
 	omap_disconnect_dssdevs();
 err_crtc_uninit:
 	omap_crtc_pre_uninit();
+	drm_dev_unref(ddev);
 	return ret;
 }
 
@@ -630,12 +627,12 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
 	omap_drm_irq_uninstall(ddev);
 	omap_gem_deinit(ddev);
 
-	drm_dev_unref(ddev);
-
 	destroy_workqueue(priv->wq);
 
 	omap_disconnect_dssdevs();
 	omap_crtc_pre_uninit();
+
+	drm_dev_unref(ddev);
 }
 
 static int pdev_probe(struct platform_device *pdev)
-- 
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] 127+ messages in thread

* [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
  2018-05-26 17:24 ` [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 15:19   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c Laurent Pinchart
                   ` (58 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

From: Peter Ujfalusi <peter.ujfalusi@ti.com>

Instead of reaching back to DSS to iterate through the dss_devices every
time, use an internal array where we store the available and usable
dss_devices.

At the same time remove the omapdss_device_is_connected() check from
omap_modeset_init() as it became irrelevant: We are not adding dssdevs
if their connect failed.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v0:

- Make loop counter unsigned
---
 drivers/gpu/drm/omapdrm/omap_drv.c | 94 ++++++++++++++++++++++++--------------
 drivers/gpu/drm/omapdrm/omap_drv.h |  3 ++
 2 files changed, 62 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 244ed3707589..9277aa8c49c0 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -149,18 +149,27 @@ static int get_connector_type(struct omap_dss_device *dssdev)
 	}
 }
 
-static void omap_disconnect_dssdevs(void)
+static void omap_disconnect_dssdevs(struct drm_device *ddev)
 {
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_drm_private *priv = ddev->dev_private;
+	unsigned int i;
+
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-	for_each_dss_dev(dssdev)
 		dssdev->driver->disconnect(dssdev);
+		priv->dssdevs[i] = NULL;
+		omap_dss_put_device(dssdev);
+	}
+
+	priv->num_dssdevs = 0;
 }
 
-static int omap_connect_dssdevs(void)
+static int omap_connect_dssdevs(struct drm_device *ddev)
 {
-	int r;
+	struct omap_drm_private *priv = ddev->dev_private;
 	struct omap_dss_device *dssdev = NULL;
+	int r;
 
 	if (!omapdss_stack_is_ready())
 		return -EPROBE_DEFER;
@@ -173,6 +182,14 @@ static int omap_connect_dssdevs(void)
 		} else if (r) {
 			dev_warn(dssdev->dev, "could not connect display: %s\n",
 				dssdev->name);
+		} else {
+			omap_dss_get_device(dssdev);
+			priv->dssdevs[priv->num_dssdevs++] = dssdev;
+			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
+				/* To balance the 'for_each_dss_dev' loop */
+				omap_dss_put_device(dssdev);
+				break;
+			}
 		}
 	}
 
@@ -183,7 +200,7 @@ static int omap_connect_dssdevs(void)
 	 * if we are deferring probe, we disconnect the devices we previously
 	 * connected
 	 */
-	omap_disconnect_dssdevs();
+	omap_disconnect_dssdevs(ddev);
 
 	return r;
 }
@@ -208,6 +225,7 @@ static int omap_modeset_init(struct drm_device *dev)
 	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
 	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
 	int num_crtcs, crtc_idx, plane_idx;
+	unsigned int i;
 	int ret;
 	u32 plane_crtc_mask;
 
@@ -225,11 +243,7 @@ static int omap_modeset_init(struct drm_device *dev)
 	 * configuration does not match the expectations or exceeds
 	 * the available resources, the configuration is rejected.
 	 */
-	num_crtcs = 0;
-	for_each_dss_dev(dssdev)
-		if (omapdss_device_is_connected(dssdev))
-			num_crtcs++;
-
+	num_crtcs = priv->num_dssdevs;
 	if (num_crtcs > num_mgrs || num_crtcs > num_ovls ||
 	    num_crtcs > ARRAY_SIZE(priv->crtcs) ||
 	    num_crtcs > ARRAY_SIZE(priv->planes) ||
@@ -247,15 +261,13 @@ static int omap_modeset_init(struct drm_device *dev)
 
 	crtc_idx = 0;
 	plane_idx = 0;
-	for_each_dss_dev(dssdev) {
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 		struct drm_connector *connector;
 		struct drm_encoder *encoder;
 		struct drm_plane *plane;
 		struct drm_crtc *crtc;
 
-		if (!omapdss_device_is_connected(dssdev))
-			continue;
-
 		encoder = omap_encoder_init(dev, dssdev);
 		if (!encoder)
 			return -ENOMEM;
@@ -335,11 +347,14 @@ static int omap_modeset_init(struct drm_device *dev)
 /*
  * Enable the HPD in external components if supported
  */
-static void omap_modeset_enable_external_hpd(void)
+static void omap_modeset_enable_external_hpd(struct drm_device *ddev)
 {
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_drm_private *priv = ddev->dev_private;
+	int i;
+
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-	for_each_dss_dev(dssdev) {
 		if (dssdev->driver->enable_hpd)
 			dssdev->driver->enable_hpd(dssdev);
 	}
@@ -348,11 +363,14 @@ static void omap_modeset_enable_external_hpd(void)
 /*
  * Disable the HPD in external components if supported
  */
-static void omap_modeset_disable_external_hpd(void)
+static void omap_modeset_disable_external_hpd(struct drm_device *ddev)
 {
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_drm_private *priv = ddev->dev_private;
+	int i;
+
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-	for_each_dss_dev(dssdev) {
 		if (dssdev->driver->disable_hpd)
 			dssdev->driver->disable_hpd(dssdev);
 	}
@@ -540,7 +558,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 
 	omap_crtc_pre_init(priv);
 
-	ret = omap_connect_dssdevs();
+	ret = omap_connect_dssdevs(ddev);
 	if (ret)
 		goto err_crtc_uninit;
 
@@ -577,7 +595,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	omap_fbdev_init(ddev);
 
 	drm_kms_helper_poll_init(ddev);
-	omap_modeset_enable_external_hpd();
+	omap_modeset_enable_external_hpd(ddev);
 
 	/*
 	 * Register the DRM device with the core and the connectors with
@@ -590,7 +608,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	return 0;
 
 err_cleanup_helpers:
-	omap_modeset_disable_external_hpd();
+	omap_modeset_disable_external_hpd(ddev);
 	drm_kms_helper_poll_fini(ddev);
 
 	omap_fbdev_fini(ddev);
@@ -600,7 +618,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 err_gem_deinit:
 	omap_gem_deinit(ddev);
 	destroy_workqueue(priv->wq);
-	omap_disconnect_dssdevs();
+	omap_disconnect_dssdevs(ddev);
 err_crtc_uninit:
 	omap_crtc_pre_uninit();
 	drm_dev_unref(ddev);
@@ -615,7 +633,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
 
 	drm_dev_unregister(ddev);
 
-	omap_modeset_disable_external_hpd();
+	omap_modeset_disable_external_hpd(ddev);
 	drm_kms_helper_poll_fini(ddev);
 
 	omap_fbdev_fini(ddev);
@@ -629,7 +647,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
 
 	destroy_workqueue(priv->wq);
 
-	omap_disconnect_dssdevs();
+	omap_disconnect_dssdevs(ddev);
 	omap_crtc_pre_uninit();
 
 	drm_dev_unref(ddev);
@@ -674,11 +692,14 @@ static int pdev_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int omap_drm_suspend_all_displays(void)
+static int omap_drm_suspend_all_displays(struct drm_device *ddev)
 {
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_drm_private *priv = ddev->dev_private;
+	int i;
+
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-	for_each_dss_dev(dssdev) {
 		if (!dssdev->driver)
 			continue;
 
@@ -693,11 +714,14 @@ static int omap_drm_suspend_all_displays(void)
 	return 0;
 }
 
-static int omap_drm_resume_all_displays(void)
+static int omap_drm_resume_all_displays(struct drm_device *ddev)
 {
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_drm_private *priv = ddev->dev_private;
+	int i;
+
+	for (i = 0; i < priv->num_dssdevs; i++) {
+		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-	for_each_dss_dev(dssdev) {
 		if (!dssdev->driver)
 			continue;
 
@@ -718,7 +742,7 @@ static int omap_drm_suspend(struct device *dev)
 	drm_kms_helper_poll_disable(drm_dev);
 
 	drm_modeset_lock_all(drm_dev);
-	omap_drm_suspend_all_displays();
+	omap_drm_suspend_all_displays(drm_dev);
 	drm_modeset_unlock_all(drm_dev);
 
 	return 0;
@@ -730,7 +754,7 @@ static int omap_drm_resume(struct device *dev)
 	struct drm_device *drm_dev = priv->ddev;
 
 	drm_modeset_lock_all(drm_dev);
-	omap_drm_resume_all_displays();
+	omap_drm_resume_all_displays(drm_dev);
 	drm_modeset_unlock_all(drm_dev);
 
 	drm_kms_helper_poll_enable(drm_dev);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index f27c8e216adf..006c868c528d 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -54,6 +54,9 @@ struct omap_drm_private {
 	struct dispc_device *dispc;
 	const struct dispc_ops *dispc_ops;
 
+	unsigned int num_dssdevs;
+	struct omap_dss_device *dssdevs[8];
+
 	unsigned int num_crtcs;
 	struct drm_crtc *crtcs[8];
 
-- 
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] 127+ messages in thread

* [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
  2018-05-26 17:24 ` [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step Laurent Pinchart
  2018-05-26 17:24 ` [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 15:23   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c Laurent Pinchart
                   ` (57 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

From: Peter Ujfalusi <peter.ujfalusi@ti.com>

Sort the dssdev array based on DT aliases.

With this change we can remove the panel ordering from dss/display.c and
have all sorting related to dssdevs in one place.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v0:

- Make alias_id unsigned
---
 drivers/gpu/drm/omapdrm/dss/display.c |  2 ++
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 +
 drivers/gpu/drm/omapdrm/omap_drv.c    | 18 ++++++++++++++++++
 3 files changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 424143128cd4..3ef99f344bd3 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -52,6 +52,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
 	if (id < 0)
 		id = disp_num_counter++;
 
+	dssdev->alias_id = id;
+
 	snprintf(dssdev->alias, sizeof(dssdev->alias), "display%d", id);
 
 	/* Use 'label' property for name, if it exists */
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 14d74adb13fb..eae105b0b961 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -467,6 +467,7 @@ struct omap_dss_device {
 
 	/* alias in the form of "display%d" */
 	char alias[16];
+	unsigned int alias_id;
 
 	enum omap_display_type type;
 	enum omap_display_type output_type;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 9277aa8c49c0..e2d7f8bfb4c1 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -15,6 +15,8 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/of.h>
+#include <linux/sort.h>
 #include <linux/sys_soc.h>
 
 #include <drm/drm_atomic.h>
@@ -165,6 +167,18 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
 	priv->num_dssdevs = 0;
 }
 
+static int omap_compare_dssdevs(const void *a, const void *b)
+{
+	const struct omap_dss_device *dssdev1 = *(struct omap_dss_device **)a;
+	const struct omap_dss_device *dssdev2 = *(struct omap_dss_device **)b;
+
+	if (dssdev1->alias_id > dssdev2->alias_id)
+		return 1;
+	else if (dssdev1->alias_id < dssdev2->alias_id)
+		return -1;
+	return 0;
+}
+
 static int omap_connect_dssdevs(struct drm_device *ddev)
 {
 	struct omap_drm_private *priv = ddev->dev_private;
@@ -193,6 +207,10 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 		}
 	}
 
+	/* Sort the list by DT aliases */
+	sort(priv->dssdevs, priv->num_dssdevs, sizeof(priv->dssdevs[0]),
+	     omap_compare_dssdevs, NULL);
+
 	return 0;
 
 cleanup:
-- 
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] 127+ messages in thread

* [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (2 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 15:23   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time Laurent Pinchart
                   ` (56 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

From: Peter Ujfalusi <peter.ujfalusi@ti.com>

As ordering of the dss_devices based on DT aliases is now implemented in
omap_drm.c, there is no need to do the ordering in dss/display.c
anymore.

At the same time remove the alias member of the omap_dss_device struct
since it is no longer needed. The only place it was used is in the
omapdss_register_display() function.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v0:

- Use %u to format display ID
---
 drivers/gpu/drm/omapdrm/dss/display.c | 15 +++------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  2 --
 2 files changed, 3 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 3ef99f344bd3..25c3be86d7f4 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -41,7 +41,6 @@ static int disp_num_counter;
 int omapdss_register_display(struct omap_dss_device *dssdev)
 {
 	struct omap_dss_driver *drv = dssdev->driver;
-	struct list_head *cur;
 	int id;
 
 	/*
@@ -54,26 +53,18 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
 
 	dssdev->alias_id = id;
 
-	snprintf(dssdev->alias, sizeof(dssdev->alias), "display%d", id);
-
 	/* Use 'label' property for name, if it exists */
 	of_property_read_string(dssdev->dev->of_node, "label", &dssdev->name);
 
 	if (dssdev->name == NULL)
-		dssdev->name = dssdev->alias;
+		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
+					      "display%u", id);
 
 	if (drv && drv->get_timings == NULL)
 		drv->get_timings = omapdss_default_get_timings;
 
 	mutex_lock(&panel_list_mutex);
-	list_for_each(cur, &panel_list) {
-		struct omap_dss_device *ldev = list_entry(cur,
-							 struct omap_dss_device,
-							 panel_list);
-		if (strcmp(ldev->alias, dssdev->alias) > 0)
-			break;
-	}
-	list_add_tail(&dssdev->panel_list, cur);
+	list_add_tail(&dssdev->panel_list, &panel_list);
 	mutex_unlock(&panel_list_mutex);
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index eae105b0b961..8d530057a4b9 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -465,8 +465,6 @@ struct omap_dss_device {
 
 	struct list_head panel_list;
 
-	/* alias in the form of "display%d" */
-	char alias[16];
 	unsigned int alias_id;
 
 	enum omap_display_type type;
-- 
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] 127+ messages in thread

* [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (3 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 15:33   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe Laurent Pinchart
                   ` (55 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omapdss_gather_components() function walks the OF graph to create a
list of all components part of the display device. There's no need to
delay this operation until DSS bind time as we have all the information
we need at probe time.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 0b908e9de792..d27d7f85bcd1 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1323,7 +1323,6 @@ static int dss_bind(struct device *dev)
 
 	pm_set_vt_switch(0);
 
-	omapdss_gather_components(dev);
 	omapdss_set_dss(dss);
 
 	return 0;
@@ -1474,6 +1473,8 @@ static int dss_probe(struct platform_device *pdev)
 						   dss);
 
 	/* Add all the child devices as components. */
+	omapdss_gather_components(&pdev->dev);
+
 	device_for_each_child(&pdev->dev, &match, dss_add_child_component);
 
 	r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match);
-- 
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] 127+ messages in thread

* [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (4 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 15:40   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures Laurent Pinchart
                   ` (54 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

From: Jyri Sarha <jsarha@ti.com>

Register the omapdrm device when we know that dss device probe going
to succeed. This avoids DSS6 and DSS2 omapdrm device registration from
colliding with each other.

Signed-off-by: Jyri Sarha <jsarha@ti.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v0:

- Store the OMAP DRM platform device pointer in struct dss_device
- Register the OMAP DRM platform device at the very end of dss_bind()
---
 drivers/gpu/drm/omapdrm/dss/core.c | 26 ++------------------------
 drivers/gpu/drm/omapdrm/dss/dss.c  | 13 +++++++++++++
 drivers/gpu/drm/omapdrm/dss/dss.h  |  2 ++
 3 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapdrm/dss/core.c
index acef7ece5783..6c9f667f9982 100644
--- a/drivers/gpu/drm/omapdrm/dss/core.c
+++ b/drivers/gpu/drm/omapdrm/dss/core.c
@@ -45,36 +45,14 @@ static struct platform_driver * const omap_dss_drivers[] = {
 #endif
 };
 
-static struct platform_device *omap_drm_device;
-
 static int __init omap_dss_init(void)
 {
-	int r;
-
-	r = platform_register_drivers(omap_dss_drivers,
-				      ARRAY_SIZE(omap_dss_drivers));
-	if (r)
-		goto err_reg;
-
-	omap_drm_device = platform_device_register_simple("omapdrm", 0, NULL, 0);
-	if (IS_ERR(omap_drm_device)) {
-		r = PTR_ERR(omap_drm_device);
-		goto err_reg;
-	}
-
-	return 0;
-
-err_reg:
-	platform_unregister_drivers(omap_dss_drivers,
-				    ARRAY_SIZE(omap_dss_drivers));
-
-	return r;
+	return platform_register_drivers(omap_dss_drivers,
+					 ARRAY_SIZE(omap_dss_drivers));
 }
 
 static void __exit omap_dss_exit(void)
 {
-	platform_device_unregister(omap_drm_device);
-
 	platform_unregister_drivers(omap_dss_drivers,
 				    ARRAY_SIZE(omap_dss_drivers));
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index d27d7f85bcd1..abd45b08f3a1 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1315,6 +1315,7 @@ static const struct soc_device_attribute dss_soc_devices[] = {
 static int dss_bind(struct device *dev)
 {
 	struct dss_device *dss = dev_get_drvdata(dev);
+	struct platform_device *drm_pdev;
 	int r;
 
 	r = component_bind_all(dev, NULL);
@@ -1325,11 +1326,23 @@ static int dss_bind(struct device *dev)
 
 	omapdss_set_dss(dss);
 
+	drm_pdev = platform_device_register_simple("omapdrm", 0, NULL, 0);
+	if (IS_ERR(drm_pdev)) {
+		component_unbind_all(dev, NULL);
+		return PTR_ERR(drm_pdev);
+	}
+
+	dss->drm_pdev = drm_pdev;
+
 	return 0;
 }
 
 static void dss_unbind(struct device *dev)
 {
+	struct dss_device *dss = dev_get_drvdata(dev);
+
+	platform_device_unregister(dss->drm_pdev);
+
 	omapdss_set_dss(NULL);
 
 	component_unbind_all(dev, NULL);
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index 847c78ade024..4f1eb7f5b922 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -235,6 +235,8 @@ struct dss_device {
 	struct regmap	*syscon_pll_ctrl;
 	u32		syscon_pll_ctrl_offset;
 
+	struct platform_device *drm_pdev;
+
 	struct clk	*parent_clk;
 	struct clk	*dss_clk;
 	unsigned long	dss_clk_rate;
-- 
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] 127+ messages in thread

* [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (5 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 16:04   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations Laurent Pinchart
                   ` (53 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The dpi_init_port() and sdi_init_port() functions can return errors but
their return value is ignored. This prevents both probe failures and
probe deferral from working correctly. Propagate the errors up the call
stack.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index abd45b08f3a1..59b238f03437 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1183,7 +1183,8 @@ static int dss_init_ports(struct dss_device *dss)
 	struct platform_device *pdev = dss->pdev;
 	struct device_node *parent = pdev->dev.of_node;
 	struct device_node *port;
-	int i;
+	unsigned int i;
+	int r;
 
 	for (i = 0; i < dss->feat->num_ports; i++) {
 		port = of_graph_get_port_by_id(parent, i);
@@ -1192,11 +1193,17 @@ static int dss_init_ports(struct dss_device *dss)
 
 		switch (dss->feat->ports[i]) {
 		case OMAP_DISPLAY_TYPE_DPI:
-			dpi_init_port(dss, pdev, port, dss->feat->model);
+			r = dpi_init_port(dss, pdev, port, dss->feat->model);
+			if (r)
+				return r;
 			break;
+
 		case OMAP_DISPLAY_TYPE_SDI:
-			sdi_init_port(dss, pdev, port);
+			r = sdi_init_port(dss, pdev, port);
+			if (r)
+				return r;
 			break;
+
 		default:
 			break;
 		}
-- 
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] 127+ messages in thread

* [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (6 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 16:10   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation Laurent Pinchart
                   ` (52 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The operations are never used, remove them. If the need to set wide
screen signaling data arises later, it should be implemented by
extending the DRM bridge API.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c | 19 ----------
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  6 ----
 drivers/gpu/drm/omapdrm/dss/venc.c                 | 41 ----------------------
 3 files changed, 66 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 9eabd7201a12..5fdecc12b608 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -154,22 +154,6 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.atv->check_timings(in, vm);
 }
 
-static u32 tvc_get_wss(struct omap_dss_device *dssdev)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
-
-	return in->ops.atv->get_wss(in);
-}
-
-static int tvc_set_wss(struct omap_dss_device *dssdev, u32 wss)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
-
-	return in->ops.atv->set_wss(in, wss);
-}
-
 static struct omap_dss_driver tvc_driver = {
 	.connect		= tvc_connect,
 	.disconnect		= tvc_disconnect,
@@ -180,9 +164,6 @@ static struct omap_dss_driver tvc_driver = {
 	.set_timings		= tvc_set_timings,
 	.get_timings		= tvc_get_timings,
 	.check_timings		= tvc_check_timings,
-
-	.get_wss		= tvc_get_wss,
-	.set_wss		= tvc_set_wss,
 };
 
 static int tvc_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 8d530057a4b9..67db0ea272f3 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -362,9 +362,6 @@ struct omapdss_atv_ops {
 			    struct videomode *vm);
 	void (*get_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-
-	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
-	u32 (*get_wss)(struct omap_dss_device *dssdev);
 };
 
 struct omapdss_hdmi_ops {
@@ -554,9 +551,6 @@ struct omap_dss_driver {
 	void (*get_size)(struct omap_dss_device *dssdev,
 			 unsigned int *width, unsigned int *height);
 
-	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
-	u32 (*get_wss)(struct omap_dss_device *dssdev);
-
 	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
 	bool (*detect)(struct omap_dss_device *dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 24d1ced210bd..3f4b8a181d74 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -626,44 +626,6 @@ static void venc_get_timings(struct omap_dss_device *dssdev,
 	mutex_unlock(&venc->venc_lock);
 }
 
-static u32 venc_get_wss(struct omap_dss_device *dssdev)
-{
-	struct venc_device *venc = dssdev_to_venc(dssdev);
-
-	/* Invert due to VENC_L21_WC_CTL:INV=1 */
-	return (venc->wss_data >> 8) ^ 0xfffff;
-}
-
-static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
-{
-	struct venc_device *venc = dssdev_to_venc(dssdev);
-	const struct venc_config *config;
-	int r;
-
-	DSSDBG("venc_set_wss\n");
-
-	mutex_lock(&venc->venc_lock);
-
-	config = venc_timings_to_config(&venc->vm);
-
-	/* Invert due to VENC_L21_WC_CTL:INV=1 */
-	venc->wss_data = (wss ^ 0xfffff) << 8;
-
-	r = venc_runtime_get(venc);
-	if (r)
-		goto err;
-
-	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
-		       venc->wss_data);
-
-	venc_runtime_put(venc);
-
-err:
-	mutex_unlock(&venc->venc_lock);
-
-	return r;
-}
-
 static int venc_init_regulator(struct venc_device *venc)
 {
 	struct regulator *vdda_dac;
@@ -810,9 +772,6 @@ static const struct omapdss_atv_ops venc_ops = {
 	.check_timings = venc_check_timings,
 	.set_timings = venc_set_timings,
 	.get_timings = venc_get_timings,
-
-	.set_wss = venc_set_wss,
-	.get_wss = venc_get_wss,
 };
 
 static void venc_init_output(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] 127+ messages in thread

* [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (7 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 16:13   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings() Laurent Pinchart
                   ` (51 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The get_timings operation from DSS encoders (not to be confused with the
identically named operation in omap_dss_driver) is never called. Remove
it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    | 11 -----------
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  9 ---------
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  9 ---------
 drivers/gpu/drm/omapdrm/dss/dpi.c                    | 13 -------------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                  |  9 ---------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                  |  9 ---------
 drivers/gpu/drm/omapdrm/dss/omapdss.h                | 10 ----------
 drivers/gpu/drm/omapdrm/dss/sdi.c                    |  9 ---------
 drivers/gpu/drm/omapdrm/dss/venc.c                   | 13 -------------
 9 files changed, 92 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index afee1b8b457a..27d63a14efe3 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -148,16 +148,6 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
 	in->ops.atv->set_timings(in, vm);
 }
 
-static void opa362_get_timings(struct omap_dss_device *dssdev,
-			       struct videomode *vm)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-
-	dev_dbg(dssdev->dev, "get_timings\n");
-
-	*vm = ddata->vm;
-}
-
 static int opa362_check_timings(struct omap_dss_device *dssdev,
 				struct videomode *vm)
 {
@@ -178,7 +168,6 @@ static const struct omapdss_atv_ops opa362_atv_ops = {
 
 	.check_timings	= opa362_check_timings,
 	.set_timings	= opa362_set_timings,
-	.get_timings	= opa362_get_timings,
 };
 
 static int opa362_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index ed7ae384c3ed..566c63a3ad59 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -142,14 +142,6 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
 	in->ops.dpi->set_timings(in, vm);
 }
 
-static void tfp410_get_timings(struct omap_dss_device *dssdev,
-			       struct videomode *vm)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-
-	*vm = ddata->vm;
-}
-
 static int tfp410_check_timings(struct omap_dss_device *dssdev,
 				struct videomode *vm)
 {
@@ -170,7 +162,6 @@ static const struct omapdss_dvi_ops tfp410_dvi_ops = {
 
 	.check_timings	= tfp410_check_timings,
 	.set_timings	= tfp410_set_timings,
-	.get_timings	= tfp410_get_timings,
 };
 
 static int tfp410_probe_of(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index d275bf152da5..4753e5455f82 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -136,14 +136,6 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
 	in->ops.hdmi->set_timings(in, vm);
 }
 
-static void tpd_get_timings(struct omap_dss_device *dssdev,
-			    struct videomode *vm)
-{
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-
-	*vm = ddata->vm;
-}
-
 static int tpd_check_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
@@ -249,7 +241,6 @@ static const struct omapdss_hdmi_ops tpd_hdmi_ops = {
 
 	.check_timings		= tpd_check_timings,
 	.set_timings		= tpd_set_timings,
-	.get_timings		= tpd_get_timings,
 
 	.read_edid		= tpd_read_edid,
 	.detect			= tpd_detect,
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 3d662e6805eb..af002c57a41d 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -491,18 +491,6 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,
 	mutex_unlock(&dpi->lock);
 }
 
-static void dpi_get_timings(struct omap_dss_device *dssdev,
-			    struct videomode *vm)
-{
-	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
-
-	mutex_lock(&dpi->lock);
-
-	*vm = dpi->vm;
-
-	mutex_unlock(&dpi->lock);
-}
-
 static int dpi_check_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
@@ -702,7 +690,6 @@ static const struct omapdss_dpi_ops dpi_ops = {
 
 	.check_timings = dpi_check_timings,
 	.set_timings = dpi_set_timings,
-	.get_timings = dpi_get_timings,
 };
 
 static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 5879f45f6fc9..b3d7865347a3 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -296,14 +296,6 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
 	mutex_unlock(&hdmi->lock);
 }
 
-static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
-				     struct videomode *vm)
-{
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
-
-	*vm = hdmi->cfg.vm;
-}
-
 static int hdmi_dump_regs(struct seq_file *s, void *p)
 {
 	struct omap_hdmi *hdmi = s->private;
@@ -557,7 +549,6 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
 
 	.check_timings		= hdmi_display_check_timing,
 	.set_timings		= hdmi_display_set_timing,
-	.get_timings		= hdmi_display_get_timings,
 
 	.read_edid		= hdmi_read_edid,
 	.lost_hotplug		= hdmi_lost_hotplug,
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index ae1a001d1b83..8e9b3a24b2ab 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -293,14 +293,6 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
 	mutex_unlock(&hdmi->lock);
 }
 
-static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
-				     struct videomode *vm)
-{
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
-
-	*vm = hdmi->cfg.vm;
-}
-
 static int hdmi_dump_regs(struct seq_file *s, void *p)
 {
 	struct omap_hdmi *hdmi = s->private;
@@ -549,7 +541,6 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
 
 	.check_timings		= hdmi_display_check_timing,
 	.set_timings		= hdmi_display_set_timing,
-	.get_timings		= hdmi_display_get_timings,
 
 	.read_edid		= hdmi_read_edid,
 	.set_infoframe		= hdmi_set_infoframe,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 67db0ea272f3..426ac8297f5f 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -309,8 +309,6 @@ struct omapdss_dpi_ops {
 			     struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 };
 
 struct omapdss_sdi_ops {
@@ -326,8 +324,6 @@ struct omapdss_sdi_ops {
 			     struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 };
 
 struct omapdss_dvi_ops {
@@ -343,8 +339,6 @@ struct omapdss_dvi_ops {
 			     struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 };
 
 struct omapdss_atv_ops {
@@ -360,8 +354,6 @@ struct omapdss_atv_ops {
 			     struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 };
 
 struct omapdss_hdmi_ops {
@@ -377,8 +369,6 @@ struct omapdss_hdmi_ops {
 			     struct videomode *vm);
 	void (*set_timings)(struct omap_dss_device *dssdev,
 			    struct videomode *vm);
-	void (*get_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
 
 	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
 	void (*lost_hotplug)(struct omap_dss_device *dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 68a40ae26f5b..2a61409cfaf6 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -234,14 +234,6 @@ static void sdi_set_timings(struct omap_dss_device *dssdev,
 	sdi->vm = *vm;
 }
 
-static void sdi_get_timings(struct omap_dss_device *dssdev,
-			    struct videomode *vm)
-{
-	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
-
-	*vm = sdi->vm;
-}
-
 static int sdi_check_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
@@ -325,7 +317,6 @@ static const struct omapdss_sdi_ops sdi_ops = {
 
 	.check_timings = sdi_check_timings,
 	.set_timings = sdi_set_timings,
-	.get_timings = sdi_get_timings,
 };
 
 static void sdi_init_output(struct sdi_device *sdi)
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 3f4b8a181d74..a9225bd2df6d 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -614,18 +614,6 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
 	}
 }
 
-static void venc_get_timings(struct omap_dss_device *dssdev,
-			     struct videomode *vm)
-{
-	struct venc_device *venc = dssdev_to_venc(dssdev);
-
-	mutex_lock(&venc->venc_lock);
-
-	*vm = venc->vm;
-
-	mutex_unlock(&venc->venc_lock);
-}
-
 static int venc_init_regulator(struct venc_device *venc)
 {
 	struct regulator *vdda_dac;
@@ -771,7 +759,6 @@ static const struct omapdss_atv_ops venc_ops = {
 
 	.check_timings = venc_check_timings,
 	.set_timings = venc_set_timings,
-	.get_timings = venc_get_timings,
 };
 
 static void venc_init_output(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] 127+ messages in thread

* [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (8 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 16:18   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure Laurent Pinchart
                   ` (50 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

All omap_dss_driver instances provide the get_timings operation. Remove
the default function.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 25c3be86d7f4..e07e3319d6e0 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -28,19 +28,12 @@
 
 #include "omapdss.h"
 
-static void omapdss_default_get_timings(struct omap_dss_device *dssdev,
-					struct videomode *vm)
-{
-	*vm = dssdev->panel.vm;
-}
-
 static LIST_HEAD(panel_list);
 static DEFINE_MUTEX(panel_list_mutex);
 static int disp_num_counter;
 
 int omapdss_register_display(struct omap_dss_device *dssdev)
 {
-	struct omap_dss_driver *drv = dssdev->driver;
 	int id;
 
 	/*
@@ -60,9 +53,6 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
 		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
 					      "display%u", id);
 
-	if (drv && drv->get_timings == NULL)
-		drv->get_timings = omapdss_default_get_timings;
-
 	mutex_lock(&panel_list_mutex);
 	list_add_tail(&dssdev->panel_list, &panel_list);
 	mutex_unlock(&panel_list_mutex);
-- 
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] 127+ messages in thread

* [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (9 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings() Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 16:20   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure Laurent Pinchart
                   ` (49 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The structure contains function pointers that don't need to be modified.
Make all its instances const to improve security.

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

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 5fdecc12b608..a49bc4a8dcae 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -154,7 +154,7 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.atv->check_timings(in, vm);
 }
 
-static struct omap_dss_driver tvc_driver = {
+static const struct omap_dss_driver tvc_driver = {
 	.connect		= tvc_connect,
 	.disconnect		= tvc_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 6d8cbd9e2110..c320f3c5ae6c 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -297,7 +297,7 @@ static void dvic_disable_hpd(struct omap_dss_device *dssdev)
 	mutex_unlock(&ddata->hpd_lock);
 }
 
-static struct omap_dss_driver dvic_driver = {
+static const struct omap_dss_driver dvic_driver = {
 	.connect	= dvic_connect,
 	.disconnect	= dvic_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index ca30ed9da7eb..6f12f9bb8054 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -269,7 +269,7 @@ static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
 	return in->ops.hdmi->set_infoframe(in, avi);
 }
 
-static struct omap_dss_driver hdmic_driver = {
+static const struct omap_dss_driver hdmic_driver = {
 	.connect		= hdmic_connect,
 	.disconnect		= hdmic_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 6cbf570d6727..e874f0b72798 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -153,7 +153,7 @@ static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver panel_dpi_ops = {
+static const struct omap_dss_driver panel_dpi_ops = {
 	.connect	= panel_dpi_connect,
 	.disconnect	= panel_dpi_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 428de90fced1..d7c57d84d7bd 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1210,7 +1210,7 @@ static void dsicm_get_size(struct omap_dss_device *dssdev,
 	*height = ddata->height_mm;
 }
 
-static struct omap_dss_driver dsicm_ops = {
+static const struct omap_dss_driver dsicm_ops = {
 	.connect	= dsicm_connect,
 	.disconnect	= dsicm_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 754197099440..ad98d2ffcf1b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -228,7 +228,7 @@ static int lb035q02_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver lb035q02_ops = {
+static const struct omap_dss_driver lb035q02_ops = {
 	.connect	= lb035q02_connect,
 	.disconnect	= lb035q02_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 9a3b27fa5cb5..0846fb594352 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -222,7 +222,7 @@ static int nec_8048_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver nec_8048_ops = {
+static const struct omap_dss_driver nec_8048_ops = {
 	.connect	= nec_8048_connect,
 	.disconnect	= nec_8048_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index bb5b680cabfe..e7c4a830e214 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -192,7 +192,7 @@ static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver sharp_ls_ops = {
+static const struct omap_dss_driver sharp_ls_ops = {
 	.connect	= sharp_ls_connect,
 	.disconnect	= sharp_ls_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 92fe125ce22e..c650f575b5c3 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -693,7 +693,7 @@ static int acx565akm_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.sdi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver acx565akm_ops = {
+static const struct omap_dss_driver acx565akm_ops = {
 	.connect	= acx565akm_connect,
 	.disconnect	= acx565akm_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index b5d8a00df811..0f2ecc2bcf4f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -362,7 +362,7 @@ static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver td028ttec1_ops = {
+static const struct omap_dss_driver td028ttec1_ops = {
 	.connect	= td028ttec1_panel_connect,
 	.disconnect	= td028ttec1_panel_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index c08e22b43447..14a37b82ee13 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -456,7 +456,7 @@ static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
 	return in->ops.dpi->check_timings(in, vm);
 }
 
-static struct omap_dss_driver tpo_td043_ops = {
+static const struct omap_dss_driver tpo_td043_ops = {
 	.connect	= tpo_td043_connect,
 	.disconnect	= tpo_td043_disconnect,
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 426ac8297f5f..e3d31b2fee4c 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -466,7 +466,7 @@ struct omap_dss_device {
 
 	const char *name;
 
-	struct omap_dss_driver *driver;
+	const struct omap_dss_driver *driver;
 
 	union {
 		const struct omapdss_dpi_ops *dpi;
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 5cde26ac937b..eec3aa83dfcd 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -62,7 +62,7 @@ static enum drm_connector_status omap_connector_detect(
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev = omap_connector->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 	enum drm_connector_status ret;
 
 	if (dssdrv->detect) {
@@ -107,7 +107,7 @@ static int omap_connector_get_modes(struct drm_connector *connector)
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev = omap_connector->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 	struct drm_device *dev = connector->dev;
 	int n = 0;
 
@@ -170,7 +170,7 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
 {
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct omap_dss_device *dssdev = omap_connector->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 	struct videomode vm = {0};
 	struct drm_device *dev = connector->dev;
 	struct drm_display_mode *new_mode;
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index fcdf4b0a8eec..ec0f451e3b36 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -94,7 +94,7 @@ 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->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 
 	dssdrv->disable(dssdev);
 }
@@ -106,7 +106,7 @@ static int omap_encoder_update(struct drm_encoder *encoder,
 	struct drm_device *dev = encoder->dev;
 	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
 	struct omap_dss_device *dssdev = omap_encoder->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 	int ret;
 
 	if (dssdrv->check_timings) {
@@ -137,7 +137,7 @@ 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->dssdev;
-	struct omap_dss_driver *dssdrv = dssdev->driver;
+	const struct omap_dss_driver *dssdrv = dssdev->driver;
 	int r;
 
 	omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc),
-- 
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] 127+ messages in thread

* [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (10 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 17:44   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields Laurent Pinchart
                   ` (48 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device structure stores a videomode. All the connector and
panel drivers that use omap_dss_device also store the videomode in their
own panel_drv_data structures. There's no need to duplicate, remove the
videomode field from omap_dss_device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      | 2 --
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c            | 2 --
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           | 2 --
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c           | 1 -
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c           | 1 -
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c        | 1 -
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c                | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             | 8 +++-----
 drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     | 2 --
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     | 2 --
 drivers/gpu/drm/omapdrm/dss/omapdss.h                       | 2 --
 15 files changed, 3 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index a49bc4a8dcae..6b640ede6614 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -132,7 +132,6 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.atv->set_timings(in, vm);
 }
@@ -186,7 +185,6 @@ static int tvc_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = tvc_pal_vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index c320f3c5ae6c..84598ea12a9b 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -139,7 +139,6 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dvi->set_timings(in, vm);
 }
@@ -403,7 +402,6 @@ static int dvic_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = dvic_default_vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 6f12f9bb8054..e031280468fb 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -142,7 +142,6 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.hdmi->set_timings(in, vm);
 }
@@ -368,7 +367,6 @@ static int hdmic_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = hdmic_default_vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 27d63a14efe3..0e3f4a20e531 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -143,7 +143,6 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
 	dev_dbg(dssdev->dev, "set_timings\n");
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.atv->set_timings(in, vm);
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 566c63a3ad59..08e63e39d0b7 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -137,7 +137,6 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
 	tfp410_fix_timings(vm);
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 4753e5455f82..f35e2afa3e9c 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -131,7 +131,6 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.hdmi->set_timings(in, vm);
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index e874f0b72798..bbd630ead3c1 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -131,7 +131,6 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -230,7 +229,6 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->driver = &panel_dpi_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index d7c57d84d7bd..555ab2ac5576 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -956,9 +956,8 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 	}
 
 	/* XXX no need to send this every frame, but dsi break if not done */
-	r = dsicm_set_update_window(ddata, 0, 0,
-			dssdev->panel.vm.hactive,
-			dssdev->panel.vm.vactive);
+	r = dsicm_set_update_window(ddata, 0, 0, ddata->vm.hactive,
+				    ddata->vm.vactive);
 	if (r)
 		goto err;
 
@@ -1089,7 +1088,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 	}
 
 	size = min((u32)w * h * 3,
-		   dssdev->panel.vm.hactive * dssdev->panel.vm.vactive * 3);
+		   ddata->vm.hactive * ddata->vm.vactive * 3);
 
 	in->ops.dsi->bus_lock(in);
 
@@ -1331,7 +1330,6 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev = &ddata->dssdev;
 	dssdev->dev = dev;
 	dssdev->driver = &dsicm_ops;
-	dssdev->panel.vm = ddata->vm;
 	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
 	dssdev->owner = THIS_MODULE;
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index ad98d2ffcf1b..0a6ab6470253 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -206,7 +206,6 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -281,7 +280,6 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->driver = &lb035q02_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 0846fb594352..9816e661c97d 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -200,7 +200,6 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -305,7 +304,6 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->driver = &nec_8048_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index e7c4a830e214..e259240f96fa 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -170,7 +170,6 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -281,7 +280,6 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->driver = &sharp_ls_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index c650f575b5c3..b4917d12d913 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -671,7 +671,6 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.sdi->set_timings(in, vm);
 }
@@ -812,7 +811,6 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->driver = &acx565akm_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 0f2ecc2bcf4f..5faaf760e81b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -340,7 +340,6 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -406,7 +405,6 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->driver = &td028ttec1_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 14a37b82ee13..8e98232ee9d9 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -434,7 +434,6 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 
 	ddata->vm = *vm;
-	dssdev->panel.vm = *vm;
 
 	in->ops.dpi->set_timings(in, vm);
 }
@@ -549,7 +548,6 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->driver = &tpo_td043_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->panel.vm = ddata->vm;
 
 	r = omapdss_register_display(dssdev);
 	if (r) {
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index e3d31b2fee4c..a93afbbe19de 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -458,8 +458,6 @@ struct omap_dss_device {
 	enum omap_display_type output_type;
 
 	struct {
-		struct videomode vm;
-
 		enum omap_dss_dsi_pixel_format dsi_pix_fmt;
 		enum omap_dss_dsi_mode dsi_mode;
 	} panel;
-- 
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] 127+ messages in thread

* [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (11 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 17:48   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list Laurent Pinchart
                   ` (47 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device panel.dsi_pix_fmt and panel.dsi_mode fields are
unused. Remove them.

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

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 555ab2ac5576..8d98cd628e11 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1333,7 +1333,6 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
 	dssdev->owner = THIS_MODULE;
 
-	dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888;
 	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
 		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index a93afbbe19de..39e2906fd5fe 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -457,11 +457,6 @@ struct omap_dss_device {
 	enum omap_display_type type;
 	enum omap_display_type output_type;
 
-	struct {
-		enum omap_dss_dsi_pixel_format dsi_pix_fmt;
-		enum omap_dss_dsi_mode dsi_mode;
-	} panel;
-
 	const char *name;
 
 	const struct omap_dss_driver *driver;
-- 
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] 127+ messages in thread

* [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (12 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 18:55   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances Laurent Pinchart
                   ` (46 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

For coherency with the panel_list field, rename list to output_list.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 39e2906fd5fe..abf101bb27ea 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -481,7 +481,7 @@ struct omap_dss_device {
 
 	/* OMAP DSS output specific fields */
 
-	struct list_head list;
+	struct list_head output_list;
 
 	/* DISPC channel for this output */
 	enum omap_channel dispc_channel;
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 96b9d4cd505f..0fcd13ea8824 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -96,14 +96,14 @@ EXPORT_SYMBOL(omapdss_output_unset_device);
 
 int omapdss_register_output(struct omap_dss_device *out)
 {
-	list_add_tail(&out->list, &output_list);
+	list_add_tail(&out->output_list, &output_list);
 	return 0;
 }
 EXPORT_SYMBOL(omapdss_register_output);
 
 void omapdss_unregister_output(struct omap_dss_device *out)
 {
-	list_del(&out->list);
+	list_del(&out->output_list);
 }
 EXPORT_SYMBOL(omapdss_unregister_output);
 
@@ -111,7 +111,7 @@ bool omapdss_component_is_output(struct device_node *node)
 {
 	struct omap_dss_device *out;
 
-	list_for_each_entry(out, &output_list, list) {
+	list_for_each_entry(out, &output_list, output_list) {
 		if (out->dev->of_node == node)
 			return true;
 	}
@@ -124,7 +124,7 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
 {
 	struct omap_dss_device *out;
 
-	list_for_each_entry(out, &output_list, list) {
+	list_for_each_entry(out, &output_list, output_list) {
 		if (out->id == id)
 			return out;
 	}
@@ -145,7 +145,7 @@ struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *po
 
 	reg = dss_of_port_get_port_number(port);
 
-	list_for_each_entry(out, &output_list, list) {
+	list_for_each_entry(out, &output_list, output_list) {
 		if (out->dev->of_node == src_node && out->port_num == reg) {
 			of_node_put(src_node);
 			return omap_dss_get_device(out);
-- 
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] 127+ messages in thread

* [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (13 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:03   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered() Laurent Pinchart
                   ` (45 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device instances are stored in two separate lists,
depending on whether they are panels or outputs. Create a third list
that stores all omap_dss_device instances to allow generic code to
operate on all instances.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 99e8cb8dc65b..18b72d7c717a 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -14,24 +14,17 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/list.h>
 #include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/of.h>
 #include <linux/of_graph.h>
-#include <linux/list.h>
 
 #include "dss.h"
 #include "omapdss.h"
 
 static struct dss_device *dss_device;
 
-static struct list_head omapdss_comp_list;
-
-struct omapdss_comp_node {
-	struct list_head list;
-	struct device_node *node;
-	bool dss_core_component;
-};
-
 struct dss_device *omapdss_get_dss(void)
 {
 	return dss_device;
@@ -56,6 +49,40 @@ const struct dispc_ops *dispc_get_ops(struct dss_device *dss)
 }
 EXPORT_SYMBOL(dispc_get_ops);
 
+
+/* -----------------------------------------------------------------------------
+ * OMAP DSS Devices Handling
+ */
+
+static LIST_HEAD(omapdss_devices_list);
+static DEFINE_MUTEX(omapdss_devices_lock);
+
+void omapdss_device_register(struct omap_dss_device *dssdev)
+{
+	mutex_lock(&omapdss_devices_lock);
+	list_add_tail(&dssdev->list, &omapdss_devices_list);
+	mutex_unlock(&omapdss_devices_lock);
+}
+
+void omapdss_device_unregister(struct omap_dss_device *dssdev)
+{
+	mutex_lock(&omapdss_devices_lock);
+	list_del(&dssdev->list);
+	mutex_unlock(&omapdss_devices_lock);
+}
+
+/* -----------------------------------------------------------------------------
+ * Components Handling
+ */
+
+static struct list_head omapdss_comp_list;
+
+struct omapdss_comp_node {
+	struct list_head list;
+	struct device_node *node;
+	bool dss_core_component;
+};
+
 static bool omapdss_list_contains(const struct device_node *node)
 {
 	struct omapdss_comp_node *comp;
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index e07e3319d6e0..eacbbf45f737 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -56,6 +56,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
 	mutex_lock(&panel_list_mutex);
 	list_add_tail(&dssdev->panel_list, &panel_list);
 	mutex_unlock(&panel_list_mutex);
+
+	omapdss_device_register(dssdev);
 	return 0;
 }
 EXPORT_SYMBOL(omapdss_register_display);
@@ -65,6 +67,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev)
 	mutex_lock(&panel_list_mutex);
 	list_del(&dssdev->panel_list);
 	mutex_unlock(&panel_list_mutex);
+
+	omapdss_device_register(dssdev);
 }
 EXPORT_SYMBOL(omapdss_unregister_display);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index abf101bb27ea..e029613509a1 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -450,6 +450,7 @@ struct omap_dss_device {
 
 	struct module *owner;
 
+	struct list_head list;
 	struct list_head panel_list;
 
 	unsigned int alias_id;
@@ -560,6 +561,9 @@ static inline bool omapdss_is_initialized(void)
 int omapdss_register_display(struct omap_dss_device *dssdev);
 void omapdss_unregister_display(struct omap_dss_device *dssdev);
 
+void omapdss_device_register(struct omap_dss_device *dssdev);
+void omapdss_device_unregister(struct omap_dss_device *dssdev);
+
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
 void omap_dss_put_device(struct omap_dss_device *dssdev);
 #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 0fcd13ea8824..1a2d24906edd 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -97,6 +97,7 @@ EXPORT_SYMBOL(omapdss_output_unset_device);
 int omapdss_register_output(struct omap_dss_device *out)
 {
 	list_add_tail(&out->output_list, &output_list);
+	omapdss_device_register(out);
 	return 0;
 }
 EXPORT_SYMBOL(omapdss_register_output);
@@ -104,6 +105,7 @@ EXPORT_SYMBOL(omapdss_register_output);
 void omapdss_unregister_output(struct omap_dss_device *out)
 {
 	list_del(&out->output_list);
+	omapdss_device_unregister(out);
 }
 EXPORT_SYMBOL(omapdss_unregister_output);
 
-- 
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] 127+ messages in thread

* [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (14 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:04   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node Laurent Pinchart
                   ` (44 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omapdss_component_is_loaded() function test whether a component is
loaded by checking whether it is present in the displays list or the
outputs list. Simplify the implementation by checking for the component
in the global omap_dss_device list.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    | 22 +++++++++++++++++++---
 drivers/gpu/drm/omapdrm/dss/display.c | 18 ------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 ---
 drivers/gpu/drm/omapdrm/dss/output.c  | 13 -------------
 4 files changed, 19 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 18b72d7c717a..63fe0a717884 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -71,6 +71,24 @@ void omapdss_device_unregister(struct omap_dss_device *dssdev)
 	mutex_unlock(&omapdss_devices_lock);
 }
 
+static bool omapdss_device_is_registered(struct device_node *node)
+{
+	struct omap_dss_device *dssdev;
+	bool found = false;
+
+	mutex_lock(&omapdss_devices_lock);
+
+	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
+		if (dssdev->dev->of_node == node) {
+			found = true;
+			break;
+		}
+	}
+
+	mutex_unlock(&omapdss_devices_lock);
+	return found;
+}
+
 /* -----------------------------------------------------------------------------
  * Components Handling
  */
@@ -157,9 +175,7 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp)
 {
 	if (comp->dss_core_component)
 		return true;
-	if (omapdss_component_is_display(comp->node))
-		return true;
-	if (omapdss_component_is_output(comp->node))
+	if (omapdss_device_is_registered(comp->node))
 		return true;
 
 	return false;
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index eacbbf45f737..383512c8a466 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -72,24 +72,6 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev)
 }
 EXPORT_SYMBOL(omapdss_unregister_display);
 
-bool omapdss_component_is_display(struct device_node *node)
-{
-	struct omap_dss_device *dssdev;
-	bool found = false;
-
-	mutex_lock(&panel_list_mutex);
-	list_for_each_entry(dssdev, &panel_list, panel_list) {
-		if (dssdev->dev->of_node == node) {
-			found = true;
-			goto out;
-		}
-	}
-out:
-	mutex_unlock(&panel_list_mutex);
-	return found;
-}
-EXPORT_SYMBOL(omapdss_component_is_display);
-
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
 {
 	if (!try_module_get(dssdev->owner))
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index e029613509a1..1ccf0c67d308 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -737,9 +737,6 @@ struct dispc_ops {
 struct dispc_device *dispc_get_dispc(struct dss_device *dss);
 const struct dispc_ops *dispc_get_ops(struct dss_device *dss);
 
-bool omapdss_component_is_display(struct device_node *node);
-bool omapdss_component_is_output(struct device_node *node);
-
 bool omapdss_stack_is_ready(void);
 void omapdss_gather_components(struct device *dev);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 1a2d24906edd..7f18153a1bde 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -109,19 +109,6 @@ void omapdss_unregister_output(struct omap_dss_device *out)
 }
 EXPORT_SYMBOL(omapdss_unregister_output);
 
-bool omapdss_component_is_output(struct device_node *node)
-{
-	struct omap_dss_device *out;
-
-	list_for_each_entry(out, &output_list, output_list) {
-		if (out->dev->of_node == node)
-			return true;
-	}
-
-	return false;
-}
-EXPORT_SYMBOL(omapdss_component_is_output);
-
 struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
 {
 	struct omap_dss_device *out;
-- 
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] 127+ messages in thread

* [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (15 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered() Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:19   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port Laurent Pinchart
                   ` (43 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_find_output_by_port_node() function defined in output.c
looks up an output from its port node. To do so it needs to call helper
functions from dss-of.c to lookup the port parent and the port number.
As omap_dss_find_output_by_port_node() is only called by
omapdss_of_find_source_for_first_ep() from dss-of.c this goes back and
forth between the to source files and isn't very clear.

Simplify the code by passing both the parent and the port number to
omap_dss_find_output_by_port_node() instead of the port node, and rename
the function to omap_dss_find_output_by_port().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dss-of.c  | 39 ++++++++++++++++-------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  6 ++----
 drivers/gpu/drm/omapdrm/dss/output.c  | 17 +++------------
 3 files changed, 23 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
index 4602a79c6c44..b51af09e9111 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
@@ -21,7 +21,8 @@
 
 #include "omapdss.h"
 
-struct device_node *dss_of_port_get_parent_device(struct device_node *port)
+static struct device_node *
+dss_of_port_get_parent_device(struct device_node *port)
 {
 	struct device_node *np;
 	int i;
@@ -45,40 +46,36 @@ struct device_node *dss_of_port_get_parent_device(struct device_node *port)
 	return NULL;
 }
 
-u32 dss_of_port_get_port_number(struct device_node *port)
-{
-	int r;
-	u32 reg;
-
-	r = of_property_read_u32(port, "reg", &reg);
-	if (r)
-		reg = 0;
-
-	return reg;
-}
-
 struct omap_dss_device *
 omapdss_of_find_source_for_first_ep(struct device_node *node)
 {
-	struct device_node *ep;
+	struct device_node *src_node;
 	struct device_node *src_port;
+	struct device_node *ep;
 	struct omap_dss_device *src;
+	u32 port_number = 0;
 
+	/* Get the endpoint... */
 	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
 	if (!ep)
 		return ERR_PTR(-EINVAL);
 
+	/* ... and its remote port... */
 	src_port = of_graph_get_remote_port(ep);
-	if (!src_port) {
-		of_node_put(ep);
-		return ERR_PTR(-EINVAL);
-	}
-
 	of_node_put(ep);
+	if (!src_port)
+		return ERR_PTR(-EINVAL);
 
-	src = omap_dss_find_output_by_port_node(src_port);
-
+	/* ... 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 NULL;
+
+	/* ... and finally the source. */
+	src = omap_dss_find_output_by_port(src_node, port_number);
+	of_node_put(src_node);
 
 	return src ? src : ERR_PTR(-EPROBE_DEFER);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 1ccf0c67d308..ff0f603bce76 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -576,7 +576,8 @@ int omap_dss_get_num_overlays(void);
 int omapdss_register_output(struct omap_dss_device *output);
 void omapdss_unregister_output(struct omap_dss_device *output);
 struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
-struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port);
+struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
+						     unsigned int port);
 int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_device *out);
@@ -603,9 +604,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
 struct omap_dss_device *
 omapdss_of_find_source_for_first_ep(struct device_node *node);
 
-struct device_node *dss_of_port_get_parent_device(struct device_node *port);
-u32 dss_of_port_get_port_number(struct device_node *port);
-
 enum dss_writeback_channel {
 	DSS_WB_LCD1_MGR =	0,
 	DSS_WB_LCD2_MGR =	1,
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 7f18153a1bde..be254ea42e08 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -122,27 +122,16 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
 }
 EXPORT_SYMBOL(omap_dss_get_output);
 
-struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port)
+struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
+						     unsigned int port)
 {
-	struct device_node *src_node;
 	struct omap_dss_device *out;
-	u32 reg;
-
-	src_node = dss_of_port_get_parent_device(port);
-	if (!src_node)
-		return NULL;
-
-	reg = dss_of_port_get_port_number(port);
 
 	list_for_each_entry(out, &output_list, output_list) {
-		if (out->dev->of_node == src_node && out->port_num == reg) {
-			of_node_put(src_node);
+		if (out->dev->of_node == src && out->port_num == port)
 			return omap_dss_get_device(out);
-		}
 	}
 
-	of_node_put(src_node);
-
 	return NULL;
 }
 
-- 
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] 127+ messages in thread

* [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (16 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:25   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure Laurent Pinchart
                   ` (42 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_find_output_by_port() function looks up an omap_dss_device
by port from the list of devices registered as outputs. In preparation
for looking up sinks in addition to sources, allow the function to look
up any registered device. Rename it to omap_dss_find_device_by_port() to
match its new purpose.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 63fe0a717884..df6cb1ac43c8 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -89,6 +89,19 @@ static bool omapdss_device_is_registered(struct device_node *node)
 	return found;
 }
 
+struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
+						    unsigned int port)
+{
+	struct omap_dss_device *dssdev;
+
+	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
+		if (dssdev->dev->of_node == src && dssdev->port_num == port)
+			return omap_dss_get_device(dssdev);
+	}
+
+	return NULL;
+}
+
 /* -----------------------------------------------------------------------------
  * Components Handling
  */
diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
index b51af09e9111..771b20db2d98 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
@@ -74,7 +74,7 @@ omapdss_of_find_source_for_first_ep(struct device_node *node)
 		return NULL;
 
 	/* ... and finally the source. */
-	src = omap_dss_find_output_by_port(src_node, port_number);
+	src = omapdss_find_device_by_port(src_node, port_number);
 	of_node_put(src_node);
 
 	return src ? src : ERR_PTR(-EPROBE_DEFER);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index ff0f603bce76..2ec74206bcff 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -563,6 +563,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev);
 
 void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(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 *omap_dss_get_device(struct omap_dss_device *dssdev);
 void omap_dss_put_device(struct omap_dss_device *dssdev);
@@ -576,8 +578,6 @@ int omap_dss_get_num_overlays(void);
 int omapdss_register_output(struct omap_dss_device *output);
 void omapdss_unregister_output(struct omap_dss_device *output);
 struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
-struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
-						     unsigned int port);
 int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_device *out);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index be254ea42e08..e659c8e5c419 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -122,19 +122,6 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
 }
 EXPORT_SYMBOL(omap_dss_get_output);
 
-struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
-						     unsigned int port)
-{
-	struct omap_dss_device *out;
-
-	list_for_each_entry(out, &output_list, output_list) {
-		if (out->dev->of_node == src && out->port_num == port)
-			return omap_dss_get_device(out);
-	}
-
-	return NULL;
-}
-
 struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
 {
 	while (dssdev->src)
-- 
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] 127+ messages in thread

* [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (17 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:42   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices Laurent Pinchart
                   ` (41 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The various types of omapdss_*_ops structures define multiple operations
that are not specific to a bus type. To simplify the code and remove
dependencies on specific bus types move those operations to a common
structure. Operations that are specific to a bus type are kept in the
specialized ops structures.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  14 +--
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  14 +--
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  42 ++++----
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  20 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  20 ++--
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  48 ++++-----
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  16 +--
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 120 ++++++++++-----------
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  14 +--
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  14 +--
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  14 +--
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  14 +--
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  14 +--
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  16 +--
 drivers/gpu/drm/omapdrm/dss/dpi.c                  |   4 +-
 drivers/gpu/drm/omapdrm/dss/dsi.c                  |  50 ++++-----
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  14 +--
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  12 ++-
 drivers/gpu/drm/omapdrm/dss/omapdss.h              | 109 ++++---------------
 drivers/gpu/drm/omapdrm/dss/sdi.c                  |   4 +-
 drivers/gpu/drm/omapdrm/dss/venc.c                 |   4 +-
 21 files changed, 256 insertions(+), 321 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 6b640ede6614..a94868d9398b 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -59,7 +59,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.atv->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -79,7 +79,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.atv->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -99,9 +99,9 @@ static int tvc_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.atv->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.atv->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -120,7 +120,7 @@ static void tvc_disable(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops.atv->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -133,7 +133,7 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.atv->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void tvc_get_timings(struct omap_dss_device *dssdev,
@@ -150,7 +150,7 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.atv->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver tvc_driver = {
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 84598ea12a9b..021e3b651c89 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -72,7 +72,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dvi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -90,7 +90,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dvi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -108,9 +108,9 @@ static int dvic_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dvi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dvi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -127,7 +127,7 @@ static void dvic_disable(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops.dvi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -140,7 +140,7 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dvi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void dvic_get_timings(struct omap_dss_device *dssdev,
@@ -157,7 +157,7 @@ static int dvic_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dvi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 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 e031280468fb..b528bd51ada3 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -69,7 +69,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.hdmi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -89,7 +89,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.hdmi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -109,9 +109,9 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.hdmi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.hdmi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -130,7 +130,7 @@ static void hdmic_disable(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops.hdmi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -143,7 +143,7 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.hdmi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void hdmic_get_timings(struct omap_dss_device *dssdev,
@@ -160,7 +160,7 @@ static int hdmic_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static int hdmic_read_edid(struct omap_dss_device *dssdev,
@@ -169,7 +169,7 @@ static int hdmic_read_edid(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->read_edid(in, edid, len);
+	return in->ops->hdmi.read_edid(in, edid, len);
 }
 
 static bool hdmic_detect(struct omap_dss_device *dssdev)
@@ -181,9 +181,9 @@ static bool hdmic_detect(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->hpd_gpio))
 		connected = gpio_get_value_cansleep(ddata->hpd_gpio);
 	else
-		connected = in->ops.hdmi->detect(in);
-	if (!connected && in->ops.hdmi->lost_hotplug)
-		in->ops.hdmi->lost_hotplug(in);
+		connected = in->ops->hdmi.detect(in);
+	if (!connected && in->ops->hdmi.lost_hotplug)
+		in->ops->hdmi.lost_hotplug(in);
 	return connected;
 }
 
@@ -201,8 +201,8 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
 		ddata->hpd_cb_data = cb_data;
 		mutex_unlock(&ddata->hpd_lock);
 		return 0;
-	} else if (in->ops.hdmi->register_hpd_cb) {
-		return in->ops.hdmi->register_hpd_cb(in, cb, cb_data);
+	} else if (in->ops->hdmi.register_hpd_cb) {
+		return in->ops->hdmi.register_hpd_cb(in, cb, cb_data);
 	}
 
 	return -ENOTSUPP;
@@ -218,8 +218,8 @@ static void hdmic_unregister_hpd_cb(struct omap_dss_device *dssdev)
 		ddata->hpd_cb = NULL;
 		ddata->hpd_cb_data = NULL;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops.hdmi->unregister_hpd_cb) {
-		in->ops.hdmi->unregister_hpd_cb(in);
+	} else if (in->ops->hdmi.unregister_hpd_cb) {
+		in->ops->hdmi.unregister_hpd_cb(in);
 	}
 }
 
@@ -232,8 +232,8 @@ static void hdmic_enable_hpd(struct omap_dss_device *dssdev)
 		mutex_lock(&ddata->hpd_lock);
 		ddata->hpd_enabled = true;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops.hdmi->enable_hpd) {
-		in->ops.hdmi->enable_hpd(in);
+	} else if (in->ops->hdmi.enable_hpd) {
+		in->ops->hdmi.enable_hpd(in);
 	}
 }
 
@@ -246,8 +246,8 @@ static void hdmic_disable_hpd(struct omap_dss_device *dssdev)
 		mutex_lock(&ddata->hpd_lock);
 		ddata->hpd_enabled = false;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops.hdmi->disable_hpd) {
-		in->ops.hdmi->disable_hpd(in);
+	} else if (in->ops->hdmi.disable_hpd) {
+		in->ops->hdmi.disable_hpd(in);
 	}
 }
 
@@ -256,7 +256,7 @@ static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode);
+	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
 }
 
 static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
@@ -265,7 +265,7 @@ static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->set_infoframe(in, avi);
+	return in->ops->hdmi.set_infoframe(in, avi);
 }
 
 static const struct omap_dss_driver hdmic_driver = {
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 0e3f4a20e531..37982ffe0ad4 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -50,7 +50,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.atv->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -82,7 +82,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops.atv->disconnect(in, &ddata->dssdev);
+	in->ops->disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -102,9 +102,9 @@ static int opa362_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.atv->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.atv->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -129,7 +129,7 @@ static void opa362_disable(struct omap_dss_device *dssdev)
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
-	in->ops.atv->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -144,7 +144,7 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.atv->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static int opa362_check_timings(struct omap_dss_device *dssdev,
@@ -155,16 +155,14 @@ static int opa362_check_timings(struct omap_dss_device *dssdev,
 
 	dev_dbg(dssdev->dev, "check_timings\n");
 
-	return in->ops.atv->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
-static const struct omapdss_atv_ops opa362_atv_ops = {
+static const struct omap_dss_device_ops opa362_ops = {
 	.connect	= opa362_connect,
 	.disconnect	= opa362_disconnect,
-
 	.enable		= opa362_enable,
 	.disable	= opa362_disable,
-
 	.check_timings	= opa362_check_timings,
 	.set_timings	= opa362_set_timings,
 };
@@ -191,7 +189,7 @@ static int opa362_probe(struct platform_device *pdev)
 	ddata->enable_gpio = gpio;
 
 	dssdev = &ddata->dssdev;
-	dssdev->ops.atv = &opa362_atv_ops;
+	dssdev->ops = &opa362_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 08e63e39d0b7..1fbc5559e54f 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -44,7 +44,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -74,7 +74,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops.dpi->disconnect(in, &ddata->dssdev);
+	in->ops->disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -92,9 +92,9 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -117,7 +117,7 @@ static void tfp410_disable(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->pd_gpio))
 		gpio_set_value_cansleep(ddata->pd_gpio, 0);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -138,7 +138,7 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static int tfp410_check_timings(struct omap_dss_device *dssdev,
@@ -149,16 +149,14 @@ static int tfp410_check_timings(struct omap_dss_device *dssdev,
 
 	tfp410_fix_timings(vm);
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
-static const struct omapdss_dvi_ops tfp410_dvi_ops = {
+static const struct omap_dss_device_ops tfp410_ops = {
 	.connect	= tfp410_connect,
 	.disconnect	= tfp410_disconnect,
-
 	.enable		= tfp410_enable,
 	.disable	= tfp410_disable,
-
 	.check_timings	= tfp410_check_timings,
 	.set_timings	= tfp410_set_timings,
 };
@@ -209,7 +207,7 @@ static int tfp410_probe(struct platform_device *pdev)
 	}
 
 	dssdev = &ddata->dssdev;
-	dssdev->ops.dvi = &tfp410_dvi_ops;
+	dssdev->ops = &tfp410_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index f35e2afa3e9c..21a4a2fd42bf 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -49,7 +49,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.hdmi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -85,7 +85,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops.hdmi->disconnect(in, &ddata->dssdev);
+	in->ops->disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -100,9 +100,9 @@ static int tpd_enable(struct omap_dss_device *dssdev)
 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
 		return 0;
 
-	in->ops.hdmi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.hdmi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -119,7 +119,7 @@ static void tpd_disable(struct omap_dss_device *dssdev)
 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
 		return;
 
-	in->ops.hdmi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -132,7 +132,7 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.hdmi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static int tpd_check_timings(struct omap_dss_device *dssdev,
@@ -142,7 +142,7 @@ static int tpd_check_timings(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in = ddata->in;
 	int r;
 
-	r = in->ops.hdmi->check_timings(in, vm);
+	r = in->ops->check_timings(in, vm);
 
 	return r;
 }
@@ -156,7 +156,7 @@ static int tpd_read_edid(struct omap_dss_device *dssdev,
 	if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
 		return -ENODEV;
 
-	return in->ops.hdmi->read_edid(in, edid, len);
+	return in->ops->hdmi.read_edid(in, edid, len);
 }
 
 static bool tpd_detect(struct omap_dss_device *dssdev)
@@ -165,8 +165,8 @@ static bool tpd_detect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in = ddata->in;
 	bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
 
-	if (!connected && in->ops.hdmi->lost_hotplug)
-		in->ops.hdmi->lost_hotplug(in);
+	if (!connected && in->ops->hdmi.lost_hotplug)
+		in->ops->hdmi.lost_hotplug(in);
 	return connected;
 }
 
@@ -219,7 +219,7 @@ static int tpd_set_infoframe(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->set_infoframe(in, avi);
+	return in->ops->hdmi.set_infoframe(in, avi);
 }
 
 static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
@@ -228,27 +228,27 @@ static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode);
+	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
 }
 
-static const struct omapdss_hdmi_ops tpd_hdmi_ops = {
+static const struct omap_dss_device_ops tpd_ops = {
 	.connect		= tpd_connect,
 	.disconnect		= tpd_disconnect,
-
 	.enable			= tpd_enable,
 	.disable		= tpd_disable,
-
 	.check_timings		= tpd_check_timings,
 	.set_timings		= tpd_set_timings,
 
-	.read_edid		= tpd_read_edid,
-	.detect			= tpd_detect,
-	.register_hpd_cb	= tpd_register_hpd_cb,
-	.unregister_hpd_cb	= tpd_unregister_hpd_cb,
-	.enable_hpd		= tpd_enable_hpd,
-	.disable_hpd		= tpd_disable_hpd,
-	.set_infoframe		= tpd_set_infoframe,
-	.set_hdmi_mode		= tpd_set_hdmi_mode,
+	.hdmi = {
+		.read_edid		= tpd_read_edid,
+		.detect			= tpd_detect,
+		.register_hpd_cb	= tpd_register_hpd_cb,
+		.unregister_hpd_cb	= tpd_unregister_hpd_cb,
+		.enable_hpd		= tpd_enable_hpd,
+		.disable_hpd		= tpd_disable_hpd,
+		.set_infoframe		= tpd_set_infoframe,
+		.set_hdmi_mode		= tpd_set_hdmi_mode,
+	},
 };
 
 static irqreturn_t tpd_hpd_isr(int irq, void *data)
@@ -315,7 +315,7 @@ static int tpd_probe(struct platform_device *pdev)
 		return r;
 
 	dssdev = &ddata->dssdev;
-	dssdev->ops.hdmi = &tpd_hdmi_ops;
+	dssdev->ops = &tpd_ops;
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index bbd630ead3c1..15042351ace3 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -50,7 +50,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -68,7 +68,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -86,15 +86,15 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
 	r = regulator_enable(ddata->vcc_supply);
 	if (r) {
-		in->ops.dpi->disable(in);
+		in->ops->disable(in);
 		return r;
 	}
 
@@ -119,7 +119,7 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
 	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 	regulator_disable(ddata->vcc_supply);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -132,7 +132,7 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
@@ -149,7 +149,7 @@ static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver panel_dpi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 8d98cd628e11..4296f4ca39fe 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -146,7 +146,7 @@ static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
 	int r;
 	u8 buf[1];
 
-	r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
+	r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
 
 	if (r < 0)
 		return r;
@@ -159,7 +159,7 @@ 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 *in = ddata->in;
-	return in->ops.dsi->dcs_write(in, ddata->channel, &dcs_cmd, 1);
+	return in->ops->dsi.dcs_write(in, ddata->channel, &dcs_cmd, 1);
 }
 
 static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
@@ -167,7 +167,7 @@ static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
 	struct omap_dss_device *in = ddata->in;
 	u8 buf[2] = { dcs_cmd, param };
 
-	return in->ops.dsi->dcs_write(in, ddata->channel, buf, 2);
+	return in->ops->dsi.dcs_write(in, ddata->channel, buf, 2);
 }
 
 static int dsicm_sleep_in(struct panel_drv_data *ddata)
@@ -180,7 +180,7 @@ static int dsicm_sleep_in(struct panel_drv_data *ddata)
 	hw_guard_wait(ddata);
 
 	cmd = MIPI_DCS_ENTER_SLEEP_MODE;
-	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, &cmd, 1);
+	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, &cmd, 1);
 	if (r)
 		return r;
 
@@ -242,7 +242,7 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
 	buf[3] = (x2 >> 8) & 0xff;
 	buf[4] = (x2 >> 0) & 0xff;
 
-	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
+	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
 	if (r)
 		return r;
 
@@ -252,11 +252,11 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
 	buf[3] = (y2 >> 8) & 0xff;
 	buf[4] = (y2 >> 0) & 0xff;
 
-	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
+	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
 	if (r)
 		return r;
 
-	in->ops.dsi->bta_sync(in, ddata->channel);
+	in->ops->dsi.bta_sync(in, ddata->channel);
 
 	return r;
 }
@@ -290,7 +290,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
 	if (ddata->ext_te_gpio)
 		disable_irq(gpiod_to_irq(ddata->ext_te_gpio));
 
-	in->ops.dsi->disable(in, false, true);
+	in->ops->dsi.disable(in, false, true);
 
 	ddata->ulps_enabled = true;
 
@@ -315,13 +315,13 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
 	if (!ddata->ulps_enabled)
 		return 0;
 
-	r = in->ops.dsi->enable(in);
+	r = in->ops->enable(in);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
 		goto err1;
 	}
 
-	in->ops.dsi->enable_hs(in, ddata->channel, true);
+	in->ops->dsi.enable_hs(in, ddata->channel, true);
 
 	r = _dsicm_enable_te(ddata, true);
 	if (r) {
@@ -381,13 +381,13 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops.dsi->bus_lock(in);
+		in->ops->dsi.bus_lock(in);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
 
-		in->ops.dsi->bus_unlock(in);
+		in->ops->dsi.bus_unlock(in);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -421,14 +421,14 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops.dsi->bus_lock(in);
+		in->ops->dsi.bus_lock(in);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
 					&errors);
 
-		in->ops.dsi->bus_unlock(in);
+		in->ops->dsi.bus_unlock(in);
 	} else {
 		r = -ENODEV;
 	}
@@ -453,13 +453,13 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops.dsi->bus_lock(in);
+		in->ops->dsi.bus_lock(in);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_get_id(ddata, &id1, &id2, &id3);
 
-		in->ops.dsi->bus_unlock(in);
+		in->ops->dsi.bus_unlock(in);
 	} else {
 		r = -ENODEV;
 	}
@@ -489,14 +489,14 @@ static ssize_t dsicm_store_ulps(struct device *dev,
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops.dsi->bus_lock(in);
+		in->ops->dsi.bus_lock(in);
 
 		if (t)
 			r = dsicm_enter_ulps(ddata);
 		else
 			r = dsicm_wake_up(ddata);
 
-		in->ops.dsi->bus_unlock(in);
+		in->ops->dsi.bus_unlock(in);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -541,9 +541,9 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
 
 	if (ddata->enabled) {
 		/* dsicm_wake_up will restart the timer */
-		in->ops.dsi->bus_lock(in);
+		in->ops->dsi.bus_lock(in);
 		r = dsicm_wake_up(ddata);
-		in->ops.dsi->bus_unlock(in);
+		in->ops->dsi.bus_unlock(in);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -635,7 +635,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	}
 
 	if (ddata->pin_config.num_pins > 0) {
-		r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
+		r = in->ops->dsi.configure_pins(in, &ddata->pin_config);
 		if (r) {
 			dev_err(&ddata->pdev->dev,
 				"failed to configure DSI pins\n");
@@ -643,13 +643,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 		}
 	}
 
-	r = in->ops.dsi->set_config(in, &dsi_config);
+	r = in->ops->dsi.set_config(in, &dsi_config);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
 		goto err_vddi;
 	}
 
-	r = in->ops.dsi->enable(in);
+	r = in->ops->enable(in);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
 		goto err_vddi;
@@ -657,7 +657,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 	dsicm_hw_reset(ddata);
 
-	in->ops.dsi->enable_hs(in, ddata->channel, false);
+	in->ops->dsi.enable_hs(in, ddata->channel, false);
 
 	r = dsicm_sleep_out(ddata);
 	if (r)
@@ -689,7 +689,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	if (r)
 		goto err;
 
-	r = in->ops.dsi->enable_video_output(in, ddata->channel);
+	r = in->ops->dsi.enable_video_output(in, ddata->channel);
 	if (r)
 		goto err;
 
@@ -701,7 +701,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 		ddata->intro_printed = true;
 	}
 
-	in->ops.dsi->enable_hs(in, ddata->channel, true);
+	in->ops->dsi.enable_hs(in, ddata->channel, true);
 
 	return 0;
 err:
@@ -709,7 +709,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 	dsicm_hw_reset(ddata);
 
-	in->ops.dsi->disable(in, true, false);
+	in->ops->dsi.disable(in, true, false);
 err_vddi:
 	if (ddata->vddi)
 		regulator_disable(ddata->vddi);
@@ -725,7 +725,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
 	struct omap_dss_device *in = ddata->in;
 	int r;
 
-	in->ops.dsi->disable_video_output(in, ddata->channel);
+	in->ops->dsi.disable_video_output(in, ddata->channel);
 
 	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
 	if (!r)
@@ -737,7 +737,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
 		dsicm_hw_reset(ddata);
 	}
 
-	in->ops.dsi->disable(in, true, false);
+	in->ops->dsi.disable(in, true, false);
 
 	if (ddata->vddi)
 		regulator_disable(ddata->vddi);
@@ -772,19 +772,19 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dsi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		dev_err(dev, "Failed to connect to video source\n");
 		goto err_connect;
 	}
 
-	r = in->ops.dsi->request_vc(in, &ddata->channel);
+	r = in->ops->dsi.request_vc(in, &ddata->channel);
 	if (r) {
 		dev_err(dev, "failed to get virtual channel\n");
 		goto err_req_vc;
 	}
 
-	r = in->ops.dsi->set_vc_id(in, ddata->channel, TCH);
+	r = in->ops->dsi.set_vc_id(in, ddata->channel, TCH);
 	if (r) {
 		dev_err(dev, "failed to set VC_ID\n");
 		goto err_vc_id;
@@ -794,9 +794,9 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 	return 0;
 
 err_vc_id:
-	in->ops.dsi->release_vc(in, ddata->channel);
+	in->ops->dsi.release_vc(in, ddata->channel);
 err_req_vc:
-	in->ops.dsi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 err_connect:
 	omap_dss_put_device(in);
 	return r;
@@ -810,8 +810,8 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dsi->release_vc(in, ddata->channel);
-	in->ops.dsi->disconnect(in, dssdev);
+	in->ops->dsi.release_vc(in, ddata->channel);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -837,11 +837,11 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	r = dsicm_power_on(ddata);
 
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 
 	if (r)
 		goto err;
@@ -873,7 +873,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 
 	dsicm_cancel_ulps_work(ddata);
 
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	if (omapdss_device_is_enabled(dssdev)) {
 		r = dsicm_wake_up(ddata);
@@ -881,7 +881,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 			dsicm_power_off(ddata);
 	}
 
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 
@@ -894,7 +894,7 @@ static void dsicm_framedone_cb(int err, void *data)
 	struct omap_dss_device *in = ddata->in;
 
 	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
-	in->ops.dsi->bus_unlock(ddata->in);
+	in->ops->dsi.bus_unlock(ddata->in);
 }
 
 static irqreturn_t dsicm_te_isr(int irq, void *data)
@@ -909,7 +909,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
 	if (old) {
 		cancel_delayed_work(&ddata->te_timeout_work);
 
-		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
+		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
 				ddata);
 		if (r)
 			goto err;
@@ -918,7 +918,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
 	return IRQ_HANDLED;
 err:
 	dev_err(&ddata->pdev->dev, "start update failed\n");
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 	return IRQ_HANDLED;
 }
 
@@ -931,7 +931,7 @@ static void dsicm_te_timeout_work_callback(struct work_struct *work)
 	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
 
 	atomic_set(&ddata->do_update, 0);
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 }
 
 static int dsicm_update(struct omap_dss_device *dssdev,
@@ -944,7 +944,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
 
 	mutex_lock(&ddata->lock);
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	r = dsicm_wake_up(ddata);
 	if (r)
@@ -966,7 +966,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 				msecs_to_jiffies(250));
 		atomic_set(&ddata->do_update, 1);
 	} else {
-		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
+		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
 				ddata);
 		if (r)
 			goto err;
@@ -976,7 +976,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 	mutex_unlock(&ddata->lock);
 	return 0;
 err:
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 	mutex_unlock(&ddata->lock);
 	return r;
 }
@@ -989,8 +989,8 @@ static int dsicm_sync(struct omap_dss_device *dssdev)
 	dev_dbg(&ddata->pdev->dev, "sync\n");
 
 	mutex_lock(&ddata->lock);
-	in->ops.dsi->bus_lock(in);
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_lock(in);
+	in->ops->dsi.bus_unlock(in);
 	mutex_unlock(&ddata->lock);
 
 	dev_dbg(&ddata->pdev->dev, "sync done\n");
@@ -1009,7 +1009,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 		r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
 
 	if (!ddata->ext_te_gpio)
-		in->ops.dsi->enable_te(in, enable);
+		in->ops->dsi.enable_te(in, enable);
 
 	/* possible panel bug */
 	msleep(100);
@@ -1028,7 +1028,7 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
 	if (ddata->te_enabled == enable)
 		goto end;
 
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	if (ddata->enabled) {
 		r = dsicm_wake_up(ddata);
@@ -1042,13 +1042,13 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
 
 	ddata->te_enabled = enable;
 
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 end:
 	mutex_unlock(&ddata->lock);
 
 	return 0;
 err:
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 	mutex_unlock(&ddata->lock);
 
 	return r;
@@ -1090,7 +1090,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 	size = min((u32)w * h * 3,
 		   ddata->vm.hactive * ddata->vm.vactive * 3);
 
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	r = dsicm_wake_up(ddata);
 	if (r)
@@ -1106,7 +1106,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 
 	dsicm_set_update_window(ddata, x, y, w, h);
 
-	r = in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, plen);
+	r = in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, plen);
 	if (r)
 		goto err2;
 
@@ -1114,7 +1114,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 		u8 dcs_cmd = first ? 0x2e : 0x3e;
 		first = 0;
 
-		r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd,
+		r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd,
 				buf + buf_used, size - buf_used);
 
 		if (r < 0) {
@@ -1140,9 +1140,9 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 	r = buf_used;
 
 err3:
-	in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, 1);
+	in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, 1);
 err2:
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 err1:
 	mutex_unlock(&ddata->lock);
 	return r;
@@ -1162,11 +1162,11 @@ static void dsicm_ulps_work(struct work_struct *work)
 		return;
 	}
 
-	in->ops.dsi->bus_lock(in);
+	in->ops->dsi.bus_lock(in);
 
 	dsicm_enter_ulps(ddata);
 
-	in->ops.dsi->bus_unlock(in);
+	in->ops->dsi.bus_unlock(in);
 	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 0a6ab6470253..8e293708261c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -131,7 +131,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -151,7 +151,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -169,9 +169,9 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -194,7 +194,7 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -207,7 +207,7 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void lb035q02_get_timings(struct omap_dss_device *dssdev,
@@ -224,7 +224,7 @@ static int lb035q02_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver lb035q02_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 9816e661c97d..7296c794326c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -127,7 +127,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -145,7 +145,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -163,9 +163,9 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -188,7 +188,7 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->res_gpio))
 		gpio_set_value_cansleep(ddata->res_gpio, 0);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -201,7 +201,7 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void nec_8048_get_timings(struct omap_dss_device *dssdev,
@@ -218,7 +218,7 @@ static int nec_8048_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver nec_8048_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index e259240f96fa..00291b9ecfde 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -73,7 +73,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -91,7 +91,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -109,7 +109,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
 	if (ddata->vcc) {
 		r = regulator_enable(ddata->vcc);
@@ -117,7 +117,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 			return r;
 	}
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r) {
 		regulator_disable(ddata->vcc);
 		return r;
@@ -155,7 +155,7 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
 
 	msleep(100);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	if (ddata->vcc)
 		regulator_disable(ddata->vcc);
@@ -171,7 +171,7 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
@@ -188,7 +188,7 @@ static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver sharp_ls_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index b4917d12d913..03fb297581fd 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -522,7 +522,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.sdi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -540,7 +540,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.sdi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -554,9 +554,9 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
 
 	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
 
-	in->ops.sdi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.sdi->enable(in);
+	r = in->ops->enable(in);
 	if (r) {
 		pr_err("%s sdi enable failed\n", __func__);
 		return r;
@@ -621,7 +621,7 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
 	/* FIXME need to tweak this delay */
 	msleep(100);
 
-	in->ops.sdi->disable(in);
+	in->ops->disable(in);
 }
 
 static int acx565akm_enable(struct omap_dss_device *dssdev)
@@ -672,7 +672,7 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.sdi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void acx565akm_get_timings(struct omap_dss_device *dssdev,
@@ -689,7 +689,7 @@ static int acx565akm_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.sdi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver acx565akm_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 5faaf760e81b..abdbbaf02674 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -181,7 +181,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -199,7 +199,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -217,9 +217,9 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -328,7 +328,7 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
 	jbt_ret_write_0(ddata, JBT_REG_SLEEP_IN);
 	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -341,7 +341,7 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
@@ -358,7 +358,7 @@ static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver td028ttec1_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 8e98232ee9d9..de1140314a7a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -352,7 +352,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops.dpi->connect(in, dssdev);
+	r = in->ops->connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -370,7 +370,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops.dpi->disconnect(in, dssdev);
+	in->ops->disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
@@ -388,9 +388,9 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops.dpi->set_timings(in, &ddata->vm);
+	in->ops->set_timings(in, &ddata->vm);
 
-	r = in->ops.dpi->enable(in);
+	r = in->ops->enable(in);
 	if (r)
 		return r;
 
@@ -401,7 +401,7 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 	if (!ddata->spi_suspended) {
 		r = tpo_td043_power_on(ddata);
 		if (r) {
-			in->ops.dpi->disable(in);
+			in->ops->disable(in);
 			return r;
 		}
 	}
@@ -419,7 +419,7 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops.dpi->disable(in);
+	in->ops->disable(in);
 
 	if (!ddata->spi_suspended)
 		tpo_td043_power_off(ddata);
@@ -435,7 +435,7 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
 
 	ddata->vm = *vm;
 
-	in->ops.dpi->set_timings(in, vm);
+	in->ops->set_timings(in, vm);
 }
 
 static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
@@ -452,7 +452,7 @@ static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	return in->ops.dpi->check_timings(in, vm);
+	return in->ops->check_timings(in, vm);
 }
 
 static const struct omap_dss_driver tpo_td043_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index af002c57a41d..4516086e85fa 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -681,7 +681,7 @@ static void dpi_disconnect(struct omap_dss_device *dssdev,
 	dss_mgr_disconnect(&dpi->output, dssdev);
 }
 
-static const struct omapdss_dpi_ops dpi_ops = {
+static const struct omap_dss_device_ops dpi_ops = {
 	.connect = dpi_connect,
 	.disconnect = dpi_disconnect,
 
@@ -720,7 +720,7 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 	out->output_type = OMAP_DISPLAY_TYPE_DPI;
 	out->dispc_channel = dpi_get_channel(dpi, port_num);
 	out->port_num = port_num;
-	out->ops.dpi = &dpi_ops;
+	out->ops = &dpi_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index d4a680629825..e4f496382617 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5000,43 +5000,45 @@ static void dsi_disconnect(struct omap_dss_device *dssdev,
 	dss_mgr_disconnect(&dsi->output, dssdev);
 }
 
-static const struct omapdss_dsi_ops dsi_ops = {
+static const struct omap_dss_device_ops dsi_ops = {
 	.connect = dsi_connect,
 	.disconnect = dsi_disconnect,
+	.enable = dsi_display_enable,
 
-	.bus_lock = dsi_bus_lock,
-	.bus_unlock = dsi_bus_unlock,
+	.dsi = {
+		.bus_lock = dsi_bus_lock,
+		.bus_unlock = dsi_bus_unlock,
 
-	.enable = dsi_display_enable,
-	.disable = dsi_display_disable,
+		.disable = dsi_display_disable,
 
-	.enable_hs = dsi_vc_enable_hs,
+		.enable_hs = dsi_vc_enable_hs,
 
-	.configure_pins = dsi_configure_pins,
-	.set_config = dsi_set_config,
+		.configure_pins = dsi_configure_pins,
+		.set_config = dsi_set_config,
 
-	.enable_video_output = dsi_enable_video_output,
-	.disable_video_output = dsi_disable_video_output,
+		.enable_video_output = dsi_enable_video_output,
+		.disable_video_output = dsi_disable_video_output,
 
-	.update = dsi_update,
+		.update = dsi_update,
 
-	.enable_te = dsi_enable_te,
+		.enable_te = dsi_enable_te,
 
-	.request_vc = dsi_request_vc,
-	.set_vc_id = dsi_set_vc_id,
-	.release_vc = dsi_release_vc,
+		.request_vc = dsi_request_vc,
+		.set_vc_id = dsi_set_vc_id,
+		.release_vc = dsi_release_vc,
 
-	.dcs_write = dsi_vc_dcs_write,
-	.dcs_write_nosync = dsi_vc_dcs_write_nosync,
-	.dcs_read = dsi_vc_dcs_read,
+		.dcs_write = dsi_vc_dcs_write,
+		.dcs_write_nosync = dsi_vc_dcs_write_nosync,
+		.dcs_read = dsi_vc_dcs_read,
 
-	.gen_write = dsi_vc_generic_write,
-	.gen_write_nosync = dsi_vc_generic_write_nosync,
-	.gen_read = dsi_vc_generic_read,
+		.gen_write = dsi_vc_generic_write,
+		.gen_write_nosync = dsi_vc_generic_write_nosync,
+		.gen_read = dsi_vc_generic_read,
 
-	.bta_sync = dsi_vc_send_bta_sync,
+		.bta_sync = dsi_vc_send_bta_sync,
 
-	.set_max_rx_packet_size = dsi_vc_set_max_rx_packet_size,
+		.set_max_rx_packet_size = dsi_vc_set_max_rx_packet_size,
+	},
 };
 
 static void dsi_init_output(struct dsi_data *dsi)
@@ -5050,7 +5052,7 @@ static void dsi_init_output(struct dsi_data *dsi)
 	out->output_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 = &dsi_ops;
+	out->ops = &dsi_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index b3d7865347a3..e0406f2a90e7 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -540,7 +540,7 @@ static int hdmi_set_hdmi_mode(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static const struct omapdss_hdmi_ops hdmi_ops = {
+static const struct omap_dss_device_ops hdmi_ops = {
 	.connect		= hdmi_connect,
 	.disconnect		= hdmi_disconnect,
 
@@ -550,10 +550,12 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
 	.check_timings		= hdmi_display_check_timing,
 	.set_timings		= hdmi_display_set_timing,
 
-	.read_edid		= hdmi_read_edid,
-	.lost_hotplug		= hdmi_lost_hotplug,
-	.set_infoframe		= hdmi_set_infoframe,
-	.set_hdmi_mode		= hdmi_set_hdmi_mode,
+	.hdmi = {
+		.read_edid		= hdmi_read_edid,
+		.lost_hotplug		= hdmi_lost_hotplug,
+		.set_infoframe		= hdmi_set_infoframe,
+		.set_hdmi_mode		= hdmi_set_hdmi_mode,
+	},
 };
 
 static void hdmi_init_output(struct omap_hdmi *hdmi)
@@ -565,7 +567,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
 	out->name = "hdmi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-	out->ops.hdmi = &hdmi_ops;
+	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 8e9b3a24b2ab..45d2eacedb2a 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -532,7 +532,7 @@ static int hdmi_set_hdmi_mode(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static const struct omapdss_hdmi_ops hdmi_ops = {
+static const struct omap_dss_device_ops hdmi_ops = {
 	.connect		= hdmi_connect,
 	.disconnect		= hdmi_disconnect,
 
@@ -542,9 +542,11 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
 	.check_timings		= hdmi_display_check_timing,
 	.set_timings		= hdmi_display_set_timing,
 
-	.read_edid		= hdmi_read_edid,
-	.set_infoframe		= hdmi_set_infoframe,
-	.set_hdmi_mode		= hdmi_set_hdmi_mode,
+	.hdmi = {
+		.read_edid		= hdmi_read_edid,
+		.set_infoframe		= hdmi_set_infoframe,
+		.set_hdmi_mode		= hdmi_set_hdmi_mode,
+	},
 };
 
 static void hdmi_init_output(struct omap_hdmi *hdmi)
@@ -556,7 +558,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
 	out->name = "hdmi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-	out->ops.hdmi = &hdmi_ops;
+	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 2ec74206bcff..fb6c9d522013 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -296,80 +296,7 @@ struct omap_dss_writeback_info {
 	u8 pre_mult_alpha;
 };
 
-struct omapdss_dpi_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
-	void (*disable)(struct omap_dss_device *dssdev);
-
-	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
-	void (*set_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
-};
-
-struct omapdss_sdi_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
-	void (*disable)(struct omap_dss_device *dssdev);
-
-	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
-	void (*set_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
-};
-
-struct omapdss_dvi_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
-	void (*disable)(struct omap_dss_device *dssdev);
-
-	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
-	void (*set_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
-};
-
-struct omapdss_atv_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
-	void (*disable)(struct omap_dss_device *dssdev);
-
-	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
-	void (*set_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
-};
-
 struct omapdss_hdmi_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
-	void (*disable)(struct omap_dss_device *dssdev);
-
-	int (*check_timings)(struct omap_dss_device *dssdev,
-			     struct videomode *vm);
-	void (*set_timings)(struct omap_dss_device *dssdev,
-			    struct videomode *vm);
-
 	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
 	void (*lost_hotplug)(struct omap_dss_device *dssdev);
 	bool (*detect)(struct omap_dss_device *dssdev);
@@ -388,12 +315,6 @@ struct omapdss_hdmi_ops {
 };
 
 struct omapdss_dsi_ops {
-	int (*connect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
-
-	int (*enable)(struct omap_dss_device *dssdev);
 	void (*disable)(struct omap_dss_device *dssdev, bool disconnect_lanes,
 			bool enter_ulps);
 
@@ -444,6 +365,26 @@ struct omapdss_dsi_ops {
 			int channel, u16 plen);
 };
 
+struct omap_dss_device_ops {
+	int (*connect)(struct omap_dss_device *dssdev,
+			struct omap_dss_device *dst);
+	void (*disconnect)(struct omap_dss_device *dssdev,
+			struct omap_dss_device *dst);
+
+	int (*enable)(struct omap_dss_device *dssdev);
+	void (*disable)(struct omap_dss_device *dssdev);
+
+	int (*check_timings)(struct omap_dss_device *dssdev,
+			     struct videomode *vm);
+	void (*set_timings)(struct omap_dss_device *dssdev,
+			    struct videomode *vm);
+
+	union {
+		const struct omapdss_hdmi_ops hdmi;
+		const struct omapdss_dsi_ops dsi;
+	};
+};
+
 struct omap_dss_device {
 	struct kobject kobj;
 	struct device *dev;
@@ -461,15 +402,7 @@ struct omap_dss_device {
 	const char *name;
 
 	const struct omap_dss_driver *driver;
-
-	union {
-		const struct omapdss_dpi_ops *dpi;
-		const struct omapdss_sdi_ops *sdi;
-		const struct omapdss_dvi_ops *dvi;
-		const struct omapdss_hdmi_ops *hdmi;
-		const struct omapdss_atv_ops *atv;
-		const struct omapdss_dsi_ops *dsi;
-	} ops;
+	const struct omap_dss_device_ops *ops;
 
 	/* helper variable for driver suspend/resume */
 	bool activate_after_resume;
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 2a61409cfaf6..49499a2aae46 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -308,7 +308,7 @@ static void sdi_disconnect(struct omap_dss_device *dssdev,
 	dss_mgr_disconnect(&sdi->output, dssdev);
 }
 
-static const struct omapdss_sdi_ops sdi_ops = {
+static const struct omap_dss_device_ops sdi_ops = {
 	.connect = sdi_connect,
 	.disconnect = sdi_disconnect,
 
@@ -330,7 +330,7 @@ static void sdi_init_output(struct sdi_device *sdi)
 	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
 	/* We have SDI only on OMAP3, where it's on port 1 */
 	out->port_num = 1;
-	out->ops.sdi = &sdi_ops;
+	out->ops = &sdi_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index a9225bd2df6d..c2ea182f1074 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -750,7 +750,7 @@ static void venc_disconnect(struct omap_dss_device *dssdev,
 	dss_mgr_disconnect(&venc->output, dssdev);
 }
 
-static const struct omapdss_atv_ops venc_ops = {
+static const struct omap_dss_device_ops venc_ops = {
 	.connect = venc_connect,
 	.disconnect = venc_disconnect,
 
@@ -770,7 +770,7 @@ static void venc_init_output(struct venc_device *venc)
 	out->output_type = OMAP_DISPLAY_TYPE_VENC;
 	out->name = "venc.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-	out->ops.atv = &venc_ops;
+	out->ops = &venc_ops;
 	out->owner = THIS_MODULE;
 
 	omapdss_register_output(out);
-- 
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] 127+ messages in thread

* [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (18 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:47   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers Laurent Pinchart
                   ` (40 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device objects model display components and are connected
at runtime to create display pipelines. The connect and disconnect
operations implemented by each component contain lots of duplicate code.
As a first step towards fixing this, create new functions to wrap the
direct calls to those operations and use them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c   |  4 ++--
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c     |  4 ++--
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c    |  4 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    |  4 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  4 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  4 ++--
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c         |  4 ++--
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c      |  6 +++---
 .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c  |  4 ++--
 .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c  |  4 ++--
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c   |  4 ++--
 .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c  |  4 ++--
 .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c  |  4 ++--
 .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c  |  4 ++--
 drivers/gpu/drm/omapdrm/dss/base.c                   | 20 ++++++++++++++++++++
 drivers/gpu/drm/omapdrm/dss/omapdss.h                |  4 ++++
 drivers/gpu/drm/omapdrm/omap_drv.c                   |  4 ++--
 17 files changed, 55 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index a94868d9398b..41ba3c5dbe7d 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -59,7 +59,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -79,7 +79,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 021e3b651c89..f193bbda550c 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -72,7 +72,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -90,7 +90,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index b528bd51ada3..014554afbb0d 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -69,7 +69,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -89,7 +89,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 37982ffe0ad4..752b565987c1 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -50,7 +50,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -82,7 +82,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops->disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 1fbc5559e54f..a8660e5e5ffc 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -44,7 +44,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -74,7 +74,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops->disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 21a4a2fd42bf..640f15b88467 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -49,7 +49,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -85,7 +85,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
 	dst->src = NULL;
 	dssdev->dst = NULL;
 
-	in->ops->disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 15042351ace3..987519501336 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -50,7 +50,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -68,7 +68,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 4296f4ca39fe..b7cd2ef17fbb 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -772,7 +772,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		dev_err(dev, "Failed to connect to video source\n");
 		goto err_connect;
@@ -796,7 +796,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 err_vc_id:
 	in->ops->dsi.release_vc(in, ddata->channel);
 err_req_vc:
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 err_connect:
 	omap_dss_put_device(in);
 	return r;
@@ -811,7 +811,7 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
 		return;
 
 	in->ops->dsi.release_vc(in, ddata->channel);
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 8e293708261c..e4a3b5828bf9 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -131,7 +131,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -151,7 +151,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 7296c794326c..e89dd32a2a60 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -127,7 +127,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -145,7 +145,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 00291b9ecfde..d0451cfab7f8 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -73,7 +73,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -91,7 +91,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 03fb297581fd..77721acf664d 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -522,7 +522,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -540,7 +540,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index abdbbaf02674..0baf5a5a5895 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -181,7 +181,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -199,7 +199,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index de1140314a7a..1daba7a60a9c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -352,7 +352,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(in);
 	}
 
-	r = in->ops->connect(in, dssdev);
+	r = omapdss_device_connect(in, dssdev);
 	if (r) {
 		omap_dss_put_device(in);
 		return r;
@@ -370,7 +370,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
 	if (!omapdss_device_is_connected(dssdev))
 		return;
 
-	in->ops->disconnect(in, dssdev);
+	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
 	ddata->in = NULL;
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index df6cb1ac43c8..576fd3d13259 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -102,6 +102,26 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 	return NULL;
 }
 
+int omapdss_device_connect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
+{
+	if (src->driver)
+		return src->driver->connect(src);
+	else
+		return src->ops->connect(src, dst);
+}
+EXPORT_SYMBOL_GPL(omapdss_device_connect);
+
+void omapdss_device_disconnect(struct omap_dss_device *src,
+			       struct omap_dss_device *dst)
+{
+	if (src->driver)
+		src->driver->disconnect(src);
+	else
+		src->ops->disconnect(src, dst);
+}
+EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
+
 /* -----------------------------------------------------------------------------
  * Components Handling
  */
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index fb6c9d522013..58bd6948bcde 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -498,6 +498,10 @@ void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(struct omap_dss_device *dssdev);
 struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 						    unsigned int port);
+int omapdss_device_connect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst);
+void omapdss_device_disconnect(struct omap_dss_device *src,
+			       struct omap_dss_device *dst);
 
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
 void omap_dss_put_device(struct omap_dss_device *dssdev);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index e2d7f8bfb4c1..f1df5be198a8 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -159,7 +159,7 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
 	for (i = 0; i < priv->num_dssdevs; i++) {
 		struct omap_dss_device *dssdev = priv->dssdevs[i];
 
-		dssdev->driver->disconnect(dssdev);
+		omapdss_device_disconnect(dssdev, NULL);
 		priv->dssdevs[i] = NULL;
 		omap_dss_put_device(dssdev);
 	}
@@ -189,7 +189,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 		return -EPROBE_DEFER;
 
 	for_each_dss_dev(dssdev) {
-		r = dssdev->driver->connect(dssdev);
+		r = omapdss_device_connect(dssdev, NULL);
 		if (r == -EPROBE_DEFER) {
 			omap_dss_put_device(dssdev);
 			goto cleanup;
-- 
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] 127+ messages in thread

* [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (19 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:47   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set " Laurent Pinchart
                   ` (39 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The connectors, encoders and display duplicate the same debug messages
and connection checks in their omap_dss_device connect and disconnect
handlers. Move the code to the connect and disconnect wrappers.

To simplify the code the connect function returns -EBUSY unconditionally
if the device is already connected. This doesn't cause any change in
practice: the connect handler of displays is never called on a connected
device as it is only invoked during omapdrm initialization.

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

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 41ba3c5dbe7d..d77e21fc26ad 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -48,11 +48,6 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	dev_dbg(ddata->dev, "connect\n");
-
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(ddata->dev, "failed to find video source\n");
@@ -74,11 +69,6 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	dev_dbg(ddata->dev, "disconnect\n");
-
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index f193bbda550c..9a3ecc3ed5b2 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -63,9 +63,6 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -87,9 +84,6 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 014554afbb0d..665af9932317 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -58,11 +58,6 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	dev_dbg(ddata->dev, "connect\n");
-
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(ddata->dev, "failed to find video source\n");
@@ -84,11 +79,6 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	dev_dbg(ddata->dev, "disconnect\n");
-
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 752b565987c1..5b9ef09e6b2d 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -39,11 +39,6 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in;
 	int r;
 
-	dev_dbg(dssdev->dev, "connect\n");
-
-	if (omapdss_device_is_connected(dssdev))
-		return -EBUSY;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -69,12 +64,6 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	dev_dbg(dssdev->dev, "disconnect\n");
-
-	WARN_ON(!omapdss_device_is_connected(dssdev));
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	WARN_ON(dst != dssdev->dst);
 	if (dst != dssdev->dst)
 		return;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index a8660e5e5ffc..b22c8f71c0e5 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -35,9 +35,6 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return -EBUSY;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -63,10 +60,6 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	WARN_ON(!omapdss_device_is_connected(dssdev));
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	WARN_ON(dst != dssdev->dst);
 	if (dst != dssdev->dst)
 		return;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 987519501336..5d704cf0809f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -41,9 +41,6 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -65,9 +62,6 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index b7cd2ef17fbb..be6c0c811e66 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -763,9 +763,6 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -807,9 +804,6 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	in->ops->dsi.release_vc(in, ddata->channel);
 	omapdss_device_disconnect(in, dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index e4a3b5828bf9..50b74e7351e9 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -122,9 +122,6 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -148,9 +145,6 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index e89dd32a2a60..769cba6c99ef 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -118,9 +118,6 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -142,9 +139,6 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index d0451cfab7f8..629ea2d93575 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -64,9 +64,6 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -88,9 +85,6 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 77721acf664d..75cb672b1161 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -513,9 +513,6 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -537,9 +534,6 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 0baf5a5a5895..2491c4876dd4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -172,9 +172,6 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -196,9 +193,6 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 1daba7a60a9c..df3d8103823d 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -343,9 +343,6 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *in;
 	int r;
 
-	if (omapdss_device_is_connected(dssdev))
-		return 0;
-
 	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
 	if (IS_ERR(in)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
@@ -367,9 +364,6 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	if (!omapdss_device_is_connected(dssdev))
-		return;
-
 	omapdss_device_disconnect(in, dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 576fd3d13259..01c117d8775b 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -105,6 +105,11 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 int omapdss_device_connect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
+	dev_dbg(src->dev, "connect\n");
+
+	if (omapdss_device_is_connected(src))
+		return -EBUSY;
+
 	if (src->driver)
 		return src->driver->connect(src);
 	else
@@ -115,6 +120,13 @@ EXPORT_SYMBOL_GPL(omapdss_device_connect);
 void omapdss_device_disconnect(struct omap_dss_device *src,
 			       struct omap_dss_device *dst)
 {
+	dev_dbg(src->dev, "disconnect\n");
+
+	if (!omapdss_device_is_connected(src)) {
+		WARN_ON(!src->driver);
+		return;
+	}
+
 	if (src->driver)
 		src->driver->disconnect(src);
 	else
-- 
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] 127+ messages in thread

* [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set to connection handlers
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (20 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 19:54   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data Laurent Pinchart
                   ` (38 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The encoders duplicate the same omap_dss_device src and dst fields set
and checks in their connect and disconnect handlers. Move the code to
the connect and disconnect wrappers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  | 10 ---------
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  | 10 ---------
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   | 11 ----------
 drivers/gpu/drm/omapdrm/dss/base.c                 | 24 ++++++++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/dpi.c                  |  5 -----
 drivers/gpu/drm/omapdrm/dss/dsi.c                  |  5 -----
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  5 -----
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  5 -----
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  8 +++-----
 drivers/gpu/drm/omapdrm/dss/output.c               |  6 ------
 drivers/gpu/drm/omapdrm/dss/sdi.c                  |  5 -----
 drivers/gpu/drm/omapdrm/dss/venc.c                 |  5 -----
 12 files changed, 25 insertions(+), 74 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 5b9ef09e6b2d..6baca0dc2b62 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -51,9 +51,6 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 		return r;
 	}
 
-	dst->src = dssdev;
-	dssdev->dst = dst;
-
 	ddata->in = in;
 	return 0;
 }
@@ -64,13 +61,6 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	WARN_ON(dst != dssdev->dst);
-	if (dst != dssdev->dst)
-		return;
-
-	dst->src = NULL;
-	dssdev->dst = NULL;
-
 	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index b22c8f71c0e5..c1ae8bebf04d 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -47,9 +47,6 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 		return r;
 	}
 
-	dst->src = dssdev;
-	dssdev->dst = dst;
-
 	ddata->in = in;
 	return 0;
 }
@@ -60,13 +57,6 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	WARN_ON(dst != dssdev->dst);
-	if (dst != dssdev->dst)
-		return;
-
-	dst->src = NULL;
-	dssdev->dst = NULL;
-
 	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 640f15b88467..8aa338d01bf7 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -55,9 +55,6 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 		return r;
 	}
 
-	dst->src = dssdev;
-	dssdev->dst = dst;
-
 	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 1);
 	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 1);
 
@@ -74,17 +71,9 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *in = ddata->in;
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 0);
 	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 0);
 
-	dst->src = NULL;
-	dssdev->dst = NULL;
-
 	omapdss_device_disconnect(in, &ddata->dssdev);
 
 	omap_dss_put_device(in);
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 01c117d8775b..810dcddded8a 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -105,15 +105,27 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 int omapdss_device_connect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
+	int ret;
+
 	dev_dbg(src->dev, "connect\n");
 
 	if (omapdss_device_is_connected(src))
 		return -EBUSY;
 
 	if (src->driver)
-		return src->driver->connect(src);
+		ret = src->driver->connect(src);
 	else
-		return src->ops->connect(src, dst);
+		ret = src->ops->connect(src, dst);
+
+	if (ret < 0)
+		return ret;
+
+	if (dst) {
+		dst->src = src;
+		src->dst = dst;
+	}
+
+	return 0;
 }
 EXPORT_SYMBOL_GPL(omapdss_device_connect);
 
@@ -127,6 +139,14 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 		return;
 	}
 
+	if (dst) {
+		if (WARN_ON(dst != src->dst))
+			return;
+
+		dst->src = NULL;
+		src->dst = NULL;
+	}
+
 	if (src->driver)
 		src->driver->disconnect(src);
 	else
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 4516086e85fa..c13feaf8b086 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -671,11 +671,6 @@ static void dpi_disconnect(struct omap_dss_device *dssdev,
 {
 	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&dpi->output, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index e4f496382617..4427389e0049 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4990,11 +4990,6 @@ static void dsi_disconnect(struct omap_dss_device *dssdev,
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&dsi->output, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index e0406f2a90e7..7e5474e87c11 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -478,11 +478,6 @@ static void hdmi_disconnect(struct omap_dss_device *dssdev,
 {
 	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&hdmi->output, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 45d2eacedb2a..86b18ccb8d24 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -481,11 +481,6 @@ static void hdmi_disconnect(struct omap_dss_device *dssdev,
 {
 	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&hdmi->output, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 58bd6948bcde..0033adf534d3 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -391,6 +391,9 @@ struct omap_dss_device {
 
 	struct module *owner;
 
+	struct omap_dss_device *src;
+	struct omap_dss_device *dst;
+
 	struct list_head list;
 	struct list_head panel_list;
 
@@ -409,8 +412,6 @@ struct omap_dss_device {
 
 	enum omap_display_caps caps;
 
-	struct omap_dss_device *src;
-
 	enum omap_dss_display_state state;
 
 	/* OMAP DSS output specific fields */
@@ -426,9 +427,6 @@ struct omap_dss_device {
 
 	/* the port number in the DT node */
 	int port_num;
-
-	/* dynamic fields */
-	struct omap_dss_device *dst;
 };
 
 struct omap_dss_driver {
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index e659c8e5c419..6abdb615a4c0 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -47,9 +47,6 @@ int omapdss_output_set_device(struct omap_dss_device *out,
 		goto err;
 	}
 
-	out->dst = dssdev;
-	dssdev->src = out;
-
 	mutex_unlock(&output_lock);
 
 	return 0;
@@ -81,9 +78,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
 		goto err;
 	}
 
-	out->dst->src = NULL;
-	out->dst = NULL;
-
 	mutex_unlock(&output_lock);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 49499a2aae46..77a8f7d86f7a 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -298,11 +298,6 @@ static void sdi_disconnect(struct omap_dss_device *dssdev,
 {
 	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&sdi->output, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index c2ea182f1074..8ea622d02b5c 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -740,11 +740,6 @@ static void venc_disconnect(struct omap_dss_device *dssdev,
 {
 	struct venc_device *venc = dssdev_to_venc(dssdev);
 
-	WARN_ON(dst != dssdev->dst);
-
-	if (dst != dssdev->dst)
-		return;
-
 	omapdss_output_unset_device(dssdev);
 
 	dss_mgr_disconnect(&venc->output, 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] 127+ messages in thread

* [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (21 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set " Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:03   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation Laurent Pinchart
                   ` (37 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

All connectors, encoders and panels store a pointer to their input
omap_dss_device in the panel driver data structure. This duplicates the
src field in the omap_dss_device structure. Remove the private copy and
use the src field.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  41 ++---
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  43 ++---
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  88 +++++-----
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  41 ++---
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  41 ++---
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  68 +++-----
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  44 +++--
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 190 ++++++++++-----------
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  41 ++---
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  42 ++---
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  42 ++---
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  42 ++---
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  42 ++---
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  44 +++--
 14 files changed, 362 insertions(+), 447 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index d77e21fc26ad..f579bd9ce7cb 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -18,7 +18,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct device *dev;
 
@@ -45,40 +44,37 @@ static const struct videomode tvc_pal_vm = {
 static int tvc_connect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(ddata->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void tvc_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int tvc_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(ddata->dev, "enable\n");
@@ -89,9 +85,9 @@ static int tvc_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -103,14 +99,14 @@ static int tvc_enable(struct omap_dss_device *dssdev)
 static void tvc_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(ddata->dev, "disable\n");
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -119,11 +115,11 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
 			    struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void tvc_get_timings(struct omap_dss_device *dssdev,
@@ -137,10 +133,9 @@ static void tvc_get_timings(struct omap_dss_device *dssdev,
 static int tvc_check_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver tvc_driver = {
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 9a3ecc3ed5b2..48dbb9df76b5 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -40,7 +40,6 @@ static const struct videomode dvic_default_vm = {
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -59,41 +58,37 @@ struct panel_drv_data {
 
 static int dvic_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void dvic_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int dvic_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -102,9 +97,9 @@ static int dvic_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -115,13 +110,12 @@ static int dvic_enable(struct omap_dss_device *dssdev)
 
 static void dvic_disable(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -130,11 +124,11 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void dvic_get_timings(struct omap_dss_device *dssdev,
@@ -148,10 +142,9 @@ static void dvic_get_timings(struct omap_dss_device *dssdev,
 static int dvic_check_timings(struct omap_dss_device *dssdev,
 			      struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 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 665af9932317..4acb53788862 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -37,7 +37,6 @@ static const struct videomode hdmic_default_vm = {
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 	void (*hpd_cb)(void *cb_data, enum drm_connector_status status);
 	void *hpd_cb_data;
 	bool hpd_enabled;
@@ -55,40 +54,37 @@ struct panel_drv_data {
 static int hdmic_connect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(ddata->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void hdmic_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int hdmic_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(ddata->dev, "enable\n");
@@ -99,9 +95,9 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -113,14 +109,14 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
 static void hdmic_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(ddata->dev, "disable\n");
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -129,11 +125,11 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
 			      struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void hdmic_get_timings(struct omap_dss_device *dssdev,
@@ -147,33 +143,31 @@ static void hdmic_get_timings(struct omap_dss_device *dssdev,
 static int hdmic_check_timings(struct omap_dss_device *dssdev,
 			       struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static int hdmic_read_edid(struct omap_dss_device *dssdev,
 		u8 *edid, int len)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->hdmi.read_edid(in, edid, len);
+	return src->ops->hdmi.read_edid(src, edid, len);
 }
 
 static bool hdmic_detect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	bool connected;
 
 	if (gpio_is_valid(ddata->hpd_gpio))
 		connected = gpio_get_value_cansleep(ddata->hpd_gpio);
 	else
-		connected = in->ops->hdmi.detect(in);
-	if (!connected && in->ops->hdmi.lost_hotplug)
-		in->ops->hdmi.lost_hotplug(in);
+		connected = src->ops->hdmi.detect(src);
+	if (!connected && src->ops->hdmi.lost_hotplug)
+		src->ops->hdmi.lost_hotplug(src);
 	return connected;
 }
 
@@ -183,7 +177,7 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
 				 void *cb_data)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (gpio_is_valid(ddata->hpd_gpio)) {
 		mutex_lock(&ddata->hpd_lock);
@@ -191,8 +185,8 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
 		ddata->hpd_cb_data = cb_data;
 		mutex_unlock(&ddata->hpd_lock);
 		return 0;
-	} else if (in->ops->hdmi.register_hpd_cb) {
-		return in->ops->hdmi.register_hpd_cb(in, cb, cb_data);
+	} else if (src->ops->hdmi.register_hpd_cb) {
+		return src->ops->hdmi.register_hpd_cb(src, cb, cb_data);
 	}
 
 	return -ENOTSUPP;
@@ -201,61 +195,59 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
 static void hdmic_unregister_hpd_cb(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (gpio_is_valid(ddata->hpd_gpio)) {
 		mutex_lock(&ddata->hpd_lock);
 		ddata->hpd_cb = NULL;
 		ddata->hpd_cb_data = NULL;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops->hdmi.unregister_hpd_cb) {
-		in->ops->hdmi.unregister_hpd_cb(in);
+	} else if (src->ops->hdmi.unregister_hpd_cb) {
+		src->ops->hdmi.unregister_hpd_cb(src);
 	}
 }
 
 static void hdmic_enable_hpd(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (gpio_is_valid(ddata->hpd_gpio)) {
 		mutex_lock(&ddata->hpd_lock);
 		ddata->hpd_enabled = true;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops->hdmi.enable_hpd) {
-		in->ops->hdmi.enable_hpd(in);
+	} else if (src->ops->hdmi.enable_hpd) {
+		src->ops->hdmi.enable_hpd(src);
 	}
 }
 
 static void hdmic_disable_hpd(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (gpio_is_valid(ddata->hpd_gpio)) {
 		mutex_lock(&ddata->hpd_lock);
 		ddata->hpd_enabled = false;
 		mutex_unlock(&ddata->hpd_lock);
-	} else if (in->ops->hdmi.disable_hpd) {
-		in->ops->hdmi.disable_hpd(in);
+	} else if (src->ops->hdmi.disable_hpd) {
+		src->ops->hdmi.disable_hpd(src);
 	}
 }
 
 static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
+	return src->ops->hdmi.set_hdmi_mode(src, hdmi_mode);
 }
 
 static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
 		const struct hdmi_avi_infoframe *avi)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->hdmi.set_infoframe(in, avi);
+	return src->ops->hdmi.set_infoframe(src, avi);
 }
 
 static const struct omap_dss_driver hdmic_driver = {
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 6baca0dc2b62..c9c744e0c92e 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -23,7 +23,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct gpio_desc *enable_gpio;
 
@@ -35,23 +34,21 @@ struct panel_drv_data {
 static int opa362_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
@@ -59,18 +56,17 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int opa362_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(dssdev->dev, "enable\n");
@@ -81,9 +77,9 @@ static int opa362_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -98,7 +94,7 @@ static int opa362_enable(struct omap_dss_device *dssdev)
 static void opa362_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(dssdev->dev, "disable\n");
 
@@ -108,7 +104,7 @@ static void opa362_disable(struct omap_dss_device *dssdev)
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -117,24 +113,23 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
 			       struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(dssdev->dev, "set_timings\n");
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static int opa362_check_timings(struct omap_dss_device *dssdev,
 				struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(dssdev->dev, "check_timings\n");
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_device_ops opa362_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index c1ae8bebf04d..f568e53a9104 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -19,7 +19,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	int pd_gpio;
 
@@ -31,23 +30,21 @@ struct panel_drv_data {
 static int tfp410_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
@@ -55,18 +52,17 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int tfp410_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -75,9 +71,9 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -92,7 +88,7 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
 static void tfp410_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -100,7 +96,7 @@ static void tfp410_disable(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->pd_gpio))
 		gpio_set_value_cansleep(ddata->pd_gpio, 0);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -115,24 +111,23 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
 			       struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	tfp410_fix_timings(vm);
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static int tfp410_check_timings(struct omap_dss_device *dssdev,
 				struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	tfp410_fix_timings(vm);
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_device_ops tfp410_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 8aa338d01bf7..7bbe794e9d21 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -21,7 +21,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 	void (*hpd_cb)(void *cb_data, enum drm_connector_status status);
 	void *hpd_cb_data;
 	bool hpd_enabled;
@@ -40,18 +39,18 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
@@ -61,7 +60,6 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 	/* DC-DC converter needs at max 300us to get to 90% of 5V */
 	udelay(300);
 
-	ddata->in = in;
 	return 0;
 }
 
@@ -69,29 +67,28 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 0);
 	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 0);
 
-	omapdss_device_disconnect(in, &ddata->dssdev);
+	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int tpd_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -102,13 +99,12 @@ static int tpd_enable(struct omap_dss_device *dssdev)
 
 static void tpd_disable(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
 		return;
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -117,45 +113,41 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
 			    struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static int tpd_check_timings(struct omap_dss_device *dssdev,
 			     struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
-	int r;
-
-	r = in->ops->check_timings(in, vm);
+	struct omap_dss_device *src = dssdev->src;
 
-	return r;
+	return src->ops->check_timings(src, vm);
 }
 
 static int tpd_read_edid(struct omap_dss_device *dssdev,
 		u8 *edid, int len)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
 		return -ENODEV;
 
-	return in->ops->hdmi.read_edid(in, edid, len);
+	return src->ops->hdmi.read_edid(src, edid, len);
 }
 
 static bool tpd_detect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
 
-	if (!connected && in->ops->hdmi.lost_hotplug)
-		in->ops->hdmi.lost_hotplug(in);
+	if (!connected && src->ops->hdmi.lost_hotplug)
+		src->ops->hdmi.lost_hotplug(src);
 	return connected;
 }
 
@@ -205,19 +197,17 @@ static void tpd_disable_hpd(struct omap_dss_device *dssdev)
 static int tpd_set_infoframe(struct omap_dss_device *dssdev,
 		const struct hdmi_avi_infoframe *avi)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->hdmi.set_infoframe(in, avi);
+	return src->ops->hdmi.set_infoframe(src, avi);
 }
 
 static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
 		bool hdmi_mode)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
+	return src->ops->hdmi.set_hdmi_mode(src, hdmi_mode);
 }
 
 static const struct omap_dss_device_ops tpd_ops = {
@@ -262,7 +252,7 @@ static irqreturn_t tpd_hpd_isr(int irq, void *data)
 
 static int tpd_probe(struct platform_device *pdev)
 {
-	struct omap_dss_device *in, *dssdev;
+	struct omap_dss_device *dssdev;
 	struct panel_drv_data *ddata;
 	int r;
 	struct gpio_desc *gpio;
@@ -311,8 +301,6 @@ static int tpd_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->port_num = 1;
 
-	in = ddata->in;
-
 	r = omapdss_register_output(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register output\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 5d704cf0809f..32af5b11b448 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -23,7 +23,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -37,41 +36,37 @@ struct panel_drv_data {
 
 static int panel_dpi_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int panel_dpi_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -80,15 +75,15 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
 	r = regulator_enable(ddata->vcc_supply);
 	if (r) {
-		in->ops->disable(in);
+		src->ops->disable(src);
 		return r;
 	}
 
@@ -103,7 +98,7 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 static void panel_dpi_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -113,7 +108,7 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
 	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 	regulator_disable(ddata->vcc_supply);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -122,11 +117,11 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
@@ -140,10 +135,9 @@ static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
 static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
 				   struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver panel_dpi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index be6c0c811e66..353510af58e7 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -41,7 +41,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -142,11 +141,11 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 	u8 buf[1];
 
-	r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
+	r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd, buf, 1);
 
 	if (r < 0)
 		return r;
@@ -158,29 +157,30 @@ 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 *in = ddata->in;
-	return in->ops->dsi.dcs_write(in, ddata->channel, &dcs_cmd, 1);
+	struct omap_dss_device *src = ddata->dssdev.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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	u8 buf[2] = { dcs_cmd, param };
 
-	return in->ops->dsi.dcs_write(in, ddata->channel, buf, 2);
+	return src->ops->dsi.dcs_write(src, ddata->channel, buf, 2);
 }
 
 static int dsicm_sleep_in(struct panel_drv_data *ddata)
 
 {
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	u8 cmd;
 	int r;
 
 	hw_guard_wait(ddata);
 
 	cmd = MIPI_DCS_ENTER_SLEEP_MODE;
-	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, &cmd, 1);
+	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, &cmd, 1);
 	if (r)
 		return r;
 
@@ -228,7 +228,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 	u16 x1 = x;
 	u16 x2 = x + w - 1;
@@ -242,7 +242,7 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
 	buf[3] = (x2 >> 8) & 0xff;
 	buf[4] = (x2 >> 0) & 0xff;
 
-	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
+	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf));
 	if (r)
 		return r;
 
@@ -252,11 +252,11 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
 	buf[3] = (y2 >> 8) & 0xff;
 	buf[4] = (y2 >> 0) & 0xff;
 
-	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
+	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf));
 	if (r)
 		return r;
 
-	in->ops->dsi.bta_sync(in, ddata->channel);
+	src->ops->dsi.bta_sync(src, ddata->channel);
 
 	return r;
 }
@@ -275,7 +275,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 
 	if (ddata->ulps_enabled)
@@ -290,7 +290,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
 	if (ddata->ext_te_gpio)
 		disable_irq(gpiod_to_irq(ddata->ext_te_gpio));
 
-	in->ops->dsi.disable(in, false, true);
+	src->ops->dsi.disable(src, false, true);
 
 	ddata->ulps_enabled = true;
 
@@ -309,19 +309,19 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
 
 static int dsicm_exit_ulps(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 
 	if (!ddata->ulps_enabled)
 		return 0;
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
 		goto err1;
 	}
 
-	in->ops->dsi.enable_hs(in, ddata->channel, true);
+	src->ops->dsi.enable_hs(src, ddata->channel, true);
 
 	r = _dsicm_enable_te(ddata, true);
 	if (r) {
@@ -366,7 +366,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r = 0;
 	int level;
 
@@ -381,13 +381,13 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops->dsi.bus_lock(in);
+		src->ops->dsi.bus_lock(src);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
 
-		in->ops->dsi.bus_unlock(in);
+		src->ops->dsi.bus_unlock(src);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -414,21 +414,21 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	u8 errors = 0;
 	int r;
 
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops->dsi.bus_lock(in);
+		src->ops->dsi.bus_lock(src);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
 					&errors);
 
-		in->ops->dsi.bus_unlock(in);
+		src->ops->dsi.bus_unlock(src);
 	} else {
 		r = -ENODEV;
 	}
@@ -446,20 +446,20 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	u8 id1, id2, id3;
 	int r;
 
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops->dsi.bus_lock(in);
+		src->ops->dsi.bus_lock(src);
 
 		r = dsicm_wake_up(ddata);
 		if (!r)
 			r = dsicm_get_id(ddata, &id1, &id2, &id3);
 
-		in->ops->dsi.bus_unlock(in);
+		src->ops->dsi.bus_unlock(src);
 	} else {
 		r = -ENODEV;
 	}
@@ -478,7 +478,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	unsigned long t;
 	int r;
 
@@ -489,14 +489,14 @@ static ssize_t dsicm_store_ulps(struct device *dev,
 	mutex_lock(&ddata->lock);
 
 	if (ddata->enabled) {
-		in->ops->dsi.bus_lock(in);
+		src->ops->dsi.bus_lock(src);
 
 		if (t)
 			r = dsicm_enter_ulps(ddata);
 		else
 			r = dsicm_wake_up(ddata);
 
-		in->ops->dsi.bus_unlock(in);
+		src->ops->dsi.bus_unlock(src);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -528,7 +528,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	unsigned long t;
 	int r;
 
@@ -541,9 +541,9 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
 
 	if (ddata->enabled) {
 		/* dsicm_wake_up will restart the timer */
-		in->ops->dsi.bus_lock(in);
+		src->ops->dsi.bus_lock(src);
 		r = dsicm_wake_up(ddata);
-		in->ops->dsi.bus_unlock(in);
+		src->ops->dsi.bus_unlock(src);
 	}
 
 	mutex_unlock(&ddata->lock);
@@ -603,7 +603,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	u8 id1, id2, id3;
 	int r;
 	struct omap_dss_dsi_config dsi_config = {
@@ -635,7 +635,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	}
 
 	if (ddata->pin_config.num_pins > 0) {
-		r = in->ops->dsi.configure_pins(in, &ddata->pin_config);
+		r = src->ops->dsi.configure_pins(src, &ddata->pin_config);
 		if (r) {
 			dev_err(&ddata->pdev->dev,
 				"failed to configure DSI pins\n");
@@ -643,13 +643,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 		}
 	}
 
-	r = in->ops->dsi.set_config(in, &dsi_config);
+	r = src->ops->dsi.set_config(src, &dsi_config);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
 		goto err_vddi;
 	}
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r) {
 		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
 		goto err_vddi;
@@ -657,7 +657,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 	dsicm_hw_reset(ddata);
 
-	in->ops->dsi.enable_hs(in, ddata->channel, false);
+	src->ops->dsi.enable_hs(src, ddata->channel, false);
 
 	r = dsicm_sleep_out(ddata);
 	if (r)
@@ -689,7 +689,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 	if (r)
 		goto err;
 
-	r = in->ops->dsi.enable_video_output(in, ddata->channel);
+	r = src->ops->dsi.enable_video_output(src, ddata->channel);
 	if (r)
 		goto err;
 
@@ -701,7 +701,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 		ddata->intro_printed = true;
 	}
 
-	in->ops->dsi.enable_hs(in, ddata->channel, true);
+	src->ops->dsi.enable_hs(src, ddata->channel, true);
 
 	return 0;
 err:
@@ -709,7 +709,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 	dsicm_hw_reset(ddata);
 
-	in->ops->dsi.disable(in, true, false);
+	src->ops->dsi.disable(src, true, false);
 err_vddi:
 	if (ddata->vddi)
 		regulator_disable(ddata->vddi);
@@ -722,10 +722,10 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
 
 static void dsicm_power_off(struct panel_drv_data *ddata)
 {
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 
-	in->ops->dsi.disable_video_output(in, ddata->channel);
+	src->ops->dsi.disable_video_output(src, ddata->channel);
 
 	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
 	if (!r)
@@ -737,7 +737,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
 		dsicm_hw_reset(ddata);
 	}
 
-	in->ops->dsi.disable(in, true, false);
+	src->ops->dsi.disable(src, true, false);
 
 	if (ddata->vddi)
 		regulator_disable(ddata->vddi);
@@ -760,61 +760,59 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct device *dev = &ddata->pdev->dev;
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
 		dev_err(dev, "Failed to connect to video source\n");
 		goto err_connect;
 	}
 
-	r = in->ops->dsi.request_vc(in, &ddata->channel);
+	r = src->ops->dsi.request_vc(src, &ddata->channel);
 	if (r) {
 		dev_err(dev, "failed to get virtual channel\n");
 		goto err_req_vc;
 	}
 
-	r = in->ops->dsi.set_vc_id(in, ddata->channel, TCH);
+	r = src->ops->dsi.set_vc_id(src, ddata->channel, TCH);
 	if (r) {
 		dev_err(dev, "failed to set VC_ID\n");
 		goto err_vc_id;
 	}
 
-	ddata->in = in;
 	return 0;
 
 err_vc_id:
-	in->ops->dsi.release_vc(in, ddata->channel);
+	src->ops->dsi.release_vc(src, ddata->channel);
 err_req_vc:
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 err_connect:
-	omap_dss_put_device(in);
+	omap_dss_put_device(src);
 	return r;
 }
 
 static void dsicm_disconnect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	in->ops->dsi.release_vc(in, ddata->channel);
-	omapdss_device_disconnect(in, dssdev);
+	src->ops->dsi.release_vc(src, ddata->channel);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int dsicm_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(&ddata->pdev->dev, "enable\n");
@@ -831,11 +829,11 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	r = dsicm_power_on(ddata);
 
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 
 	if (r)
 		goto err;
@@ -856,7 +854,7 @@ static int 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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(&ddata->pdev->dev, "disable\n");
@@ -867,7 +865,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 
 	dsicm_cancel_ulps_work(ddata);
 
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	if (omapdss_device_is_enabled(dssdev)) {
 		r = dsicm_wake_up(ddata);
@@ -875,7 +873,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
 			dsicm_power_off(ddata);
 	}
 
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 
@@ -885,16 +883,16 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 
 	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
-	in->ops->dsi.bus_unlock(ddata->in);
+	src->ops->dsi.bus_unlock(src);
 }
 
 static irqreturn_t dsicm_te_isr(int irq, void *data)
 {
 	struct panel_drv_data *ddata = data;
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int old;
 	int r;
 
@@ -903,7 +901,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
 	if (old) {
 		cancel_delayed_work(&ddata->te_timeout_work);
 
-		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
+		r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb,
 				ddata);
 		if (r)
 			goto err;
@@ -912,7 +910,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
 	return IRQ_HANDLED;
 err:
 	dev_err(&ddata->pdev->dev, "start update failed\n");
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 	return IRQ_HANDLED;
 }
 
@@ -920,25 +918,25 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 
 	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
 
 	atomic_set(&ddata->do_update, 0);
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 }
 
 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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
 
 	mutex_lock(&ddata->lock);
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	r = dsicm_wake_up(ddata);
 	if (r)
@@ -960,17 +958,17 @@ static int dsicm_update(struct omap_dss_device *dssdev,
 				msecs_to_jiffies(250));
 		atomic_set(&ddata->do_update, 1);
 	} else {
-		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
+		r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb,
 				ddata);
 		if (r)
 			goto err;
 	}
 
-	/* note: no bus_unlock here. unlock is in framedone_cb */
+	/* note: no bus_unlock here. unlock is src framedone_cb */
 	mutex_unlock(&ddata->lock);
 	return 0;
 err:
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 	mutex_unlock(&ddata->lock);
 	return r;
 }
@@ -978,13 +976,13 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(&ddata->pdev->dev, "sync\n");
 
 	mutex_lock(&ddata->lock);
-	in->ops->dsi.bus_lock(in);
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_lock(src);
+	src->ops->dsi.bus_unlock(src);
 	mutex_unlock(&ddata->lock);
 
 	dev_dbg(&ddata->pdev->dev, "sync done\n");
@@ -994,7 +992,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 *in = ddata->in;
+	struct omap_dss_device *src = ddata->dssdev.src;
 	int r;
 
 	if (enable)
@@ -1003,7 +1001,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 		r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
 
 	if (!ddata->ext_te_gpio)
-		in->ops->dsi.enable_te(in, enable);
+		src->ops->dsi.enable_te(src, enable);
 
 	/* possible panel bug */
 	msleep(100);
@@ -1014,7 +1012,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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	mutex_lock(&ddata->lock);
@@ -1022,7 +1020,7 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
 	if (ddata->te_enabled == enable)
 		goto end;
 
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	if (ddata->enabled) {
 		r = dsicm_wake_up(ddata);
@@ -1036,13 +1034,13 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
 
 	ddata->te_enabled = enable;
 
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 end:
 	mutex_unlock(&ddata->lock);
 
 	return 0;
 err:
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 	mutex_unlock(&ddata->lock);
 
 	return r;
@@ -1065,7 +1063,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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 	int first = 1;
 	int plen;
@@ -1084,7 +1082,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 	size = min((u32)w * h * 3,
 		   ddata->vm.hactive * ddata->vm.vactive * 3);
 
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	r = dsicm_wake_up(ddata);
 	if (r)
@@ -1100,7 +1098,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 
 	dsicm_set_update_window(ddata, x, y, w, h);
 
-	r = in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, plen);
+	r = src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, plen);
 	if (r)
 		goto err2;
 
@@ -1108,7 +1106,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 		u8 dcs_cmd = first ? 0x2e : 0x3e;
 		first = 0;
 
-		r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd,
+		r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd,
 				buf + buf_used, size - buf_used);
 
 		if (r < 0) {
@@ -1134,9 +1132,9 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
 	r = buf_used;
 
 err3:
-	in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, 1);
+	src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, 1);
 err2:
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 err1:
 	mutex_unlock(&ddata->lock);
 	return r;
@@ -1147,7 +1145,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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	mutex_lock(&ddata->lock);
 
@@ -1156,11 +1154,11 @@ static void dsicm_ulps_work(struct work_struct *work)
 		return;
 	}
 
-	in->ops->dsi.bus_lock(in);
+	src->ops->dsi.bus_lock(src);
 
 	dsicm_enter_ulps(ddata);
 
-	in->ops->dsi.bus_unlock(in);
+	src->ops->dsi.bus_unlock(src);
 	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 50b74e7351e9..5bea3eadd7d2 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -45,7 +45,6 @@ static const struct videomode lb035q02_vm = {
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct spi_device *spi;
 
@@ -119,42 +118,39 @@ static void init_lb035q02_panel(struct spi_device *spi)
 static int lb035q02_connect(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
 	init_lb035q02_panel(ddata->spi);
 
-	ddata->in = in;
 	return 0;
 }
 
 static void lb035q02_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int lb035q02_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -163,9 +159,9 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -180,7 +176,7 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
 static void lb035q02_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -188,7 +184,7 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
 	if (ddata->enable_gpio)
 		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -197,11 +193,11 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
 				 struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void lb035q02_get_timings(struct omap_dss_device *dssdev,
@@ -215,10 +211,9 @@ static void lb035q02_get_timings(struct omap_dss_device *dssdev,
 static int lb035q02_check_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver lb035q02_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 769cba6c99ef..d03339034f18 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -21,7 +21,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device	dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -114,41 +113,37 @@ static int init_nec_8048_wvga_lcd(struct spi_device *spi)
 
 static int nec_8048_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void nec_8048_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int nec_8048_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -157,9 +152,9 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -174,7 +169,7 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
 static void nec_8048_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -182,7 +177,7 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->res_gpio))
 		gpio_set_value_cansleep(ddata->res_gpio, 0);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -191,11 +186,11 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
 				 struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void nec_8048_get_timings(struct omap_dss_device *dssdev,
@@ -209,10 +204,9 @@ static void nec_8048_get_timings(struct omap_dss_device *dssdev,
 static int nec_8048_check_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver nec_8048_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 629ea2d93575..93f1a0e89861 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -21,7 +21,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 	struct regulator *vcc;
 
 	struct videomode vm;
@@ -60,41 +59,37 @@ static const struct videomode sharp_ls_vm = {
 
 static int sharp_ls_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int sharp_ls_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -103,7 +98,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
 	if (ddata->vcc) {
 		r = regulator_enable(ddata->vcc);
@@ -111,7 +106,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 			return r;
 	}
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r) {
 		regulator_disable(ddata->vcc);
 		return r;
@@ -134,7 +129,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
 static void sharp_ls_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -149,7 +144,7 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
 
 	msleep(100);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	if (ddata->vcc)
 		regulator_disable(ddata->vcc);
@@ -161,11 +156,11 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
 				 struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
@@ -179,10 +174,9 @@ static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
 static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver sharp_ls_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 75cb672b1161..ce32ad974ae8 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -64,7 +64,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device	dssdev;
-	struct omap_dss_device *in;
 
 	int reset_gpio;
 
@@ -509,48 +508,44 @@ static const struct attribute_group bldev_attr_group = {
 
 static int acx565akm_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void acx565akm_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r) {
 		pr_err("%s sdi enable failed\n", __func__);
 		return r;
@@ -591,7 +586,7 @@ 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 *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	dev_dbg(dssdev->dev, "%s\n", __func__);
 
@@ -615,7 +610,7 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
 	/* FIXME need to tweak this delay */
 	msleep(100);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 }
 
 static int acx565akm_enable(struct omap_dss_device *dssdev)
@@ -662,11 +657,11 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void acx565akm_get_timings(struct omap_dss_device *dssdev,
@@ -680,10 +675,9 @@ static void acx565akm_get_timings(struct omap_dss_device *dssdev,
 static int acx565akm_check_timings(struct omap_dss_device *dssdev,
 				   struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver acx565akm_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 2491c4876dd4..3224502016f4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -33,7 +33,6 @@
 
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -168,41 +167,37 @@ enum jbt_register {
 
 static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -211,9 +206,9 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -310,7 +305,7 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
 static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
@@ -322,7 +317,7 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
 	jbt_ret_write_0(ddata, JBT_REG_SLEEP_IN);
 	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 }
@@ -331,11 +326,11 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
 					 struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
@@ -349,10 +344,9 @@ static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
 static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
 					  struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver td028ttec1_ops = {
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index df3d8103823d..e3212e476b91 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -54,7 +54,6 @@ static const u16 tpo_td043_def_gamma[12] = {
 
 struct panel_drv_data {
 	struct omap_dss_device	dssdev;
-	struct omap_dss_device *in;
 
 	struct videomode vm;
 
@@ -339,41 +338,37 @@ static void tpo_td043_power_off(struct panel_drv_data *ddata)
 
 static int tpo_td043_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in;
+	struct omap_dss_device *src;
 	int r;
 
-	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(in)) {
+	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(in);
+		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(in, dssdev);
+	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(in);
+		omap_dss_put_device(src);
 		return r;
 	}
 
-	ddata->in = in;
 	return 0;
 }
 
 static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	omapdss_device_disconnect(in, dssdev);
+	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(in);
-	ddata->in = NULL;
+	omap_dss_put_device(src);
 }
 
 static int tpo_td043_enable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 	int r;
 
 	if (!omapdss_device_is_connected(dssdev))
@@ -382,9 +377,9 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 	if (omapdss_device_is_enabled(dssdev))
 		return 0;
 
-	in->ops->set_timings(in, &ddata->vm);
+	src->ops->set_timings(src, &ddata->vm);
 
-	r = in->ops->enable(in);
+	r = src->ops->enable(src);
 	if (r)
 		return r;
 
@@ -395,7 +390,7 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 	if (!ddata->spi_suspended) {
 		r = tpo_td043_power_on(ddata);
 		if (r) {
-			in->ops->disable(in);
+			src->ops->disable(src);
 			return r;
 		}
 	}
@@ -408,12 +403,12 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
 static void tpo_td043_disable(struct omap_dss_device *dssdev)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	if (!omapdss_device_is_enabled(dssdev))
 		return;
 
-	in->ops->disable(in);
+	src->ops->disable(src);
 
 	if (!ddata->spi_suspended)
 		tpo_td043_power_off(ddata);
@@ -425,11 +420,11 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
 				  struct videomode *vm)
 {
 	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
 	ddata->vm = *vm;
 
-	in->ops->set_timings(in, vm);
+	src->ops->set_timings(src, vm);
 }
 
 static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
@@ -443,10 +438,9 @@ static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
 static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
 				   struct videomode *vm)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *in = ddata->in;
+	struct omap_dss_device *src = dssdev->src;
 
-	return in->ops->check_timings(in, vm);
+	return src->ops->check_timings(src, vm);
 }
 
 static const struct omap_dss_driver tpo_td043_ops = {
-- 
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] 127+ messages in thread

* [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (22 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:08   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files Laurent Pinchart
                   ` (36 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DSI debugfs regs and irqs show handlers received a pointer to the
DSI private data. There's no need to look it up from the list of DSS
outputs. Use the pointer directly, this allows simplifying the
implementation of the handlers.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 4427389e0049..9952803b58d2 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -1518,8 +1518,9 @@ void dsi_dump_clocks(struct seq_file *s)
 }
 
 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
-static void dsi_dump_dsi_irqs(struct dsi_data *dsi, struct seq_file *s)
+static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
 {
+	struct dsi_data *dsi = p;
 	unsigned long flags;
 	struct dsi_irq_stats stats;
 
@@ -1603,33 +1604,20 @@ static void dsi_dump_dsi_irqs(struct dsi_data *dsi, struct seq_file *s)
 	PIS(ULPSACTIVENOT_ALL0);
 	PIS(ULPSACTIVENOT_ALL1);
 #undef PIS
-}
-
-static int dsi1_dump_irqs(struct seq_file *s, void *p)
-{
-	struct dsi_data *dsi = dsi_get_dsi_from_id(0);
 
-	dsi_dump_dsi_irqs(dsi, s);
-	return 0;
-}
-
-static int dsi2_dump_irqs(struct seq_file *s, void *p)
-{
-	struct dsi_data *dsi = dsi_get_dsi_from_id(1);
-
-	dsi_dump_dsi_irqs(dsi, s);
 	return 0;
 }
 #endif
 
-static void dsi_dump_dsi_regs(struct dsi_data *dsi, struct seq_file *s)
+static int dsi_dump_dsi_regs(struct seq_file *s, void *p)
 {
-#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r))
+	struct dsi_data *dsi = p;
 
 	if (dsi_runtime_get(dsi))
-		return;
+		return 0;
 	dsi_enable_scp_clk(dsi);
 
+#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r))
 	DUMPREG(DSI_REVISION);
 	DUMPREG(DSI_SYSCONFIG);
 	DUMPREG(DSI_SYSSTATUS);
@@ -1699,25 +1687,11 @@ static void dsi_dump_dsi_regs(struct dsi_data *dsi, struct seq_file *s)
 	DUMPREG(DSI_PLL_GO);
 	DUMPREG(DSI_PLL_CONFIGURATION1);
 	DUMPREG(DSI_PLL_CONFIGURATION2);
+#undef DUMPREG
 
 	dsi_disable_scp_clk(dsi);
 	dsi_runtime_put(dsi);
-#undef DUMPREG
-}
-
-static int dsi1_dump_regs(struct seq_file *s, void *p)
-{
-	struct dsi_data *dsi = dsi_get_dsi_from_id(0);
 
-	dsi_dump_dsi_regs(dsi, s);
-	return 0;
-}
-
-static int dsi2_dump_regs(struct seq_file *s, void *p)
-{
-	struct dsi_data *dsi = dsi_get_dsi_from_id(1);
-
-	dsi_dump_dsi_regs(dsi, s);
 	return 0;
 }
 
@@ -5305,6 +5279,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	struct dsi_data *dsi;
 	struct resource *dsi_mem;
 	struct resource *res;
+	char name[10];
 
 	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
 	if (!dsi)
@@ -5443,23 +5418,13 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 
 	dsi_runtime_put(dsi);
 
-	if (dsi->module_id == 0)
-		dsi->debugfs.regs = dss_debugfs_create_file(dss, "dsi1_regs",
-							    dsi1_dump_regs,
-							    &dsi);
-	else
-		dsi->debugfs.regs = dss_debugfs_create_file(dss, "dsi2_regs",
-							    dsi2_dump_regs,
-							    &dsi);
+	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
+	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_regs, &dsi);
 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
-	if (dsi->module_id == 0)
-		dsi->debugfs.irqs = dss_debugfs_create_file(dss, "dsi1_irqs",
-							    dsi1_dump_irqs,
-							    &dsi);
-	else
-		dsi->debugfs.irqs = dss_debugfs_create_file(dss, "dsi2_irqs",
-							    dsi2_dump_irqs,
-							    &dsi);
+	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
+	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_irqs, &dsi);
 #endif
 
 	return 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] 127+ messages in thread

* [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (23 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:09   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 26/60] drm/omap: dss: Remove output devices list Laurent Pinchart
                   ` (35 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DSI clocks are dumped in the DSS-level debugfs clocks file. This
complicates the implementation as the DSI private data has to be looked
up through the outputs list. Simplify it by creating two debugfs files,
dsi1_clks and dsi2_clks, to dump the DSI clocks.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dsi.c | 43 ++++++++-------------------------------
 drivers/gpu/drm/omapdrm/dss/dss.c |  3 ---
 drivers/gpu/drm/omapdrm/dss/dss.h |  2 --
 3 files changed, 9 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 9952803b58d2..adfda2a63ada 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -403,6 +403,7 @@ struct dsi_data {
 	struct {
 		struct dss_debugfs_entry *irqs;
 		struct dss_debugfs_entry *regs;
+		struct dss_debugfs_entry *clks;
 	} debugfs;
 
 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
@@ -442,27 +443,6 @@ static inline struct dsi_data *to_dsi_data(struct omap_dss_device *dssdev)
 	return dev_get_drvdata(dssdev->dev);
 }
 
-static struct dsi_data *dsi_get_dsi_from_id(int module)
-{
-	struct omap_dss_device *out;
-	enum omap_dss_output_id	id;
-
-	switch (module) {
-	case 0:
-		id = OMAP_DSS_OUTPUT_DSI1;
-		break;
-	case 1:
-		id = OMAP_DSS_OUTPUT_DSI2;
-		break;
-	default:
-		return NULL;
-	}
-
-	out = omap_dss_get_output(id);
-
-	return out ? to_dsi_data(out) : NULL;
-}
-
 static inline void dsi_write_reg(struct dsi_data *dsi,
 				 const struct dsi_reg idx, u32 val)
 {
@@ -1448,8 +1428,9 @@ static void dsi_pll_disable(struct dss_pll *pll)
 	dsi_pll_uninit(dsi, true);
 }
 
-static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
+static int dsi_dump_dsi_clocks(struct seq_file *s, void *p)
 {
+	struct dsi_data *dsi = p;
 	struct dss_pll_clock_info *cinfo = &dsi->pll.cinfo;
 	enum dss_clk_source dispc_clk_src, dsi_clk_src;
 	int dsi_module = dsi->module_id;
@@ -1459,7 +1440,7 @@ static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
 	dsi_clk_src = dss_get_dsi_clk_source(dsi->dss, dsi_module);
 
 	if (dsi_runtime_get(dsi))
-		return;
+		return 0;
 
 	seq_printf(s,	"- DSI%d PLL -\n", dsi_module + 1);
 
@@ -1503,18 +1484,8 @@ static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
 	seq_printf(s,	"LP_CLK\t\t%lu\n", dsi->current_lp_cinfo.lp_clk);
 
 	dsi_runtime_put(dsi);
-}
-
-void dsi_dump_clocks(struct seq_file *s)
-{
-	struct dsi_data *dsi;
-	int i;
 
-	for  (i = 0; i < MAX_NUM_DSI; i++) {
-		dsi = dsi_get_dsi_from_id(i);
-		if (dsi)
-			dsi_dump_dsi_clocks(dsi, s);
-	}
+	return 0;
 }
 
 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
@@ -5426,6 +5397,9 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
 						    dsi_dump_dsi_irqs, &dsi);
 #endif
+	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
+	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_clocks, &dsi);
 
 	return 0;
 
@@ -5442,6 +5416,7 @@ static void dsi_unbind(struct device *dev, struct device *master, void *data)
 {
 	struct dsi_data *dsi = dev_get_drvdata(dev);
 
+	dss_debugfs_remove_file(dsi->debugfs.clks);
 	dss_debugfs_remove_file(dsi->debugfs.irqs);
 	dss_debugfs_remove_file(dsi->debugfs.regs);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 59b238f03437..8e7646181302 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -394,9 +394,6 @@ static int dss_debug_dump_clocks(struct seq_file *s, void *p)
 
 	dss_dump_clocks(dss, s);
 	dispc_dump_clocks(dss->dispc, s);
-#ifdef CONFIG_OMAP2_DSS_DSI
-	dsi_dump_clocks(s);
-#endif
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index 4f1eb7f5b922..a4514843e925 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -373,8 +373,6 @@ static inline void sdi_uninit_port(struct device_node *port)
 
 #ifdef CONFIG_OMAP2_DSS_DSI
 
-void dsi_dump_clocks(struct seq_file *s);
-
 void dsi_irq_handler(void);
 
 #endif
-- 
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] 127+ messages in thread

* [PATCH v2 26/60] drm/omap: dss: Remove output devices list
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (24 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:12   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display Laurent Pinchart
                   ` (34 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The output devices list isn't used anymore, all output devices are
accessed through the global devices list. Remove it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  9 ++-----
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  8 ++----
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  8 ++----
 drivers/gpu/drm/omapdrm/dss/base.c                 |  2 ++
 drivers/gpu/drm/omapdrm/dss/dpi.c                  |  4 +--
 drivers/gpu/drm/omapdrm/dss/dsi.c                  |  4 +--
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  4 +--
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  4 +--
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  5 ----
 drivers/gpu/drm/omapdrm/dss/output.c               | 29 ----------------------
 drivers/gpu/drm/omapdrm/dss/sdi.c                  |  4 +--
 drivers/gpu/drm/omapdrm/dss/venc.c                 |  4 +--
 12 files changed, 20 insertions(+), 65 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index c9c744e0c92e..c1ed4e2ce8f3 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -146,7 +146,6 @@ static int opa362_probe(struct platform_device *pdev)
 	struct panel_drv_data *ddata;
 	struct omap_dss_device *dssdev;
 	struct gpio_desc *gpio;
-	int r;
 
 	dev_dbg(&pdev->dev, "probe\n");
 
@@ -169,11 +168,7 @@ static int opa362_probe(struct platform_device *pdev)
 	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
 
-	r = omapdss_register_output(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register output\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -183,7 +178,7 @@ static int __exit opa362_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_output(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
 	if (omapdss_device_is_enabled(dssdev))
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index f568e53a9104..b360a68f074d 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -192,11 +192,7 @@ static int tfp410_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->port_num = 1;
 
-	r = omapdss_register_output(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register output\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -206,7 +202,7 @@ static int __exit tfp410_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_output(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
 	if (omapdss_device_is_enabled(dssdev))
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 7bbe794e9d21..efeae1401490 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -301,11 +301,7 @@ static int tpd_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->port_num = 1;
 
-	r = omapdss_register_output(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register output\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -315,7 +311,7 @@ static int __exit tpd_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_output(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
 	if (omapdss_device_is_enabled(dssdev))
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 810dcddded8a..7cd3076c2140 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -63,6 +63,7 @@ void omapdss_device_register(struct omap_dss_device *dssdev)
 	list_add_tail(&dssdev->list, &omapdss_devices_list);
 	mutex_unlock(&omapdss_devices_lock);
 }
+EXPORT_SYMBOL_GPL(omapdss_device_register);
 
 void omapdss_device_unregister(struct omap_dss_device *dssdev)
 {
@@ -70,6 +71,7 @@ void omapdss_device_unregister(struct omap_dss_device *dssdev)
 	list_del(&dssdev->list);
 	mutex_unlock(&omapdss_devices_lock);
 }
+EXPORT_SYMBOL_GPL(omapdss_device_unregister);
 
 static bool omapdss_device_is_registered(struct device_node *node)
 {
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index c13feaf8b086..3fbed21d69a6 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -718,7 +718,7 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 	out->ops = &dpi_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void dpi_uninit_output_port(struct device_node *port)
@@ -726,7 +726,7 @@ static void dpi_uninit_output_port(struct device_node *port)
 	struct dpi_data *dpi = port->data;
 	struct omap_dss_device *out = &dpi->output;
 
-	omapdss_unregister_output(out);
+	omapdss_device_unregister(out);
 }
 
 int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index adfda2a63ada..90820402e81f 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4995,14 +4995,14 @@ static void dsi_init_output(struct dsi_data *dsi)
 	out->ops = &dsi_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void dsi_uninit_output(struct dsi_data *dsi)
 {
 	struct omap_dss_device *out = &dsi->output;
 
-	omapdss_unregister_output(out);
+	omapdss_device_unregister(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 7e5474e87c11..fa818033f3f3 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -565,14 +565,14 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void hdmi_uninit_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
-	omapdss_unregister_output(out);
+	omapdss_device_unregister(out);
 }
 
 static int hdmi_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 86b18ccb8d24..ef4a48f397d2 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -556,14 +556,14 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void hdmi_uninit_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
-	omapdss_unregister_output(out);
+	omapdss_device_unregister(out);
 }
 
 static int hdmi_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 0033adf534d3..26abc09f3d4a 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -416,8 +416,6 @@ struct omap_dss_device {
 
 	/* OMAP DSS output specific fields */
 
-	struct list_head output_list;
-
 	/* DISPC channel for this output */
 	enum omap_channel dispc_channel;
 	bool dispc_channel_connected;
@@ -510,9 +508,6 @@ int omap_dss_get_num_overlay_managers(void);
 
 int omap_dss_get_num_overlays(void);
 
-int omapdss_register_output(struct omap_dss_device *output);
-void omapdss_unregister_output(struct omap_dss_device *output);
-struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
 int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_device *out);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 6abdb615a4c0..e62da96f83af 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -23,7 +23,6 @@
 
 #include "omapdss.h"
 
-static LIST_HEAD(output_list);
 static DEFINE_MUTEX(output_lock);
 
 int omapdss_output_set_device(struct omap_dss_device *out,
@@ -88,34 +87,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
 }
 EXPORT_SYMBOL(omapdss_output_unset_device);
 
-int omapdss_register_output(struct omap_dss_device *out)
-{
-	list_add_tail(&out->output_list, &output_list);
-	omapdss_device_register(out);
-	return 0;
-}
-EXPORT_SYMBOL(omapdss_register_output);
-
-void omapdss_unregister_output(struct omap_dss_device *out)
-{
-	list_del(&out->output_list);
-	omapdss_device_unregister(out);
-}
-EXPORT_SYMBOL(omapdss_unregister_output);
-
-struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
-{
-	struct omap_dss_device *out;
-
-	list_for_each_entry(out, &output_list, output_list) {
-		if (out->id == id)
-			return out;
-	}
-
-	return NULL;
-}
-EXPORT_SYMBOL(omap_dss_get_output);
-
 struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
 {
 	while (dssdev->src)
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 77a8f7d86f7a..76842ca4a619 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -328,12 +328,12 @@ static void sdi_init_output(struct sdi_device *sdi)
 	out->ops = &sdi_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void sdi_uninit_output(struct sdi_device *sdi)
 {
-	omapdss_unregister_output(&sdi->output);
+	omapdss_device_unregister(&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 8ea622d02b5c..bed7fcb35d89 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -768,12 +768,12 @@ static void venc_init_output(struct venc_device *venc)
 	out->ops = &venc_ops;
 	out->owner = THIS_MODULE;
 
-	omapdss_register_output(out);
+	omapdss_device_register(out);
 }
 
 static void venc_uninit_output(struct venc_device *venc)
 {
-	omapdss_unregister_output(&venc->output);
+	omapdss_device_unregister(&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] 127+ messages in thread

* [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (25 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 26/60] drm/omap: dss: Remove output devices list Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:17   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic Laurent Pinchart
                   ` (33 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The macro iterates over displays only, rename it accordingly.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 8e7646181302..5b7613ff2f2e 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1557,7 +1557,7 @@ static void dss_shutdown(struct platform_device *pdev)
 
 	DSSDBG("shutdown\n");
 
-	for_each_dss_dev(dssdev) {
+	for_each_dss_display(dssdev) {
 		if (!dssdev->driver)
 			continue;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 26abc09f3d4a..a6ddc881ea72 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -501,7 +501,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
 void omap_dss_put_device(struct omap_dss_device *dssdev);
-#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
+#define for_each_dss_display(d) while ((d = omap_dss_get_next_device(d)) != NULL)
 struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
 
 int omap_dss_get_num_overlay_managers(void);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index f1df5be198a8..21ca4002ac38 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -188,7 +188,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 	if (!omapdss_stack_is_ready())
 		return -EPROBE_DEFER;
 
-	for_each_dss_dev(dssdev) {
+	for_each_dss_display(dssdev) {
 		r = omapdss_device_connect(dssdev, NULL);
 		if (r == -EPROBE_DEFER) {
 			omap_dss_put_device(dssdev);
@@ -200,7 +200,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 			omap_dss_get_device(dssdev);
 			priv->dssdevs[priv->num_dssdevs++] = dssdev;
 			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
-				/* To balance the 'for_each_dss_dev' loop */
+				/* To balance the 'for_each_dss_display' loop */
 				omap_dss_put_device(dssdev);
 				break;
 			}
-- 
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] 127+ messages in thread

* [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (26 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:17   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display() Laurent Pinchart
                   ` (32 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Despite its name, the omap_dss_get_next_device() function operates on
display devices only. Make it more generic by allowing operation on all
devices, with a parameter to specify the device type.

While at it rename the function to omapdss_device_get_next() to match
the naming of the other functions operating on struct omap_dss_device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    | 52 +++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/omapdrm/dss/display.c | 49 ---------------------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  6 ++--
 3 files changed, 56 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 7cd3076c2140..f7b8958f15bc 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -104,6 +104,58 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 	return NULL;
 }
 
+/*
+ * Search for the next device starting at @from. If display_only is true, skip
+ * non-display devices. 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,
+						bool display_only)
+{
+	struct omap_dss_device *dssdev;
+	struct list_head *list;
+
+	mutex_lock(&omapdss_devices_lock);
+
+	if (list_empty(&omapdss_devices_list)) {
+		dssdev = NULL;
+		goto done;
+	}
+
+	/*
+	 * Start from the from entry if given or from omapdss_devices_list
+	 * otherwise.
+	 */
+	list = from ? &from->list : &omapdss_devices_list;
+
+	list_for_each_entry(dssdev, list, list) {
+		/*
+		 * Stop if we reach the omapdss_devices_list, that's the end of
+		 * the list.
+		 */
+		if (&dssdev->list == &omapdss_devices_list) {
+			dssdev = NULL;
+			goto done;
+		}
+
+		/* Filter out non-display entries if display_only is set. */
+		if (!display_only || dssdev->driver)
+			goto done;
+	}
+
+	dssdev = NULL;
+
+done:
+	if (from)
+		omap_dss_put_device(from);
+	if (dssdev)
+		omap_dss_get_device(dssdev);
+
+	mutex_unlock(&omapdss_devices_lock);
+	return dssdev;
+}
+EXPORT_SYMBOL(omapdss_device_get_next);
+
 int omapdss_device_connect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 383512c8a466..0c94d5208398 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -92,52 +92,3 @@ void omap_dss_put_device(struct omap_dss_device *dssdev)
 	module_put(dssdev->owner);
 }
 EXPORT_SYMBOL(omap_dss_put_device);
-
-/*
- * ref count of the found device is incremented.
- * ref count of from-device is decremented.
- */
-struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from)
-{
-	struct list_head *l;
-	struct omap_dss_device *dssdev;
-
-	mutex_lock(&panel_list_mutex);
-
-	if (list_empty(&panel_list)) {
-		dssdev = NULL;
-		goto out;
-	}
-
-	if (from == NULL) {
-		dssdev = list_first_entry(&panel_list, struct omap_dss_device,
-				panel_list);
-		omap_dss_get_device(dssdev);
-		goto out;
-	}
-
-	omap_dss_put_device(from);
-
-	list_for_each(l, &panel_list) {
-		dssdev = list_entry(l, struct omap_dss_device, panel_list);
-		if (dssdev == from) {
-			if (list_is_last(l, &panel_list)) {
-				dssdev = NULL;
-				goto out;
-			}
-
-			dssdev = list_entry(l->next, struct omap_dss_device,
-					panel_list);
-			omap_dss_get_device(dssdev);
-			goto out;
-		}
-	}
-
-	WARN(1, "'from' dssdev not found\n");
-
-	dssdev = NULL;
-out:
-	mutex_unlock(&panel_list_mutex);
-	return dssdev;
-}
-EXPORT_SYMBOL(omap_dss_get_next_device);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index a6ddc881ea72..94a3f98bdd3d 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -489,11 +489,15 @@ static inline bool omapdss_is_initialized(void)
 
 int omapdss_register_display(struct omap_dss_device *dssdev);
 void omapdss_unregister_display(struct omap_dss_device *dssdev);
+#define for_each_dss_display(d) \
+	while ((d = omapdss_device_get_next(d, true)) != NULL)
 
 void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(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,
+						bool display_only);
 int omapdss_device_connect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst);
 void omapdss_device_disconnect(struct omap_dss_device *src,
@@ -501,8 +505,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
 void omap_dss_put_device(struct omap_dss_device *dssdev);
-#define for_each_dss_display(d) while ((d = omap_dss_get_next_device(d)) != NULL)
-struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
 
 int omap_dss_get_num_overlay_managers(void);
 
-- 
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] 127+ messages in thread

* [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (27 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:24   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 30/60] drm/omap: dss: Remove panel devices list Laurent Pinchart
                   ` (31 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Split the function into omapdss_display_init() to perform
display-specific initialization of the omap_dss_device, and
omapdss_register_display() to register the device. The latter will then
be replaced by more generic registration.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/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/panel-dpi.c                | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c | 1 +
 drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     | 1 +
 drivers/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/display.c                       | 6 +++++-
 drivers/gpu/drm/omapdrm/dss/omapdss.h                       | 1 +
 13 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index f579bd9ce7cb..fb23fae7fbf4 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -171,6 +171,7 @@ static int tvc_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 48dbb9df76b5..5333fb166c83 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -390,6 +390,7 @@ static int dvic_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 4acb53788862..2c5e8cf70c9f 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -350,6 +350,7 @@ static int hdmic_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 32af5b11b448..87f11618e85f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -218,6 +218,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 353510af58e7..94275fc931be 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1328,6 +1328,7 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
 		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 5bea3eadd7d2..88c075414b7c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -270,6 +270,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&spi->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index d03339034f18..fafb3e43f390 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -293,6 +293,7 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&spi->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 93f1a0e89861..bb28994cedc0 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -269,6 +269,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&pdev->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index ce32ad974ae8..46ede08ce65b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -800,6 +800,7 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&spi->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 3224502016f4..a76387dfc0e2 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -394,6 +394,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&spi->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index e3212e476b91..dbb1abf1459a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -537,6 +537,7 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
 
+	omapdss_display_init(dssdev);
 	r = omapdss_register_display(dssdev);
 	if (r) {
 		dev_err(&spi->dev, "Failed to register panel\n");
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 0c94d5208398..057069b7a6cf 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -32,7 +32,7 @@ static LIST_HEAD(panel_list);
 static DEFINE_MUTEX(panel_list_mutex);
 static int disp_num_counter;
 
-int omapdss_register_display(struct omap_dss_device *dssdev)
+void omapdss_display_init(struct omap_dss_device *dssdev)
 {
 	int id;
 
@@ -52,7 +52,11 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
 	if (dssdev->name == NULL)
 		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
 					      "display%u", id);
+}
+EXPORT_SYMBOL_GPL(omapdss_display_init);
 
+int omapdss_register_display(struct omap_dss_device *dssdev)
+{
 	mutex_lock(&panel_list_mutex);
 	list_add_tail(&dssdev->panel_list, &panel_list);
 	mutex_unlock(&panel_list_mutex);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 94a3f98bdd3d..e42821583b91 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -487,6 +487,7 @@ static inline bool omapdss_is_initialized(void)
 	return !!omapdss_get_dss();
 }
 
+void omapdss_display_init(struct omap_dss_device *dssdev);
 int omapdss_register_display(struct omap_dss_device *dssdev);
 void omapdss_unregister_display(struct omap_dss_device *dssdev);
 #define for_each_dss_display(d) \
-- 
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] 127+ messages in thread

* [PATCH v2 30/60] drm/omap: dss: Remove panel devices list
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (28 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display() Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:32   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device() Laurent Pinchart
                   ` (30 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The panel devices list isn't used anymore, all panel devices are
accessed through the global devices list. Remove it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  9 ++------
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   | 14 ++---------
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  8 ++-----
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  8 ++-----
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  8 ++-----
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  8 ++-----
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  8 ++-----
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  8 ++-----
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    | 27 +++++++---------------
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  8 ++-----
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    | 22 ++++--------------
 drivers/gpu/drm/omapdrm/dss/display.c              | 23 ------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  3 ---
 13 files changed, 31 insertions(+), 123 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index fb23fae7fbf4..f1d1c67d72b8 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -154,7 +154,6 @@ static int tvc_probe(struct platform_device *pdev)
 {
 	struct panel_drv_data *ddata;
 	struct omap_dss_device *dssdev;
-	int r;
 
 	ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
 	if (!ddata)
@@ -172,11 +171,7 @@ static int tvc_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -186,7 +181,7 @@ 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_unregister_display(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	tvc_disable(dssdev);
 	tvc_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 5333fb166c83..9e0b5a0b2eea 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -391,19 +391,9 @@ static int dvic_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register panel\n");
-		goto err_reg;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
-
-err_reg:
-	i2c_put_adapter(ddata->i2c_adapter);
-	mutex_destroy(&ddata->hpd_lock);
-
-	return r;
 }
 
 static int __exit dvic_remove(struct platform_device *pdev)
@@ -411,7 +401,7 @@ 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_unregister_display(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	dvic_disable(dssdev);
 	dvic_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 2c5e8cf70c9f..064b051c0a29 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -351,11 +351,7 @@ static int hdmic_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -365,7 +361,7 @@ 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_unregister_display(&ddata->dssdev);
+	omapdss_device_unregister(&ddata->dssdev);
 
 	hdmic_disable(dssdev);
 	hdmic_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 87f11618e85f..bd598be1ba6b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -219,11 +219,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -233,7 +229,7 @@ static int __exit panel_dpi_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	panel_dpi_disable(dssdev);
 	panel_dpi_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 94275fc931be..e27399ca3ac5 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1329,11 +1329,7 @@ static int dsicm_probe(struct platform_device *pdev)
 		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(dev, "Failed to register panel\n");
-		goto err_reg;
-	}
+	omapdss_device_register(dssdev);
 
 	mutex_init(&ddata->lock);
 
@@ -1404,7 +1400,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
 
 	dev_dbg(&pdev->dev, "remove\n");
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	dsicm_disable(dssdev);
 	dsicm_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 88c075414b7c..0e89fc1bc34c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -271,11 +271,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&spi->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -285,7 +281,7 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
 	struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	lb035q02_disable(dssdev);
 	lb035q02_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index fafb3e43f390..9f32343e5122 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -294,11 +294,7 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&spi->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -310,7 +306,7 @@ static int nec_8048_remove(struct spi_device *spi)
 
 	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	nec_8048_disable(dssdev);
 	nec_8048_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index bb28994cedc0..320d2e73c40c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -270,11 +270,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&pdev->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -284,7 +280,7 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	sharp_ls_disable(dssdev);
 	sharp_ls_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 46ede08ce65b..5411c0ce9bb4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -733,7 +733,7 @@ static int acx565akm_probe(struct spi_device *spi)
 		r = devm_gpio_request_one(&spi->dev, ddata->reset_gpio,
 				GPIOF_OUT_INIT_LOW, "lcd reset");
 		if (r)
-			goto err_gpio;
+			return r;
 	}
 
 	if (gpio_is_valid(ddata->reset_gpio))
@@ -754,7 +754,7 @@ static int acx565akm_probe(struct spi_device *spi)
 
 	if (r) {
 		dev_err(&spi->dev, "%s panel detect error\n", __func__);
-		goto err_detect;
+		return r;
 	}
 
 	memset(&props, 0, sizeof(props));
@@ -764,17 +764,15 @@ static int acx565akm_probe(struct spi_device *spi)
 
 	bldev = backlight_device_register("acx565akm", &ddata->spi->dev,
 			ddata, &acx565akm_bl_ops, &props);
-	if (IS_ERR(bldev)) {
-		r = PTR_ERR(bldev);
-		goto err_reg_bl;
-	}
+	if (IS_ERR(bldev))
+		return PTR_ERR(bldev);
 	ddata->bl_dev = bldev;
 	if (ddata->has_cabc) {
 		r = sysfs_create_group(&bldev->dev.kobj, &bldev_attr_group);
 		if (r) {
 			dev_err(&bldev->dev,
 				"%s failed to create sysfs files\n", __func__);
-			goto err_sysfs;
+			goto err_backlight_unregister;
 		}
 		ddata->cabc_mode = get_hw_cabc_mode(ddata);
 	}
@@ -801,21 +799,12 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&spi->dev, "Failed to register panel\n");
-		goto err_reg;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 
-err_reg:
-	sysfs_remove_group(&bldev->dev.kobj, &bldev_attr_group);
-err_sysfs:
+err_backlight_unregister:
 	backlight_device_unregister(bldev);
-err_reg_bl:
-err_detect:
-err_gpio:
 	return r;
 }
 
@@ -829,7 +818,7 @@ static int acx565akm_remove(struct spi_device *spi)
 	sysfs_remove_group(&ddata->bl_dev->dev.kobj, &bldev_attr_group);
 	backlight_device_unregister(ddata->bl_dev);
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	acx565akm_disable(dssdev);
 	acx565akm_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index a76387dfc0e2..839fc0eaf164 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -395,11 +395,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&spi->dev, "Failed to register panel\n");
-		return r;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
 }
@@ -411,7 +407,7 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
 
 	dev_dbg(&ddata->spi_dev->dev, "%s\n", __func__);
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	td028ttec1_panel_disable(dssdev);
 	td028ttec1_panel_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index dbb1abf1459a..5ad85326a84e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -509,8 +509,7 @@ static int tpo_td043_probe(struct spi_device *spi)
 	ddata->vcc_reg = devm_regulator_get(&spi->dev, "vcc");
 	if (IS_ERR(ddata->vcc_reg)) {
 		dev_err(&spi->dev, "failed to get LCD VCC regulator\n");
-		r = PTR_ERR(ddata->vcc_reg);
-		goto err_regulator;
+		return PTR_ERR(ddata->vcc_reg);
 	}
 
 	if (gpio_is_valid(ddata->nreset_gpio)) {
@@ -519,14 +518,14 @@ static int tpo_td043_probe(struct spi_device *spi)
 				"lcd reset");
 		if (r < 0) {
 			dev_err(&spi->dev, "couldn't request reset GPIO\n");
-			goto err_gpio_req;
+			return r;
 		}
 	}
 
 	r = sysfs_create_group(&spi->dev.kobj, &tpo_td043_attr_group);
 	if (r) {
 		dev_err(&spi->dev, "failed to create sysfs files\n");
-		goto err_sysfs;
+		return r;
 	}
 
 	ddata->vm = tpo_td043_vm;
@@ -538,20 +537,9 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->owner = THIS_MODULE;
 
 	omapdss_display_init(dssdev);
-	r = omapdss_register_display(dssdev);
-	if (r) {
-		dev_err(&spi->dev, "Failed to register panel\n");
-		goto err_reg;
-	}
+	omapdss_device_register(dssdev);
 
 	return 0;
-
-err_reg:
-	sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
-err_sysfs:
-err_gpio_req:
-err_regulator:
-	return r;
 }
 
 static int tpo_td043_remove(struct spi_device *spi)
@@ -561,7 +549,7 @@ static int tpo_td043_remove(struct spi_device *spi)
 
 	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
 
-	omapdss_unregister_display(dssdev);
+	omapdss_device_unregister(dssdev);
 
 	tpo_td043_disable(dssdev);
 	tpo_td043_disconnect(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 057069b7a6cf..524e43f71af4 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -28,8 +28,6 @@
 
 #include "omapdss.h"
 
-static LIST_HEAD(panel_list);
-static DEFINE_MUTEX(panel_list_mutex);
 static int disp_num_counter;
 
 void omapdss_display_init(struct omap_dss_device *dssdev)
@@ -55,27 +53,6 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
 }
 EXPORT_SYMBOL_GPL(omapdss_display_init);
 
-int omapdss_register_display(struct omap_dss_device *dssdev)
-{
-	mutex_lock(&panel_list_mutex);
-	list_add_tail(&dssdev->panel_list, &panel_list);
-	mutex_unlock(&panel_list_mutex);
-
-	omapdss_device_register(dssdev);
-	return 0;
-}
-EXPORT_SYMBOL(omapdss_register_display);
-
-void omapdss_unregister_display(struct omap_dss_device *dssdev)
-{
-	mutex_lock(&panel_list_mutex);
-	list_del(&dssdev->panel_list);
-	mutex_unlock(&panel_list_mutex);
-
-	omapdss_device_register(dssdev);
-}
-EXPORT_SYMBOL(omapdss_unregister_display);
-
 struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
 {
 	if (!try_module_get(dssdev->owner))
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index e42821583b91..5f71f6885991 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -395,7 +395,6 @@ struct omap_dss_device {
 	struct omap_dss_device *dst;
 
 	struct list_head list;
-	struct list_head panel_list;
 
 	unsigned int alias_id;
 
@@ -488,8 +487,6 @@ static inline bool omapdss_is_initialized(void)
 }
 
 void omapdss_display_init(struct omap_dss_device *dssdev);
-int omapdss_register_display(struct omap_dss_device *dssdev);
-void omapdss_unregister_display(struct omap_dss_device *dssdev);
 #define for_each_dss_display(d) \
 	while ((d = omapdss_device_get_next(d, true)) != NULL)
 
-- 
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] 127+ messages in thread

* [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (29 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 30/60] drm/omap: dss: Remove panel devices list Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:36   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device Laurent Pinchart
                   ` (29 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The functions operate on any omap_dss_device, move them from display.c
to base.c. While at it rename them to match the naming of the other
functions operating on struct omap_dss_device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  4 ++--
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  4 ++--
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  4 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  4 ++--
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  4 ++--
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  4 ++--
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  4 ++--
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  4 ++--
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  4 ++--
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  4 ++--
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  4 ++--
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  4 ++--
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  4 ++--
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  4 ++--
 drivers/gpu/drm/omapdrm/dss/base.c                 | 27 +++++++++++++++++++---
 drivers/gpu/drm/omapdrm/dss/display.c              | 24 -------------------
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  5 ++--
 drivers/gpu/drm/omapdrm/dss/output.c               |  2 +-
 drivers/gpu/drm/omapdrm/omap_connector.c           |  4 ++--
 drivers/gpu/drm/omapdrm/omap_crtc.c                |  2 +-
 drivers/gpu/drm/omapdrm/omap_drv.c                 |  8 +++----
 21 files changed, 62 insertions(+), 66 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index f1d1c67d72b8..a7eb25bd9283 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -55,7 +55,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -68,7 +68,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int tvc_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 9e0b5a0b2eea..3e71af9ba0c3 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -69,7 +69,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -82,7 +82,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int dvic_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 064b051c0a29..fd0bad4dc7c9 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -65,7 +65,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -78,7 +78,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int hdmic_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index c1ed4e2ce8f3..01b00eea3a98 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -45,7 +45,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -60,7 +60,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
 
 	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int opa362_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index b360a68f074d..6f71d2b7de03 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -41,7 +41,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -56,7 +56,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
 
 	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int tfp410_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index efeae1401490..8031f2c087f6 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -50,7 +50,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -74,7 +74,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
 
 	omapdss_device_disconnect(src, &ddata->dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int tpd_enable(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 bd598be1ba6b..5306af0206c2 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -47,7 +47,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -60,7 +60,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int panel_dpi_enable(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 e27399ca3ac5..e0a607846284 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -794,7 +794,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 err_req_vc:
 	omapdss_device_disconnect(src, dssdev);
 err_connect:
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 	return r;
 }
 
@@ -806,7 +806,7 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
 	src->ops->dsi.release_vc(src, ddata->channel);
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int dsicm_enable(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 0e89fc1bc34c..015488594de3 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -129,7 +129,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -144,7 +144,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int lb035q02_enable(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 9f32343e5122..c23bf5ba0c47 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -124,7 +124,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -137,7 +137,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int nec_8048_enable(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 320d2e73c40c..a7c053d031c1 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -70,7 +70,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -83,7 +83,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int sharp_ls_enable(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 5411c0ce9bb4..cad158a142d4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -519,7 +519,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -532,7 +532,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int acx565akm_panel_power_on(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 839fc0eaf164..cadbbb4dcbd4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -178,7 +178,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -191,7 +191,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int td028ttec1_panel_enable(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 5ad85326a84e..2f70b3c74262 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -349,7 +349,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 
 	r = omapdss_device_connect(src, dssdev);
 	if (r) {
-		omap_dss_put_device(src);
+		omapdss_device_put(src);
 		return r;
 	}
 
@@ -362,7 +362,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
 
 	omapdss_device_disconnect(src, dssdev);
 
-	omap_dss_put_device(src);
+	omapdss_device_put(src);
 }
 
 static int tpo_td043_enable(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index f7b8958f15bc..4abde473eba7 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -91,6 +91,27 @@ static bool omapdss_device_is_registered(struct device_node *node)
 	return found;
 }
 
+struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev)
+{
+	if (!try_module_get(dssdev->owner))
+		return NULL;
+
+	if (get_device(dssdev->dev) == NULL) {
+		module_put(dssdev->owner);
+		return NULL;
+	}
+
+	return dssdev;
+}
+EXPORT_SYMBOL(omapdss_device_get);
+
+void omapdss_device_put(struct omap_dss_device *dssdev)
+{
+	put_device(dssdev->dev);
+	module_put(dssdev->owner);
+}
+EXPORT_SYMBOL(omapdss_device_put);
+
 struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 						    unsigned int port)
 {
@@ -98,7 +119,7 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 
 	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
 		if (dssdev->dev->of_node == src && dssdev->port_num == port)
-			return omap_dss_get_device(dssdev);
+			return omapdss_device_get(dssdev);
 	}
 
 	return NULL;
@@ -147,9 +168,9 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 
 done:
 	if (from)
-		omap_dss_put_device(from);
+		omapdss_device_put(from);
 	if (dssdev)
-		omap_dss_get_device(dssdev);
+		omapdss_device_get(dssdev);
 
 	mutex_unlock(&omapdss_devices_lock);
 	return dssdev;
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 524e43f71af4..65ca71859c7d 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -21,9 +21,6 @@
 #define DSS_SUBSYS_NAME "DISPLAY"
 
 #include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/jiffies.h>
-#include <linux/platform_device.h>
 #include <linux/of.h>
 
 #include "omapdss.h"
@@ -52,24 +49,3 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
 					      "display%u", id);
 }
 EXPORT_SYMBOL_GPL(omapdss_display_init);
-
-struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
-{
-	if (!try_module_get(dssdev->owner))
-		return NULL;
-
-	if (get_device(dssdev->dev) == NULL) {
-		module_put(dssdev->owner);
-		return NULL;
-	}
-
-	return dssdev;
-}
-EXPORT_SYMBOL(omap_dss_get_device);
-
-void omap_dss_put_device(struct omap_dss_device *dssdev)
-{
-	put_device(dssdev->dev);
-	module_put(dssdev->owner);
-}
-EXPORT_SYMBOL(omap_dss_put_device);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 5f71f6885991..96011e42da05 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -492,6 +492,8 @@ void omapdss_display_init(struct omap_dss_device *dssdev);
 
 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_device_get_next(struct omap_dss_device *from,
@@ -501,9 +503,6 @@ int omapdss_device_connect(struct omap_dss_device *src,
 void omapdss_device_disconnect(struct omap_dss_device *src,
 			       struct omap_dss_device *dst);
 
-struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
-void omap_dss_put_device(struct omap_dss_device *dssdev);
-
 int omap_dss_get_num_overlay_managers(void);
 
 int omap_dss_get_num_overlays(void);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index e62da96f83af..b5bf7a5e35d9 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -93,7 +93,7 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
 		dssdev = dssdev->src;
 
 	if (dssdev->id != 0)
-		return omap_dss_get_device(dssdev);
+		return omapdss_device_get(dssdev);
 
 	return NULL;
 }
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index eec3aa83dfcd..de001596c481 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -98,7 +98,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
 	drm_connector_cleanup(connector);
 	kfree(omap_connector);
 
-	omap_dss_put_device(dssdev);
+	omapdss_device_put(dssdev);
 }
 
 #define MAX_EDID  512
@@ -254,7 +254,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 
 	DBG("%s", dssdev->name);
 
-	omap_dss_get_device(dssdev);
+	omapdss_device_get(dssdev);
 
 	omap_connector = kzalloc(sizeof(*omap_connector), GFP_KERNEL);
 	if (!omap_connector)
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 6c4d40b824e4..e18ca6cdc0d6 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -704,7 +704,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 
 	out = omapdss_find_output_from_display(dssdev);
 	channel = out->dispc_channel;
-	omap_dss_put_device(out);
+	omapdss_device_put(out);
 
 	DBG("%s", channel_names[channel]);
 
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 21ca4002ac38..cf0f76bf5773 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -161,7 +161,7 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
 
 		omapdss_device_disconnect(dssdev, NULL);
 		priv->dssdevs[i] = NULL;
-		omap_dss_put_device(dssdev);
+		omapdss_device_put(dssdev);
 	}
 
 	priv->num_dssdevs = 0;
@@ -191,17 +191,17 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 	for_each_dss_display(dssdev) {
 		r = omapdss_device_connect(dssdev, NULL);
 		if (r == -EPROBE_DEFER) {
-			omap_dss_put_device(dssdev);
+			omapdss_device_put(dssdev);
 			goto cleanup;
 		} else if (r) {
 			dev_warn(dssdev->dev, "could not connect display: %s\n",
 				dssdev->name);
 		} else {
-			omap_dss_get_device(dssdev);
+			omapdss_device_get(dssdev);
 			priv->dssdevs[priv->num_dssdevs++] = dssdev;
 			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
 				/* To balance the 'for_each_dss_display' loop */
-				omap_dss_put_device(dssdev);
+				omapdss_device_put(dssdev);
 				break;
 			}
 		}
-- 
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] 127+ messages in thread

* [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (30 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device() Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:43   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device Laurent Pinchart
                   ` (28 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Storing the dss_device pointer in the omap_dss_device structure will
allow accessing the dss_device from the dss_mgr API functions.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      |  2 +-
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c            |  2 +-
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c           |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c           |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c        |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c                |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     |  2 +-
 drivers/gpu/drm/omapdrm/dss/base.c                          | 11 +++++++++--
 drivers/gpu/drm/omapdrm/dss/omapdss.h                       |  4 +++-
 drivers/gpu/drm/omapdrm/omap_drv.c                          |  2 +-
 17 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index a7eb25bd9283..f7250db0f3b7 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -53,7 +53,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 3e71af9ba0c3..b4f84baff144 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -67,7 +67,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index fd0bad4dc7c9..2f8ae93c117a 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -63,7 +63,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 01b00eea3a98..4d7f4dae2c10 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -43,7 +43,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 6f71d2b7de03..833544d8502f 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -39,7 +39,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 8031f2c087f6..3a3c36fef446 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -48,7 +48,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 5306af0206c2..43df4f7c38f0 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -45,7 +45,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index e0a607846284..6090447b66a1 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -769,7 +769,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		dev_err(dev, "Failed to connect to video source\n");
 		goto err_connect;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 015488594de3..5c26e1d19655 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -127,7 +127,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index c23bf5ba0c47..6c30b2078a0e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -122,7 +122,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index a7c053d031c1..fb40d2c705e5 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -68,7 +68,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index cad158a142d4..a35d4407f2b0 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -517,7 +517,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index cadbbb4dcbd4..d887f12c021c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -176,7 +176,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 2f70b3c74262..6d333b0aea18 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -347,7 +347,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 		return PTR_ERR(src);
 	}
 
-	r = omapdss_device_connect(src, dssdev);
+	r = omapdss_device_connect(dssdev->dss, src, dssdev);
 	if (r) {
 		omapdss_device_put(src);
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 4abde473eba7..b4bc58c5134d 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -177,7 +177,8 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 }
 EXPORT_SYMBOL(omapdss_device_get_next);
 
-int omapdss_device_connect(struct omap_dss_device *src,
+int omapdss_device_connect(struct dss_device *dss,
+			   struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
 	int ret;
@@ -187,13 +188,17 @@ int omapdss_device_connect(struct omap_dss_device *src,
 	if (omapdss_device_is_connected(src))
 		return -EBUSY;
 
+	src->dss = dss;
+
 	if (src->driver)
 		ret = src->driver->connect(src);
 	else
 		ret = src->ops->connect(src, dst);
 
-	if (ret < 0)
+	if (ret < 0) {
+		src->dss = NULL;
 		return ret;
+	}
 
 	if (dst) {
 		dst->src = src;
@@ -226,6 +231,8 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 		src->driver->disconnect(src);
 	else
 		src->ops->disconnect(src, dst);
+
+	src->dss = NULL;
 }
 EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 96011e42da05..4befe8aab333 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -391,6 +391,7 @@ struct omap_dss_device {
 
 	struct module *owner;
 
+	struct dss_device *dss;
 	struct omap_dss_device *src;
 	struct omap_dss_device *dst;
 
@@ -498,7 +499,8 @@ 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,
 						bool display_only);
-int omapdss_device_connect(struct omap_dss_device *src,
+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);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index cf0f76bf5773..042a3ca526ca 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -189,7 +189,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 		return -EPROBE_DEFER;
 
 	for_each_dss_display(dssdev) {
-		r = omapdss_device_connect(dssdev, NULL);
+		r = omapdss_device_connect(priv->dss, dssdev, NULL);
 		if (r == -EPROBE_DEFER) {
 			omapdss_device_put(dssdev);
 			goto cleanup;
-- 
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] 127+ messages in thread

* [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (31 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:43   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel Laurent Pinchart
                   ` (27 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The DSS manager ops and private data pointer are specific to a DSS
instance. Store them in the dss_device structure instead of global
variable.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index a4514843e925..54f96241b9ea 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -266,6 +266,8 @@ struct dss_device {
 
 	struct dispc_device *dispc;
 	const struct dispc_ops *dispc_ops;
+	const struct dss_mgr_ops *mgr_ops;
+	struct omap_drm_private *mgr_ops_priv;
 };
 
 /* core */
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4befe8aab333..4df405ae20db 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -574,9 +574,10 @@ struct dss_mgr_ops {
 			void (*handler)(void *), void *data);
 };
 
-int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
+int dss_install_mgr_ops(struct dss_device *dss,
+			const struct dss_mgr_ops *mgr_ops,
 			struct omap_drm_private *priv);
-void dss_uninstall_mgr_ops(void);
+void dss_uninstall_mgr_ops(struct dss_device *dss);
 
 int dss_mgr_connect(struct omap_dss_device *dssdev,
 		    struct omap_dss_device *dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index b5bf7a5e35d9..a5df6eed4aef 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -21,6 +21,7 @@
 #include <linux/slab.h>
 #include <linux/of.h>
 
+#include "dss.h"
 #include "omapdss.h"
 
 static DEFINE_MUTEX(output_lock);
@@ -99,90 +100,97 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
 }
 EXPORT_SYMBOL(omapdss_find_output_from_display);
 
-static const struct dss_mgr_ops *dss_mgr_ops;
-static struct omap_drm_private *dss_mgr_ops_priv;
-
-int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
+int dss_install_mgr_ops(struct dss_device *dss,
+			const struct dss_mgr_ops *mgr_ops,
 			struct omap_drm_private *priv)
 {
-	if (dss_mgr_ops)
+	if (dss->mgr_ops)
 		return -EBUSY;
 
-	dss_mgr_ops = mgr_ops;
-	dss_mgr_ops_priv = priv;
+	dss->mgr_ops = mgr_ops;
+	dss->mgr_ops_priv = priv;
 
 	return 0;
 }
 EXPORT_SYMBOL(dss_install_mgr_ops);
 
-void dss_uninstall_mgr_ops(void)
+void dss_uninstall_mgr_ops(struct dss_device *dss)
 {
-	dss_mgr_ops = NULL;
-	dss_mgr_ops_priv = NULL;
+	dss->mgr_ops = NULL;
+	dss->mgr_ops_priv = NULL;
 }
 EXPORT_SYMBOL(dss_uninstall_mgr_ops);
 
 int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst)
 {
-	return dss_mgr_ops->connect(dss_mgr_ops_priv,
-				    dssdev->dispc_channel, dst);
+	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
+					     dssdev->dispc_channel, dst);
 }
 EXPORT_SYMBOL(dss_mgr_connect);
 
 void dss_mgr_disconnect(struct omap_dss_device *dssdev,
 			struct omap_dss_device *dst)
 {
-	dss_mgr_ops->disconnect(dss_mgr_ops_priv, dssdev->dispc_channel, dst);
+	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
+					 dssdev->dispc_channel, dst);
 }
 EXPORT_SYMBOL(dss_mgr_disconnect);
 
 void dss_mgr_set_timings(struct omap_dss_device *dssdev,
 			 const struct videomode *vm)
 {
-	dss_mgr_ops->set_timings(dss_mgr_ops_priv, dssdev->dispc_channel, vm);
+	dssdev->dss->mgr_ops->set_timings(dssdev->dss->mgr_ops_priv,
+					  dssdev->dispc_channel, vm);
 }
 EXPORT_SYMBOL(dss_mgr_set_timings);
 
 void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
 		const struct dss_lcd_mgr_config *config)
 {
-	dss_mgr_ops->set_lcd_config(dss_mgr_ops_priv,
-				    dssdev->dispc_channel, config);
+	dssdev->dss->mgr_ops->set_lcd_config(dssdev->dss->mgr_ops_priv,
+					     dssdev->dispc_channel, config);
 }
 EXPORT_SYMBOL(dss_mgr_set_lcd_config);
 
 int dss_mgr_enable(struct omap_dss_device *dssdev)
 {
-	return dss_mgr_ops->enable(dss_mgr_ops_priv, dssdev->dispc_channel);
+	return dssdev->dss->mgr_ops->enable(dssdev->dss->mgr_ops_priv,
+					    dssdev->dispc_channel);
 }
 EXPORT_SYMBOL(dss_mgr_enable);
 
 void dss_mgr_disable(struct omap_dss_device *dssdev)
 {
-	dss_mgr_ops->disable(dss_mgr_ops_priv, dssdev->dispc_channel);
+	dssdev->dss->mgr_ops->disable(dssdev->dss->mgr_ops_priv,
+				      dssdev->dispc_channel);
 }
 EXPORT_SYMBOL(dss_mgr_disable);
 
 void dss_mgr_start_update(struct omap_dss_device *dssdev)
 {
-	dss_mgr_ops->start_update(dss_mgr_ops_priv, dssdev->dispc_channel);
+	dssdev->dss->mgr_ops->start_update(dssdev->dss->mgr_ops_priv,
+					   dssdev->dispc_channel);
 }
 EXPORT_SYMBOL(dss_mgr_start_update);
 
 int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev,
 		void (*handler)(void *), void *data)
 {
-	return dss_mgr_ops->register_framedone_handler(dss_mgr_ops_priv,
-						       dssdev->dispc_channel,
-						       handler, data);
+	struct dss_device *dss = dssdev->dss;
+
+	return dss->mgr_ops->register_framedone_handler(dss->mgr_ops_priv,
+							dssdev->dispc_channel,
+							handler, data);
 }
 EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
 
 void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
 		void (*handler)(void *), void *data)
 {
-	dss_mgr_ops->unregister_framedone_handler(dss_mgr_ops_priv,
-						  dssdev->dispc_channel,
-						  handler, data);
+	struct dss_device *dss = dssdev->dss;
+
+	dss->mgr_ops->unregister_framedone_handler(dss->mgr_ops_priv,
+						   dssdev->dispc_channel,
+						   handler, data);
 }
 EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler);
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index e18ca6cdc0d6..4ddc4ed18b47 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -683,12 +683,12 @@ void omap_crtc_pre_init(struct omap_drm_private *priv)
 {
 	memset(omap_crtcs, 0, sizeof(omap_crtcs));
 
-	dss_install_mgr_ops(&mgr_ops, priv);
+	dss_install_mgr_ops(priv->dss, &mgr_ops, priv);
 }
 
-void omap_crtc_pre_uninit(void)
+void omap_crtc_pre_uninit(struct omap_drm_private *priv)
 {
-	dss_uninstall_mgr_ops();
+	dss_uninstall_mgr_ops(priv->dss);
 }
 
 /* initialize crtc */
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
index eaab2d7f0324..1c6530703855 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.h
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
@@ -33,7 +33,7 @@ struct videomode;
 struct videomode *omap_crtc_timings(struct drm_crtc *crtc);
 enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
 void omap_crtc_pre_init(struct omap_drm_private *priv);
-void omap_crtc_pre_uninit(void);
+void omap_crtc_pre_uninit(struct omap_drm_private *priv);
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 		struct drm_plane *plane, struct omap_dss_device *dssdev);
 int omap_crtc_wait_pending(struct drm_crtc *crtc);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 042a3ca526ca..9b33859e9ac6 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -638,7 +638,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	destroy_workqueue(priv->wq);
 	omap_disconnect_dssdevs(ddev);
 err_crtc_uninit:
-	omap_crtc_pre_uninit();
+	omap_crtc_pre_uninit(priv);
 	drm_dev_unref(ddev);
 	return ret;
 }
@@ -666,7 +666,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
 	destroy_workqueue(priv->wq);
 
 	omap_disconnect_dssdevs(ddev);
-	omap_crtc_pre_uninit();
+	omap_crtc_pre_uninit(priv);
 
 	drm_dev_unref(ddev);
 }
-- 
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] 127+ messages in thread

* [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (32 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 20:46   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask Laurent Pinchart
                   ` (26 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omapdss_find_output_from_display() function is only used to retrieve
the dispc channel corresponding to the display. Return the dispc channel
directly, and rename the function to omapdss_device_get_dispc_channel()
to match its new purpose.

The dssdev->id check is removed as the dssdev is guaranteed to be an
output and have a non-zero id, as proved by the lack of crash despite
the caller never checking the returned pointer before dereferencing it.

As the function is not specific to outputs anymore, move it from
output.c to base.c.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    |  9 +++++++++
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 +--
 drivers/gpu/drm/omapdrm/dss/output.c  | 12 ------------
 drivers/gpu/drm/omapdrm/omap_crtc.c   |  5 +----
 4 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index b4bc58c5134d..7f9d8a8be8c3 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -236,6 +236,15 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 }
 EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
 
+enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev)
+{
+	while (dssdev->src)
+		dssdev = dssdev->src;
+
+	return dssdev->dispc_channel;
+}
+EXPORT_SYMBOL(omapdss_device_get_dispc_channel);
+
 /* -----------------------------------------------------------------------------
  * Components Handling
  */
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4df405ae20db..121bc953ba31 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -504,6 +504,7 @@ 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);
+enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev);
 
 int omap_dss_get_num_overlay_managers(void);
 
@@ -513,8 +514,6 @@ int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_device *out);
 
-struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev);
-
 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
 int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
 int omap_dispc_unregister_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 a5df6eed4aef..191b2e801257 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -88,18 +88,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
 }
 EXPORT_SYMBOL(omapdss_output_unset_device);
 
-struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
-{
-	while (dssdev->src)
-		dssdev = dssdev->src;
-
-	if (dssdev->id != 0)
-		return omapdss_device_get(dssdev);
-
-	return NULL;
-}
-EXPORT_SYMBOL(omapdss_find_output_from_display);
-
 int dss_install_mgr_ops(struct dss_device *dss,
 			const struct dss_mgr_ops *mgr_ops,
 			struct omap_drm_private *priv)
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 4ddc4ed18b47..c5f1915aef67 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -699,12 +699,9 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 	struct drm_crtc *crtc = NULL;
 	struct omap_crtc *omap_crtc;
 	enum omap_channel channel;
-	struct omap_dss_device *out;
 	int ret;
 
-	out = omapdss_find_output_from_display(dssdev);
-	channel = out->dispc_channel;
-	omapdss_device_put(out);
+	channel = omapdss_device_get_dispc_channel(dssdev);
 
 	DBG("%s", channel_names[channel]);
 
-- 
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] 127+ messages in thread

* [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (33 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 21:00   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks Laurent Pinchart
                   ` (25 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device port_num field stores the DT port number associated
with the device. The field is used in different ways depending on the
device type:

- For DPI outputs, the port number is used as an identifier of the DPI
instance

- For sources, the port number is used to look up the omap_dss_device by
DT port node

As omap_dss_device instances are only looked up as sources by sinks,
setting the field to the number of the source port works for both use
cases.

However, to enable looking up sinks, we need to record all the ports
associated with an omap_dss_device. Do so by turning the port_num field
into an of_ports bitmask. For DPI outputs the port number is
additionally stored in the dpi_data structure as the output ID.

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     |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c  |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c          |  1 +
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c       |  1 +
 .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c   |  1 +
 .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   |  1 +
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    |  1 +
 .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   |  1 +
 .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   |  1 +
 .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   |  1 +
 drivers/gpu/drm/omapdrm/dss/base.c                    |  2 +-
 drivers/gpu/drm/omapdrm/dss/dpi.c                     | 19 +++++++++----------
 drivers/gpu/drm/omapdrm/dss/dsi.c                     |  1 +
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                   |  1 +
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                   |  1 +
 drivers/gpu/drm/omapdrm/dss/omapdss.h                 |  4 ++--
 drivers/gpu/drm/omapdrm/dss/sdi.c                     |  2 +-
 drivers/gpu/drm/omapdrm/dss/venc.c                    |  1 +
 22 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index f7250db0f3b7..b960c4d0e84d 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -169,6 +169,7 @@ static int tvc_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index b4f84baff144..8ff674bf75e6 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -389,6 +389,7 @@ static int dvic_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 2f8ae93c117a..2afaa2ca602b 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -349,6 +349,7 @@ static int hdmic_probe(struct platform_device *pdev)
 	dssdev->dev = &pdev->dev;
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 4d7f4dae2c10..eb0ebb850114 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -167,6 +167,7 @@ static int opa362_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(1) | BIT(0);
 
 	omapdss_device_register(dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 833544d8502f..fb767d674297 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -190,7 +190,7 @@ static int tfp410_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->port_num = 1;
+	dssdev->of_ports = BIT(1) | BIT(0);
 
 	omapdss_device_register(dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 3a3c36fef446..cd6da0e8f76a 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -299,7 +299,7 @@ static int tpd_probe(struct platform_device *pdev)
 	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
 	dssdev->owner = THIS_MODULE;
-	dssdev->port_num = 1;
+	dssdev->of_ports = BIT(1) | BIT(0);
 
 	omapdss_device_register(dssdev);
 
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 43df4f7c38f0..97ebfb51192e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -217,6 +217,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
 	dssdev->driver = &panel_dpi_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	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 6090447b66a1..92f521930c2c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -1324,6 +1324,7 @@ static int dsicm_probe(struct platform_device *pdev)
 	dssdev->driver = &dsicm_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	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 5c26e1d19655..46ca37dd9205 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -269,6 +269,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
 	dssdev->driver = &lb035q02_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 6c30b2078a0e..fec2de915200 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -292,6 +292,7 @@ static int nec_8048_probe(struct spi_device *spi)
 	dssdev->driver = &nec_8048_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index fb40d2c705e5..0ff8f00a95cb 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -268,6 +268,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
 	dssdev->driver = &sharp_ls_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index a35d4407f2b0..8d2bf114f47e 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -797,6 +797,7 @@ static int acx565akm_probe(struct spi_device *spi)
 	dssdev->driver = &acx565akm_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index d887f12c021c..38d87a276261 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -393,6 +393,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
 	dssdev->driver = &td028ttec1_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index 6d333b0aea18..c30b0809012a 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -535,6 +535,7 @@ static int tpo_td043_probe(struct spi_device *spi)
 	dssdev->driver = &tpo_td043_ops;
 	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
 	dssdev->owner = THIS_MODULE;
+	dssdev->of_ports = BIT(0);
 
 	omapdss_display_init(dssdev);
 	omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 7f9d8a8be8c3..96be800a0f25 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -118,7 +118,7 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 	struct omap_dss_device *dssdev;
 
 	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
-		if (dssdev->dev->of_node == src && dssdev->port_num == port)
+		if (dssdev->dev->of_node == src && dssdev->of_ports & BIT(port))
 			return omapdss_device_get(dssdev);
 	}
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 3fbed21d69a6..8a7c951a413c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -39,6 +39,7 @@ struct dpi_data {
 	struct platform_device *pdev;
 	enum dss_model dss_model;
 	struct dss_device *dss;
+	unsigned int id;
 
 	struct regulator *vdds_dsi_reg;
 	enum dss_clk_source clk_src;
@@ -413,7 +414,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err_get_dispc;
 
-	r = dss_dpi_select_source(dpi->dss, out->port_num, out->dispc_channel);
+	r = dss_dpi_select_source(dpi->dss, dpi->id, out->dispc_channel);
 	if (r)
 		goto err_src_sel;
 
@@ -609,7 +610,7 @@ static void dpi_init_pll(struct dpi_data *dpi)
  * the channel in some more dynamic manner, or get the channel as a user
  * parameter.
  */
-static enum omap_channel dpi_get_channel(struct dpi_data *dpi, int port_num)
+static enum omap_channel dpi_get_channel(struct dpi_data *dpi)
 {
 	switch (dpi->dss_model) {
 	case DSS_MODEL_OMAP2:
@@ -617,7 +618,7 @@ static enum omap_channel dpi_get_channel(struct dpi_data *dpi, int port_num)
 		return OMAP_DSS_CHANNEL_LCD;
 
 	case DSS_MODEL_DRA7:
-		switch (port_num) {
+		switch (dpi->id) {
 		case 2:
 			return OMAP_DSS_CHANNEL_LCD3;
 		case 1:
@@ -690,12 +691,10 @@ static const struct omap_dss_device_ops dpi_ops = {
 static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 {
 	struct omap_dss_device *out = &dpi->output;
-	int r;
-	u32 port_num;
+	u32 port_num = 0;
 
-	r = of_property_read_u32(port, "reg", &port_num);
-	if (r)
-		port_num = 0;
+	of_property_read_u32(port, "reg", &port_num);
+	dpi->id = port_num <= 2 ? port_num : 0;
 
 	switch (port_num) {
 	case 2:
@@ -713,8 +712,8 @@ static void 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->dispc_channel = dpi_get_channel(dpi, port_num);
-	out->port_num = port_num;
+	out->dispc_channel = dpi_get_channel(dpi);
+	out->of_ports = BIT(port_num);
 	out->ops = &dpi_ops;
 	out->owner = THIS_MODULE;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 90820402e81f..b3e50d8a7477 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4994,6 +4994,7 @@ static void dsi_init_output(struct dsi_data *dsi)
 	out->dispc_channel = dsi_get_channel(dsi);
 	out->ops = &dsi_ops;
 	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
 
 	omapdss_device_register(out);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index fa818033f3f3..bf800cede2ad 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -564,6 +564,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
 
 	omapdss_device_register(out);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index ef4a48f397d2..e5d23dd19f99 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -555,6 +555,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &hdmi_ops;
 	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
 
 	omapdss_device_register(out);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 121bc953ba31..c2d9ebdec3d1 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -423,8 +423,8 @@ struct omap_dss_device {
 	/* output instance */
 	enum omap_dss_output_id id;
 
-	/* the port number in the DT node */
-	int port_num;
+	/* bitmask of port numbers in DT */
+	unsigned int of_ports;
 };
 
 struct omap_dss_driver {
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 76842ca4a619..fd5320041911 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -324,7 +324,7 @@ static void sdi_init_output(struct sdi_device *sdi)
 	out->name = "sdi.0";
 	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
 	/* We have SDI only on OMAP3, where it's on port 1 */
-	out->port_num = 1;
+	out->of_ports = BIT(1);
 	out->ops = &sdi_ops;
 	out->owner = THIS_MODULE;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index bed7fcb35d89..47985549a81c 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -767,6 +767,7 @@ static void venc_init_output(struct venc_device *venc)
 	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
 	out->ops = &venc_ops;
 	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
 
 	omapdss_device_register(out);
 }
-- 
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] 127+ messages in thread

* [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (34 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 21:13   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily Laurent Pinchart
                   ` (24 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omapdss_of_find_source_for_first_ep() function locates the source
corresponding to the first endpoint of the first port of a device node.
We can easily extend it to locate sinks as well by passing the port
number as a parameter. This will be useful to find sinks in encoders
drivers.

Extend the function and rename it to omapdss_of_find_connected_device()
to reflect its new extended purpose.

Additionally, it is useful to differentiate between failures to return
the connected device because no link exists in the device tree for the
requested port, or because the connected device as described in the
device tree is invalid or not probed yet. Return NULL in the first case
and an error code in the second case, and update the callers
accordingly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/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          |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c          |  2 +-
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c       |  2 +-
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c               |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c            |  6 +++---
 .../gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c    |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c    |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  6 +++---
 drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  6 +++---
 drivers/gpu/drm/omapdrm/dss/dss-of.c                       | 14 +++++++-------
 drivers/gpu/drm/omapdrm/dss/omapdss.h                      |  2 +-
 16 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index b960c4d0e84d..4f32c8ddcfbd 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -47,10 +47,10 @@ static int tvc_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(ddata->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 8ff674bf75e6..6eae18b42b82 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -61,10 +61,10 @@ static int dvic_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 2afaa2ca602b..b3f88ab0cd6e 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -57,10 +57,10 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(ddata->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index eb0ebb850114..904ebec5f5e1 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -37,7 +37,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
 	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
 		return PTR_ERR(src);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index fb767d674297..cd442f66fa1d 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -33,7 +33,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
 	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
 		return PTR_ERR(src);
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index cd6da0e8f76a..d21d0829774e 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -42,7 +42,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
 	if (IS_ERR(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
 		return PTR_ERR(src);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 97ebfb51192e..049959309063 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -39,10 +39,10 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 92f521930c2c..db2e841f1b07 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -763,10 +763,10 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index 46ca37dd9205..76f9064106d4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -121,10 +121,10 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index fec2de915200..0c64a734f28f 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -116,10 +116,10 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index 0ff8f00a95cb..87baa8982f55 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -62,10 +62,10 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 8d2bf114f47e..ac05cd252b1c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -511,10 +511,10 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index 38d87a276261..acfa69b74ffa 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -170,10 +170,10 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index c30b0809012a..383ffd0d21f2 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -341,10 +341,10 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
-	if (IS_ERR(src)) {
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
+	if (IS_ERR_OR_NULL(src)) {
 		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
+		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
 	r = omapdss_device_connect(dssdev->dss, src, dssdev);
diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
index 771b20db2d98..0422597ac6b0 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
@@ -47,7 +47,7 @@ dss_of_port_get_parent_device(struct device_node *port)
 }
 
 struct omap_dss_device *
-omapdss_of_find_source_for_first_ep(struct device_node *node)
+omapdss_of_find_connected_device(struct device_node *node, unsigned int port)
 {
 	struct device_node *src_node;
 	struct device_node *src_port;
@@ -56,27 +56,27 @@ omapdss_of_find_source_for_first_ep(struct device_node *node)
 	u32 port_number = 0;
 
 	/* Get the endpoint... */
-	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
+	ep = of_graph_get_endpoint_by_regs(node, port, 0);
 	if (!ep)
-		return ERR_PTR(-EINVAL);
+		return NULL;
 
 	/* ... and its remote port... */
 	src_port = of_graph_get_remote_port(ep);
 	of_node_put(ep);
 	if (!src_port)
-		return ERR_PTR(-EINVAL);
+		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 NULL;
+		return ERR_PTR(-EINVAL);
 
-	/* ... and finally the source. */
+	/* ... and finally the connected device. */
 	src = omapdss_find_device_by_port(src_node, port_number);
 	of_node_put(src_node);
 
 	return src ? src : ERR_PTR(-EPROBE_DEFER);
 }
-EXPORT_SYMBOL_GPL(omapdss_of_find_source_for_first_ep);
+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 c2d9ebdec3d1..dc2f8167f61b 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -532,7 +532,7 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
 }
 
 struct omap_dss_device *
-omapdss_of_find_source_for_first_ep(struct device_node *node);
+omapdss_of_find_connected_device(struct device_node *node, unsigned int port);
 
 enum dss_writeback_channel {
 	DSS_WB_LCD1_MGR =	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] 127+ messages in thread

* [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (35 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 21:14   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions Laurent Pinchart
                   ` (23 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The connect handle of the analog TV and HDMI connectors casts the dssdev
to panel data only to then access fields of the panel data that are also
present in the dssdev. Remove the cast and use dssdev directly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c | 5 ++---
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c      | 5 ++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index 4f32c8ddcfbd..eab898b5bf0f 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -43,13 +43,12 @@ static const struct videomode tvc_pal_vm = {
 
 static int tvc_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
 	if (IS_ERR_OR_NULL(src)) {
-		dev_err(ddata->dev, "failed to find video source\n");
+		dev_err(dssdev->dev, "failed to find video source\n");
 		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index b3f88ab0cd6e..cf06b47d6ce7 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -53,13 +53,12 @@ struct panel_drv_data {
 
 static int hdmic_connect(struct omap_dss_device *dssdev)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
 	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
+	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
 	if (IS_ERR_OR_NULL(src)) {
-		dev_err(ddata->dev, "failed to find video source\n");
+		dev_err(dssdev->dev, "failed to find video source\n");
 		return src ? PTR_ERR(src) : -EINVAL;
 	}
 
-- 
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] 127+ messages in thread

* [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (36 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 21:17   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe Laurent Pinchart
                   ` (22 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Rename the jump labels according to the cleanup they perform, not the
location they're accessed from, and move functions from error checks to
cleanup paths, and move reference handling to simplify cleanup.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 8a7c951a413c..e97f54d5f3e1 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -745,15 +745,14 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
 		return 0;
 
 	r = of_property_read_u32(ep, "data-lines", &datalines);
+	of_node_put(ep);
 	if (r) {
 		DSSERR("failed to parse datalines\n");
-		goto err_datalines;
+		return r;
 	}
 
 	dpi->data_lines = datalines;
 
-	of_node_put(ep);
-
 	dpi->pdev = pdev;
 	dpi->dss_model = dss_model;
 	dpi->dss = dss;
@@ -764,11 +763,6 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
 	dpi_init_output_port(dpi, port);
 
 	return 0;
-
-err_datalines:
-	of_node_put(ep);
-
-	return r;
 }
 
 void dpi_uninit_port(struct device_node *port)
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index b3e50d8a7477..278094f29255 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5360,7 +5360,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 
 	r = dsi_runtime_get(dsi);
 	if (r)
-		goto err_runtime_get;
+		goto err_pm_disable;
 
 	rev = dsi_read_reg(dsi, DSI_REVISION);
 	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
@@ -5381,7 +5381,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	r = dsi_probe_of(dsi);
 	if (r) {
 		DSSERR("Invalid DSI DT data\n");
-		goto err_probe_of;
+		goto err_uninit_output;
 	}
 
 	r = of_platform_populate(dev->of_node, NULL, NULL, dev);
@@ -5404,11 +5404,10 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 
 	return 0;
 
-err_probe_of:
+err_uninit_output:
 	dsi_uninit_output(dsi);
 	dsi_runtime_put(dsi);
-
-err_runtime_get:
+err_pm_disable:
 	pm_runtime_disable(dev);
 	return r;
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index bf800cede2ad..1d1f2e0b2b2a 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -780,9 +780,7 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 	r = hdmi_audio_register(hdmi);
 	if (r) {
 		DSSERR("Registering HDMI audio failed\n");
-		hdmi_uninit_output(hdmi);
-		pm_runtime_disable(&pdev->dev);
-		return r;
+		goto err_uninit_output;
 	}
 
 	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
@@ -790,6 +788,9 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 
 	return 0;
 
+err_uninit_output:
+	hdmi_uninit_output(hdmi);
+	pm_runtime_disable(&pdev->dev);
 err_pll:
 	hdmi_pll_uninit(&hdmi->pll);
 err_free:
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index e5d23dd19f99..92ae561bf974 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -773,9 +773,7 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 	r = hdmi_audio_register(hdmi);
 	if (r) {
 		DSSERR("Registering HDMI audio failed %d\n", r);
-		hdmi_uninit_output(hdmi);
-		pm_runtime_disable(&pdev->dev);
-		return r;
+		goto err_uninit_output;
 	}
 
 	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
@@ -783,6 +781,9 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 
 	return 0;
 
+err_uninit_output:
+	hdmi_uninit_output(hdmi);
+	pm_runtime_disable(&pdev->dev);
 err_pll:
 	hdmi_pll_uninit(&hdmi->pll);
 err_free:
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index fd5320041911..0ace553a21c5 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -355,16 +355,15 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
 	}
 
 	r = of_property_read_u32(ep, "datapairs", &datapairs);
+	of_node_put(ep);
 	if (r) {
 		DSSERR("failed to parse datapairs\n");
-		goto err_datapairs;
+		goto err_free;
 	}
 
 	sdi->datapairs = datapairs;
 	sdi->dss = dss;
 
-	of_node_put(ep);
-
 	sdi->pdev = pdev;
 	port->data = sdi;
 
@@ -372,8 +371,6 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
 
 	return 0;
 
-err_datapairs:
-	of_node_put(ep);
 err_free:
 	kfree(sdi);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 47985549a81c..c8fb91bb1ad3 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -867,7 +867,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
 
 	r = venc_runtime_get(venc);
 	if (r)
-		goto err_runtime_get;
+		goto err_pm_disable;
 
 	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
 	dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id);
@@ -877,7 +877,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
 	r = venc_probe_of(venc);
 	if (r) {
 		DSSERR("Invalid DT data\n");
-		goto err_probe_of;
+		goto err_pm_disable;
 	}
 
 	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
@@ -887,8 +887,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
 
 	return 0;
 
-err_probe_of:
-err_runtime_get:
+err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
 err_free:
 	kfree(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] 127+ messages in thread

* [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (37 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 22:32   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 40/60] drm/omap: dss: hdmi4: " Laurent Pinchart
                   ` (21 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

There's no reason to delay initialization of most of the driver (such as
mapping memory I/O or enabling runtime PM) to the component bind
handler. Perform as much of the initialization as possible at probe
time, initializing at bind time only the parts that depends on the DSS.
The cleanup code is moved from unbind to remove in a similar way.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 278094f29255..79312e53bfd9 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4981,85 +4981,9 @@ static const struct omap_dss_device_ops dsi_ops = {
 	},
 };
 
-static void dsi_init_output(struct dsi_data *dsi)
-{
-	struct omap_dss_device *out = &dsi->output;
-
-	out->dev = dsi->dev;
-	out->id = dsi->module_id == 0 ?
-			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
-
-	out->output_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;
-	out->owner = THIS_MODULE;
-	out->of_ports = BIT(0);
-
-	omapdss_device_register(out);
-}
-
-static void dsi_uninit_output(struct dsi_data *dsi)
-{
-	struct omap_dss_device *out = &dsi->output;
-
-	omapdss_device_unregister(out);
-}
-
-static int dsi_probe_of(struct dsi_data *dsi)
-{
-	struct device_node *node = dsi->dev->of_node;
-	struct property *prop;
-	u32 lane_arr[10];
-	int len, num_pins;
-	int r, i;
-	struct device_node *ep;
-	struct omap_dsi_pin_config pin_cfg;
-
-	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
-	if (!ep)
-		return 0;
-
-	prop = of_find_property(ep, "lanes", &len);
-	if (prop == NULL) {
-		dev_err(dsi->dev, "failed to find lane data\n");
-		r = -EINVAL;
-		goto err;
-	}
-
-	num_pins = len / sizeof(u32);
-
-	if (num_pins < 4 || num_pins % 2 != 0 ||
-		num_pins > dsi->num_lanes_supported * 2) {
-		dev_err(dsi->dev, "bad number of lanes\n");
-		r = -EINVAL;
-		goto err;
-	}
-
-	r = of_property_read_u32_array(ep, "lanes", lane_arr, num_pins);
-	if (r) {
-		dev_err(dsi->dev, "failed to read lane data\n");
-		goto err;
-	}
-
-	pin_cfg.num_pins = num_pins;
-	for (i = 0; i < num_pins; ++i)
-		pin_cfg.pins[i] = (int)lane_arr[i];
-
-	r = dsi_configure_pins(&dsi->output, &pin_cfg);
-	if (r) {
-		dev_err(dsi->dev, "failed to configure pins");
-		goto err;
-	}
-
-	of_node_put(ep);
-
-	return 0;
-
-err:
-	of_node_put(ep);
-	return r;
-}
+/* -----------------------------------------------------------------------------
+ * PLL
+ */
 
 static const struct dss_pll_ops dsi_pll_ops = {
 	.enable = dsi_pll_enable,
@@ -5174,7 +5098,153 @@ static int dsi_init_pll_data(struct dss_device *dss, struct dsi_data *dsi)
 	return 0;
 }
 
-/* DSI1 HW IP initialisation */
+/* -----------------------------------------------------------------------------
+ * Component Bind & Unbind
+ */
+
+static int dsi_bind(struct device *dev, struct device *master, void *data)
+{
+	struct dss_device *dss = dss_get_device(master);
+	struct dsi_data *dsi = dev_get_drvdata(dev);
+	char name[10];
+	u32 rev;
+	int r;
+
+	dsi->dss = dss;
+
+	dsi_init_pll_data(dss, dsi);
+
+	r = dsi_runtime_get(dsi);
+	if (r)
+		return r;
+
+	rev = dsi_read_reg(dsi, DSI_REVISION);
+	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
+	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
+
+	dsi->line_buffer_size = dsi_get_line_buf_size(dsi);
+
+	dsi_runtime_put(dsi);
+
+	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
+	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_regs, &dsi);
+#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
+	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
+	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_irqs, &dsi);
+#endif
+	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
+	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
+						    dsi_dump_dsi_clocks, &dsi);
+
+	return 0;
+}
+
+static void dsi_unbind(struct device *dev, struct device *master, void *data)
+{
+	struct dsi_data *dsi = dev_get_drvdata(dev);
+
+	dss_debugfs_remove_file(dsi->debugfs.clks);
+	dss_debugfs_remove_file(dsi->debugfs.irqs);
+	dss_debugfs_remove_file(dsi->debugfs.regs);
+
+	of_platform_depopulate(dev);
+
+	WARN_ON(dsi->scp_clk_refcount > 0);
+
+	dss_pll_unregister(&dsi->pll);
+}
+
+static const struct component_ops dsi_component_ops = {
+	.bind	= dsi_bind,
+	.unbind	= dsi_unbind,
+};
+
+/* -----------------------------------------------------------------------------
+ * Probe & Remove, Suspend & Resume
+ */
+
+static void dsi_init_output(struct dsi_data *dsi)
+{
+	struct omap_dss_device *out = &dsi->output;
+
+	out->dev = dsi->dev;
+	out->id = dsi->module_id == 0 ?
+			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
+
+	out->output_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;
+	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
+
+	omapdss_device_register(out);
+}
+
+static void dsi_uninit_output(struct dsi_data *dsi)
+{
+	struct omap_dss_device *out = &dsi->output;
+
+	omapdss_device_unregister(out);
+}
+
+static int dsi_probe_of(struct dsi_data *dsi)
+{
+	struct device_node *node = dsi->dev->of_node;
+	struct property *prop;
+	u32 lane_arr[10];
+	int len, num_pins;
+	int r, i;
+	struct device_node *ep;
+	struct omap_dsi_pin_config pin_cfg;
+
+	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
+	if (!ep)
+		return 0;
+
+	prop = of_find_property(ep, "lanes", &len);
+	if (prop == NULL) {
+		dev_err(dsi->dev, "failed to find lane data\n");
+		r = -EINVAL;
+		goto err;
+	}
+
+	num_pins = len / sizeof(u32);
+
+	if (num_pins < 4 || num_pins % 2 != 0 ||
+		num_pins > dsi->num_lanes_supported * 2) {
+		dev_err(dsi->dev, "bad number of lanes\n");
+		r = -EINVAL;
+		goto err;
+	}
+
+	r = of_property_read_u32_array(ep, "lanes", lane_arr, num_pins);
+	if (r) {
+		dev_err(dsi->dev, "failed to read lane data\n");
+		goto err;
+	}
+
+	pin_cfg.num_pins = num_pins;
+	for (i = 0; i < num_pins; ++i)
+		pin_cfg.pins[i] = (int)lane_arr[i];
+
+	r = dsi_configure_pins(&dsi->output, &pin_cfg);
+	if (r) {
+		dev_err(dsi->dev, "failed to configure pins");
+		goto err;
+	}
+
+	of_node_put(ep);
+
+	return 0;
+
+err:
+	of_node_put(ep);
+	return r;
+}
+
 static const struct dsi_of_data dsi_of_data_omap34xx = {
 	.model = DSI_MODEL_OMAP3,
 	.pll_hw = &dss_omap3_dsi_pll_hw,
@@ -5240,24 +5310,21 @@ static const struct soc_device_attribute dsi_soc_devices[] = {
 	{ /* sentinel */ }
 };
 
-static int dsi_bind(struct device *dev, struct device *master, void *data)
+static int dsi_probe(struct platform_device *pdev)
 {
-	struct platform_device *pdev = to_platform_device(dev);
-	struct dss_device *dss = dss_get_device(master);
 	const struct soc_device_attribute *soc;
 	const struct dsi_module_id_data *d;
-	u32 rev;
-	int r, i;
+	struct device *dev = &pdev->dev;
 	struct dsi_data *dsi;
 	struct resource *dsi_mem;
 	struct resource *res;
-	char name[10];
+	unsigned int i;
+	int r;
 
 	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
 	if (!dsi)
 		return -ENOMEM;
 
-	dsi->dss = dss;
 	dsi->dev = dev;
 	dev_set_drvdata(dev, dsi);
 
@@ -5354,18 +5421,8 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		return r;
 
-	dsi_init_pll_data(dss, dsi);
-
 	pm_runtime_enable(dev);
 
-	r = dsi_runtime_get(dsi);
-	if (r)
-		goto err_pm_disable;
-
-	rev = dsi_read_reg(dsi, DSI_REVISION);
-	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
-	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
-
 	/* DSI on OMAP3 doesn't have register DSI_GNQ, set number
 	 * of data to 3 by default */
 	if (dsi->data->quirks & DSI_QUIRK_GNQ)
@@ -5374,8 +5431,6 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	else
 		dsi->num_lanes_supported = 3;
 
-	dsi->line_buffer_size = dsi_get_line_buf_size(dsi);
-
 	dsi_init_output(dsi);
 
 	r = dsi_probe_of(dsi);
@@ -5388,67 +5443,33 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		DSSERR("Failed to populate DSI child devices: %d\n", r);
 
-	dsi_runtime_put(dsi);
-
-	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
-	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
-						    dsi_dump_dsi_regs, &dsi);
-#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
-	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
-	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
-						    dsi_dump_dsi_irqs, &dsi);
-#endif
-	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
-	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
-						    dsi_dump_dsi_clocks, &dsi);
+	r = component_add(&pdev->dev, &dsi_component_ops);
+	if (r)
+		goto err_uninit_output;
 
 	return 0;
 
 err_uninit_output:
 	dsi_uninit_output(dsi);
-	dsi_runtime_put(dsi);
-err_pm_disable:
 	pm_runtime_disable(dev);
 	return r;
 }
 
-static void dsi_unbind(struct device *dev, struct device *master, void *data)
+static int dsi_remove(struct platform_device *pdev)
 {
-	struct dsi_data *dsi = dev_get_drvdata(dev);
+	struct dsi_data *dsi = platform_get_drvdata(pdev);
 
-	dss_debugfs_remove_file(dsi->debugfs.clks);
-	dss_debugfs_remove_file(dsi->debugfs.irqs);
-	dss_debugfs_remove_file(dsi->debugfs.regs);
-
-	of_platform_depopulate(dev);
-
-	WARN_ON(dsi->scp_clk_refcount > 0);
-
-	dss_pll_unregister(&dsi->pll);
+	component_del(&pdev->dev, &dsi_component_ops);
 
 	dsi_uninit_output(dsi);
 
-	pm_runtime_disable(dev);
+	pm_runtime_disable(&pdev->dev);
 
 	if (dsi->vdds_dsi_reg != NULL && dsi->vdds_dsi_enabled) {
 		regulator_disable(dsi->vdds_dsi_reg);
 		dsi->vdds_dsi_enabled = false;
 	}
-}
 
-static const struct component_ops dsi_component_ops = {
-	.bind	= dsi_bind,
-	.unbind	= dsi_unbind,
-};
-
-static int dsi_probe(struct platform_device *pdev)
-{
-	return component_add(&pdev->dev, &dsi_component_ops);
-}
-
-static int dsi_remove(struct platform_device *pdev)
-{
-	component_del(&pdev->dev, &dsi_component_ops);
 	return 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] 127+ messages in thread

* [PATCH v2 40/60] drm/omap: dss: hdmi4: Move initialization code from bind to probe
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (38 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 22:54   ` Sebastian Reichel
  2018-05-26 17:24 ` [PATCH v2 41/60] drm/omap: dss: hdmi5: " Laurent Pinchart
                   ` (20 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

There's no reason to delay initialization of most of the driver (such as
mapping memory I/O or enabling runtime PM) to the component bind
handler. Perform as much of the initialization as possible at probe
time, initializing at bind time only the parts that depends on the DSS.
The cleanup code is moved from unbind to remove in a similar way.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 1d1f2e0b2b2a..89fdce02278c 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -553,53 +553,10 @@ static const struct omap_dss_device_ops hdmi_ops = {
 	},
 };
 
-static void hdmi_init_output(struct omap_hdmi *hdmi)
-{
-	struct omap_dss_device *out = &hdmi->output;
-
-	out->dev = &hdmi->pdev->dev;
-	out->id = OMAP_DSS_OUTPUT_HDMI;
-	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
-	out->name = "hdmi.0";
-	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-	out->ops = &hdmi_ops;
-	out->owner = THIS_MODULE;
-	out->of_ports = BIT(0);
-
-	omapdss_device_register(out);
-}
-
-static void hdmi_uninit_output(struct omap_hdmi *hdmi)
-{
-	struct omap_dss_device *out = &hdmi->output;
-
-	omapdss_device_unregister(out);
-}
-
-static int hdmi_probe_of(struct omap_hdmi *hdmi)
-{
-	struct platform_device *pdev = hdmi->pdev;
-	struct device_node *node = pdev->dev.of_node;
-	struct device_node *ep;
-	int r;
-
-	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
-	if (!ep)
-		return 0;
-
-	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
-	if (r)
-		goto err;
-
-	of_node_put(ep);
-	return 0;
-
-err:
-	of_node_put(ep);
-	return r;
-}
+/* -----------------------------------------------------------------------------
+ * Audio Callbacks
+ */
 
-/* Audio callbacks */
 static int hdmi_audio_startup(struct device *dev,
 			      void (*abort_cb)(struct device *dev))
 {
@@ -714,27 +671,123 @@ static int hdmi_audio_register(struct omap_hdmi *hdmi)
 	return 0;
 }
 
-/* HDMI HW IP initialisation */
+/* -----------------------------------------------------------------------------
+ * Component Bind & Unbind
+ */
+
 static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 {
-	struct platform_device *pdev = to_platform_device(dev);
 	struct dss_device *dss = dss_get_device(master);
-	struct omap_hdmi *hdmi;
+	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
 	int r;
+
+	hdmi->dss = dss;
+
+	r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
+	if (r)
+		return r;
+
+	r = hdmi4_cec_init(hdmi->pdev, &hdmi->core, &hdmi->wp);
+	if (r)
+		goto err_pll_uninit;
+
+	r = hdmi_audio_register(hdmi);
+	if (r) {
+		DSSERR("Registering HDMI audio failed\n");
+		goto err_cec_uninit;
+	}
+
+	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
+					       hdmi);
+
+	return 0;
+
+err_cec_uninit:
+	hdmi4_cec_uninit(&hdmi->core);
+err_pll_uninit:
+	hdmi_pll_uninit(&hdmi->pll);
+	return r;
+}
+
+static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
+{
+	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dss_debugfs_remove_file(hdmi->debugfs);
+
+	if (hdmi->audio_pdev)
+		platform_device_unregister(hdmi->audio_pdev);
+
+	hdmi4_cec_uninit(&hdmi->core);
+	hdmi_pll_uninit(&hdmi->pll);
+}
+
+static const struct component_ops hdmi4_component_ops = {
+	.bind	= hdmi4_bind,
+	.unbind	= hdmi4_unbind,
+};
+
+/* -----------------------------------------------------------------------------
+ * Probe & Remove, Suspend & Resume
+ */
+
+static void hdmi4_init_output(struct omap_hdmi *hdmi)
+{
+	struct omap_dss_device *out = &hdmi->output;
+
+	out->dev = &hdmi->pdev->dev;
+	out->id = OMAP_DSS_OUTPUT_HDMI;
+	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
+	out->name = "hdmi.0";
+	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
+	out->ops = &hdmi_ops;
+	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
+
+	omapdss_device_register(out);
+}
+
+static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
+{
+	struct omap_dss_device *out = &hdmi->output;
+
+	omapdss_device_unregister(out);
+}
+
+static int hdmi4_probe_of(struct omap_hdmi *hdmi)
+{
+	struct platform_device *pdev = hdmi->pdev;
+	struct device_node *node = pdev->dev.of_node;
+	struct device_node *ep;
+	int r;
+
+	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
+	if (!ep)
+		return 0;
+
+	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
+	of_node_put(ep);
+	return r;
+}
+
+static int hdmi4_probe(struct platform_device *pdev)
+{
+	struct omap_hdmi *hdmi;
 	int irq;
+	int r;
 
 	hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
 	if (!hdmi)
 		return -ENOMEM;
 
 	hdmi->pdev = pdev;
-	hdmi->dss = dss;
+
 	dev_set_drvdata(&pdev->dev, hdmi);
 
 	mutex_init(&hdmi->lock);
 	spin_lock_init(&hdmi->audio_playing_lock);
 
-	r = hdmi_probe_of(hdmi);
+	r = hdmi4_probe_of(hdmi);
 	if (r)
 		goto err_free;
 
@@ -742,27 +795,19 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		goto err_free;
 
-	r = hdmi_pll_init(dss, pdev, &hdmi->pll, &hdmi->wp);
-	if (r)
-		goto err_free;
-
 	r = hdmi_phy_init(pdev, &hdmi->phy, 4);
 	if (r)
-		goto err_pll;
+		goto err_free;
 
 	r = hdmi4_core_init(pdev, &hdmi->core);
 	if (r)
-		goto err_pll;
-
-	r = hdmi4_cec_init(pdev, &hdmi->core, &hdmi->wp);
-	if (r)
-		goto err_pll;
+		goto err_free;
 
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
 		DSSERR("platform_get_irq failed\n");
 		r = -ENODEV;
-		goto err_pll;
+		goto err_free;
 	}
 
 	r = devm_request_threaded_irq(&pdev->dev, irq,
@@ -770,67 +815,38 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 			IRQF_ONESHOT, "OMAP HDMI", hdmi);
 	if (r) {
 		DSSERR("HDMI IRQ request failed\n");
-		goto err_pll;
+		goto err_free;
 	}
 
 	pm_runtime_enable(&pdev->dev);
 
-	hdmi_init_output(hdmi);
+	hdmi4_init_output(hdmi);
 
-	r = hdmi_audio_register(hdmi);
-	if (r) {
-		DSSERR("Registering HDMI audio failed\n");
+	r = component_add(&pdev->dev, &hdmi4_component_ops);
+	if (r)
 		goto err_uninit_output;
-	}
-
-	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
-					       hdmi);
 
 	return 0;
 
 err_uninit_output:
-	hdmi_uninit_output(hdmi);
+	hdmi4_uninit_output(hdmi);
 	pm_runtime_disable(&pdev->dev);
-err_pll:
-	hdmi_pll_uninit(&hdmi->pll);
 err_free:
 	kfree(hdmi);
 	return r;
 }
 
-static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
+static int hdmi4_remove(struct platform_device *pdev)
 {
-	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
+	struct omap_hdmi *hdmi = platform_get_drvdata(pdev);
 
-	dss_debugfs_remove_file(hdmi->debugfs);
-
-	if (hdmi->audio_pdev)
-		platform_device_unregister(hdmi->audio_pdev);
-
-	hdmi_uninit_output(hdmi);
-
-	hdmi4_cec_uninit(&hdmi->core);
+	component_del(&pdev->dev, &hdmi4_component_ops);
 
-	hdmi_pll_uninit(&hdmi->pll);
+	hdmi4_uninit_output(hdmi);
 
-	pm_runtime_disable(dev);
+	pm_runtime_disable(&pdev->dev);
 
 	kfree(hdmi);
-}
-
-static const struct component_ops hdmi4_component_ops = {
-	.bind	= hdmi4_bind,
-	.unbind	= hdmi4_unbind,
-};
-
-static int hdmi4_probe(struct platform_device *pdev)
-{
-	return component_add(&pdev->dev, &hdmi4_component_ops);
-}
-
-static int hdmi4_remove(struct platform_device *pdev)
-{
-	component_del(&pdev->dev, &hdmi4_component_ops);
 	return 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] 127+ messages in thread

* [PATCH v2 41/60] drm/omap: dss: hdmi5: Move initialization code from bind to probe
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (39 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 40/60] drm/omap: dss: hdmi4: " Laurent Pinchart
@ 2018-05-26 17:24 ` Laurent Pinchart
  2018-06-10 23:08   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 42/60] drm/omap: dss: venc: " Laurent Pinchart
                   ` (19 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:24 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

There's no reason to delay initialization of most of the driver (such as
mapping memory I/O or enabling runtime PM) to the component bind
handler. Perform as much of the initialization as possible at probe
time, initializing at bind time only the parts that depends on the DSS.
The cleanup code is moved from unbind to remove in a similar way.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 92ae561bf974..64b45a612439 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -544,53 +544,10 @@ static const struct omap_dss_device_ops hdmi_ops = {
 	},
 };
 
-static void hdmi_init_output(struct omap_hdmi *hdmi)
-{
-	struct omap_dss_device *out = &hdmi->output;
-
-	out->dev = &hdmi->pdev->dev;
-	out->id = OMAP_DSS_OUTPUT_HDMI;
-	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
-	out->name = "hdmi.0";
-	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-	out->ops = &hdmi_ops;
-	out->owner = THIS_MODULE;
-	out->of_ports = BIT(0);
-
-	omapdss_device_register(out);
-}
-
-static void hdmi_uninit_output(struct omap_hdmi *hdmi)
-{
-	struct omap_dss_device *out = &hdmi->output;
-
-	omapdss_device_unregister(out);
-}
-
-static int hdmi_probe_of(struct omap_hdmi *hdmi)
-{
-	struct platform_device *pdev = hdmi->pdev;
-	struct device_node *node = pdev->dev.of_node;
-	struct device_node *ep;
-	int r;
-
-	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
-	if (!ep)
-		return 0;
-
-	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
-	if (r)
-		goto err;
-
-	of_node_put(ep);
-	return 0;
-
-err:
-	of_node_put(ep);
-	return r;
-}
+/* -----------------------------------------------------------------------------
+ * Audio Callbacks
+ */
 
-/* Audio callbacks */
 static int hdmi_audio_startup(struct device *dev,
 			      void (*abort_cb)(struct device *dev))
 {
@@ -711,27 +668,116 @@ static int hdmi_audio_register(struct omap_hdmi *hdmi)
 	return 0;
 }
 
-/* HDMI HW IP initialisation */
+/* -----------------------------------------------------------------------------
+ * Component Bind & Unbind
+ */
+
 static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 {
-	struct platform_device *pdev = to_platform_device(dev);
 	struct dss_device *dss = dss_get_device(master);
-	struct omap_hdmi *hdmi;
+	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
 	int r;
+
+	hdmi->dss = dss;
+
+	r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
+	if (r)
+		return r;
+
+	r = hdmi_audio_register(hdmi);
+	if (r) {
+		DSSERR("Registering HDMI audio failed %d\n", r);
+		goto err_pll_uninit;
+	}
+
+	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
+						hdmi);
+
+	return 0;
+
+err_pll_uninit:
+	hdmi_pll_uninit(&hdmi->pll);
+	return r;
+}
+
+static void hdmi5_unbind(struct device *dev, struct device *master, void *data)
+{
+	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dss_debugfs_remove_file(hdmi->debugfs);
+
+	if (hdmi->audio_pdev)
+		platform_device_unregister(hdmi->audio_pdev);
+
+	hdmi_pll_uninit(&hdmi->pll);
+}
+
+static const struct component_ops hdmi5_component_ops = {
+	.bind	= hdmi5_bind,
+	.unbind	= hdmi5_unbind,
+};
+
+/* -----------------------------------------------------------------------------
+ * Probe & Remove, Suspend & Resume
+ */
+
+static void hdmi5_init_output(struct omap_hdmi *hdmi)
+{
+	struct omap_dss_device *out = &hdmi->output;
+
+	out->dev = &hdmi->pdev->dev;
+	out->id = OMAP_DSS_OUTPUT_HDMI;
+	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
+	out->name = "hdmi.0";
+	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
+	out->ops = &hdmi_ops;
+	out->owner = THIS_MODULE;
+	out->of_ports = BIT(0);
+
+	omapdss_device_register(out);
+}
+
+static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
+{
+	struct omap_dss_device *out = &hdmi->output;
+
+	omapdss_device_unregister(out);
+}
+
+static int hdmi5_probe_of(struct omap_hdmi *hdmi)
+{
+	struct platform_device *pdev = hdmi->pdev;
+	struct device_node *node = pdev->dev.of_node;
+	struct device_node *ep;
+	int r;
+
+	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
+	if (!ep)
+		return 0;
+
+	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
+	of_node_put(ep);
+	return r;
+}
+
+static int hdmi5_probe(struct platform_device *pdev)
+{
+	struct omap_hdmi *hdmi;
 	int irq;
+	int r;
 
 	hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
 	if (!hdmi)
 		return -ENOMEM;
 
 	hdmi->pdev = pdev;
-	hdmi->dss = dss;
+
 	dev_set_drvdata(&pdev->dev, hdmi);
 
 	mutex_init(&hdmi->lock);
 	spin_lock_init(&hdmi->audio_playing_lock);
 
-	r = hdmi_probe_of(hdmi);
+	r = hdmi5_probe_of(hdmi);
 	if (r)
 		goto err_free;
 
@@ -739,23 +785,19 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		goto err_free;
 
-	r = hdmi_pll_init(dss, pdev, &hdmi->pll, &hdmi->wp);
-	if (r)
-		goto err_free;
-
 	r = hdmi_phy_init(pdev, &hdmi->phy, 5);
 	if (r)
-		goto err_pll;
+		goto err_free;
 
 	r = hdmi5_core_init(pdev, &hdmi->core);
 	if (r)
-		goto err_pll;
+		goto err_free;
 
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
 		DSSERR("platform_get_irq failed\n");
 		r = -ENODEV;
-		goto err_pll;
+		goto err_free;
 	}
 
 	r = devm_request_threaded_irq(&pdev->dev, irq,
@@ -763,65 +805,38 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 			IRQF_ONESHOT, "OMAP HDMI", hdmi);
 	if (r) {
 		DSSERR("HDMI IRQ request failed\n");
-		goto err_pll;
+		goto err_free;
 	}
 
 	pm_runtime_enable(&pdev->dev);
 
-	hdmi_init_output(hdmi);
+	hdmi5_init_output(hdmi);
 
-	r = hdmi_audio_register(hdmi);
-	if (r) {
-		DSSERR("Registering HDMI audio failed %d\n", r);
+	r = component_add(&pdev->dev, &hdmi5_component_ops);
+	if (r)
 		goto err_uninit_output;
-	}
-
-	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
-						hdmi);
 
 	return 0;
 
 err_uninit_output:
-	hdmi_uninit_output(hdmi);
+	hdmi5_uninit_output(hdmi);
 	pm_runtime_disable(&pdev->dev);
-err_pll:
-	hdmi_pll_uninit(&hdmi->pll);
 err_free:
 	kfree(hdmi);
 	return r;
 }
 
-static void hdmi5_unbind(struct device *dev, struct device *master, void *data)
+static int hdmi5_remove(struct platform_device *pdev)
 {
-	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
-
-	dss_debugfs_remove_file(hdmi->debugfs);
+	struct omap_hdmi *hdmi = platform_get_drvdata(pdev);
 
-	if (hdmi->audio_pdev)
-		platform_device_unregister(hdmi->audio_pdev);
-
-	hdmi_uninit_output(hdmi);
+	component_del(&pdev->dev, &hdmi5_component_ops);
 
-	hdmi_pll_uninit(&hdmi->pll);
+	hdmi5_uninit_output(hdmi);
 
-	pm_runtime_disable(dev);
+	pm_runtime_disable(&pdev->dev);
 
 	kfree(hdmi);
-}
-
-static const struct component_ops hdmi5_component_ops = {
-	.bind	= hdmi5_bind,
-	.unbind	= hdmi5_unbind,
-};
-
-static int hdmi5_probe(struct platform_device *pdev)
-{
-	return component_add(&pdev->dev, &hdmi5_component_ops);
-}
-
-static int hdmi5_remove(struct platform_device *pdev)
-{
-	component_del(&pdev->dev, &hdmi5_component_ops);
 	return 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] 127+ messages in thread

* [PATCH v2 42/60] drm/omap: dss: venc: Move initialization code from bind to probe
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (40 preceding siblings ...)
  2018-05-26 17:24 ` [PATCH v2 41/60] drm/omap: dss: hdmi5: " Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:17   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time Laurent Pinchart
                   ` (18 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

There's no reason to delay initialization of most of the driver (such as
mapping memory I/O or enabling runtime PM) to the component bind
handler. Perform as much of the initialization as possible at probe
time, initializing at bind time only the parts that depends on the DSS.
The cleanup code is moved from unbind to remove in a similar way.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index c8fb91bb1ad3..84069e79ca6a 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -756,6 +756,50 @@ static const struct omap_dss_device_ops venc_ops = {
 	.set_timings = venc_set_timings,
 };
 
+/* -----------------------------------------------------------------------------
+ * Component Bind & Unbind
+ */
+
+static int venc_bind(struct device *dev, struct device *master, void *data)
+{
+	struct dss_device *dss = dss_get_device(master);
+	struct venc_device *venc = dev_get_drvdata(dev);
+	u8 rev_id;
+	int r;
+
+	venc->dss = dss;
+
+	r = venc_runtime_get(venc);
+	if (r)
+		return r;
+
+	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
+	dev_dbg(dev, "OMAP VENC rev %d\n", rev_id);
+
+	venc_runtime_put(venc);
+
+	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
+						venc);
+
+	return 0;
+}
+
+static void venc_unbind(struct device *dev, struct device *master, void *data)
+{
+	struct venc_device *venc = dev_get_drvdata(dev);
+
+	dss_debugfs_remove_file(venc->debugfs);
+}
+
+static const struct component_ops venc_component_ops = {
+	.bind	= venc_bind,
+	.unbind	= venc_unbind,
+};
+
+/* -----------------------------------------------------------------------------
+ * Probe & Remove, Suspend & Resume
+ */
+
 static void venc_init_output(struct venc_device *venc)
 {
 	struct omap_dss_device *out = &venc->output;
@@ -820,19 +864,15 @@ static int venc_probe_of(struct venc_device *venc)
 	return r;
 }
 
-/* VENC HW IP initialisation */
 static const struct soc_device_attribute venc_soc_devices[] = {
 	{ .machine = "OMAP3[45]*" },
 	{ .machine = "AM35*" },
 	{ /* sentinel */ }
 };
 
-static int venc_bind(struct device *dev, struct device *master, void *data)
+static int venc_probe(struct platform_device *pdev)
 {
-	struct platform_device *pdev = to_platform_device(dev);
-	struct dss_device *dss = dss_get_device(master);
 	struct venc_device *venc;
-	u8 rev_id;
 	struct resource *venc_mem;
 	int r;
 
@@ -841,8 +881,8 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
 		return -ENOMEM;
 
 	venc->pdev = pdev;
-	venc->dss = dss;
-	dev_set_drvdata(dev, venc);
+
+	platform_set_drvdata(pdev, venc);
 
 	/* The OMAP34xx, OMAP35xx and AM35xx VENC require the TV DAC clock. */
 	if (soc_device_match(venc_soc_devices))
@@ -863,63 +903,39 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		goto err_free;
 
-	pm_runtime_enable(&pdev->dev);
-
-	r = venc_runtime_get(venc);
-	if (r)
-		goto err_pm_disable;
-
-	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
-	dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id);
-
-	venc_runtime_put(venc);
-
 	r = venc_probe_of(venc);
-	if (r) {
-		DSSERR("Invalid DT data\n");
-		goto err_pm_disable;
-	}
+	if (r)
+		goto err_free;
 
-	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
-						venc);
+	pm_runtime_enable(&pdev->dev);
 
 	venc_init_output(venc);
 
+	r = component_add(&pdev->dev, &venc_component_ops);
+	if (r)
+		goto err_uninit_output;
+
 	return 0;
 
-err_pm_disable:
+err_uninit_output:
+	venc_uninit_output(venc);
 	pm_runtime_disable(&pdev->dev);
 err_free:
 	kfree(venc);
 	return r;
 }
 
-static void venc_unbind(struct device *dev, struct device *master, void *data)
+static int venc_remove(struct platform_device *pdev)
 {
-	struct venc_device *venc = dev_get_drvdata(dev);
+	struct venc_device *venc = platform_get_drvdata(pdev);
 
-	dss_debugfs_remove_file(venc->debugfs);
+	component_del(&pdev->dev, &venc_component_ops);
 
 	venc_uninit_output(venc);
 
-	pm_runtime_disable(dev);
+	pm_runtime_disable(&pdev->dev);
 
 	kfree(venc);
-}
-
-static const struct component_ops venc_component_ops = {
-	.bind	= venc_bind,
-	.unbind	= venc_unbind,
-};
-
-static int venc_probe(struct platform_device *pdev)
-{
-	return component_add(&pdev->dev, &venc_component_ops);
-}
-
-static int venc_remove(struct platform_device *pdev)
-{
-	component_del(&pdev->dev, &venc_component_ops);
 	return 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] 127+ messages in thread

* [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (41 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 42/60] drm/omap: dss: venc: " Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:49   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro Laurent Pinchart
                   ` (17 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Look up the next dssdev at probe time based on device tree links for all
DSS outputs and encoders. This will be used to reverse the order of the
dssdev connect and disconnect call chains.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    |  9 +++++++++
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  9 +++++++++
 drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  9 +++++++++
 drivers/gpu/drm/omapdrm/dss/dpi.c                    | 17 +++++++++++++----
 drivers/gpu/drm/omapdrm/dss/dsi.c                    | 18 ++++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                  | 18 ++++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                  | 18 ++++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/omapdss.h                |  1 +
 drivers/gpu/drm/omapdrm/dss/sdi.c                    | 17 +++++++++++++++--
 drivers/gpu/drm/omapdrm/dss/venc.c                   | 18 ++++++++++++++++--
 10 files changed, 120 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 904ebec5f5e1..a94d6d0cead9 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -169,6 +169,13 @@ static int opa362_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 
+	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
+	if (IS_ERR(dssdev->next)) {
+		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
+			dev_err(&pdev->dev, "failed to find video sink\n");
+		return PTR_ERR(dssdev->next);
+	}
+
 	omapdss_device_register(dssdev);
 
 	return 0;
@@ -179,6 +186,8 @@ static int __exit opa362_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
+	if (dssdev->next)
+		omapdss_device_put(dssdev->next);
 	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index cd442f66fa1d..d40a0fd93e67 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -192,6 +192,13 @@ static int tfp410_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 
+	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
+	if (IS_ERR(dssdev->next)) {
+		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
+			dev_err(&pdev->dev, "failed to find video sink\n");
+		return PTR_ERR(dssdev->next);
+	}
+
 	omapdss_device_register(dssdev);
 
 	return 0;
@@ -202,6 +209,8 @@ static int __exit tfp410_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
+	if (dssdev->next)
+		omapdss_device_put(dssdev->next);
 	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index d21d0829774e..e6adeebb91d1 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -301,6 +301,13 @@ static int tpd_probe(struct platform_device *pdev)
 	dssdev->owner = THIS_MODULE;
 	dssdev->of_ports = BIT(1) | BIT(0);
 
+	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
+	if (IS_ERR(dssdev->next)) {
+		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
+			dev_err(&pdev->dev, "failed to find video sink\n");
+		return PTR_ERR(dssdev->next);
+	}
+
 	omapdss_device_register(dssdev);
 
 	return 0;
@@ -311,6 +318,8 @@ static int __exit tpd_remove(struct platform_device *pdev)
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
 	struct omap_dss_device *dssdev = &ddata->dssdev;
 
+	if (dssdev->next)
+		omapdss_device_put(dssdev->next);
 	omapdss_device_unregister(&ddata->dssdev);
 
 	WARN_ON(omapdss_device_is_enabled(dssdev));
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index e97f54d5f3e1..650becdf2763 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -688,7 +688,7 @@ static const struct omap_dss_device_ops dpi_ops = {
 	.set_timings = dpi_set_timings,
 };
 
-static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
+static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 {
 	struct omap_dss_device *out = &dpi->output;
 	u32 port_num = 0;
@@ -717,7 +717,16 @@ static void 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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 static void dpi_uninit_output_port(struct device_node *port)
@@ -725,6 +734,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);
 }
 
@@ -760,9 +771,7 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
 
 	mutex_init(&dpi->lock);
 
-	dpi_init_output_port(dpi, port);
-
-	return 0;
+	return dpi_init_output_port(dpi, port);
 }
 
 void dpi_uninit_port(struct device_node *port)
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 79312e53bfd9..b48ee792244b 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5165,7 +5165,7 @@ static const struct component_ops dsi_component_ops = {
  * Probe & Remove, Suspend & Resume
  */
 
-static void dsi_init_output(struct dsi_data *dsi)
+static int dsi_init_output(struct dsi_data *dsi)
 {
 	struct omap_dss_device *out = &dsi->output;
 
@@ -5180,13 +5180,24 @@ static void dsi_init_output(struct dsi_data *dsi)
 	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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 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);
 }
 
@@ -5431,7 +5442,9 @@ static int dsi_probe(struct platform_device *pdev)
 	else
 		dsi->num_lanes_supported = 3;
 
-	dsi_init_output(dsi);
+	r = dsi_init_output(dsi);
+	if (r)
+		goto err_pm_disable;
 
 	r = dsi_probe_of(dsi);
 	if (r) {
@@ -5451,6 +5464,7 @@ static int dsi_probe(struct platform_device *pdev)
 
 err_uninit_output:
 	dsi_uninit_output(dsi);
+err_pm_disable:
 	pm_runtime_disable(dev);
 	return r;
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 89fdce02278c..118c015624b9 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -731,7 +731,7 @@ static const struct component_ops hdmi4_component_ops = {
  * Probe & Remove, Suspend & Resume
  */
 
-static void hdmi4_init_output(struct omap_hdmi *hdmi)
+static int hdmi4_init_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
@@ -744,13 +744,24 @@ static void hdmi4_init_output(struct omap_hdmi *hdmi)
 	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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 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);
 }
 
@@ -820,7 +831,9 @@ static int hdmi4_probe(struct platform_device *pdev)
 
 	pm_runtime_enable(&pdev->dev);
 
-	hdmi4_init_output(hdmi);
+	r = hdmi4_init_output(hdmi);
+	if (r)
+		goto err_pm_disable;
 
 	r = component_add(&pdev->dev, &hdmi4_component_ops);
 	if (r)
@@ -830,6 +843,7 @@ static int hdmi4_probe(struct platform_device *pdev)
 
 err_uninit_output:
 	hdmi4_uninit_output(hdmi);
+err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
 err_free:
 	kfree(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 64b45a612439..7af60ca4e7b2 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -721,7 +721,7 @@ static const struct component_ops hdmi5_component_ops = {
  * Probe & Remove, Suspend & Resume
  */
 
-static void hdmi5_init_output(struct omap_hdmi *hdmi)
+static int hdmi5_init_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
 
@@ -734,13 +734,24 @@ static void hdmi5_init_output(struct omap_hdmi *hdmi)
 	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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 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);
 }
 
@@ -810,7 +821,9 @@ static int hdmi5_probe(struct platform_device *pdev)
 
 	pm_runtime_enable(&pdev->dev);
 
-	hdmi5_init_output(hdmi);
+	r = hdmi5_init_output(hdmi);
+	if (r)
+		goto err_pm_disable;
 
 	r = component_add(&pdev->dev, &hdmi5_component_ops);
 	if (r)
@@ -820,6 +833,7 @@ static int hdmi5_probe(struct platform_device *pdev)
 
 err_uninit_output:
 	hdmi5_uninit_output(hdmi);
+err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
 err_free:
 	kfree(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index dc2f8167f61b..5d3e4ced73d1 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -394,6 +394,7 @@ 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;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 0ace553a21c5..8be01ca79817 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -314,7 +314,7 @@ static const struct omap_dss_device_ops sdi_ops = {
 	.set_timings = sdi_set_timings,
 };
 
-static void sdi_init_output(struct sdi_device *sdi)
+static int sdi_init_output(struct sdi_device *sdi)
 {
 	struct omap_dss_device *out = &sdi->output;
 
@@ -328,11 +328,22 @@ static void sdi_init_output(struct sdi_device *sdi)
 	out->ops = &sdi_ops;
 	out->owner = THIS_MODULE;
 
+	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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 static void sdi_uninit_output(struct sdi_device *sdi)
 {
+	if (sdi->output.next)
+		omapdss_device_put(sdi->output.next);
 	omapdss_device_unregister(&sdi->output);
 }
 
@@ -367,7 +378,9 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
 	sdi->pdev = pdev;
 	port->data = sdi;
 
-	sdi_init_output(sdi);
+	r = sdi_init_output(sdi);
+	if (r)
+		goto err_free;
 
 	return 0;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 84069e79ca6a..7bd3156a52a9 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -800,7 +800,7 @@ static const struct component_ops venc_component_ops = {
  * Probe & Remove, Suspend & Resume
  */
 
-static void venc_init_output(struct venc_device *venc)
+static int venc_init_output(struct venc_device *venc)
 {
 	struct omap_dss_device *out = &venc->output;
 
@@ -813,11 +813,22 @@ static void 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);
+	}
+
 	omapdss_device_register(out);
+
+	return 0;
 }
 
 static void venc_uninit_output(struct venc_device *venc)
 {
+	if (venc->output.next)
+		omapdss_device_put(venc->output.next);
 	omapdss_device_unregister(&venc->output);
 }
 
@@ -909,7 +920,9 @@ static int venc_probe(struct platform_device *pdev)
 
 	pm_runtime_enable(&pdev->dev);
 
-	venc_init_output(venc);
+	r = venc_init_output(venc);
+	if (r)
+		goto err_pm_disable;
 
 	r = component_add(&pdev->dev, &venc_component_ops);
 	if (r)
@@ -919,6 +932,7 @@ static int venc_probe(struct platform_device *pdev)
 
 err_uninit_output:
 	venc_uninit_output(venc);
+err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
 err_free:
 	kfree(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] 127+ messages in thread

* [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (42 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:52   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output Laurent Pinchart
                   ` (16 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Similarly to for_each_dss_display(), the for_each_dss_output() macro
iterates over all the DSS connected outputs.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 96be800a0f25..519682f18d36 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -127,11 +127,13 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
 
 /*
  * Search for the next device starting at @from. If display_only is true, skip
- * non-display devices. Release the reference to the @from device, and acquire
- * a reference to the returned device if found.
+ * non-display devices. If output_only is true, skip non-output devices and
+ * non-connected output devices. 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,
-						bool display_only)
+						bool display_only,
+						bool output_only)
 {
 	struct omap_dss_device *dssdev;
 	struct list_head *list;
@@ -159,9 +161,15 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
 			goto done;
 		}
 
-		/* Filter out non-display entries if display_only is set. */
-		if (!display_only || dssdev->driver)
-			goto done;
+		/*
+		 * Filter out non-display entries if display_only is set, and
+		 * non-output entries if output_only is set.
+		 */
+		if (display_only && !dssdev->driver)
+			continue;
+		if (output_only && (!dssdev->id || !dssdev->next))
+			continue;
+		goto done;
 	}
 
 	dssdev = NULL;
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 5d3e4ced73d1..723124f6e596 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -488,9 +488,9 @@ static inline bool omapdss_is_initialized(void)
 	return !!omapdss_get_dss();
 }
 
-void omapdss_display_init(struct omap_dss_device *dssdev);
 #define for_each_dss_display(d) \
-	while ((d = omapdss_device_get_next(d, true)) != NULL)
+	while ((d = omapdss_device_get_next(d, true, false)) != NULL)
+void omapdss_display_init(struct omap_dss_device *dssdev);
 
 void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(struct omap_dss_device *dssdev);
@@ -499,7 +499,8 @@ 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,
-						bool display_only);
+						bool display_only,
+						bool output_only);
 int omapdss_device_connect(struct dss_device *dss,
 			   struct omap_dss_device *src,
 			   struct omap_dss_device *dst);
@@ -511,6 +512,8 @@ 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, false, true)) != NULL)
 int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_device *out);
-- 
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] 127+ messages in thread

* [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (43 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:49   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect() Laurent Pinchart
                   ` (15 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Add a new omapdss_display_get() function to retrieve the omap_dss_device
for a given DSS output. This will be used when reversing the direction
of the DSS pipeline handling logic.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
index 65ca71859c7d..697dab0435d6 100644
--- a/drivers/gpu/drm/omapdrm/dss/display.c
+++ b/drivers/gpu/drm/omapdrm/dss/display.c
@@ -49,3 +49,12 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
 					      "display%u", id);
 }
 EXPORT_SYMBOL_GPL(omapdss_display_init);
+
+struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output)
+{
+	while (output->next)
+		output = output->next;
+
+	return omapdss_device_get(output);
+}
+EXPORT_SYMBOL_GPL(omapdss_display_get);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 723124f6e596..1d7263fc6077 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -491,6 +491,7 @@ static inline bool omapdss_is_initialized(void)
 #define for_each_dss_display(d) \
 	while ((d = omapdss_device_get_next(d, true, false)) != NULL)
 void omapdss_display_init(struct omap_dss_device *dssdev);
+struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output);
 
 void omapdss_device_register(struct omap_dss_device *dssdev);
 void omapdss_device_unregister(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] 127+ messages in thread

* [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (44 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:48   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time Laurent Pinchart
                   ` (14 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The dss_mgr_connect() and dss_mgr_disconnect() functions take two
omap_dss_device pointers as parameters, which are always set to the same
value by all callers. Remove the duplicated pointer.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 650becdf2763..68c8424a460d 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -652,7 +652,7 @@ static int dpi_connect(struct omap_dss_device *dssdev,
 
 	dpi_init_pll(dpi);
 
-	r = dss_mgr_connect(&dpi->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -660,7 +660,7 @@ static int dpi_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(&dpi->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -670,11 +670,9 @@ static int dpi_connect(struct omap_dss_device *dssdev,
 static void dpi_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&dpi->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static const struct omap_dss_device_ops dpi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index b48ee792244b..2c2570e1ef2f 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4915,7 +4915,7 @@ static int dsi_connect(struct omap_dss_device *dssdev,
 	if (r)
 		return r;
 
-	r = dss_mgr_connect(&dsi->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -4923,7 +4923,7 @@ static int dsi_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dssdev->name);
-		dss_mgr_disconnect(&dsi->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -4933,11 +4933,9 @@ static int dsi_connect(struct omap_dss_device *dssdev,
 static void dsi_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct dsi_data *dsi = to_dsi_data(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&dsi->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static const struct omap_dss_device_ops dsi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 118c015624b9..5216c5554741 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -458,7 +458,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 	if (r)
 		return r;
 
-	r = dss_mgr_connect(&hdmi->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -466,7 +466,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(&hdmi->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -476,11 +476,9 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 static void hdmi_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&hdmi->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 7af60ca4e7b2..363bc5843e0f 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -461,7 +461,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 	if (r)
 		return r;
 
-	r = dss_mgr_connect(&hdmi->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -469,7 +469,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(&hdmi->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -479,11 +479,9 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
 static void hdmi_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&hdmi->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 1d7263fc6077..9efbcaeb05a7 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -583,10 +583,8 @@ int dss_install_mgr_ops(struct dss_device *dss,
 			struct omap_drm_private *priv);
 void dss_uninstall_mgr_ops(struct dss_device *dss);
 
-int dss_mgr_connect(struct omap_dss_device *dssdev,
-		    struct omap_dss_device *dst);
-void dss_mgr_disconnect(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst);
+int dss_mgr_connect(struct omap_dss_device *dssdev);
+void dss_mgr_disconnect(struct omap_dss_device *dssdev);
 void dss_mgr_set_timings(struct omap_dss_device *dssdev,
 		const struct videomode *vm);
 void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 191b2e801257..2f7a019d059e 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -109,18 +109,17 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
 }
 EXPORT_SYMBOL(dss_uninstall_mgr_ops);
 
-int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst)
+int dss_mgr_connect(struct omap_dss_device *dssdev)
 {
 	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
-					     dssdev->dispc_channel, dst);
+					     dssdev->dispc_channel, dssdev);
 }
 EXPORT_SYMBOL(dss_mgr_connect);
 
-void dss_mgr_disconnect(struct omap_dss_device *dssdev,
-			struct omap_dss_device *dst)
+void dss_mgr_disconnect(struct omap_dss_device *dssdev)
 {
 	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
-					 dssdev->dispc_channel, dst);
+					 dssdev->dispc_channel, dssdev);
 }
 EXPORT_SYMBOL(dss_mgr_disconnect);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 8be01ca79817..bbfd4ba3255c 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -278,7 +278,7 @@ static int sdi_connect(struct omap_dss_device *dssdev,
 	if (r)
 		return r;
 
-	r = dss_mgr_connect(&sdi->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -286,7 +286,7 @@ static int sdi_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(&sdi->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -296,11 +296,9 @@ static int sdi_connect(struct omap_dss_device *dssdev,
 static void sdi_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&sdi->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static const struct omap_dss_device_ops sdi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 7bd3156a52a9..db055260f50e 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -720,7 +720,7 @@ static int venc_connect(struct omap_dss_device *dssdev,
 	if (r)
 		return r;
 
-	r = dss_mgr_connect(&venc->output, dssdev);
+	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
 
@@ -728,7 +728,7 @@ static int venc_connect(struct omap_dss_device *dssdev,
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(&venc->output, dssdev);
+		dss_mgr_disconnect(dssdev);
 		return r;
 	}
 
@@ -738,11 +738,9 @@ static int venc_connect(struct omap_dss_device *dssdev,
 static void venc_disconnect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct venc_device *venc = dssdev_to_venc(dssdev);
-
 	omapdss_output_unset_device(dssdev);
 
-	dss_mgr_disconnect(&venc->output, dssdev);
+	dss_mgr_disconnect(dssdev);
 }
 
 static const struct omap_dss_device_ops venc_ops = {
-- 
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] 127+ messages in thread

* [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (45 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect() Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-10 23:58   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init Laurent Pinchart
                   ` (13 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Regulators for the DPI, DSI, HDMI, SDI and VENC outputs are all looked
up when connecting the output omap_dss_device. There's no need to delay
regulator handling to that time, get the regulators at probe time.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dpi.c   | 69 ++++++++++++++++++-------------------
 drivers/gpu/drm/omapdrm/dss/dsi.c   | 36 ++++---------------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c | 33 +++++-------------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c | 31 +++++------------
 drivers/gpu/drm/omapdrm/dss/sdi.c   | 32 +++++------------
 drivers/gpu/drm/omapdrm/dss/venc.c  | 32 +++++------------
 6 files changed, 72 insertions(+), 161 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 68c8424a460d..4557357e4130 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -551,38 +551,6 @@ static int dpi_verify_pll(struct dss_pll *pll)
 	return 0;
 }
 
-static const struct soc_device_attribute dpi_soc_devices[] = {
-	{ .machine = "OMAP3[456]*" },
-	{ .machine = "[AD]M37*" },
-	{ /* sentinel */ }
-};
-
-static int dpi_init_regulator(struct dpi_data *dpi)
-{
-	struct regulator *vdds_dsi;
-
-	/*
-	 * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
-	 * DM37xx only.
-	 */
-	if (!soc_device_match(dpi_soc_devices))
-		return 0;
-
-	if (dpi->vdds_dsi_reg)
-		return 0;
-
-	vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
-	if (IS_ERR(vdds_dsi)) {
-		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
-			DSSERR("can't get VDDS_DSI regulator\n");
-		return PTR_ERR(vdds_dsi);
-	}
-
-	dpi->vdds_dsi_reg = vdds_dsi;
-
-	return 0;
-}
-
 static void dpi_init_pll(struct dpi_data *dpi)
 {
 	struct dss_pll *pll;
@@ -646,10 +614,6 @@ static int dpi_connect(struct omap_dss_device *dssdev,
 	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
 	int r;
 
-	r = dpi_init_regulator(dpi);
-	if (r)
-		return r;
-
 	dpi_init_pll(dpi);
 
 	r = dss_mgr_connect(dssdev);
@@ -737,6 +701,35 @@ static void dpi_uninit_output_port(struct device_node *port)
 	omapdss_device_unregister(out);
 }
 
+static const struct soc_device_attribute dpi_soc_devices[] = {
+	{ .machine = "OMAP3[456]*" },
+	{ .machine = "[AD]M37*" },
+	{ /* sentinel */ }
+};
+
+static int dpi_init_regulator(struct dpi_data *dpi)
+{
+	struct regulator *vdds_dsi;
+
+	/*
+	 * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
+	 * DM37xx only.
+	 */
+	if (!soc_device_match(dpi_soc_devices))
+		return 0;
+
+	vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
+	if (IS_ERR(vdds_dsi)) {
+		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
+			DSSERR("can't get VDDS_DSI regulator\n");
+		return PTR_ERR(vdds_dsi);
+	}
+
+	dpi->vdds_dsi_reg = vdds_dsi;
+
+	return 0;
+}
+
 int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
 		  struct device_node *port, enum dss_model dss_model)
 {
@@ -769,6 +762,10 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
 
 	mutex_init(&dpi->lock);
 
+	r = dpi_init_regulator(dpi);
+	if (r)
+		return r;
+
 	return dpi_init_output_port(dpi, port);
 }
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 2c2570e1ef2f..6718c7f04423 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -1137,26 +1137,6 @@ static void dsi_runtime_put(struct dsi_data *dsi)
 	WARN_ON(r < 0 && r != -ENOSYS);
 }
 
-static int dsi_regulator_init(struct dsi_data *dsi)
-{
-	struct regulator *vdds_dsi;
-
-	if (dsi->vdds_dsi_reg != NULL)
-		return 0;
-
-	vdds_dsi = devm_regulator_get(dsi->dev, "vdd");
-
-	if (IS_ERR(vdds_dsi)) {
-		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
-			DSSERR("can't get DSI VDD regulator\n");
-		return PTR_ERR(vdds_dsi);
-	}
-
-	dsi->vdds_dsi_reg = vdds_dsi;
-
-	return 0;
-}
-
 static void _dsi_print_reset_status(struct dsi_data *dsi)
 {
 	u32 l;
@@ -1353,10 +1333,6 @@ static int dsi_pll_enable(struct dss_pll *pll)
 
 	DSSDBG("PLL init\n");
 
-	r = dsi_regulator_init(dsi);
-	if (r)
-		return r;
-
 	r = dsi_runtime_get(dsi);
 	if (r)
 		return r;
@@ -4908,13 +4884,8 @@ static int dsi_get_clocks(struct dsi_data *dsi)
 static int dsi_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct dsi_data *dsi = to_dsi_data(dssdev);
 	int r;
 
-	r = dsi_regulator_init(dsi);
-	if (r)
-		return r;
-
 	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
@@ -5384,6 +5355,13 @@ static int dsi_probe(struct platform_device *pdev)
 		return r;
 	}
 
+	dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd");
+	if (IS_ERR(dsi->vdds_dsi_reg)) {
+		if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER)
+			DSSERR("can't get DSI VDD regulator\n");
+		return PTR_ERR(dsi->vdds_dsi_reg);
+	}
+
 	soc = soc_device_match(dsi_soc_devices);
 	if (soc)
 		dsi->data = soc->data;
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 5216c5554741..6edb85898a7d 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -108,26 +108,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int hdmi_init_regulator(struct omap_hdmi *hdmi)
-{
-	struct regulator *reg;
-
-	if (hdmi->vdda_reg != NULL)
-		return 0;
-
-	reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
-
-	if (IS_ERR(reg)) {
-		if (PTR_ERR(reg) != -EPROBE_DEFER)
-			DSSERR("can't get VDDA regulator\n");
-		return PTR_ERR(reg);
-	}
-
-	hdmi->vdda_reg = reg;
-
-	return 0;
-}
-
 static int hdmi_power_on_core(struct omap_hdmi *hdmi)
 {
 	int r;
@@ -451,13 +431,8 @@ void hdmi4_core_disable(struct hdmi_core_data *core)
 static int hdmi_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 	int r;
 
-	r = hdmi_init_regulator(hdmi);
-	if (r)
-		return r;
-
 	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
@@ -827,6 +802,14 @@ static int hdmi4_probe(struct platform_device *pdev)
 		goto err_free;
 	}
 
+	hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
+	if (IS_ERR(hdmi->vdda_reg)) {
+		r = PTR_ERR(hdmi->vdda_reg);
+		if (r != -EPROBE_DEFER)
+			DSSERR("can't get VDDA regulator\n");
+		goto err_free;
+	}
+
 	pm_runtime_enable(&pdev->dev);
 
 	r = hdmi4_init_output(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 363bc5843e0f..db20a578091b 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -117,24 +117,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int hdmi_init_regulator(struct omap_hdmi *hdmi)
-{
-	struct regulator *reg;
-
-	if (hdmi->vdda_reg != NULL)
-		return 0;
-
-	reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
-	if (IS_ERR(reg)) {
-		DSSERR("can't get VDDA regulator\n");
-		return PTR_ERR(reg);
-	}
-
-	hdmi->vdda_reg = reg;
-
-	return 0;
-}
-
 static int hdmi_power_on_core(struct omap_hdmi *hdmi)
 {
 	int r;
@@ -454,13 +436,8 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi)
 static int hdmi_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
 	int r;
 
-	r = hdmi_init_regulator(hdmi);
-	if (r)
-		return r;
-
 	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
@@ -817,6 +794,14 @@ static int hdmi5_probe(struct platform_device *pdev)
 		goto err_free;
 	}
 
+	hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
+	if (IS_ERR(hdmi->vdda_reg)) {
+		r = PTR_ERR(hdmi->vdda_reg);
+		if (r != -EPROBE_DEFER)
+			DSSERR("can't get VDDA regulator\n");
+		goto err_free;
+	}
+
 	pm_runtime_enable(&pdev->dev);
 
 	r = hdmi5_init_output(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index bbfd4ba3255c..1766c95236da 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -249,35 +249,11 @@ static int sdi_check_timings(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static int sdi_init_regulator(struct sdi_device *sdi)
-{
-	struct regulator *vdds_sdi;
-
-	if (sdi->vdds_sdi_reg)
-		return 0;
-
-	vdds_sdi = devm_regulator_get(&sdi->pdev->dev, "vdds_sdi");
-	if (IS_ERR(vdds_sdi)) {
-		if (PTR_ERR(vdds_sdi) != -EPROBE_DEFER)
-			DSSERR("can't get VDDS_SDI regulator\n");
-		return PTR_ERR(vdds_sdi);
-	}
-
-	sdi->vdds_sdi_reg = vdds_sdi;
-
-	return 0;
-}
-
 static int sdi_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
 	int r;
 
-	r = sdi_init_regulator(sdi);
-	if (r)
-		return r;
-
 	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
@@ -376,6 +352,14 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
 	sdi->pdev = pdev;
 	port->data = sdi;
 
+	sdi->vdds_sdi_reg = devm_regulator_get(&pdev->dev, "vdds_sdi");
+	if (IS_ERR(sdi->vdds_sdi_reg)) {
+		r = PTR_ERR(sdi->vdds_sdi_reg);
+		if (r != -EPROBE_DEFER)
+			DSSERR("can't get VDDS_SDI regulator\n");
+		goto err_free;
+	}
+
 	r = sdi_init_output(sdi);
 	if (r)
 		goto err_free;
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index db055260f50e..9c1fe6aef074 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -614,25 +614,6 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
 	}
 }
 
-static int venc_init_regulator(struct venc_device *venc)
-{
-	struct regulator *vdda_dac;
-
-	if (venc->vdda_dac_reg != NULL)
-		return 0;
-
-	vdda_dac = devm_regulator_get(&venc->pdev->dev, "vdda");
-	if (IS_ERR(vdda_dac)) {
-		if (PTR_ERR(vdda_dac) != -EPROBE_DEFER)
-			DSSERR("can't get VDDA_DAC regulator\n");
-		return PTR_ERR(vdda_dac);
-	}
-
-	venc->vdda_dac_reg = vdda_dac;
-
-	return 0;
-}
-
 static int venc_dump_regs(struct seq_file *s, void *p)
 {
 	struct venc_device *venc = s->private;
@@ -713,13 +694,8 @@ static int venc_get_clocks(struct venc_device *venc)
 static int venc_connect(struct omap_dss_device *dssdev,
 		struct omap_dss_device *dst)
 {
-	struct venc_device *venc = dssdev_to_venc(dssdev);
 	int r;
 
-	r = venc_init_regulator(venc);
-	if (r)
-		return r;
-
 	r = dss_mgr_connect(dssdev);
 	if (r)
 		return r;
@@ -908,6 +884,14 @@ static int venc_probe(struct platform_device *pdev)
 		goto err_free;
 	}
 
+	venc->vdda_dac_reg = devm_regulator_get(&pdev->dev, "vdda");
+	if (IS_ERR(venc->vdda_dac_reg)) {
+		r = PTR_ERR(venc->vdda_dac_reg);
+		if (r != -EPROBE_DEFER)
+			DSSERR("can't get VDDA_DAC regulator\n");
+		goto err_free;
+	}
+
 	r = venc_get_clocks(venc);
 	if (r)
 		goto err_free;
-- 
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] 127+ messages in thread

* [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (46 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11  0:01   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 49/60] drm/omap: Create all planes before CRTCs Laurent Pinchart
                   ` (12 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The crtc_idx and plane_idw variables in the main loop are always equal
to the loop counter i, use it instead. Don't unnecessarily initialize
dssdev to NULL.

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

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 9b33859e9ac6..0d4c3e2db058 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -239,10 +239,9 @@ static int omap_modeset_init_properties(struct drm_device *dev)
 static int omap_modeset_init(struct drm_device *dev)
 {
 	struct omap_drm_private *priv = dev->dev_private;
-	struct omap_dss_device *dssdev = NULL;
 	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
 	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
-	int num_crtcs, crtc_idx, plane_idx;
+	int num_crtcs;
 	unsigned int i;
 	int ret;
 	u32 plane_crtc_mask;
@@ -275,10 +274,6 @@ static int omap_modeset_init(struct drm_device *dev)
 	/* All planes can be put to any CRTC */
 	plane_crtc_mask = (1 << num_crtcs) - 1;
 
-	dssdev = NULL;
-
-	crtc_idx = 0;
-	plane_idx = 0;
 	for (i = 0; i < priv->num_dssdevs; i++) {
 		struct omap_dss_device *dssdev = priv->dssdevs[i];
 		struct drm_connector *connector;
@@ -295,7 +290,7 @@ static int omap_modeset_init(struct drm_device *dev)
 		if (!connector)
 			return -ENOMEM;
 
-		plane = omap_plane_init(dev, plane_idx, DRM_PLANE_TYPE_PRIMARY,
+		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
 					plane_crtc_mask);
 		if (IS_ERR(plane))
 			return PTR_ERR(plane);
@@ -305,27 +300,24 @@ static int omap_modeset_init(struct drm_device *dev)
 			return PTR_ERR(crtc);
 
 		drm_mode_connector_attach_encoder(connector, encoder);
-		encoder->possible_crtcs = (1 << crtc_idx);
+		encoder->possible_crtcs = 1 << i;
 
 		priv->crtcs[priv->num_crtcs++] = crtc;
 		priv->planes[priv->num_planes++] = plane;
 		priv->encoders[priv->num_encoders++] = encoder;
 		priv->connectors[priv->num_connectors++] = connector;
-
-		plane_idx++;
-		crtc_idx++;
 	}
 
 	/*
 	 * Create normal planes for the remaining overlays:
 	 */
-	for (; plane_idx < num_ovls; plane_idx++) {
+	for (; i < num_ovls; i++) {
 		struct drm_plane *plane;
 
 		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
 			return -EINVAL;
 
-		plane = omap_plane_init(dev, plane_idx, DRM_PLANE_TYPE_OVERLAY,
+		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
 			plane_crtc_mask);
 		if (IS_ERR(plane))
 			return PTR_ERR(plane);
-- 
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] 127+ messages in thread

* [PATCH v2 49/60] drm/omap: Create all planes before CRTCs
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (47 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11  0:07   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure Laurent Pinchart
                   ` (11 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Creating all the planes in a single location instead of creating them
per-CRTC with remaining planes then created in a second step simplifies
the logic.

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

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 0d4c3e2db058..99ed47a17ce3 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -271,14 +271,30 @@ static int omap_modeset_init(struct drm_device *dev)
 		return -EINVAL;
 	}
 
-	/* All planes can be put to any CRTC */
+	/* Create all planes first. They can all be put to any CRTC. */
 	plane_crtc_mask = (1 << num_crtcs) - 1;
 
+	for (i = 0; i < num_ovls; i++) {
+		enum drm_plane_type type = i < priv->num_dssdevs
+					 ? DRM_PLANE_TYPE_PRIMARY
+					 : DRM_PLANE_TYPE_OVERLAY;
+		struct drm_plane *plane;
+
+		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
+			return -EINVAL;
+
+		plane = omap_plane_init(dev, i, type, plane_crtc_mask);
+		if (IS_ERR(plane))
+			return PTR_ERR(plane);
+
+		priv->planes[priv->num_planes++] = plane;
+	}
+
+	/* Create the CRTCs, encoders and connectors. */
 	for (i = 0; i < priv->num_dssdevs; i++) {
 		struct omap_dss_device *dssdev = priv->dssdevs[i];
 		struct drm_connector *connector;
 		struct drm_encoder *encoder;
-		struct drm_plane *plane;
 		struct drm_crtc *crtc;
 
 		encoder = omap_encoder_init(dev, dssdev);
@@ -290,12 +306,7 @@ static int omap_modeset_init(struct drm_device *dev)
 		if (!connector)
 			return -ENOMEM;
 
-		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
-					plane_crtc_mask);
-		if (IS_ERR(plane))
-			return PTR_ERR(plane);
-
-		crtc = omap_crtc_init(dev, plane, dssdev);
+		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
 		if (IS_ERR(crtc))
 			return PTR_ERR(crtc);
 
@@ -303,28 +314,10 @@ static int omap_modeset_init(struct drm_device *dev)
 		encoder->possible_crtcs = 1 << i;
 
 		priv->crtcs[priv->num_crtcs++] = crtc;
-		priv->planes[priv->num_planes++] = plane;
 		priv->encoders[priv->num_encoders++] = encoder;
 		priv->connectors[priv->num_connectors++] = connector;
 	}
 
-	/*
-	 * Create normal planes for the remaining overlays:
-	 */
-	for (; i < num_ovls; i++) {
-		struct drm_plane *plane;
-
-		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
-			return -EINVAL;
-
-		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
-			plane_crtc_mask);
-		if (IS_ERR(plane))
-			return PTR_ERR(plane);
-
-		priv->planes[priv->num_planes++] = plane;
-	}
-
 	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
 		priv->num_planes, priv->num_crtcs, priv->num_encoders,
 		priv->num_connectors);
-- 
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] 127+ messages in thread

* [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (48 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 49/60] drm/omap: Create all planes before CRTCs Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 10:50   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (10 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Create an omap_drm_pipeline structure to model display pipelines, made
of a CRTC, an encoder, a connector and a DSS display device. This allows
grouping related parameters together instead of storing them in
independent arrays and thus improves code readability.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_crtc.c  |   4 +-
 drivers/gpu/drm/omapdrm/omap_drv.c   | 144 +++++++++++++++++------------------
 drivers/gpu/drm/omapdrm/omap_drv.h   |  20 +++--
 drivers/gpu/drm/omapdrm/omap_fbdev.c |   4 +-
 drivers/gpu/drm/omapdrm/omap_irq.c   |   4 +-
 5 files changed, 84 insertions(+), 92 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index c5f1915aef67..f5bf553a862f 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -474,8 +474,8 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	 * has been changed to the DRM model.
 	 */
 
-	for (i = 0; i < priv->num_encoders; ++i) {
-		struct drm_encoder *encoder = priv->encoders[i];
+	for (i = 0; i < priv->num_pipes; ++i) {
+		struct drm_encoder *encoder = priv->pipes[i].encoder;
 
 		if (encoder->crtc == crtc) {
 			struct omap_dss_device *dssdev;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 99ed47a17ce3..298d594a0c65 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -129,9 +129,9 @@ static const struct drm_mode_config_funcs omap_mode_config_funcs = {
 	.atomic_commit = drm_atomic_helper_commit,
 };
 
-static int get_connector_type(struct omap_dss_device *dssdev)
+static int get_connector_type(struct omap_dss_device *display)
 {
-	switch (dssdev->type) {
+	switch (display->type) {
 	case OMAP_DISPLAY_TYPE_HDMI:
 		return DRM_MODE_CONNECTOR_HDMIA;
 	case OMAP_DISPLAY_TYPE_DVI:
@@ -151,65 +151,65 @@ static int get_connector_type(struct omap_dss_device *dssdev)
 	}
 }
 
-static void omap_disconnect_dssdevs(struct drm_device *ddev)
+static void omap_disconnect_pipelines(struct drm_device *ddev)
 {
 	struct omap_drm_private *priv = ddev->dev_private;
 	unsigned int i;
 
-	for (i = 0; i < priv->num_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_dss_device *display = priv->pipes[i].display;
 
-		omapdss_device_disconnect(dssdev, NULL);
-		priv->dssdevs[i] = NULL;
-		omapdss_device_put(dssdev);
+		omapdss_device_disconnect(display, NULL);
+		priv->pipes[i].display = NULL;
+		omapdss_device_put(display);
 	}
 
-	priv->num_dssdevs = 0;
+	priv->num_pipes = 0;
 }
 
-static int omap_compare_dssdevs(const void *a, const void *b)
+static int omap_compare_pipes(const void *a, const void *b)
 {
-	const struct omap_dss_device *dssdev1 = *(struct omap_dss_device **)a;
-	const struct omap_dss_device *dssdev2 = *(struct omap_dss_device **)b;
+	const struct omap_drm_pipeline *pipe1 = a;
+	const struct omap_drm_pipeline *pipe2 = b;
 
-	if (dssdev1->alias_id > dssdev2->alias_id)
+	if (pipe1->display->alias_id > pipe2->display->alias_id)
 		return 1;
-	else if (dssdev1->alias_id < dssdev2->alias_id)
+	else if (pipe1->display->alias_id < pipe2->display->alias_id)
 		return -1;
 	return 0;
 }
 
-static int omap_connect_dssdevs(struct drm_device *ddev)
+static int omap_connect_pipelines(struct drm_device *ddev)
 {
 	struct omap_drm_private *priv = ddev->dev_private;
-	struct omap_dss_device *dssdev = NULL;
+	struct omap_dss_device *display = NULL;
 	int r;
 
 	if (!omapdss_stack_is_ready())
 		return -EPROBE_DEFER;
 
-	for_each_dss_display(dssdev) {
-		r = omapdss_device_connect(priv->dss, dssdev, NULL);
+	for_each_dss_display(display) {
+		r = omapdss_device_connect(priv->dss, display, NULL);
 		if (r == -EPROBE_DEFER) {
-			omapdss_device_put(dssdev);
+			omapdss_device_put(display);
 			goto cleanup;
 		} else if (r) {
-			dev_warn(dssdev->dev, "could not connect display: %s\n",
-				dssdev->name);
+			dev_warn(display->dev, "could not connect display: %s\n",
+				display->name);
 		} else {
-			omapdss_device_get(dssdev);
-			priv->dssdevs[priv->num_dssdevs++] = dssdev;
-			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
+			omapdss_device_get(display);
+			priv->pipes[priv->num_pipes++].display = display;
+			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
 				/* To balance the 'for_each_dss_display' loop */
-				omapdss_device_put(dssdev);
+				omapdss_device_put(display);
 				break;
 			}
 		}
 	}
 
 	/* Sort the list by DT aliases */
-	sort(priv->dssdevs, priv->num_dssdevs, sizeof(priv->dssdevs[0]),
-	     omap_compare_dssdevs, NULL);
+	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
+	     omap_compare_pipes, NULL);
 
 	return 0;
 
@@ -218,7 +218,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
 	 * if we are deferring probe, we disconnect the devices we previously
 	 * connected
 	 */
-	omap_disconnect_dssdevs(ddev);
+	omap_disconnect_pipelines(ddev);
 
 	return r;
 }
@@ -241,7 +241,6 @@ static int omap_modeset_init(struct drm_device *dev)
 	struct omap_drm_private *priv = dev->dev_private;
 	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
 	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
-	int num_crtcs;
 	unsigned int i;
 	int ret;
 	u32 plane_crtc_mask;
@@ -260,22 +259,17 @@ static int omap_modeset_init(struct drm_device *dev)
 	 * configuration does not match the expectations or exceeds
 	 * the available resources, the configuration is rejected.
 	 */
-	num_crtcs = priv->num_dssdevs;
-	if (num_crtcs > num_mgrs || num_crtcs > num_ovls ||
-	    num_crtcs > ARRAY_SIZE(priv->crtcs) ||
-	    num_crtcs > ARRAY_SIZE(priv->planes) ||
-	    num_crtcs > ARRAY_SIZE(priv->encoders) ||
-	    num_crtcs > ARRAY_SIZE(priv->connectors)) {
+	if (priv->num_pipes > num_mgrs || priv->num_pipes > num_ovls) {
 		dev_err(dev->dev, "%s(): Too many connected displays\n",
 			__func__);
 		return -EINVAL;
 	}
 
 	/* Create all planes first. They can all be put to any CRTC. */
-	plane_crtc_mask = (1 << num_crtcs) - 1;
+	plane_crtc_mask = (1 << priv->num_pipes) - 1;
 
 	for (i = 0; i < num_ovls; i++) {
-		enum drm_plane_type type = i < priv->num_dssdevs
+		enum drm_plane_type type = i < priv->num_pipes
 					 ? DRM_PLANE_TYPE_PRIMARY
 					 : DRM_PLANE_TYPE_OVERLAY;
 		struct drm_plane *plane;
@@ -291,36 +285,36 @@ static int omap_modeset_init(struct drm_device *dev)
 	}
 
 	/* Create the CRTCs, encoders and connectors. */
-	for (i = 0; i < priv->num_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	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;
 
-		encoder = omap_encoder_init(dev, dssdev);
+		encoder = omap_encoder_init(dev, display);
 		if (!encoder)
 			return -ENOMEM;
 
 		connector = omap_connector_init(dev,
-				get_connector_type(dssdev), dssdev, encoder);
+				get_connector_type(display), display, encoder);
 		if (!connector)
 			return -ENOMEM;
 
-		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
+		crtc = omap_crtc_init(dev, priv->planes[i], display);
 		if (IS_ERR(crtc))
 			return PTR_ERR(crtc);
 
 		drm_mode_connector_attach_encoder(connector, encoder);
 		encoder->possible_crtcs = 1 << i;
 
-		priv->crtcs[priv->num_crtcs++] = crtc;
-		priv->encoders[priv->num_encoders++] = encoder;
-		priv->connectors[priv->num_connectors++] = connector;
+		pipe->crtc = crtc;
+		pipe->encoder = encoder;
+		pipe->connector = connector;
 	}
 
-	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
-		priv->num_planes, priv->num_crtcs, priv->num_encoders,
-		priv->num_connectors);
+	DBG("registered %u planes, %u crtcs/encoders/connectors\n",
+	    priv->num_planes, priv->num_pipes);
 
 	dev->mode_config.min_width = 8;
 	dev->mode_config.min_height = 2;
@@ -355,11 +349,11 @@ static void omap_modeset_enable_external_hpd(struct drm_device *ddev)
 	struct omap_drm_private *priv = ddev->dev_private;
 	int i;
 
-	for (i = 0; i < priv->num_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_dss_device *display = priv->pipes[i].display;
 
-		if (dssdev->driver->enable_hpd)
-			dssdev->driver->enable_hpd(dssdev);
+		if (display->driver->enable_hpd)
+			display->driver->enable_hpd(display);
 	}
 }
 
@@ -371,11 +365,11 @@ static void omap_modeset_disable_external_hpd(struct drm_device *ddev)
 	struct omap_drm_private *priv = ddev->dev_private;
 	int i;
 
-	for (i = 0; i < priv->num_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_dss_device *display = priv->pipes[i].display;
 
-		if (dssdev->driver->disable_hpd)
-			dssdev->driver->disable_hpd(dssdev);
+		if (display->driver->disable_hpd)
+			display->driver->disable_hpd(display);
 	}
 }
 
@@ -561,7 +555,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 
 	omap_crtc_pre_init(priv);
 
-	ret = omap_connect_dssdevs(ddev);
+	ret = omap_connect_pipelines(ddev);
 	if (ret)
 		goto err_crtc_uninit;
 
@@ -586,14 +580,14 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 	}
 
 	/* Initialize vblank handling, start with all CRTCs disabled. */
-	ret = drm_vblank_init(ddev, priv->num_crtcs);
+	ret = drm_vblank_init(ddev, priv->num_pipes);
 	if (ret) {
 		dev_err(priv->dev, "could not init vblank\n");
 		goto err_cleanup_modeset;
 	}
 
-	for (i = 0; i < priv->num_crtcs; i++)
-		drm_crtc_vblank_off(priv->crtcs[i]);
+	for (i = 0; i < priv->num_pipes; i++)
+		drm_crtc_vblank_off(priv->pipes[i].crtc);
 
 	omap_fbdev_init(ddev);
 
@@ -621,7 +615,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 err_gem_deinit:
 	omap_gem_deinit(ddev);
 	destroy_workqueue(priv->wq);
-	omap_disconnect_dssdevs(ddev);
+	omap_disconnect_pipelines(ddev);
 err_crtc_uninit:
 	omap_crtc_pre_uninit(priv);
 	drm_dev_unref(ddev);
@@ -650,7 +644,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
 
 	destroy_workqueue(priv->wq);
 
-	omap_disconnect_dssdevs(ddev);
+	omap_disconnect_pipelines(ddev);
 	omap_crtc_pre_uninit(priv);
 
 	drm_dev_unref(ddev);
@@ -700,17 +694,17 @@ 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_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_dss_device *display = priv->pipes[i].display;
 
-		if (!dssdev->driver)
+		if (!display->driver)
 			continue;
 
-		if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
-			dssdev->driver->disable(dssdev);
-			dssdev->activate_after_resume = true;
+		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
+			display->driver->disable(display);
+			display->activate_after_resume = true;
 		} else {
-			dssdev->activate_after_resume = false;
+			display->activate_after_resume = false;
 		}
 	}
 
@@ -722,15 +716,15 @@ 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_dssdevs; i++) {
-		struct omap_dss_device *dssdev = priv->dssdevs[i];
+	for (i = 0; i < priv->num_pipes; i++) {
+		struct omap_dss_device *display = priv->pipes[i].display;
 
-		if (!dssdev->driver)
+		if (!display->driver)
 			continue;
 
-		if (dssdev->activate_after_resume) {
-			dssdev->driver->enable(dssdev);
-			dssdev->activate_after_resume = false;
+		if (display->activate_after_resume) {
+			display->driver->enable(display);
+			display->activate_after_resume = false;
 		}
 	}
 
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 006c868c528d..bc9b954fcc31 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -45,6 +45,13 @@
 
 struct omap_drm_usergart;
 
+struct omap_drm_pipeline {
+	struct drm_crtc *crtc;
+	struct drm_encoder *encoder;
+	struct drm_connector *connector;
+	struct omap_dss_device *display;
+};
+
 struct omap_drm_private {
 	struct drm_device *ddev;
 	struct device *dev;
@@ -54,21 +61,12 @@ struct omap_drm_private {
 	struct dispc_device *dispc;
 	const struct dispc_ops *dispc_ops;
 
-	unsigned int num_dssdevs;
-	struct omap_dss_device *dssdevs[8];
-
-	unsigned int num_crtcs;
-	struct drm_crtc *crtcs[8];
+	unsigned int num_pipes;
+	struct omap_drm_pipeline pipes[8];
 
 	unsigned int num_planes;
 	struct drm_plane *planes[8];
 
-	unsigned int num_encoders;
-	struct drm_encoder *encoders[8];
-
-	unsigned int num_connectors;
-	struct drm_connector *connectors[8];
-
 	struct drm_fb_helper *fbdev;
 
 	struct workqueue_struct *wq;
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
index d958cc813a94..b445309b0143 100644
--- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
+++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
@@ -243,7 +243,7 @@ void omap_fbdev_init(struct drm_device *dev)
 	struct drm_fb_helper *helper;
 	int ret = 0;
 
-	if (!priv->num_crtcs || !priv->num_connectors)
+	if (!priv->num_pipes)
 		return;
 
 	fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
@@ -256,7 +256,7 @@ void omap_fbdev_init(struct drm_device *dev)
 
 	drm_fb_helper_prepare(dev, helper, &omap_fb_helper_funcs);
 
-	ret = drm_fb_helper_init(dev, helper, priv->num_connectors);
+	ret = drm_fb_helper_init(dev, helper, priv->num_pipes);
 	if (ret)
 		goto fail;
 
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
index c85115049f86..329ad26d6d50 100644
--- a/drivers/gpu/drm/omapdrm/omap_irq.c
+++ b/drivers/gpu/drm/omapdrm/omap_irq.c
@@ -206,8 +206,8 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
 
 	VERB("irqs: %08x", irqstatus);
 
-	for (id = 0; id < priv->num_crtcs; id++) {
-		struct drm_crtc *crtc = priv->crtcs[id];
+	for (id = 0; id < priv->num_pipes; id++) {
+		struct drm_crtc *crtc = priv->pipes[id].crtc;
 		enum omap_channel channel = omap_crtc_channel(crtc);
 
 		if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel)) {
-- 
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] 127+ messages in thread

* [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (49 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 11:59   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect Laurent Pinchart
                   ` (9 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 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.

To reconcile the omapdrm and omapdss drivers with the DRM bridge and
panel model, we need to reverse the direction of the DSS device
operations. Start with the connect and disconnect operations.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 .../gpu/drm/omapdrm/displays/connector-analog-tv.c | 27 +++-----------
 drivers/gpu/drm/omapdrm/displays/connector-dvi.c   | 27 +++-----------
 drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  | 27 +++-----------
 drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  | 34 ++++--------------
 drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  | 34 ++++--------------
 .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   | 32 ++++++-----------
 drivers/gpu/drm/omapdrm/displays/panel-dpi.c       | 27 +++-----------
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 42 ++++++----------------
 .../omapdrm/displays/panel-lgphilips-lb035q02.c    | 28 +++------------
 .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    | 27 +++-----------
 .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c | 27 +++-----------
 .../drm/omapdrm/displays/panel-sony-acx565akm.c    | 27 +++-----------
 .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    | 27 +++-----------
 .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    | 27 +++-----------
 drivers/gpu/drm/omapdrm/dss/base.c                 | 30 ++++++++--------
 drivers/gpu/drm/omapdrm/dss/dpi.c                  | 32 +++++++++++------
 drivers/gpu/drm/omapdrm/dss/dsi.c                  | 32 +++++++++++------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c                | 30 ++++++++++------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c                | 30 ++++++++++------
 drivers/gpu/drm/omapdrm/dss/omapdss.h              |  6 ++--
 drivers/gpu/drm/omapdrm/dss/sdi.c                  | 30 ++++++++++------
 drivers/gpu/drm/omapdrm/dss/venc.c                 | 30 ++++++++++------
 drivers/gpu/drm/omapdrm/omap_drv.c                 | 35 ++++++++++--------
 drivers/gpu/drm/omapdrm/omap_drv.h                 |  1 +
 24 files changed, 238 insertions(+), 431 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index eab898b5bf0f..d59b4f2e22dc 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -41,33 +41,15 @@ static const struct videomode tvc_pal_vm = {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int tvc_connect(struct omap_dss_device *dssdev)
+static int tvc_connect(struct omap_dss_device *src,
+		       struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void tvc_disconnect(struct omap_dss_device *dssdev)
+static void tvc_disconnect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int tvc_enable(struct omap_dss_device *dssdev)
@@ -184,7 +166,6 @@ static int __exit tvc_remove(struct platform_device *pdev)
 	omapdss_device_unregister(&ddata->dssdev);
 
 	tvc_disable(dssdev);
-	tvc_disconnect(dssdev);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 6eae18b42b82..39e7d0be887f 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -56,33 +56,15 @@ struct panel_drv_data {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int dvic_connect(struct omap_dss_device *dssdev)
+static int dvic_connect(struct omap_dss_device *src,
+			struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void dvic_disconnect(struct omap_dss_device *dssdev)
+static void dvic_disconnect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int dvic_enable(struct omap_dss_device *dssdev)
@@ -405,7 +387,6 @@ static int __exit dvic_remove(struct platform_device *pdev)
 	omapdss_device_unregister(&ddata->dssdev);
 
 	dvic_disable(dssdev);
-	dvic_disconnect(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 cf06b47d6ce7..e9878da5bfdb 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -51,33 +51,15 @@ struct panel_drv_data {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int hdmic_connect(struct omap_dss_device *dssdev)
+static int hdmic_connect(struct omap_dss_device *src,
+			 struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void hdmic_disconnect(struct omap_dss_device *dssdev)
+static void hdmic_disconnect(struct omap_dss_device *src,
+			     struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int hdmic_enable(struct omap_dss_device *dssdev)
@@ -364,7 +346,6 @@ static int __exit hdmic_remove(struct platform_device *pdev)
 	omapdss_device_unregister(&ddata->dssdev);
 
 	hdmic_disable(dssdev);
-	hdmic_disconnect(dssdev);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index a94d6d0cead9..176b3238e286 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -31,36 +31,16 @@ struct panel_drv_data {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int opa362_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int opa362_connect(struct omap_dss_device *src,
+			  struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
-static void opa362_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void opa362_disconnect(struct omap_dss_device *src,
+			      struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, &ddata->dssdev);
-
-	omapdss_device_put(src);
+	omapdss_device_disconnect(dst, dst->next);
 }
 
 static int opa362_enable(struct omap_dss_device *dssdev)
@@ -196,7 +176,7 @@ static int __exit opa362_remove(struct platform_device *pdev)
 
 	WARN_ON(omapdss_device_is_connected(dssdev));
 	if (omapdss_device_is_connected(dssdev))
-		opa362_disconnect(dssdev, dssdev->dst);
+		opa362_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 d40a0fd93e67..c7398428228f 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -27,36 +27,16 @@ struct panel_drv_data {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int tfp410_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int tfp410_connect(struct omap_dss_device *src,
+			  struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
-	return 0;
+	return omapdss_device_connect(dst->dss, dst, dst->next);
 }
 
-static void tfp410_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void tfp410_disconnect(struct omap_dss_device *src,
+			      struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, &ddata->dssdev);
-
-	omapdss_device_put(src);
+	omapdss_device_disconnect(dst, dst->next);
 }
 
 static int tfp410_enable(struct omap_dss_device *dssdev)
@@ -219,7 +199,7 @@ static int __exit tfp410_remove(struct platform_device *pdev)
 
 	WARN_ON(omapdss_device_is_connected(dssdev));
 	if (omapdss_device_is_connected(dssdev))
-		tfp410_disconnect(dssdev, dssdev->dst);
+		tfp410_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 e6adeebb91d1..3bd6aeb7b3f4 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -35,24 +35,15 @@ struct panel_drv_data {
 
 #define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
 
-static int tpd_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int tpd_connect(struct omap_dss_device *src,
+		       struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src;
+	struct panel_drv_data *ddata = to_panel_data(dst);
 	int r;
 
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return PTR_ERR(src);
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
 		return r;
-	}
 
 	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 1);
 	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 1);
@@ -63,18 +54,15 @@ static int tpd_connect(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static void tpd_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void tpd_disconnect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct panel_drv_data *ddata = to_panel_data(dst);
 
 	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 0);
 	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 0);
 
-	omapdss_device_disconnect(src, &ddata->dssdev);
-
-	omapdss_device_put(src);
+	omapdss_device_disconnect(dst, dst->next);
 }
 
 static int tpd_enable(struct omap_dss_device *dssdev)
@@ -328,7 +316,7 @@ static int __exit tpd_remove(struct platform_device *pdev)
 
 	WARN_ON(omapdss_device_is_connected(dssdev));
 	if (omapdss_device_is_connected(dssdev))
-		tpd_disconnect(dssdev, dssdev->dst);
+		tpd_disconnect(NULL, dssdev);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 049959309063..91f99c95c4c4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -34,33 +34,15 @@ struct panel_drv_data {
 
 #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
 
-static int panel_dpi_connect(struct omap_dss_device *dssdev)
+static int panel_dpi_connect(struct omap_dss_device *src,
+			     struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
+static void panel_dpi_disconnect(struct omap_dss_device *src,
+				 struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int panel_dpi_enable(struct omap_dss_device *dssdev)
@@ -233,7 +215,6 @@ static int __exit panel_dpi_remove(struct platform_device *pdev)
 	omapdss_device_unregister(dssdev);
 
 	panel_dpi_disable(dssdev);
-	panel_dpi_disconnect(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 db2e841f1b07..be4f03aa7af3 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -756,57 +756,35 @@ static int dsicm_panel_reset(struct panel_drv_data *ddata)
 	return dsicm_power_on(ddata);
 }
 
-static int dsicm_connect(struct omap_dss_device *dssdev)
+static int dsicm_connect(struct omap_dss_device *src,
+			 struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
+	struct panel_drv_data *ddata = to_panel_data(dst);
 	struct device *dev = &ddata->pdev->dev;
-	struct omap_dss_device *src;
 	int r;
 
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		dev_err(dev, "Failed to connect to video source\n");
-		goto err_connect;
-	}
-
 	r = src->ops->dsi.request_vc(src, &ddata->channel);
 	if (r) {
 		dev_err(dev, "failed to get virtual channel\n");
-		goto err_req_vc;
+		return r;
 	}
 
 	r = src->ops->dsi.set_vc_id(src, ddata->channel, TCH);
 	if (r) {
 		dev_err(dev, "failed to set VC_ID\n");
-		goto err_vc_id;
+		src->ops->dsi.release_vc(src, ddata->channel);
+		return r;
 	}
 
 	return 0;
-
-err_vc_id:
-	src->ops->dsi.release_vc(src, ddata->channel);
-err_req_vc:
-	omapdss_device_disconnect(src, dssdev);
-err_connect:
-	omapdss_device_put(src);
-	return r;
 }
 
-static void dsicm_disconnect(struct omap_dss_device *dssdev)
+static void dsicm_disconnect(struct omap_dss_device *src,
+			     struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src = dssdev->src;
+	struct panel_drv_data *ddata = to_panel_data(dst);
 
 	src->ops->dsi.release_vc(src, ddata->channel);
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int dsicm_enable(struct omap_dss_device *dssdev)
@@ -1404,7 +1382,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
 	omapdss_device_unregister(dssdev);
 
 	dsicm_disable(dssdev);
-	dsicm_disconnect(dssdev);
+	dsicm_disconnect(NULL, 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 76f9064106d4..66763a12fc3d 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -115,36 +115,19 @@ static void init_lb035q02_panel(struct spi_device *spi)
 	lb035q02_write_reg(spi, 0x3b, 0x0806);
 }
 
-static int lb035q02_connect(struct omap_dss_device *dssdev)
+static int lb035q02_connect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	struct panel_drv_data *ddata = to_panel_data(dssdev);
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
+	struct panel_drv_data *ddata = to_panel_data(dst);
 
 	init_lb035q02_panel(ddata->spi);
 
 	return 0;
 }
 
-static void lb035q02_disconnect(struct omap_dss_device *dssdev)
+static void lb035q02_disconnect(struct omap_dss_device *src,
+				struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int lb035q02_enable(struct omap_dss_device *dssdev)
@@ -285,7 +268,6 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
 	omapdss_device_unregister(dssdev);
 
 	lb035q02_disable(dssdev);
-	lb035q02_disconnect(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 0c64a734f28f..b4dba55b678b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -111,33 +111,15 @@ static int init_nec_8048_wvga_lcd(struct spi_device *spi)
 	return 0;
 }
 
-static int nec_8048_connect(struct omap_dss_device *dssdev)
+static int nec_8048_connect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void nec_8048_disconnect(struct omap_dss_device *dssdev)
+static void nec_8048_disconnect(struct omap_dss_device *src,
+				struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int nec_8048_enable(struct omap_dss_device *dssdev)
@@ -310,7 +292,6 @@ static int nec_8048_remove(struct spi_device *spi)
 	omapdss_device_unregister(dssdev);
 
 	nec_8048_disable(dssdev);
-	nec_8048_disconnect(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 87baa8982f55..7fbdf3ec0113 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -57,33 +57,15 @@ static const struct videomode sharp_ls_vm = {
 
 #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
 
-static int sharp_ls_connect(struct omap_dss_device *dssdev)
+static int sharp_ls_connect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
+static void sharp_ls_disconnect(struct omap_dss_device *src,
+				struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int sharp_ls_enable(struct omap_dss_device *dssdev)
@@ -284,7 +266,6 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
 	omapdss_device_unregister(dssdev);
 
 	sharp_ls_disable(dssdev);
-	sharp_ls_disconnect(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 ac05cd252b1c..c501a06207af 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -506,33 +506,15 @@ static const struct attribute_group bldev_attr_group = {
 	.attrs = bldev_attrs,
 };
 
-static int acx565akm_connect(struct omap_dss_device *dssdev)
+static int acx565akm_connect(struct omap_dss_device *src,
+			     struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void acx565akm_disconnect(struct omap_dss_device *dssdev)
+static void acx565akm_disconnect(struct omap_dss_device *src,
+				 struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
@@ -822,7 +804,6 @@ static int acx565akm_remove(struct spi_device *spi)
 	omapdss_device_unregister(dssdev);
 
 	acx565akm_disable(dssdev);
-	acx565akm_disconnect(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 acfa69b74ffa..758e77b77920 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -165,33 +165,15 @@ enum jbt_register {
 
 #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
 
-static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
+static int td028ttec1_panel_connect(struct omap_dss_device *src,
+				    struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
+static void td028ttec1_panel_disconnect(struct omap_dss_device *src,
+					struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
@@ -411,7 +393,6 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
 	omapdss_device_unregister(dssdev);
 
 	td028ttec1_panel_disable(dssdev);
-	td028ttec1_panel_disconnect(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 383ffd0d21f2..cb6f19f8a0da 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -336,33 +336,15 @@ static void tpo_td043_power_off(struct panel_drv_data *ddata)
 	ddata->powered_on = 0;
 }
 
-static int tpo_td043_connect(struct omap_dss_device *dssdev)
+static int tpo_td043_connect(struct omap_dss_device *src,
+			     struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src;
-	int r;
-
-	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
-	if (IS_ERR_OR_NULL(src)) {
-		dev_err(dssdev->dev, "failed to find video source\n");
-		return src ? PTR_ERR(src) : -EINVAL;
-	}
-
-	r = omapdss_device_connect(dssdev->dss, src, dssdev);
-	if (r) {
-		omapdss_device_put(src);
-		return r;
-	}
-
 	return 0;
 }
 
-static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
+static void tpo_td043_disconnect(struct omap_dss_device *src,
+				 struct omap_dss_device *dst)
 {
-	struct omap_dss_device *src = dssdev->src;
-
-	omapdss_device_disconnect(src, dssdev);
-
-	omapdss_device_put(src);
 }
 
 static int tpo_td043_enable(struct omap_dss_device *dssdev)
@@ -553,7 +535,6 @@ static int tpo_td043_remove(struct spi_device *spi)
 	omapdss_device_unregister(dssdev);
 
 	tpo_td043_disable(dssdev);
-	tpo_td043_disconnect(dssdev);
 
 	sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 519682f18d36..7f41c541397b 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -191,24 +191,24 @@ int omapdss_device_connect(struct dss_device *dss,
 {
 	int ret;
 
-	dev_dbg(src->dev, "connect\n");
+	dev_dbg(dst->dev, "connect\n");
 
-	if (omapdss_device_is_connected(src))
+	if (omapdss_device_is_connected(dst))
 		return -EBUSY;
 
-	src->dss = dss;
+	dst->dss = dss;
 
-	if (src->driver)
-		ret = src->driver->connect(src);
+	if (dst->driver)
+		ret = dst->driver->connect(src, dst);
 	else
-		ret = src->ops->connect(src, dst);
+		ret = dst->ops->connect(src, dst);
 
 	if (ret < 0) {
-		src->dss = NULL;
+		dst->dss = NULL;
 		return ret;
 	}
 
-	if (dst) {
+	if (src) {
 		dst->src = src;
 		src->dst = dst;
 	}
@@ -222,12 +222,12 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 {
 	dev_dbg(src->dev, "disconnect\n");
 
-	if (!omapdss_device_is_connected(src)) {
-		WARN_ON(!src->driver);
+	if (!omapdss_device_is_connected(dst)) {
+		WARN_ON(!dst->driver);
 		return;
 	}
 
-	if (dst) {
+	if (src) {
 		if (WARN_ON(dst != src->dst))
 			return;
 
@@ -235,12 +235,12 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 		src->dst = NULL;
 	}
 
-	if (src->driver)
-		src->driver->disconnect(src);
+	if (dst->driver)
+		dst->driver->disconnect(src, dst);
 	else
-		src->ops->disconnect(src, dst);
+		dst->ops->disconnect(src, dst);
 
-	src->dss = NULL;
+	dst->dss = NULL;
 }
 EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 4557357e4130..dc50a220382c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -608,35 +608,45 @@ static enum omap_channel dpi_get_channel(struct dpi_data *dpi)
 	}
 }
 
-static int dpi_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int dpi_connect(struct omap_dss_device *src,
+		       struct omap_dss_device *dst)
 {
-	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
+	struct dpi_data *dpi = dpi_get_data_from_dssdev(dst);
 	int r;
 
 	dpi_init_pll(dpi);
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst->next);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void dpi_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void dpi_disconnect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops dpi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 6718c7f04423..a5516d6e8017 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4881,32 +4881,42 @@ static int dsi_get_clocks(struct dsi_data *dsi)
 	return 0;
 }
 
-static int dsi_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int dsi_connect(struct omap_dss_device *src,
+		       struct omap_dss_device *dst)
 {
 	int r;
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst->next);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
-				dssdev->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+				dst->name);
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void dsi_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void dsi_disconnect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops dsi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 6edb85898a7d..9f883669e71b 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -428,32 +428,42 @@ void hdmi4_core_disable(struct hdmi_core_data *core)
 	mutex_unlock(&hdmi->lock);
 }
 
-static int hdmi_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int hdmi_connect(struct omap_dss_device *src,
+			struct omap_dss_device *dst)
 {
 	int r;
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst->next);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void hdmi_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void hdmi_disconnect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index db20a578091b..beb70b1fab94 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -433,32 +433,42 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi)
 	mutex_unlock(&hdmi->lock);
 }
 
-static int hdmi_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int hdmi_connect(struct omap_dss_device *src,
+			struct omap_dss_device *dst)
 {
 	int r;
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst->next);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void hdmi_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void hdmi_disconnect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 9efbcaeb05a7..d88e302fbc8d 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -432,8 +432,10 @@ struct omap_dss_driver {
 	int (*probe)(struct omap_dss_device *);
 	void (*remove)(struct omap_dss_device *);
 
-	int (*connect)(struct omap_dss_device *dssdev);
-	void (*disconnect)(struct omap_dss_device *dssdev);
+	int (*connect)(struct omap_dss_device *src,
+		       struct omap_dss_device *dst);
+	void (*disconnect)(struct omap_dss_device *src,
+			   struct omap_dss_device *dst);
 
 	int (*enable)(struct omap_dss_device *display);
 	void (*disable)(struct omap_dss_device *display);
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 1766c95236da..f6e26a0a7efd 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -249,32 +249,42 @@ static int sdi_check_timings(struct omap_dss_device *dssdev,
 	return 0;
 }
 
-static int sdi_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int sdi_connect(struct omap_dss_device *src,
+		       struct omap_dss_device *dst)
 {
 	int r;
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void sdi_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void sdi_disconnect(struct omap_dss_device *src,
+			   struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops sdi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 9c1fe6aef074..dfdd066a0ee5 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -691,32 +691,42 @@ static int venc_get_clocks(struct venc_device *venc)
 	return 0;
 }
 
-static int venc_connect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static int venc_connect(struct omap_dss_device *src,
+			struct omap_dss_device *dst)
 {
 	int r;
 
-	r = dss_mgr_connect(dssdev);
+	r = dss_mgr_connect(dst);
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dssdev, dst);
+	r = omapdss_output_set_device(dst, dst->next);
 	if (r) {
 		DSSERR("failed to connect output to new device: %s\n",
 				dst->name);
-		dss_mgr_disconnect(dssdev);
-		return r;
+		goto err_mgr_disconnect;
 	}
 
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
+	if (r)
+		goto err_output_unset;
+
 	return 0;
+
+err_output_unset:
+	omapdss_output_unset_device(dst);
+err_mgr_disconnect:
+	dss_mgr_disconnect(dst);
+	return r;
 }
 
-static void venc_disconnect(struct omap_dss_device *dssdev,
-		struct omap_dss_device *dst)
+static void venc_disconnect(struct omap_dss_device *src,
+			    struct omap_dss_device *dst)
 {
-	omapdss_output_unset_device(dssdev);
+	omapdss_device_disconnect(dst, dst->next);
+	omapdss_output_unset_device(dst);
 
-	dss_mgr_disconnect(dssdev);
+	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops venc_ops = {
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 298d594a0c65..dc2f059f8f4d 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -157,11 +157,14 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)
 	unsigned int i;
 
 	for (i = 0; i < priv->num_pipes; i++) {
-		struct omap_dss_device *display = priv->pipes[i].display;
+		struct omap_drm_pipeline *pipe = &priv->pipes[i];
+
+		omapdss_device_disconnect(NULL, pipe->output);
 
-		omapdss_device_disconnect(display, NULL);
-		priv->pipes[i].display = NULL;
-		omapdss_device_put(display);
+		omapdss_device_put(pipe->output);
+		omapdss_device_put(pipe->display);
+		pipe->output = NULL;
+		pipe->display = NULL;
 	}
 
 	priv->num_pipes = 0;
@@ -182,26 +185,30 @@ static int omap_compare_pipes(const void *a, const void *b)
 static int omap_connect_pipelines(struct drm_device *ddev)
 {
 	struct omap_drm_private *priv = ddev->dev_private;
-	struct omap_dss_device *display = NULL;
+	struct omap_dss_device *output = NULL;
 	int r;
 
 	if (!omapdss_stack_is_ready())
 		return -EPROBE_DEFER;
 
-	for_each_dss_display(display) {
-		r = omapdss_device_connect(priv->dss, display, NULL);
+	for_each_dss_output(output) {
+		r = omapdss_device_connect(priv->dss, NULL, output);
 		if (r == -EPROBE_DEFER) {
-			omapdss_device_put(display);
+			omapdss_device_put(output);
 			goto cleanup;
 		} else if (r) {
-			dev_warn(display->dev, "could not connect display: %s\n",
-				display->name);
+			dev_warn(output->dev, "could not connect output %s\n",
+				 output->name);
 		} else {
-			omapdss_device_get(display);
-			priv->pipes[priv->num_pipes++].display = display;
+			struct omap_drm_pipeline *pipe;
+
+			pipe = &priv->pipes[priv->num_pipes++];
+			pipe->output = omapdss_device_get(output);
+			pipe->display = omapdss_display_get(output);
+
 			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
-				/* To balance the 'for_each_dss_display' loop */
-				omapdss_device_put(display);
+				/* To balance the 'for_each_dss_output' loop */
+				omapdss_device_put(output);
 				break;
 			}
 		}
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index bc9b954fcc31..a38d07d4d6ea 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -49,6 +49,7 @@ struct omap_drm_pipeline {
 	struct drm_crtc *crtc;
 	struct drm_encoder *encoder;
 	struct drm_connector *connector;
+	struct omap_dss_device *output;
 	struct omap_dss_device *display;
 };
 
-- 
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] 127+ messages in thread

* [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (50 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 11:59   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time Laurent Pinchart
                   ` (8 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

When a DSS output is (dis)connected the omapdss_output_(un)set_device()
function performs a sanity check to ensure that the output isn't already
(dis)connected. The check is unnecessary as those situations should
never happen, but can nonetheless be useful to catch driver bugs. To
prepare for removal of the omapdss_output_(un)set_device() functions
move the connection check to the omapdss_device_connect() function. The
omapdss_device_disconnect() already contains a corresponding check.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 7f41c541397b..3afb3d574a7b 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -209,6 +209,7 @@ int omapdss_device_connect(struct dss_device *dss,
 	}
 
 	if (src) {
+		WARN_ON(src->dst);
 		dst->src = src;
 		src->dst = dst;
 	}
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 2f7a019d059e..96d74218cf91 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -29,61 +29,36 @@ static DEFINE_MUTEX(output_lock);
 int omapdss_output_set_device(struct omap_dss_device *out,
 		struct omap_dss_device *dssdev)
 {
-	int r;
+	int r = 0;
 
 	mutex_lock(&output_lock);
 
-	if (out->dst) {
-		dev_err(out->dev,
-			"output already has device %s connected to it\n",
-			out->dst->name);
-		r = -EINVAL;
-		goto err;
-	}
-
 	if (out->output_type != dssdev->type) {
 		dev_err(out->dev, "output type and display type don't match\n");
 		r = -EINVAL;
-		goto err;
 	}
 
 	mutex_unlock(&output_lock);
 
-	return 0;
-err:
-	mutex_unlock(&output_lock);
-
 	return r;
 }
 EXPORT_SYMBOL(omapdss_output_set_device);
 
 int omapdss_output_unset_device(struct omap_dss_device *out)
 {
-	int r;
+	int r = 0;
 
 	mutex_lock(&output_lock);
 
-	if (!out->dst) {
-		dev_err(out->dev,
-			"output doesn't have a device connected to it\n");
-		r = -EINVAL;
-		goto err;
-	}
-
 	if (out->dst->state != OMAP_DSS_DISPLAY_DISABLED) {
 		dev_err(out->dev,
 			"device %s is not disabled, cannot unset device\n",
 			out->dst->name);
 		r = -EINVAL;
-		goto err;
 	}
 
 	mutex_unlock(&output_lock);
 
-	return 0;
-err:
-	mutex_unlock(&output_lock);
-
 	return r;
 }
 EXPORT_SYMBOL(omapdss_output_unset_device);
-- 
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] 127+ messages in thread

* [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (51 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 11:59   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers Laurent Pinchart
                   ` (7 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The display type is validated when the display is connected to the DSS
output. We already have all the information we need for validation when
initializing the outputs. Move validation to output initialization to
simplify pipeline connection handling.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index dc50a220382c..831de09770a3 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -620,24 +620,13 @@ static int dpi_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst->next);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void dpi_disconnect(struct omap_dss_device *src,
@@ -664,6 +653,7 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 {
 	struct omap_dss_device *out = &dpi->output;
 	u32 port_num = 0;
+	int r;
 
 	of_property_read_u32(port, "reg", &port_num);
 	dpi->id = port_num <= 2 ? port_num : 0;
@@ -696,6 +686,13 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index a5516d6e8017..53a32e20c3bd 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4890,24 +4890,13 @@ static int dsi_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst->next);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void dsi_disconnect(struct omap_dss_device *src,
@@ -5147,6 +5136,7 @@ static const struct component_ops dsi_component_ops = {
 static int dsi_init_output(struct dsi_data *dsi)
 {
 	struct omap_dss_device *out = &dsi->output;
+	int r;
 
 	out->dev = dsi->dev;
 	out->id = dsi->module_id == 0 ?
@@ -5166,6 +5156,13 @@ static int dsi_init_output(struct dsi_data *dsi)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 9f883669e71b..22f8b74f5bf5 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -437,24 +437,13 @@ static int hdmi_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst->next);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void hdmi_disconnect(struct omap_dss_device *src,
@@ -717,6 +706,7 @@ static const struct component_ops hdmi4_component_ops = {
 static int hdmi4_init_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
+	int r;
 
 	out->dev = &hdmi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_HDMI;
@@ -734,6 +724,13 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index beb70b1fab94..d8592d02a58d 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -442,24 +442,13 @@ static int hdmi_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst->next);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void hdmi_disconnect(struct omap_dss_device *src,
@@ -709,6 +698,7 @@ static const struct component_ops hdmi5_component_ops = {
 static int hdmi5_init_output(struct omap_hdmi *hdmi)
 {
 	struct omap_dss_device *out = &hdmi->output;
+	int r;
 
 	out->dev = &hdmi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_HDMI;
@@ -726,6 +716,13 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index d88e302fbc8d..7add73a5479a 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -517,8 +517,7 @@ int omap_dss_get_num_overlays(void);
 
 #define for_each_dss_output(d) \
 	while ((d = omapdss_device_get_next(d, false, true)) != NULL)
-int omapdss_output_set_device(struct omap_dss_device *out,
-		struct omap_dss_device *dssdev);
+int omapdss_output_validate(struct omap_dss_device *out);
 int omapdss_output_unset_device(struct omap_dss_device *out);
 
 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 96d74218cf91..be544dd48bf4 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -26,23 +26,16 @@
 
 static DEFINE_MUTEX(output_lock);
 
-int omapdss_output_set_device(struct omap_dss_device *out,
-		struct omap_dss_device *dssdev)
+int omapdss_output_validate(struct omap_dss_device *out)
 {
-	int r = 0;
-
-	mutex_lock(&output_lock);
-
-	if (out->output_type != dssdev->type) {
+	if (out->next && out->output_type != out->next->type) {
 		dev_err(out->dev, "output type and display type don't match\n");
-		r = -EINVAL;
+		return -EINVAL;
 	}
 
-	mutex_unlock(&output_lock);
-
-	return r;
+	return 0;
 }
-EXPORT_SYMBOL(omapdss_output_set_device);
+EXPORT_SYMBOL(omapdss_output_validate);
 
 int omapdss_output_unset_device(struct omap_dss_device *out)
 {
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index f6e26a0a7efd..5c197688c0f9 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -258,24 +258,13 @@ static int sdi_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void sdi_disconnect(struct omap_dss_device *src,
@@ -301,6 +290,7 @@ static const struct omap_dss_device_ops sdi_ops = {
 static int sdi_init_output(struct sdi_device *sdi)
 {
 	struct omap_dss_device *out = &sdi->output;
+	int r;
 
 	out->dev = &sdi->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_SDI;
@@ -319,6 +309,13 @@ static int sdi_init_output(struct sdi_device *sdi)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index dfdd066a0ee5..216b31cc5ec1 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -700,24 +700,13 @@ static int venc_connect(struct omap_dss_device *src,
 	if (r)
 		return r;
 
-	r = omapdss_output_set_device(dst, dst->next);
+	r = omapdss_device_connect(dst->dss, dst, dst->next);
 	if (r) {
-		DSSERR("failed to connect output to new device: %s\n",
-				dst->name);
-		goto err_mgr_disconnect;
+		dss_mgr_disconnect(dst);
+		return r;
 	}
 
-	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r)
-		goto err_output_unset;
-
 	return 0;
-
-err_output_unset:
-	omapdss_output_unset_device(dst);
-err_mgr_disconnect:
-	dss_mgr_disconnect(dst);
-	return r;
 }
 
 static void venc_disconnect(struct omap_dss_device *src,
@@ -787,6 +776,7 @@ static const struct component_ops venc_component_ops = {
 static int venc_init_output(struct venc_device *venc)
 {
 	struct omap_dss_device *out = &venc->output;
+	int r;
 
 	out->dev = &venc->pdev->dev;
 	out->id = OMAP_DSS_OUTPUT_VENC;
@@ -804,6 +794,13 @@ static int venc_init_output(struct venc_device *venc)
 		return PTR_ERR(out->next);
 	}
 
+	r = omapdss_output_validate(out);
+	if (r) {
+		omapdss_device_put(out->next);
+		out->next = NULL;
+		return r;
+	}
+
 	omapdss_device_register(out);
 
 	return 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] 127+ messages in thread

* [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (52 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 11:59   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init() Laurent Pinchart
                   ` (6 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

To simplify the pipeline disconnection handling merge the
omapdss_device_disconnect() and omapdss_output_unset_device() functions.
The device state check is now called for every device in the pipeline,
extending this sanity check coverage.

There is no need to return an error from omapdss_device_disconnect()
when the check fails, as omapdss_output_unset_device() used to do, given
that we can't prevent disconnection due to device unbinding (the return
value of omapdss_output_unset_device() is never checked in the current
code for that reason).

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    |  2 ++
 drivers/gpu/drm/omapdrm/dss/dpi.c     |  1 -
 drivers/gpu/drm/omapdrm/dss/dsi.c     |  1 -
 drivers/gpu/drm/omapdrm/dss/hdmi4.c   |  1 -
 drivers/gpu/drm/omapdrm/dss/hdmi5.c   |  1 -
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
 drivers/gpu/drm/omapdrm/dss/output.c  | 21 ---------------------
 drivers/gpu/drm/omapdrm/dss/sdi.c     |  1 -
 drivers/gpu/drm/omapdrm/dss/venc.c    |  1 -
 9 files changed, 2 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index 3afb3d574a7b..fbb600d49ad2 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -236,6 +236,8 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 		src->dst = NULL;
 	}
 
+	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
+
 	if (dst->driver)
 		dst->driver->disconnect(src, dst);
 	else
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 831de09770a3..4cf397c9300e 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -633,7 +633,6 @@ static void dpi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 53a32e20c3bd..bc470baa4f5c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4903,7 +4903,6 @@ static void dsi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 22f8b74f5bf5..6616530d5fe6 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -450,7 +450,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index d8592d02a58d..f7e15edc05fc 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -455,7 +455,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 7add73a5479a..672761b5b017 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -518,7 +518,6 @@ int omap_dss_get_num_overlays(void);
 #define for_each_dss_output(d) \
 	while ((d = omapdss_device_get_next(d, false, true)) != NULL)
 int omapdss_output_validate(struct omap_dss_device *out);
-int omapdss_output_unset_device(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 be544dd48bf4..2da480be918d 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -24,8 +24,6 @@
 #include "dss.h"
 #include "omapdss.h"
 
-static DEFINE_MUTEX(output_lock);
-
 int omapdss_output_validate(struct omap_dss_device *out)
 {
 	if (out->next && out->output_type != out->next->type) {
@@ -37,25 +35,6 @@ int omapdss_output_validate(struct omap_dss_device *out)
 }
 EXPORT_SYMBOL(omapdss_output_validate);
 
-int omapdss_output_unset_device(struct omap_dss_device *out)
-{
-	int r = 0;
-
-	mutex_lock(&output_lock);
-
-	if (out->dst->state != OMAP_DSS_DISPLAY_DISABLED) {
-		dev_err(out->dev,
-			"device %s is not disabled, cannot unset device\n",
-			out->dst->name);
-		r = -EINVAL;
-	}
-
-	mutex_unlock(&output_lock);
-
-	return r;
-}
-EXPORT_SYMBOL(omapdss_output_unset_device);
-
 int dss_install_mgr_ops(struct dss_device *dss,
 			const struct dss_mgr_ops *mgr_ops,
 			struct omap_drm_private *priv)
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 5c197688c0f9..09c10ba4946b 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -271,7 +271,6 @@ static void sdi_disconnect(struct omap_dss_device *src,
 			   struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 216b31cc5ec1..997c4aebd560 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -713,7 +713,6 @@ static void venc_disconnect(struct omap_dss_device *src,
 			    struct omap_dss_device *dst)
 {
 	omapdss_device_disconnect(dst, dst->next);
-	omapdss_output_unset_device(dst);
 
 	dss_mgr_disconnect(dst);
 }
-- 
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] 127+ messages in thread

* [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init()
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (53 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:00   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private Laurent Pinchart
                   ` (5 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

Replace the dss display device pointer by a pipe pointer that will allow
the omap_crtc_init() function to access both the display and the DSS
output. As a result we can remove the omapdss_device_get_dispc_channel()
function that is now unneeded.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index fbb600d49ad2..cce09a48d769 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -247,15 +247,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
 }
 EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
 
-enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev)
-{
-	while (dssdev->src)
-		dssdev = dssdev->src;
-
-	return dssdev->dispc_channel;
-}
-EXPORT_SYMBOL(omapdss_device_get_dispc_channel);
-
 /* -----------------------------------------------------------------------------
  * Components Handling
  */
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 672761b5b017..d7084ca36d0e 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -509,7 +509,6 @@ 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);
-enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev);
 
 int omap_dss_get_num_overlay_managers(void);
 
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index f5bf553a862f..f5bdb8de98f4 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -693,7 +693,8 @@ void omap_crtc_pre_uninit(struct omap_drm_private *priv)
 
 /* initialize crtc */
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
-		struct drm_plane *plane, struct omap_dss_device *dssdev)
+				struct omap_drm_pipeline *pipe,
+				struct drm_plane *plane)
 {
 	struct omap_drm_private *priv = dev->dev_private;
 	struct drm_crtc *crtc = NULL;
@@ -701,7 +702,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 	enum omap_channel channel;
 	int ret;
 
-	channel = omapdss_device_get_dispc_channel(dssdev);
+	channel = pipe->output->dispc_channel;
 
 	DBG("%s", channel_names[channel]);
 
@@ -724,7 +725,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 					&omap_crtc_funcs, NULL);
 	if (ret < 0) {
 		dev_err(dev->dev, "%s(): could not init crtc for: %s\n",
-			__func__, dssdev->name);
+			__func__, pipe->display->name);
 		kfree(omap_crtc);
 		return ERR_PTR(ret);
 	}
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
index 1c6530703855..d9de437ba9dd 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.h
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
@@ -27,6 +27,7 @@ enum omap_channel;
 struct drm_crtc;
 struct drm_device;
 struct drm_plane;
+struct omap_drm_pipeline;
 struct omap_dss_device;
 struct videomode;
 
@@ -35,7 +36,8 @@ enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
 void omap_crtc_pre_init(struct omap_drm_private *priv);
 void omap_crtc_pre_uninit(struct omap_drm_private *priv);
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
-		struct drm_plane *plane, struct omap_dss_device *dssdev);
+				struct omap_drm_pipeline *pipe,
+				struct drm_plane *plane);
 int omap_crtc_wait_pending(struct drm_crtc *crtc);
 void omap_crtc_error_irq(struct drm_crtc *crtc, u32 irqstatus);
 void omap_crtc_vblank_irq(struct drm_crtc *crtc);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index dc2f059f8f4d..6bc826515684 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -308,7 +308,7 @@ static int omap_modeset_init(struct drm_device *dev)
 		if (!connector)
 			return -ENOMEM;
 
-		crtc = omap_crtc_init(dev, priv->planes[i], display);
+		crtc = omap_crtc_init(dev, pipe, priv->planes[i]);
 		if (IS_ERR(crtc))
 			return PTR_ERR(crtc);
 
-- 
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] 127+ messages in thread

* [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (54 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init() Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:00   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array Laurent Pinchart
                   ` (4 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_crtcs global array is used to store pointers to omap_crtc
indexed by DISPC channel number, in order to look them up in the dss_mgr
operations. Store the information in the omap_drm_private structure in
the form of an array of omap_drm_pipeline pointers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_crtc.c | 22 +++++++++-------------
 drivers/gpu/drm/omapdrm/omap_drv.c  | 19 +++++++++++++++++++
 drivers/gpu/drm/omapdrm/omap_drv.h  |  1 +
 3 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index f5bdb8de98f4..9742d9f49a7c 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -109,7 +109,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
  */
 
 /* ovl-mgr-id -> crtc */
-static struct omap_crtc *omap_crtcs[8];
 static struct omap_dss_device *omap_crtc_output[8];
 
 /* we can probably ignore these until we support command-mode panels: */
@@ -215,7 +214,8 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
 static int omap_crtc_dss_enable(struct omap_drm_private *priv,
 				enum omap_channel channel)
 {
-	struct omap_crtc *omap_crtc = omap_crtcs[channel];
+	struct drm_crtc *crtc = priv->channels[channel]->crtc;
+	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
 
 	priv->dispc_ops->mgr_set_timings(priv->dispc, omap_crtc->channel,
 					 &omap_crtc->vm);
@@ -227,7 +227,8 @@ static int omap_crtc_dss_enable(struct omap_drm_private *priv,
 static void omap_crtc_dss_disable(struct omap_drm_private *priv,
 				  enum omap_channel channel)
 {
-	struct omap_crtc *omap_crtc = omap_crtcs[channel];
+	struct drm_crtc *crtc = priv->channels[channel]->crtc;
+	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
 
 	omap_crtc_set_enabled(&omap_crtc->base, false);
 }
@@ -236,7 +237,9 @@ static void omap_crtc_dss_set_timings(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		const struct videomode *vm)
 {
-	struct omap_crtc *omap_crtc = omap_crtcs[channel];
+	struct drm_crtc *crtc = priv->channels[channel]->crtc;
+	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+
 	DBG("%s", omap_crtc->name);
 	omap_crtc->vm = *vm;
 }
@@ -245,7 +248,8 @@ static void omap_crtc_dss_set_lcd_config(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		const struct dss_lcd_mgr_config *config)
 {
-	struct omap_crtc *omap_crtc = omap_crtcs[channel];
+	struct drm_crtc *crtc = priv->channels[channel]->crtc;
+	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
 
 	DBG("%s", omap_crtc->name);
 	priv->dispc_ops->mgr_set_lcd_config(priv->dispc, omap_crtc->channel,
@@ -681,8 +685,6 @@ static const char *channel_names[] = {
 
 void omap_crtc_pre_init(struct omap_drm_private *priv)
 {
-	memset(omap_crtcs, 0, sizeof(omap_crtcs));
-
 	dss_install_mgr_ops(priv->dss, &mgr_ops, priv);
 }
 
@@ -706,10 +708,6 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 
 	DBG("%s", channel_names[channel]);
 
-	/* Multiple displays on same channel is not allowed */
-	if (WARN_ON(omap_crtcs[channel] != NULL))
-		return ERR_PTR(-EINVAL);
-
 	omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL);
 	if (!omap_crtc)
 		return ERR_PTR(-ENOMEM);
@@ -748,7 +746,5 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 
 	omap_plane_install_properties(crtc->primary, &crtc->base);
 
-	omap_crtcs[channel] = omap_crtc;
-
 	return crtc;
 }
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 6bc826515684..c3c657d90029 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -167,6 +167,8 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)
 		pipe->display = NULL;
 	}
 
+	memset(&priv->channels, 0, sizeof(priv->channels));
+
 	priv->num_pipes = 0;
 }
 
@@ -186,6 +188,7 @@ 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())
@@ -218,6 +221,22 @@ static int omap_connect_pipelines(struct drm_device *ddev)
 	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:
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index a38d07d4d6ea..bd7f2c227a25 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -64,6 +64,7 @@ struct omap_drm_private {
 
 	unsigned int num_pipes;
 	struct omap_drm_pipeline pipes[8];
+	struct omap_drm_pipeline *channels[8];
 
 	unsigned int num_planes;
 	struct drm_plane *planes[8];
-- 
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] 127+ messages in thread

* [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (55 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:00   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler Laurent Pinchart
                   ` (3 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_crtc_output global array is used to look up the DSS output
device by channel. We can replace that by accessing the output device
from the pipeline if we store the pipeline pointer in the omap_crtc
structure.

The global array is also used to protect against double connection of an
output. This can't happen with the connection handling mechanism going
from DSS outputs to displays. We can thus drop that check, allowing
removal of the global array.

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

diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 9742d9f49a7c..5a56c8e02179 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -41,6 +41,7 @@ struct omap_crtc {
 	struct drm_crtc base;
 
 	const char *name;
+	struct omap_drm_pipeline *pipe;
 	enum omap_channel channel;
 
 	struct videomode vm;
@@ -108,9 +109,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
  * job of sequencing the setup of the video pipe in the proper order
  */
 
-/* ovl-mgr-id -> crtc */
-static struct omap_dss_device *omap_crtc_output[8];
-
 /* we can probably ignore these until we support command-mode panels: */
 static int omap_crtc_dss_connect(struct omap_drm_private *priv,
 		enum omap_channel channel,
@@ -119,13 +117,9 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
 	const struct dispc_ops *dispc_ops = priv->dispc_ops;
 	struct dispc_device *dispc = priv->dispc;
 
-	if (omap_crtc_output[channel])
-		return -EINVAL;
-
 	if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
 		return -EINVAL;
 
-	omap_crtc_output[channel] = dst;
 	dst->dispc_channel_connected = true;
 
 	return 0;
@@ -135,7 +129,6 @@ static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		struct omap_dss_device *dst)
 {
-	omap_crtc_output[channel] = NULL;
 	dst->dispc_channel_connected = false;
 }
 
@@ -158,7 +151,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
 	if (WARN_ON(omap_crtc->enabled == enable))
 		return;
 
-	if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) {
+	if (omap_crtc->pipe->output->output_type == OMAP_DISPLAY_TYPE_HDMI) {
 		priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
 		omap_crtc->enabled = enable;
 		return;
@@ -716,6 +709,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 
 	init_waitqueue_head(&omap_crtc->pending_wait);
 
+	omap_crtc->pipe = pipe;
 	omap_crtc->channel = channel;
 	omap_crtc->name = channel_names[channel];
 
-- 
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] 127+ messages in thread

* [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (56 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:00   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers Laurent Pinchart
                   ` (2 subsequent siblings)
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The CRTC connect handler checks whether the DSS output supports the
DISPC channel assigned to it. As the channel is assigned to the output
by the output driver a failure there could only result from a driver
bug. All the output drivers have been verified and they are always
assigned a DISPC channel that is supported on the SoC they run on. The
check can thus be removed.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
index 7f3ac6b13b56..bc207f2fb200 100644
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
@@ -2904,13 +2904,6 @@ static int dispc_ovl_enable(struct dispc_device *dispc,
 	return 0;
 }
 
-static enum omap_dss_output_id
-dispc_mgr_get_supported_outputs(struct dispc_device *dispc,
-				enum omap_channel channel)
-{
-	return dss_get_supported_outputs(dispc->dss, channel);
-}
-
 static void dispc_lcd_enable_signal_polarity(struct dispc_device *dispc,
 					     bool act_high)
 {
@@ -4742,7 +4735,6 @@ static const struct dispc_ops dispc_ops = {
 	.mgr_set_lcd_config = dispc_mgr_set_lcd_config,
 	.mgr_set_timings = dispc_mgr_set_timings,
 	.mgr_setup = dispc_mgr_setup,
-	.mgr_get_supported_outputs = dispc_mgr_get_supported_outputs,
 	.mgr_gamma_size = dispc_mgr_gamma_size,
 	.mgr_set_gamma = dispc_mgr_set_gamma,
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 5b7613ff2f2e..d2760107ccf2 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -678,12 +678,6 @@ unsigned long dss_get_max_fck_rate(struct dss_device *dss)
 	return dss->feat->fck_freq_max;
 }
 
-enum omap_dss_output_id dss_get_supported_outputs(struct dss_device *dss,
-						  enum omap_channel channel)
-{
-	return dss->feat->outputs[channel];
-}
-
 static int dss_setup_default_clock(struct dss_device *dss)
 {
 	unsigned long max_dss_fck, prate;
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index 54f96241b9ea..81dd0c910ea1 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -314,8 +314,6 @@ void dss_runtime_put(struct dss_device *dss);
 
 unsigned long dss_get_dispc_clk_rate(struct dss_device *dss);
 unsigned long dss_get_max_fck_rate(struct dss_device *dss);
-enum omap_dss_output_id dss_get_supported_outputs(struct dss_device *dss,
-						  enum omap_channel channel);
 int dss_dpi_select_source(struct dss_device *dss, int port,
 			  enum omap_channel channel);
 void dss_select_hdmi_venc_clk_source(struct dss_device *dss,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index d7084ca36d0e..bb340a08c44a 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -636,8 +636,6 @@ struct dispc_ops {
 				const struct videomode *vm);
 	void (*mgr_setup)(struct dispc_device *dispc, enum omap_channel channel,
 			  const struct omap_overlay_manager_info *info);
-	enum omap_dss_output_id (*mgr_get_supported_outputs)(
-			struct dispc_device *dispc, enum omap_channel channel);
 	u32 (*mgr_gamma_size)(struct dispc_device *dispc,
 			      enum omap_channel channel);
 	void (*mgr_set_gamma)(struct dispc_device *dispc,
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 5a56c8e02179..90917d040ddb 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -114,12 +114,6 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		struct omap_dss_device *dst)
 {
-	const struct dispc_ops *dispc_ops = priv->dispc_ops;
-	struct dispc_device *dispc = priv->dispc;
-
-	if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
-		return -EINVAL;
-
 	dst->dispc_channel_connected = true;
 
 	return 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] 127+ messages in thread

* [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (57 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:00   ` Sebastian Reichel
  2018-05-26 17:25 ` [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations Laurent Pinchart
  2018-06-13  6:56 ` [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Tomi Valkeinen
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The omap_dss_device.dispc_channel_connect field is used by DSS outputs
to fail the .enable() operation if they're not connected. Set the field
directly from the (dis)connect handlers of the DSS outputs instead of
going through the CRTC dss_mgr operations.

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

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 4cf397c9300e..72d873c2abcc 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -626,12 +626,15 @@ static int dpi_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index bc470baa4f5c..bd5e463558be 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4896,12 +4896,15 @@ static int dsi_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 6616530d5fe6..1e025a8b99c9 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -443,12 +443,15 @@ static int hdmi_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index f7e15edc05fc..d5860438ddd9 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -448,12 +448,15 @@ static int hdmi_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 09c10ba4946b..ed2595a60984 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -264,12 +264,15 @@ static int sdi_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 997c4aebd560..4f20183c7861 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -706,12 +706,15 @@ static int venc_connect(struct omap_dss_device *src,
 		return r;
 	}
 
+	dst->dispc_channel_connected = true;
 	return 0;
 }
 
 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);
 
 	dss_mgr_disconnect(dst);
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 90917d040ddb..7f837697e76c 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -114,8 +114,6 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = true;
-
 	return 0;
 }
 
@@ -123,7 +121,6 @@ static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
 		enum omap_channel channel,
 		struct omap_dss_device *dst)
 {
-	dst->dispc_channel_connected = false;
 }
 
 static void omap_crtc_dss_start_update(struct omap_drm_private *priv,
-- 
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] 127+ messages in thread

* [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (58 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers Laurent Pinchart
@ 2018-05-26 17:25 ` Laurent Pinchart
  2018-06-11 12:01   ` Sebastian Reichel
  2018-06-13  6:56 ` [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Tomi Valkeinen
  60 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-05-26 17:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Tomi Valkeinen

The dss_mgr .connect() and .disconnect() are implemented as no-op in
omapdrm. The operations are unneeded, remove them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dpi.c     | 10 +---------
 drivers/gpu/drm/omapdrm/dss/dsi.c     | 10 +---------
 drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 10 +---------
 drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 10 +---------
 drivers/gpu/drm/omapdrm/dss/omapdss.h |  9 ---------
 drivers/gpu/drm/omapdrm/dss/output.c  | 14 --------------
 drivers/gpu/drm/omapdrm/dss/sdi.c     | 10 +---------
 drivers/gpu/drm/omapdrm/dss/venc.c    | 10 +---------
 drivers/gpu/drm/omapdrm/omap_crtc.c   | 15 ---------------
 9 files changed, 6 insertions(+), 92 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 72d873c2abcc..764ffc4bad32 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -616,15 +616,9 @@ static int dpi_connect(struct omap_dss_device *src,
 
 	dpi_init_pll(dpi);
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -636,8 +630,6 @@ static void dpi_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops dpi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index bd5e463558be..6fe9e2b78144 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4886,15 +4886,9 @@ static int dsi_connect(struct omap_dss_device *src,
 {
 	int r;
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -4906,8 +4900,6 @@ static void dsi_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops dsi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 1e025a8b99c9..c4fcdc9ed62d 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -433,15 +433,9 @@ static int hdmi_connect(struct omap_dss_device *src,
 {
 	int r;
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -453,8 +447,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index d5860438ddd9..889c31745492 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -438,15 +438,9 @@ static int hdmi_connect(struct omap_dss_device *src,
 {
 	int r;
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -458,8 +452,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static int hdmi_read_edid(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index bb340a08c44a..882a2f8f7ac5 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -550,13 +550,6 @@ enum dss_writeback_channel {
 };
 
 struct dss_mgr_ops {
-	int (*connect)(struct omap_drm_private *priv,
-		       enum omap_channel channel,
-		       struct omap_dss_device *dst);
-	void (*disconnect)(struct omap_drm_private *priv,
-			   enum omap_channel channel,
-			   struct omap_dss_device *dst);
-
 	void (*start_update)(struct omap_drm_private *priv,
 			     enum omap_channel channel);
 	int (*enable)(struct omap_drm_private *priv,
@@ -582,8 +575,6 @@ int dss_install_mgr_ops(struct dss_device *dss,
 			struct omap_drm_private *priv);
 void dss_uninstall_mgr_ops(struct dss_device *dss);
 
-int dss_mgr_connect(struct omap_dss_device *dssdev);
-void dss_mgr_disconnect(struct omap_dss_device *dssdev);
 void dss_mgr_set_timings(struct omap_dss_device *dssdev,
 		const struct videomode *vm);
 void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
index 2da480be918d..18505bc70f7e 100644
--- a/drivers/gpu/drm/omapdrm/dss/output.c
+++ b/drivers/gpu/drm/omapdrm/dss/output.c
@@ -56,20 +56,6 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
 }
 EXPORT_SYMBOL(dss_uninstall_mgr_ops);
 
-int dss_mgr_connect(struct omap_dss_device *dssdev)
-{
-	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
-					     dssdev->dispc_channel, dssdev);
-}
-EXPORT_SYMBOL(dss_mgr_connect);
-
-void dss_mgr_disconnect(struct omap_dss_device *dssdev)
-{
-	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
-					 dssdev->dispc_channel, dssdev);
-}
-EXPORT_SYMBOL(dss_mgr_disconnect);
-
 void dss_mgr_set_timings(struct omap_dss_device *dssdev,
 			 const struct videomode *vm)
 {
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index ed2595a60984..e83daa06711e 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -254,15 +254,9 @@ static int sdi_connect(struct omap_dss_device *src,
 {
 	int r;
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -274,8 +268,6 @@ static void sdi_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops sdi_ops = {
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 4f20183c7861..72fb52e5ff59 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -696,15 +696,9 @@ static int venc_connect(struct omap_dss_device *src,
 {
 	int r;
 
-	r = dss_mgr_connect(dst);
-	if (r)
-		return r;
-
 	r = omapdss_device_connect(dst->dss, dst, dst->next);
-	if (r) {
-		dss_mgr_disconnect(dst);
+	if (r)
 		return r;
-	}
 
 	dst->dispc_channel_connected = true;
 	return 0;
@@ -716,8 +710,6 @@ static void venc_disconnect(struct omap_dss_device *src,
 	dst->dispc_channel_connected = false;
 
 	omapdss_device_disconnect(dst, dst->next);
-
-	dss_mgr_disconnect(dst);
 }
 
 static const struct omap_dss_device_ops venc_ops = {
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 7f837697e76c..80498dcde6d7 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -110,19 +110,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
  */
 
 /* we can probably ignore these until we support command-mode panels: */
-static int omap_crtc_dss_connect(struct omap_drm_private *priv,
-		enum omap_channel channel,
-		struct omap_dss_device *dst)
-{
-	return 0;
-}
-
-static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
-		enum omap_channel channel,
-		struct omap_dss_device *dst)
-{
-}
-
 static void omap_crtc_dss_start_update(struct omap_drm_private *priv,
 				       enum omap_channel channel)
 {
@@ -254,8 +241,6 @@ static void omap_crtc_dss_unregister_framedone(
 }
 
 static const struct dss_mgr_ops mgr_ops = {
-	.connect = omap_crtc_dss_connect,
-	.disconnect = omap_crtc_dss_disconnect,
 	.start_update = omap_crtc_dss_start_update,
 	.enable = omap_crtc_dss_enable,
 	.disable = omap_crtc_dss_disable,
-- 
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] 127+ messages in thread

* Re: [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step
  2018-05-26 17:24 ` [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step Laurent Pinchart
@ 2018-06-10 14:16   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 14:16 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:19PM +0300, Laurent Pinchart wrote:
> From: Peter Ujfalusi <peter.ujfalusi@ti.com>
> 
> If we allocate the drm_device earlier we can just return the error code
> without the need to use goto.
> Do the unref of the drm_device as a last step when cleaning up. This will
> make the drm_device available longer for us and makes sure that we only
> free up the memory when all other cleanups have been already done.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c | 29 +++++++++++++----------------
>  1 file changed, 13 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 5005ecc284d2..244ed3707589 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -525,6 +525,14 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  
>  	DBG("%s", dev_name(dev));
>  
> +	/* Allocate and initialize the DRM device. */
> +	ddev = drm_dev_alloc(&omap_drm_driver, dev);
> +	if (IS_ERR(ddev))
> +		return PTR_ERR(ddev);
> +
> +	priv->ddev = ddev;
> +	ddev->dev_private = priv;
> +
>  	priv->dev = dev;
>  	priv->dss = omapdss_get_dss();
>  	priv->dispc = dispc_get_dispc(priv->dss);
> @@ -543,16 +551,6 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	mutex_init(&priv->list_lock);
>  	INIT_LIST_HEAD(&priv->obj_list);
>  
> -	/* Allocate and initialize the DRM device. */
> -	ddev = drm_dev_alloc(&omap_drm_driver, priv->dev);
> -	if (IS_ERR(ddev)) {
> -		ret = PTR_ERR(ddev);
> -		goto err_destroy_wq;
> -	}
> -
> -	priv->ddev = ddev;
> -	ddev->dev_private = priv;
> -
>  	/* Get memory bandwidth limits */
>  	if (priv->dispc_ops->get_memory_bandwidth_limit)
>  		priv->max_bandwidth =
> @@ -563,7 +561,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	ret = omap_modeset_init(ddev);
>  	if (ret) {
>  		dev_err(priv->dev, "omap_modeset_init failed: ret=%d\n", ret);
> -		goto err_free_drm_dev;
> +		goto err_gem_deinit;
>  	}
>  
>  	/* Initialize vblank handling, start with all CRTCs disabled. */
> @@ -599,14 +597,13 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  err_cleanup_modeset:
>  	drm_mode_config_cleanup(ddev);
>  	omap_drm_irq_uninstall(ddev);
> -err_free_drm_dev:
> +err_gem_deinit:
>  	omap_gem_deinit(ddev);
> -	drm_dev_unref(ddev);
> -err_destroy_wq:
>  	destroy_workqueue(priv->wq);
>  	omap_disconnect_dssdevs();
>  err_crtc_uninit:
>  	omap_crtc_pre_uninit();
> +	drm_dev_unref(ddev);
>  	return ret;
>  }
>  
> @@ -630,12 +627,12 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
>  	omap_drm_irq_uninstall(ddev);
>  	omap_gem_deinit(ddev);
>  
> -	drm_dev_unref(ddev);
> -
>  	destroy_workqueue(priv->wq);
>  
>  	omap_disconnect_dssdevs();
>  	omap_crtc_pre_uninit();
> +
> +	drm_dev_unref(ddev);
>  }
>  
>  static int pdev_probe(struct platform_device *pdev)
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private
  2018-05-26 17:24 ` [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private Laurent Pinchart
@ 2018-06-10 15:19   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 15:19 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:20PM +0300, Laurent Pinchart wrote:
> From: Peter Ujfalusi <peter.ujfalusi@ti.com>
> 
> Instead of reaching back to DSS to iterate through the dss_devices every
> time, use an internal array where we store the available and usable
> dss_devices.
> 
> At the same time remove the omapdss_device_is_connected() check from
> omap_modeset_init() as it became irrelevant: We are not adding dssdevs
> if their connect failed.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

> Changes since v0:
> 
> - Make loop counter unsigned
> ---
>  drivers/gpu/drm/omapdrm/omap_drv.c | 94 ++++++++++++++++++++++++--------------
>  drivers/gpu/drm/omapdrm/omap_drv.h |  3 ++
>  2 files changed, 62 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 244ed3707589..9277aa8c49c0 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -149,18 +149,27 @@ static int get_connector_type(struct omap_dss_device *dssdev)
>  	}
>  }
>  
> -static void omap_disconnect_dssdevs(void)
> +static void omap_disconnect_dssdevs(struct drm_device *ddev)
>  {
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_drm_private *priv = ddev->dev_private;
> +	unsigned int i;
> +
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -	for_each_dss_dev(dssdev)
>  		dssdev->driver->disconnect(dssdev);
> +		priv->dssdevs[i] = NULL;
> +		omap_dss_put_device(dssdev);
> +	}
> +
> +	priv->num_dssdevs = 0;
>  }
>  
> -static int omap_connect_dssdevs(void)
> +static int omap_connect_dssdevs(struct drm_device *ddev)
>  {
> -	int r;
> +	struct omap_drm_private *priv = ddev->dev_private;
>  	struct omap_dss_device *dssdev = NULL;
> +	int r;
>  
>  	if (!omapdss_stack_is_ready())
>  		return -EPROBE_DEFER;
> @@ -173,6 +182,14 @@ static int omap_connect_dssdevs(void)
>  		} else if (r) {
>  			dev_warn(dssdev->dev, "could not connect display: %s\n",
>  				dssdev->name);
> +		} else {
> +			omap_dss_get_device(dssdev);
> +			priv->dssdevs[priv->num_dssdevs++] = dssdev;
> +			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
> +				/* To balance the 'for_each_dss_dev' loop */
> +				omap_dss_put_device(dssdev);
> +				break;
> +			}
>  		}
>  	}
>  
> @@ -183,7 +200,7 @@ static int omap_connect_dssdevs(void)
>  	 * if we are deferring probe, we disconnect the devices we previously
>  	 * connected
>  	 */
> -	omap_disconnect_dssdevs();
> +	omap_disconnect_dssdevs(ddev);
>  
>  	return r;
>  }
> @@ -208,6 +225,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
>  	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
>  	int num_crtcs, crtc_idx, plane_idx;
> +	unsigned int i;
>  	int ret;
>  	u32 plane_crtc_mask;
>  
> @@ -225,11 +243,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  	 * configuration does not match the expectations or exceeds
>  	 * the available resources, the configuration is rejected.
>  	 */
> -	num_crtcs = 0;
> -	for_each_dss_dev(dssdev)
> -		if (omapdss_device_is_connected(dssdev))
> -			num_crtcs++;
> -
> +	num_crtcs = priv->num_dssdevs;
>  	if (num_crtcs > num_mgrs || num_crtcs > num_ovls ||
>  	    num_crtcs > ARRAY_SIZE(priv->crtcs) ||
>  	    num_crtcs > ARRAY_SIZE(priv->planes) ||
> @@ -247,15 +261,13 @@ static int omap_modeset_init(struct drm_device *dev)
>  
>  	crtc_idx = 0;
>  	plane_idx = 0;
> -	for_each_dss_dev(dssdev) {
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  		struct drm_connector *connector;
>  		struct drm_encoder *encoder;
>  		struct drm_plane *plane;
>  		struct drm_crtc *crtc;
>  
> -		if (!omapdss_device_is_connected(dssdev))
> -			continue;
> -
>  		encoder = omap_encoder_init(dev, dssdev);
>  		if (!encoder)
>  			return -ENOMEM;
> @@ -335,11 +347,14 @@ static int omap_modeset_init(struct drm_device *dev)
>  /*
>   * Enable the HPD in external components if supported
>   */
> -static void omap_modeset_enable_external_hpd(void)
> +static void omap_modeset_enable_external_hpd(struct drm_device *ddev)
>  {
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_drm_private *priv = ddev->dev_private;
> +	int i;
> +
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -	for_each_dss_dev(dssdev) {
>  		if (dssdev->driver->enable_hpd)
>  			dssdev->driver->enable_hpd(dssdev);
>  	}
> @@ -348,11 +363,14 @@ static void omap_modeset_enable_external_hpd(void)
>  /*
>   * Disable the HPD in external components if supported
>   */
> -static void omap_modeset_disable_external_hpd(void)
> +static void omap_modeset_disable_external_hpd(struct drm_device *ddev)
>  {
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_drm_private *priv = ddev->dev_private;
> +	int i;
> +
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -	for_each_dss_dev(dssdev) {
>  		if (dssdev->driver->disable_hpd)
>  			dssdev->driver->disable_hpd(dssdev);
>  	}
> @@ -540,7 +558,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  
>  	omap_crtc_pre_init(priv);
>  
> -	ret = omap_connect_dssdevs();
> +	ret = omap_connect_dssdevs(ddev);
>  	if (ret)
>  		goto err_crtc_uninit;
>  
> @@ -577,7 +595,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	omap_fbdev_init(ddev);
>  
>  	drm_kms_helper_poll_init(ddev);
> -	omap_modeset_enable_external_hpd();
> +	omap_modeset_enable_external_hpd(ddev);
>  
>  	/*
>  	 * Register the DRM device with the core and the connectors with
> @@ -590,7 +608,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	return 0;
>  
>  err_cleanup_helpers:
> -	omap_modeset_disable_external_hpd();
> +	omap_modeset_disable_external_hpd(ddev);
>  	drm_kms_helper_poll_fini(ddev);
>  
>  	omap_fbdev_fini(ddev);
> @@ -600,7 +618,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  err_gem_deinit:
>  	omap_gem_deinit(ddev);
>  	destroy_workqueue(priv->wq);
> -	omap_disconnect_dssdevs();
> +	omap_disconnect_dssdevs(ddev);
>  err_crtc_uninit:
>  	omap_crtc_pre_uninit();
>  	drm_dev_unref(ddev);
> @@ -615,7 +633,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
>  
>  	drm_dev_unregister(ddev);
>  
> -	omap_modeset_disable_external_hpd();
> +	omap_modeset_disable_external_hpd(ddev);
>  	drm_kms_helper_poll_fini(ddev);
>  
>  	omap_fbdev_fini(ddev);
> @@ -629,7 +647,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
>  
>  	destroy_workqueue(priv->wq);
>  
> -	omap_disconnect_dssdevs();
> +	omap_disconnect_dssdevs(ddev);
>  	omap_crtc_pre_uninit();
>  
>  	drm_dev_unref(ddev);
> @@ -674,11 +692,14 @@ static int pdev_remove(struct platform_device *pdev)
>  }
>  
>  #ifdef CONFIG_PM_SLEEP
> -static int omap_drm_suspend_all_displays(void)
> +static int omap_drm_suspend_all_displays(struct drm_device *ddev)
>  {
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_drm_private *priv = ddev->dev_private;
> +	int i;
> +
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -	for_each_dss_dev(dssdev) {
>  		if (!dssdev->driver)
>  			continue;
>  
> @@ -693,11 +714,14 @@ static int omap_drm_suspend_all_displays(void)
>  	return 0;
>  }
>  
> -static int omap_drm_resume_all_displays(void)
> +static int omap_drm_resume_all_displays(struct drm_device *ddev)
>  {
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_drm_private *priv = ddev->dev_private;
> +	int i;
> +
> +	for (i = 0; i < priv->num_dssdevs; i++) {
> +		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -	for_each_dss_dev(dssdev) {
>  		if (!dssdev->driver)
>  			continue;
>  
> @@ -718,7 +742,7 @@ static int omap_drm_suspend(struct device *dev)
>  	drm_kms_helper_poll_disable(drm_dev);
>  
>  	drm_modeset_lock_all(drm_dev);
> -	omap_drm_suspend_all_displays();
> +	omap_drm_suspend_all_displays(drm_dev);
>  	drm_modeset_unlock_all(drm_dev);
>  
>  	return 0;
> @@ -730,7 +754,7 @@ static int omap_drm_resume(struct device *dev)
>  	struct drm_device *drm_dev = priv->ddev;
>  
>  	drm_modeset_lock_all(drm_dev);
> -	omap_drm_resume_all_displays();
> +	omap_drm_resume_all_displays(drm_dev);
>  	drm_modeset_unlock_all(drm_dev);
>  
>  	drm_kms_helper_poll_enable(drm_dev);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index f27c8e216adf..006c868c528d 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -54,6 +54,9 @@ struct omap_drm_private {
>  	struct dispc_device *dispc;
>  	const struct dispc_ops *dispc_ops;
>  
> +	unsigned int num_dssdevs;
> +	struct omap_dss_device *dssdevs[8];
> +
>  	unsigned int num_crtcs;
>  	struct drm_crtc *crtcs[8];
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c
  2018-05-26 17:24 ` [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c Laurent Pinchart
@ 2018-06-10 15:23   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 15:23 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:21PM +0300, Laurent Pinchart wrote:
> From: Peter Ujfalusi <peter.ujfalusi@ti.com>
> 
> Sort the dssdev array based on DT aliases.
> 
> With this change we can remove the panel ordering from dss/display.c and
> have all sorting related to dssdevs in one place.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

> Changes since v0:
> 
> - Make alias_id unsigned
> ---
>  drivers/gpu/drm/omapdrm/dss/display.c |  2 ++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 +
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 18 ++++++++++++++++++
>  3 files changed, 21 insertions(+)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 424143128cd4..3ef99f344bd3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -52,6 +52,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
>  	if (id < 0)
>  		id = disp_num_counter++;
>  
> +	dssdev->alias_id = id;
> +
>  	snprintf(dssdev->alias, sizeof(dssdev->alias), "display%d", id);
>  
>  	/* Use 'label' property for name, if it exists */
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 14d74adb13fb..eae105b0b961 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -467,6 +467,7 @@ struct omap_dss_device {
>  
>  	/* alias in the form of "display%d" */
>  	char alias[16];
> +	unsigned int alias_id;
>  
>  	enum omap_display_type type;
>  	enum omap_display_type output_type;
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 9277aa8c49c0..e2d7f8bfb4c1 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -15,6 +15,8 @@
>   * this program.  If not, see <http://www.gnu.org/licenses/>.
>   */
>  
> +#include <linux/of.h>
> +#include <linux/sort.h>
>  #include <linux/sys_soc.h>
>  
>  #include <drm/drm_atomic.h>
> @@ -165,6 +167,18 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
>  	priv->num_dssdevs = 0;
>  }
>  
> +static int omap_compare_dssdevs(const void *a, const void *b)
> +{
> +	const struct omap_dss_device *dssdev1 = *(struct omap_dss_device **)a;
> +	const struct omap_dss_device *dssdev2 = *(struct omap_dss_device **)b;
> +
> +	if (dssdev1->alias_id > dssdev2->alias_id)
> +		return 1;
> +	else if (dssdev1->alias_id < dssdev2->alias_id)
> +		return -1;
> +	return 0;
> +}
> +
>  static int omap_connect_dssdevs(struct drm_device *ddev)
>  {
>  	struct omap_drm_private *priv = ddev->dev_private;
> @@ -193,6 +207,10 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  		}
>  	}
>  
> +	/* Sort the list by DT aliases */
> +	sort(priv->dssdevs, priv->num_dssdevs, sizeof(priv->dssdevs[0]),
> +	     omap_compare_dssdevs, NULL);
> +
>  	return 0;
>  
>  cleanup:
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c
  2018-05-26 17:24 ` [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c Laurent Pinchart
@ 2018-06-10 15:23   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 15:23 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:22PM +0300, Laurent Pinchart wrote:
> From: Peter Ujfalusi <peter.ujfalusi@ti.com>
> 
> As ordering of the dss_devices based on DT aliases is now implemented in
> omap_drm.c, there is no need to do the ordering in dss/display.c
> anymore.
> 
> At the same time remove the alias member of the omap_dss_device struct
> since it is no longer needed. The only place it was used is in the
> omapdss_register_display() function.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

> Changes since v0:
> 
> - Use %u to format display ID
> ---
>  drivers/gpu/drm/omapdrm/dss/display.c | 15 +++------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  2 --
>  2 files changed, 3 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 3ef99f344bd3..25c3be86d7f4 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -41,7 +41,6 @@ static int disp_num_counter;
>  int omapdss_register_display(struct omap_dss_device *dssdev)
>  {
>  	struct omap_dss_driver *drv = dssdev->driver;
> -	struct list_head *cur;
>  	int id;
>  
>  	/*
> @@ -54,26 +53,18 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
>  
>  	dssdev->alias_id = id;
>  
> -	snprintf(dssdev->alias, sizeof(dssdev->alias), "display%d", id);
> -
>  	/* Use 'label' property for name, if it exists */
>  	of_property_read_string(dssdev->dev->of_node, "label", &dssdev->name);
>  
>  	if (dssdev->name == NULL)
> -		dssdev->name = dssdev->alias;
> +		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
> +					      "display%u", id);
>  
>  	if (drv && drv->get_timings == NULL)
>  		drv->get_timings = omapdss_default_get_timings;
>  
>  	mutex_lock(&panel_list_mutex);
> -	list_for_each(cur, &panel_list) {
> -		struct omap_dss_device *ldev = list_entry(cur,
> -							 struct omap_dss_device,
> -							 panel_list);
> -		if (strcmp(ldev->alias, dssdev->alias) > 0)
> -			break;
> -	}
> -	list_add_tail(&dssdev->panel_list, cur);
> +	list_add_tail(&dssdev->panel_list, &panel_list);
>  	mutex_unlock(&panel_list_mutex);
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index eae105b0b961..8d530057a4b9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -465,8 +465,6 @@ struct omap_dss_device {
>  
>  	struct list_head panel_list;
>  
> -	/* alias in the form of "display%d" */
> -	char alias[16];
>  	unsigned int alias_id;
>  
>  	enum omap_display_type type;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time
  2018-05-26 17:24 ` [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time Laurent Pinchart
@ 2018-06-10 15:33   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 15:33 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:23PM +0300, Laurent Pinchart wrote:
> The omapdss_gather_components() function walks the OF graph to create a
> list of all components part of the display device. There's no need to
> delay this operation until DSS bind time as we have all the information
> we need at probe time.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dss.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index 0b908e9de792..d27d7f85bcd1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -1323,7 +1323,6 @@ static int dss_bind(struct device *dev)
>  
>  	pm_set_vt_switch(0);
>  
> -	omapdss_gather_components(dev);
>  	omapdss_set_dss(dss);
>  
>  	return 0;
> @@ -1474,6 +1473,8 @@ static int dss_probe(struct platform_device *pdev)
>  						   dss);
>  
>  	/* Add all the child devices as components. */
> +	omapdss_gather_components(&pdev->dev);
> +
>  	device_for_each_child(&pdev->dev, &match, dss_add_child_component);
>  
>  	r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe
  2018-05-26 17:24 ` [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe Laurent Pinchart
@ 2018-06-10 15:40   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 15:40 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:24PM +0300, Laurent Pinchart wrote:
> From: Jyri Sarha <jsarha@ti.com>
> 
> Register the omapdrm device when we know that dss device probe going
> to succeed. This avoids DSS6 and DSS2 omapdrm device registration from
> colliding with each other.
> 
> Signed-off-by: Jyri Sarha <jsarha@ti.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

> Changes since v0:
> 
> - Store the OMAP DRM platform device pointer in struct dss_device
> - Register the OMAP DRM platform device at the very end of dss_bind()
> ---
>  drivers/gpu/drm/omapdrm/dss/core.c | 26 ++------------------------
>  drivers/gpu/drm/omapdrm/dss/dss.c  | 13 +++++++++++++
>  drivers/gpu/drm/omapdrm/dss/dss.h  |  2 ++
>  3 files changed, 17 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapdrm/dss/core.c
> index acef7ece5783..6c9f667f9982 100644
> --- a/drivers/gpu/drm/omapdrm/dss/core.c
> +++ b/drivers/gpu/drm/omapdrm/dss/core.c
> @@ -45,36 +45,14 @@ static struct platform_driver * const omap_dss_drivers[] = {
>  #endif
>  };
>  
> -static struct platform_device *omap_drm_device;
> -
>  static int __init omap_dss_init(void)
>  {
> -	int r;
> -
> -	r = platform_register_drivers(omap_dss_drivers,
> -				      ARRAY_SIZE(omap_dss_drivers));
> -	if (r)
> -		goto err_reg;
> -
> -	omap_drm_device = platform_device_register_simple("omapdrm", 0, NULL, 0);
> -	if (IS_ERR(omap_drm_device)) {
> -		r = PTR_ERR(omap_drm_device);
> -		goto err_reg;
> -	}
> -
> -	return 0;
> -
> -err_reg:
> -	platform_unregister_drivers(omap_dss_drivers,
> -				    ARRAY_SIZE(omap_dss_drivers));
> -
> -	return r;
> +	return platform_register_drivers(omap_dss_drivers,
> +					 ARRAY_SIZE(omap_dss_drivers));
>  }
>  
>  static void __exit omap_dss_exit(void)
>  {
> -	platform_device_unregister(omap_drm_device);
> -
>  	platform_unregister_drivers(omap_dss_drivers,
>  				    ARRAY_SIZE(omap_dss_drivers));
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index d27d7f85bcd1..abd45b08f3a1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -1315,6 +1315,7 @@ static const struct soc_device_attribute dss_soc_devices[] = {
>  static int dss_bind(struct device *dev)
>  {
>  	struct dss_device *dss = dev_get_drvdata(dev);
> +	struct platform_device *drm_pdev;
>  	int r;
>  
>  	r = component_bind_all(dev, NULL);
> @@ -1325,11 +1326,23 @@ static int dss_bind(struct device *dev)
>  
>  	omapdss_set_dss(dss);
>  
> +	drm_pdev = platform_device_register_simple("omapdrm", 0, NULL, 0);
> +	if (IS_ERR(drm_pdev)) {
> +		component_unbind_all(dev, NULL);
> +		return PTR_ERR(drm_pdev);
> +	}
> +
> +	dss->drm_pdev = drm_pdev;
> +
>  	return 0;
>  }
>  
>  static void dss_unbind(struct device *dev)
>  {
> +	struct dss_device *dss = dev_get_drvdata(dev);
> +
> +	platform_device_unregister(dss->drm_pdev);
> +
>  	omapdss_set_dss(NULL);
>  
>  	component_unbind_all(dev, NULL);
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
> index 847c78ade024..4f1eb7f5b922 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -235,6 +235,8 @@ struct dss_device {
>  	struct regmap	*syscon_pll_ctrl;
>  	u32		syscon_pll_ctrl_offset;
>  
> +	struct platform_device *drm_pdev;
> +
>  	struct clk	*parent_clk;
>  	struct clk	*dss_clk;
>  	unsigned long	dss_clk_rate;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures
  2018-05-26 17:24 ` [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures Laurent Pinchart
@ 2018-06-10 16:04   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 16:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

On Sat, May 26, 2018 at 08:24:25PM +0300, Laurent Pinchart wrote:
> The dpi_init_port() and sdi_init_port() functions can return errors but
> their return value is ignored. This prevents both probe failures and
> probe deferral from working correctly. Propagate the errors up the call
> stack.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dss.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index abd45b08f3a1..59b238f03437 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -1183,7 +1183,8 @@ static int dss_init_ports(struct dss_device *dss)
>  	struct platform_device *pdev = dss->pdev;
>  	struct device_node *parent = pdev->dev.of_node;
>  	struct device_node *port;
> -	int i;
> +	unsigned int i;
> +	int r;
>  
>  	for (i = 0; i < dss->feat->num_ports; i++) {
>  		port = of_graph_get_port_by_id(parent, i);
> @@ -1192,11 +1193,17 @@ static int dss_init_ports(struct dss_device *dss)
>  
>  		switch (dss->feat->ports[i]) {
>  		case OMAP_DISPLAY_TYPE_DPI:
> -			dpi_init_port(dss, pdev, port, dss->feat->model);
> +			r = dpi_init_port(dss, pdev, port, dss->feat->model);
> +			if (r)
> +				return r;
>  			break;
> +
>  		case OMAP_DISPLAY_TYPE_SDI:
> -			sdi_init_port(dss, pdev, port);
> +			r = sdi_init_port(dss, pdev, port);
> +			if (r)
> +				return r;
>  			break;
> +
>  		default:
>  			break;
>  		}
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations
  2018-05-26 17:24 ` [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations Laurent Pinchart
@ 2018-06-10 16:10   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 16:10 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:26PM +0300, Laurent Pinchart wrote:
> The operations are never used, remove them. If the need to set wide
> screen signaling data arises later, it should be implemented by
> extending the DRM bridge API.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c | 19 ----------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              |  6 ----
>  drivers/gpu/drm/omapdrm/dss/venc.c                 | 41 ----------------------
>  3 files changed, 66 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 9eabd7201a12..5fdecc12b608 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -154,22 +154,6 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.atv->check_timings(in, vm);
>  }
>  
> -static u32 tvc_get_wss(struct omap_dss_device *dssdev)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> -
> -	return in->ops.atv->get_wss(in);
> -}
> -
> -static int tvc_set_wss(struct omap_dss_device *dssdev, u32 wss)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> -
> -	return in->ops.atv->set_wss(in, wss);
> -}
> -
>  static struct omap_dss_driver tvc_driver = {
>  	.connect		= tvc_connect,
>  	.disconnect		= tvc_disconnect,
> @@ -180,9 +164,6 @@ static struct omap_dss_driver tvc_driver = {
>  	.set_timings		= tvc_set_timings,
>  	.get_timings		= tvc_get_timings,
>  	.check_timings		= tvc_check_timings,
> -
> -	.get_wss		= tvc_get_wss,
> -	.set_wss		= tvc_set_wss,
>  };
>  
>  static int tvc_probe(struct platform_device *pdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 8d530057a4b9..67db0ea272f3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -362,9 +362,6 @@ struct omapdss_atv_ops {
>  			    struct videomode *vm);
>  	void (*get_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -
> -	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
> -	u32 (*get_wss)(struct omap_dss_device *dssdev);
>  };
>  
>  struct omapdss_hdmi_ops {
> @@ -554,9 +551,6 @@ struct omap_dss_driver {
>  	void (*get_size)(struct omap_dss_device *dssdev,
>  			 unsigned int *width, unsigned int *height);
>  
> -	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
> -	u32 (*get_wss)(struct omap_dss_device *dssdev);
> -
>  	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
>  	bool (*detect)(struct omap_dss_device *dssdev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 24d1ced210bd..3f4b8a181d74 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -626,44 +626,6 @@ static void venc_get_timings(struct omap_dss_device *dssdev,
>  	mutex_unlock(&venc->venc_lock);
>  }
>  
> -static u32 venc_get_wss(struct omap_dss_device *dssdev)
> -{
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
> -
> -	/* Invert due to VENC_L21_WC_CTL:INV=1 */
> -	return (venc->wss_data >> 8) ^ 0xfffff;
> -}
> -
> -static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
> -{
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
> -	const struct venc_config *config;
> -	int r;
> -
> -	DSSDBG("venc_set_wss\n");
> -
> -	mutex_lock(&venc->venc_lock);
> -
> -	config = venc_timings_to_config(&venc->vm);
> -
> -	/* Invert due to VENC_L21_WC_CTL:INV=1 */
> -	venc->wss_data = (wss ^ 0xfffff) << 8;
> -
> -	r = venc_runtime_get(venc);
> -	if (r)
> -		goto err;
> -
> -	venc_write_reg(venc, VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
> -		       venc->wss_data);
> -
> -	venc_runtime_put(venc);
> -
> -err:
> -	mutex_unlock(&venc->venc_lock);
> -
> -	return r;
> -}
> -
>  static int venc_init_regulator(struct venc_device *venc)
>  {
>  	struct regulator *vdda_dac;
> @@ -810,9 +772,6 @@ static const struct omapdss_atv_ops venc_ops = {
>  	.check_timings = venc_check_timings,
>  	.set_timings = venc_set_timings,
>  	.get_timings = venc_get_timings,
> -
> -	.set_wss = venc_set_wss,
> -	.get_wss = venc_get_wss,
>  };
>  
>  static void venc_init_output(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] 127+ messages in thread

* Re: [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation
  2018-05-26 17:24 ` [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation Laurent Pinchart
@ 2018-06-10 16:13   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 16:13 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:27PM +0300, Laurent Pinchart wrote:
> The get_timings operation from DSS encoders (not to be confused with the
> identically named operation in omap_dss_driver) is never called. Remove
> it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

good catch!

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    | 11 -----------
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  9 ---------
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  9 ---------
>  drivers/gpu/drm/omapdrm/dss/dpi.c                    | 13 -------------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                  |  9 ---------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                  |  9 ---------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                | 10 ----------
>  drivers/gpu/drm/omapdrm/dss/sdi.c                    |  9 ---------
>  drivers/gpu/drm/omapdrm/dss/venc.c                   | 13 -------------
>  9 files changed, 92 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index afee1b8b457a..27d63a14efe3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -148,16 +148,6 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
>  	in->ops.atv->set_timings(in, vm);
>  }
>  
> -static void opa362_get_timings(struct omap_dss_device *dssdev,
> -			       struct videomode *vm)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -
> -	dev_dbg(dssdev->dev, "get_timings\n");
> -
> -	*vm = ddata->vm;
> -}
> -
>  static int opa362_check_timings(struct omap_dss_device *dssdev,
>  				struct videomode *vm)
>  {
> @@ -178,7 +168,6 @@ static const struct omapdss_atv_ops opa362_atv_ops = {
>  
>  	.check_timings	= opa362_check_timings,
>  	.set_timings	= opa362_set_timings,
> -	.get_timings	= opa362_get_timings,
>  };
>  
>  static int opa362_probe(struct platform_device *pdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index ed7ae384c3ed..566c63a3ad59 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -142,14 +142,6 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
>  	in->ops.dpi->set_timings(in, vm);
>  }
>  
> -static void tfp410_get_timings(struct omap_dss_device *dssdev,
> -			       struct videomode *vm)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -
> -	*vm = ddata->vm;
> -}
> -
>  static int tfp410_check_timings(struct omap_dss_device *dssdev,
>  				struct videomode *vm)
>  {
> @@ -170,7 +162,6 @@ static const struct omapdss_dvi_ops tfp410_dvi_ops = {
>  
>  	.check_timings	= tfp410_check_timings,
>  	.set_timings	= tfp410_set_timings,
> -	.get_timings	= tfp410_get_timings,
>  };
>  
>  static int tfp410_probe_of(struct platform_device *pdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index d275bf152da5..4753e5455f82 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -136,14 +136,6 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
>  	in->ops.hdmi->set_timings(in, vm);
>  }
>  
> -static void tpd_get_timings(struct omap_dss_device *dssdev,
> -			    struct videomode *vm)
> -{
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -
> -	*vm = ddata->vm;
> -}
> -
>  static int tpd_check_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
> @@ -249,7 +241,6 @@ static const struct omapdss_hdmi_ops tpd_hdmi_ops = {
>  
>  	.check_timings		= tpd_check_timings,
>  	.set_timings		= tpd_set_timings,
> -	.get_timings		= tpd_get_timings,
>  
>  	.read_edid		= tpd_read_edid,
>  	.detect			= tpd_detect,
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 3d662e6805eb..af002c57a41d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -491,18 +491,6 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,
>  	mutex_unlock(&dpi->lock);
>  }
>  
> -static void dpi_get_timings(struct omap_dss_device *dssdev,
> -			    struct videomode *vm)
> -{
> -	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
> -
> -	mutex_lock(&dpi->lock);
> -
> -	*vm = dpi->vm;
> -
> -	mutex_unlock(&dpi->lock);
> -}
> -
>  static int dpi_check_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
> @@ -702,7 +690,6 @@ static const struct omapdss_dpi_ops dpi_ops = {
>  
>  	.check_timings = dpi_check_timings,
>  	.set_timings = dpi_set_timings,
> -	.get_timings = dpi_get_timings,
>  };
>  
>  static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 5879f45f6fc9..b3d7865347a3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -296,14 +296,6 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
>  	mutex_unlock(&hdmi->lock);
>  }
>  
> -static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
> -				     struct videomode *vm)
> -{
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
> -
> -	*vm = hdmi->cfg.vm;
> -}
> -
>  static int hdmi_dump_regs(struct seq_file *s, void *p)
>  {
>  	struct omap_hdmi *hdmi = s->private;
> @@ -557,7 +549,6 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
>  
>  	.check_timings		= hdmi_display_check_timing,
>  	.set_timings		= hdmi_display_set_timing,
> -	.get_timings		= hdmi_display_get_timings,
>  
>  	.read_edid		= hdmi_read_edid,
>  	.lost_hotplug		= hdmi_lost_hotplug,
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index ae1a001d1b83..8e9b3a24b2ab 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -293,14 +293,6 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
>  	mutex_unlock(&hdmi->lock);
>  }
>  
> -static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
> -				     struct videomode *vm)
> -{
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
> -
> -	*vm = hdmi->cfg.vm;
> -}
> -
>  static int hdmi_dump_regs(struct seq_file *s, void *p)
>  {
>  	struct omap_hdmi *hdmi = s->private;
> @@ -549,7 +541,6 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
>  
>  	.check_timings		= hdmi_display_check_timing,
>  	.set_timings		= hdmi_display_set_timing,
> -	.get_timings		= hdmi_display_get_timings,
>  
>  	.read_edid		= hdmi_read_edid,
>  	.set_infoframe		= hdmi_set_infoframe,
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 67db0ea272f3..426ac8297f5f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -309,8 +309,6 @@ struct omapdss_dpi_ops {
>  			     struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  };
>  
>  struct omapdss_sdi_ops {
> @@ -326,8 +324,6 @@ struct omapdss_sdi_ops {
>  			     struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  };
>  
>  struct omapdss_dvi_ops {
> @@ -343,8 +339,6 @@ struct omapdss_dvi_ops {
>  			     struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  };
>  
>  struct omapdss_atv_ops {
> @@ -360,8 +354,6 @@ struct omapdss_atv_ops {
>  			     struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  };
>  
>  struct omapdss_hdmi_ops {
> @@ -377,8 +369,6 @@ struct omapdss_hdmi_ops {
>  			     struct videomode *vm);
>  	void (*set_timings)(struct omap_dss_device *dssdev,
>  			    struct videomode *vm);
> -	void (*get_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
>  
>  	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
>  	void (*lost_hotplug)(struct omap_dss_device *dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 68a40ae26f5b..2a61409cfaf6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -234,14 +234,6 @@ static void sdi_set_timings(struct omap_dss_device *dssdev,
>  	sdi->vm = *vm;
>  }
>  
> -static void sdi_get_timings(struct omap_dss_device *dssdev,
> -			    struct videomode *vm)
> -{
> -	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
> -
> -	*vm = sdi->vm;
> -}
> -
>  static int sdi_check_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
> @@ -325,7 +317,6 @@ static const struct omapdss_sdi_ops sdi_ops = {
>  
>  	.check_timings = sdi_check_timings,
>  	.set_timings = sdi_set_timings,
> -	.get_timings = sdi_get_timings,
>  };
>  
>  static void sdi_init_output(struct sdi_device *sdi)
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 3f4b8a181d74..a9225bd2df6d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -614,18 +614,6 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
>  	}
>  }
>  
> -static void venc_get_timings(struct omap_dss_device *dssdev,
> -			     struct videomode *vm)
> -{
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
> -
> -	mutex_lock(&venc->venc_lock);
> -
> -	*vm = venc->vm;
> -
> -	mutex_unlock(&venc->venc_lock);
> -}
> -
>  static int venc_init_regulator(struct venc_device *venc)
>  {
>  	struct regulator *vdda_dac;
> @@ -771,7 +759,6 @@ static const struct omapdss_atv_ops venc_ops = {
>  
>  	.check_timings = venc_check_timings,
>  	.set_timings = venc_set_timings,
> -	.get_timings = venc_get_timings,
>  };
>  
>  static void venc_init_output(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] 127+ messages in thread

* Re: [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings()
  2018-05-26 17:24 ` [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings() Laurent Pinchart
@ 2018-06-10 16:18   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 16:18 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:28PM +0300, Laurent Pinchart wrote:
> All omap_dss_driver instances provide the get_timings operation. Remove
> the default function.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/display.c | 10 ----------
>  1 file changed, 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 25c3be86d7f4..e07e3319d6e0 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -28,19 +28,12 @@
>  
>  #include "omapdss.h"
>  
> -static void omapdss_default_get_timings(struct omap_dss_device *dssdev,
> -					struct videomode *vm)
> -{
> -	*vm = dssdev->panel.vm;
> -}
> -
>  static LIST_HEAD(panel_list);
>  static DEFINE_MUTEX(panel_list_mutex);
>  static int disp_num_counter;
>  
>  int omapdss_register_display(struct omap_dss_device *dssdev)
>  {
> -	struct omap_dss_driver *drv = dssdev->driver;
>  	int id;
>  
>  	/*
> @@ -60,9 +53,6 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
>  		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
>  					      "display%u", id);
>  
> -	if (drv && drv->get_timings == NULL)
> -		drv->get_timings = omapdss_default_get_timings;
> -
>  	mutex_lock(&panel_list_mutex);
>  	list_add_tail(&dssdev->panel_list, &panel_list);
>  	mutex_unlock(&panel_list_mutex);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure
  2018-05-26 17:24 ` [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure Laurent Pinchart
@ 2018-06-10 16:20   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 16:20 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:29PM +0300, Laurent Pinchart wrote:
> The structure contains function pointers that don't need to be modified.
> Make all its instances const to improve security.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      | 2 +-
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c            | 2 +-
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c                | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     | 2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     | 2 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                       | 2 +-
>  drivers/gpu/drm/omapdrm/omap_connector.c                    | 6 +++---
>  drivers/gpu/drm/omapdrm/omap_encoder.c                      | 6 +++---
>  14 files changed, 18 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 5fdecc12b608..a49bc4a8dcae 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -154,7 +154,7 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.atv->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver tvc_driver = {
> +static const struct omap_dss_driver tvc_driver = {
>  	.connect		= tvc_connect,
>  	.disconnect		= tvc_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 6d8cbd9e2110..c320f3c5ae6c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -297,7 +297,7 @@ static void dvic_disable_hpd(struct omap_dss_device *dssdev)
>  	mutex_unlock(&ddata->hpd_lock);
>  }
>  
> -static struct omap_dss_driver dvic_driver = {
> +static const struct omap_dss_driver dvic_driver = {
>  	.connect	= dvic_connect,
>  	.disconnect	= dvic_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index ca30ed9da7eb..6f12f9bb8054 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -269,7 +269,7 @@ static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
>  	return in->ops.hdmi->set_infoframe(in, avi);
>  }
>  
> -static struct omap_dss_driver hdmic_driver = {
> +static const struct omap_dss_driver hdmic_driver = {
>  	.connect		= hdmic_connect,
>  	.disconnect		= hdmic_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 6cbf570d6727..e874f0b72798 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -153,7 +153,7 @@ static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver panel_dpi_ops = {
> +static const struct omap_dss_driver panel_dpi_ops = {
>  	.connect	= panel_dpi_connect,
>  	.disconnect	= panel_dpi_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 428de90fced1..d7c57d84d7bd 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1210,7 +1210,7 @@ static void dsicm_get_size(struct omap_dss_device *dssdev,
>  	*height = ddata->height_mm;
>  }
>  
> -static struct omap_dss_driver dsicm_ops = {
> +static const struct omap_dss_driver dsicm_ops = {
>  	.connect	= dsicm_connect,
>  	.disconnect	= dsicm_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 754197099440..ad98d2ffcf1b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -228,7 +228,7 @@ static int lb035q02_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver lb035q02_ops = {
> +static const struct omap_dss_driver lb035q02_ops = {
>  	.connect	= lb035q02_connect,
>  	.disconnect	= lb035q02_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 9a3b27fa5cb5..0846fb594352 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -222,7 +222,7 @@ static int nec_8048_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver nec_8048_ops = {
> +static const struct omap_dss_driver nec_8048_ops = {
>  	.connect	= nec_8048_connect,
>  	.disconnect	= nec_8048_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index bb5b680cabfe..e7c4a830e214 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -192,7 +192,7 @@ static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver sharp_ls_ops = {
> +static const struct omap_dss_driver sharp_ls_ops = {
>  	.connect	= sharp_ls_connect,
>  	.disconnect	= sharp_ls_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 92fe125ce22e..c650f575b5c3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -693,7 +693,7 @@ static int acx565akm_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.sdi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver acx565akm_ops = {
> +static const struct omap_dss_driver acx565akm_ops = {
>  	.connect	= acx565akm_connect,
>  	.disconnect	= acx565akm_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index b5d8a00df811..0f2ecc2bcf4f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -362,7 +362,7 @@ static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver td028ttec1_ops = {
> +static const struct omap_dss_driver td028ttec1_ops = {
>  	.connect	= td028ttec1_panel_connect,
>  	.disconnect	= td028ttec1_panel_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index c08e22b43447..14a37b82ee13 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -456,7 +456,7 @@ static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
>  	return in->ops.dpi->check_timings(in, vm);
>  }
>  
> -static struct omap_dss_driver tpo_td043_ops = {
> +static const struct omap_dss_driver tpo_td043_ops = {
>  	.connect	= tpo_td043_connect,
>  	.disconnect	= tpo_td043_disconnect,
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 426ac8297f5f..e3d31b2fee4c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -466,7 +466,7 @@ struct omap_dss_device {
>  
>  	const char *name;
>  
> -	struct omap_dss_driver *driver;
> +	const struct omap_dss_driver *driver;
>  
>  	union {
>  		const struct omapdss_dpi_ops *dpi;
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 5cde26ac937b..eec3aa83dfcd 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -62,7 +62,7 @@ static enum drm_connector_status omap_connector_detect(
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev = omap_connector->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  	enum drm_connector_status ret;
>  
>  	if (dssdrv->detect) {
> @@ -107,7 +107,7 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev = omap_connector->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  	struct drm_device *dev = connector->dev;
>  	int n = 0;
>  
> @@ -170,7 +170,7 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
>  {
>  	struct omap_connector *omap_connector = to_omap_connector(connector);
>  	struct omap_dss_device *dssdev = omap_connector->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  	struct videomode vm = {0};
>  	struct drm_device *dev = connector->dev;
>  	struct drm_display_mode *new_mode;
> diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
> index fcdf4b0a8eec..ec0f451e3b36 100644
> --- a/drivers/gpu/drm/omapdrm/omap_encoder.c
> +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
> @@ -94,7 +94,7 @@ 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->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  
>  	dssdrv->disable(dssdev);
>  }
> @@ -106,7 +106,7 @@ static int omap_encoder_update(struct drm_encoder *encoder,
>  	struct drm_device *dev = encoder->dev;
>  	struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
>  	struct omap_dss_device *dssdev = omap_encoder->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  	int ret;
>  
>  	if (dssdrv->check_timings) {
> @@ -137,7 +137,7 @@ 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->dssdev;
> -	struct omap_dss_driver *dssdrv = dssdev->driver;
> +	const struct omap_dss_driver *dssdrv = dssdev->driver;
>  	int r;
>  
>  	omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc),
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure
  2018-05-26 17:24 ` [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure Laurent Pinchart
@ 2018-06-10 17:44   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 17:44 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:30PM +0300, Laurent Pinchart wrote:
> The omap_dss_device structure stores a videomode. All the connector and
> panel drivers that use omap_dss_device also store the videomode in their
> own panel_drv_data structures. There's no need to duplicate, remove the
> videomode field from omap_dss_device.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      | 2 --
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c            | 2 --
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           | 2 --
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c           | 1 -
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c           | 1 -
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c        | 1 -
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c                | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             | 8 +++-----
>  drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     | 2 --
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     | 2 --
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                       | 2 --
>  15 files changed, 3 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index a49bc4a8dcae..6b640ede6614 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -132,7 +132,6 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.atv->set_timings(in, vm);
>  }
> @@ -186,7 +185,6 @@ static int tvc_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = tvc_pal_vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index c320f3c5ae6c..84598ea12a9b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -139,7 +139,6 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dvi->set_timings(in, vm);
>  }
> @@ -403,7 +402,6 @@ static int dvic_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = dvic_default_vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 6f12f9bb8054..e031280468fb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -142,7 +142,6 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.hdmi->set_timings(in, vm);
>  }
> @@ -368,7 +367,6 @@ static int hdmic_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = hdmic_default_vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 27d63a14efe3..0e3f4a20e531 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -143,7 +143,6 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
>  	dev_dbg(dssdev->dev, "set_timings\n");
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.atv->set_timings(in, vm);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 566c63a3ad59..08e63e39d0b7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -137,7 +137,6 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
>  	tfp410_fix_timings(vm);
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 4753e5455f82..f35e2afa3e9c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -131,7 +131,6 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.hdmi->set_timings(in, vm);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index e874f0b72798..bbd630ead3c1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -131,7 +131,6 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -230,7 +229,6 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->driver = &panel_dpi_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index d7c57d84d7bd..555ab2ac5576 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -956,9 +956,8 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  	}
>  
>  	/* XXX no need to send this every frame, but dsi break if not done */
> -	r = dsicm_set_update_window(ddata, 0, 0,
> -			dssdev->panel.vm.hactive,
> -			dssdev->panel.vm.vactive);
> +	r = dsicm_set_update_window(ddata, 0, 0, ddata->vm.hactive,
> +				    ddata->vm.vactive);
>  	if (r)
>  		goto err;
>  
> @@ -1089,7 +1088,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  	}
>  
>  	size = min((u32)w * h * 3,
> -		   dssdev->panel.vm.hactive * dssdev->panel.vm.vactive * 3);
> +		   ddata->vm.hactive * ddata->vm.vactive * 3);
>  
>  	in->ops.dsi->bus_lock(in);
>  
> @@ -1331,7 +1330,6 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev = &ddata->dssdev;
>  	dssdev->dev = dev;
>  	dssdev->driver = &dsicm_ops;
> -	dssdev->panel.vm = ddata->vm;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
>  	dssdev->owner = THIS_MODULE;
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index ad98d2ffcf1b..0a6ab6470253 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -206,7 +206,6 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -281,7 +280,6 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->driver = &lb035q02_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 0846fb594352..9816e661c97d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -200,7 +200,6 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -305,7 +304,6 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->driver = &nec_8048_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index e7c4a830e214..e259240f96fa 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -170,7 +170,6 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -281,7 +280,6 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->driver = &sharp_ls_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index c650f575b5c3..b4917d12d913 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -671,7 +671,6 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.sdi->set_timings(in, vm);
>  }
> @@ -812,7 +811,6 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->driver = &acx565akm_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 0f2ecc2bcf4f..5faaf760e81b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -340,7 +340,6 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -406,7 +405,6 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->driver = &td028ttec1_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 14a37b82ee13..8e98232ee9d9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -434,7 +434,6 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  
>  	ddata->vm = *vm;
> -	dssdev->panel.vm = *vm;
>  
>  	in->ops.dpi->set_timings(in, vm);
>  }
> @@ -549,7 +548,6 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->driver = &tpo_td043_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->panel.vm = ddata->vm;
>  
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index e3d31b2fee4c..a93afbbe19de 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -458,8 +458,6 @@ struct omap_dss_device {
>  	enum omap_display_type output_type;
>  
>  	struct {
> -		struct videomode vm;
> -
>  		enum omap_dss_dsi_pixel_format dsi_pix_fmt;
>  		enum omap_dss_dsi_mode dsi_mode;
>  	} panel;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields
  2018-05-26 17:24 ` [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields Laurent Pinchart
@ 2018-06-10 17:48   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 17:48 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:31PM +0300, Laurent Pinchart wrote:
> The omap_dss_device panel.dsi_pix_fmt and panel.dsi_mode fields are
> unused. Remove them.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 1 -
>  drivers/gpu/drm/omapdrm/dss/omapdss.h           | 5 -----
>  2 files changed, 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 555ab2ac5576..8d98cd628e11 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1333,7 +1333,6 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
>  	dssdev->owner = THIS_MODULE;
>  
> -	dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888;
>  	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
>  		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index a93afbbe19de..39e2906fd5fe 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -457,11 +457,6 @@ struct omap_dss_device {
>  	enum omap_display_type type;
>  	enum omap_display_type output_type;
>  
> -	struct {
> -		enum omap_dss_dsi_pixel_format dsi_pix_fmt;
> -		enum omap_dss_dsi_mode dsi_mode;
> -	} panel;
> -
>  	const char *name;
>  
>  	const struct omap_dss_driver *driver;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list
  2018-05-26 17:24 ` [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list Laurent Pinchart
@ 2018-06-10 18:55   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 18:55 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:32PM +0300, Laurent Pinchart wrote:
> For coherency with the panel_list field, rename list to output_list.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  2 +-
>  drivers/gpu/drm/omapdrm/dss/output.c  | 10 +++++-----
>  2 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 39e2906fd5fe..abf101bb27ea 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -481,7 +481,7 @@ struct omap_dss_device {
>  
>  	/* OMAP DSS output specific fields */
>  
> -	struct list_head list;
> +	struct list_head output_list;
>  
>  	/* DISPC channel for this output */
>  	enum omap_channel dispc_channel;
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 96b9d4cd505f..0fcd13ea8824 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -96,14 +96,14 @@ EXPORT_SYMBOL(omapdss_output_unset_device);
>  
>  int omapdss_register_output(struct omap_dss_device *out)
>  {
> -	list_add_tail(&out->list, &output_list);
> +	list_add_tail(&out->output_list, &output_list);
>  	return 0;
>  }
>  EXPORT_SYMBOL(omapdss_register_output);
>  
>  void omapdss_unregister_output(struct omap_dss_device *out)
>  {
> -	list_del(&out->list);
> +	list_del(&out->output_list);
>  }
>  EXPORT_SYMBOL(omapdss_unregister_output);
>  
> @@ -111,7 +111,7 @@ bool omapdss_component_is_output(struct device_node *node)
>  {
>  	struct omap_dss_device *out;
>  
> -	list_for_each_entry(out, &output_list, list) {
> +	list_for_each_entry(out, &output_list, output_list) {
>  		if (out->dev->of_node == node)
>  			return true;
>  	}
> @@ -124,7 +124,7 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
>  {
>  	struct omap_dss_device *out;
>  
> -	list_for_each_entry(out, &output_list, list) {
> +	list_for_each_entry(out, &output_list, output_list) {
>  		if (out->id == id)
>  			return out;
>  	}
> @@ -145,7 +145,7 @@ struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *po
>  
>  	reg = dss_of_port_get_port_number(port);
>  
> -	list_for_each_entry(out, &output_list, list) {
> +	list_for_each_entry(out, &output_list, output_list) {
>  		if (out->dev->of_node == src_node && out->port_num == reg) {
>  			of_node_put(src_node);
>  			return omap_dss_get_device(out);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances
  2018-05-26 17:24 ` [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances Laurent Pinchart
@ 2018-06-10 19:03   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:03 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:33PM +0300, Laurent Pinchart wrote:
> The omap_dss_device instances are stored in two separate lists,
> depending on whether they are panels or outputs. Create a third list
> that stores all omap_dss_device instances to allow generic code to
> operate on all instances.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 45 ++++++++++++++++++++++++++++-------
>  drivers/gpu/drm/omapdrm/dss/display.c |  4 ++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  4 ++++
>  drivers/gpu/drm/omapdrm/dss/output.c  |  2 ++
>  4 files changed, 46 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 99e8cb8dc65b..18b72d7c717a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -14,24 +14,17 @@
>   */
>  
>  #include <linux/kernel.h>
> +#include <linux/list.h>
>  #include <linux/module.h>
> +#include <linux/mutex.h>
>  #include <linux/of.h>
>  #include <linux/of_graph.h>
> -#include <linux/list.h>
>  
>  #include "dss.h"
>  #include "omapdss.h"
>  
>  static struct dss_device *dss_device;
>  
> -static struct list_head omapdss_comp_list;
> -
> -struct omapdss_comp_node {
> -	struct list_head list;
> -	struct device_node *node;
> -	bool dss_core_component;
> -};
> -
>  struct dss_device *omapdss_get_dss(void)
>  {
>  	return dss_device;
> @@ -56,6 +49,40 @@ const struct dispc_ops *dispc_get_ops(struct dss_device *dss)
>  }
>  EXPORT_SYMBOL(dispc_get_ops);
>  
> +
> +/* -----------------------------------------------------------------------------
> + * OMAP DSS Devices Handling
> + */
> +
> +static LIST_HEAD(omapdss_devices_list);
> +static DEFINE_MUTEX(omapdss_devices_lock);
> +
> +void omapdss_device_register(struct omap_dss_device *dssdev)
> +{
> +	mutex_lock(&omapdss_devices_lock);
> +	list_add_tail(&dssdev->list, &omapdss_devices_list);
> +	mutex_unlock(&omapdss_devices_lock);
> +}
> +
> +void omapdss_device_unregister(struct omap_dss_device *dssdev)
> +{
> +	mutex_lock(&omapdss_devices_lock);
> +	list_del(&dssdev->list);
> +	mutex_unlock(&omapdss_devices_lock);
> +}
> +
> +/* -----------------------------------------------------------------------------
> + * Components Handling
> + */
> +
> +static struct list_head omapdss_comp_list;
> +
> +struct omapdss_comp_node {
> +	struct list_head list;
> +	struct device_node *node;
> +	bool dss_core_component;
> +};
> +
>  static bool omapdss_list_contains(const struct device_node *node)
>  {
>  	struct omapdss_comp_node *comp;
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index e07e3319d6e0..eacbbf45f737 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -56,6 +56,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
>  	mutex_lock(&panel_list_mutex);
>  	list_add_tail(&dssdev->panel_list, &panel_list);
>  	mutex_unlock(&panel_list_mutex);
> +
> +	omapdss_device_register(dssdev);
>  	return 0;
>  }
>  EXPORT_SYMBOL(omapdss_register_display);
> @@ -65,6 +67,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev)
>  	mutex_lock(&panel_list_mutex);
>  	list_del(&dssdev->panel_list);
>  	mutex_unlock(&panel_list_mutex);
> +
> +	omapdss_device_register(dssdev);
>  }
>  EXPORT_SYMBOL(omapdss_unregister_display);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index abf101bb27ea..e029613509a1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -450,6 +450,7 @@ struct omap_dss_device {
>  
>  	struct module *owner;
>  
> +	struct list_head list;
>  	struct list_head panel_list;
>  
>  	unsigned int alias_id;
> @@ -560,6 +561,9 @@ static inline bool omapdss_is_initialized(void)
>  int omapdss_register_display(struct omap_dss_device *dssdev);
>  void omapdss_unregister_display(struct omap_dss_device *dssdev);
>  
> +void omapdss_device_register(struct omap_dss_device *dssdev);
> +void omapdss_device_unregister(struct omap_dss_device *dssdev);
> +
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
>  void omap_dss_put_device(struct omap_dss_device *dssdev);
>  #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 0fcd13ea8824..1a2d24906edd 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -97,6 +97,7 @@ EXPORT_SYMBOL(omapdss_output_unset_device);
>  int omapdss_register_output(struct omap_dss_device *out)
>  {
>  	list_add_tail(&out->output_list, &output_list);
> +	omapdss_device_register(out);
>  	return 0;
>  }
>  EXPORT_SYMBOL(omapdss_register_output);
> @@ -104,6 +105,7 @@ EXPORT_SYMBOL(omapdss_register_output);
>  void omapdss_unregister_output(struct omap_dss_device *out)
>  {
>  	list_del(&out->output_list);
> +	omapdss_device_unregister(out);
>  }
>  EXPORT_SYMBOL(omapdss_unregister_output);
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered()
  2018-05-26 17:24 ` [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered() Laurent Pinchart
@ 2018-06-10 19:04   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:04 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:34PM +0300, Laurent Pinchart wrote:
> The omapdss_component_is_loaded() function test whether a component is
> loaded by checking whether it is present in the displays list or the
> outputs list. Simplify the implementation by checking for the component
> in the global omap_dss_device list.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 22 +++++++++++++++++++---
>  drivers/gpu/drm/omapdrm/dss/display.c | 18 ------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 ---
>  drivers/gpu/drm/omapdrm/dss/output.c  | 13 -------------
>  4 files changed, 19 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 18b72d7c717a..63fe0a717884 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -71,6 +71,24 @@ void omapdss_device_unregister(struct omap_dss_device *dssdev)
>  	mutex_unlock(&omapdss_devices_lock);
>  }
>  
> +static bool omapdss_device_is_registered(struct device_node *node)
> +{
> +	struct omap_dss_device *dssdev;
> +	bool found = false;
> +
> +	mutex_lock(&omapdss_devices_lock);
> +
> +	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
> +		if (dssdev->dev->of_node == node) {
> +			found = true;
> +			break;
> +		}
> +	}
> +
> +	mutex_unlock(&omapdss_devices_lock);
> +	return found;
> +}
> +
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> @@ -157,9 +175,7 @@ static bool omapdss_component_is_loaded(struct omapdss_comp_node *comp)
>  {
>  	if (comp->dss_core_component)
>  		return true;
> -	if (omapdss_component_is_display(comp->node))
> -		return true;
> -	if (omapdss_component_is_output(comp->node))
> +	if (omapdss_device_is_registered(comp->node))
>  		return true;
>  
>  	return false;
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index eacbbf45f737..383512c8a466 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -72,24 +72,6 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev)
>  }
>  EXPORT_SYMBOL(omapdss_unregister_display);
>  
> -bool omapdss_component_is_display(struct device_node *node)
> -{
> -	struct omap_dss_device *dssdev;
> -	bool found = false;
> -
> -	mutex_lock(&panel_list_mutex);
> -	list_for_each_entry(dssdev, &panel_list, panel_list) {
> -		if (dssdev->dev->of_node == node) {
> -			found = true;
> -			goto out;
> -		}
> -	}
> -out:
> -	mutex_unlock(&panel_list_mutex);
> -	return found;
> -}
> -EXPORT_SYMBOL(omapdss_component_is_display);
> -
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
>  {
>  	if (!try_module_get(dssdev->owner))
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index e029613509a1..1ccf0c67d308 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -737,9 +737,6 @@ struct dispc_ops {
>  struct dispc_device *dispc_get_dispc(struct dss_device *dss);
>  const struct dispc_ops *dispc_get_ops(struct dss_device *dss);
>  
> -bool omapdss_component_is_display(struct device_node *node);
> -bool omapdss_component_is_output(struct device_node *node);
> -
>  bool omapdss_stack_is_ready(void);
>  void omapdss_gather_components(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 1a2d24906edd..7f18153a1bde 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -109,19 +109,6 @@ void omapdss_unregister_output(struct omap_dss_device *out)
>  }
>  EXPORT_SYMBOL(omapdss_unregister_output);
>  
> -bool omapdss_component_is_output(struct device_node *node)
> -{
> -	struct omap_dss_device *out;
> -
> -	list_for_each_entry(out, &output_list, output_list) {
> -		if (out->dev->of_node == node)
> -			return true;
> -	}
> -
> -	return false;
> -}
> -EXPORT_SYMBOL(omapdss_component_is_output);
> -
>  struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
>  {
>  	struct omap_dss_device *out;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node
  2018-05-26 17:24 ` [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node Laurent Pinchart
@ 2018-06-10 19:19   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:19 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:35PM +0300, Laurent Pinchart wrote:
> The omap_dss_find_output_by_port_node() function defined in output.c
> looks up an output from its port node. To do so it needs to call helper
> functions from dss-of.c to lookup the port parent and the port number.
> As omap_dss_find_output_by_port_node() is only called by
> omapdss_of_find_source_for_first_ep() from dss-of.c this goes back and
> forth between the to source files and isn't very clear.
> 
> Simplify the code by passing both the parent and the port number to
> omap_dss_find_output_by_port_node() instead of the port node, and rename
> the function to omap_dss_find_output_by_port().
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dss-of.c  | 39 ++++++++++++++++-------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  6 ++----
>  drivers/gpu/drm/omapdrm/dss/output.c  | 17 +++------------
>  3 files changed, 23 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> index 4602a79c6c44..b51af09e9111 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> @@ -21,7 +21,8 @@
>  
>  #include "omapdss.h"
>  
> -struct device_node *dss_of_port_get_parent_device(struct device_node *port)
> +static struct device_node *
> +dss_of_port_get_parent_device(struct device_node *port)
>  {
>  	struct device_node *np;
>  	int i;
> @@ -45,40 +46,36 @@ struct device_node *dss_of_port_get_parent_device(struct device_node *port)
>  	return NULL;
>  }
>  
> -u32 dss_of_port_get_port_number(struct device_node *port)
> -{
> -	int r;
> -	u32 reg;
> -
> -	r = of_property_read_u32(port, "reg", &reg);
> -	if (r)
> -		reg = 0;
> -
> -	return reg;
> -}
> -
>  struct omap_dss_device *
>  omapdss_of_find_source_for_first_ep(struct device_node *node)
>  {
> -	struct device_node *ep;
> +	struct device_node *src_node;
>  	struct device_node *src_port;
> +	struct device_node *ep;
>  	struct omap_dss_device *src;
> +	u32 port_number = 0;
>  
> +	/* Get the endpoint... */
>  	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
>  	if (!ep)
>  		return ERR_PTR(-EINVAL);
>  
> +	/* ... and its remote port... */
>  	src_port = of_graph_get_remote_port(ep);
> -	if (!src_port) {
> -		of_node_put(ep);
> -		return ERR_PTR(-EINVAL);
> -	}
> -
>  	of_node_put(ep);
> +	if (!src_port)
> +		return ERR_PTR(-EINVAL);
>  
> -	src = omap_dss_find_output_by_port_node(src_port);
> -
> +	/* ... 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 NULL;
> +
> +	/* ... and finally the source. */
> +	src = omap_dss_find_output_by_port(src_node, port_number);
> +	of_node_put(src_node);
>  
>  	return src ? src : ERR_PTR(-EPROBE_DEFER);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 1ccf0c67d308..ff0f603bce76 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -576,7 +576,8 @@ int omap_dss_get_num_overlays(void);
>  int omapdss_register_output(struct omap_dss_device *output);
>  void omapdss_unregister_output(struct omap_dss_device *output);
>  struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
> -struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port);
> +struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
> +						     unsigned int port);
>  int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
> @@ -603,9 +604,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
>  struct omap_dss_device *
>  omapdss_of_find_source_for_first_ep(struct device_node *node);
>  
> -struct device_node *dss_of_port_get_parent_device(struct device_node *port);
> -u32 dss_of_port_get_port_number(struct device_node *port);
> -
>  enum dss_writeback_channel {
>  	DSS_WB_LCD1_MGR =	0,
>  	DSS_WB_LCD2_MGR =	1,
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 7f18153a1bde..be254ea42e08 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -122,27 +122,16 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
>  }
>  EXPORT_SYMBOL(omap_dss_get_output);
>  
> -struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port)
> +struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
> +						     unsigned int port)
>  {
> -	struct device_node *src_node;
>  	struct omap_dss_device *out;
> -	u32 reg;
> -
> -	src_node = dss_of_port_get_parent_device(port);
> -	if (!src_node)
> -		return NULL;
> -
> -	reg = dss_of_port_get_port_number(port);
>  
>  	list_for_each_entry(out, &output_list, output_list) {
> -		if (out->dev->of_node == src_node && out->port_num == reg) {
> -			of_node_put(src_node);
> +		if (out->dev->of_node == src && out->port_num == port)
>  			return omap_dss_get_device(out);
> -		}
>  	}
>  
> -	of_node_put(src_node);
> -
>  	return NULL;
>  }
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port
  2018-05-26 17:24 ` [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port Laurent Pinchart
@ 2018-06-10 19:25   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:25 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:36PM +0300, Laurent Pinchart wrote:
> The omap_dss_find_output_by_port() function looks up an omap_dss_device
> by port from the list of devices registered as outputs. In preparation
> for looking up sinks in addition to sources, allow the function to look
> up any registered device. Rename it to omap_dss_find_device_by_port() to
> match its new purpose.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 13 +++++++++++++
>  drivers/gpu/drm/omapdrm/dss/dss-of.c  |  2 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  4 ++--
>  drivers/gpu/drm/omapdrm/dss/output.c  | 13 -------------
>  4 files changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 63fe0a717884..df6cb1ac43c8 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -89,6 +89,19 @@ static bool omapdss_device_is_registered(struct device_node *node)
>  	return found;
>  }
>  
> +struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
> +						    unsigned int port)
> +{
> +	struct omap_dss_device *dssdev;
> +
> +	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
> +		if (dssdev->dev->of_node == src && dssdev->port_num == port)
> +			return omap_dss_get_device(dssdev);
> +	}
> +
> +	return NULL;
> +}
> +
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> index b51af09e9111..771b20db2d98 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> @@ -74,7 +74,7 @@ omapdss_of_find_source_for_first_ep(struct device_node *node)
>  		return NULL;
>  
>  	/* ... and finally the source. */
> -	src = omap_dss_find_output_by_port(src_node, port_number);
> +	src = omapdss_find_device_by_port(src_node, port_number);
>  	of_node_put(src_node);
>  
>  	return src ? src : ERR_PTR(-EPROBE_DEFER);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index ff0f603bce76..2ec74206bcff 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -563,6 +563,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev);
>  
>  void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(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 *omap_dss_get_device(struct omap_dss_device *dssdev);
>  void omap_dss_put_device(struct omap_dss_device *dssdev);
> @@ -576,8 +578,6 @@ int omap_dss_get_num_overlays(void);
>  int omapdss_register_output(struct omap_dss_device *output);
>  void omapdss_unregister_output(struct omap_dss_device *output);
>  struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
> -struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
> -						     unsigned int port);
>  int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index be254ea42e08..e659c8e5c419 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -122,19 +122,6 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
>  }
>  EXPORT_SYMBOL(omap_dss_get_output);
>  
> -struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
> -						     unsigned int port)
> -{
> -	struct omap_dss_device *out;
> -
> -	list_for_each_entry(out, &output_list, output_list) {
> -		if (out->dev->of_node == src && out->port_num == port)
> -			return omap_dss_get_device(out);
> -	}
> -
> -	return NULL;
> -}
> -
>  struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
>  {
>  	while (dssdev->src)
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure
  2018-05-26 17:24 ` [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure Laurent Pinchart
@ 2018-06-10 19:42   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:42 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:37PM +0300, Laurent Pinchart wrote:
> The various types of omapdss_*_ops structures define multiple operations
> that are not specific to a bus type. To simplify the code and remove
> dependencies on specific bus types move those operations to a common
> structure. Operations that are specific to a bus type are kept in the
> specialized ops structures.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  14 +--
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  14 +--
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  42 ++++----
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  20 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  20 ++--
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  48 ++++-----
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  16 +--
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 120 ++++++++++-----------
>  .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  14 +--
>  .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  14 +--
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  14 +--
>  .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  14 +--
>  .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  14 +--
>  .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  16 +--
>  drivers/gpu/drm/omapdrm/dss/dpi.c                  |   4 +-
>  drivers/gpu/drm/omapdrm/dss/dsi.c                  |  50 ++++-----
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  14 +--
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  12 ++-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              | 109 ++++---------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c                  |   4 +-
>  drivers/gpu/drm/omapdrm/dss/venc.c                 |   4 +-
>  21 files changed, 256 insertions(+), 321 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 6b640ede6614..a94868d9398b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -59,7 +59,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.atv->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -79,7 +79,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.atv->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -99,9 +99,9 @@ static int tvc_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.atv->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.atv->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -120,7 +120,7 @@ static void tvc_disable(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops.atv->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -133,7 +133,7 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.atv->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void tvc_get_timings(struct omap_dss_device *dssdev,
> @@ -150,7 +150,7 @@ static int tvc_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.atv->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver tvc_driver = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 84598ea12a9b..021e3b651c89 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -72,7 +72,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dvi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -90,7 +90,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dvi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -108,9 +108,9 @@ static int dvic_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dvi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dvi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -127,7 +127,7 @@ static void dvic_disable(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops.dvi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -140,7 +140,7 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dvi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void dvic_get_timings(struct omap_dss_device *dssdev,
> @@ -157,7 +157,7 @@ static int dvic_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dvi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  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 e031280468fb..b528bd51ada3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -69,7 +69,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.hdmi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -89,7 +89,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.hdmi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -109,9 +109,9 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.hdmi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.hdmi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -130,7 +130,7 @@ static void hdmic_disable(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops.hdmi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -143,7 +143,7 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.hdmi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void hdmic_get_timings(struct omap_dss_device *dssdev,
> @@ -160,7 +160,7 @@ static int hdmic_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static int hdmic_read_edid(struct omap_dss_device *dssdev,
> @@ -169,7 +169,7 @@ static int hdmic_read_edid(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->read_edid(in, edid, len);
> +	return in->ops->hdmi.read_edid(in, edid, len);
>  }
>  
>  static bool hdmic_detect(struct omap_dss_device *dssdev)
> @@ -181,9 +181,9 @@ static bool hdmic_detect(struct omap_dss_device *dssdev)
>  	if (gpio_is_valid(ddata->hpd_gpio))
>  		connected = gpio_get_value_cansleep(ddata->hpd_gpio);
>  	else
> -		connected = in->ops.hdmi->detect(in);
> -	if (!connected && in->ops.hdmi->lost_hotplug)
> -		in->ops.hdmi->lost_hotplug(in);
> +		connected = in->ops->hdmi.detect(in);
> +	if (!connected && in->ops->hdmi.lost_hotplug)
> +		in->ops->hdmi.lost_hotplug(in);
>  	return connected;
>  }
>  
> @@ -201,8 +201,8 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
>  		ddata->hpd_cb_data = cb_data;
>  		mutex_unlock(&ddata->hpd_lock);
>  		return 0;
> -	} else if (in->ops.hdmi->register_hpd_cb) {
> -		return in->ops.hdmi->register_hpd_cb(in, cb, cb_data);
> +	} else if (in->ops->hdmi.register_hpd_cb) {
> +		return in->ops->hdmi.register_hpd_cb(in, cb, cb_data);
>  	}
>  
>  	return -ENOTSUPP;
> @@ -218,8 +218,8 @@ static void hdmic_unregister_hpd_cb(struct omap_dss_device *dssdev)
>  		ddata->hpd_cb = NULL;
>  		ddata->hpd_cb_data = NULL;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops.hdmi->unregister_hpd_cb) {
> -		in->ops.hdmi->unregister_hpd_cb(in);
> +	} else if (in->ops->hdmi.unregister_hpd_cb) {
> +		in->ops->hdmi.unregister_hpd_cb(in);
>  	}
>  }
>  
> @@ -232,8 +232,8 @@ static void hdmic_enable_hpd(struct omap_dss_device *dssdev)
>  		mutex_lock(&ddata->hpd_lock);
>  		ddata->hpd_enabled = true;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops.hdmi->enable_hpd) {
> -		in->ops.hdmi->enable_hpd(in);
> +	} else if (in->ops->hdmi.enable_hpd) {
> +		in->ops->hdmi.enable_hpd(in);
>  	}
>  }
>  
> @@ -246,8 +246,8 @@ static void hdmic_disable_hpd(struct omap_dss_device *dssdev)
>  		mutex_lock(&ddata->hpd_lock);
>  		ddata->hpd_enabled = false;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops.hdmi->disable_hpd) {
> -		in->ops.hdmi->disable_hpd(in);
> +	} else if (in->ops->hdmi.disable_hpd) {
> +		in->ops->hdmi.disable_hpd(in);
>  	}
>  }
>  
> @@ -256,7 +256,7 @@ static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode);
> +	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
>  }
>  
>  static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
> @@ -265,7 +265,7 @@ static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->set_infoframe(in, avi);
> +	return in->ops->hdmi.set_infoframe(in, avi);
>  }
>  
>  static const struct omap_dss_driver hdmic_driver = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 0e3f4a20e531..37982ffe0ad4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -50,7 +50,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.atv->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -82,7 +82,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops.atv->disconnect(in, &ddata->dssdev);
> +	in->ops->disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -102,9 +102,9 @@ static int opa362_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.atv->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.atv->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -129,7 +129,7 @@ static void opa362_disable(struct omap_dss_device *dssdev)
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> -	in->ops.atv->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -144,7 +144,7 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.atv->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static int opa362_check_timings(struct omap_dss_device *dssdev,
> @@ -155,16 +155,14 @@ static int opa362_check_timings(struct omap_dss_device *dssdev,
>  
>  	dev_dbg(dssdev->dev, "check_timings\n");
>  
> -	return in->ops.atv->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
> -static const struct omapdss_atv_ops opa362_atv_ops = {
> +static const struct omap_dss_device_ops opa362_ops = {
>  	.connect	= opa362_connect,
>  	.disconnect	= opa362_disconnect,
> -
>  	.enable		= opa362_enable,
>  	.disable	= opa362_disable,
> -
>  	.check_timings	= opa362_check_timings,
>  	.set_timings	= opa362_set_timings,
>  };
> @@ -191,7 +189,7 @@ static int opa362_probe(struct platform_device *pdev)
>  	ddata->enable_gpio = gpio;
>  
>  	dssdev = &ddata->dssdev;
> -	dssdev->ops.atv = &opa362_atv_ops;
> +	dssdev->ops = &opa362_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 08e63e39d0b7..1fbc5559e54f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -44,7 +44,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -74,7 +74,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops.dpi->disconnect(in, &ddata->dssdev);
> +	in->ops->disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -92,9 +92,9 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -117,7 +117,7 @@ static void tfp410_disable(struct omap_dss_device *dssdev)
>  	if (gpio_is_valid(ddata->pd_gpio))
>  		gpio_set_value_cansleep(ddata->pd_gpio, 0);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -138,7 +138,7 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static int tfp410_check_timings(struct omap_dss_device *dssdev,
> @@ -149,16 +149,14 @@ static int tfp410_check_timings(struct omap_dss_device *dssdev,
>  
>  	tfp410_fix_timings(vm);
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
> -static const struct omapdss_dvi_ops tfp410_dvi_ops = {
> +static const struct omap_dss_device_ops tfp410_ops = {
>  	.connect	= tfp410_connect,
>  	.disconnect	= tfp410_disconnect,
> -
>  	.enable		= tfp410_enable,
>  	.disable	= tfp410_disable,
> -
>  	.check_timings	= tfp410_check_timings,
>  	.set_timings	= tfp410_set_timings,
>  };
> @@ -209,7 +207,7 @@ static int tfp410_probe(struct platform_device *pdev)
>  	}
>  
>  	dssdev = &ddata->dssdev;
> -	dssdev->ops.dvi = &tfp410_dvi_ops;
> +	dssdev->ops = &tfp410_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index f35e2afa3e9c..21a4a2fd42bf 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -49,7 +49,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.hdmi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -85,7 +85,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops.hdmi->disconnect(in, &ddata->dssdev);
> +	in->ops->disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -100,9 +100,9 @@ static int tpd_enable(struct omap_dss_device *dssdev)
>  	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
>  		return 0;
>  
> -	in->ops.hdmi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.hdmi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -119,7 +119,7 @@ static void tpd_disable(struct omap_dss_device *dssdev)
>  	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
>  		return;
>  
> -	in->ops.hdmi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -132,7 +132,7 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.hdmi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static int tpd_check_timings(struct omap_dss_device *dssdev,
> @@ -142,7 +142,7 @@ static int tpd_check_timings(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in = ddata->in;
>  	int r;
>  
> -	r = in->ops.hdmi->check_timings(in, vm);
> +	r = in->ops->check_timings(in, vm);
>  
>  	return r;
>  }
> @@ -156,7 +156,7 @@ static int tpd_read_edid(struct omap_dss_device *dssdev,
>  	if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
>  		return -ENODEV;
>  
> -	return in->ops.hdmi->read_edid(in, edid, len);
> +	return in->ops->hdmi.read_edid(in, edid, len);
>  }
>  
>  static bool tpd_detect(struct omap_dss_device *dssdev)
> @@ -165,8 +165,8 @@ static bool tpd_detect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in = ddata->in;
>  	bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
>  
> -	if (!connected && in->ops.hdmi->lost_hotplug)
> -		in->ops.hdmi->lost_hotplug(in);
> +	if (!connected && in->ops->hdmi.lost_hotplug)
> +		in->ops->hdmi.lost_hotplug(in);
>  	return connected;
>  }
>  
> @@ -219,7 +219,7 @@ static int tpd_set_infoframe(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->set_infoframe(in, avi);
> +	return in->ops->hdmi.set_infoframe(in, avi);
>  }
>  
>  static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
> @@ -228,27 +228,27 @@ static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode);
> +	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
>  }
>  
> -static const struct omapdss_hdmi_ops tpd_hdmi_ops = {
> +static const struct omap_dss_device_ops tpd_ops = {
>  	.connect		= tpd_connect,
>  	.disconnect		= tpd_disconnect,
> -
>  	.enable			= tpd_enable,
>  	.disable		= tpd_disable,
> -
>  	.check_timings		= tpd_check_timings,
>  	.set_timings		= tpd_set_timings,
>  
> -	.read_edid		= tpd_read_edid,
> -	.detect			= tpd_detect,
> -	.register_hpd_cb	= tpd_register_hpd_cb,
> -	.unregister_hpd_cb	= tpd_unregister_hpd_cb,
> -	.enable_hpd		= tpd_enable_hpd,
> -	.disable_hpd		= tpd_disable_hpd,
> -	.set_infoframe		= tpd_set_infoframe,
> -	.set_hdmi_mode		= tpd_set_hdmi_mode,
> +	.hdmi = {
> +		.read_edid		= tpd_read_edid,
> +		.detect			= tpd_detect,
> +		.register_hpd_cb	= tpd_register_hpd_cb,
> +		.unregister_hpd_cb	= tpd_unregister_hpd_cb,
> +		.enable_hpd		= tpd_enable_hpd,
> +		.disable_hpd		= tpd_disable_hpd,
> +		.set_infoframe		= tpd_set_infoframe,
> +		.set_hdmi_mode		= tpd_set_hdmi_mode,
> +	},
>  };
>  
>  static irqreturn_t tpd_hpd_isr(int irq, void *data)
> @@ -315,7 +315,7 @@ static int tpd_probe(struct platform_device *pdev)
>  		return r;
>  
>  	dssdev = &ddata->dssdev;
> -	dssdev->ops.hdmi = &tpd_hdmi_ops;
> +	dssdev->ops = &tpd_ops;
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index bbd630ead3c1..15042351ace3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -50,7 +50,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -68,7 +68,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -86,15 +86,15 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
>  	r = regulator_enable(ddata->vcc_supply);
>  	if (r) {
> -		in->ops.dpi->disable(in);
> +		in->ops->disable(in);
>  		return r;
>  	}
>  
> @@ -119,7 +119,7 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  	regulator_disable(ddata->vcc_supply);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -132,7 +132,7 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
> @@ -149,7 +149,7 @@ static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver panel_dpi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 8d98cd628e11..4296f4ca39fe 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -146,7 +146,7 @@ static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
>  	int r;
>  	u8 buf[1];
>  
> -	r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
> +	r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
>  
>  	if (r < 0)
>  		return r;
> @@ -159,7 +159,7 @@ 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 *in = ddata->in;
> -	return in->ops.dsi->dcs_write(in, ddata->channel, &dcs_cmd, 1);
> +	return in->ops->dsi.dcs_write(in, ddata->channel, &dcs_cmd, 1);
>  }
>  
>  static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
> @@ -167,7 +167,7 @@ static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
>  	struct omap_dss_device *in = ddata->in;
>  	u8 buf[2] = { dcs_cmd, param };
>  
> -	return in->ops.dsi->dcs_write(in, ddata->channel, buf, 2);
> +	return in->ops->dsi.dcs_write(in, ddata->channel, buf, 2);
>  }
>  
>  static int dsicm_sleep_in(struct panel_drv_data *ddata)
> @@ -180,7 +180,7 @@ static int dsicm_sleep_in(struct panel_drv_data *ddata)
>  	hw_guard_wait(ddata);
>  
>  	cmd = MIPI_DCS_ENTER_SLEEP_MODE;
> -	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, &cmd, 1);
> +	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, &cmd, 1);
>  	if (r)
>  		return r;
>  
> @@ -242,7 +242,7 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	buf[3] = (x2 >> 8) & 0xff;
>  	buf[4] = (x2 >> 0) & 0xff;
>  
> -	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
> +	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
>  	if (r)
>  		return r;
>  
> @@ -252,11 +252,11 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	buf[3] = (y2 >> 8) & 0xff;
>  	buf[4] = (y2 >> 0) & 0xff;
>  
> -	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
> +	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
>  	if (r)
>  		return r;
>  
> -	in->ops.dsi->bta_sync(in, ddata->channel);
> +	in->ops->dsi.bta_sync(in, ddata->channel);
>  
>  	return r;
>  }
> @@ -290,7 +290,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
>  	if (ddata->ext_te_gpio)
>  		disable_irq(gpiod_to_irq(ddata->ext_te_gpio));
>  
> -	in->ops.dsi->disable(in, false, true);
> +	in->ops->dsi.disable(in, false, true);
>  
>  	ddata->ulps_enabled = true;
>  
> @@ -315,13 +315,13 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
>  	if (!ddata->ulps_enabled)
>  		return 0;
>  
> -	r = in->ops.dsi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
>  		goto err1;
>  	}
>  
> -	in->ops.dsi->enable_hs(in, ddata->channel, true);
> +	in->ops->dsi.enable_hs(in, ddata->channel, true);
>  
>  	r = _dsicm_enable_te(ddata, true);
>  	if (r) {
> @@ -381,13 +381,13 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops.dsi->bus_lock(in);
> +		in->ops->dsi.bus_lock(in);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
>  
> -		in->ops.dsi->bus_unlock(in);
> +		in->ops->dsi.bus_unlock(in);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -421,14 +421,14 @@ static ssize_t dsicm_num_errors_show(struct device *dev,
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops.dsi->bus_lock(in);
> +		in->ops->dsi.bus_lock(in);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
>  					&errors);
>  
> -		in->ops.dsi->bus_unlock(in);
> +		in->ops->dsi.bus_unlock(in);
>  	} else {
>  		r = -ENODEV;
>  	}
> @@ -453,13 +453,13 @@ static ssize_t dsicm_hw_revision_show(struct device *dev,
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops.dsi->bus_lock(in);
> +		in->ops->dsi.bus_lock(in);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_get_id(ddata, &id1, &id2, &id3);
>  
> -		in->ops.dsi->bus_unlock(in);
> +		in->ops->dsi.bus_unlock(in);
>  	} else {
>  		r = -ENODEV;
>  	}
> @@ -489,14 +489,14 @@ static ssize_t dsicm_store_ulps(struct device *dev,
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops.dsi->bus_lock(in);
> +		in->ops->dsi.bus_lock(in);
>  
>  		if (t)
>  			r = dsicm_enter_ulps(ddata);
>  		else
>  			r = dsicm_wake_up(ddata);
>  
> -		in->ops.dsi->bus_unlock(in);
> +		in->ops->dsi.bus_unlock(in);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -541,9 +541,9 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
>  
>  	if (ddata->enabled) {
>  		/* dsicm_wake_up will restart the timer */
> -		in->ops.dsi->bus_lock(in);
> +		in->ops->dsi.bus_lock(in);
>  		r = dsicm_wake_up(ddata);
> -		in->ops.dsi->bus_unlock(in);
> +		in->ops->dsi.bus_unlock(in);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -635,7 +635,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  	}
>  
>  	if (ddata->pin_config.num_pins > 0) {
> -		r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
> +		r = in->ops->dsi.configure_pins(in, &ddata->pin_config);
>  		if (r) {
>  			dev_err(&ddata->pdev->dev,
>  				"failed to configure DSI pins\n");
> @@ -643,13 +643,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  		}
>  	}
>  
> -	r = in->ops.dsi->set_config(in, &dsi_config);
> +	r = in->ops->dsi.set_config(in, &dsi_config);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
>  		goto err_vddi;
>  	}
>  
> -	r = in->ops.dsi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
>  		goto err_vddi;
> @@ -657,7 +657,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  	dsicm_hw_reset(ddata);
>  
> -	in->ops.dsi->enable_hs(in, ddata->channel, false);
> +	in->ops->dsi.enable_hs(in, ddata->channel, false);
>  
>  	r = dsicm_sleep_out(ddata);
>  	if (r)
> @@ -689,7 +689,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  	if (r)
>  		goto err;
>  
> -	r = in->ops.dsi->enable_video_output(in, ddata->channel);
> +	r = in->ops->dsi.enable_video_output(in, ddata->channel);
>  	if (r)
>  		goto err;
>  
> @@ -701,7 +701,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  		ddata->intro_printed = true;
>  	}
>  
> -	in->ops.dsi->enable_hs(in, ddata->channel, true);
> +	in->ops->dsi.enable_hs(in, ddata->channel, true);
>  
>  	return 0;
>  err:
> @@ -709,7 +709,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  	dsicm_hw_reset(ddata);
>  
> -	in->ops.dsi->disable(in, true, false);
> +	in->ops->dsi.disable(in, true, false);
>  err_vddi:
>  	if (ddata->vddi)
>  		regulator_disable(ddata->vddi);
> @@ -725,7 +725,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
>  	struct omap_dss_device *in = ddata->in;
>  	int r;
>  
> -	in->ops.dsi->disable_video_output(in, ddata->channel);
> +	in->ops->dsi.disable_video_output(in, ddata->channel);
>  
>  	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
>  	if (!r)
> @@ -737,7 +737,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
>  		dsicm_hw_reset(ddata);
>  	}
>  
> -	in->ops.dsi->disable(in, true, false);
> +	in->ops->dsi.disable(in, true, false);
>  
>  	if (ddata->vddi)
>  		regulator_disable(ddata->vddi);
> @@ -772,19 +772,19 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dsi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		dev_err(dev, "Failed to connect to video source\n");
>  		goto err_connect;
>  	}
>  
> -	r = in->ops.dsi->request_vc(in, &ddata->channel);
> +	r = in->ops->dsi.request_vc(in, &ddata->channel);
>  	if (r) {
>  		dev_err(dev, "failed to get virtual channel\n");
>  		goto err_req_vc;
>  	}
>  
> -	r = in->ops.dsi->set_vc_id(in, ddata->channel, TCH);
> +	r = in->ops->dsi.set_vc_id(in, ddata->channel, TCH);
>  	if (r) {
>  		dev_err(dev, "failed to set VC_ID\n");
>  		goto err_vc_id;
> @@ -794,9 +794,9 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  	return 0;
>  
>  err_vc_id:
> -	in->ops.dsi->release_vc(in, ddata->channel);
> +	in->ops->dsi.release_vc(in, ddata->channel);
>  err_req_vc:
> -	in->ops.dsi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  err_connect:
>  	omap_dss_put_device(in);
>  	return r;
> @@ -810,8 +810,8 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dsi->release_vc(in, ddata->channel);
> -	in->ops.dsi->disconnect(in, dssdev);
> +	in->ops->dsi.release_vc(in, ddata->channel);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -837,11 +837,11 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
>  		goto err;
>  	}
>  
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	r = dsicm_power_on(ddata);
>  
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  
>  	if (r)
>  		goto err;
> @@ -873,7 +873,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  
>  	dsicm_cancel_ulps_work(ddata);
>  
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	if (omapdss_device_is_enabled(dssdev)) {
>  		r = dsicm_wake_up(ddata);
> @@ -881,7 +881,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  			dsicm_power_off(ddata);
>  	}
>  
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  
> @@ -894,7 +894,7 @@ static void dsicm_framedone_cb(int err, void *data)
>  	struct omap_dss_device *in = ddata->in;
>  
>  	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
> -	in->ops.dsi->bus_unlock(ddata->in);
> +	in->ops->dsi.bus_unlock(ddata->in);
>  }
>  
>  static irqreturn_t dsicm_te_isr(int irq, void *data)
> @@ -909,7 +909,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
>  	if (old) {
>  		cancel_delayed_work(&ddata->te_timeout_work);
>  
> -		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
> +		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
>  				ddata);
>  		if (r)
>  			goto err;
> @@ -918,7 +918,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
>  	return IRQ_HANDLED;
>  err:
>  	dev_err(&ddata->pdev->dev, "start update failed\n");
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  	return IRQ_HANDLED;
>  }
>  
> @@ -931,7 +931,7 @@ static void dsicm_te_timeout_work_callback(struct work_struct *work)
>  	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
>  
>  	atomic_set(&ddata->do_update, 0);
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  }
>  
>  static int dsicm_update(struct omap_dss_device *dssdev,
> @@ -944,7 +944,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
>  
>  	mutex_lock(&ddata->lock);
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	r = dsicm_wake_up(ddata);
>  	if (r)
> @@ -966,7 +966,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  				msecs_to_jiffies(250));
>  		atomic_set(&ddata->do_update, 1);
>  	} else {
> -		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
> +		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
>  				ddata);
>  		if (r)
>  			goto err;
> @@ -976,7 +976,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  	mutex_unlock(&ddata->lock);
>  	return 0;
>  err:
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  	mutex_unlock(&ddata->lock);
>  	return r;
>  }
> @@ -989,8 +989,8 @@ static int dsicm_sync(struct omap_dss_device *dssdev)
>  	dev_dbg(&ddata->pdev->dev, "sync\n");
>  
>  	mutex_lock(&ddata->lock);
> -	in->ops.dsi->bus_lock(in);
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_lock(in);
> +	in->ops->dsi.bus_unlock(in);
>  	mutex_unlock(&ddata->lock);
>  
>  	dev_dbg(&ddata->pdev->dev, "sync done\n");
> @@ -1009,7 +1009,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  		r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
>  
>  	if (!ddata->ext_te_gpio)
> -		in->ops.dsi->enable_te(in, enable);
> +		in->ops->dsi.enable_te(in, enable);
>  
>  	/* possible panel bug */
>  	msleep(100);
> @@ -1028,7 +1028,7 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
>  	if (ddata->te_enabled == enable)
>  		goto end;
>  
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	if (ddata->enabled) {
>  		r = dsicm_wake_up(ddata);
> @@ -1042,13 +1042,13 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
>  
>  	ddata->te_enabled = enable;
>  
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  end:
>  	mutex_unlock(&ddata->lock);
>  
>  	return 0;
>  err:
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  	mutex_unlock(&ddata->lock);
>  
>  	return r;
> @@ -1090,7 +1090,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  	size = min((u32)w * h * 3,
>  		   ddata->vm.hactive * ddata->vm.vactive * 3);
>  
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	r = dsicm_wake_up(ddata);
>  	if (r)
> @@ -1106,7 +1106,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  
>  	dsicm_set_update_window(ddata, x, y, w, h);
>  
> -	r = in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, plen);
> +	r = in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, plen);
>  	if (r)
>  		goto err2;
>  
> @@ -1114,7 +1114,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  		u8 dcs_cmd = first ? 0x2e : 0x3e;
>  		first = 0;
>  
> -		r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd,
> +		r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd,
>  				buf + buf_used, size - buf_used);
>  
>  		if (r < 0) {
> @@ -1140,9 +1140,9 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  	r = buf_used;
>  
>  err3:
> -	in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, 1);
> +	in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, 1);
>  err2:
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  err1:
>  	mutex_unlock(&ddata->lock);
>  	return r;
> @@ -1162,11 +1162,11 @@ static void dsicm_ulps_work(struct work_struct *work)
>  		return;
>  	}
>  
> -	in->ops.dsi->bus_lock(in);
> +	in->ops->dsi.bus_lock(in);
>  
>  	dsicm_enter_ulps(ddata);
>  
> -	in->ops.dsi->bus_unlock(in);
> +	in->ops->dsi.bus_unlock(in);
>  	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 0a6ab6470253..8e293708261c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -131,7 +131,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -151,7 +151,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -169,9 +169,9 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -194,7 +194,7 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -207,7 +207,7 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void lb035q02_get_timings(struct omap_dss_device *dssdev,
> @@ -224,7 +224,7 @@ static int lb035q02_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver lb035q02_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 9816e661c97d..7296c794326c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -127,7 +127,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -145,7 +145,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -163,9 +163,9 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -188,7 +188,7 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
>  	if (gpio_is_valid(ddata->res_gpio))
>  		gpio_set_value_cansleep(ddata->res_gpio, 0);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -201,7 +201,7 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void nec_8048_get_timings(struct omap_dss_device *dssdev,
> @@ -218,7 +218,7 @@ static int nec_8048_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver nec_8048_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index e259240f96fa..00291b9ecfde 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -73,7 +73,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -91,7 +91,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -109,7 +109,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
>  	if (ddata->vcc) {
>  		r = regulator_enable(ddata->vcc);
> @@ -117,7 +117,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  			return r;
>  	}
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r) {
>  		regulator_disable(ddata->vcc);
>  		return r;
> @@ -155,7 +155,7 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  
>  	msleep(100);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	if (ddata->vcc)
>  		regulator_disable(ddata->vcc);
> @@ -171,7 +171,7 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
> @@ -188,7 +188,7 @@ static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver sharp_ls_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index b4917d12d913..03fb297581fd 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -522,7 +522,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.sdi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -540,7 +540,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.sdi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -554,9 +554,9 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
>  
>  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>  
> -	in->ops.sdi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.sdi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r) {
>  		pr_err("%s sdi enable failed\n", __func__);
>  		return r;
> @@ -621,7 +621,7 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
>  	/* FIXME need to tweak this delay */
>  	msleep(100);
>  
> -	in->ops.sdi->disable(in);
> +	in->ops->disable(in);
>  }
>  
>  static int acx565akm_enable(struct omap_dss_device *dssdev)
> @@ -672,7 +672,7 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.sdi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void acx565akm_get_timings(struct omap_dss_device *dssdev,
> @@ -689,7 +689,7 @@ static int acx565akm_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.sdi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver acx565akm_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 5faaf760e81b..abdbbaf02674 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -181,7 +181,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -199,7 +199,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -217,9 +217,9 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -328,7 +328,7 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  	jbt_ret_write_0(ddata, JBT_REG_SLEEP_IN);
>  	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -341,7 +341,7 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
> @@ -358,7 +358,7 @@ static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver td028ttec1_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 8e98232ee9d9..de1140314a7a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -352,7 +352,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops.dpi->connect(in, dssdev);
> +	r = in->ops->connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -370,7 +370,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops.dpi->disconnect(in, dssdev);
> +	in->ops->disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> @@ -388,9 +388,9 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops.dpi->set_timings(in, &ddata->vm);
> +	in->ops->set_timings(in, &ddata->vm);
>  
> -	r = in->ops.dpi->enable(in);
> +	r = in->ops->enable(in);
>  	if (r)
>  		return r;
>  
> @@ -401,7 +401,7 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	if (!ddata->spi_suspended) {
>  		r = tpo_td043_power_on(ddata);
>  		if (r) {
> -			in->ops.dpi->disable(in);
> +			in->ops->disable(in);
>  			return r;
>  		}
>  	}
> @@ -419,7 +419,7 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops.dpi->disable(in);
> +	in->ops->disable(in);
>  
>  	if (!ddata->spi_suspended)
>  		tpo_td043_power_off(ddata);
> @@ -435,7 +435,7 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
>  
>  	ddata->vm = *vm;
>  
> -	in->ops.dpi->set_timings(in, vm);
> +	in->ops->set_timings(in, vm);
>  }
>  
>  static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
> @@ -452,7 +452,7 @@ static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	return in->ops.dpi->check_timings(in, vm);
> +	return in->ops->check_timings(in, vm);
>  }
>  
>  static const struct omap_dss_driver tpo_td043_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index af002c57a41d..4516086e85fa 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -681,7 +681,7 @@ static void dpi_disconnect(struct omap_dss_device *dssdev,
>  	dss_mgr_disconnect(&dpi->output, dssdev);
>  }
>  
> -static const struct omapdss_dpi_ops dpi_ops = {
> +static const struct omap_dss_device_ops dpi_ops = {
>  	.connect = dpi_connect,
>  	.disconnect = dpi_disconnect,
>  
> @@ -720,7 +720,7 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  	out->output_type = OMAP_DISPLAY_TYPE_DPI;
>  	out->dispc_channel = dpi_get_channel(dpi, port_num);
>  	out->port_num = port_num;
> -	out->ops.dpi = &dpi_ops;
> +	out->ops = &dpi_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index d4a680629825..e4f496382617 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5000,43 +5000,45 @@ static void dsi_disconnect(struct omap_dss_device *dssdev,
>  	dss_mgr_disconnect(&dsi->output, dssdev);
>  }
>  
> -static const struct omapdss_dsi_ops dsi_ops = {
> +static const struct omap_dss_device_ops dsi_ops = {
>  	.connect = dsi_connect,
>  	.disconnect = dsi_disconnect,
> +	.enable = dsi_display_enable,
>  
> -	.bus_lock = dsi_bus_lock,
> -	.bus_unlock = dsi_bus_unlock,
> +	.dsi = {
> +		.bus_lock = dsi_bus_lock,
> +		.bus_unlock = dsi_bus_unlock,
>  
> -	.enable = dsi_display_enable,
> -	.disable = dsi_display_disable,
> +		.disable = dsi_display_disable,
>  
> -	.enable_hs = dsi_vc_enable_hs,
> +		.enable_hs = dsi_vc_enable_hs,
>  
> -	.configure_pins = dsi_configure_pins,
> -	.set_config = dsi_set_config,
> +		.configure_pins = dsi_configure_pins,
> +		.set_config = dsi_set_config,
>  
> -	.enable_video_output = dsi_enable_video_output,
> -	.disable_video_output = dsi_disable_video_output,
> +		.enable_video_output = dsi_enable_video_output,
> +		.disable_video_output = dsi_disable_video_output,
>  
> -	.update = dsi_update,
> +		.update = dsi_update,
>  
> -	.enable_te = dsi_enable_te,
> +		.enable_te = dsi_enable_te,
>  
> -	.request_vc = dsi_request_vc,
> -	.set_vc_id = dsi_set_vc_id,
> -	.release_vc = dsi_release_vc,
> +		.request_vc = dsi_request_vc,
> +		.set_vc_id = dsi_set_vc_id,
> +		.release_vc = dsi_release_vc,
>  
> -	.dcs_write = dsi_vc_dcs_write,
> -	.dcs_write_nosync = dsi_vc_dcs_write_nosync,
> -	.dcs_read = dsi_vc_dcs_read,
> +		.dcs_write = dsi_vc_dcs_write,
> +		.dcs_write_nosync = dsi_vc_dcs_write_nosync,
> +		.dcs_read = dsi_vc_dcs_read,
>  
> -	.gen_write = dsi_vc_generic_write,
> -	.gen_write_nosync = dsi_vc_generic_write_nosync,
> -	.gen_read = dsi_vc_generic_read,
> +		.gen_write = dsi_vc_generic_write,
> +		.gen_write_nosync = dsi_vc_generic_write_nosync,
> +		.gen_read = dsi_vc_generic_read,
>  
> -	.bta_sync = dsi_vc_send_bta_sync,
> +		.bta_sync = dsi_vc_send_bta_sync,
>  
> -	.set_max_rx_packet_size = dsi_vc_set_max_rx_packet_size,
> +		.set_max_rx_packet_size = dsi_vc_set_max_rx_packet_size,
> +	},
>  };
>  
>  static void dsi_init_output(struct dsi_data *dsi)
> @@ -5050,7 +5052,7 @@ static void dsi_init_output(struct dsi_data *dsi)
>  	out->output_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 = &dsi_ops;
> +	out->ops = &dsi_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index b3d7865347a3..e0406f2a90e7 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -540,7 +540,7 @@ static int hdmi_set_hdmi_mode(struct omap_dss_device *dssdev,
>  	return 0;
>  }
>  
> -static const struct omapdss_hdmi_ops hdmi_ops = {
> +static const struct omap_dss_device_ops hdmi_ops = {
>  	.connect		= hdmi_connect,
>  	.disconnect		= hdmi_disconnect,
>  
> @@ -550,10 +550,12 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
>  	.check_timings		= hdmi_display_check_timing,
>  	.set_timings		= hdmi_display_set_timing,
>  
> -	.read_edid		= hdmi_read_edid,
> -	.lost_hotplug		= hdmi_lost_hotplug,
> -	.set_infoframe		= hdmi_set_infoframe,
> -	.set_hdmi_mode		= hdmi_set_hdmi_mode,
> +	.hdmi = {
> +		.read_edid		= hdmi_read_edid,
> +		.lost_hotplug		= hdmi_lost_hotplug,
> +		.set_infoframe		= hdmi_set_infoframe,
> +		.set_hdmi_mode		= hdmi_set_hdmi_mode,
> +	},
>  };
>  
>  static void hdmi_init_output(struct omap_hdmi *hdmi)
> @@ -565,7 +567,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
>  	out->name = "hdmi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> -	out->ops.hdmi = &hdmi_ops;
> +	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 8e9b3a24b2ab..45d2eacedb2a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -532,7 +532,7 @@ static int hdmi_set_hdmi_mode(struct omap_dss_device *dssdev,
>  	return 0;
>  }
>  
> -static const struct omapdss_hdmi_ops hdmi_ops = {
> +static const struct omap_dss_device_ops hdmi_ops = {
>  	.connect		= hdmi_connect,
>  	.disconnect		= hdmi_disconnect,
>  
> @@ -542,9 +542,11 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
>  	.check_timings		= hdmi_display_check_timing,
>  	.set_timings		= hdmi_display_set_timing,
>  
> -	.read_edid		= hdmi_read_edid,
> -	.set_infoframe		= hdmi_set_infoframe,
> -	.set_hdmi_mode		= hdmi_set_hdmi_mode,
> +	.hdmi = {
> +		.read_edid		= hdmi_read_edid,
> +		.set_infoframe		= hdmi_set_infoframe,
> +		.set_hdmi_mode		= hdmi_set_hdmi_mode,
> +	},
>  };
>  
>  static void hdmi_init_output(struct omap_hdmi *hdmi)
> @@ -556,7 +558,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
>  	out->name = "hdmi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> -	out->ops.hdmi = &hdmi_ops;
> +	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 2ec74206bcff..fb6c9d522013 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -296,80 +296,7 @@ struct omap_dss_writeback_info {
>  	u8 pre_mult_alpha;
>  };
>  
> -struct omapdss_dpi_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
> -	void (*disable)(struct omap_dss_device *dssdev);
> -
> -	int (*check_timings)(struct omap_dss_device *dssdev,
> -			     struct videomode *vm);
> -	void (*set_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
> -};
> -
> -struct omapdss_sdi_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
> -	void (*disable)(struct omap_dss_device *dssdev);
> -
> -	int (*check_timings)(struct omap_dss_device *dssdev,
> -			     struct videomode *vm);
> -	void (*set_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
> -};
> -
> -struct omapdss_dvi_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
> -	void (*disable)(struct omap_dss_device *dssdev);
> -
> -	int (*check_timings)(struct omap_dss_device *dssdev,
> -			     struct videomode *vm);
> -	void (*set_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
> -};
> -
> -struct omapdss_atv_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
> -	void (*disable)(struct omap_dss_device *dssdev);
> -
> -	int (*check_timings)(struct omap_dss_device *dssdev,
> -			     struct videomode *vm);
> -	void (*set_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
> -};
> -
>  struct omapdss_hdmi_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
> -	void (*disable)(struct omap_dss_device *dssdev);
> -
> -	int (*check_timings)(struct omap_dss_device *dssdev,
> -			     struct videomode *vm);
> -	void (*set_timings)(struct omap_dss_device *dssdev,
> -			    struct videomode *vm);
> -
>  	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
>  	void (*lost_hotplug)(struct omap_dss_device *dssdev);
>  	bool (*detect)(struct omap_dss_device *dssdev);
> @@ -388,12 +315,6 @@ struct omapdss_hdmi_ops {
>  };
>  
>  struct omapdss_dsi_ops {
> -	int (*connect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> -
> -	int (*enable)(struct omap_dss_device *dssdev);
>  	void (*disable)(struct omap_dss_device *dssdev, bool disconnect_lanes,
>  			bool enter_ulps);
>  
> @@ -444,6 +365,26 @@ struct omapdss_dsi_ops {
>  			int channel, u16 plen);
>  };
>  
> +struct omap_dss_device_ops {
> +	int (*connect)(struct omap_dss_device *dssdev,
> +			struct omap_dss_device *dst);
> +	void (*disconnect)(struct omap_dss_device *dssdev,
> +			struct omap_dss_device *dst);
> +
> +	int (*enable)(struct omap_dss_device *dssdev);
> +	void (*disable)(struct omap_dss_device *dssdev);
> +
> +	int (*check_timings)(struct omap_dss_device *dssdev,
> +			     struct videomode *vm);
> +	void (*set_timings)(struct omap_dss_device *dssdev,
> +			    struct videomode *vm);
> +
> +	union {
> +		const struct omapdss_hdmi_ops hdmi;
> +		const struct omapdss_dsi_ops dsi;
> +	};
> +};
> +
>  struct omap_dss_device {
>  	struct kobject kobj;
>  	struct device *dev;
> @@ -461,15 +402,7 @@ struct omap_dss_device {
>  	const char *name;
>  
>  	const struct omap_dss_driver *driver;
> -
> -	union {
> -		const struct omapdss_dpi_ops *dpi;
> -		const struct omapdss_sdi_ops *sdi;
> -		const struct omapdss_dvi_ops *dvi;
> -		const struct omapdss_hdmi_ops *hdmi;
> -		const struct omapdss_atv_ops *atv;
> -		const struct omapdss_dsi_ops *dsi;
> -	} ops;
> +	const struct omap_dss_device_ops *ops;
>  
>  	/* helper variable for driver suspend/resume */
>  	bool activate_after_resume;
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 2a61409cfaf6..49499a2aae46 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -308,7 +308,7 @@ static void sdi_disconnect(struct omap_dss_device *dssdev,
>  	dss_mgr_disconnect(&sdi->output, dssdev);
>  }
>  
> -static const struct omapdss_sdi_ops sdi_ops = {
> +static const struct omap_dss_device_ops sdi_ops = {
>  	.connect = sdi_connect,
>  	.disconnect = sdi_disconnect,
>  
> @@ -330,7 +330,7 @@ static void sdi_init_output(struct sdi_device *sdi)
>  	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
>  	/* We have SDI only on OMAP3, where it's on port 1 */
>  	out->port_num = 1;
> -	out->ops.sdi = &sdi_ops;
> +	out->ops = &sdi_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index a9225bd2df6d..c2ea182f1074 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -750,7 +750,7 @@ static void venc_disconnect(struct omap_dss_device *dssdev,
>  	dss_mgr_disconnect(&venc->output, dssdev);
>  }
>  
> -static const struct omapdss_atv_ops venc_ops = {
> +static const struct omap_dss_device_ops venc_ops = {
>  	.connect = venc_connect,
>  	.disconnect = venc_disconnect,
>  
> @@ -770,7 +770,7 @@ static void venc_init_output(struct venc_device *venc)
>  	out->output_type = OMAP_DISPLAY_TYPE_VENC;
>  	out->name = "venc.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> -	out->ops.atv = &venc_ops;
> +	out->ops = &venc_ops;
>  	out->owner = THIS_MODULE;
>  
>  	omapdss_register_output(out);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers
  2018-05-26 17:24 ` [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers Laurent Pinchart
@ 2018-06-10 19:47   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:47 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:39PM +0300, Laurent Pinchart wrote:
> The connectors, encoders and display duplicate the same debug messages
> and connection checks in their omap_dss_device connect and disconnect
> handlers. Move the code to the connect and disconnect wrappers.
> 
> To simplify the code the connect function returns -EBUSY unconditionally
> if the device is already connected. This doesn't cause any change in
> practice: the connect handler of displays is never called on a connected
> device as it is only invoked during omapdrm initialization.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      | 10 ----------
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c            |  6 ------
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           | 10 ----------
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c           | 11 -----------
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c           |  7 -------
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c                |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     |  6 ------
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     |  6 ------
>  drivers/gpu/drm/omapdrm/dss/base.c                          | 12 ++++++++++++
>  14 files changed, 12 insertions(+), 92 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 41ba3c5dbe7d..d77e21fc26ad 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -48,11 +48,6 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	dev_dbg(ddata->dev, "connect\n");
> -
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> @@ -74,11 +69,6 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	dev_dbg(ddata->dev, "disconnect\n");
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index f193bbda550c..9a3ecc3ed5b2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -63,9 +63,6 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -87,9 +84,6 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 014554afbb0d..665af9932317 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -58,11 +58,6 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	dev_dbg(ddata->dev, "connect\n");
> -
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> @@ -84,11 +79,6 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	dev_dbg(ddata->dev, "disconnect\n");
> -
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 752b565987c1..5b9ef09e6b2d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -39,11 +39,6 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	dev_dbg(dssdev->dev, "connect\n");
> -
> -	if (omapdss_device_is_connected(dssdev))
> -		return -EBUSY;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -69,12 +64,6 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	dev_dbg(dssdev->dev, "disconnect\n");
> -
> -	WARN_ON(!omapdss_device_is_connected(dssdev));
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	WARN_ON(dst != dssdev->dst);
>  	if (dst != dssdev->dst)
>  		return;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index a8660e5e5ffc..b22c8f71c0e5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -35,9 +35,6 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return -EBUSY;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -63,10 +60,6 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	WARN_ON(!omapdss_device_is_connected(dssdev));
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	WARN_ON(dst != dssdev->dst);
>  	if (dst != dssdev->dst)
>  		return;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 987519501336..5d704cf0809f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -41,9 +41,6 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -65,9 +62,6 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index b7cd2ef17fbb..be6c0c811e66 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -763,9 +763,6 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -807,9 +804,6 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	in->ops->dsi.release_vc(in, ddata->channel);
>  	omapdss_device_disconnect(in, dssdev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index e4a3b5828bf9..50b74e7351e9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -122,9 +122,6 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -148,9 +145,6 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index e89dd32a2a60..769cba6c99ef 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -118,9 +118,6 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -142,9 +139,6 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index d0451cfab7f8..629ea2d93575 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -64,9 +64,6 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -88,9 +85,6 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 77721acf664d..75cb672b1161 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -513,9 +513,6 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -537,9 +534,6 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 0baf5a5a5895..2491c4876dd4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -172,9 +172,6 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -196,9 +193,6 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 1daba7a60a9c..df3d8103823d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -343,9 +343,6 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *in;
>  	int r;
>  
> -	if (omapdss_device_is_connected(dssdev))
> -		return 0;
> -
>  	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
>  	if (IS_ERR(in)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> @@ -367,9 +364,6 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	if (!omapdss_device_is_connected(dssdev))
> -		return;
> -
>  	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 576fd3d13259..01c117d8775b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -105,6 +105,11 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  int omapdss_device_connect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> +	dev_dbg(src->dev, "connect\n");
> +
> +	if (omapdss_device_is_connected(src))
> +		return -EBUSY;
> +
>  	if (src->driver)
>  		return src->driver->connect(src);
>  	else
> @@ -115,6 +120,13 @@ EXPORT_SYMBOL_GPL(omapdss_device_connect);
>  void omapdss_device_disconnect(struct omap_dss_device *src,
>  			       struct omap_dss_device *dst)
>  {
> +	dev_dbg(src->dev, "disconnect\n");
> +
> +	if (!omapdss_device_is_connected(src)) {
> +		WARN_ON(!src->driver);
> +		return;
> +	}
> +
>  	if (src->driver)
>  		src->driver->disconnect(src);
>  	else
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices
  2018-05-26 17:24 ` [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices Laurent Pinchart
@ 2018-06-10 19:47   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:47 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:38PM +0300, Laurent Pinchart wrote:
> The omap_dss_device objects model display components and are connected
> at runtime to create display pipelines. The connect and disconnect
> operations implemented by each component contain lots of duplicate code.
> As a first step towards fixing this, create new functions to wrap the
> direct calls to those operations and use them.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c   |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c     |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c    |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c         |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c      |  6 +++---
>  .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c  |  4 ++--
>  .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c  |  4 ++--
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c   |  4 ++--
>  .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c  |  4 ++--
>  .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c  |  4 ++--
>  .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c  |  4 ++--
>  drivers/gpu/drm/omapdrm/dss/base.c                   | 20 ++++++++++++++++++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                |  4 ++++
>  drivers/gpu/drm/omapdrm/omap_drv.c                   |  4 ++--
>  17 files changed, 55 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index a94868d9398b..41ba3c5dbe7d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -59,7 +59,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -79,7 +79,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 021e3b651c89..f193bbda550c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -72,7 +72,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -90,7 +90,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index b528bd51ada3..014554afbb0d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -69,7 +69,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -89,7 +89,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 37982ffe0ad4..752b565987c1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -50,7 +50,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -82,7 +82,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops->disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 1fbc5559e54f..a8660e5e5ffc 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -44,7 +44,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -74,7 +74,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops->disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 21a4a2fd42bf..640f15b88467 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -49,7 +49,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -85,7 +85,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  	dst->src = NULL;
>  	dssdev->dst = NULL;
>  
> -	in->ops->disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 15042351ace3..987519501336 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -50,7 +50,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -68,7 +68,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 4296f4ca39fe..b7cd2ef17fbb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -772,7 +772,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		dev_err(dev, "Failed to connect to video source\n");
>  		goto err_connect;
> @@ -796,7 +796,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  err_vc_id:
>  	in->ops->dsi.release_vc(in, ddata->channel);
>  err_req_vc:
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  err_connect:
>  	omap_dss_put_device(in);
>  	return r;
> @@ -811,7 +811,7 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
>  		return;
>  
>  	in->ops->dsi.release_vc(in, ddata->channel);
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 8e293708261c..e4a3b5828bf9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -131,7 +131,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -151,7 +151,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 7296c794326c..e89dd32a2a60 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -127,7 +127,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -145,7 +145,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 00291b9ecfde..d0451cfab7f8 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -73,7 +73,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -91,7 +91,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 03fb297581fd..77721acf664d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -522,7 +522,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -540,7 +540,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index abdbbaf02674..0baf5a5a5895 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -181,7 +181,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -199,7 +199,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index de1140314a7a..1daba7a60a9c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -352,7 +352,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(in);
>  	}
>  
> -	r = in->ops->connect(in, dssdev);
> +	r = omapdss_device_connect(in, dssdev);
>  	if (r) {
>  		omap_dss_put_device(in);
>  		return r;
> @@ -370,7 +370,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
>  	if (!omapdss_device_is_connected(dssdev))
>  		return;
>  
> -	in->ops->disconnect(in, dssdev);
> +	omapdss_device_disconnect(in, dssdev);
>  
>  	omap_dss_put_device(in);
>  	ddata->in = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index df6cb1ac43c8..576fd3d13259 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -102,6 +102,26 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  	return NULL;
>  }
>  
> +int omapdss_device_connect(struct omap_dss_device *src,
> +			   struct omap_dss_device *dst)
> +{
> +	if (src->driver)
> +		return src->driver->connect(src);
> +	else
> +		return src->ops->connect(src, dst);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_connect);
> +
> +void omapdss_device_disconnect(struct omap_dss_device *src,
> +			       struct omap_dss_device *dst)
> +{
> +	if (src->driver)
> +		src->driver->disconnect(src);
> +	else
> +		src->ops->disconnect(src, dst);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
> +
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index fb6c9d522013..58bd6948bcde 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -498,6 +498,10 @@ void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(struct omap_dss_device *dssdev);
>  struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  						    unsigned int port);
> +int omapdss_device_connect(struct omap_dss_device *src,
> +			   struct omap_dss_device *dst);
> +void omapdss_device_disconnect(struct omap_dss_device *src,
> +			       struct omap_dss_device *dst);
>  
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
>  void omap_dss_put_device(struct omap_dss_device *dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index e2d7f8bfb4c1..f1df5be198a8 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -159,7 +159,7 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
>  	for (i = 0; i < priv->num_dssdevs; i++) {
>  		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  
> -		dssdev->driver->disconnect(dssdev);
> +		omapdss_device_disconnect(dssdev, NULL);
>  		priv->dssdevs[i] = NULL;
>  		omap_dss_put_device(dssdev);
>  	}
> @@ -189,7 +189,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  		return -EPROBE_DEFER;
>  
>  	for_each_dss_dev(dssdev) {
> -		r = dssdev->driver->connect(dssdev);
> +		r = omapdss_device_connect(dssdev, NULL);
>  		if (r == -EPROBE_DEFER) {
>  			omap_dss_put_device(dssdev);
>  			goto cleanup;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set to connection handlers
  2018-05-26 17:24 ` [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set " Laurent Pinchart
@ 2018-06-10 19:54   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 19:54 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:40PM +0300, Laurent Pinchart wrote:
> The encoders duplicate the same omap_dss_device src and dst fields set
> and checks in their connect and disconnect handlers. Move the code to
> the connect and disconnect wrappers.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  | 10 ---------
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  | 10 ---------
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   | 11 ----------
>  drivers/gpu/drm/omapdrm/dss/base.c                 | 24 ++++++++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/dpi.c                  |  5 -----
>  drivers/gpu/drm/omapdrm/dss/dsi.c                  |  5 -----
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  5 -----
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  5 -----
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              |  8 +++-----
>  drivers/gpu/drm/omapdrm/dss/output.c               |  6 ------
>  drivers/gpu/drm/omapdrm/dss/sdi.c                  |  5 -----
>  drivers/gpu/drm/omapdrm/dss/venc.c                 |  5 -----
>  12 files changed, 25 insertions(+), 74 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 5b9ef09e6b2d..6baca0dc2b62 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -51,9 +51,6 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  		return r;
>  	}
>  
> -	dst->src = dssdev;
> -	dssdev->dst = dst;
> -
>  	ddata->in = in;
>  	return 0;
>  }
> @@ -64,13 +61,6 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	WARN_ON(dst != dssdev->dst);
> -	if (dst != dssdev->dst)
> -		return;
> -
> -	dst->src = NULL;
> -	dssdev->dst = NULL;
> -
>  	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index b22c8f71c0e5..c1ae8bebf04d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -47,9 +47,6 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  		return r;
>  	}
>  
> -	dst->src = dssdev;
> -	dssdev->dst = dst;
> -
>  	ddata->in = in;
>  	return 0;
>  }
> @@ -60,13 +57,6 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	WARN_ON(dst != dssdev->dst);
> -	if (dst != dssdev->dst)
> -		return;
> -
> -	dst->src = NULL;
> -	dssdev->dst = NULL;
> -
>  	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 640f15b88467..8aa338d01bf7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -55,9 +55,6 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		return r;
>  	}
>  
> -	dst->src = dssdev;
> -	dssdev->dst = dst;
> -
>  	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 1);
>  	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 1);
>  
> @@ -74,17 +71,9 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *in = ddata->in;
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 0);
>  	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 0);
>  
> -	dst->src = NULL;
> -	dssdev->dst = NULL;
> -
>  	omapdss_device_disconnect(in, &ddata->dssdev);
>  
>  	omap_dss_put_device(in);
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 01c117d8775b..810dcddded8a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -105,15 +105,27 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  int omapdss_device_connect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> +	int ret;
> +
>  	dev_dbg(src->dev, "connect\n");
>  
>  	if (omapdss_device_is_connected(src))
>  		return -EBUSY;
>  
>  	if (src->driver)
> -		return src->driver->connect(src);
> +		ret = src->driver->connect(src);
>  	else
> -		return src->ops->connect(src, dst);
> +		ret = src->ops->connect(src, dst);
> +
> +	if (ret < 0)
> +		return ret;
> +
> +	if (dst) {
> +		dst->src = src;
> +		src->dst = dst;
> +	}
> +
> +	return 0;
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_connect);
>  
> @@ -127,6 +139,14 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  		return;
>  	}
>  
> +	if (dst) {
> +		if (WARN_ON(dst != src->dst))
> +			return;
> +
> +		dst->src = NULL;
> +		src->dst = NULL;
> +	}
> +
>  	if (src->driver)
>  		src->driver->disconnect(src);
>  	else
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 4516086e85fa..c13feaf8b086 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -671,11 +671,6 @@ static void dpi_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&dpi->output, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index e4f496382617..4427389e0049 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4990,11 +4990,6 @@ static void dsi_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct dsi_data *dsi = to_dsi_data(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&dsi->output, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index e0406f2a90e7..7e5474e87c11 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -478,11 +478,6 @@ static void hdmi_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&hdmi->output, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 45d2eacedb2a..86b18ccb8d24 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -481,11 +481,6 @@ static void hdmi_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&hdmi->output, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 58bd6948bcde..0033adf534d3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -391,6 +391,9 @@ struct omap_dss_device {
>  
>  	struct module *owner;
>  
> +	struct omap_dss_device *src;
> +	struct omap_dss_device *dst;
> +
>  	struct list_head list;
>  	struct list_head panel_list;
>  
> @@ -409,8 +412,6 @@ struct omap_dss_device {
>  
>  	enum omap_display_caps caps;
>  
> -	struct omap_dss_device *src;
> -
>  	enum omap_dss_display_state state;
>  
>  	/* OMAP DSS output specific fields */
> @@ -426,9 +427,6 @@ struct omap_dss_device {
>  
>  	/* the port number in the DT node */
>  	int port_num;
> -
> -	/* dynamic fields */
> -	struct omap_dss_device *dst;
>  };
>  
>  struct omap_dss_driver {
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index e659c8e5c419..6abdb615a4c0 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -47,9 +47,6 @@ int omapdss_output_set_device(struct omap_dss_device *out,
>  		goto err;
>  	}
>  
> -	out->dst = dssdev;
> -	dssdev->src = out;
> -
>  	mutex_unlock(&output_lock);
>  
>  	return 0;
> @@ -81,9 +78,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
>  		goto err;
>  	}
>  
> -	out->dst->src = NULL;
> -	out->dst = NULL;
> -
>  	mutex_unlock(&output_lock);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 49499a2aae46..77a8f7d86f7a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -298,11 +298,6 @@ static void sdi_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&sdi->output, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index c2ea182f1074..8ea622d02b5c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -740,11 +740,6 @@ static void venc_disconnect(struct omap_dss_device *dssdev,
>  {
>  	struct venc_device *venc = dssdev_to_venc(dssdev);
>  
> -	WARN_ON(dst != dssdev->dst);
> -
> -	if (dst != dssdev->dst)
> -		return;
> -
>  	omapdss_output_unset_device(dssdev);
>  
>  	dss_mgr_disconnect(&venc->output, 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] 127+ messages in thread

* Re: [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data
  2018-05-26 17:24 ` [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data Laurent Pinchart
@ 2018-06-10 20:03   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:03 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:41PM +0300, Laurent Pinchart wrote:
> All connectors, encoders and panels store a pointer to their input
> omap_dss_device in the panel driver data structure. This duplicates the
> src field in the omap_dss_device structure. Remove the private copy and
> use the src field.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  41 ++---
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  43 ++---
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  88 +++++-----
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  41 ++---
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  41 ++---
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  68 +++-----
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  44 +++--
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    | 190 ++++++++++-----------
>  .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  41 ++---
>  .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  42 ++---
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  42 ++---
>  .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  42 ++---
>  .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  42 ++---
>  .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  44 +++--
>  14 files changed, 362 insertions(+), 447 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index d77e21fc26ad..f579bd9ce7cb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -18,7 +18,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct device *dev;
>  
> @@ -45,40 +44,37 @@ static const struct videomode tvc_pal_vm = {
>  static int tvc_connect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void tvc_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int tvc_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(ddata->dev, "enable\n");
> @@ -89,9 +85,9 @@ static int tvc_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -103,14 +99,14 @@ static int tvc_enable(struct omap_dss_device *dssdev)
>  static void tvc_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(ddata->dev, "disable\n");
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -119,11 +115,11 @@ static void tvc_set_timings(struct omap_dss_device *dssdev,
>  			    struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void tvc_get_timings(struct omap_dss_device *dssdev,
> @@ -137,10 +133,9 @@ static void tvc_get_timings(struct omap_dss_device *dssdev,
>  static int tvc_check_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver tvc_driver = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 9a3ecc3ed5b2..48dbb9df76b5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -40,7 +40,6 @@ static const struct videomode dvic_default_vm = {
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -59,41 +58,37 @@ struct panel_drv_data {
>  
>  static int dvic_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void dvic_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int dvic_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -102,9 +97,9 @@ static int dvic_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -115,13 +110,12 @@ static int dvic_enable(struct omap_dss_device *dssdev)
>  
>  static void dvic_disable(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -130,11 +124,11 @@ static void dvic_set_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void dvic_get_timings(struct omap_dss_device *dssdev,
> @@ -148,10 +142,9 @@ static void dvic_get_timings(struct omap_dss_device *dssdev,
>  static int dvic_check_timings(struct omap_dss_device *dssdev,
>  			      struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  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 665af9932317..4acb53788862 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -37,7 +37,6 @@ static const struct videomode hdmic_default_vm = {
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  	void (*hpd_cb)(void *cb_data, enum drm_connector_status status);
>  	void *hpd_cb_data;
>  	bool hpd_enabled;
> @@ -55,40 +54,37 @@ struct panel_drv_data {
>  static int hdmic_connect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void hdmic_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int hdmic_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(ddata->dev, "enable\n");
> @@ -99,9 +95,9 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -113,14 +109,14 @@ static int hdmic_enable(struct omap_dss_device *dssdev)
>  static void hdmic_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(ddata->dev, "disable\n");
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -129,11 +125,11 @@ static void hdmic_set_timings(struct omap_dss_device *dssdev,
>  			      struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void hdmic_get_timings(struct omap_dss_device *dssdev,
> @@ -147,33 +143,31 @@ static void hdmic_get_timings(struct omap_dss_device *dssdev,
>  static int hdmic_check_timings(struct omap_dss_device *dssdev,
>  			       struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static int hdmic_read_edid(struct omap_dss_device *dssdev,
>  		u8 *edid, int len)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->hdmi.read_edid(in, edid, len);
> +	return src->ops->hdmi.read_edid(src, edid, len);
>  }
>  
>  static bool hdmic_detect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	bool connected;
>  
>  	if (gpio_is_valid(ddata->hpd_gpio))
>  		connected = gpio_get_value_cansleep(ddata->hpd_gpio);
>  	else
> -		connected = in->ops->hdmi.detect(in);
> -	if (!connected && in->ops->hdmi.lost_hotplug)
> -		in->ops->hdmi.lost_hotplug(in);
> +		connected = src->ops->hdmi.detect(src);
> +	if (!connected && src->ops->hdmi.lost_hotplug)
> +		src->ops->hdmi.lost_hotplug(src);
>  	return connected;
>  }
>  
> @@ -183,7 +177,7 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
>  				 void *cb_data)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (gpio_is_valid(ddata->hpd_gpio)) {
>  		mutex_lock(&ddata->hpd_lock);
> @@ -191,8 +185,8 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
>  		ddata->hpd_cb_data = cb_data;
>  		mutex_unlock(&ddata->hpd_lock);
>  		return 0;
> -	} else if (in->ops->hdmi.register_hpd_cb) {
> -		return in->ops->hdmi.register_hpd_cb(in, cb, cb_data);
> +	} else if (src->ops->hdmi.register_hpd_cb) {
> +		return src->ops->hdmi.register_hpd_cb(src, cb, cb_data);
>  	}
>  
>  	return -ENOTSUPP;
> @@ -201,61 +195,59 @@ static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
>  static void hdmic_unregister_hpd_cb(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (gpio_is_valid(ddata->hpd_gpio)) {
>  		mutex_lock(&ddata->hpd_lock);
>  		ddata->hpd_cb = NULL;
>  		ddata->hpd_cb_data = NULL;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops->hdmi.unregister_hpd_cb) {
> -		in->ops->hdmi.unregister_hpd_cb(in);
> +	} else if (src->ops->hdmi.unregister_hpd_cb) {
> +		src->ops->hdmi.unregister_hpd_cb(src);
>  	}
>  }
>  
>  static void hdmic_enable_hpd(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (gpio_is_valid(ddata->hpd_gpio)) {
>  		mutex_lock(&ddata->hpd_lock);
>  		ddata->hpd_enabled = true;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops->hdmi.enable_hpd) {
> -		in->ops->hdmi.enable_hpd(in);
> +	} else if (src->ops->hdmi.enable_hpd) {
> +		src->ops->hdmi.enable_hpd(src);
>  	}
>  }
>  
>  static void hdmic_disable_hpd(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (gpio_is_valid(ddata->hpd_gpio)) {
>  		mutex_lock(&ddata->hpd_lock);
>  		ddata->hpd_enabled = false;
>  		mutex_unlock(&ddata->hpd_lock);
> -	} else if (in->ops->hdmi.disable_hpd) {
> -		in->ops->hdmi.disable_hpd(in);
> +	} else if (src->ops->hdmi.disable_hpd) {
> +		src->ops->hdmi.disable_hpd(src);
>  	}
>  }
>  
>  static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
> +	return src->ops->hdmi.set_hdmi_mode(src, hdmi_mode);
>  }
>  
>  static int hdmic_set_infoframe(struct omap_dss_device *dssdev,
>  		const struct hdmi_avi_infoframe *avi)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->hdmi.set_infoframe(in, avi);
> +	return src->ops->hdmi.set_infoframe(src, avi);
>  }
>  
>  static const struct omap_dss_driver hdmic_driver = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 6baca0dc2b62..c9c744e0c92e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -23,7 +23,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct gpio_desc *enable_gpio;
>  
> @@ -35,23 +34,21 @@ struct panel_drv_data {
>  static int opa362_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -59,18 +56,17 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int opa362_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(dssdev->dev, "enable\n");
> @@ -81,9 +77,9 @@ static int opa362_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -98,7 +94,7 @@ static int opa362_enable(struct omap_dss_device *dssdev)
>  static void opa362_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "disable\n");
>  
> @@ -108,7 +104,7 @@ static void opa362_disable(struct omap_dss_device *dssdev)
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -117,24 +113,23 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
>  			       struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "set_timings\n");
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static int opa362_check_timings(struct omap_dss_device *dssdev,
>  				struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "check_timings\n");
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_device_ops opa362_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index c1ae8bebf04d..f568e53a9104 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -19,7 +19,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	int pd_gpio;
>  
> @@ -31,23 +30,21 @@ struct panel_drv_data {
>  static int tfp410_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -55,18 +52,17 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int tfp410_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -75,9 +71,9 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -92,7 +88,7 @@ static int tfp410_enable(struct omap_dss_device *dssdev)
>  static void tfp410_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -100,7 +96,7 @@ static void tfp410_disable(struct omap_dss_device *dssdev)
>  	if (gpio_is_valid(ddata->pd_gpio))
>  		gpio_set_value_cansleep(ddata->pd_gpio, 0);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -115,24 +111,23 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
>  			       struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	tfp410_fix_timings(vm);
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static int tfp410_check_timings(struct omap_dss_device *dssdev,
>  				struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	tfp410_fix_timings(vm);
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_device_ops tfp410_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 8aa338d01bf7..7bbe794e9d21 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -21,7 +21,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  	void (*hpd_cb)(void *cb_data, enum drm_connector_status status);
>  	void *hpd_cb_data;
>  	bool hpd_enabled;
> @@ -40,18 +39,18 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> @@ -61,7 +60,6 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  	/* DC-DC converter needs at max 300us to get to 90% of 5V */
>  	udelay(300);
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -69,29 +67,28 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	gpiod_set_value_cansleep(ddata->ct_cp_hpd_gpio, 0);
>  	gpiod_set_value_cansleep(ddata->ls_oe_gpio, 0);
>  
> -	omapdss_device_disconnect(in, &ddata->dssdev);
> +	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int tpd_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -102,13 +99,12 @@ static int tpd_enable(struct omap_dss_device *dssdev)
>  
>  static void tpd_disable(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
>  		return;
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -117,45 +113,41 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
>  			    struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static int tpd_check_timings(struct omap_dss_device *dssdev,
>  			     struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> -	int r;
> -
> -	r = in->ops->check_timings(in, vm);
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return r;
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static int tpd_read_edid(struct omap_dss_device *dssdev,
>  		u8 *edid, int len)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
>  		return -ENODEV;
>  
> -	return in->ops->hdmi.read_edid(in, edid, len);
> +	return src->ops->hdmi.read_edid(src, edid, len);
>  }
>  
>  static bool tpd_detect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
>  
> -	if (!connected && in->ops->hdmi.lost_hotplug)
> -		in->ops->hdmi.lost_hotplug(in);
> +	if (!connected && src->ops->hdmi.lost_hotplug)
> +		src->ops->hdmi.lost_hotplug(src);
>  	return connected;
>  }
>  
> @@ -205,19 +197,17 @@ static void tpd_disable_hpd(struct omap_dss_device *dssdev)
>  static int tpd_set_infoframe(struct omap_dss_device *dssdev,
>  		const struct hdmi_avi_infoframe *avi)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->hdmi.set_infoframe(in, avi);
> +	return src->ops->hdmi.set_infoframe(src, avi);
>  }
>  
>  static int tpd_set_hdmi_mode(struct omap_dss_device *dssdev,
>  		bool hdmi_mode)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->hdmi.set_hdmi_mode(in, hdmi_mode);
> +	return src->ops->hdmi.set_hdmi_mode(src, hdmi_mode);
>  }
>  
>  static const struct omap_dss_device_ops tpd_ops = {
> @@ -262,7 +252,7 @@ static irqreturn_t tpd_hpd_isr(int irq, void *data)
>  
>  static int tpd_probe(struct platform_device *pdev)
>  {
> -	struct omap_dss_device *in, *dssdev;
> +	struct omap_dss_device *dssdev;
>  	struct panel_drv_data *ddata;
>  	int r;
>  	struct gpio_desc *gpio;
> @@ -311,8 +301,6 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->port_num = 1;
>  
> -	in = ddata->in;
> -
>  	r = omapdss_register_output(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register output\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 5d704cf0809f..32af5b11b448 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -23,7 +23,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -37,41 +36,37 @@ struct panel_drv_data {
>  
>  static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -80,15 +75,15 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
>  	r = regulator_enable(ddata->vcc_supply);
>  	if (r) {
> -		in->ops->disable(in);
> +		src->ops->disable(src);
>  		return r;
>  	}
>  
> @@ -103,7 +98,7 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
>  static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -113,7 +108,7 @@ static void panel_dpi_disable(struct omap_dss_device *dssdev)
>  	gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  	regulator_disable(ddata->vcc_supply);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -122,11 +117,11 @@ static void panel_dpi_set_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
> @@ -140,10 +135,9 @@ static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
>  static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
>  				   struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver panel_dpi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index be6c0c811e66..353510af58e7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -41,7 +41,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -142,11 +141,11 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  	u8 buf[1];
>  
> -	r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
> +	r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd, buf, 1);
>  
>  	if (r < 0)
>  		return r;
> @@ -158,29 +157,30 @@ 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 *in = ddata->in;
> -	return in->ops->dsi.dcs_write(in, ddata->channel, &dcs_cmd, 1);
> +	struct omap_dss_device *src = ddata->dssdev.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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	u8 buf[2] = { dcs_cmd, param };
>  
> -	return in->ops->dsi.dcs_write(in, ddata->channel, buf, 2);
> +	return src->ops->dsi.dcs_write(src, ddata->channel, buf, 2);
>  }
>  
>  static int dsicm_sleep_in(struct panel_drv_data *ddata)
>  
>  {
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	u8 cmd;
>  	int r;
>  
>  	hw_guard_wait(ddata);
>  
>  	cmd = MIPI_DCS_ENTER_SLEEP_MODE;
> -	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, &cmd, 1);
> +	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, &cmd, 1);
>  	if (r)
>  		return r;
>  
> @@ -228,7 +228,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  	u16 x1 = x;
>  	u16 x2 = x + w - 1;
> @@ -242,7 +242,7 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	buf[3] = (x2 >> 8) & 0xff;
>  	buf[4] = (x2 >> 0) & 0xff;
>  
> -	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
> +	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf));
>  	if (r)
>  		return r;
>  
> @@ -252,11 +252,11 @@ static int dsicm_set_update_window(struct panel_drv_data *ddata,
>  	buf[3] = (y2 >> 8) & 0xff;
>  	buf[4] = (y2 >> 0) & 0xff;
>  
> -	r = in->ops->dsi.dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
> +	r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf));
>  	if (r)
>  		return r;
>  
> -	in->ops->dsi.bta_sync(in, ddata->channel);
> +	src->ops->dsi.bta_sync(src, ddata->channel);
>  
>  	return r;
>  }
> @@ -275,7 +275,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  
>  	if (ddata->ulps_enabled)
> @@ -290,7 +290,7 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
>  	if (ddata->ext_te_gpio)
>  		disable_irq(gpiod_to_irq(ddata->ext_te_gpio));
>  
> -	in->ops->dsi.disable(in, false, true);
> +	src->ops->dsi.disable(src, false, true);
>  
>  	ddata->ulps_enabled = true;
>  
> @@ -309,19 +309,19 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
>  
>  static int dsicm_exit_ulps(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  
>  	if (!ddata->ulps_enabled)
>  		return 0;
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
>  		goto err1;
>  	}
>  
> -	in->ops->dsi.enable_hs(in, ddata->channel, true);
> +	src->ops->dsi.enable_hs(src, ddata->channel, true);
>  
>  	r = _dsicm_enable_te(ddata, true);
>  	if (r) {
> @@ -366,7 +366,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r = 0;
>  	int level;
>  
> @@ -381,13 +381,13 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops->dsi.bus_lock(in);
> +		src->ops->dsi.bus_lock(src);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
>  
> -		in->ops->dsi.bus_unlock(in);
> +		src->ops->dsi.bus_unlock(src);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -414,21 +414,21 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	u8 errors = 0;
>  	int r;
>  
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops->dsi.bus_lock(in);
> +		src->ops->dsi.bus_lock(src);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
>  					&errors);
>  
> -		in->ops->dsi.bus_unlock(in);
> +		src->ops->dsi.bus_unlock(src);
>  	} else {
>  		r = -ENODEV;
>  	}
> @@ -446,20 +446,20 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	u8 id1, id2, id3;
>  	int r;
>  
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops->dsi.bus_lock(in);
> +		src->ops->dsi.bus_lock(src);
>  
>  		r = dsicm_wake_up(ddata);
>  		if (!r)
>  			r = dsicm_get_id(ddata, &id1, &id2, &id3);
>  
> -		in->ops->dsi.bus_unlock(in);
> +		src->ops->dsi.bus_unlock(src);
>  	} else {
>  		r = -ENODEV;
>  	}
> @@ -478,7 +478,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	unsigned long t;
>  	int r;
>  
> @@ -489,14 +489,14 @@ static ssize_t dsicm_store_ulps(struct device *dev,
>  	mutex_lock(&ddata->lock);
>  
>  	if (ddata->enabled) {
> -		in->ops->dsi.bus_lock(in);
> +		src->ops->dsi.bus_lock(src);
>  
>  		if (t)
>  			r = dsicm_enter_ulps(ddata);
>  		else
>  			r = dsicm_wake_up(ddata);
>  
> -		in->ops->dsi.bus_unlock(in);
> +		src->ops->dsi.bus_unlock(src);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -528,7 +528,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	unsigned long t;
>  	int r;
>  
> @@ -541,9 +541,9 @@ static ssize_t dsicm_store_ulps_timeout(struct device *dev,
>  
>  	if (ddata->enabled) {
>  		/* dsicm_wake_up will restart the timer */
> -		in->ops->dsi.bus_lock(in);
> +		src->ops->dsi.bus_lock(src);
>  		r = dsicm_wake_up(ddata);
> -		in->ops->dsi.bus_unlock(in);
> +		src->ops->dsi.bus_unlock(src);
>  	}
>  
>  	mutex_unlock(&ddata->lock);
> @@ -603,7 +603,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	u8 id1, id2, id3;
>  	int r;
>  	struct omap_dss_dsi_config dsi_config = {
> @@ -635,7 +635,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  	}
>  
>  	if (ddata->pin_config.num_pins > 0) {
> -		r = in->ops->dsi.configure_pins(in, &ddata->pin_config);
> +		r = src->ops->dsi.configure_pins(src, &ddata->pin_config);
>  		if (r) {
>  			dev_err(&ddata->pdev->dev,
>  				"failed to configure DSI pins\n");
> @@ -643,13 +643,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  		}
>  	}
>  
> -	r = in->ops->dsi.set_config(in, &dsi_config);
> +	r = src->ops->dsi.set_config(src, &dsi_config);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
>  		goto err_vddi;
>  	}
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r) {
>  		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
>  		goto err_vddi;
> @@ -657,7 +657,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  	dsicm_hw_reset(ddata);
>  
> -	in->ops->dsi.enable_hs(in, ddata->channel, false);
> +	src->ops->dsi.enable_hs(src, ddata->channel, false);
>  
>  	r = dsicm_sleep_out(ddata);
>  	if (r)
> @@ -689,7 +689,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  	if (r)
>  		goto err;
>  
> -	r = in->ops->dsi.enable_video_output(in, ddata->channel);
> +	r = src->ops->dsi.enable_video_output(src, ddata->channel);
>  	if (r)
>  		goto err;
>  
> @@ -701,7 +701,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  		ddata->intro_printed = true;
>  	}
>  
> -	in->ops->dsi.enable_hs(in, ddata->channel, true);
> +	src->ops->dsi.enable_hs(src, ddata->channel, true);
>  
>  	return 0;
>  err:
> @@ -709,7 +709,7 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  	dsicm_hw_reset(ddata);
>  
> -	in->ops->dsi.disable(in, true, false);
> +	src->ops->dsi.disable(src, true, false);
>  err_vddi:
>  	if (ddata->vddi)
>  		regulator_disable(ddata->vddi);
> @@ -722,10 +722,10 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
>  
>  static void dsicm_power_off(struct panel_drv_data *ddata)
>  {
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  
> -	in->ops->dsi.disable_video_output(in, ddata->channel);
> +	src->ops->dsi.disable_video_output(src, ddata->channel);
>  
>  	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
>  	if (!r)
> @@ -737,7 +737,7 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
>  		dsicm_hw_reset(ddata);
>  	}
>  
> -	in->ops->dsi.disable(in, true, false);
> +	src->ops->dsi.disable(src, true, false);
>  
>  	if (ddata->vddi)
>  		regulator_disable(ddata->vddi);
> @@ -760,61 +760,59 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct device *dev = &ddata->pdev->dev;
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
>  		dev_err(dev, "Failed to connect to video source\n");
>  		goto err_connect;
>  	}
>  
> -	r = in->ops->dsi.request_vc(in, &ddata->channel);
> +	r = src->ops->dsi.request_vc(src, &ddata->channel);
>  	if (r) {
>  		dev_err(dev, "failed to get virtual channel\n");
>  		goto err_req_vc;
>  	}
>  
> -	r = in->ops->dsi.set_vc_id(in, ddata->channel, TCH);
> +	r = src->ops->dsi.set_vc_id(src, ddata->channel, TCH);
>  	if (r) {
>  		dev_err(dev, "failed to set VC_ID\n");
>  		goto err_vc_id;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  
>  err_vc_id:
> -	in->ops->dsi.release_vc(in, ddata->channel);
> +	src->ops->dsi.release_vc(src, ddata->channel);
>  err_req_vc:
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  err_connect:
> -	omap_dss_put_device(in);
> +	omap_dss_put_device(src);
>  	return r;
>  }
>  
>  static void dsicm_disconnect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	in->ops->dsi.release_vc(in, ddata->channel);
> -	omapdss_device_disconnect(in, dssdev);
> +	src->ops->dsi.release_vc(src, ddata->channel);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int dsicm_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(&ddata->pdev->dev, "enable\n");
> @@ -831,11 +829,11 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
>  		goto err;
>  	}
>  
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	r = dsicm_power_on(ddata);
>  
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  
>  	if (r)
>  		goto err;
> @@ -856,7 +854,7 @@ static int 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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(&ddata->pdev->dev, "disable\n");
> @@ -867,7 +865,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  
>  	dsicm_cancel_ulps_work(ddata);
>  
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	if (omapdss_device_is_enabled(dssdev)) {
>  		r = dsicm_wake_up(ddata);
> @@ -875,7 +873,7 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
>  			dsicm_power_off(ddata);
>  	}
>  
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  
> @@ -885,16 +883,16 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  
>  	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
> -	in->ops->dsi.bus_unlock(ddata->in);
> +	src->ops->dsi.bus_unlock(src);
>  }
>  
>  static irqreturn_t dsicm_te_isr(int irq, void *data)
>  {
>  	struct panel_drv_data *ddata = data;
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int old;
>  	int r;
>  
> @@ -903,7 +901,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
>  	if (old) {
>  		cancel_delayed_work(&ddata->te_timeout_work);
>  
> -		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
> +		r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb,
>  				ddata);
>  		if (r)
>  			goto err;
> @@ -912,7 +910,7 @@ static irqreturn_t dsicm_te_isr(int irq, void *data)
>  	return IRQ_HANDLED;
>  err:
>  	dev_err(&ddata->pdev->dev, "start update failed\n");
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  	return IRQ_HANDLED;
>  }
>  
> @@ -920,25 +918,25 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  
>  	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
>  
>  	atomic_set(&ddata->do_update, 0);
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  }
>  
>  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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
>  
>  	mutex_lock(&ddata->lock);
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	r = dsicm_wake_up(ddata);
>  	if (r)
> @@ -960,17 +958,17 @@ static int dsicm_update(struct omap_dss_device *dssdev,
>  				msecs_to_jiffies(250));
>  		atomic_set(&ddata->do_update, 1);
>  	} else {
> -		r = in->ops->dsi.update(in, ddata->channel, dsicm_framedone_cb,
> +		r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb,
>  				ddata);
>  		if (r)
>  			goto err;
>  	}
>  
> -	/* note: no bus_unlock here. unlock is in framedone_cb */
> +	/* note: no bus_unlock here. unlock is src framedone_cb */
>  	mutex_unlock(&ddata->lock);
>  	return 0;
>  err:
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  	mutex_unlock(&ddata->lock);
>  	return r;
>  }
> @@ -978,13 +976,13 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(&ddata->pdev->dev, "sync\n");
>  
>  	mutex_lock(&ddata->lock);
> -	in->ops->dsi.bus_lock(in);
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_lock(src);
> +	src->ops->dsi.bus_unlock(src);
>  	mutex_unlock(&ddata->lock);
>  
>  	dev_dbg(&ddata->pdev->dev, "sync done\n");
> @@ -994,7 +992,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 *in = ddata->in;
> +	struct omap_dss_device *src = ddata->dssdev.src;
>  	int r;
>  
>  	if (enable)
> @@ -1003,7 +1001,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
>  		r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
>  
>  	if (!ddata->ext_te_gpio)
> -		in->ops->dsi.enable_te(in, enable);
> +		src->ops->dsi.enable_te(src, enable);
>  
>  	/* possible panel bug */
>  	msleep(100);
> @@ -1014,7 +1012,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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	mutex_lock(&ddata->lock);
> @@ -1022,7 +1020,7 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
>  	if (ddata->te_enabled == enable)
>  		goto end;
>  
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	if (ddata->enabled) {
>  		r = dsicm_wake_up(ddata);
> @@ -1036,13 +1034,13 @@ static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
>  
>  	ddata->te_enabled = enable;
>  
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  end:
>  	mutex_unlock(&ddata->lock);
>  
>  	return 0;
>  err:
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  	mutex_unlock(&ddata->lock);
>  
>  	return r;
> @@ -1065,7 +1063,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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  	int first = 1;
>  	int plen;
> @@ -1084,7 +1082,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  	size = min((u32)w * h * 3,
>  		   ddata->vm.hactive * ddata->vm.vactive * 3);
>  
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	r = dsicm_wake_up(ddata);
>  	if (r)
> @@ -1100,7 +1098,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  
>  	dsicm_set_update_window(ddata, x, y, w, h);
>  
> -	r = in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, plen);
> +	r = src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, plen);
>  	if (r)
>  		goto err2;
>  
> @@ -1108,7 +1106,7 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  		u8 dcs_cmd = first ? 0x2e : 0x3e;
>  		first = 0;
>  
> -		r = in->ops->dsi.dcs_read(in, ddata->channel, dcs_cmd,
> +		r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd,
>  				buf + buf_used, size - buf_used);
>  
>  		if (r < 0) {
> @@ -1134,9 +1132,9 @@ static int dsicm_memory_read(struct omap_dss_device *dssdev,
>  	r = buf_used;
>  
>  err3:
> -	in->ops->dsi.set_max_rx_packet_size(in, ddata->channel, 1);
> +	src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, 1);
>  err2:
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  err1:
>  	mutex_unlock(&ddata->lock);
>  	return r;
> @@ -1147,7 +1145,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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	mutex_lock(&ddata->lock);
>  
> @@ -1156,11 +1154,11 @@ static void dsicm_ulps_work(struct work_struct *work)
>  		return;
>  	}
>  
> -	in->ops->dsi.bus_lock(in);
> +	src->ops->dsi.bus_lock(src);
>  
>  	dsicm_enter_ulps(ddata);
>  
> -	in->ops->dsi.bus_unlock(in);
> +	src->ops->dsi.bus_unlock(src);
>  	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 50b74e7351e9..5bea3eadd7d2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -45,7 +45,6 @@ static const struct videomode lb035q02_vm = {
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct spi_device *spi;
>  
> @@ -119,42 +118,39 @@ static void init_lb035q02_panel(struct spi_device *spi)
>  static int lb035q02_connect(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
>  	init_lb035q02_panel(ddata->spi);
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void lb035q02_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int lb035q02_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -163,9 +159,9 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -180,7 +176,7 @@ static int lb035q02_enable(struct omap_dss_device *dssdev)
>  static void lb035q02_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -188,7 +184,7 @@ static void lb035q02_disable(struct omap_dss_device *dssdev)
>  	if (ddata->enable_gpio)
>  		gpiod_set_value_cansleep(ddata->enable_gpio, 0);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -197,11 +193,11 @@ static void lb035q02_set_timings(struct omap_dss_device *dssdev,
>  				 struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void lb035q02_get_timings(struct omap_dss_device *dssdev,
> @@ -215,10 +211,9 @@ static void lb035q02_get_timings(struct omap_dss_device *dssdev,
>  static int lb035q02_check_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver lb035q02_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 769cba6c99ef..d03339034f18 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -21,7 +21,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device	dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -114,41 +113,37 @@ static int init_nec_8048_wvga_lcd(struct spi_device *spi)
>  
>  static int nec_8048_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void nec_8048_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int nec_8048_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -157,9 +152,9 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -174,7 +169,7 @@ static int nec_8048_enable(struct omap_dss_device *dssdev)
>  static void nec_8048_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -182,7 +177,7 @@ static void nec_8048_disable(struct omap_dss_device *dssdev)
>  	if (gpio_is_valid(ddata->res_gpio))
>  		gpio_set_value_cansleep(ddata->res_gpio, 0);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -191,11 +186,11 @@ static void nec_8048_set_timings(struct omap_dss_device *dssdev,
>  				 struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void nec_8048_get_timings(struct omap_dss_device *dssdev,
> @@ -209,10 +204,9 @@ static void nec_8048_get_timings(struct omap_dss_device *dssdev,
>  static int nec_8048_check_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver nec_8048_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 629ea2d93575..93f1a0e89861 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -21,7 +21,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  	struct regulator *vcc;
>  
>  	struct videomode vm;
> @@ -60,41 +59,37 @@ static const struct videomode sharp_ls_vm = {
>  
>  static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -103,7 +98,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
>  	if (ddata->vcc) {
>  		r = regulator_enable(ddata->vcc);
> @@ -111,7 +106,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  			return r;
>  	}
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r) {
>  		regulator_disable(ddata->vcc);
>  		return r;
> @@ -134,7 +129,7 @@ static int sharp_ls_enable(struct omap_dss_device *dssdev)
>  static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -149,7 +144,7 @@ static void sharp_ls_disable(struct omap_dss_device *dssdev)
>  
>  	msleep(100);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	if (ddata->vcc)
>  		regulator_disable(ddata->vcc);
> @@ -161,11 +156,11 @@ static void sharp_ls_set_timings(struct omap_dss_device *dssdev,
>  				 struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
> @@ -179,10 +174,9 @@ static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
>  static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver sharp_ls_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 75cb672b1161..ce32ad974ae8 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -64,7 +64,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device	dssdev;
> -	struct omap_dss_device *in;
>  
>  	int reset_gpio;
>  
> @@ -509,48 +508,44 @@ static const struct attribute_group bldev_attr_group = {
>  
>  static int acx565akm_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void acx565akm_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r) {
>  		pr_err("%s sdi enable failed\n", __func__);
>  		return r;
> @@ -591,7 +586,7 @@ 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 *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	dev_dbg(dssdev->dev, "%s\n", __func__);
>  
> @@ -615,7 +610,7 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
>  	/* FIXME need to tweak this delay */
>  	msleep(100);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  }
>  
>  static int acx565akm_enable(struct omap_dss_device *dssdev)
> @@ -662,11 +657,11 @@ static void acx565akm_set_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void acx565akm_get_timings(struct omap_dss_device *dssdev,
> @@ -680,10 +675,9 @@ static void acx565akm_get_timings(struct omap_dss_device *dssdev,
>  static int acx565akm_check_timings(struct omap_dss_device *dssdev,
>  				   struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver acx565akm_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 2491c4876dd4..3224502016f4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -33,7 +33,6 @@
>  
>  struct panel_drv_data {
>  	struct omap_dss_device dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -168,41 +167,37 @@ enum jbt_register {
>  
>  static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -211,9 +206,9 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -310,7 +305,7 @@ static int td028ttec1_panel_enable(struct omap_dss_device *dssdev)
>  static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
> @@ -322,7 +317,7 @@ static void td028ttec1_panel_disable(struct omap_dss_device *dssdev)
>  	jbt_ret_write_0(ddata, JBT_REG_SLEEP_IN);
>  	jbt_reg_write_1(ddata, JBT_REG_POWER_ON_OFF, 0x00);
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
>  }
> @@ -331,11 +326,11 @@ static void td028ttec1_panel_set_timings(struct omap_dss_device *dssdev,
>  					 struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
> @@ -349,10 +344,9 @@ static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
>  static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
>  					  struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver td028ttec1_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index df3d8103823d..e3212e476b91 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -54,7 +54,6 @@ static const u16 tpo_td043_def_gamma[12] = {
>  
>  struct panel_drv_data {
>  	struct omap_dss_device	dssdev;
> -	struct omap_dss_device *in;
>  
>  	struct videomode vm;
>  
> @@ -339,41 +338,37 @@ static void tpo_td043_power_off(struct panel_drv_data *ddata)
>  
>  static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in;
> +	struct omap_dss_device *src;
>  	int r;
>  
> -	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(in)) {
> +	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> +		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(in, dssdev);
> +	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(in);
> +		omap_dss_put_device(src);
>  		return r;
>  	}
>  
> -	ddata->in = in;
>  	return 0;
>  }
>  
>  static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	omapdss_device_disconnect(in, dssdev);
> +	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(in);
> -	ddata->in = NULL;
> +	omap_dss_put_device(src);
>  }
>  
>  static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  	int r;
>  
>  	if (!omapdss_device_is_connected(dssdev))
> @@ -382,9 +377,9 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	if (omapdss_device_is_enabled(dssdev))
>  		return 0;
>  
> -	in->ops->set_timings(in, &ddata->vm);
> +	src->ops->set_timings(src, &ddata->vm);
>  
> -	r = in->ops->enable(in);
> +	r = src->ops->enable(src);
>  	if (r)
>  		return r;
>  
> @@ -395,7 +390,7 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  	if (!ddata->spi_suspended) {
>  		r = tpo_td043_power_on(ddata);
>  		if (r) {
> -			in->ops->disable(in);
> +			src->ops->disable(src);
>  			return r;
>  		}
>  	}
> @@ -408,12 +403,12 @@ static int tpo_td043_enable(struct omap_dss_device *dssdev)
>  static void tpo_td043_disable(struct omap_dss_device *dssdev)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	if (!omapdss_device_is_enabled(dssdev))
>  		return;
>  
> -	in->ops->disable(in);
> +	src->ops->disable(src);
>  
>  	if (!ddata->spi_suspended)
>  		tpo_td043_power_off(ddata);
> @@ -425,11 +420,11 @@ static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
>  				  struct videomode *vm)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
>  	ddata->vm = *vm;
>  
> -	in->ops->set_timings(in, vm);
> +	src->ops->set_timings(src, vm);
>  }
>  
>  static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
> @@ -443,10 +438,9 @@ static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
>  static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
>  				   struct videomode *vm)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *src = dssdev->src;
>  
> -	return in->ops->check_timings(in, vm);
> +	return src->ops->check_timings(src, vm);
>  }
>  
>  static const struct omap_dss_driver tpo_td043_ops = {
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation
  2018-05-26 17:24 ` [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation Laurent Pinchart
@ 2018-06-10 20:08   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:08 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:42PM +0300, Laurent Pinchart wrote:
> The DSI debugfs regs and irqs show handlers received a pointer to the
> DSI private data. There's no need to look it up from the list of DSS
> outputs. Use the pointer directly, this allows simplifying the
> implementation of the handlers.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dsi.c | 63 +++++++++------------------------------
>  1 file changed, 14 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 4427389e0049..9952803b58d2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -1518,8 +1518,9 @@ void dsi_dump_clocks(struct seq_file *s)
>  }
>  
>  #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> -static void dsi_dump_dsi_irqs(struct dsi_data *dsi, struct seq_file *s)
> +static int dsi_dump_dsi_irqs(struct seq_file *s, void *p)
>  {
> +	struct dsi_data *dsi = p;
>  	unsigned long flags;
>  	struct dsi_irq_stats stats;
>  
> @@ -1603,33 +1604,20 @@ static void dsi_dump_dsi_irqs(struct dsi_data *dsi, struct seq_file *s)
>  	PIS(ULPSACTIVENOT_ALL0);
>  	PIS(ULPSACTIVENOT_ALL1);
>  #undef PIS
> -}
> -
> -static int dsi1_dump_irqs(struct seq_file *s, void *p)
> -{
> -	struct dsi_data *dsi = dsi_get_dsi_from_id(0);
>  
> -	dsi_dump_dsi_irqs(dsi, s);
> -	return 0;
> -}
> -
> -static int dsi2_dump_irqs(struct seq_file *s, void *p)
> -{
> -	struct dsi_data *dsi = dsi_get_dsi_from_id(1);
> -
> -	dsi_dump_dsi_irqs(dsi, s);
>  	return 0;
>  }
>  #endif
>  
> -static void dsi_dump_dsi_regs(struct dsi_data *dsi, struct seq_file *s)
> +static int dsi_dump_dsi_regs(struct seq_file *s, void *p)
>  {
> -#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r))
> +	struct dsi_data *dsi = p;
>  
>  	if (dsi_runtime_get(dsi))
> -		return;
> +		return 0;
>  	dsi_enable_scp_clk(dsi);
>  
> +#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r))
>  	DUMPREG(DSI_REVISION);
>  	DUMPREG(DSI_SYSCONFIG);
>  	DUMPREG(DSI_SYSSTATUS);
> @@ -1699,25 +1687,11 @@ static void dsi_dump_dsi_regs(struct dsi_data *dsi, struct seq_file *s)
>  	DUMPREG(DSI_PLL_GO);
>  	DUMPREG(DSI_PLL_CONFIGURATION1);
>  	DUMPREG(DSI_PLL_CONFIGURATION2);
> +#undef DUMPREG
>  
>  	dsi_disable_scp_clk(dsi);
>  	dsi_runtime_put(dsi);
> -#undef DUMPREG
> -}
> -
> -static int dsi1_dump_regs(struct seq_file *s, void *p)
> -{
> -	struct dsi_data *dsi = dsi_get_dsi_from_id(0);
>  
> -	dsi_dump_dsi_regs(dsi, s);
> -	return 0;
> -}
> -
> -static int dsi2_dump_regs(struct seq_file *s, void *p)
> -{
> -	struct dsi_data *dsi = dsi_get_dsi_from_id(1);
> -
> -	dsi_dump_dsi_regs(dsi, s);
>  	return 0;
>  }
>  
> @@ -5305,6 +5279,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	struct dsi_data *dsi;
>  	struct resource *dsi_mem;
>  	struct resource *res;
> +	char name[10];
>  
>  	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
>  	if (!dsi)
> @@ -5443,23 +5418,13 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  
>  	dsi_runtime_put(dsi);
>  
> -	if (dsi->module_id == 0)
> -		dsi->debugfs.regs = dss_debugfs_create_file(dss, "dsi1_regs",
> -							    dsi1_dump_regs,
> -							    &dsi);
> -	else
> -		dsi->debugfs.regs = dss_debugfs_create_file(dss, "dsi2_regs",
> -							    dsi2_dump_regs,
> -							    &dsi);
> +	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
> +	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_regs, &dsi);
>  #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> -	if (dsi->module_id == 0)
> -		dsi->debugfs.irqs = dss_debugfs_create_file(dss, "dsi1_irqs",
> -							    dsi1_dump_irqs,
> -							    &dsi);
> -	else
> -		dsi->debugfs.irqs = dss_debugfs_create_file(dss, "dsi2_irqs",
> -							    dsi2_dump_irqs,
> -							    &dsi);
> +	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
> +	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_irqs, &dsi);
>  #endif
>  
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files
  2018-05-26 17:24 ` [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files Laurent Pinchart
@ 2018-06-10 20:09   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:09 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:43PM +0300, Laurent Pinchart wrote:
> The DSI clocks are dumped in the DSS-level debugfs clocks file. This
> complicates the implementation as the DSI private data has to be looked
> up through the outputs list. Simplify it by creating two debugfs files,
> dsi1_clks and dsi2_clks, to dump the DSI clocks.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dsi.c | 43 ++++++++-------------------------------
>  drivers/gpu/drm/omapdrm/dss/dss.c |  3 ---
>  drivers/gpu/drm/omapdrm/dss/dss.h |  2 --
>  3 files changed, 9 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 9952803b58d2..adfda2a63ada 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -403,6 +403,7 @@ struct dsi_data {
>  	struct {
>  		struct dss_debugfs_entry *irqs;
>  		struct dss_debugfs_entry *regs;
> +		struct dss_debugfs_entry *clks;
>  	} debugfs;
>  
>  #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> @@ -442,27 +443,6 @@ static inline struct dsi_data *to_dsi_data(struct omap_dss_device *dssdev)
>  	return dev_get_drvdata(dssdev->dev);
>  }
>  
> -static struct dsi_data *dsi_get_dsi_from_id(int module)
> -{
> -	struct omap_dss_device *out;
> -	enum omap_dss_output_id	id;
> -
> -	switch (module) {
> -	case 0:
> -		id = OMAP_DSS_OUTPUT_DSI1;
> -		break;
> -	case 1:
> -		id = OMAP_DSS_OUTPUT_DSI2;
> -		break;
> -	default:
> -		return NULL;
> -	}
> -
> -	out = omap_dss_get_output(id);
> -
> -	return out ? to_dsi_data(out) : NULL;
> -}
> -
>  static inline void dsi_write_reg(struct dsi_data *dsi,
>  				 const struct dsi_reg idx, u32 val)
>  {
> @@ -1448,8 +1428,9 @@ static void dsi_pll_disable(struct dss_pll *pll)
>  	dsi_pll_uninit(dsi, true);
>  }
>  
> -static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
> +static int dsi_dump_dsi_clocks(struct seq_file *s, void *p)
>  {
> +	struct dsi_data *dsi = p;
>  	struct dss_pll_clock_info *cinfo = &dsi->pll.cinfo;
>  	enum dss_clk_source dispc_clk_src, dsi_clk_src;
>  	int dsi_module = dsi->module_id;
> @@ -1459,7 +1440,7 @@ static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
>  	dsi_clk_src = dss_get_dsi_clk_source(dsi->dss, dsi_module);
>  
>  	if (dsi_runtime_get(dsi))
> -		return;
> +		return 0;
>  
>  	seq_printf(s,	"- DSI%d PLL -\n", dsi_module + 1);
>  
> @@ -1503,18 +1484,8 @@ static void dsi_dump_dsi_clocks(struct dsi_data *dsi, struct seq_file *s)
>  	seq_printf(s,	"LP_CLK\t\t%lu\n", dsi->current_lp_cinfo.lp_clk);
>  
>  	dsi_runtime_put(dsi);
> -}
> -
> -void dsi_dump_clocks(struct seq_file *s)
> -{
> -	struct dsi_data *dsi;
> -	int i;
>  
> -	for  (i = 0; i < MAX_NUM_DSI; i++) {
> -		dsi = dsi_get_dsi_from_id(i);
> -		if (dsi)
> -			dsi_dump_dsi_clocks(dsi, s);
> -	}
> +	return 0;
>  }
>  
>  #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> @@ -5426,6 +5397,9 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
>  						    dsi_dump_dsi_irqs, &dsi);
>  #endif
> +	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
> +	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_clocks, &dsi);
>  
>  	return 0;
>  
> @@ -5442,6 +5416,7 @@ static void dsi_unbind(struct device *dev, struct device *master, void *data)
>  {
>  	struct dsi_data *dsi = dev_get_drvdata(dev);
>  
> +	dss_debugfs_remove_file(dsi->debugfs.clks);
>  	dss_debugfs_remove_file(dsi->debugfs.irqs);
>  	dss_debugfs_remove_file(dsi->debugfs.regs);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index 59b238f03437..8e7646181302 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -394,9 +394,6 @@ static int dss_debug_dump_clocks(struct seq_file *s, void *p)
>  
>  	dss_dump_clocks(dss, s);
>  	dispc_dump_clocks(dss->dispc, s);
> -#ifdef CONFIG_OMAP2_DSS_DSI
> -	dsi_dump_clocks(s);
> -#endif
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
> index 4f1eb7f5b922..a4514843e925 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -373,8 +373,6 @@ static inline void sdi_uninit_port(struct device_node *port)
>  
>  #ifdef CONFIG_OMAP2_DSS_DSI
>  
> -void dsi_dump_clocks(struct seq_file *s);
> -
>  void dsi_irq_handler(void);
>  
>  #endif
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 26/60] drm/omap: dss: Remove output devices list
  2018-05-26 17:24 ` [PATCH v2 26/60] drm/omap: dss: Remove output devices list Laurent Pinchart
@ 2018-06-10 20:12   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:12 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:44PM +0300, Laurent Pinchart wrote:
> The output devices list isn't used anymore, all output devices are
> accessed through the global devices list. Remove it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  9 ++-----
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  8 ++----
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  8 ++----
>  drivers/gpu/drm/omapdrm/dss/base.c                 |  2 ++
>  drivers/gpu/drm/omapdrm/dss/dpi.c                  |  4 +--
>  drivers/gpu/drm/omapdrm/dss/dsi.c                  |  4 +--
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                |  4 +--
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                |  4 +--
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              |  5 ----
>  drivers/gpu/drm/omapdrm/dss/output.c               | 29 ----------------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c                  |  4 +--
>  drivers/gpu/drm/omapdrm/dss/venc.c                 |  4 +--
>  12 files changed, 20 insertions(+), 65 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index c9c744e0c92e..c1ed4e2ce8f3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -146,7 +146,6 @@ static int opa362_probe(struct platform_device *pdev)
>  	struct panel_drv_data *ddata;
>  	struct omap_dss_device *dssdev;
>  	struct gpio_desc *gpio;
> -	int r;
>  
>  	dev_dbg(&pdev->dev, "probe\n");
>  
> @@ -169,11 +168,7 @@ static int opa362_probe(struct platform_device *pdev)
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
>  
> -	r = omapdss_register_output(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register output\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -183,7 +178,7 @@ static int __exit opa362_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_output(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
>  	if (omapdss_device_is_enabled(dssdev))
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index f568e53a9104..b360a68f074d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -192,11 +192,7 @@ static int tfp410_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->port_num = 1;
>  
> -	r = omapdss_register_output(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register output\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -206,7 +202,7 @@ static int __exit tfp410_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_output(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
>  	if (omapdss_device_is_enabled(dssdev))
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 7bbe794e9d21..efeae1401490 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -301,11 +301,7 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->port_num = 1;
>  
> -	r = omapdss_register_output(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register output\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -315,7 +311,7 @@ static int __exit tpd_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_output(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
>  	if (omapdss_device_is_enabled(dssdev))
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 810dcddded8a..7cd3076c2140 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -63,6 +63,7 @@ void omapdss_device_register(struct omap_dss_device *dssdev)
>  	list_add_tail(&dssdev->list, &omapdss_devices_list);
>  	mutex_unlock(&omapdss_devices_lock);
>  }
> +EXPORT_SYMBOL_GPL(omapdss_device_register);
>  
>  void omapdss_device_unregister(struct omap_dss_device *dssdev)
>  {
> @@ -70,6 +71,7 @@ void omapdss_device_unregister(struct omap_dss_device *dssdev)
>  	list_del(&dssdev->list);
>  	mutex_unlock(&omapdss_devices_lock);
>  }
> +EXPORT_SYMBOL_GPL(omapdss_device_unregister);
>  
>  static bool omapdss_device_is_registered(struct device_node *node)
>  {
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index c13feaf8b086..3fbed21d69a6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -718,7 +718,7 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  	out->ops = &dpi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void dpi_uninit_output_port(struct device_node *port)
> @@ -726,7 +726,7 @@ static void dpi_uninit_output_port(struct device_node *port)
>  	struct dpi_data *dpi = port->data;
>  	struct omap_dss_device *out = &dpi->output;
>  
> -	omapdss_unregister_output(out);
> +	omapdss_device_unregister(out);
>  }
>  
>  int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index adfda2a63ada..90820402e81f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4995,14 +4995,14 @@ static void dsi_init_output(struct dsi_data *dsi)
>  	out->ops = &dsi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void dsi_uninit_output(struct dsi_data *dsi)
>  {
>  	struct omap_dss_device *out = &dsi->output;
>  
> -	omapdss_unregister_output(out);
> +	omapdss_device_unregister(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 7e5474e87c11..fa818033f3f3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -565,14 +565,14 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void hdmi_uninit_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> -	omapdss_unregister_output(out);
> +	omapdss_device_unregister(out);
>  }
>  
>  static int hdmi_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 86b18ccb8d24..ef4a48f397d2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -556,14 +556,14 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void hdmi_uninit_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> -	omapdss_unregister_output(out);
> +	omapdss_device_unregister(out);
>  }
>  
>  static int hdmi_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 0033adf534d3..26abc09f3d4a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -416,8 +416,6 @@ struct omap_dss_device {
>  
>  	/* OMAP DSS output specific fields */
>  
> -	struct list_head output_list;
> -
>  	/* DISPC channel for this output */
>  	enum omap_channel dispc_channel;
>  	bool dispc_channel_connected;
> @@ -510,9 +508,6 @@ int omap_dss_get_num_overlay_managers(void);
>  
>  int omap_dss_get_num_overlays(void);
>  
> -int omapdss_register_output(struct omap_dss_device *output);
> -void omapdss_unregister_output(struct omap_dss_device *output);
> -struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
>  int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 6abdb615a4c0..e62da96f83af 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -23,7 +23,6 @@
>  
>  #include "omapdss.h"
>  
> -static LIST_HEAD(output_list);
>  static DEFINE_MUTEX(output_lock);
>  
>  int omapdss_output_set_device(struct omap_dss_device *out,
> @@ -88,34 +87,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
>  }
>  EXPORT_SYMBOL(omapdss_output_unset_device);
>  
> -int omapdss_register_output(struct omap_dss_device *out)
> -{
> -	list_add_tail(&out->output_list, &output_list);
> -	omapdss_device_register(out);
> -	return 0;
> -}
> -EXPORT_SYMBOL(omapdss_register_output);
> -
> -void omapdss_unregister_output(struct omap_dss_device *out)
> -{
> -	list_del(&out->output_list);
> -	omapdss_device_unregister(out);
> -}
> -EXPORT_SYMBOL(omapdss_unregister_output);
> -
> -struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
> -{
> -	struct omap_dss_device *out;
> -
> -	list_for_each_entry(out, &output_list, output_list) {
> -		if (out->id == id)
> -			return out;
> -	}
> -
> -	return NULL;
> -}
> -EXPORT_SYMBOL(omap_dss_get_output);
> -
>  struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
>  {
>  	while (dssdev->src)
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 77a8f7d86f7a..76842ca4a619 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -328,12 +328,12 @@ static void sdi_init_output(struct sdi_device *sdi)
>  	out->ops = &sdi_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void sdi_uninit_output(struct sdi_device *sdi)
>  {
> -	omapdss_unregister_output(&sdi->output);
> +	omapdss_device_unregister(&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 8ea622d02b5c..bed7fcb35d89 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -768,12 +768,12 @@ static void venc_init_output(struct venc_device *venc)
>  	out->ops = &venc_ops;
>  	out->owner = THIS_MODULE;
>  
> -	omapdss_register_output(out);
> +	omapdss_device_register(out);
>  }
>  
>  static void venc_uninit_output(struct venc_device *venc)
>  {
> -	omapdss_unregister_output(&venc->output);
> +	omapdss_device_unregister(&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] 127+ messages in thread

* Re: [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display
  2018-05-26 17:24 ` [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display Laurent Pinchart
@ 2018-06-10 20:17   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:17 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:45PM +0300, Laurent Pinchart wrote:
> The macro iterates over displays only, rename it accordingly.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dss.c     | 2 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 +-
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 4 ++--
>  3 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index 8e7646181302..5b7613ff2f2e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -1557,7 +1557,7 @@ static void dss_shutdown(struct platform_device *pdev)
>  
>  	DSSDBG("shutdown\n");
>  
> -	for_each_dss_dev(dssdev) {
> +	for_each_dss_display(dssdev) {
>  		if (!dssdev->driver)
>  			continue;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 26abc09f3d4a..a6ddc881ea72 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -501,7 +501,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
>  void omap_dss_put_device(struct omap_dss_device *dssdev);
> -#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
> +#define for_each_dss_display(d) while ((d = omap_dss_get_next_device(d)) != NULL)
>  struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
>  
>  int omap_dss_get_num_overlay_managers(void);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index f1df5be198a8..21ca4002ac38 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -188,7 +188,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  	if (!omapdss_stack_is_ready())
>  		return -EPROBE_DEFER;
>  
> -	for_each_dss_dev(dssdev) {
> +	for_each_dss_display(dssdev) {
>  		r = omapdss_device_connect(dssdev, NULL);
>  		if (r == -EPROBE_DEFER) {
>  			omap_dss_put_device(dssdev);
> @@ -200,7 +200,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  			omap_dss_get_device(dssdev);
>  			priv->dssdevs[priv->num_dssdevs++] = dssdev;
>  			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
> -				/* To balance the 'for_each_dss_dev' loop */
> +				/* To balance the 'for_each_dss_display' loop */
>  				omap_dss_put_device(dssdev);
>  				break;
>  			}
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic
  2018-05-26 17:24 ` [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic Laurent Pinchart
@ 2018-06-10 20:17   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:17 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:46PM +0300, Laurent Pinchart wrote:
> Despite its name, the omap_dss_get_next_device() function operates on
> display devices only. Make it more generic by allowing operation on all
> devices, with a parameter to specify the device type.
> 
> While at it rename the function to omapdss_device_get_next() to match
> the naming of the other functions operating on struct omap_dss_device.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 52 +++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/omapdrm/dss/display.c | 49 ---------------------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  6 ++--
>  3 files changed, 56 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 7cd3076c2140..f7b8958f15bc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -104,6 +104,58 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  	return NULL;
>  }
>  
> +/*
> + * Search for the next device starting at @from. If display_only is true, skip
> + * non-display devices. 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,
> +						bool display_only)
> +{
> +	struct omap_dss_device *dssdev;
> +	struct list_head *list;
> +
> +	mutex_lock(&omapdss_devices_lock);
> +
> +	if (list_empty(&omapdss_devices_list)) {
> +		dssdev = NULL;
> +		goto done;
> +	}
> +
> +	/*
> +	 * Start from the from entry if given or from omapdss_devices_list
> +	 * otherwise.
> +	 */
> +	list = from ? &from->list : &omapdss_devices_list;
> +
> +	list_for_each_entry(dssdev, list, list) {
> +		/*
> +		 * Stop if we reach the omapdss_devices_list, that's the end of
> +		 * the list.
> +		 */
> +		if (&dssdev->list == &omapdss_devices_list) {
> +			dssdev = NULL;
> +			goto done;
> +		}
> +
> +		/* Filter out non-display entries if display_only is set. */
> +		if (!display_only || dssdev->driver)
> +			goto done;
> +	}
> +
> +	dssdev = NULL;
> +
> +done:
> +	if (from)
> +		omap_dss_put_device(from);
> +	if (dssdev)
> +		omap_dss_get_device(dssdev);
> +
> +	mutex_unlock(&omapdss_devices_lock);
> +	return dssdev;
> +}
> +EXPORT_SYMBOL(omapdss_device_get_next);
> +
>  int omapdss_device_connect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 383512c8a466..0c94d5208398 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -92,52 +92,3 @@ void omap_dss_put_device(struct omap_dss_device *dssdev)
>  	module_put(dssdev->owner);
>  }
>  EXPORT_SYMBOL(omap_dss_put_device);
> -
> -/*
> - * ref count of the found device is incremented.
> - * ref count of from-device is decremented.
> - */
> -struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from)
> -{
> -	struct list_head *l;
> -	struct omap_dss_device *dssdev;
> -
> -	mutex_lock(&panel_list_mutex);
> -
> -	if (list_empty(&panel_list)) {
> -		dssdev = NULL;
> -		goto out;
> -	}
> -
> -	if (from == NULL) {
> -		dssdev = list_first_entry(&panel_list, struct omap_dss_device,
> -				panel_list);
> -		omap_dss_get_device(dssdev);
> -		goto out;
> -	}
> -
> -	omap_dss_put_device(from);
> -
> -	list_for_each(l, &panel_list) {
> -		dssdev = list_entry(l, struct omap_dss_device, panel_list);
> -		if (dssdev == from) {
> -			if (list_is_last(l, &panel_list)) {
> -				dssdev = NULL;
> -				goto out;
> -			}
> -
> -			dssdev = list_entry(l->next, struct omap_dss_device,
> -					panel_list);
> -			omap_dss_get_device(dssdev);
> -			goto out;
> -		}
> -	}
> -
> -	WARN(1, "'from' dssdev not found\n");
> -
> -	dssdev = NULL;
> -out:
> -	mutex_unlock(&panel_list_mutex);
> -	return dssdev;
> -}
> -EXPORT_SYMBOL(omap_dss_get_next_device);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index a6ddc881ea72..94a3f98bdd3d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -489,11 +489,15 @@ static inline bool omapdss_is_initialized(void)
>  
>  int omapdss_register_display(struct omap_dss_device *dssdev);
>  void omapdss_unregister_display(struct omap_dss_device *dssdev);
> +#define for_each_dss_display(d) \
> +	while ((d = omapdss_device_get_next(d, true)) != NULL)
>  
>  void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(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,
> +						bool display_only);
>  int omapdss_device_connect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst);
>  void omapdss_device_disconnect(struct omap_dss_device *src,
> @@ -501,8 +505,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
>  void omap_dss_put_device(struct omap_dss_device *dssdev);
> -#define for_each_dss_display(d) while ((d = omap_dss_get_next_device(d)) != NULL)
> -struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
>  
>  int omap_dss_get_num_overlay_managers(void);
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display()
  2018-05-26 17:24 ` [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display() Laurent Pinchart
@ 2018-06-10 20:24   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:24 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:47PM +0300, Laurent Pinchart wrote:
> Split the function into omapdss_display_init() to perform
> display-specific initialization of the omap_dss_device, and
> omapdss_register_display() to register the device. The latter will then
> be replaced by more generic registration.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/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/panel-dpi.c                | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c | 1 +
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     | 1 +
>  drivers/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/display.c                       | 6 +++++-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                       | 1 +
>  13 files changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index f579bd9ce7cb..fb23fae7fbf4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -171,6 +171,7 @@ static int tvc_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 48dbb9df76b5..5333fb166c83 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -390,6 +390,7 @@ static int dvic_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 4acb53788862..2c5e8cf70c9f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -350,6 +350,7 @@ static int hdmic_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 32af5b11b448..87f11618e85f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -218,6 +218,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 353510af58e7..94275fc931be 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1328,6 +1328,7 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
>  		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 5bea3eadd7d2..88c075414b7c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -270,6 +270,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&spi->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index d03339034f18..fafb3e43f390 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -293,6 +293,7 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&spi->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 93f1a0e89861..bb28994cedc0 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -269,6 +269,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index ce32ad974ae8..46ede08ce65b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -800,6 +800,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&spi->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 3224502016f4..a76387dfc0e2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -394,6 +394,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&spi->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index e3212e476b91..dbb1abf1459a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -537,6 +537,7 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
>  
> +	omapdss_display_init(dssdev);
>  	r = omapdss_register_display(dssdev);
>  	if (r) {
>  		dev_err(&spi->dev, "Failed to register panel\n");
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 0c94d5208398..057069b7a6cf 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -32,7 +32,7 @@ static LIST_HEAD(panel_list);
>  static DEFINE_MUTEX(panel_list_mutex);
>  static int disp_num_counter;
>  
> -int omapdss_register_display(struct omap_dss_device *dssdev)
> +void omapdss_display_init(struct omap_dss_device *dssdev)
>  {
>  	int id;
>  
> @@ -52,7 +52,11 @@ int omapdss_register_display(struct omap_dss_device *dssdev)
>  	if (dssdev->name == NULL)
>  		dssdev->name = devm_kasprintf(dssdev->dev, GFP_KERNEL,
>  					      "display%u", id);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_display_init);
>  
> +int omapdss_register_display(struct omap_dss_device *dssdev)
> +{
>  	mutex_lock(&panel_list_mutex);
>  	list_add_tail(&dssdev->panel_list, &panel_list);
>  	mutex_unlock(&panel_list_mutex);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 94a3f98bdd3d..e42821583b91 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -487,6 +487,7 @@ static inline bool omapdss_is_initialized(void)
>  	return !!omapdss_get_dss();
>  }
>  
> +void omapdss_display_init(struct omap_dss_device *dssdev);
>  int omapdss_register_display(struct omap_dss_device *dssdev);
>  void omapdss_unregister_display(struct omap_dss_device *dssdev);
>  #define for_each_dss_display(d) \
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 30/60] drm/omap: dss: Remove panel devices list
  2018-05-26 17:24 ` [PATCH v2 30/60] drm/omap: dss: Remove panel devices list Laurent Pinchart
@ 2018-06-10 20:32   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:32 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:48PM +0300, Laurent Pinchart wrote:
> The panel devices list isn't used anymore, all panel devices are
> accessed through the global devices list. Remove it.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  9 ++------
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c   | 14 ++---------
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  8 ++-----
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  8 ++-----
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  8 ++-----
>  .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  8 ++-----
>  .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  8 ++-----
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  8 ++-----
>  .../drm/omapdrm/displays/panel-sony-acx565akm.c    | 27 +++++++---------------
>  .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  8 ++-----
>  .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    | 22 ++++--------------
>  drivers/gpu/drm/omapdrm/dss/display.c              | 23 ------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              |  3 ---
>  13 files changed, 31 insertions(+), 123 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index fb23fae7fbf4..f1d1c67d72b8 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -154,7 +154,6 @@ static int tvc_probe(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata;
>  	struct omap_dss_device *dssdev;
> -	int r;
>  
>  	ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
>  	if (!ddata)
> @@ -172,11 +171,7 @@ static int tvc_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -186,7 +181,7 @@ 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_unregister_display(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	tvc_disable(dssdev);
>  	tvc_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 5333fb166c83..9e0b5a0b2eea 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -391,19 +391,9 @@ static int dvic_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register panel\n");
> -		goto err_reg;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
> -
> -err_reg:
> -	i2c_put_adapter(ddata->i2c_adapter);
> -	mutex_destroy(&ddata->hpd_lock);
> -
> -	return r;
>  }
>  
>  static int __exit dvic_remove(struct platform_device *pdev)
> @@ -411,7 +401,7 @@ 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_unregister_display(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	dvic_disable(dssdev);
>  	dvic_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 2c5e8cf70c9f..064b051c0a29 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -351,11 +351,7 @@ static int hdmic_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -365,7 +361,7 @@ 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_unregister_display(&ddata->dssdev);
> +	omapdss_device_unregister(&ddata->dssdev);
>  
>  	hdmic_disable(dssdev);
>  	hdmic_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 87f11618e85f..bd598be1ba6b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -219,11 +219,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -233,7 +229,7 @@ static int __exit panel_dpi_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	panel_dpi_disable(dssdev);
>  	panel_dpi_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 94275fc931be..e27399ca3ac5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1329,11 +1329,7 @@ static int dsicm_probe(struct platform_device *pdev)
>  		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(dev, "Failed to register panel\n");
> -		goto err_reg;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	mutex_init(&ddata->lock);
>  
> @@ -1404,7 +1400,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
>  
>  	dev_dbg(&pdev->dev, "remove\n");
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	dsicm_disable(dssdev);
>  	dsicm_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 88c075414b7c..0e89fc1bc34c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -271,11 +271,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&spi->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -285,7 +281,7 @@ static int lb035q02_panel_spi_remove(struct spi_device *spi)
>  	struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	lb035q02_disable(dssdev);
>  	lb035q02_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index fafb3e43f390..9f32343e5122 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -294,11 +294,7 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&spi->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -310,7 +306,7 @@ static int nec_8048_remove(struct spi_device *spi)
>  
>  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	nec_8048_disable(dssdev);
>  	nec_8048_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index bb28994cedc0..320d2e73c40c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -270,11 +270,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&pdev->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -284,7 +280,7 @@ static int __exit sharp_ls_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	sharp_ls_disable(dssdev);
>  	sharp_ls_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 46ede08ce65b..5411c0ce9bb4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -733,7 +733,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  		r = devm_gpio_request_one(&spi->dev, ddata->reset_gpio,
>  				GPIOF_OUT_INIT_LOW, "lcd reset");
>  		if (r)
> -			goto err_gpio;
> +			return r;
>  	}
>  
>  	if (gpio_is_valid(ddata->reset_gpio))
> @@ -754,7 +754,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  
>  	if (r) {
>  		dev_err(&spi->dev, "%s panel detect error\n", __func__);
> -		goto err_detect;
> +		return r;
>  	}
>  
>  	memset(&props, 0, sizeof(props));
> @@ -764,17 +764,15 @@ static int acx565akm_probe(struct spi_device *spi)
>  
>  	bldev = backlight_device_register("acx565akm", &ddata->spi->dev,
>  			ddata, &acx565akm_bl_ops, &props);
> -	if (IS_ERR(bldev)) {
> -		r = PTR_ERR(bldev);
> -		goto err_reg_bl;
> -	}
> +	if (IS_ERR(bldev))
> +		return PTR_ERR(bldev);
>  	ddata->bl_dev = bldev;
>  	if (ddata->has_cabc) {
>  		r = sysfs_create_group(&bldev->dev.kobj, &bldev_attr_group);
>  		if (r) {
>  			dev_err(&bldev->dev,
>  				"%s failed to create sysfs files\n", __func__);
> -			goto err_sysfs;
> +			goto err_backlight_unregister;
>  		}
>  		ddata->cabc_mode = get_hw_cabc_mode(ddata);
>  	}
> @@ -801,21 +799,12 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&spi->dev, "Failed to register panel\n");
> -		goto err_reg;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  
> -err_reg:
> -	sysfs_remove_group(&bldev->dev.kobj, &bldev_attr_group);
> -err_sysfs:
> +err_backlight_unregister:
>  	backlight_device_unregister(bldev);
> -err_reg_bl:
> -err_detect:
> -err_gpio:
>  	return r;
>  }
>  
> @@ -829,7 +818,7 @@ static int acx565akm_remove(struct spi_device *spi)
>  	sysfs_remove_group(&ddata->bl_dev->dev.kobj, &bldev_attr_group);
>  	backlight_device_unregister(ddata->bl_dev);
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	acx565akm_disable(dssdev);
>  	acx565akm_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index a76387dfc0e2..839fc0eaf164 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -395,11 +395,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&spi->dev, "Failed to register panel\n");
> -		return r;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
>  }
> @@ -411,7 +407,7 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
>  
>  	dev_dbg(&ddata->spi_dev->dev, "%s\n", __func__);
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	td028ttec1_panel_disable(dssdev);
>  	td028ttec1_panel_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index dbb1abf1459a..5ad85326a84e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -509,8 +509,7 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	ddata->vcc_reg = devm_regulator_get(&spi->dev, "vcc");
>  	if (IS_ERR(ddata->vcc_reg)) {
>  		dev_err(&spi->dev, "failed to get LCD VCC regulator\n");
> -		r = PTR_ERR(ddata->vcc_reg);
> -		goto err_regulator;
> +		return PTR_ERR(ddata->vcc_reg);
>  	}
>  
>  	if (gpio_is_valid(ddata->nreset_gpio)) {
> @@ -519,14 +518,14 @@ static int tpo_td043_probe(struct spi_device *spi)
>  				"lcd reset");
>  		if (r < 0) {
>  			dev_err(&spi->dev, "couldn't request reset GPIO\n");
> -			goto err_gpio_req;
> +			return r;
>  		}
>  	}
>  
>  	r = sysfs_create_group(&spi->dev.kobj, &tpo_td043_attr_group);
>  	if (r) {
>  		dev_err(&spi->dev, "failed to create sysfs files\n");
> -		goto err_sysfs;
> +		return r;
>  	}
>  
>  	ddata->vm = tpo_td043_vm;
> @@ -538,20 +537,9 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->owner = THIS_MODULE;
>  
>  	omapdss_display_init(dssdev);
> -	r = omapdss_register_display(dssdev);
> -	if (r) {
> -		dev_err(&spi->dev, "Failed to register panel\n");
> -		goto err_reg;
> -	}
> +	omapdss_device_register(dssdev);
>  
>  	return 0;
> -
> -err_reg:
> -	sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group);
> -err_sysfs:
> -err_gpio_req:
> -err_regulator:
> -	return r;
>  }
>  
>  static int tpo_td043_remove(struct spi_device *spi)
> @@ -561,7 +549,7 @@ static int tpo_td043_remove(struct spi_device *spi)
>  
>  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);
>  
> -	omapdss_unregister_display(dssdev);
> +	omapdss_device_unregister(dssdev);
>  
>  	tpo_td043_disable(dssdev);
>  	tpo_td043_disconnect(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 057069b7a6cf..524e43f71af4 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -28,8 +28,6 @@
>  
>  #include "omapdss.h"
>  
> -static LIST_HEAD(panel_list);
> -static DEFINE_MUTEX(panel_list_mutex);
>  static int disp_num_counter;
>  
>  void omapdss_display_init(struct omap_dss_device *dssdev)
> @@ -55,27 +53,6 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
>  }
>  EXPORT_SYMBOL_GPL(omapdss_display_init);
>  
> -int omapdss_register_display(struct omap_dss_device *dssdev)
> -{
> -	mutex_lock(&panel_list_mutex);
> -	list_add_tail(&dssdev->panel_list, &panel_list);
> -	mutex_unlock(&panel_list_mutex);
> -
> -	omapdss_device_register(dssdev);
> -	return 0;
> -}
> -EXPORT_SYMBOL(omapdss_register_display);
> -
> -void omapdss_unregister_display(struct omap_dss_device *dssdev)
> -{
> -	mutex_lock(&panel_list_mutex);
> -	list_del(&dssdev->panel_list);
> -	mutex_unlock(&panel_list_mutex);
> -
> -	omapdss_device_register(dssdev);
> -}
> -EXPORT_SYMBOL(omapdss_unregister_display);
> -
>  struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
>  {
>  	if (!try_module_get(dssdev->owner))
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index e42821583b91..5f71f6885991 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -395,7 +395,6 @@ struct omap_dss_device {
>  	struct omap_dss_device *dst;
>  
>  	struct list_head list;
> -	struct list_head panel_list;
>  
>  	unsigned int alias_id;
>  
> @@ -488,8 +487,6 @@ static inline bool omapdss_is_initialized(void)
>  }
>  
>  void omapdss_display_init(struct omap_dss_device *dssdev);
> -int omapdss_register_display(struct omap_dss_device *dssdev);
> -void omapdss_unregister_display(struct omap_dss_device *dssdev);
>  #define for_each_dss_display(d) \
>  	while ((d = omapdss_device_get_next(d, true)) != NULL)
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device()
  2018-05-26 17:24 ` [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device() Laurent Pinchart
@ 2018-06-10 20:36   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:36 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:49PM +0300, Laurent Pinchart wrote:
> The functions operate on any omap_dss_device, move them from display.c
> to base.c. While at it rename them to match the naming of the other
> functions operating on struct omap_dss_device.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  .../gpu/drm/omapdrm/displays/connector-analog-tv.c |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c   |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c  |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  |  4 ++--
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c       |  4 ++--
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c    |  4 ++--
>  .../omapdrm/displays/panel-lgphilips-lb035q02.c    |  4 ++--
>  .../drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  4 ++--
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  4 ++--
>  .../drm/omapdrm/displays/panel-sony-acx565akm.c    |  4 ++--
>  .../drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  4 ++--
>  .../drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  4 ++--
>  drivers/gpu/drm/omapdrm/dss/base.c                 | 27 +++++++++++++++++++---
>  drivers/gpu/drm/omapdrm/dss/display.c              | 24 -------------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h              |  5 ++--
>  drivers/gpu/drm/omapdrm/dss/output.c               |  2 +-
>  drivers/gpu/drm/omapdrm/omap_connector.c           |  4 ++--
>  drivers/gpu/drm/omapdrm/omap_crtc.c                |  2 +-
>  drivers/gpu/drm/omapdrm/omap_drv.c                 |  8 +++----
>  21 files changed, 62 insertions(+), 66 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index f1d1c67d72b8..a7eb25bd9283 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -55,7 +55,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -68,7 +68,7 @@ static void tvc_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int tvc_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 9e0b5a0b2eea..3e71af9ba0c3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -69,7 +69,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -82,7 +82,7 @@ static void dvic_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int dvic_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 064b051c0a29..fd0bad4dc7c9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -65,7 +65,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -78,7 +78,7 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int hdmic_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index c1ed4e2ce8f3..01b00eea3a98 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -45,7 +45,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -60,7 +60,7 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  
>  	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int opa362_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index b360a68f074d..6f71d2b7de03 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -41,7 +41,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -56,7 +56,7 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  
>  	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int tfp410_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index efeae1401490..8031f2c087f6 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -50,7 +50,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -74,7 +74,7 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  
>  	omapdss_device_disconnect(src, &ddata->dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int tpd_enable(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 bd598be1ba6b..5306af0206c2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -47,7 +47,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -60,7 +60,7 @@ static void panel_dpi_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int panel_dpi_enable(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 e27399ca3ac5..e0a607846284 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -794,7 +794,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  err_req_vc:
>  	omapdss_device_disconnect(src, dssdev);
>  err_connect:
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  	return r;
>  }
>  
> @@ -806,7 +806,7 @@ static void dsicm_disconnect(struct omap_dss_device *dssdev)
>  	src->ops->dsi.release_vc(src, ddata->channel);
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int dsicm_enable(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 0e89fc1bc34c..015488594de3 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -129,7 +129,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -144,7 +144,7 @@ static void lb035q02_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int lb035q02_enable(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 9f32343e5122..c23bf5ba0c47 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -124,7 +124,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -137,7 +137,7 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int nec_8048_enable(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 320d2e73c40c..a7c053d031c1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -70,7 +70,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -83,7 +83,7 @@ static void sharp_ls_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int sharp_ls_enable(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 5411c0ce9bb4..cad158a142d4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -519,7 +519,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -532,7 +532,7 @@ static void acx565akm_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int acx565akm_panel_power_on(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 839fc0eaf164..cadbbb4dcbd4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -178,7 +178,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -191,7 +191,7 @@ static void td028ttec1_panel_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int td028ttec1_panel_enable(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 5ad85326a84e..2f70b3c74262 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -349,7 +349,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  
>  	r = omapdss_device_connect(src, dssdev);
>  	if (r) {
> -		omap_dss_put_device(src);
> +		omapdss_device_put(src);
>  		return r;
>  	}
>  
> @@ -362,7 +362,7 @@ static void tpo_td043_disconnect(struct omap_dss_device *dssdev)
>  
>  	omapdss_device_disconnect(src, dssdev);
>  
> -	omap_dss_put_device(src);
> +	omapdss_device_put(src);
>  }
>  
>  static int tpo_td043_enable(struct omap_dss_device *dssdev)
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index f7b8958f15bc..4abde473eba7 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -91,6 +91,27 @@ static bool omapdss_device_is_registered(struct device_node *node)
>  	return found;
>  }
>  
> +struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev)
> +{
> +	if (!try_module_get(dssdev->owner))
> +		return NULL;
> +
> +	if (get_device(dssdev->dev) == NULL) {
> +		module_put(dssdev->owner);
> +		return NULL;
> +	}
> +
> +	return dssdev;
> +}
> +EXPORT_SYMBOL(omapdss_device_get);
> +
> +void omapdss_device_put(struct omap_dss_device *dssdev)
> +{
> +	put_device(dssdev->dev);
> +	module_put(dssdev->owner);
> +}
> +EXPORT_SYMBOL(omapdss_device_put);
> +
>  struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  						    unsigned int port)
>  {
> @@ -98,7 +119,7 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  
>  	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
>  		if (dssdev->dev->of_node == src && dssdev->port_num == port)
> -			return omap_dss_get_device(dssdev);
> +			return omapdss_device_get(dssdev);
>  	}
>  
>  	return NULL;
> @@ -147,9 +168,9 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
>  
>  done:
>  	if (from)
> -		omap_dss_put_device(from);
> +		omapdss_device_put(from);
>  	if (dssdev)
> -		omap_dss_get_device(dssdev);
> +		omapdss_device_get(dssdev);
>  
>  	mutex_unlock(&omapdss_devices_lock);
>  	return dssdev;
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 524e43f71af4..65ca71859c7d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -21,9 +21,6 @@
>  #define DSS_SUBSYS_NAME "DISPLAY"
>  
>  #include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/jiffies.h>
> -#include <linux/platform_device.h>
>  #include <linux/of.h>
>  
>  #include "omapdss.h"
> @@ -52,24 +49,3 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
>  					      "display%u", id);
>  }
>  EXPORT_SYMBOL_GPL(omapdss_display_init);
> -
> -struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev)
> -{
> -	if (!try_module_get(dssdev->owner))
> -		return NULL;
> -
> -	if (get_device(dssdev->dev) == NULL) {
> -		module_put(dssdev->owner);
> -		return NULL;
> -	}
> -
> -	return dssdev;
> -}
> -EXPORT_SYMBOL(omap_dss_get_device);
> -
> -void omap_dss_put_device(struct omap_dss_device *dssdev)
> -{
> -	put_device(dssdev->dev);
> -	module_put(dssdev->owner);
> -}
> -EXPORT_SYMBOL(omap_dss_put_device);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 5f71f6885991..96011e42da05 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -492,6 +492,8 @@ void omapdss_display_init(struct omap_dss_device *dssdev);
>  
>  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_device_get_next(struct omap_dss_device *from,
> @@ -501,9 +503,6 @@ int omapdss_device_connect(struct omap_dss_device *src,
>  void omapdss_device_disconnect(struct omap_dss_device *src,
>  			       struct omap_dss_device *dst);
>  
> -struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev);
> -void omap_dss_put_device(struct omap_dss_device *dssdev);
> -
>  int omap_dss_get_num_overlay_managers(void);
>  
>  int omap_dss_get_num_overlays(void);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index e62da96f83af..b5bf7a5e35d9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -93,7 +93,7 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
>  		dssdev = dssdev->src;
>  
>  	if (dssdev->id != 0)
> -		return omap_dss_get_device(dssdev);
> +		return omapdss_device_get(dssdev);
>  
>  	return NULL;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index eec3aa83dfcd..de001596c481 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -98,7 +98,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
>  	drm_connector_cleanup(connector);
>  	kfree(omap_connector);
>  
> -	omap_dss_put_device(dssdev);
> +	omapdss_device_put(dssdev);
>  }
>  
>  #define MAX_EDID  512
> @@ -254,7 +254,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
>  
>  	DBG("%s", dssdev->name);
>  
> -	omap_dss_get_device(dssdev);
> +	omapdss_device_get(dssdev);
>  
>  	omap_connector = kzalloc(sizeof(*omap_connector), GFP_KERNEL);
>  	if (!omap_connector)
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 6c4d40b824e4..e18ca6cdc0d6 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -704,7 +704,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  
>  	out = omapdss_find_output_from_display(dssdev);
>  	channel = out->dispc_channel;
> -	omap_dss_put_device(out);
> +	omapdss_device_put(out);
>  
>  	DBG("%s", channel_names[channel]);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 21ca4002ac38..cf0f76bf5773 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -161,7 +161,7 @@ static void omap_disconnect_dssdevs(struct drm_device *ddev)
>  
>  		omapdss_device_disconnect(dssdev, NULL);
>  		priv->dssdevs[i] = NULL;
> -		omap_dss_put_device(dssdev);
> +		omapdss_device_put(dssdev);
>  	}
>  
>  	priv->num_dssdevs = 0;
> @@ -191,17 +191,17 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  	for_each_dss_display(dssdev) {
>  		r = omapdss_device_connect(dssdev, NULL);
>  		if (r == -EPROBE_DEFER) {
> -			omap_dss_put_device(dssdev);
> +			omapdss_device_put(dssdev);
>  			goto cleanup;
>  		} else if (r) {
>  			dev_warn(dssdev->dev, "could not connect display: %s\n",
>  				dssdev->name);
>  		} else {
> -			omap_dss_get_device(dssdev);
> +			omapdss_device_get(dssdev);
>  			priv->dssdevs[priv->num_dssdevs++] = dssdev;
>  			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
>  				/* To balance the 'for_each_dss_display' loop */
> -				omap_dss_put_device(dssdev);
> +				omapdss_device_put(dssdev);
>  				break;
>  			}
>  		}
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device
  2018-05-26 17:24 ` [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device Laurent Pinchart
@ 2018-06-10 20:43   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:43 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:50PM +0300, Laurent Pinchart wrote:
> Storing the dss_device pointer in the omap_dss_device structure will
> allow accessing the dss_device from the dss_mgr API functions.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c      |  2 +-
>  drivers/gpu/drm/omapdrm/displays/connector-dvi.c            |  2 +-
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c           |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c           |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c           |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c        |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c                |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c             |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c     |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c  |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c     |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c     |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c     |  2 +-
>  drivers/gpu/drm/omapdrm/dss/base.c                          | 11 +++++++++--
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                       |  4 +++-
>  drivers/gpu/drm/omapdrm/omap_drv.c                          |  2 +-
>  17 files changed, 27 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index a7eb25bd9283..f7250db0f3b7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -53,7 +53,7 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 3e71af9ba0c3..b4f84baff144 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -67,7 +67,7 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index fd0bad4dc7c9..2f8ae93c117a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -63,7 +63,7 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 01b00eea3a98..4d7f4dae2c10 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -43,7 +43,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 6f71d2b7de03..833544d8502f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -39,7 +39,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 8031f2c087f6..3a3c36fef446 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -48,7 +48,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 5306af0206c2..43df4f7c38f0 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -45,7 +45,7 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index e0a607846284..6090447b66a1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -769,7 +769,7 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		dev_err(dev, "Failed to connect to video source\n");
>  		goto err_connect;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 015488594de3..5c26e1d19655 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -127,7 +127,7 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index c23bf5ba0c47..6c30b2078a0e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -122,7 +122,7 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index a7c053d031c1..fb40d2c705e5 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -68,7 +68,7 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index cad158a142d4..a35d4407f2b0 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -517,7 +517,7 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index cadbbb4dcbd4..d887f12c021c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -176,7 +176,7 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 2f70b3c74262..6d333b0aea18 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -347,7 +347,7 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  		return PTR_ERR(src);
>  	}
>  
> -	r = omapdss_device_connect(src, dssdev);
> +	r = omapdss_device_connect(dssdev->dss, src, dssdev);
>  	if (r) {
>  		omapdss_device_put(src);
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 4abde473eba7..b4bc58c5134d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -177,7 +177,8 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
>  }
>  EXPORT_SYMBOL(omapdss_device_get_next);
>  
> -int omapdss_device_connect(struct omap_dss_device *src,
> +int omapdss_device_connect(struct dss_device *dss,
> +			   struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
>  	int ret;
> @@ -187,13 +188,17 @@ int omapdss_device_connect(struct omap_dss_device *src,
>  	if (omapdss_device_is_connected(src))
>  		return -EBUSY;
>  
> +	src->dss = dss;
> +
>  	if (src->driver)
>  		ret = src->driver->connect(src);
>  	else
>  		ret = src->ops->connect(src, dst);
>  
> -	if (ret < 0)
> +	if (ret < 0) {
> +		src->dss = NULL;
>  		return ret;
> +	}
>  
>  	if (dst) {
>  		dst->src = src;
> @@ -226,6 +231,8 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  		src->driver->disconnect(src);
>  	else
>  		src->ops->disconnect(src, dst);
> +
> +	src->dss = NULL;
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 96011e42da05..4befe8aab333 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -391,6 +391,7 @@ struct omap_dss_device {
>  
>  	struct module *owner;
>  
> +	struct dss_device *dss;
>  	struct omap_dss_device *src;
>  	struct omap_dss_device *dst;
>  
> @@ -498,7 +499,8 @@ 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,
>  						bool display_only);
> -int omapdss_device_connect(struct omap_dss_device *src,
> +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);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index cf0f76bf5773..042a3ca526ca 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -189,7 +189,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  		return -EPROBE_DEFER;
>  
>  	for_each_dss_display(dssdev) {
> -		r = omapdss_device_connect(dssdev, NULL);
> +		r = omapdss_device_connect(priv->dss, dssdev, NULL);
>  		if (r == -EPROBE_DEFER) {
>  			omapdss_device_put(dssdev);
>  			goto cleanup;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device
  2018-05-26 17:24 ` [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device Laurent Pinchart
@ 2018-06-10 20:43   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:43 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:51PM +0300, Laurent Pinchart wrote:
> The DSS manager ops and private data pointer are specific to a DSS
> instance. Store them in the dss_device structure instead of global
> variable.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dss.h     |  2 ++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  5 +--
>  drivers/gpu/drm/omapdrm/dss/output.c  | 58 ++++++++++++++++++++---------------
>  drivers/gpu/drm/omapdrm/omap_crtc.c   |  6 ++--
>  drivers/gpu/drm/omapdrm/omap_crtc.h   |  2 +-
>  drivers/gpu/drm/omapdrm/omap_drv.c    |  4 +--
>  6 files changed, 44 insertions(+), 33 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
> index a4514843e925..54f96241b9ea 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -266,6 +266,8 @@ struct dss_device {
>  
>  	struct dispc_device *dispc;
>  	const struct dispc_ops *dispc_ops;
> +	const struct dss_mgr_ops *mgr_ops;
> +	struct omap_drm_private *mgr_ops_priv;
>  };
>  
>  /* core */
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 4befe8aab333..4df405ae20db 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -574,9 +574,10 @@ struct dss_mgr_ops {
>  			void (*handler)(void *), void *data);
>  };
>  
> -int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
> +int dss_install_mgr_ops(struct dss_device *dss,
> +			const struct dss_mgr_ops *mgr_ops,
>  			struct omap_drm_private *priv);
> -void dss_uninstall_mgr_ops(void);
> +void dss_uninstall_mgr_ops(struct dss_device *dss);
>  
>  int dss_mgr_connect(struct omap_dss_device *dssdev,
>  		    struct omap_dss_device *dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index b5bf7a5e35d9..a5df6eed4aef 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -21,6 +21,7 @@
>  #include <linux/slab.h>
>  #include <linux/of.h>
>  
> +#include "dss.h"
>  #include "omapdss.h"
>  
>  static DEFINE_MUTEX(output_lock);
> @@ -99,90 +100,97 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
>  }
>  EXPORT_SYMBOL(omapdss_find_output_from_display);
>  
> -static const struct dss_mgr_ops *dss_mgr_ops;
> -static struct omap_drm_private *dss_mgr_ops_priv;
> -
> -int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
> +int dss_install_mgr_ops(struct dss_device *dss,
> +			const struct dss_mgr_ops *mgr_ops,
>  			struct omap_drm_private *priv)
>  {
> -	if (dss_mgr_ops)
> +	if (dss->mgr_ops)
>  		return -EBUSY;
>  
> -	dss_mgr_ops = mgr_ops;
> -	dss_mgr_ops_priv = priv;
> +	dss->mgr_ops = mgr_ops;
> +	dss->mgr_ops_priv = priv;
>  
>  	return 0;
>  }
>  EXPORT_SYMBOL(dss_install_mgr_ops);
>  
> -void dss_uninstall_mgr_ops(void)
> +void dss_uninstall_mgr_ops(struct dss_device *dss)
>  {
> -	dss_mgr_ops = NULL;
> -	dss_mgr_ops_priv = NULL;
> +	dss->mgr_ops = NULL;
> +	dss->mgr_ops_priv = NULL;
>  }
>  EXPORT_SYMBOL(dss_uninstall_mgr_ops);
>  
>  int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst)
>  {
> -	return dss_mgr_ops->connect(dss_mgr_ops_priv,
> -				    dssdev->dispc_channel, dst);
> +	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
> +					     dssdev->dispc_channel, dst);
>  }
>  EXPORT_SYMBOL(dss_mgr_connect);
>  
>  void dss_mgr_disconnect(struct omap_dss_device *dssdev,
>  			struct omap_dss_device *dst)
>  {
> -	dss_mgr_ops->disconnect(dss_mgr_ops_priv, dssdev->dispc_channel, dst);
> +	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
> +					 dssdev->dispc_channel, dst);
>  }
>  EXPORT_SYMBOL(dss_mgr_disconnect);
>  
>  void dss_mgr_set_timings(struct omap_dss_device *dssdev,
>  			 const struct videomode *vm)
>  {
> -	dss_mgr_ops->set_timings(dss_mgr_ops_priv, dssdev->dispc_channel, vm);
> +	dssdev->dss->mgr_ops->set_timings(dssdev->dss->mgr_ops_priv,
> +					  dssdev->dispc_channel, vm);
>  }
>  EXPORT_SYMBOL(dss_mgr_set_timings);
>  
>  void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
>  		const struct dss_lcd_mgr_config *config)
>  {
> -	dss_mgr_ops->set_lcd_config(dss_mgr_ops_priv,
> -				    dssdev->dispc_channel, config);
> +	dssdev->dss->mgr_ops->set_lcd_config(dssdev->dss->mgr_ops_priv,
> +					     dssdev->dispc_channel, config);
>  }
>  EXPORT_SYMBOL(dss_mgr_set_lcd_config);
>  
>  int dss_mgr_enable(struct omap_dss_device *dssdev)
>  {
> -	return dss_mgr_ops->enable(dss_mgr_ops_priv, dssdev->dispc_channel);
> +	return dssdev->dss->mgr_ops->enable(dssdev->dss->mgr_ops_priv,
> +					    dssdev->dispc_channel);
>  }
>  EXPORT_SYMBOL(dss_mgr_enable);
>  
>  void dss_mgr_disable(struct omap_dss_device *dssdev)
>  {
> -	dss_mgr_ops->disable(dss_mgr_ops_priv, dssdev->dispc_channel);
> +	dssdev->dss->mgr_ops->disable(dssdev->dss->mgr_ops_priv,
> +				      dssdev->dispc_channel);
>  }
>  EXPORT_SYMBOL(dss_mgr_disable);
>  
>  void dss_mgr_start_update(struct omap_dss_device *dssdev)
>  {
> -	dss_mgr_ops->start_update(dss_mgr_ops_priv, dssdev->dispc_channel);
> +	dssdev->dss->mgr_ops->start_update(dssdev->dss->mgr_ops_priv,
> +					   dssdev->dispc_channel);
>  }
>  EXPORT_SYMBOL(dss_mgr_start_update);
>  
>  int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev,
>  		void (*handler)(void *), void *data)
>  {
> -	return dss_mgr_ops->register_framedone_handler(dss_mgr_ops_priv,
> -						       dssdev->dispc_channel,
> -						       handler, data);
> +	struct dss_device *dss = dssdev->dss;
> +
> +	return dss->mgr_ops->register_framedone_handler(dss->mgr_ops_priv,
> +							dssdev->dispc_channel,
> +							handler, data);
>  }
>  EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
>  
>  void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
>  		void (*handler)(void *), void *data)
>  {
> -	dss_mgr_ops->unregister_framedone_handler(dss_mgr_ops_priv,
> -						  dssdev->dispc_channel,
> -						  handler, data);
> +	struct dss_device *dss = dssdev->dss;
> +
> +	dss->mgr_ops->unregister_framedone_handler(dss->mgr_ops_priv,
> +						   dssdev->dispc_channel,
> +						   handler, data);
>  }
>  EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler);
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index e18ca6cdc0d6..4ddc4ed18b47 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -683,12 +683,12 @@ void omap_crtc_pre_init(struct omap_drm_private *priv)
>  {
>  	memset(omap_crtcs, 0, sizeof(omap_crtcs));
>  
> -	dss_install_mgr_ops(&mgr_ops, priv);
> +	dss_install_mgr_ops(priv->dss, &mgr_ops, priv);
>  }
>  
> -void omap_crtc_pre_uninit(void)
> +void omap_crtc_pre_uninit(struct omap_drm_private *priv)
>  {
> -	dss_uninstall_mgr_ops();
> +	dss_uninstall_mgr_ops(priv->dss);
>  }
>  
>  /* initialize crtc */
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
> index eaab2d7f0324..1c6530703855 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.h
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
> @@ -33,7 +33,7 @@ struct videomode;
>  struct videomode *omap_crtc_timings(struct drm_crtc *crtc);
>  enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
>  void omap_crtc_pre_init(struct omap_drm_private *priv);
> -void omap_crtc_pre_uninit(void);
> +void omap_crtc_pre_uninit(struct omap_drm_private *priv);
>  struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  		struct drm_plane *plane, struct omap_dss_device *dssdev);
>  int omap_crtc_wait_pending(struct drm_crtc *crtc);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 042a3ca526ca..9b33859e9ac6 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -638,7 +638,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	destroy_workqueue(priv->wq);
>  	omap_disconnect_dssdevs(ddev);
>  err_crtc_uninit:
> -	omap_crtc_pre_uninit();
> +	omap_crtc_pre_uninit(priv);
>  	drm_dev_unref(ddev);
>  	return ret;
>  }
> @@ -666,7 +666,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
>  	destroy_workqueue(priv->wq);
>  
>  	omap_disconnect_dssdevs(ddev);
> -	omap_crtc_pre_uninit();
> +	omap_crtc_pre_uninit(priv);
>  
>  	drm_dev_unref(ddev);
>  }
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel
  2018-05-26 17:24 ` [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel Laurent Pinchart
@ 2018-06-10 20:46   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 20:46 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:52PM +0300, Laurent Pinchart wrote:
> The omapdss_find_output_from_display() function is only used to retrieve
> the dispc channel corresponding to the display. Return the dispc channel
> directly, and rename the function to omapdss_device_get_dispc_channel()
> to match its new purpose.
> 
> The dssdev->id check is removed as the dssdev is guaranteed to be an
> output and have a non-zero id, as proved by the lack of crash despite
> the caller never checking the returned pointer before dereferencing it.
> 
> As the function is not specific to outputs anymore, move it from
> output.c to base.c.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    |  9 +++++++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 +--
>  drivers/gpu/drm/omapdrm/dss/output.c  | 12 ------------
>  drivers/gpu/drm/omapdrm/omap_crtc.c   |  5 +----
>  4 files changed, 11 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index b4bc58c5134d..7f9d8a8be8c3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -236,6 +236,15 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
>  
> +enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev)
> +{
> +	while (dssdev->src)
> +		dssdev = dssdev->src;
> +
> +	return dssdev->dispc_channel;
> +}
> +EXPORT_SYMBOL(omapdss_device_get_dispc_channel);
> +
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 4df405ae20db..121bc953ba31 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -504,6 +504,7 @@ 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);
> +enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev);
>  
>  int omap_dss_get_num_overlay_managers(void);
>  
> @@ -513,8 +514,6 @@ int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
>  
> -struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev);
> -
>  typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
>  int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
>  int omap_dispc_unregister_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 a5df6eed4aef..191b2e801257 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -88,18 +88,6 @@ int omapdss_output_unset_device(struct omap_dss_device *out)
>  }
>  EXPORT_SYMBOL(omapdss_output_unset_device);
>  
> -struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
> -{
> -	while (dssdev->src)
> -		dssdev = dssdev->src;
> -
> -	if (dssdev->id != 0)
> -		return omapdss_device_get(dssdev);
> -
> -	return NULL;
> -}
> -EXPORT_SYMBOL(omapdss_find_output_from_display);
> -
>  int dss_install_mgr_ops(struct dss_device *dss,
>  			const struct dss_mgr_ops *mgr_ops,
>  			struct omap_drm_private *priv)
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 4ddc4ed18b47..c5f1915aef67 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -699,12 +699,9 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  	struct drm_crtc *crtc = NULL;
>  	struct omap_crtc *omap_crtc;
>  	enum omap_channel channel;
> -	struct omap_dss_device *out;
>  	int ret;
>  
> -	out = omapdss_find_output_from_display(dssdev);
> -	channel = out->dispc_channel;
> -	omapdss_device_put(out);
> +	channel = omapdss_device_get_dispc_channel(dssdev);
>  
>  	DBG("%s", channel_names[channel]);
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask
  2018-05-26 17:24 ` [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask Laurent Pinchart
@ 2018-06-10 21:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 21:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:53PM +0300, Laurent Pinchart wrote:
> The omap_dss_device port_num field stores the DT port number associated
> with the device. The field is used in different ways depending on the
> device type:
> 
> - For DPI outputs, the port number is used as an identifier of the DPI
> instance
> 
> - For sources, the port number is used to look up the omap_dss_device by
> DT port node
> 
> As omap_dss_device instances are only looked up as sources by sinks,
> setting the field to the number of the source port works for both use
> cases.
> 
> However, to enable looking up sinks, we need to record all the ports
> associated with an omap_dss_device. Do so by turning the port_num field
> into an of_ports bitmask. For DPI outputs the port number is
> additionally stored in the dpi_data structure as the output ID.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- 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     |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c  |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c          |  1 +
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c       |  1 +
>  .../drm/omapdrm/displays/panel-lgphilips-lb035q02.c   |  1 +
>  .../gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c   |  1 +
>  .../drm/omapdrm/displays/panel-sharp-ls037v7dw01.c    |  1 +
>  .../gpu/drm/omapdrm/displays/panel-sony-acx565akm.c   |  1 +
>  .../gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c   |  1 +
>  .../gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c   |  1 +
>  drivers/gpu/drm/omapdrm/dss/base.c                    |  2 +-
>  drivers/gpu/drm/omapdrm/dss/dpi.c                     | 19 +++++++++----------
>  drivers/gpu/drm/omapdrm/dss/dsi.c                     |  1 +
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                   |  1 +
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                   |  1 +
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                 |  4 ++--
>  drivers/gpu/drm/omapdrm/dss/sdi.c                     |  2 +-
>  drivers/gpu/drm/omapdrm/dss/venc.c                    |  1 +
>  22 files changed, 31 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index f7250db0f3b7..b960c4d0e84d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -169,6 +169,7 @@ static int tvc_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index b4f84baff144..8ff674bf75e6 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -389,6 +389,7 @@ static int dvic_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 2f8ae93c117a..2afaa2ca602b 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -349,6 +349,7 @@ static int hdmic_probe(struct platform_device *pdev)
>  	dssdev->dev = &pdev->dev;
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 4d7f4dae2c10..eb0ebb850114 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -167,6 +167,7 @@ static int opa362_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_VENC;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(1) | BIT(0);
>  
>  	omapdss_device_register(dssdev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 833544d8502f..fb767d674297 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -190,7 +190,7 @@ static int tfp410_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->port_num = 1;
> +	dssdev->of_ports = BIT(1) | BIT(0);
>  
>  	omapdss_device_register(dssdev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 3a3c36fef446..cd6da0e8f76a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -299,7 +299,7 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
> -	dssdev->port_num = 1;
> +	dssdev->of_ports = BIT(1) | BIT(0);
>  
>  	omapdss_device_register(dssdev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 43df4f7c38f0..97ebfb51192e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -217,6 +217,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
>  	dssdev->driver = &panel_dpi_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	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 6090447b66a1..92f521930c2c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -1324,6 +1324,7 @@ static int dsicm_probe(struct platform_device *pdev)
>  	dssdev->driver = &dsicm_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	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 5c26e1d19655..46ca37dd9205 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -269,6 +269,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
>  	dssdev->driver = &lb035q02_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index 6c30b2078a0e..fec2de915200 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -292,6 +292,7 @@ static int nec_8048_probe(struct spi_device *spi)
>  	dssdev->driver = &nec_8048_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index fb40d2c705e5..0ff8f00a95cb 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -268,6 +268,7 @@ static int sharp_ls_probe(struct platform_device *pdev)
>  	dssdev->driver = &sharp_ls_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index a35d4407f2b0..8d2bf114f47e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -797,6 +797,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  	dssdev->driver = &acx565akm_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_SDI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index d887f12c021c..38d87a276261 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -393,6 +393,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi)
>  	dssdev->driver = &td028ttec1_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index 6d333b0aea18..c30b0809012a 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -535,6 +535,7 @@ static int tpo_td043_probe(struct spi_device *spi)
>  	dssdev->driver = &tpo_td043_ops;
>  	dssdev->type = OMAP_DISPLAY_TYPE_DPI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->of_ports = BIT(0);
>  
>  	omapdss_display_init(dssdev);
>  	omapdss_device_register(dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 7f9d8a8be8c3..96be800a0f25 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -118,7 +118,7 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  	struct omap_dss_device *dssdev;
>  
>  	list_for_each_entry(dssdev, &omapdss_devices_list, list) {
> -		if (dssdev->dev->of_node == src && dssdev->port_num == port)
> +		if (dssdev->dev->of_node == src && dssdev->of_ports & BIT(port))
>  			return omapdss_device_get(dssdev);
>  	}
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 3fbed21d69a6..8a7c951a413c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -39,6 +39,7 @@ struct dpi_data {
>  	struct platform_device *pdev;
>  	enum dss_model dss_model;
>  	struct dss_device *dss;
> +	unsigned int id;
>  
>  	struct regulator *vdds_dsi_reg;
>  	enum dss_clk_source clk_src;
> @@ -413,7 +414,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
>  	if (r)
>  		goto err_get_dispc;
>  
> -	r = dss_dpi_select_source(dpi->dss, out->port_num, out->dispc_channel);
> +	r = dss_dpi_select_source(dpi->dss, dpi->id, out->dispc_channel);
>  	if (r)
>  		goto err_src_sel;
>  
> @@ -609,7 +610,7 @@ static void dpi_init_pll(struct dpi_data *dpi)
>   * the channel in some more dynamic manner, or get the channel as a user
>   * parameter.
>   */
> -static enum omap_channel dpi_get_channel(struct dpi_data *dpi, int port_num)
> +static enum omap_channel dpi_get_channel(struct dpi_data *dpi)
>  {
>  	switch (dpi->dss_model) {
>  	case DSS_MODEL_OMAP2:
> @@ -617,7 +618,7 @@ static enum omap_channel dpi_get_channel(struct dpi_data *dpi, int port_num)
>  		return OMAP_DSS_CHANNEL_LCD;
>  
>  	case DSS_MODEL_DRA7:
> -		switch (port_num) {
> +		switch (dpi->id) {
>  		case 2:
>  			return OMAP_DSS_CHANNEL_LCD3;
>  		case 1:
> @@ -690,12 +691,10 @@ static const struct omap_dss_device_ops dpi_ops = {
>  static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  {
>  	struct omap_dss_device *out = &dpi->output;
> -	int r;
> -	u32 port_num;
> +	u32 port_num = 0;
>  
> -	r = of_property_read_u32(port, "reg", &port_num);
> -	if (r)
> -		port_num = 0;
> +	of_property_read_u32(port, "reg", &port_num);
> +	dpi->id = port_num <= 2 ? port_num : 0;
>  
>  	switch (port_num) {
>  	case 2:
> @@ -713,8 +712,8 @@ static void 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->dispc_channel = dpi_get_channel(dpi, port_num);
> -	out->port_num = port_num;
> +	out->dispc_channel = dpi_get_channel(dpi);
> +	out->of_ports = BIT(port_num);
>  	out->ops = &dpi_ops;
>  	out->owner = THIS_MODULE;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 90820402e81f..b3e50d8a7477 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4994,6 +4994,7 @@ static void dsi_init_output(struct dsi_data *dsi)
>  	out->dispc_channel = dsi_get_channel(dsi);
>  	out->ops = &dsi_ops;
>  	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
>  
>  	omapdss_device_register(out);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index fa818033f3f3..bf800cede2ad 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -564,6 +564,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
>  
>  	omapdss_device_register(out);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index ef4a48f397d2..e5d23dd19f99 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -555,6 +555,7 @@ static void hdmi_init_output(struct omap_hdmi *hdmi)
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &hdmi_ops;
>  	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
>  
>  	omapdss_device_register(out);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 121bc953ba31..c2d9ebdec3d1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -423,8 +423,8 @@ struct omap_dss_device {
>  	/* output instance */
>  	enum omap_dss_output_id id;
>  
> -	/* the port number in the DT node */
> -	int port_num;
> +	/* bitmask of port numbers in DT */
> +	unsigned int of_ports;
>  };
>  
>  struct omap_dss_driver {
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 76842ca4a619..fd5320041911 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -324,7 +324,7 @@ static void sdi_init_output(struct sdi_device *sdi)
>  	out->name = "sdi.0";
>  	out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
>  	/* We have SDI only on OMAP3, where it's on port 1 */
> -	out->port_num = 1;
> +	out->of_ports = BIT(1);
>  	out->ops = &sdi_ops;
>  	out->owner = THIS_MODULE;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index bed7fcb35d89..47985549a81c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -767,6 +767,7 @@ static void venc_init_output(struct venc_device *venc)
>  	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
>  	out->ops = &venc_ops;
>  	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
>  
>  	omapdss_device_register(out);
>  }
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks
  2018-05-26 17:24 ` [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks Laurent Pinchart
@ 2018-06-10 21:13   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 21:13 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:54PM +0300, Laurent Pinchart wrote:
> The omapdss_of_find_source_for_first_ep() function locates the source
> corresponding to the first endpoint of the first port of a device node.
> We can easily extend it to locate sinks as well by passing the port
> number as a parameter. This will be useful to find sinks in encoders
> drivers.
> 
> Extend the function and rename it to omapdss_of_find_connected_device()
> to reflect its new extended purpose.
> 
> Additionally, it is useful to differentiate between failures to return
> the connected device because no link exists in the device tree for the
> requested port, or because the connected device as described in the
> device tree is invalid or not probed yet. Return NULL in the first case
> and an error code in the second case, and update the callers
> accordingly.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/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          |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c          |  2 +-
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c       |  2 +-
>  drivers/gpu/drm/omapdrm/displays/panel-dpi.c               |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c            |  6 +++---
>  .../gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c    |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c    |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c    |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c    |  6 +++---
>  drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c    |  6 +++---
>  drivers/gpu/drm/omapdrm/dss/dss-of.c                       | 14 +++++++-------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                      |  2 +-
>  16 files changed, 44 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index b960c4d0e84d..4f32c8ddcfbd 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -47,10 +47,10 @@ static int tvc_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> index 8ff674bf75e6..6eae18b42b82 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
> @@ -61,10 +61,10 @@ static int dvic_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index 2afaa2ca602b..b3f88ab0cd6e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -57,10 +57,10 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(ddata->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index eb0ebb850114..904ebec5f5e1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -37,7 +37,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
>  	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
>  		return PTR_ERR(src);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index fb767d674297..cd442f66fa1d 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -33,7 +33,7 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
>  	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
>  		return PTR_ERR(src);
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index cd6da0e8f76a..d21d0829774e 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -42,7 +42,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
>  	if (IS_ERR(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
>  		return PTR_ERR(src);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> index 97ebfb51192e..049959309063 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
> @@ -39,10 +39,10 @@ static int panel_dpi_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> index 92f521930c2c..db2e841f1b07 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
> @@ -763,10 +763,10 @@ static int dsicm_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> index 46ca37dd9205..76f9064106d4 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
> @@ -121,10 +121,10 @@ static int lb035q02_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> index fec2de915200..0c64a734f28f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
> @@ -116,10 +116,10 @@ static int nec_8048_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> index 0ff8f00a95cb..87baa8982f55 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
> @@ -62,10 +62,10 @@ static int sharp_ls_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> index 8d2bf114f47e..ac05cd252b1c 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
> @@ -511,10 +511,10 @@ static int acx565akm_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> index 38d87a276261..acfa69b74ffa 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
> @@ -170,10 +170,10 @@ static int td028ttec1_panel_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> index c30b0809012a..383ffd0d21f2 100644
> --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
> @@ -341,10 +341,10 @@ static int tpo_td043_connect(struct omap_dss_device *dssdev)
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> -	if (IS_ERR(src)) {
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
> +	if (IS_ERR_OR_NULL(src)) {
>  		dev_err(dssdev->dev, "failed to find video source\n");
> -		return PTR_ERR(src);
> +		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
>  	r = omapdss_device_connect(dssdev->dss, src, dssdev);
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss-of.c b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> index 771b20db2d98..0422597ac6b0 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss-of.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss-of.c
> @@ -47,7 +47,7 @@ dss_of_port_get_parent_device(struct device_node *port)
>  }
>  
>  struct omap_dss_device *
> -omapdss_of_find_source_for_first_ep(struct device_node *node)
> +omapdss_of_find_connected_device(struct device_node *node, unsigned int port)
>  {
>  	struct device_node *src_node;
>  	struct device_node *src_port;
> @@ -56,27 +56,27 @@ omapdss_of_find_source_for_first_ep(struct device_node *node)
>  	u32 port_number = 0;
>  
>  	/* Get the endpoint... */
> -	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> +	ep = of_graph_get_endpoint_by_regs(node, port, 0);
>  	if (!ep)
> -		return ERR_PTR(-EINVAL);
> +		return NULL;
>  
>  	/* ... and its remote port... */
>  	src_port = of_graph_get_remote_port(ep);
>  	of_node_put(ep);
>  	if (!src_port)
> -		return ERR_PTR(-EINVAL);
> +		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 NULL;
> +		return ERR_PTR(-EINVAL);
>  
> -	/* ... and finally the source. */
> +	/* ... and finally the connected device. */
>  	src = omapdss_find_device_by_port(src_node, port_number);
>  	of_node_put(src_node);
>  
>  	return src ? src : ERR_PTR(-EPROBE_DEFER);
>  }
> -EXPORT_SYMBOL_GPL(omapdss_of_find_source_for_first_ep);
> +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 c2d9ebdec3d1..dc2f8167f61b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -532,7 +532,7 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
>  }
>  
>  struct omap_dss_device *
> -omapdss_of_find_source_for_first_ep(struct device_node *node);
> +omapdss_of_find_connected_device(struct device_node *node, unsigned int port);
>  
>  enum dss_writeback_channel {
>  	DSS_WB_LCD1_MGR =	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] 127+ messages in thread

* Re: [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily
  2018-05-26 17:24 ` [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily Laurent Pinchart
@ 2018-06-10 21:14   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 21:14 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:55PM +0300, Laurent Pinchart wrote:
> The connect handle of the analog TV and HDMI connectors casts the dssdev
> to panel data only to then access fields of the panel data that are also
> present in the dssdev. Remove the cast and use dssdev directly.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c | 5 ++---
>  drivers/gpu/drm/omapdrm/displays/connector-hdmi.c      | 5 ++---
>  2 files changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> index 4f32c8ddcfbd..eab898b5bf0f 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
> @@ -43,13 +43,12 @@ static const struct videomode tvc_pal_vm = {
>  
>  static int tvc_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
>  	if (IS_ERR_OR_NULL(src)) {
> -		dev_err(ddata->dev, "failed to find video source\n");
> +		dev_err(dssdev->dev, "failed to find video source\n");
>  		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> index b3f88ab0cd6e..cf06b47d6ce7 100644
> --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
> @@ -53,13 +53,12 @@ struct panel_drv_data {
>  
>  static int hdmic_connect(struct omap_dss_device *dssdev)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
>  	struct omap_dss_device *src;
>  	int r;
>  
> -	src = omapdss_of_find_connected_device(ddata->dev->of_node, 0);
> +	src = omapdss_of_find_connected_device(dssdev->dev->of_node, 0);
>  	if (IS_ERR_OR_NULL(src)) {
> -		dev_err(ddata->dev, "failed to find video source\n");
> +		dev_err(dssdev->dev, "failed to find video source\n");
>  		return src ? PTR_ERR(src) : -EINVAL;
>  	}
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions
  2018-05-26 17:24 ` [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions Laurent Pinchart
@ 2018-06-10 21:17   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 21:17 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:56PM +0300, Laurent Pinchart wrote:
> Rename the jump labels according to the cleanup they perform, not the
> location they're accessed from, and move functions from error checks to
> cleanup paths, and move reference handling to simplify cleanup.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c   | 10 ++--------
>  drivers/gpu/drm/omapdrm/dss/dsi.c   |  9 ++++-----
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c |  7 ++++---
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c |  7 ++++---
>  drivers/gpu/drm/omapdrm/dss/sdi.c   |  7 ++-----
>  drivers/gpu/drm/omapdrm/dss/venc.c  |  7 +++----
>  6 files changed, 19 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 8a7c951a413c..e97f54d5f3e1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -745,15 +745,14 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  		return 0;
>  
>  	r = of_property_read_u32(ep, "data-lines", &datalines);
> +	of_node_put(ep);
>  	if (r) {
>  		DSSERR("failed to parse datalines\n");
> -		goto err_datalines;
> +		return r;
>  	}
>  
>  	dpi->data_lines = datalines;
>  
> -	of_node_put(ep);
> -
>  	dpi->pdev = pdev;
>  	dpi->dss_model = dss_model;
>  	dpi->dss = dss;
> @@ -764,11 +763,6 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  	dpi_init_output_port(dpi, port);
>  
>  	return 0;
> -
> -err_datalines:
> -	of_node_put(ep);
> -
> -	return r;
>  }
>  
>  void dpi_uninit_port(struct device_node *port)
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index b3e50d8a7477..278094f29255 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5360,7 +5360,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  
>  	r = dsi_runtime_get(dsi);
>  	if (r)
> -		goto err_runtime_get;
> +		goto err_pm_disable;
>  
>  	rev = dsi_read_reg(dsi, DSI_REVISION);
>  	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
> @@ -5381,7 +5381,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	r = dsi_probe_of(dsi);
>  	if (r) {
>  		DSSERR("Invalid DSI DT data\n");
> -		goto err_probe_of;
> +		goto err_uninit_output;
>  	}
>  
>  	r = of_platform_populate(dev->of_node, NULL, NULL, dev);
> @@ -5404,11 +5404,10 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  
>  	return 0;
>  
> -err_probe_of:
> +err_uninit_output:
>  	dsi_uninit_output(dsi);
>  	dsi_runtime_put(dsi);
> -
> -err_runtime_get:
> +err_pm_disable:
>  	pm_runtime_disable(dev);
>  	return r;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index bf800cede2ad..1d1f2e0b2b2a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -780,9 +780,7 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  	r = hdmi_audio_register(hdmi);
>  	if (r) {
>  		DSSERR("Registering HDMI audio failed\n");
> -		hdmi_uninit_output(hdmi);
> -		pm_runtime_disable(&pdev->dev);
> -		return r;
> +		goto err_uninit_output;
>  	}
>  
>  	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> @@ -790,6 +788,9 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  
>  	return 0;
>  
> +err_uninit_output:
> +	hdmi_uninit_output(hdmi);
> +	pm_runtime_disable(&pdev->dev);
>  err_pll:
>  	hdmi_pll_uninit(&hdmi->pll);
>  err_free:
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index e5d23dd19f99..92ae561bf974 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -773,9 +773,7 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  	r = hdmi_audio_register(hdmi);
>  	if (r) {
>  		DSSERR("Registering HDMI audio failed %d\n", r);
> -		hdmi_uninit_output(hdmi);
> -		pm_runtime_disable(&pdev->dev);
> -		return r;
> +		goto err_uninit_output;
>  	}
>  
>  	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> @@ -783,6 +781,9 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  
>  	return 0;
>  
> +err_uninit_output:
> +	hdmi_uninit_output(hdmi);
> +	pm_runtime_disable(&pdev->dev);
>  err_pll:
>  	hdmi_pll_uninit(&hdmi->pll);
>  err_free:
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index fd5320041911..0ace553a21c5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -355,16 +355,15 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  	}
>  
>  	r = of_property_read_u32(ep, "datapairs", &datapairs);
> +	of_node_put(ep);
>  	if (r) {
>  		DSSERR("failed to parse datapairs\n");
> -		goto err_datapairs;
> +		goto err_free;
>  	}
>  
>  	sdi->datapairs = datapairs;
>  	sdi->dss = dss;
>  
> -	of_node_put(ep);
> -
>  	sdi->pdev = pdev;
>  	port->data = sdi;
>  
> @@ -372,8 +371,6 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  
>  	return 0;
>  
> -err_datapairs:
> -	of_node_put(ep);
>  err_free:
>  	kfree(sdi);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 47985549a81c..c8fb91bb1ad3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -867,7 +867,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
>  
>  	r = venc_runtime_get(venc);
>  	if (r)
> -		goto err_runtime_get;
> +		goto err_pm_disable;
>  
>  	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
>  	dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id);
> @@ -877,7 +877,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
>  	r = venc_probe_of(venc);
>  	if (r) {
>  		DSSERR("Invalid DT data\n");
> -		goto err_probe_of;
> +		goto err_pm_disable;
>  	}
>  
>  	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
> @@ -887,8 +887,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
>  
>  	return 0;
>  
> -err_probe_of:
> -err_runtime_get:
> +err_pm_disable:
>  	pm_runtime_disable(&pdev->dev);
>  err_free:
>  	kfree(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] 127+ messages in thread

* Re: [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe
  2018-05-26 17:24 ` [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe Laurent Pinchart
@ 2018-06-10 22:32   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 22:32 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:57PM +0300, Laurent Pinchart wrote:
> There's no reason to delay initialization of most of the driver (such as
> mapping memory I/O or enabling runtime PM) to the component bind
> handler. Perform as much of the initialization as possible at probe
> time, initializing at bind time only the parts that depends on the DSS.
> The cleanup code is moved from unbind to remove in a similar way.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dsi.c | 301 ++++++++++++++++++++------------------
>  1 file changed, 161 insertions(+), 140 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 278094f29255..79312e53bfd9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4981,85 +4981,9 @@ static const struct omap_dss_device_ops dsi_ops = {
>  	},
>  };
>  
> -static void dsi_init_output(struct dsi_data *dsi)
> -{
> -	struct omap_dss_device *out = &dsi->output;
> -
> -	out->dev = dsi->dev;
> -	out->id = dsi->module_id == 0 ?
> -			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
> -
> -	out->output_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;
> -	out->owner = THIS_MODULE;
> -	out->of_ports = BIT(0);
> -
> -	omapdss_device_register(out);
> -}
> -
> -static void dsi_uninit_output(struct dsi_data *dsi)
> -{
> -	struct omap_dss_device *out = &dsi->output;
> -
> -	omapdss_device_unregister(out);
> -}
> -
> -static int dsi_probe_of(struct dsi_data *dsi)
> -{
> -	struct device_node *node = dsi->dev->of_node;
> -	struct property *prop;
> -	u32 lane_arr[10];
> -	int len, num_pins;
> -	int r, i;
> -	struct device_node *ep;
> -	struct omap_dsi_pin_config pin_cfg;
> -
> -	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> -	if (!ep)
> -		return 0;
> -
> -	prop = of_find_property(ep, "lanes", &len);
> -	if (prop == NULL) {
> -		dev_err(dsi->dev, "failed to find lane data\n");
> -		r = -EINVAL;
> -		goto err;
> -	}
> -
> -	num_pins = len / sizeof(u32);
> -
> -	if (num_pins < 4 || num_pins % 2 != 0 ||
> -		num_pins > dsi->num_lanes_supported * 2) {
> -		dev_err(dsi->dev, "bad number of lanes\n");
> -		r = -EINVAL;
> -		goto err;
> -	}
> -
> -	r = of_property_read_u32_array(ep, "lanes", lane_arr, num_pins);
> -	if (r) {
> -		dev_err(dsi->dev, "failed to read lane data\n");
> -		goto err;
> -	}
> -
> -	pin_cfg.num_pins = num_pins;
> -	for (i = 0; i < num_pins; ++i)
> -		pin_cfg.pins[i] = (int)lane_arr[i];
> -
> -	r = dsi_configure_pins(&dsi->output, &pin_cfg);
> -	if (r) {
> -		dev_err(dsi->dev, "failed to configure pins");
> -		goto err;
> -	}
> -
> -	of_node_put(ep);
> -
> -	return 0;
> -
> -err:
> -	of_node_put(ep);
> -	return r;
> -}
> +/* -----------------------------------------------------------------------------
> + * PLL
> + */
>  
>  static const struct dss_pll_ops dsi_pll_ops = {
>  	.enable = dsi_pll_enable,
> @@ -5174,7 +5098,153 @@ static int dsi_init_pll_data(struct dss_device *dss, struct dsi_data *dsi)
>  	return 0;
>  }
>  
> -/* DSI1 HW IP initialisation */
> +/* -----------------------------------------------------------------------------
> + * Component Bind & Unbind
> + */
> +
> +static int dsi_bind(struct device *dev, struct device *master, void *data)
> +{
> +	struct dss_device *dss = dss_get_device(master);
> +	struct dsi_data *dsi = dev_get_drvdata(dev);
> +	char name[10];
> +	u32 rev;
> +	int r;
> +
> +	dsi->dss = dss;
> +
> +	dsi_init_pll_data(dss, dsi);
> +
> +	r = dsi_runtime_get(dsi);
> +	if (r)
> +		return r;
> +
> +	rev = dsi_read_reg(dsi, DSI_REVISION);
> +	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
> +	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
> +
> +	dsi->line_buffer_size = dsi_get_line_buf_size(dsi);
> +
> +	dsi_runtime_put(dsi);
> +
> +	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
> +	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_regs, &dsi);
> +#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> +	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
> +	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_irqs, &dsi);
> +#endif
> +	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
> +	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
> +						    dsi_dump_dsi_clocks, &dsi);
> +
> +	return 0;
> +}
> +
> +static void dsi_unbind(struct device *dev, struct device *master, void *data)
> +{
> +	struct dsi_data *dsi = dev_get_drvdata(dev);
> +
> +	dss_debugfs_remove_file(dsi->debugfs.clks);
> +	dss_debugfs_remove_file(dsi->debugfs.irqs);
> +	dss_debugfs_remove_file(dsi->debugfs.regs);
> +
> +	of_platform_depopulate(dev);
> +
> +	WARN_ON(dsi->scp_clk_refcount > 0);
> +
> +	dss_pll_unregister(&dsi->pll);
> +}
> +
> +static const struct component_ops dsi_component_ops = {
> +	.bind	= dsi_bind,
> +	.unbind	= dsi_unbind,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Probe & Remove, Suspend & Resume
> + */
> +
> +static void dsi_init_output(struct dsi_data *dsi)
> +{
> +	struct omap_dss_device *out = &dsi->output;
> +
> +	out->dev = dsi->dev;
> +	out->id = dsi->module_id == 0 ?
> +			OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
> +
> +	out->output_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;
> +	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
> +
> +	omapdss_device_register(out);
> +}
> +
> +static void dsi_uninit_output(struct dsi_data *dsi)
> +{
> +	struct omap_dss_device *out = &dsi->output;
> +
> +	omapdss_device_unregister(out);
> +}
> +
> +static int dsi_probe_of(struct dsi_data *dsi)
> +{
> +	struct device_node *node = dsi->dev->of_node;
> +	struct property *prop;
> +	u32 lane_arr[10];
> +	int len, num_pins;
> +	int r, i;
> +	struct device_node *ep;
> +	struct omap_dsi_pin_config pin_cfg;
> +
> +	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> +	if (!ep)
> +		return 0;
> +
> +	prop = of_find_property(ep, "lanes", &len);
> +	if (prop == NULL) {
> +		dev_err(dsi->dev, "failed to find lane data\n");
> +		r = -EINVAL;
> +		goto err;
> +	}
> +
> +	num_pins = len / sizeof(u32);
> +
> +	if (num_pins < 4 || num_pins % 2 != 0 ||
> +		num_pins > dsi->num_lanes_supported * 2) {
> +		dev_err(dsi->dev, "bad number of lanes\n");
> +		r = -EINVAL;
> +		goto err;
> +	}
> +
> +	r = of_property_read_u32_array(ep, "lanes", lane_arr, num_pins);
> +	if (r) {
> +		dev_err(dsi->dev, "failed to read lane data\n");
> +		goto err;
> +	}
> +
> +	pin_cfg.num_pins = num_pins;
> +	for (i = 0; i < num_pins; ++i)
> +		pin_cfg.pins[i] = (int)lane_arr[i];
> +
> +	r = dsi_configure_pins(&dsi->output, &pin_cfg);
> +	if (r) {
> +		dev_err(dsi->dev, "failed to configure pins");
> +		goto err;
> +	}
> +
> +	of_node_put(ep);
> +
> +	return 0;
> +
> +err:
> +	of_node_put(ep);
> +	return r;
> +}
> +
>  static const struct dsi_of_data dsi_of_data_omap34xx = {
>  	.model = DSI_MODEL_OMAP3,
>  	.pll_hw = &dss_omap3_dsi_pll_hw,
> @@ -5240,24 +5310,21 @@ static const struct soc_device_attribute dsi_soc_devices[] = {
>  	{ /* sentinel */ }
>  };
>  
> -static int dsi_bind(struct device *dev, struct device *master, void *data)
> +static int dsi_probe(struct platform_device *pdev)
>  {
> -	struct platform_device *pdev = to_platform_device(dev);
> -	struct dss_device *dss = dss_get_device(master);
>  	const struct soc_device_attribute *soc;
>  	const struct dsi_module_id_data *d;
> -	u32 rev;
> -	int r, i;
> +	struct device *dev = &pdev->dev;
>  	struct dsi_data *dsi;
>  	struct resource *dsi_mem;
>  	struct resource *res;
> -	char name[10];
> +	unsigned int i;
> +	int r;
>  
>  	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
>  	if (!dsi)
>  		return -ENOMEM;
>  
> -	dsi->dss = dss;
>  	dsi->dev = dev;
>  	dev_set_drvdata(dev, dsi);
>  
> @@ -5354,18 +5421,8 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		return r;
>  
> -	dsi_init_pll_data(dss, dsi);
> -
>  	pm_runtime_enable(dev);
>  
> -	r = dsi_runtime_get(dsi);
> -	if (r)
> -		goto err_pm_disable;
> -
> -	rev = dsi_read_reg(dsi, DSI_REVISION);
> -	dev_dbg(dev, "OMAP DSI rev %d.%d\n",
> -	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
> -
>  	/* DSI on OMAP3 doesn't have register DSI_GNQ, set number
>  	 * of data to 3 by default */
>  	if (dsi->data->quirks & DSI_QUIRK_GNQ)
> @@ -5374,8 +5431,6 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	else
>  		dsi->num_lanes_supported = 3;
>  
> -	dsi->line_buffer_size = dsi_get_line_buf_size(dsi);
> -
>  	dsi_init_output(dsi);
>  
>  	r = dsi_probe_of(dsi);
> @@ -5388,67 +5443,33 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		DSSERR("Failed to populate DSI child devices: %d\n", r);
>  
> -	dsi_runtime_put(dsi);
> -
> -	snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1);
> -	dsi->debugfs.regs = dss_debugfs_create_file(dss, name,
> -						    dsi_dump_dsi_regs, &dsi);
> -#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
> -	snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1);
> -	dsi->debugfs.irqs = dss_debugfs_create_file(dss, name,
> -						    dsi_dump_dsi_irqs, &dsi);
> -#endif
> -	snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1);
> -	dsi->debugfs.clks = dss_debugfs_create_file(dss, name,
> -						    dsi_dump_dsi_clocks, &dsi);
> +	r = component_add(&pdev->dev, &dsi_component_ops);
> +	if (r)
> +		goto err_uninit_output;
>  
>  	return 0;
>  
>  err_uninit_output:
>  	dsi_uninit_output(dsi);
> -	dsi_runtime_put(dsi);
> -err_pm_disable:
>  	pm_runtime_disable(dev);
>  	return r;
>  }
>  
> -static void dsi_unbind(struct device *dev, struct device *master, void *data)
> +static int dsi_remove(struct platform_device *pdev)
>  {
> -	struct dsi_data *dsi = dev_get_drvdata(dev);
> +	struct dsi_data *dsi = platform_get_drvdata(pdev);
>  
> -	dss_debugfs_remove_file(dsi->debugfs.clks);
> -	dss_debugfs_remove_file(dsi->debugfs.irqs);
> -	dss_debugfs_remove_file(dsi->debugfs.regs);
> -
> -	of_platform_depopulate(dev);
> -
> -	WARN_ON(dsi->scp_clk_refcount > 0);
> -
> -	dss_pll_unregister(&dsi->pll);
> +	component_del(&pdev->dev, &dsi_component_ops);
>  
>  	dsi_uninit_output(dsi);
>  
> -	pm_runtime_disable(dev);
> +	pm_runtime_disable(&pdev->dev);
>  
>  	if (dsi->vdds_dsi_reg != NULL && dsi->vdds_dsi_enabled) {
>  		regulator_disable(dsi->vdds_dsi_reg);
>  		dsi->vdds_dsi_enabled = false;
>  	}
> -}
>  
> -static const struct component_ops dsi_component_ops = {
> -	.bind	= dsi_bind,
> -	.unbind	= dsi_unbind,
> -};
> -
> -static int dsi_probe(struct platform_device *pdev)
> -{
> -	return component_add(&pdev->dev, &dsi_component_ops);
> -}
> -
> -static int dsi_remove(struct platform_device *pdev)
> -{
> -	component_del(&pdev->dev, &dsi_component_ops);
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 40/60] drm/omap: dss: hdmi4: Move initialization code from bind to probe
  2018-05-26 17:24 ` [PATCH v2 40/60] drm/omap: dss: hdmi4: " Laurent Pinchart
@ 2018-06-10 22:54   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 22:54 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:58PM +0300, Laurent Pinchart wrote:
> There's no reason to delay initialization of most of the driver (such as
> mapping memory I/O or enabling runtime PM) to the component bind
> handler. Perform as much of the initialization as possible at probe
> time, initializing at bind time only the parts that depends on the DSS.
> The cleanup code is moved from unbind to remove in a similar way.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/hdmi4.c | 218 +++++++++++++++++++-----------------
>  1 file changed, 117 insertions(+), 101 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 1d1f2e0b2b2a..89fdce02278c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -553,53 +553,10 @@ static const struct omap_dss_device_ops hdmi_ops = {
>  	},
>  };
>  
> -static void hdmi_init_output(struct omap_hdmi *hdmi)
> -{
> -	struct omap_dss_device *out = &hdmi->output;
> -
> -	out->dev = &hdmi->pdev->dev;
> -	out->id = OMAP_DSS_OUTPUT_HDMI;
> -	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> -	out->name = "hdmi.0";
> -	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> -	out->ops = &hdmi_ops;
> -	out->owner = THIS_MODULE;
> -	out->of_ports = BIT(0);
> -
> -	omapdss_device_register(out);
> -}
> -
> -static void hdmi_uninit_output(struct omap_hdmi *hdmi)
> -{
> -	struct omap_dss_device *out = &hdmi->output;
> -
> -	omapdss_device_unregister(out);
> -}
> -
> -static int hdmi_probe_of(struct omap_hdmi *hdmi)
> -{
> -	struct platform_device *pdev = hdmi->pdev;
> -	struct device_node *node = pdev->dev.of_node;
> -	struct device_node *ep;
> -	int r;
> -
> -	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> -	if (!ep)
> -		return 0;
> -
> -	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> -	if (r)
> -		goto err;
> -
> -	of_node_put(ep);
> -	return 0;
> -
> -err:
> -	of_node_put(ep);
> -	return r;
> -}
> +/* -----------------------------------------------------------------------------
> + * Audio Callbacks
> + */
>  
> -/* Audio callbacks */
>  static int hdmi_audio_startup(struct device *dev,
>  			      void (*abort_cb)(struct device *dev))
>  {
> @@ -714,27 +671,123 @@ static int hdmi_audio_register(struct omap_hdmi *hdmi)
>  	return 0;
>  }
>  
> -/* HDMI HW IP initialisation */
> +/* -----------------------------------------------------------------------------
> + * Component Bind & Unbind
> + */
> +
>  static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  {
> -	struct platform_device *pdev = to_platform_device(dev);
>  	struct dss_device *dss = dss_get_device(master);
> -	struct omap_hdmi *hdmi;
> +	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
>  	int r;
> +
> +	hdmi->dss = dss;
> +
> +	r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
> +	if (r)
> +		return r;
> +
> +	r = hdmi4_cec_init(hdmi->pdev, &hdmi->core, &hdmi->wp);
> +	if (r)
> +		goto err_pll_uninit;
> +
> +	r = hdmi_audio_register(hdmi);
> +	if (r) {
> +		DSSERR("Registering HDMI audio failed\n");
> +		goto err_cec_uninit;
> +	}
> +
> +	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> +					       hdmi);
> +
> +	return 0;
> +
> +err_cec_uninit:
> +	hdmi4_cec_uninit(&hdmi->core);
> +err_pll_uninit:
> +	hdmi_pll_uninit(&hdmi->pll);
> +	return r;
> +}
> +
> +static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
> +{
> +	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +
> +	dss_debugfs_remove_file(hdmi->debugfs);
> +
> +	if (hdmi->audio_pdev)
> +		platform_device_unregister(hdmi->audio_pdev);
> +
> +	hdmi4_cec_uninit(&hdmi->core);
> +	hdmi_pll_uninit(&hdmi->pll);
> +}
> +
> +static const struct component_ops hdmi4_component_ops = {
> +	.bind	= hdmi4_bind,
> +	.unbind	= hdmi4_unbind,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Probe & Remove, Suspend & Resume
> + */
> +
> +static void hdmi4_init_output(struct omap_hdmi *hdmi)
> +{
> +	struct omap_dss_device *out = &hdmi->output;
> +
> +	out->dev = &hdmi->pdev->dev;
> +	out->id = OMAP_DSS_OUTPUT_HDMI;
> +	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> +	out->name = "hdmi.0";
> +	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> +	out->ops = &hdmi_ops;
> +	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
> +
> +	omapdss_device_register(out);
> +}
> +
> +static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
> +{
> +	struct omap_dss_device *out = &hdmi->output;
> +
> +	omapdss_device_unregister(out);
> +}
> +
> +static int hdmi4_probe_of(struct omap_hdmi *hdmi)
> +{
> +	struct platform_device *pdev = hdmi->pdev;
> +	struct device_node *node = pdev->dev.of_node;
> +	struct device_node *ep;
> +	int r;
> +
> +	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> +	if (!ep)
> +		return 0;
> +
> +	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> +	of_node_put(ep);
> +	return r;
> +}
> +
> +static int hdmi4_probe(struct platform_device *pdev)
> +{
> +	struct omap_hdmi *hdmi;
>  	int irq;
> +	int r;
>  
>  	hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
>  	if (!hdmi)
>  		return -ENOMEM;
>  
>  	hdmi->pdev = pdev;
> -	hdmi->dss = dss;
> +
>  	dev_set_drvdata(&pdev->dev, hdmi);
>  
>  	mutex_init(&hdmi->lock);
>  	spin_lock_init(&hdmi->audio_playing_lock);
>  
> -	r = hdmi_probe_of(hdmi);
> +	r = hdmi4_probe_of(hdmi);
>  	if (r)
>  		goto err_free;
>  
> @@ -742,27 +795,19 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		goto err_free;
>  
> -	r = hdmi_pll_init(dss, pdev, &hdmi->pll, &hdmi->wp);
> -	if (r)
> -		goto err_free;
> -
>  	r = hdmi_phy_init(pdev, &hdmi->phy, 4);
>  	if (r)
> -		goto err_pll;
> +		goto err_free;
>  
>  	r = hdmi4_core_init(pdev, &hdmi->core);
>  	if (r)
> -		goto err_pll;
> -
> -	r = hdmi4_cec_init(pdev, &hdmi->core, &hdmi->wp);
> -	if (r)
> -		goto err_pll;
> +		goto err_free;
>  
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq < 0) {
>  		DSSERR("platform_get_irq failed\n");
>  		r = -ENODEV;
> -		goto err_pll;
> +		goto err_free;
>  	}
>  
>  	r = devm_request_threaded_irq(&pdev->dev, irq,
> @@ -770,67 +815,38 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  			IRQF_ONESHOT, "OMAP HDMI", hdmi);
>  	if (r) {
>  		DSSERR("HDMI IRQ request failed\n");
> -		goto err_pll;
> +		goto err_free;
>  	}
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	hdmi_init_output(hdmi);
> +	hdmi4_init_output(hdmi);
>  
> -	r = hdmi_audio_register(hdmi);
> -	if (r) {
> -		DSSERR("Registering HDMI audio failed\n");
> +	r = component_add(&pdev->dev, &hdmi4_component_ops);
> +	if (r)
>  		goto err_uninit_output;
> -	}
> -
> -	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> -					       hdmi);
>  
>  	return 0;
>  
>  err_uninit_output:
> -	hdmi_uninit_output(hdmi);
> +	hdmi4_uninit_output(hdmi);
>  	pm_runtime_disable(&pdev->dev);
> -err_pll:
> -	hdmi_pll_uninit(&hdmi->pll);
>  err_free:
>  	kfree(hdmi);
>  	return r;
>  }
>  
> -static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
> +static int hdmi4_remove(struct platform_device *pdev)
>  {
> -	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +	struct omap_hdmi *hdmi = platform_get_drvdata(pdev);
>  
> -	dss_debugfs_remove_file(hdmi->debugfs);
> -
> -	if (hdmi->audio_pdev)
> -		platform_device_unregister(hdmi->audio_pdev);
> -
> -	hdmi_uninit_output(hdmi);
> -
> -	hdmi4_cec_uninit(&hdmi->core);
> +	component_del(&pdev->dev, &hdmi4_component_ops);
>  
> -	hdmi_pll_uninit(&hdmi->pll);
> +	hdmi4_uninit_output(hdmi);
>  
> -	pm_runtime_disable(dev);
> +	pm_runtime_disable(&pdev->dev);
>  
>  	kfree(hdmi);
> -}
> -
> -static const struct component_ops hdmi4_component_ops = {
> -	.bind	= hdmi4_bind,
> -	.unbind	= hdmi4_unbind,
> -};
> -
> -static int hdmi4_probe(struct platform_device *pdev)
> -{
> -	return component_add(&pdev->dev, &hdmi4_component_ops);
> -}
> -
> -static int hdmi4_remove(struct platform_device *pdev)
> -{
> -	component_del(&pdev->dev, &hdmi4_component_ops);
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 41/60] drm/omap: dss: hdmi5: Move initialization code from bind to probe
  2018-05-26 17:24 ` [PATCH v2 41/60] drm/omap: dss: hdmi5: " Laurent Pinchart
@ 2018-06-10 23:08   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:08 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:24:59PM +0300, Laurent Pinchart wrote:
> There's no reason to delay initialization of most of the driver (such as
> mapping memory I/O or enabling runtime PM) to the component bind
> handler. Perform as much of the initialization as possible at probe
> time, initializing at bind time only the parts that depends on the DSS.
> The cleanup code is moved from unbind to remove in a similar way.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/hdmi5.c | 205 +++++++++++++++++++-----------------
>  1 file changed, 110 insertions(+), 95 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 92ae561bf974..64b45a612439 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -544,53 +544,10 @@ static const struct omap_dss_device_ops hdmi_ops = {
>  	},
>  };
>  
> -static void hdmi_init_output(struct omap_hdmi *hdmi)
> -{
> -	struct omap_dss_device *out = &hdmi->output;
> -
> -	out->dev = &hdmi->pdev->dev;
> -	out->id = OMAP_DSS_OUTPUT_HDMI;
> -	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> -	out->name = "hdmi.0";
> -	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> -	out->ops = &hdmi_ops;
> -	out->owner = THIS_MODULE;
> -	out->of_ports = BIT(0);
> -
> -	omapdss_device_register(out);
> -}
> -
> -static void hdmi_uninit_output(struct omap_hdmi *hdmi)
> -{
> -	struct omap_dss_device *out = &hdmi->output;
> -
> -	omapdss_device_unregister(out);
> -}
> -
> -static int hdmi_probe_of(struct omap_hdmi *hdmi)
> -{
> -	struct platform_device *pdev = hdmi->pdev;
> -	struct device_node *node = pdev->dev.of_node;
> -	struct device_node *ep;
> -	int r;
> -
> -	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> -	if (!ep)
> -		return 0;
> -
> -	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> -	if (r)
> -		goto err;
> -
> -	of_node_put(ep);
> -	return 0;
> -
> -err:
> -	of_node_put(ep);
> -	return r;
> -}
> +/* -----------------------------------------------------------------------------
> + * Audio Callbacks
> + */
>  
> -/* Audio callbacks */
>  static int hdmi_audio_startup(struct device *dev,
>  			      void (*abort_cb)(struct device *dev))
>  {
> @@ -711,27 +668,116 @@ static int hdmi_audio_register(struct omap_hdmi *hdmi)
>  	return 0;
>  }
>  
> -/* HDMI HW IP initialisation */
> +/* -----------------------------------------------------------------------------
> + * Component Bind & Unbind
> + */
> +
>  static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  {
> -	struct platform_device *pdev = to_platform_device(dev);
>  	struct dss_device *dss = dss_get_device(master);
> -	struct omap_hdmi *hdmi;
> +	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
>  	int r;
> +
> +	hdmi->dss = dss;
> +
> +	r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
> +	if (r)
> +		return r;
> +
> +	r = hdmi_audio_register(hdmi);
> +	if (r) {
> +		DSSERR("Registering HDMI audio failed %d\n", r);
> +		goto err_pll_uninit;
> +	}
> +
> +	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> +						hdmi);
> +
> +	return 0;
> +
> +err_pll_uninit:
> +	hdmi_pll_uninit(&hdmi->pll);
> +	return r;
> +}
> +
> +static void hdmi5_unbind(struct device *dev, struct device *master, void *data)
> +{
> +	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +
> +	dss_debugfs_remove_file(hdmi->debugfs);
> +
> +	if (hdmi->audio_pdev)
> +		platform_device_unregister(hdmi->audio_pdev);
> +
> +	hdmi_pll_uninit(&hdmi->pll);
> +}
> +
> +static const struct component_ops hdmi5_component_ops = {
> +	.bind	= hdmi5_bind,
> +	.unbind	= hdmi5_unbind,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Probe & Remove, Suspend & Resume
> + */
> +
> +static void hdmi5_init_output(struct omap_hdmi *hdmi)
> +{
> +	struct omap_dss_device *out = &hdmi->output;
> +
> +	out->dev = &hdmi->pdev->dev;
> +	out->id = OMAP_DSS_OUTPUT_HDMI;
> +	out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> +	out->name = "hdmi.0";
> +	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> +	out->ops = &hdmi_ops;
> +	out->owner = THIS_MODULE;
> +	out->of_ports = BIT(0);
> +
> +	omapdss_device_register(out);
> +}
> +
> +static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
> +{
> +	struct omap_dss_device *out = &hdmi->output;
> +
> +	omapdss_device_unregister(out);
> +}
> +
> +static int hdmi5_probe_of(struct omap_hdmi *hdmi)
> +{
> +	struct platform_device *pdev = hdmi->pdev;
> +	struct device_node *node = pdev->dev.of_node;
> +	struct device_node *ep;
> +	int r;
> +
> +	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> +	if (!ep)
> +		return 0;
> +
> +	r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> +	of_node_put(ep);
> +	return r;
> +}
> +
> +static int hdmi5_probe(struct platform_device *pdev)
> +{
> +	struct omap_hdmi *hdmi;
>  	int irq;
> +	int r;
>  
>  	hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
>  	if (!hdmi)
>  		return -ENOMEM;
>  
>  	hdmi->pdev = pdev;
> -	hdmi->dss = dss;
> +
>  	dev_set_drvdata(&pdev->dev, hdmi);
>  
>  	mutex_init(&hdmi->lock);
>  	spin_lock_init(&hdmi->audio_playing_lock);
>  
> -	r = hdmi_probe_of(hdmi);
> +	r = hdmi5_probe_of(hdmi);
>  	if (r)
>  		goto err_free;
>  
> @@ -739,23 +785,19 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		goto err_free;
>  
> -	r = hdmi_pll_init(dss, pdev, &hdmi->pll, &hdmi->wp);
> -	if (r)
> -		goto err_free;
> -
>  	r = hdmi_phy_init(pdev, &hdmi->phy, 5);
>  	if (r)
> -		goto err_pll;
> +		goto err_free;
>  
>  	r = hdmi5_core_init(pdev, &hdmi->core);
>  	if (r)
> -		goto err_pll;
> +		goto err_free;
>  
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq < 0) {
>  		DSSERR("platform_get_irq failed\n");
>  		r = -ENODEV;
> -		goto err_pll;
> +		goto err_free;
>  	}
>  
>  	r = devm_request_threaded_irq(&pdev->dev, irq,
> @@ -763,65 +805,38 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  			IRQF_ONESHOT, "OMAP HDMI", hdmi);
>  	if (r) {
>  		DSSERR("HDMI IRQ request failed\n");
> -		goto err_pll;
> +		goto err_free;
>  	}
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	hdmi_init_output(hdmi);
> +	hdmi5_init_output(hdmi);
>  
> -	r = hdmi_audio_register(hdmi);
> -	if (r) {
> -		DSSERR("Registering HDMI audio failed %d\n", r);
> +	r = component_add(&pdev->dev, &hdmi5_component_ops);
> +	if (r)
>  		goto err_uninit_output;
> -	}
> -
> -	hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> -						hdmi);
>  
>  	return 0;
>  
>  err_uninit_output:
> -	hdmi_uninit_output(hdmi);
> +	hdmi5_uninit_output(hdmi);
>  	pm_runtime_disable(&pdev->dev);
> -err_pll:
> -	hdmi_pll_uninit(&hdmi->pll);
>  err_free:
>  	kfree(hdmi);
>  	return r;
>  }
>  
> -static void hdmi5_unbind(struct device *dev, struct device *master, void *data)
> +static int hdmi5_remove(struct platform_device *pdev)
>  {
> -	struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> -
> -	dss_debugfs_remove_file(hdmi->debugfs);
> +	struct omap_hdmi *hdmi = platform_get_drvdata(pdev);
>  
> -	if (hdmi->audio_pdev)
> -		platform_device_unregister(hdmi->audio_pdev);
> -
> -	hdmi_uninit_output(hdmi);
> +	component_del(&pdev->dev, &hdmi5_component_ops);
>  
> -	hdmi_pll_uninit(&hdmi->pll);
> +	hdmi5_uninit_output(hdmi);
>  
> -	pm_runtime_disable(dev);
> +	pm_runtime_disable(&pdev->dev);
>  
>  	kfree(hdmi);
> -}
> -
> -static const struct component_ops hdmi5_component_ops = {
> -	.bind	= hdmi5_bind,
> -	.unbind	= hdmi5_unbind,
> -};
> -
> -static int hdmi5_probe(struct platform_device *pdev)
> -{
> -	return component_add(&pdev->dev, &hdmi5_component_ops);
> -}
> -
> -static int hdmi5_remove(struct platform_device *pdev)
> -{
> -	component_del(&pdev->dev, &hdmi5_component_ops);
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 42/60] drm/omap: dss: venc: Move initialization code from bind to probe
  2018-05-26 17:25 ` [PATCH v2 42/60] drm/omap: dss: venc: " Laurent Pinchart
@ 2018-06-10 23:17   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:17 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:00PM +0300, Laurent Pinchart wrote:
> There's no reason to delay initialization of most of the driver (such as
> mapping memory I/O or enabling runtime PM) to the component bind
> handler. Perform as much of the initialization as possible at probe
> time, initializing at bind time only the parts that depends on the DSS.
> The cleanup code is moved from unbind to remove in a similar way.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/venc.c | 104 +++++++++++++++++++++----------------
>  1 file changed, 60 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index c8fb91bb1ad3..84069e79ca6a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -756,6 +756,50 @@ static const struct omap_dss_device_ops venc_ops = {
>  	.set_timings = venc_set_timings,
>  };
>  
> +/* -----------------------------------------------------------------------------
> + * Component Bind & Unbind
> + */
> +
> +static int venc_bind(struct device *dev, struct device *master, void *data)
> +{
> +	struct dss_device *dss = dss_get_device(master);
> +	struct venc_device *venc = dev_get_drvdata(dev);
> +	u8 rev_id;
> +	int r;
> +
> +	venc->dss = dss;
> +
> +	r = venc_runtime_get(venc);
> +	if (r)
> +		return r;
> +
> +	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
> +	dev_dbg(dev, "OMAP VENC rev %d\n", rev_id);
> +
> +	venc_runtime_put(venc);
> +
> +	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
> +						venc);
> +
> +	return 0;
> +}
> +
> +static void venc_unbind(struct device *dev, struct device *master, void *data)
> +{
> +	struct venc_device *venc = dev_get_drvdata(dev);
> +
> +	dss_debugfs_remove_file(venc->debugfs);
> +}
> +
> +static const struct component_ops venc_component_ops = {
> +	.bind	= venc_bind,
> +	.unbind	= venc_unbind,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Probe & Remove, Suspend & Resume
> + */
> +
>  static void venc_init_output(struct venc_device *venc)
>  {
>  	struct omap_dss_device *out = &venc->output;
> @@ -820,19 +864,15 @@ static int venc_probe_of(struct venc_device *venc)
>  	return r;
>  }
>  
> -/* VENC HW IP initialisation */
>  static const struct soc_device_attribute venc_soc_devices[] = {
>  	{ .machine = "OMAP3[45]*" },
>  	{ .machine = "AM35*" },
>  	{ /* sentinel */ }
>  };
>  
> -static int venc_bind(struct device *dev, struct device *master, void *data)
> +static int venc_probe(struct platform_device *pdev)
>  {
> -	struct platform_device *pdev = to_platform_device(dev);
> -	struct dss_device *dss = dss_get_device(master);
>  	struct venc_device *venc;
> -	u8 rev_id;
>  	struct resource *venc_mem;
>  	int r;
>  
> @@ -841,8 +881,8 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
>  		return -ENOMEM;
>  
>  	venc->pdev = pdev;
> -	venc->dss = dss;
> -	dev_set_drvdata(dev, venc);
> +
> +	platform_set_drvdata(pdev, venc);
>  
>  	/* The OMAP34xx, OMAP35xx and AM35xx VENC require the TV DAC clock. */
>  	if (soc_device_match(venc_soc_devices))
> @@ -863,63 +903,39 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		goto err_free;
>  
> -	pm_runtime_enable(&pdev->dev);
> -
> -	r = venc_runtime_get(venc);
> -	if (r)
> -		goto err_pm_disable;
> -
> -	rev_id = (u8)(venc_read_reg(venc, VENC_REV_ID) & 0xff);
> -	dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id);
> -
> -	venc_runtime_put(venc);
> -
>  	r = venc_probe_of(venc);
> -	if (r) {
> -		DSSERR("Invalid DT data\n");
> -		goto err_pm_disable;
> -	}
> +	if (r)
> +		goto err_free;
>  
> -	venc->debugfs = dss_debugfs_create_file(dss, "venc", venc_dump_regs,
> -						venc);
> +	pm_runtime_enable(&pdev->dev);
>  
>  	venc_init_output(venc);
>  
> +	r = component_add(&pdev->dev, &venc_component_ops);
> +	if (r)
> +		goto err_uninit_output;
> +
>  	return 0;
>  
> -err_pm_disable:
> +err_uninit_output:
> +	venc_uninit_output(venc);
>  	pm_runtime_disable(&pdev->dev);
>  err_free:
>  	kfree(venc);
>  	return r;
>  }
>  
> -static void venc_unbind(struct device *dev, struct device *master, void *data)
> +static int venc_remove(struct platform_device *pdev)
>  {
> -	struct venc_device *venc = dev_get_drvdata(dev);
> +	struct venc_device *venc = platform_get_drvdata(pdev);
>  
> -	dss_debugfs_remove_file(venc->debugfs);
> +	component_del(&pdev->dev, &venc_component_ops);
>  
>  	venc_uninit_output(venc);
>  
> -	pm_runtime_disable(dev);
> +	pm_runtime_disable(&pdev->dev);
>  
>  	kfree(venc);
> -}
> -
> -static const struct component_ops venc_component_ops = {
> -	.bind	= venc_bind,
> -	.unbind	= venc_unbind,
> -};
> -
> -static int venc_probe(struct platform_device *pdev)
> -{
> -	return component_add(&pdev->dev, &venc_component_ops);
> -}
> -
> -static int venc_remove(struct platform_device *pdev)
> -{
> -	component_del(&pdev->dev, &venc_component_ops);
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect()
  2018-05-26 17:25 ` [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect() Laurent Pinchart
@ 2018-06-10 23:48   ` Sebastian Reichel
  2018-06-11 17:16     ` Laurent Pinchart
  0 siblings, 1 reply; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:48 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:04PM +0300, Laurent Pinchart wrote:
> The dss_mgr_connect() and dss_mgr_disconnect() functions take two
> omap_dss_device pointers as parameters, which are always set to the same
> value by all callers. Remove the duplicated pointer.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  drivers/gpu/drm/omapdrm/dss/dpi.c     | 8 +++-----
>  drivers/gpu/drm/omapdrm/dss/dsi.c     | 8 +++-----
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 8 +++-----
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 8 +++-----
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 6 ++----
>  drivers/gpu/drm/omapdrm/dss/output.c  | 9 ++++-----
>  drivers/gpu/drm/omapdrm/dss/sdi.c     | 8 +++-----
>  drivers/gpu/drm/omapdrm/dss/venc.c    | 8 +++-----
>  8 files changed, 24 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 650becdf2763..68c8424a460d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -652,7 +652,7 @@ static int dpi_connect(struct omap_dss_device *dssdev,
>  
>  	dpi_init_pll(dpi);
>  
> -	r = dss_mgr_connect(&dpi->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -660,7 +660,7 @@ static int dpi_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dst->name);
> -		dss_mgr_disconnect(&dpi->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -670,11 +670,9 @@ static int dpi_connect(struct omap_dss_device *dssdev,
>  static void dpi_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&dpi->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static const struct omap_dss_device_ops dpi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index b48ee792244b..2c2570e1ef2f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4915,7 +4915,7 @@ static int dsi_connect(struct omap_dss_device *dssdev,
>  	if (r)
>  		return r;
>  
> -	r = dss_mgr_connect(&dsi->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -4923,7 +4923,7 @@ static int dsi_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dssdev->name);
> -		dss_mgr_disconnect(&dsi->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -4933,11 +4933,9 @@ static int dsi_connect(struct omap_dss_device *dssdev,
>  static void dsi_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct dsi_data *dsi = to_dsi_data(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&dsi->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static const struct omap_dss_device_ops dsi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 118c015624b9..5216c5554741 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -458,7 +458,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  	if (r)
>  		return r;
>  
> -	r = dss_mgr_connect(&hdmi->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -466,7 +466,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dst->name);
> -		dss_mgr_disconnect(&hdmi->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -476,11 +476,9 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  static void hdmi_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&hdmi->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static int hdmi_read_edid(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 7af60ca4e7b2..363bc5843e0f 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -461,7 +461,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  	if (r)
>  		return r;
>  
> -	r = dss_mgr_connect(&hdmi->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -469,7 +469,7 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dst->name);
> -		dss_mgr_disconnect(&hdmi->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -479,11 +479,9 @@ static int hdmi_connect(struct omap_dss_device *dssdev,
>  static void hdmi_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&hdmi->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static int hdmi_read_edid(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 1d7263fc6077..9efbcaeb05a7 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -583,10 +583,8 @@ int dss_install_mgr_ops(struct dss_device *dss,
>  			struct omap_drm_private *priv);
>  void dss_uninstall_mgr_ops(struct dss_device *dss);
>  
> -int dss_mgr_connect(struct omap_dss_device *dssdev,
> -		    struct omap_dss_device *dst);
> -void dss_mgr_disconnect(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst);
> +int dss_mgr_connect(struct omap_dss_device *dssdev);
> +void dss_mgr_disconnect(struct omap_dss_device *dssdev);
>  void dss_mgr_set_timings(struct omap_dss_device *dssdev,
>  		const struct videomode *vm);
>  void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 191b2e801257..2f7a019d059e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -109,18 +109,17 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
>  }
>  EXPORT_SYMBOL(dss_uninstall_mgr_ops);
>  
> -int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst)
> +int dss_mgr_connect(struct omap_dss_device *dssdev)
>  {
>  	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
> -					     dssdev->dispc_channel, dst);
> +					     dssdev->dispc_channel, dssdev);

Maybe also change mgr_ops->connect, so that it only takes dssdev
as a parameter? Otherwise

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

-- Sebastian

>  }
>  EXPORT_SYMBOL(dss_mgr_connect);
>  
> -void dss_mgr_disconnect(struct omap_dss_device *dssdev,
> -			struct omap_dss_device *dst)
> +void dss_mgr_disconnect(struct omap_dss_device *dssdev)
>  {
>  	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
> -					 dssdev->dispc_channel, dst);
> +					 dssdev->dispc_channel, dssdev);
>  }
>  EXPORT_SYMBOL(dss_mgr_disconnect);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 8be01ca79817..bbfd4ba3255c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -278,7 +278,7 @@ static int sdi_connect(struct omap_dss_device *dssdev,
>  	if (r)
>  		return r;
>  
> -	r = dss_mgr_connect(&sdi->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -286,7 +286,7 @@ static int sdi_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dst->name);
> -		dss_mgr_disconnect(&sdi->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -296,11 +296,9 @@ static int sdi_connect(struct omap_dss_device *dssdev,
>  static void sdi_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&sdi->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static const struct omap_dss_device_ops sdi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 7bd3156a52a9..db055260f50e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -720,7 +720,7 @@ static int venc_connect(struct omap_dss_device *dssdev,
>  	if (r)
>  		return r;
>  
> -	r = dss_mgr_connect(&venc->output, dssdev);
> +	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
>  
> @@ -728,7 +728,7 @@ static int venc_connect(struct omap_dss_device *dssdev,
>  	if (r) {
>  		DSSERR("failed to connect output to new device: %s\n",
>  				dst->name);
> -		dss_mgr_disconnect(&venc->output, dssdev);
> +		dss_mgr_disconnect(dssdev);
>  		return r;
>  	}
>  
> @@ -738,11 +738,9 @@ static int venc_connect(struct omap_dss_device *dssdev,
>  static void venc_disconnect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
> -
>  	omapdss_output_unset_device(dssdev);
>  
> -	dss_mgr_disconnect(&venc->output, dssdev);
> +	dss_mgr_disconnect(dssdev);
>  }
>  
>  static const struct omap_dss_device_ops venc_ops = {
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time
  2018-05-26 17:25 ` [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time Laurent Pinchart
@ 2018-06-10 23:49   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:49 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:01PM +0300, Laurent Pinchart wrote:
> Look up the next dssdev at probe time based on device tree links for all
> DSS outputs and encoders. This will be used to reverse the order of the
> dssdev connect and disconnect call chains.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c    |  9 +++++++++
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c    |  9 +++++++++
>  drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c |  9 +++++++++
>  drivers/gpu/drm/omapdrm/dss/dpi.c                    | 17 +++++++++++++----
>  drivers/gpu/drm/omapdrm/dss/dsi.c                    | 18 ++++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c                  | 18 ++++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c                  | 18 ++++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/omapdss.h                |  1 +
>  drivers/gpu/drm/omapdrm/dss/sdi.c                    | 17 +++++++++++++++--
>  drivers/gpu/drm/omapdrm/dss/venc.c                   | 18 ++++++++++++++++--
>  10 files changed, 120 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index 904ebec5f5e1..a94d6d0cead9 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -169,6 +169,13 @@ static int opa362_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  
> +	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
> +	if (IS_ERR(dssdev->next)) {
> +		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
> +			dev_err(&pdev->dev, "failed to find video sink\n");
> +		return PTR_ERR(dssdev->next);
> +	}
> +
>  	omapdss_device_register(dssdev);
>  
>  	return 0;
> @@ -179,6 +186,8 @@ static int __exit opa362_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> +	if (dssdev->next)
> +		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index cd442f66fa1d..d40a0fd93e67 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -192,6 +192,13 @@ static int tfp410_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  
> +	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
> +	if (IS_ERR(dssdev->next)) {
> +		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
> +			dev_err(&pdev->dev, "failed to find video sink\n");
> +		return PTR_ERR(dssdev->next);
> +	}
> +
>  	omapdss_device_register(dssdev);
>  
>  	return 0;
> @@ -202,6 +209,8 @@ static int __exit tfp410_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> +	if (dssdev->next)
> +		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index d21d0829774e..e6adeebb91d1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -301,6 +301,13 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->of_ports = BIT(1) | BIT(0);
>  
> +	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
> +	if (IS_ERR(dssdev->next)) {
> +		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
> +			dev_err(&pdev->dev, "failed to find video sink\n");
> +		return PTR_ERR(dssdev->next);
> +	}
> +
>  	omapdss_device_register(dssdev);
>  
>  	return 0;
> @@ -311,6 +318,8 @@ static int __exit tpd_remove(struct platform_device *pdev)
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
>  
> +	if (dssdev->next)
> +		omapdss_device_put(dssdev->next);
>  	omapdss_device_unregister(&ddata->dssdev);
>  
>  	WARN_ON(omapdss_device_is_enabled(dssdev));
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index e97f54d5f3e1..650becdf2763 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -688,7 +688,7 @@ static const struct omap_dss_device_ops dpi_ops = {
>  	.set_timings = dpi_set_timings,
>  };
>  
> -static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
> +static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  {
>  	struct omap_dss_device *out = &dpi->output;
>  	u32 port_num = 0;
> @@ -717,7 +717,16 @@ static void 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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  static void dpi_uninit_output_port(struct device_node *port)
> @@ -725,6 +734,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);
>  }
>  
> @@ -760,9 +771,7 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  
>  	mutex_init(&dpi->lock);
>  
> -	dpi_init_output_port(dpi, port);
> -
> -	return 0;
> +	return dpi_init_output_port(dpi, port);
>  }
>  
>  void dpi_uninit_port(struct device_node *port)
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 79312e53bfd9..b48ee792244b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5165,7 +5165,7 @@ static const struct component_ops dsi_component_ops = {
>   * Probe & Remove, Suspend & Resume
>   */
>  
> -static void dsi_init_output(struct dsi_data *dsi)
> +static int dsi_init_output(struct dsi_data *dsi)
>  {
>  	struct omap_dss_device *out = &dsi->output;
>  
> @@ -5180,13 +5180,24 @@ static void dsi_init_output(struct dsi_data *dsi)
>  	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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  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);
>  }
>  
> @@ -5431,7 +5442,9 @@ static int dsi_probe(struct platform_device *pdev)
>  	else
>  		dsi->num_lanes_supported = 3;
>  
> -	dsi_init_output(dsi);
> +	r = dsi_init_output(dsi);
> +	if (r)
> +		goto err_pm_disable;
>  
>  	r = dsi_probe_of(dsi);
>  	if (r) {
> @@ -5451,6 +5464,7 @@ static int dsi_probe(struct platform_device *pdev)
>  
>  err_uninit_output:
>  	dsi_uninit_output(dsi);
> +err_pm_disable:
>  	pm_runtime_disable(dev);
>  	return r;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 89fdce02278c..118c015624b9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -731,7 +731,7 @@ static const struct component_ops hdmi4_component_ops = {
>   * Probe & Remove, Suspend & Resume
>   */
>  
> -static void hdmi4_init_output(struct omap_hdmi *hdmi)
> +static int hdmi4_init_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> @@ -744,13 +744,24 @@ static void hdmi4_init_output(struct omap_hdmi *hdmi)
>  	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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  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);
>  }
>  
> @@ -820,7 +831,9 @@ static int hdmi4_probe(struct platform_device *pdev)
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	hdmi4_init_output(hdmi);
> +	r = hdmi4_init_output(hdmi);
> +	if (r)
> +		goto err_pm_disable;
>  
>  	r = component_add(&pdev->dev, &hdmi4_component_ops);
>  	if (r)
> @@ -830,6 +843,7 @@ static int hdmi4_probe(struct platform_device *pdev)
>  
>  err_uninit_output:
>  	hdmi4_uninit_output(hdmi);
> +err_pm_disable:
>  	pm_runtime_disable(&pdev->dev);
>  err_free:
>  	kfree(hdmi);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 64b45a612439..7af60ca4e7b2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -721,7 +721,7 @@ static const struct component_ops hdmi5_component_ops = {
>   * Probe & Remove, Suspend & Resume
>   */
>  
> -static void hdmi5_init_output(struct omap_hdmi *hdmi)
> +static int hdmi5_init_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
>  
> @@ -734,13 +734,24 @@ static void hdmi5_init_output(struct omap_hdmi *hdmi)
>  	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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  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);
>  }
>  
> @@ -810,7 +821,9 @@ static int hdmi5_probe(struct platform_device *pdev)
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	hdmi5_init_output(hdmi);
> +	r = hdmi5_init_output(hdmi);
> +	if (r)
> +		goto err_pm_disable;
>  
>  	r = component_add(&pdev->dev, &hdmi5_component_ops);
>  	if (r)
> @@ -820,6 +833,7 @@ static int hdmi5_probe(struct platform_device *pdev)
>  
>  err_uninit_output:
>  	hdmi5_uninit_output(hdmi);
> +err_pm_disable:
>  	pm_runtime_disable(&pdev->dev);
>  err_free:
>  	kfree(hdmi);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index dc2f8167f61b..5d3e4ced73d1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -394,6 +394,7 @@ 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;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 0ace553a21c5..8be01ca79817 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -314,7 +314,7 @@ static const struct omap_dss_device_ops sdi_ops = {
>  	.set_timings = sdi_set_timings,
>  };
>  
> -static void sdi_init_output(struct sdi_device *sdi)
> +static int sdi_init_output(struct sdi_device *sdi)
>  {
>  	struct omap_dss_device *out = &sdi->output;
>  
> @@ -328,11 +328,22 @@ static void sdi_init_output(struct sdi_device *sdi)
>  	out->ops = &sdi_ops;
>  	out->owner = THIS_MODULE;
>  
> +	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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  static void sdi_uninit_output(struct sdi_device *sdi)
>  {
> +	if (sdi->output.next)
> +		omapdss_device_put(sdi->output.next);
>  	omapdss_device_unregister(&sdi->output);
>  }
>  
> @@ -367,7 +378,9 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  	sdi->pdev = pdev;
>  	port->data = sdi;
>  
> -	sdi_init_output(sdi);
> +	r = sdi_init_output(sdi);
> +	if (r)
> +		goto err_free;
>  
>  	return 0;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 84069e79ca6a..7bd3156a52a9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -800,7 +800,7 @@ static const struct component_ops venc_component_ops = {
>   * Probe & Remove, Suspend & Resume
>   */
>  
> -static void venc_init_output(struct venc_device *venc)
> +static int venc_init_output(struct venc_device *venc)
>  {
>  	struct omap_dss_device *out = &venc->output;
>  
> @@ -813,11 +813,22 @@ static void 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);
> +	}
> +
>  	omapdss_device_register(out);
> +
> +	return 0;
>  }
>  
>  static void venc_uninit_output(struct venc_device *venc)
>  {
> +	if (venc->output.next)
> +		omapdss_device_put(venc->output.next);
>  	omapdss_device_unregister(&venc->output);
>  }
>  
> @@ -909,7 +920,9 @@ static int venc_probe(struct platform_device *pdev)
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	venc_init_output(venc);
> +	r = venc_init_output(venc);
> +	if (r)
> +		goto err_pm_disable;
>  
>  	r = component_add(&pdev->dev, &venc_component_ops);
>  	if (r)
> @@ -919,6 +932,7 @@ static int venc_probe(struct platform_device *pdev)
>  
>  err_uninit_output:
>  	venc_uninit_output(venc);
> +err_pm_disable:
>  	pm_runtime_disable(&pdev->dev);
>  err_free:
>  	kfree(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] 127+ messages in thread

* Re: [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output
  2018-05-26 17:25 ` [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output Laurent Pinchart
@ 2018-06-10 23:49   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:49 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:03PM +0300, Laurent Pinchart wrote:
> Add a new omapdss_display_get() function to retrieve the omap_dss_device
> for a given DSS output. This will be used when reversing the direction
> of the DSS pipeline handling logic.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/display.c | 9 +++++++++
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 1 +
>  2 files changed, 10 insertions(+)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c
> index 65ca71859c7d..697dab0435d6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/display.c
> +++ b/drivers/gpu/drm/omapdrm/dss/display.c
> @@ -49,3 +49,12 @@ void omapdss_display_init(struct omap_dss_device *dssdev)
>  					      "display%u", id);
>  }
>  EXPORT_SYMBOL_GPL(omapdss_display_init);
> +
> +struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output)
> +{
> +	while (output->next)
> +		output = output->next;
> +
> +	return omapdss_device_get(output);
> +}
> +EXPORT_SYMBOL_GPL(omapdss_display_get);
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 723124f6e596..1d7263fc6077 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -491,6 +491,7 @@ static inline bool omapdss_is_initialized(void)
>  #define for_each_dss_display(d) \
>  	while ((d = omapdss_device_get_next(d, true, false)) != NULL)
>  void omapdss_display_init(struct omap_dss_device *dssdev);
> +struct omap_dss_device *omapdss_display_get(struct omap_dss_device *output);
>  
>  void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(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] 127+ messages in thread

* Re: [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro
  2018-05-26 17:25 ` [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro Laurent Pinchart
@ 2018-06-10 23:52   ` Sebastian Reichel
  2018-06-11 17:11     ` Laurent Pinchart
  0 siblings, 1 reply; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:52 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

On Sat, May 26, 2018 at 08:25:02PM +0300, Laurent Pinchart wrote:
> Similarly to for_each_dss_display(), the for_each_dss_output() macro
> iterates over all the DSS connected outputs.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  drivers/gpu/drm/omapdrm/dss/base.c    | 20 ++++++++++++++------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  9 ++++++---
>  2 files changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 96be800a0f25..519682f18d36 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -127,11 +127,13 @@ struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
>  
>  /*
>   * Search for the next device starting at @from. If display_only is true, skip
> - * non-display devices. Release the reference to the @from device, and acquire
> - * a reference to the returned device if found.
> + * non-display devices. If output_only is true, skip non-output devices and
> + * non-connected output devices. 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,
> -						bool display_only)
> +						bool display_only,
> +						bool output_only)

display_only and output_only are mutually exclusive, so I think it
would be better to use this as parameter. It would also improve
code readability a bit:

enum omapdss_device_type {
    OMAPDSS_DEVICE_TYPE_ALL,
    OMAPDSS_DEVICE_TYPE_OUTPUT_ONLY,
    OMAPDSS_DEVICE_TYPE_DISPLAY_ONLY,
};

>  {
>  	struct omap_dss_device *dssdev;
>  	struct list_head *list;
> @@ -159,9 +161,15 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from,
>  			goto done;
>  		}
>  
> -		/* Filter out non-display entries if display_only is set. */
> -		if (!display_only || dssdev->driver)
> -			goto done;
> +		/*
> +		 * Filter out non-display entries if display_only is set, and
> +		 * non-output entries if output_only is set.
> +		 */
> +		if (display_only && !dssdev->driver)
> +			continue;
> +		if (output_only && (!dssdev->id || !dssdev->next))
> +			continue;
> +		goto done;
>  	}
>  
>  	dssdev = NULL;
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 5d3e4ced73d1..723124f6e596 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -488,9 +488,9 @@ static inline bool omapdss_is_initialized(void)
>  	return !!omapdss_get_dss();
>  }
>  
> -void omapdss_display_init(struct omap_dss_device *dssdev);
>  #define for_each_dss_display(d) \
> -	while ((d = omapdss_device_get_next(d, true)) != NULL)
> +	while ((d = omapdss_device_get_next(d, true, false)) != NULL)
> +void omapdss_display_init(struct omap_dss_device *dssdev);
>  
>  void omapdss_device_register(struct omap_dss_device *dssdev);
>  void omapdss_device_unregister(struct omap_dss_device *dssdev);
> @@ -499,7 +499,8 @@ 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,
> -						bool display_only);
> +						bool display_only,
> +						bool output_only);
>  int omapdss_device_connect(struct dss_device *dss,
>  			   struct omap_dss_device *src,
>  			   struct omap_dss_device *dst);
> @@ -511,6 +512,8 @@ 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, false, true)) != NULL)
>  int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time
  2018-05-26 17:25 ` [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time Laurent Pinchart
@ 2018-06-10 23:58   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-10 23:58 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:05PM +0300, Laurent Pinchart wrote:
> Regulators for the DPI, DSI, HDMI, SDI and VENC outputs are all looked
> up when connecting the output omap_dss_device. There's no need to delay
> regulator handling to that time, get the regulators at probe time.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c   | 69 ++++++++++++++++++-------------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c   | 36 ++++---------------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c | 33 +++++-------------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c | 31 +++++------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c   | 32 +++++------------
>  drivers/gpu/drm/omapdrm/dss/venc.c  | 32 +++++------------
>  6 files changed, 72 insertions(+), 161 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 68c8424a460d..4557357e4130 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -551,38 +551,6 @@ static int dpi_verify_pll(struct dss_pll *pll)
>  	return 0;
>  }
>  
> -static const struct soc_device_attribute dpi_soc_devices[] = {
> -	{ .machine = "OMAP3[456]*" },
> -	{ .machine = "[AD]M37*" },
> -	{ /* sentinel */ }
> -};
> -
> -static int dpi_init_regulator(struct dpi_data *dpi)
> -{
> -	struct regulator *vdds_dsi;
> -
> -	/*
> -	 * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
> -	 * DM37xx only.
> -	 */
> -	if (!soc_device_match(dpi_soc_devices))
> -		return 0;
> -
> -	if (dpi->vdds_dsi_reg)
> -		return 0;
> -
> -	vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
> -	if (IS_ERR(vdds_dsi)) {
> -		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
> -			DSSERR("can't get VDDS_DSI regulator\n");
> -		return PTR_ERR(vdds_dsi);
> -	}
> -
> -	dpi->vdds_dsi_reg = vdds_dsi;
> -
> -	return 0;
> -}
> -
>  static void dpi_init_pll(struct dpi_data *dpi)
>  {
>  	struct dss_pll *pll;
> @@ -646,10 +614,6 @@ static int dpi_connect(struct omap_dss_device *dssdev,
>  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);
>  	int r;
>  
> -	r = dpi_init_regulator(dpi);
> -	if (r)
> -		return r;
> -
>  	dpi_init_pll(dpi);
>  
>  	r = dss_mgr_connect(dssdev);
> @@ -737,6 +701,35 @@ static void dpi_uninit_output_port(struct device_node *port)
>  	omapdss_device_unregister(out);
>  }
>  
> +static const struct soc_device_attribute dpi_soc_devices[] = {
> +	{ .machine = "OMAP3[456]*" },
> +	{ .machine = "[AD]M37*" },
> +	{ /* sentinel */ }
> +};
> +
> +static int dpi_init_regulator(struct dpi_data *dpi)
> +{
> +	struct regulator *vdds_dsi;
> +
> +	/*
> +	 * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and
> +	 * DM37xx only.
> +	 */
> +	if (!soc_device_match(dpi_soc_devices))
> +		return 0;
> +
> +	vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi");
> +	if (IS_ERR(vdds_dsi)) {
> +		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
> +			DSSERR("can't get VDDS_DSI regulator\n");
> +		return PTR_ERR(vdds_dsi);
> +	}
> +
> +	dpi->vdds_dsi_reg = vdds_dsi;
> +
> +	return 0;
> +}
> +
>  int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  		  struct device_node *port, enum dss_model dss_model)
>  {
> @@ -769,6 +762,10 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  
>  	mutex_init(&dpi->lock);
>  
> +	r = dpi_init_regulator(dpi);
> +	if (r)
> +		return r;
> +
>  	return dpi_init_output_port(dpi, port);
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 2c2570e1ef2f..6718c7f04423 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -1137,26 +1137,6 @@ static void dsi_runtime_put(struct dsi_data *dsi)
>  	WARN_ON(r < 0 && r != -ENOSYS);
>  }
>  
> -static int dsi_regulator_init(struct dsi_data *dsi)
> -{
> -	struct regulator *vdds_dsi;
> -
> -	if (dsi->vdds_dsi_reg != NULL)
> -		return 0;
> -
> -	vdds_dsi = devm_regulator_get(dsi->dev, "vdd");
> -
> -	if (IS_ERR(vdds_dsi)) {
> -		if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
> -			DSSERR("can't get DSI VDD regulator\n");
> -		return PTR_ERR(vdds_dsi);
> -	}
> -
> -	dsi->vdds_dsi_reg = vdds_dsi;
> -
> -	return 0;
> -}
> -
>  static void _dsi_print_reset_status(struct dsi_data *dsi)
>  {
>  	u32 l;
> @@ -1353,10 +1333,6 @@ static int dsi_pll_enable(struct dss_pll *pll)
>  
>  	DSSDBG("PLL init\n");
>  
> -	r = dsi_regulator_init(dsi);
> -	if (r)
> -		return r;
> -
>  	r = dsi_runtime_get(dsi);
>  	if (r)
>  		return r;
> @@ -4908,13 +4884,8 @@ static int dsi_get_clocks(struct dsi_data *dsi)
>  static int dsi_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct dsi_data *dsi = to_dsi_data(dssdev);
>  	int r;
>  
> -	r = dsi_regulator_init(dsi);
> -	if (r)
> -		return r;
> -
>  	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
> @@ -5384,6 +5355,13 @@ static int dsi_probe(struct platform_device *pdev)
>  		return r;
>  	}
>  
> +	dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd");
> +	if (IS_ERR(dsi->vdds_dsi_reg)) {
> +		if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER)
> +			DSSERR("can't get DSI VDD regulator\n");
> +		return PTR_ERR(dsi->vdds_dsi_reg);
> +	}
> +
>  	soc = soc_device_match(dsi_soc_devices);
>  	if (soc)
>  		dsi->data = soc->data;
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 5216c5554741..6edb85898a7d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -108,26 +108,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data)
>  	return IRQ_HANDLED;
>  }
>  
> -static int hdmi_init_regulator(struct omap_hdmi *hdmi)
> -{
> -	struct regulator *reg;
> -
> -	if (hdmi->vdda_reg != NULL)
> -		return 0;
> -
> -	reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
> -
> -	if (IS_ERR(reg)) {
> -		if (PTR_ERR(reg) != -EPROBE_DEFER)
> -			DSSERR("can't get VDDA regulator\n");
> -		return PTR_ERR(reg);
> -	}
> -
> -	hdmi->vdda_reg = reg;
> -
> -	return 0;
> -}
> -
>  static int hdmi_power_on_core(struct omap_hdmi *hdmi)
>  {
>  	int r;
> @@ -451,13 +431,8 @@ void hdmi4_core_disable(struct hdmi_core_data *core)
>  static int hdmi_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  	int r;
>  
> -	r = hdmi_init_regulator(hdmi);
> -	if (r)
> -		return r;
> -
>  	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
> @@ -827,6 +802,14 @@ static int hdmi4_probe(struct platform_device *pdev)
>  		goto err_free;
>  	}
>  
> +	hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
> +	if (IS_ERR(hdmi->vdda_reg)) {
> +		r = PTR_ERR(hdmi->vdda_reg);
> +		if (r != -EPROBE_DEFER)
> +			DSSERR("can't get VDDA regulator\n");
> +		goto err_free;
> +	}
> +
>  	pm_runtime_enable(&pdev->dev);
>  
>  	r = hdmi4_init_output(hdmi);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 363bc5843e0f..db20a578091b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -117,24 +117,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data)
>  	return IRQ_HANDLED;
>  }
>  
> -static int hdmi_init_regulator(struct omap_hdmi *hdmi)
> -{
> -	struct regulator *reg;
> -
> -	if (hdmi->vdda_reg != NULL)
> -		return 0;
> -
> -	reg = devm_regulator_get(&hdmi->pdev->dev, "vdda");
> -	if (IS_ERR(reg)) {
> -		DSSERR("can't get VDDA regulator\n");
> -		return PTR_ERR(reg);
> -	}
> -
> -	hdmi->vdda_reg = reg;
> -
> -	return 0;
> -}
> -
>  static int hdmi_power_on_core(struct omap_hdmi *hdmi)
>  {
>  	int r;
> @@ -454,13 +436,8 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi)
>  static int hdmi_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
>  	int r;
>  
> -	r = hdmi_init_regulator(hdmi);
> -	if (r)
> -		return r;
> -
>  	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
> @@ -817,6 +794,14 @@ static int hdmi5_probe(struct platform_device *pdev)
>  		goto err_free;
>  	}
>  
> +	hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda");
> +	if (IS_ERR(hdmi->vdda_reg)) {
> +		r = PTR_ERR(hdmi->vdda_reg);
> +		if (r != -EPROBE_DEFER)
> +			DSSERR("can't get VDDA regulator\n");
> +		goto err_free;
> +	}
> +
>  	pm_runtime_enable(&pdev->dev);
>  
>  	r = hdmi5_init_output(hdmi);
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index bbfd4ba3255c..1766c95236da 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -249,35 +249,11 @@ static int sdi_check_timings(struct omap_dss_device *dssdev,
>  	return 0;
>  }
>  
> -static int sdi_init_regulator(struct sdi_device *sdi)
> -{
> -	struct regulator *vdds_sdi;
> -
> -	if (sdi->vdds_sdi_reg)
> -		return 0;
> -
> -	vdds_sdi = devm_regulator_get(&sdi->pdev->dev, "vdds_sdi");
> -	if (IS_ERR(vdds_sdi)) {
> -		if (PTR_ERR(vdds_sdi) != -EPROBE_DEFER)
> -			DSSERR("can't get VDDS_SDI regulator\n");
> -		return PTR_ERR(vdds_sdi);
> -	}
> -
> -	sdi->vdds_sdi_reg = vdds_sdi;
> -
> -	return 0;
> -}
> -
>  static int sdi_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct sdi_device *sdi = dssdev_to_sdi(dssdev);
>  	int r;
>  
> -	r = sdi_init_regulator(sdi);
> -	if (r)
> -		return r;
> -
>  	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
> @@ -376,6 +352,14 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
>  	sdi->pdev = pdev;
>  	port->data = sdi;
>  
> +	sdi->vdds_sdi_reg = devm_regulator_get(&pdev->dev, "vdds_sdi");
> +	if (IS_ERR(sdi->vdds_sdi_reg)) {
> +		r = PTR_ERR(sdi->vdds_sdi_reg);
> +		if (r != -EPROBE_DEFER)
> +			DSSERR("can't get VDDS_SDI regulator\n");
> +		goto err_free;
> +	}
> +
>  	r = sdi_init_output(sdi);
>  	if (r)
>  		goto err_free;
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index db055260f50e..9c1fe6aef074 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -614,25 +614,6 @@ static int venc_check_timings(struct omap_dss_device *dssdev,
>  	}
>  }
>  
> -static int venc_init_regulator(struct venc_device *venc)
> -{
> -	struct regulator *vdda_dac;
> -
> -	if (venc->vdda_dac_reg != NULL)
> -		return 0;
> -
> -	vdda_dac = devm_regulator_get(&venc->pdev->dev, "vdda");
> -	if (IS_ERR(vdda_dac)) {
> -		if (PTR_ERR(vdda_dac) != -EPROBE_DEFER)
> -			DSSERR("can't get VDDA_DAC regulator\n");
> -		return PTR_ERR(vdda_dac);
> -	}
> -
> -	venc->vdda_dac_reg = vdda_dac;
> -
> -	return 0;
> -}
> -
>  static int venc_dump_regs(struct seq_file *s, void *p)
>  {
>  	struct venc_device *venc = s->private;
> @@ -713,13 +694,8 @@ static int venc_get_clocks(struct venc_device *venc)
>  static int venc_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
> -	struct venc_device *venc = dssdev_to_venc(dssdev);
>  	int r;
>  
> -	r = venc_init_regulator(venc);
> -	if (r)
> -		return r;
> -
>  	r = dss_mgr_connect(dssdev);
>  	if (r)
>  		return r;
> @@ -908,6 +884,14 @@ static int venc_probe(struct platform_device *pdev)
>  		goto err_free;
>  	}
>  
> +	venc->vdda_dac_reg = devm_regulator_get(&pdev->dev, "vdda");
> +	if (IS_ERR(venc->vdda_dac_reg)) {
> +		r = PTR_ERR(venc->vdda_dac_reg);
> +		if (r != -EPROBE_DEFER)
> +			DSSERR("can't get VDDA_DAC regulator\n");
> +		goto err_free;
> +	}
> +
>  	r = venc_get_clocks(venc);
>  	if (r)
>  		goto err_free;
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init
  2018-05-26 17:25 ` [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init Laurent Pinchart
@ 2018-06-11  0:01   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11  0:01 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:06PM +0300, Laurent Pinchart wrote:
> The crtc_idx and plane_idw variables in the main loop are always equal
> to the loop counter i, use it instead. Don't unnecessarily initialize
> dssdev to NULL.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c | 18 +++++-------------
>  1 file changed, 5 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 9b33859e9ac6..0d4c3e2db058 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -239,10 +239,9 @@ static int omap_modeset_init_properties(struct drm_device *dev)
>  static int omap_modeset_init(struct drm_device *dev)
>  {
>  	struct omap_drm_private *priv = dev->dev_private;
> -	struct omap_dss_device *dssdev = NULL;
>  	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
>  	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
> -	int num_crtcs, crtc_idx, plane_idx;
> +	int num_crtcs;
>  	unsigned int i;
>  	int ret;
>  	u32 plane_crtc_mask;
> @@ -275,10 +274,6 @@ static int omap_modeset_init(struct drm_device *dev)
>  	/* All planes can be put to any CRTC */
>  	plane_crtc_mask = (1 << num_crtcs) - 1;
>  
> -	dssdev = NULL;
> -
> -	crtc_idx = 0;
> -	plane_idx = 0;
>  	for (i = 0; i < priv->num_dssdevs; i++) {
>  		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  		struct drm_connector *connector;
> @@ -295,7 +290,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  		if (!connector)
>  			return -ENOMEM;
>  
> -		plane = omap_plane_init(dev, plane_idx, DRM_PLANE_TYPE_PRIMARY,
> +		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
>  					plane_crtc_mask);
>  		if (IS_ERR(plane))
>  			return PTR_ERR(plane);
> @@ -305,27 +300,24 @@ static int omap_modeset_init(struct drm_device *dev)
>  			return PTR_ERR(crtc);
>  
>  		drm_mode_connector_attach_encoder(connector, encoder);
> -		encoder->possible_crtcs = (1 << crtc_idx);
> +		encoder->possible_crtcs = 1 << i;
>  
>  		priv->crtcs[priv->num_crtcs++] = crtc;
>  		priv->planes[priv->num_planes++] = plane;
>  		priv->encoders[priv->num_encoders++] = encoder;
>  		priv->connectors[priv->num_connectors++] = connector;
> -
> -		plane_idx++;
> -		crtc_idx++;
>  	}
>  
>  	/*
>  	 * Create normal planes for the remaining overlays:
>  	 */
> -	for (; plane_idx < num_ovls; plane_idx++) {
> +	for (; i < num_ovls; i++) {
>  		struct drm_plane *plane;
>  
>  		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
>  			return -EINVAL;
>  
> -		plane = omap_plane_init(dev, plane_idx, DRM_PLANE_TYPE_OVERLAY,
> +		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
>  			plane_crtc_mask);
>  		if (IS_ERR(plane))
>  			return PTR_ERR(plane);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 49/60] drm/omap: Create all planes before CRTCs
  2018-05-26 17:25 ` [PATCH v2 49/60] drm/omap: Create all planes before CRTCs Laurent Pinchart
@ 2018-06-11  0:07   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11  0:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:07PM +0300, Laurent Pinchart wrote:
> Creating all the planes in a single location instead of creating them
> per-CRTC with remaining planes then created in a second step simplifies
> the logic.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c | 45 ++++++++++++++++----------------------
>  1 file changed, 19 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 0d4c3e2db058..99ed47a17ce3 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -271,14 +271,30 @@ static int omap_modeset_init(struct drm_device *dev)
>  		return -EINVAL;
>  	}
>  
> -	/* All planes can be put to any CRTC */
> +	/* Create all planes first. They can all be put to any CRTC. */
>  	plane_crtc_mask = (1 << num_crtcs) - 1;
>  
> +	for (i = 0; i < num_ovls; i++) {
> +		enum drm_plane_type type = i < priv->num_dssdevs
> +					 ? DRM_PLANE_TYPE_PRIMARY
> +					 : DRM_PLANE_TYPE_OVERLAY;
> +		struct drm_plane *plane;
> +
> +		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
> +			return -EINVAL;
> +
> +		plane = omap_plane_init(dev, i, type, plane_crtc_mask);
> +		if (IS_ERR(plane))
> +			return PTR_ERR(plane);
> +
> +		priv->planes[priv->num_planes++] = plane;
> +	}
> +
> +	/* Create the CRTCs, encoders and connectors. */
>  	for (i = 0; i < priv->num_dssdevs; i++) {
>  		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  		struct drm_connector *connector;
>  		struct drm_encoder *encoder;
> -		struct drm_plane *plane;
>  		struct drm_crtc *crtc;
>  
>  		encoder = omap_encoder_init(dev, dssdev);
> @@ -290,12 +306,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  		if (!connector)
>  			return -ENOMEM;
>  
> -		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
> -					plane_crtc_mask);
> -		if (IS_ERR(plane))
> -			return PTR_ERR(plane);
> -
> -		crtc = omap_crtc_init(dev, plane, dssdev);
> +		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
>  		if (IS_ERR(crtc))
>  			return PTR_ERR(crtc);
>  
> @@ -303,28 +314,10 @@ static int omap_modeset_init(struct drm_device *dev)
>  		encoder->possible_crtcs = 1 << i;
>  
>  		priv->crtcs[priv->num_crtcs++] = crtc;
> -		priv->planes[priv->num_planes++] = plane;
>  		priv->encoders[priv->num_encoders++] = encoder;
>  		priv->connectors[priv->num_connectors++] = connector;
>  	}
>  
> -	/*
> -	 * Create normal planes for the remaining overlays:
> -	 */
> -	for (; i < num_ovls; i++) {
> -		struct drm_plane *plane;
> -
> -		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
> -			return -EINVAL;
> -
> -		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
> -			plane_crtc_mask);
> -		if (IS_ERR(plane))
> -			return PTR_ERR(plane);
> -
> -		priv->planes[priv->num_planes++] = plane;
> -	}
> -
>  	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
>  		priv->num_planes, priv->num_crtcs, priv->num_encoders,
>  		priv->num_connectors);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure
  2018-05-26 17:25 ` [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure Laurent Pinchart
@ 2018-06-11 10:50   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 10:50 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:08PM +0300, Laurent Pinchart wrote:
> Create an omap_drm_pipeline structure to model display pipelines, made
> of a CRTC, an encoder, a connector and a DSS display device. This allows
> grouping related parameters together instead of storing them in
> independent arrays and thus improves code readability.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_crtc.c  |   4 +-
>  drivers/gpu/drm/omapdrm/omap_drv.c   | 144 +++++++++++++++++------------------
>  drivers/gpu/drm/omapdrm/omap_drv.h   |  20 +++--
>  drivers/gpu/drm/omapdrm/omap_fbdev.c |   4 +-
>  drivers/gpu/drm/omapdrm/omap_irq.c   |   4 +-
>  5 files changed, 84 insertions(+), 92 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index c5f1915aef67..f5bf553a862f 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -474,8 +474,8 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc)
>  	 * has been changed to the DRM model.
>  	 */
>  
> -	for (i = 0; i < priv->num_encoders; ++i) {
> -		struct drm_encoder *encoder = priv->encoders[i];
> +	for (i = 0; i < priv->num_pipes; ++i) {
> +		struct drm_encoder *encoder = priv->pipes[i].encoder;
>  
>  		if (encoder->crtc == crtc) {
>  			struct omap_dss_device *dssdev;
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 99ed47a17ce3..298d594a0c65 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -129,9 +129,9 @@ static const struct drm_mode_config_funcs omap_mode_config_funcs = {
>  	.atomic_commit = drm_atomic_helper_commit,
>  };
>  
> -static int get_connector_type(struct omap_dss_device *dssdev)
> +static int get_connector_type(struct omap_dss_device *display)
>  {
> -	switch (dssdev->type) {
> +	switch (display->type) {
>  	case OMAP_DISPLAY_TYPE_HDMI:
>  		return DRM_MODE_CONNECTOR_HDMIA;
>  	case OMAP_DISPLAY_TYPE_DVI:
> @@ -151,65 +151,65 @@ static int get_connector_type(struct omap_dss_device *dssdev)
>  	}
>  }
>  
> -static void omap_disconnect_dssdevs(struct drm_device *ddev)
> +static void omap_disconnect_pipelines(struct drm_device *ddev)
>  {
>  	struct omap_drm_private *priv = ddev->dev_private;
>  	unsigned int i;
>  
> -	for (i = 0; i < priv->num_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_dss_device *display = priv->pipes[i].display;
>  
> -		omapdss_device_disconnect(dssdev, NULL);
> -		priv->dssdevs[i] = NULL;
> -		omapdss_device_put(dssdev);
> +		omapdss_device_disconnect(display, NULL);
> +		priv->pipes[i].display = NULL;
> +		omapdss_device_put(display);
>  	}
>  
> -	priv->num_dssdevs = 0;
> +	priv->num_pipes = 0;
>  }
>  
> -static int omap_compare_dssdevs(const void *a, const void *b)
> +static int omap_compare_pipes(const void *a, const void *b)
>  {
> -	const struct omap_dss_device *dssdev1 = *(struct omap_dss_device **)a;
> -	const struct omap_dss_device *dssdev2 = *(struct omap_dss_device **)b;
> +	const struct omap_drm_pipeline *pipe1 = a;
> +	const struct omap_drm_pipeline *pipe2 = b;
>  
> -	if (dssdev1->alias_id > dssdev2->alias_id)
> +	if (pipe1->display->alias_id > pipe2->display->alias_id)
>  		return 1;
> -	else if (dssdev1->alias_id < dssdev2->alias_id)
> +	else if (pipe1->display->alias_id < pipe2->display->alias_id)
>  		return -1;
>  	return 0;
>  }
>  
> -static int omap_connect_dssdevs(struct drm_device *ddev)
> +static int omap_connect_pipelines(struct drm_device *ddev)
>  {
>  	struct omap_drm_private *priv = ddev->dev_private;
> -	struct omap_dss_device *dssdev = NULL;
> +	struct omap_dss_device *display = NULL;
>  	int r;
>  
>  	if (!omapdss_stack_is_ready())
>  		return -EPROBE_DEFER;
>  
> -	for_each_dss_display(dssdev) {
> -		r = omapdss_device_connect(priv->dss, dssdev, NULL);
> +	for_each_dss_display(display) {
> +		r = omapdss_device_connect(priv->dss, display, NULL);
>  		if (r == -EPROBE_DEFER) {
> -			omapdss_device_put(dssdev);
> +			omapdss_device_put(display);
>  			goto cleanup;
>  		} else if (r) {
> -			dev_warn(dssdev->dev, "could not connect display: %s\n",
> -				dssdev->name);
> +			dev_warn(display->dev, "could not connect display: %s\n",
> +				display->name);
>  		} else {
> -			omapdss_device_get(dssdev);
> -			priv->dssdevs[priv->num_dssdevs++] = dssdev;
> -			if (priv->num_dssdevs == ARRAY_SIZE(priv->dssdevs)) {
> +			omapdss_device_get(display);
> +			priv->pipes[priv->num_pipes++].display = display;
> +			if (priv->num_pipes == ARRAY_SIZE(priv->pipes)) {
>  				/* To balance the 'for_each_dss_display' loop */
> -				omapdss_device_put(dssdev);
> +				omapdss_device_put(display);
>  				break;
>  			}
>  		}
>  	}
>  
>  	/* Sort the list by DT aliases */
> -	sort(priv->dssdevs, priv->num_dssdevs, sizeof(priv->dssdevs[0]),
> -	     omap_compare_dssdevs, NULL);
> +	sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
> +	     omap_compare_pipes, NULL);
>  
>  	return 0;
>  
> @@ -218,7 +218,7 @@ static int omap_connect_dssdevs(struct drm_device *ddev)
>  	 * if we are deferring probe, we disconnect the devices we previously
>  	 * connected
>  	 */
> -	omap_disconnect_dssdevs(ddev);
> +	omap_disconnect_pipelines(ddev);
>  
>  	return r;
>  }
> @@ -241,7 +241,6 @@ static int omap_modeset_init(struct drm_device *dev)
>  	struct omap_drm_private *priv = dev->dev_private;
>  	int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
>  	int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
> -	int num_crtcs;
>  	unsigned int i;
>  	int ret;
>  	u32 plane_crtc_mask;
> @@ -260,22 +259,17 @@ static int omap_modeset_init(struct drm_device *dev)
>  	 * configuration does not match the expectations or exceeds
>  	 * the available resources, the configuration is rejected.
>  	 */
> -	num_crtcs = priv->num_dssdevs;
> -	if (num_crtcs > num_mgrs || num_crtcs > num_ovls ||
> -	    num_crtcs > ARRAY_SIZE(priv->crtcs) ||
> -	    num_crtcs > ARRAY_SIZE(priv->planes) ||
> -	    num_crtcs > ARRAY_SIZE(priv->encoders) ||
> -	    num_crtcs > ARRAY_SIZE(priv->connectors)) {
> +	if (priv->num_pipes > num_mgrs || priv->num_pipes > num_ovls) {
>  		dev_err(dev->dev, "%s(): Too many connected displays\n",
>  			__func__);
>  		return -EINVAL;
>  	}
>  
>  	/* Create all planes first. They can all be put to any CRTC. */
> -	plane_crtc_mask = (1 << num_crtcs) - 1;
> +	plane_crtc_mask = (1 << priv->num_pipes) - 1;
>  
>  	for (i = 0; i < num_ovls; i++) {
> -		enum drm_plane_type type = i < priv->num_dssdevs
> +		enum drm_plane_type type = i < priv->num_pipes
>  					 ? DRM_PLANE_TYPE_PRIMARY
>  					 : DRM_PLANE_TYPE_OVERLAY;
>  		struct drm_plane *plane;
> @@ -291,36 +285,36 @@ static int omap_modeset_init(struct drm_device *dev)
>  	}
>  
>  	/* Create the CRTCs, encoders and connectors. */
> -	for (i = 0; i < priv->num_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	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;
>  
> -		encoder = omap_encoder_init(dev, dssdev);
> +		encoder = omap_encoder_init(dev, display);
>  		if (!encoder)
>  			return -ENOMEM;
>  
>  		connector = omap_connector_init(dev,
> -				get_connector_type(dssdev), dssdev, encoder);
> +				get_connector_type(display), display, encoder);
>  		if (!connector)
>  			return -ENOMEM;
>  
> -		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
> +		crtc = omap_crtc_init(dev, priv->planes[i], display);
>  		if (IS_ERR(crtc))
>  			return PTR_ERR(crtc);
>  
>  		drm_mode_connector_attach_encoder(connector, encoder);
>  		encoder->possible_crtcs = 1 << i;
>  
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> -		priv->encoders[priv->num_encoders++] = encoder;
> -		priv->connectors[priv->num_connectors++] = connector;
> +		pipe->crtc = crtc;
> +		pipe->encoder = encoder;
> +		pipe->connector = connector;
>  	}
>  
> -	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
> -		priv->num_planes, priv->num_crtcs, priv->num_encoders,
> -		priv->num_connectors);
> +	DBG("registered %u planes, %u crtcs/encoders/connectors\n",
> +	    priv->num_planes, priv->num_pipes);
>  
>  	dev->mode_config.min_width = 8;
>  	dev->mode_config.min_height = 2;
> @@ -355,11 +349,11 @@ static void omap_modeset_enable_external_hpd(struct drm_device *ddev)
>  	struct omap_drm_private *priv = ddev->dev_private;
>  	int i;
>  
> -	for (i = 0; i < priv->num_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_dss_device *display = priv->pipes[i].display;
>  
> -		if (dssdev->driver->enable_hpd)
> -			dssdev->driver->enable_hpd(dssdev);
> +		if (display->driver->enable_hpd)
> +			display->driver->enable_hpd(display);
>  	}
>  }
>  
> @@ -371,11 +365,11 @@ static void omap_modeset_disable_external_hpd(struct drm_device *ddev)
>  	struct omap_drm_private *priv = ddev->dev_private;
>  	int i;
>  
> -	for (i = 0; i < priv->num_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_dss_device *display = priv->pipes[i].display;
>  
> -		if (dssdev->driver->disable_hpd)
> -			dssdev->driver->disable_hpd(dssdev);
> +		if (display->driver->disable_hpd)
> +			display->driver->disable_hpd(display);
>  	}
>  }
>  
> @@ -561,7 +555,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  
>  	omap_crtc_pre_init(priv);
>  
> -	ret = omap_connect_dssdevs(ddev);
> +	ret = omap_connect_pipelines(ddev);
>  	if (ret)
>  		goto err_crtc_uninit;
>  
> @@ -586,14 +580,14 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  	}
>  
>  	/* Initialize vblank handling, start with all CRTCs disabled. */
> -	ret = drm_vblank_init(ddev, priv->num_crtcs);
> +	ret = drm_vblank_init(ddev, priv->num_pipes);
>  	if (ret) {
>  		dev_err(priv->dev, "could not init vblank\n");
>  		goto err_cleanup_modeset;
>  	}
>  
> -	for (i = 0; i < priv->num_crtcs; i++)
> -		drm_crtc_vblank_off(priv->crtcs[i]);
> +	for (i = 0; i < priv->num_pipes; i++)
> +		drm_crtc_vblank_off(priv->pipes[i].crtc);
>  
>  	omap_fbdev_init(ddev);
>  
> @@ -621,7 +615,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
>  err_gem_deinit:
>  	omap_gem_deinit(ddev);
>  	destroy_workqueue(priv->wq);
> -	omap_disconnect_dssdevs(ddev);
> +	omap_disconnect_pipelines(ddev);
>  err_crtc_uninit:
>  	omap_crtc_pre_uninit(priv);
>  	drm_dev_unref(ddev);
> @@ -650,7 +644,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
>  
>  	destroy_workqueue(priv->wq);
>  
> -	omap_disconnect_dssdevs(ddev);
> +	omap_disconnect_pipelines(ddev);
>  	omap_crtc_pre_uninit(priv);
>  
>  	drm_dev_unref(ddev);
> @@ -700,17 +694,17 @@ 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_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_dss_device *display = priv->pipes[i].display;
>  
> -		if (!dssdev->driver)
> +		if (!display->driver)
>  			continue;
>  
> -		if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
> -			dssdev->driver->disable(dssdev);
> -			dssdev->activate_after_resume = true;
> +		if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
> +			display->driver->disable(display);
> +			display->activate_after_resume = true;
>  		} else {
> -			dssdev->activate_after_resume = false;
> +			display->activate_after_resume = false;
>  		}
>  	}
>  
> @@ -722,15 +716,15 @@ 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_dssdevs; i++) {
> -		struct omap_dss_device *dssdev = priv->dssdevs[i];
> +	for (i = 0; i < priv->num_pipes; i++) {
> +		struct omap_dss_device *display = priv->pipes[i].display;
>  
> -		if (!dssdev->driver)
> +		if (!display->driver)
>  			continue;
>  
> -		if (dssdev->activate_after_resume) {
> -			dssdev->driver->enable(dssdev);
> -			dssdev->activate_after_resume = false;
> +		if (display->activate_after_resume) {
> +			display->driver->enable(display);
> +			display->activate_after_resume = false;
>  		}
>  	}
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index 006c868c528d..bc9b954fcc31 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -45,6 +45,13 @@
>  
>  struct omap_drm_usergart;
>  
> +struct omap_drm_pipeline {
> +	struct drm_crtc *crtc;
> +	struct drm_encoder *encoder;
> +	struct drm_connector *connector;
> +	struct omap_dss_device *display;
> +};
> +
>  struct omap_drm_private {
>  	struct drm_device *ddev;
>  	struct device *dev;
> @@ -54,21 +61,12 @@ struct omap_drm_private {
>  	struct dispc_device *dispc;
>  	const struct dispc_ops *dispc_ops;
>  
> -	unsigned int num_dssdevs;
> -	struct omap_dss_device *dssdevs[8];
> -
> -	unsigned int num_crtcs;
> -	struct drm_crtc *crtcs[8];
> +	unsigned int num_pipes;
> +	struct omap_drm_pipeline pipes[8];
>  
>  	unsigned int num_planes;
>  	struct drm_plane *planes[8];
>  
> -	unsigned int num_encoders;
> -	struct drm_encoder *encoders[8];
> -
> -	unsigned int num_connectors;
> -	struct drm_connector *connectors[8];
> -
>  	struct drm_fb_helper *fbdev;
>  
>  	struct workqueue_struct *wq;
> diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> index d958cc813a94..b445309b0143 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> @@ -243,7 +243,7 @@ void omap_fbdev_init(struct drm_device *dev)
>  	struct drm_fb_helper *helper;
>  	int ret = 0;
>  
> -	if (!priv->num_crtcs || !priv->num_connectors)
> +	if (!priv->num_pipes)
>  		return;
>  
>  	fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
> @@ -256,7 +256,7 @@ void omap_fbdev_init(struct drm_device *dev)
>  
>  	drm_fb_helper_prepare(dev, helper, &omap_fb_helper_funcs);
>  
> -	ret = drm_fb_helper_init(dev, helper, priv->num_connectors);
> +	ret = drm_fb_helper_init(dev, helper, priv->num_pipes);
>  	if (ret)
>  		goto fail;
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
> index c85115049f86..329ad26d6d50 100644
> --- a/drivers/gpu/drm/omapdrm/omap_irq.c
> +++ b/drivers/gpu/drm/omapdrm/omap_irq.c
> @@ -206,8 +206,8 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
>  
>  	VERB("irqs: %08x", irqstatus);
>  
> -	for (id = 0; id < priv->num_crtcs; id++) {
> -		struct drm_crtc *crtc = priv->crtcs[id];
> +	for (id = 0; id < priv->num_pipes; id++) {
> +		struct drm_crtc *crtc = priv->pipes[id].crtc;
>  		enum omap_channel channel = omap_crtc_channel(crtc);
>  
>  		if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel)) {
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations
  2018-05-26 17:25 ` [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
@ 2018-06-11 11:59   ` Sebastian Reichel
  2018-06-11 19:21     ` Laurent Pinchart
  0 siblings, 1 reply; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 11:59 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:09PM +0300, 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.
> 
> To reconcile the omapdrm and omapdss drivers with the DRM bridge and
> panel model, we need to reverse the direction of the DSS device
> operations. Start with the connect and disconnect operations.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

Looks mostly good, but I found one issue:

[...]

> -static void dsicm_disconnect(struct omap_dss_device *dssdev)
> +static void dsicm_disconnect(struct omap_dss_device *src,
> +			     struct omap_dss_device *dst)
>  {
> -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *src = dssdev->src;
> +	struct panel_drv_data *ddata = to_panel_data(dst);
>  
>  	src->ops->dsi.release_vc(src, ddata->channel);

^^^ using src in dsicm_disconnect()

> -	omapdss_device_disconnect(src, dssdev);
> -
> -	omapdss_device_put(src);
>  }
>  
>  static int dsicm_enable(struct omap_dss_device *dssdev)
> @@ -1404,7 +1382,7 @@ static int __exit dsicm_remove(struct platform_device *pdev)
>  	omapdss_device_unregister(dssdev);
>  
>  	dsicm_disable(dssdev);
> -	dsicm_disconnect(dssdev);
> +	dsicm_disconnect(NULL, dssdev);

^^^ calling dsicm_disconnect() with src=NULL

This will execute dsi_release_vc(NULL, channel), which will try to
dereference NULL.

-- 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] 127+ messages in thread

* Re: [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect
  2018-05-26 17:25 ` [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect Laurent Pinchart
@ 2018-06-11 11:59   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 11:59 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:10PM +0300, Laurent Pinchart wrote:
> When a DSS output is (dis)connected the omapdss_output_(un)set_device()
> function performs a sanity check to ensure that the output isn't already
> (dis)connected. The check is unnecessary as those situations should
> never happen, but can nonetheless be useful to catch driver bugs. To
> prepare for removal of the omapdss_output_(un)set_device() functions
> move the connection check to the omapdss_device_connect() function. The
> omapdss_device_disconnect() already contains a corresponding check.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c   |  1 +
>  drivers/gpu/drm/omapdrm/dss/output.c | 29 ++---------------------------
>  2 files changed, 3 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 7f41c541397b..3afb3d574a7b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -209,6 +209,7 @@ int omapdss_device_connect(struct dss_device *dss,
>  	}
>  
>  	if (src) {
> +		WARN_ON(src->dst);
>  		dst->src = src;
>  		src->dst = dst;
>  	}
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 2f7a019d059e..96d74218cf91 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -29,61 +29,36 @@ static DEFINE_MUTEX(output_lock);
>  int omapdss_output_set_device(struct omap_dss_device *out,
>  		struct omap_dss_device *dssdev)
>  {
> -	int r;
> +	int r = 0;
>  
>  	mutex_lock(&output_lock);
>  
> -	if (out->dst) {
> -		dev_err(out->dev,
> -			"output already has device %s connected to it\n",
> -			out->dst->name);
> -		r = -EINVAL;
> -		goto err;
> -	}
> -
>  	if (out->output_type != dssdev->type) {
>  		dev_err(out->dev, "output type and display type don't match\n");
>  		r = -EINVAL;
> -		goto err;
>  	}
>  
>  	mutex_unlock(&output_lock);
>  
> -	return 0;
> -err:
> -	mutex_unlock(&output_lock);
> -
>  	return r;
>  }
>  EXPORT_SYMBOL(omapdss_output_set_device);
>  
>  int omapdss_output_unset_device(struct omap_dss_device *out)
>  {
> -	int r;
> +	int r = 0;
>  
>  	mutex_lock(&output_lock);
>  
> -	if (!out->dst) {
> -		dev_err(out->dev,
> -			"output doesn't have a device connected to it\n");
> -		r = -EINVAL;
> -		goto err;
> -	}
> -
>  	if (out->dst->state != OMAP_DSS_DISPLAY_DISABLED) {
>  		dev_err(out->dev,
>  			"device %s is not disabled, cannot unset device\n",
>  			out->dst->name);
>  		r = -EINVAL;
> -		goto err;
>  	}
>  
>  	mutex_unlock(&output_lock);
>  
> -	return 0;
> -err:
> -	mutex_unlock(&output_lock);
> -
>  	return r;
>  }
>  EXPORT_SYMBOL(omapdss_output_unset_device);
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time
  2018-05-26 17:25 ` [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time Laurent Pinchart
@ 2018-06-11 11:59   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 11:59 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:11PM +0300, Laurent Pinchart wrote:
> The display type is validated when the display is connected to the DSS
> output. We already have all the information we need for validation when
> initializing the outputs. Move validation to output initialization to
> simplify pipeline connection handling.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c     | 25 +++++++++++--------------
>  drivers/gpu/drm/omapdrm/dss/dsi.c     | 25 +++++++++++--------------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 25 +++++++++++--------------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 25 +++++++++++--------------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  3 +--
>  drivers/gpu/drm/omapdrm/dss/output.c  | 17 +++++------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c     | 25 +++++++++++--------------
>  drivers/gpu/drm/omapdrm/dss/venc.c    | 25 +++++++++++--------------
>  8 files changed, 72 insertions(+), 98 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index dc50a220382c..831de09770a3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -620,24 +620,13 @@ static int dpi_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst->next);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void dpi_disconnect(struct omap_dss_device *src,
> @@ -664,6 +653,7 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  {
>  	struct omap_dss_device *out = &dpi->output;
>  	u32 port_num = 0;
> +	int r;
>  
>  	of_property_read_u32(port, "reg", &port_num);
>  	dpi->id = port_num <= 2 ? port_num : 0;
> @@ -696,6 +686,13 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index a5516d6e8017..53a32e20c3bd 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4890,24 +4890,13 @@ static int dsi_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst->next);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void dsi_disconnect(struct omap_dss_device *src,
> @@ -5147,6 +5136,7 @@ static const struct component_ops dsi_component_ops = {
>  static int dsi_init_output(struct dsi_data *dsi)
>  {
>  	struct omap_dss_device *out = &dsi->output;
> +	int r;
>  
>  	out->dev = dsi->dev;
>  	out->id = dsi->module_id == 0 ?
> @@ -5166,6 +5156,13 @@ static int dsi_init_output(struct dsi_data *dsi)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 9f883669e71b..22f8b74f5bf5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -437,24 +437,13 @@ static int hdmi_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst->next);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void hdmi_disconnect(struct omap_dss_device *src,
> @@ -717,6 +706,7 @@ static const struct component_ops hdmi4_component_ops = {
>  static int hdmi4_init_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
> +	int r;
>  
>  	out->dev = &hdmi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_HDMI;
> @@ -734,6 +724,13 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index beb70b1fab94..d8592d02a58d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -442,24 +442,13 @@ static int hdmi_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst->next);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void hdmi_disconnect(struct omap_dss_device *src,
> @@ -709,6 +698,7 @@ static const struct component_ops hdmi5_component_ops = {
>  static int hdmi5_init_output(struct omap_hdmi *hdmi)
>  {
>  	struct omap_dss_device *out = &hdmi->output;
> +	int r;
>  
>  	out->dev = &hdmi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_HDMI;
> @@ -726,6 +716,13 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index d88e302fbc8d..7add73a5479a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -517,8 +517,7 @@ int omap_dss_get_num_overlays(void);
>  
>  #define for_each_dss_output(d) \
>  	while ((d = omapdss_device_get_next(d, false, true)) != NULL)
> -int omapdss_output_set_device(struct omap_dss_device *out,
> -		struct omap_dss_device *dssdev);
> +int omapdss_output_validate(struct omap_dss_device *out);
>  int omapdss_output_unset_device(struct omap_dss_device *out);
>  
>  typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 96d74218cf91..be544dd48bf4 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -26,23 +26,16 @@
>  
>  static DEFINE_MUTEX(output_lock);
>  
> -int omapdss_output_set_device(struct omap_dss_device *out,
> -		struct omap_dss_device *dssdev)
> +int omapdss_output_validate(struct omap_dss_device *out)
>  {
> -	int r = 0;
> -
> -	mutex_lock(&output_lock);
> -
> -	if (out->output_type != dssdev->type) {
> +	if (out->next && out->output_type != out->next->type) {
>  		dev_err(out->dev, "output type and display type don't match\n");
> -		r = -EINVAL;
> +		return -EINVAL;
>  	}
>  
> -	mutex_unlock(&output_lock);
> -
> -	return r;
> +	return 0;
>  }
> -EXPORT_SYMBOL(omapdss_output_set_device);
> +EXPORT_SYMBOL(omapdss_output_validate);
>  
>  int omapdss_output_unset_device(struct omap_dss_device *out)
>  {
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index f6e26a0a7efd..5c197688c0f9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -258,24 +258,13 @@ static int sdi_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void sdi_disconnect(struct omap_dss_device *src,
> @@ -301,6 +290,7 @@ static const struct omap_dss_device_ops sdi_ops = {
>  static int sdi_init_output(struct sdi_device *sdi)
>  {
>  	struct omap_dss_device *out = &sdi->output;
> +	int r;
>  
>  	out->dev = &sdi->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_SDI;
> @@ -319,6 +309,13 @@ static int sdi_init_output(struct sdi_device *sdi)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index dfdd066a0ee5..216b31cc5ec1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -700,24 +700,13 @@ static int venc_connect(struct omap_dss_device *src,
>  	if (r)
>  		return r;
>  
> -	r = omapdss_output_set_device(dst, dst->next);
> +	r = omapdss_device_connect(dst->dss, dst, dst->next);
>  	if (r) {
> -		DSSERR("failed to connect output to new device: %s\n",
> -				dst->name);
> -		goto err_mgr_disconnect;
> +		dss_mgr_disconnect(dst);
> +		return r;
>  	}
>  
> -	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r)
> -		goto err_output_unset;
> -
>  	return 0;
> -
> -err_output_unset:
> -	omapdss_output_unset_device(dst);
> -err_mgr_disconnect:
> -	dss_mgr_disconnect(dst);
> -	return r;
>  }
>  
>  static void venc_disconnect(struct omap_dss_device *src,
> @@ -787,6 +776,7 @@ static const struct component_ops venc_component_ops = {
>  static int venc_init_output(struct venc_device *venc)
>  {
>  	struct omap_dss_device *out = &venc->output;
> +	int r;
>  
>  	out->dev = &venc->pdev->dev;
>  	out->id = OMAP_DSS_OUTPUT_VENC;
> @@ -804,6 +794,13 @@ static int venc_init_output(struct venc_device *venc)
>  		return PTR_ERR(out->next);
>  	}
>  
> +	r = omapdss_output_validate(out);
> +	if (r) {
> +		omapdss_device_put(out->next);
> +		out->next = NULL;
> +		return r;
> +	}
> +
>  	omapdss_device_register(out);
>  
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers
  2018-05-26 17:25 ` [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers Laurent Pinchart
@ 2018-06-11 11:59   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 11:59 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:12PM +0300, Laurent Pinchart wrote:
> To simplify the pipeline disconnection handling merge the
> omapdss_device_disconnect() and omapdss_output_unset_device() functions.
> The device state check is now called for every device in the pipeline,
> extending this sanity check coverage.
> 
> There is no need to return an error from omapdss_device_disconnect()
> when the check fails, as omapdss_output_unset_device() used to do, given
> that we can't prevent disconnection due to device unbinding (the return
> value of omapdss_output_unset_device() is never checked in the current
> code for that reason).
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    |  2 ++
>  drivers/gpu/drm/omapdrm/dss/dpi.c     |  1 -
>  drivers/gpu/drm/omapdrm/dss/dsi.c     |  1 -
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   |  1 -
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   |  1 -
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  1 -
>  drivers/gpu/drm/omapdrm/dss/output.c  | 21 ---------------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c     |  1 -
>  drivers/gpu/drm/omapdrm/dss/venc.c    |  1 -
>  9 files changed, 2 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index 3afb3d574a7b..fbb600d49ad2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -236,6 +236,8 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  		src->dst = NULL;
>  	}
>  
> +	WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED);
> +
>  	if (dst->driver)
>  		dst->driver->disconnect(src, dst);
>  	else
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 831de09770a3..4cf397c9300e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -633,7 +633,6 @@ static void dpi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 53a32e20c3bd..bc470baa4f5c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4903,7 +4903,6 @@ static void dsi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 22f8b74f5bf5..6616530d5fe6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -450,7 +450,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index d8592d02a58d..f7e15edc05fc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -455,7 +455,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 7add73a5479a..672761b5b017 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -518,7 +518,6 @@ int omap_dss_get_num_overlays(void);
>  #define for_each_dss_output(d) \
>  	while ((d = omapdss_device_get_next(d, false, true)) != NULL)
>  int omapdss_output_validate(struct omap_dss_device *out);
> -int omapdss_output_unset_device(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 be544dd48bf4..2da480be918d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -24,8 +24,6 @@
>  #include "dss.h"
>  #include "omapdss.h"
>  
> -static DEFINE_MUTEX(output_lock);
> -
>  int omapdss_output_validate(struct omap_dss_device *out)
>  {
>  	if (out->next && out->output_type != out->next->type) {
> @@ -37,25 +35,6 @@ int omapdss_output_validate(struct omap_dss_device *out)
>  }
>  EXPORT_SYMBOL(omapdss_output_validate);
>  
> -int omapdss_output_unset_device(struct omap_dss_device *out)
> -{
> -	int r = 0;
> -
> -	mutex_lock(&output_lock);
> -
> -	if (out->dst->state != OMAP_DSS_DISPLAY_DISABLED) {
> -		dev_err(out->dev,
> -			"device %s is not disabled, cannot unset device\n",
> -			out->dst->name);
> -		r = -EINVAL;
> -	}
> -
> -	mutex_unlock(&output_lock);
> -
> -	return r;
> -}
> -EXPORT_SYMBOL(omapdss_output_unset_device);
> -
>  int dss_install_mgr_ops(struct dss_device *dss,
>  			const struct dss_mgr_ops *mgr_ops,
>  			struct omap_drm_private *priv)
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 5c197688c0f9..09c10ba4946b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -271,7 +271,6 @@ static void sdi_disconnect(struct omap_dss_device *src,
>  			   struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 216b31cc5ec1..997c4aebd560 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -713,7 +713,6 @@ static void venc_disconnect(struct omap_dss_device *src,
>  			    struct omap_dss_device *dst)
>  {
>  	omapdss_device_disconnect(dst, dst->next);
> -	omapdss_output_unset_device(dst);
>  
>  	dss_mgr_disconnect(dst);
>  }
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init()
  2018-05-26 17:25 ` [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init() Laurent Pinchart
@ 2018-06-11 12:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:13PM +0300, Laurent Pinchart wrote:
> Replace the dss display device pointer by a pipe pointer that will allow
> the omap_crtc_init() function to access both the display and the DSS
> output. As a result we can remove the omapdss_device_get_dispc_channel()
> function that is now unneeded.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/base.c    | 9 ---------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 1 -
>  drivers/gpu/drm/omapdrm/omap_crtc.c   | 7 ++++---
>  drivers/gpu/drm/omapdrm/omap_crtc.h   | 4 +++-
>  drivers/gpu/drm/omapdrm/omap_drv.c    | 2 +-
>  5 files changed, 8 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
> index fbb600d49ad2..cce09a48d769 100644
> --- a/drivers/gpu/drm/omapdrm/dss/base.c
> +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> @@ -247,15 +247,6 @@ void omapdss_device_disconnect(struct omap_dss_device *src,
>  }
>  EXPORT_SYMBOL_GPL(omapdss_device_disconnect);
>  
> -enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev)
> -{
> -	while (dssdev->src)
> -		dssdev = dssdev->src;
> -
> -	return dssdev->dispc_channel;
> -}
> -EXPORT_SYMBOL(omapdss_device_get_dispc_channel);
> -
>  /* -----------------------------------------------------------------------------
>   * Components Handling
>   */
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 672761b5b017..d7084ca36d0e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -509,7 +509,6 @@ 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);
> -enum omap_channel omapdss_device_get_dispc_channel(struct omap_dss_device *dssdev);
>  
>  int omap_dss_get_num_overlay_managers(void);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index f5bf553a862f..f5bdb8de98f4 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -693,7 +693,8 @@ void omap_crtc_pre_uninit(struct omap_drm_private *priv)
>  
>  /* initialize crtc */
>  struct drm_crtc *omap_crtc_init(struct drm_device *dev,
> -		struct drm_plane *plane, struct omap_dss_device *dssdev)
> +				struct omap_drm_pipeline *pipe,
> +				struct drm_plane *plane)
>  {
>  	struct omap_drm_private *priv = dev->dev_private;
>  	struct drm_crtc *crtc = NULL;
> @@ -701,7 +702,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  	enum omap_channel channel;
>  	int ret;
>  
> -	channel = omapdss_device_get_dispc_channel(dssdev);
> +	channel = pipe->output->dispc_channel;
>  
>  	DBG("%s", channel_names[channel]);
>  
> @@ -724,7 +725,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  					&omap_crtc_funcs, NULL);
>  	if (ret < 0) {
>  		dev_err(dev->dev, "%s(): could not init crtc for: %s\n",
> -			__func__, dssdev->name);
> +			__func__, pipe->display->name);
>  		kfree(omap_crtc);
>  		return ERR_PTR(ret);
>  	}
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
> index 1c6530703855..d9de437ba9dd 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.h
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
> @@ -27,6 +27,7 @@ enum omap_channel;
>  struct drm_crtc;
>  struct drm_device;
>  struct drm_plane;
> +struct omap_drm_pipeline;
>  struct omap_dss_device;
>  struct videomode;
>  
> @@ -35,7 +36,8 @@ enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
>  void omap_crtc_pre_init(struct omap_drm_private *priv);
>  void omap_crtc_pre_uninit(struct omap_drm_private *priv);
>  struct drm_crtc *omap_crtc_init(struct drm_device *dev,
> -		struct drm_plane *plane, struct omap_dss_device *dssdev);
> +				struct omap_drm_pipeline *pipe,
> +				struct drm_plane *plane);
>  int omap_crtc_wait_pending(struct drm_crtc *crtc);
>  void omap_crtc_error_irq(struct drm_crtc *crtc, u32 irqstatus);
>  void omap_crtc_vblank_irq(struct drm_crtc *crtc);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index dc2f059f8f4d..6bc826515684 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -308,7 +308,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  		if (!connector)
>  			return -ENOMEM;
>  
> -		crtc = omap_crtc_init(dev, priv->planes[i], display);
> +		crtc = omap_crtc_init(dev, pipe, priv->planes[i]);
>  		if (IS_ERR(crtc))
>  			return PTR_ERR(crtc);
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private
  2018-05-26 17:25 ` [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private Laurent Pinchart
@ 2018-06-11 12:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:14PM +0300, Laurent Pinchart wrote:
> The omap_crtcs global array is used to store pointers to omap_crtc
> indexed by DISPC channel number, in order to look them up in the dss_mgr
> operations. Store the information in the omap_drm_private structure in
> the form of an array of omap_drm_pipeline pointers.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_crtc.c | 22 +++++++++-------------
>  drivers/gpu/drm/omapdrm/omap_drv.c  | 19 +++++++++++++++++++
>  drivers/gpu/drm/omapdrm/omap_drv.h  |  1 +
>  3 files changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index f5bdb8de98f4..9742d9f49a7c 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -109,7 +109,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
>   */
>  
>  /* ovl-mgr-id -> crtc */
> -static struct omap_crtc *omap_crtcs[8];
>  static struct omap_dss_device *omap_crtc_output[8];
>  
>  /* we can probably ignore these until we support command-mode panels: */
> @@ -215,7 +214,8 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
>  static int omap_crtc_dss_enable(struct omap_drm_private *priv,
>  				enum omap_channel channel)
>  {
> -	struct omap_crtc *omap_crtc = omap_crtcs[channel];
> +	struct drm_crtc *crtc = priv->channels[channel]->crtc;
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
>  
>  	priv->dispc_ops->mgr_set_timings(priv->dispc, omap_crtc->channel,
>  					 &omap_crtc->vm);
> @@ -227,7 +227,8 @@ static int omap_crtc_dss_enable(struct omap_drm_private *priv,
>  static void omap_crtc_dss_disable(struct omap_drm_private *priv,
>  				  enum omap_channel channel)
>  {
> -	struct omap_crtc *omap_crtc = omap_crtcs[channel];
> +	struct drm_crtc *crtc = priv->channels[channel]->crtc;
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
>  
>  	omap_crtc_set_enabled(&omap_crtc->base, false);
>  }
> @@ -236,7 +237,9 @@ static void omap_crtc_dss_set_timings(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		const struct videomode *vm)
>  {
> -	struct omap_crtc *omap_crtc = omap_crtcs[channel];
> +	struct drm_crtc *crtc = priv->channels[channel]->crtc;
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> +
>  	DBG("%s", omap_crtc->name);
>  	omap_crtc->vm = *vm;
>  }
> @@ -245,7 +248,8 @@ static void omap_crtc_dss_set_lcd_config(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		const struct dss_lcd_mgr_config *config)
>  {
> -	struct omap_crtc *omap_crtc = omap_crtcs[channel];
> +	struct drm_crtc *crtc = priv->channels[channel]->crtc;
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
>  
>  	DBG("%s", omap_crtc->name);
>  	priv->dispc_ops->mgr_set_lcd_config(priv->dispc, omap_crtc->channel,
> @@ -681,8 +685,6 @@ static const char *channel_names[] = {
>  
>  void omap_crtc_pre_init(struct omap_drm_private *priv)
>  {
> -	memset(omap_crtcs, 0, sizeof(omap_crtcs));
> -
>  	dss_install_mgr_ops(priv->dss, &mgr_ops, priv);
>  }
>  
> @@ -706,10 +708,6 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  
>  	DBG("%s", channel_names[channel]);
>  
> -	/* Multiple displays on same channel is not allowed */
> -	if (WARN_ON(omap_crtcs[channel] != NULL))
> -		return ERR_PTR(-EINVAL);
> -
>  	omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL);
>  	if (!omap_crtc)
>  		return ERR_PTR(-ENOMEM);
> @@ -748,7 +746,5 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  
>  	omap_plane_install_properties(crtc->primary, &crtc->base);
>  
> -	omap_crtcs[channel] = omap_crtc;
> -
>  	return crtc;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 6bc826515684..c3c657d90029 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -167,6 +167,8 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)
>  		pipe->display = NULL;
>  	}
>  
> +	memset(&priv->channels, 0, sizeof(priv->channels));
> +
>  	priv->num_pipes = 0;
>  }
>  
> @@ -186,6 +188,7 @@ 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())
> @@ -218,6 +221,22 @@ static int omap_connect_pipelines(struct drm_device *ddev)
>  	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:
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index a38d07d4d6ea..bd7f2c227a25 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -64,6 +64,7 @@ struct omap_drm_private {
>  
>  	unsigned int num_pipes;
>  	struct omap_drm_pipeline pipes[8];
> +	struct omap_drm_pipeline *channels[8];
>  
>  	unsigned int num_planes;
>  	struct drm_plane *planes[8];
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array
  2018-05-26 17:25 ` [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array Laurent Pinchart
@ 2018-06-11 12:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:15PM +0300, Laurent Pinchart wrote:
> The omap_crtc_output global array is used to look up the DSS output
> device by channel. We can replace that by accessing the output device
> from the pipeline if we store the pipeline pointer in the omap_crtc
> structure.
> 
> The global array is also used to protect against double connection of an
> output. This can't happen with the connection handling mechanism going
> from DSS outputs to displays. We can thus drop that check, allowing
> removal of the global array.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_crtc.c | 12 +++---------
>  1 file changed, 3 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 9742d9f49a7c..5a56c8e02179 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -41,6 +41,7 @@ struct omap_crtc {
>  	struct drm_crtc base;
>  
>  	const char *name;
> +	struct omap_drm_pipeline *pipe;
>  	enum omap_channel channel;
>  
>  	struct videomode vm;
> @@ -108,9 +109,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
>   * job of sequencing the setup of the video pipe in the proper order
>   */
>  
> -/* ovl-mgr-id -> crtc */
> -static struct omap_dss_device *omap_crtc_output[8];
> -
>  /* we can probably ignore these until we support command-mode panels: */
>  static int omap_crtc_dss_connect(struct omap_drm_private *priv,
>  		enum omap_channel channel,
> @@ -119,13 +117,9 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
>  	const struct dispc_ops *dispc_ops = priv->dispc_ops;
>  	struct dispc_device *dispc = priv->dispc;
>  
> -	if (omap_crtc_output[channel])
> -		return -EINVAL;
> -
>  	if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
>  		return -EINVAL;
>  
> -	omap_crtc_output[channel] = dst;
>  	dst->dispc_channel_connected = true;
>  
>  	return 0;
> @@ -135,7 +129,6 @@ static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		struct omap_dss_device *dst)
>  {
> -	omap_crtc_output[channel] = NULL;
>  	dst->dispc_channel_connected = false;
>  }
>  
> @@ -158,7 +151,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
>  	if (WARN_ON(omap_crtc->enabled == enable))
>  		return;
>  
> -	if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) {
> +	if (omap_crtc->pipe->output->output_type == OMAP_DISPLAY_TYPE_HDMI) {
>  		priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
>  		omap_crtc->enabled = enable;
>  		return;
> @@ -716,6 +709,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  
>  	init_waitqueue_head(&omap_crtc->pending_wait);
>  
> +	omap_crtc->pipe = pipe;
>  	omap_crtc->channel = channel;
>  	omap_crtc->name = channel_names[channel];
>  
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler
  2018-05-26 17:25 ` [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler Laurent Pinchart
@ 2018-06-11 12:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:16PM +0300, Laurent Pinchart wrote:
> The CRTC connect handler checks whether the DSS output supports the
> DISPC channel assigned to it. As the channel is assigned to the output
> by the output driver a failure there could only result from a driver
> bug. All the output drivers have been verified and they are always
> assigned a DISPC channel that is supported on the SoC they run on. The
> check can thus be removed.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dispc.c   | 8 --------
>  drivers/gpu/drm/omapdrm/dss/dss.c     | 6 ------
>  drivers/gpu/drm/omapdrm/dss/dss.h     | 2 --
>  drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 --
>  drivers/gpu/drm/omapdrm/omap_crtc.c   | 6 ------
>  5 files changed, 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
> index 7f3ac6b13b56..bc207f2fb200 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dispc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
> @@ -2904,13 +2904,6 @@ static int dispc_ovl_enable(struct dispc_device *dispc,
>  	return 0;
>  }
>  
> -static enum omap_dss_output_id
> -dispc_mgr_get_supported_outputs(struct dispc_device *dispc,
> -				enum omap_channel channel)
> -{
> -	return dss_get_supported_outputs(dispc->dss, channel);
> -}
> -
>  static void dispc_lcd_enable_signal_polarity(struct dispc_device *dispc,
>  					     bool act_high)
>  {
> @@ -4742,7 +4735,6 @@ static const struct dispc_ops dispc_ops = {
>  	.mgr_set_lcd_config = dispc_mgr_set_lcd_config,
>  	.mgr_set_timings = dispc_mgr_set_timings,
>  	.mgr_setup = dispc_mgr_setup,
> -	.mgr_get_supported_outputs = dispc_mgr_get_supported_outputs,
>  	.mgr_gamma_size = dispc_mgr_gamma_size,
>  	.mgr_set_gamma = dispc_mgr_set_gamma,
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index 5b7613ff2f2e..d2760107ccf2 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -678,12 +678,6 @@ unsigned long dss_get_max_fck_rate(struct dss_device *dss)
>  	return dss->feat->fck_freq_max;
>  }
>  
> -enum omap_dss_output_id dss_get_supported_outputs(struct dss_device *dss,
> -						  enum omap_channel channel)
> -{
> -	return dss->feat->outputs[channel];
> -}
> -
>  static int dss_setup_default_clock(struct dss_device *dss)
>  {
>  	unsigned long max_dss_fck, prate;
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
> index 54f96241b9ea..81dd0c910ea1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -314,8 +314,6 @@ void dss_runtime_put(struct dss_device *dss);
>  
>  unsigned long dss_get_dispc_clk_rate(struct dss_device *dss);
>  unsigned long dss_get_max_fck_rate(struct dss_device *dss);
> -enum omap_dss_output_id dss_get_supported_outputs(struct dss_device *dss,
> -						  enum omap_channel channel);
>  int dss_dpi_select_source(struct dss_device *dss, int port,
>  			  enum omap_channel channel);
>  void dss_select_hdmi_venc_clk_source(struct dss_device *dss,
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index d7084ca36d0e..bb340a08c44a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -636,8 +636,6 @@ struct dispc_ops {
>  				const struct videomode *vm);
>  	void (*mgr_setup)(struct dispc_device *dispc, enum omap_channel channel,
>  			  const struct omap_overlay_manager_info *info);
> -	enum omap_dss_output_id (*mgr_get_supported_outputs)(
> -			struct dispc_device *dispc, enum omap_channel channel);
>  	u32 (*mgr_gamma_size)(struct dispc_device *dispc,
>  			      enum omap_channel channel);
>  	void (*mgr_set_gamma)(struct dispc_device *dispc,
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 5a56c8e02179..90917d040ddb 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -114,12 +114,6 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		struct omap_dss_device *dst)
>  {
> -	const struct dispc_ops *dispc_ops = priv->dispc_ops;
> -	struct dispc_device *dispc = priv->dispc;
> -
> -	if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
> -		return -EINVAL;
> -
>  	dst->dispc_channel_connected = true;
>  
>  	return 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] 127+ messages in thread

* Re: [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers
  2018-05-26 17:25 ` [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers Laurent Pinchart
@ 2018-06-11 12:00   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:00 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:17PM +0300, Laurent Pinchart wrote:
> The omap_dss_device.dispc_channel_connect field is used by DSS outputs
> to fail the .enable() operation if they're not connected. Set the field
> directly from the (dis)connect handlers of the DSS outputs instead of
> going through the CRTC dss_mgr operations.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c   | 3 +++
>  drivers/gpu/drm/omapdrm/dss/dsi.c   | 3 +++
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c | 3 +++
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c | 3 +++
>  drivers/gpu/drm/omapdrm/dss/sdi.c   | 3 +++
>  drivers/gpu/drm/omapdrm/dss/venc.c  | 3 +++
>  drivers/gpu/drm/omapdrm/omap_crtc.c | 3 ---
>  7 files changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 4cf397c9300e..72d873c2abcc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -626,12 +626,15 @@ static int dpi_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index bc470baa4f5c..bd5e463558be 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4896,12 +4896,15 @@ static int dsi_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 6616530d5fe6..1e025a8b99c9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -443,12 +443,15 @@ static int hdmi_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index f7e15edc05fc..d5860438ddd9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -448,12 +448,15 @@ static int hdmi_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index 09c10ba4946b..ed2595a60984 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -264,12 +264,15 @@ static int sdi_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 997c4aebd560..4f20183c7861 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -706,12 +706,15 @@ static int venc_connect(struct omap_dss_device *src,
>  		return r;
>  	}
>  
> +	dst->dispc_channel_connected = true;
>  	return 0;
>  }
>  
>  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);
>  
>  	dss_mgr_disconnect(dst);
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 90917d040ddb..7f837697e76c 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -114,8 +114,6 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = true;
> -
>  	return 0;
>  }
>  
> @@ -123,7 +121,6 @@ static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
>  		enum omap_channel channel,
>  		struct omap_dss_device *dst)
>  {
> -	dst->dispc_channel_connected = false;
>  }
>  
>  static void omap_crtc_dss_start_update(struct omap_drm_private *priv,
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations
  2018-05-26 17:25 ` [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations Laurent Pinchart
@ 2018-06-11 12:01   ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 12:01 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Sat, May 26, 2018 at 08:25:18PM +0300, Laurent Pinchart wrote:
> The dss_mgr .connect() and .disconnect() are implemented as no-op in
> omapdrm. The operations are unneeded, remove them.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

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

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dpi.c     | 10 +---------
>  drivers/gpu/drm/omapdrm/dss/dsi.c     | 10 +---------
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 10 +---------
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 10 +---------
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  9 ---------
>  drivers/gpu/drm/omapdrm/dss/output.c  | 14 --------------
>  drivers/gpu/drm/omapdrm/dss/sdi.c     | 10 +---------
>  drivers/gpu/drm/omapdrm/dss/venc.c    | 10 +---------
>  drivers/gpu/drm/omapdrm/omap_crtc.c   | 15 ---------------
>  9 files changed, 6 insertions(+), 92 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index 72d873c2abcc..764ffc4bad32 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -616,15 +616,9 @@ static int dpi_connect(struct omap_dss_device *src,
>  
>  	dpi_init_pll(dpi);
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -636,8 +630,6 @@ static void dpi_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static const struct omap_dss_device_ops dpi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index bd5e463558be..6fe9e2b78144 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -4886,15 +4886,9 @@ static int dsi_connect(struct omap_dss_device *src,
>  {
>  	int r;
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -4906,8 +4900,6 @@ static void dsi_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static const struct omap_dss_device_ops dsi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 1e025a8b99c9..c4fcdc9ed62d 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -433,15 +433,9 @@ static int hdmi_connect(struct omap_dss_device *src,
>  {
>  	int r;
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -453,8 +447,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static int hdmi_read_edid(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index d5860438ddd9..889c31745492 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -438,15 +438,9 @@ static int hdmi_connect(struct omap_dss_device *src,
>  {
>  	int r;
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -458,8 +452,6 @@ static void hdmi_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static int hdmi_read_edid(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index bb340a08c44a..882a2f8f7ac5 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -550,13 +550,6 @@ enum dss_writeback_channel {
>  };
>  
>  struct dss_mgr_ops {
> -	int (*connect)(struct omap_drm_private *priv,
> -		       enum omap_channel channel,
> -		       struct omap_dss_device *dst);
> -	void (*disconnect)(struct omap_drm_private *priv,
> -			   enum omap_channel channel,
> -			   struct omap_dss_device *dst);
> -
>  	void (*start_update)(struct omap_drm_private *priv,
>  			     enum omap_channel channel);
>  	int (*enable)(struct omap_drm_private *priv,
> @@ -582,8 +575,6 @@ int dss_install_mgr_ops(struct dss_device *dss,
>  			struct omap_drm_private *priv);
>  void dss_uninstall_mgr_ops(struct dss_device *dss);
>  
> -int dss_mgr_connect(struct omap_dss_device *dssdev);
> -void dss_mgr_disconnect(struct omap_dss_device *dssdev);
>  void dss_mgr_set_timings(struct omap_dss_device *dssdev,
>  		const struct videomode *vm);
>  void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
> diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c
> index 2da480be918d..18505bc70f7e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/output.c
> +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> @@ -56,20 +56,6 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
>  }
>  EXPORT_SYMBOL(dss_uninstall_mgr_ops);
>  
> -int dss_mgr_connect(struct omap_dss_device *dssdev)
> -{
> -	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
> -					     dssdev->dispc_channel, dssdev);
> -}
> -EXPORT_SYMBOL(dss_mgr_connect);
> -
> -void dss_mgr_disconnect(struct omap_dss_device *dssdev)
> -{
> -	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
> -					 dssdev->dispc_channel, dssdev);
> -}
> -EXPORT_SYMBOL(dss_mgr_disconnect);
> -
>  void dss_mgr_set_timings(struct omap_dss_device *dssdev,
>  			 const struct videomode *vm)
>  {
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index ed2595a60984..e83daa06711e 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -254,15 +254,9 @@ static int sdi_connect(struct omap_dss_device *src,
>  {
>  	int r;
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -274,8 +268,6 @@ static void sdi_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static const struct omap_dss_device_ops sdi_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
> index 4f20183c7861..72fb52e5ff59 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -696,15 +696,9 @@ static int venc_connect(struct omap_dss_device *src,
>  {
>  	int r;
>  
> -	r = dss_mgr_connect(dst);
> -	if (r)
> -		return r;
> -
>  	r = omapdss_device_connect(dst->dss, dst, dst->next);
> -	if (r) {
> -		dss_mgr_disconnect(dst);
> +	if (r)
>  		return r;
> -	}
>  
>  	dst->dispc_channel_connected = true;
>  	return 0;
> @@ -716,8 +710,6 @@ static void venc_disconnect(struct omap_dss_device *src,
>  	dst->dispc_channel_connected = false;
>  
>  	omapdss_device_disconnect(dst, dst->next);
> -
> -	dss_mgr_disconnect(dst);
>  }
>  
>  static const struct omap_dss_device_ops venc_ops = {
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 7f837697e76c..80498dcde6d7 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -110,19 +110,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
>   */
>  
>  /* we can probably ignore these until we support command-mode panels: */
> -static int omap_crtc_dss_connect(struct omap_drm_private *priv,
> -		enum omap_channel channel,
> -		struct omap_dss_device *dst)
> -{
> -	return 0;
> -}
> -
> -static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
> -		enum omap_channel channel,
> -		struct omap_dss_device *dst)
> -{
> -}
> -
>  static void omap_crtc_dss_start_update(struct omap_drm_private *priv,
>  				       enum omap_channel channel)
>  {
> @@ -254,8 +241,6 @@ static void omap_crtc_dss_unregister_framedone(
>  }
>  
>  static const struct dss_mgr_ops mgr_ops = {
> -	.connect = omap_crtc_dss_connect,
> -	.disconnect = omap_crtc_dss_disconnect,
>  	.start_update = omap_crtc_dss_start_update,
>  	.enable = omap_crtc_dss_enable,
>  	.disable = omap_crtc_dss_disable,
> -- 
> 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] 127+ messages in thread

* Re: [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro
  2018-06-10 23:52   ` Sebastian Reichel
@ 2018-06-11 17:11     ` Laurent Pinchart
  2018-06-11 21:06       ` Sebastian Reichel
  0 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-06-11 17:11 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 11 June 2018 02:52:44 EEST Sebastian Reichel wrote:
> On Sat, May 26, 2018 at 08:25:02PM +0300, Laurent Pinchart wrote:
> > Similarly to for_each_dss_display(), the for_each_dss_output() macro
> > iterates over all the DSS connected outputs.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> > 
> >  drivers/gpu/drm/omapdrm/dss/base.c    | 20 ++++++++++++++------
> >  drivers/gpu/drm/omapdrm/dss/omapdss.h |  9 ++++++---
> >  2 files changed, 20 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/dss/base.c
> > b/drivers/gpu/drm/omapdrm/dss/base.c index 96be800a0f25..519682f18d36
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/dss/base.c
> > +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> > @@ -127,11 +127,13 @@ struct omap_dss_device
> > *omapdss_find_device_by_port(struct device_node *src,> 
> >  /*
> >  
> >   * Search for the next device starting at @from. If display_only is true,
> >   skip> 
> > - * non-display devices. Release the reference to the @from device, and
> > acquire - * a reference to the returned device if found.
> > + * non-display devices. If output_only is true, skip non-output devices
> > and + * non-connected output devices. 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,> 
> > -						bool display_only)
> > +						bool display_only,
> > +						bool output_only)
> 
> display_only and output_only are mutually exclusive, so I think it
> would be better to use this as parameter. It would also improve
> code readability a bit:
> 
> enum omapdss_device_type {
>     OMAPDSS_DEVICE_TYPE_ALL,
>     OMAPDSS_DEVICE_TYPE_OUTPUT_ONLY,
>     OMAPDSS_DEVICE_TYPE_DISPLAY_ONLY,
> };

That's a good point, even if all this code is meant to disappear.

What would you think of

enum omap_dss_device_type {
	OMAP_DSS_DEVICE_TYPE_OUTPUT = (1 << 0),
	OMAP_DSS_DEVICE_TYPE_DISPLAY = (1 << 1),
};

and combining the flags when passed to omapdss_device_get_next() ?


> >  {
> >  
> >  	struct omap_dss_device *dssdev;
> >  	struct list_head *list;
> > 
> > @@ -159,9 +161,15 @@ struct omap_dss_device
> > *omapdss_device_get_next(struct omap_dss_device *from,> 
> >  			goto done;
> >  		
> >  		}
> > 
> > -		/* Filter out non-display entries if display_only is set. */
> > -		if (!display_only || dssdev->driver)
> > -			goto done;
> > +		/*
> > +		 * Filter out non-display entries if display_only is set, and
> > +		 * non-output entries if output_only is set.
> > +		 */
> > +		if (display_only && !dssdev->driver)
> > +			continue;
> > +		if (output_only && (!dssdev->id || !dssdev->next))
> > +			continue;
> > +		goto done;
> > 
> >  	}
> >  	
> >  	dssdev = NULL;
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 5d3e4ced73d1..723124f6e596
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> > @@ -488,9 +488,9 @@ static inline bool omapdss_is_initialized(void)
> > 
> >  	return !!omapdss_get_dss();
> >  
> >  }
> > 
> > -void omapdss_display_init(struct omap_dss_device *dssdev);
> > 
> >  #define for_each_dss_display(d) \
> > 
> > -	while ((d = omapdss_device_get_next(d, true)) != NULL)
> > +	while ((d = omapdss_device_get_next(d, true, false)) != NULL)
> > +void omapdss_display_init(struct omap_dss_device *dssdev);
> > 
> >  void omapdss_device_register(struct omap_dss_device *dssdev);
> >  void omapdss_device_unregister(struct omap_dss_device *dssdev);
> > 
> > @@ -499,7 +499,8 @@ 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,> 
> > -						bool display_only);
> > +						bool display_only,
> > +						bool output_only);
> > 
> >  int omapdss_device_connect(struct dss_device *dss,
> >  
> >  			   struct omap_dss_device *src,
> >  			   struct omap_dss_device *dst);
> > 
> > @@ -511,6 +512,8 @@ 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, false, true)) != NULL)
> > 
> >  int omapdss_output_set_device(struct omap_dss_device *out,
> >  
> >  		struct omap_dss_device *dssdev);
> >  
> >  int omapdss_output_unset_device(struct omap_dss_device *out);


-- 
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] 127+ messages in thread

* Re: [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect()
  2018-06-10 23:48   ` Sebastian Reichel
@ 2018-06-11 17:16     ` Laurent Pinchart
  2018-06-11 21:02       ` Sebastian Reichel
  0 siblings, 1 reply; 127+ messages in thread
From: Laurent Pinchart @ 2018-06-11 17:16 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 11 June 2018 02:48:45 EEST Sebastian Reichel wrote:
> On Sat, May 26, 2018 at 08:25:04PM +0300, Laurent Pinchart wrote:
> > The dss_mgr_connect() and dss_mgr_disconnect() functions take two
> > omap_dss_device pointers as parameters, which are always set to the same
> > value by all callers. Remove the duplicated pointer.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> > 
> >  drivers/gpu/drm/omapdrm/dss/dpi.c     | 8 +++-----
> >  drivers/gpu/drm/omapdrm/dss/dsi.c     | 8 +++-----
> >  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 8 +++-----
> >  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 8 +++-----
> >  drivers/gpu/drm/omapdrm/dss/omapdss.h | 6 ++----
> >  drivers/gpu/drm/omapdrm/dss/output.c  | 9 ++++-----
> >  drivers/gpu/drm/omapdrm/dss/sdi.c     | 8 +++-----
> >  drivers/gpu/drm/omapdrm/dss/venc.c    | 8 +++-----
> >  8 files changed, 24 insertions(+), 39 deletions(-)

[snip]

> > diff --git a/drivers/gpu/drm/omapdrm/dss/output.c
> > b/drivers/gpu/drm/omapdrm/dss/output.c index 191b2e801257..2f7a019d059e
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/dss/output.c
> > +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> > @@ -109,18 +109,17 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
> >  }
> >  EXPORT_SYMBOL(dss_uninstall_mgr_ops);
> > 
> > -int dss_mgr_connect(struct omap_dss_device *dssdev, struct
> > omap_dss_device *dst)
> > +int dss_mgr_connect(struct omap_dss_device *dssdev)
> >  {
> >  	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
> > -					     dssdev->dispc_channel, dst);
> > +					     dssdev->dispc_channel, dssdev);
> 
> Maybe also change mgr_ops->connect, so that it only takes dssdev
> as a parameter? Otherwise

It would make sense, but patch 60/60 in this series drops the mgr_ops->connect 
operation completely, so I don't think it's worth changing this.

> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
> 
> >  }
> >  EXPORT_SYMBOL(dss_mgr_connect);

[snip]

-- 
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] 127+ messages in thread

* Re: [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations
  2018-06-11 11:59   ` Sebastian Reichel
@ 2018-06-11 19:21     ` Laurent Pinchart
  0 siblings, 0 replies; 127+ messages in thread
From: Laurent Pinchart @ 2018-06-11 19:21 UTC (permalink / raw)
  To: Sebastian Reichel; +Cc: Tomi Valkeinen, dri-devel

Hi Sebastian,

On Monday, 11 June 2018 14:59:13 EEST Sebastian Reichel wrote:
> On Sat, May 26, 2018 at 08:25:09PM +0300, 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.
> > 
> > To reconcile the omapdrm and omapdss drivers with the DRM bridge and
> > panel model, we need to reverse the direction of the DSS device
> > operations. Start with the connect and disconnect operations.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> 
> Looks mostly good, but I found one issue:
> 
> [...]
> 
> > -static void dsicm_disconnect(struct omap_dss_device *dssdev)
> > +static void dsicm_disconnect(struct omap_dss_device *src,
> > +			     struct omap_dss_device *dst)
> >  {
> > -	struct panel_drv_data *ddata = to_panel_data(dssdev);
> > -	struct omap_dss_device *src = dssdev->src;
> > +	struct panel_drv_data *ddata = to_panel_data(dst);
> > 
> >  	src->ops->dsi.release_vc(src, ddata->channel);
> 
> ^^^ using src in dsicm_disconnect()
> 
> > -	omapdss_device_disconnect(src, dssdev);
> > -
> > -	omapdss_device_put(src);
> >  }
> >  
> >  static int dsicm_enable(struct omap_dss_device *dssdev)
> > @@ -1404,7 +1382,7 @@ static int __exit dsicm_remove(struct
> > platform_device *pdev)> 
> >  	omapdss_device_unregister(dssdev);
> >  	
> >  	dsicm_disable(dssdev);
> > -	dsicm_disconnect(dssdev);
> > +	dsicm_disconnect(NULL, dssdev);
> 
> ^^^ calling dsicm_disconnect() with src=NULL
> 
> This will execute dsi_release_vc(NULL, channel), which will try to
> dereference NULL.

Good catch. I'll replace this line with 

	dsicm_disconnect(dssdev->src, dssdev);

-- 
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] 127+ messages in thread

* Re: [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect()
  2018-06-11 17:16     ` Laurent Pinchart
@ 2018-06-11 21:02       ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 21:02 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Mon, Jun 11, 2018 at 08:16:24PM +0300, Laurent Pinchart wrote:
> Hi Sebastian,
> 
> On Monday, 11 June 2018 02:48:45 EEST Sebastian Reichel wrote:
> > On Sat, May 26, 2018 at 08:25:04PM +0300, Laurent Pinchart wrote:
> > > The dss_mgr_connect() and dss_mgr_disconnect() functions take two
> > > omap_dss_device pointers as parameters, which are always set to the same
> > > value by all callers. Remove the duplicated pointer.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > ---
> > > 
> > >  drivers/gpu/drm/omapdrm/dss/dpi.c     | 8 +++-----
> > >  drivers/gpu/drm/omapdrm/dss/dsi.c     | 8 +++-----
> > >  drivers/gpu/drm/omapdrm/dss/hdmi4.c   | 8 +++-----
> > >  drivers/gpu/drm/omapdrm/dss/hdmi5.c   | 8 +++-----
> > >  drivers/gpu/drm/omapdrm/dss/omapdss.h | 6 ++----
> > >  drivers/gpu/drm/omapdrm/dss/output.c  | 9 ++++-----
> > >  drivers/gpu/drm/omapdrm/dss/sdi.c     | 8 +++-----
> > >  drivers/gpu/drm/omapdrm/dss/venc.c    | 8 +++-----
> > >  8 files changed, 24 insertions(+), 39 deletions(-)
> 
> [snip]
> 
> > > diff --git a/drivers/gpu/drm/omapdrm/dss/output.c
> > > b/drivers/gpu/drm/omapdrm/dss/output.c index 191b2e801257..2f7a019d059e
> > > 100644
> > > --- a/drivers/gpu/drm/omapdrm/dss/output.c
> > > +++ b/drivers/gpu/drm/omapdrm/dss/output.c
> > > @@ -109,18 +109,17 @@ void dss_uninstall_mgr_ops(struct dss_device *dss)
> > >  }
> > >  EXPORT_SYMBOL(dss_uninstall_mgr_ops);
> > > 
> > > -int dss_mgr_connect(struct omap_dss_device *dssdev, struct
> > > omap_dss_device *dst)
> > > +int dss_mgr_connect(struct omap_dss_device *dssdev)
> > >  {
> > >  	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
> > > -					     dssdev->dispc_channel, dst);
> > > +					     dssdev->dispc_channel, dssdev);
> > 
> > Maybe also change mgr_ops->connect, so that it only takes dssdev
> > as a parameter? Otherwise
> 
> It would make sense, but patch 60/60 in this series drops the mgr_ops->connect 
> operation completely, so I don't think it's worth changing this.

Right. I only checked a few patches ahead:

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

-- 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] 127+ messages in thread

* Re: [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro
  2018-06-11 17:11     ` Laurent Pinchart
@ 2018-06-11 21:06       ` Sebastian Reichel
  0 siblings, 0 replies; 127+ messages in thread
From: Sebastian Reichel @ 2018-06-11 21:06 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: Tomi Valkeinen, dri-devel


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

Hi,

On Mon, Jun 11, 2018 at 08:11:09PM +0300, Laurent Pinchart wrote:
> Hi Sebastian,
> 
> On Monday, 11 June 2018 02:52:44 EEST Sebastian Reichel wrote:
> > On Sat, May 26, 2018 at 08:25:02PM +0300, Laurent Pinchart wrote:
> > > Similarly to for_each_dss_display(), the for_each_dss_output() macro
> > > iterates over all the DSS connected outputs.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > ---
> > > 
> > >  drivers/gpu/drm/omapdrm/dss/base.c    | 20 ++++++++++++++------
> > >  drivers/gpu/drm/omapdrm/dss/omapdss.h |  9 ++++++---
> > >  2 files changed, 20 insertions(+), 9 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/omapdrm/dss/base.c
> > > b/drivers/gpu/drm/omapdrm/dss/base.c index 96be800a0f25..519682f18d36
> > > 100644
> > > --- a/drivers/gpu/drm/omapdrm/dss/base.c
> > > +++ b/drivers/gpu/drm/omapdrm/dss/base.c
> > > @@ -127,11 +127,13 @@ struct omap_dss_device
> > > *omapdss_find_device_by_port(struct device_node *src,> 
> > >  /*
> > >  
> > >   * Search for the next device starting at @from. If display_only is true,
> > >   skip> 
> > > - * non-display devices. Release the reference to the @from device, and
> > > acquire - * a reference to the returned device if found.
> > > + * non-display devices. If output_only is true, skip non-output devices
> > > and + * non-connected output devices. 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,> 
> > > -						bool display_only)
> > > +						bool display_only,
> > > +						bool output_only)
> > 
> > display_only and output_only are mutually exclusive, so I think it
> > would be better to use this as parameter. It would also improve
> > code readability a bit:
> > 
> > enum omapdss_device_type {
> >     OMAPDSS_DEVICE_TYPE_ALL,
> >     OMAPDSS_DEVICE_TYPE_OUTPUT_ONLY,
> >     OMAPDSS_DEVICE_TYPE_DISPLAY_ONLY,
> > };
> 
> That's a good point, even if all this code is meant to disappear.
> What would you think of
> 
> enum omap_dss_device_type {
> 	OMAP_DSS_DEVICE_TYPE_OUTPUT = (1 << 0),
> 	OMAP_DSS_DEVICE_TYPE_DISPLAY = (1 << 1),
> };
> 
> and combining the flags when passed to omapdss_device_get_next() ?

Sounds good to me.

-- 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] 127+ messages in thread

* Re: [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations
  2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
                   ` (59 preceding siblings ...)
  2018-05-26 17:25 ` [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations Laurent Pinchart
@ 2018-06-13  6:56 ` Tomi Valkeinen
  60 siblings, 0 replies; 127+ messages in thread
From: Tomi Valkeinen @ 2018-06-13  6:56 UTC (permalink / raw)
  To: Laurent Pinchart, dri-devel

Hi Laurent,

On 26/05/18 20:24, Laurent Pinchart wrote:

> The patches are based on top of the "[PATCH v2 0/6] omapdrm: struct_mutex
> removal" patch series I've sent yesterday, itself based on top of Dave's
> drm-next branch. They can be found at
> 
>         git://linuxtv.org/pinchartl/media.git omapdrm/bridge

That branch doesn't exists, I guess it's omapdrm/bridge/next?

I picked the patches from omapdrm/bridge/next onto my 4.19 branch, and testing with x15, when I remove omapdrm modules I get:

[   34.208080] ------------[ cut here ]------------
[   34.212767] WARNING: CPU: 1 PID: 370 at drivers/gpu/drm/omapdrm/dss/base.c:227 omapdss_device_disconnect+0xa8/0xec [omapdss_base]
[   34.225347] Modules linked in: omapdrm(-) drm_kms_helper drm drm_panel_orientation_quirks cfbfillrect cfbimgblt cfbcopyarea connector_dvi panel_sony_acx565akm pan
el_dpi connector_analog_tv connector_hdmi encoder_tpd12s015 encoder_tfp410 omapdss omapdss_base cec snd_soc_omap_hdmi_audio
[   34.251500] CPU: 1 PID: 370 Comm: rmmod Not tainted 4.17.0-00070-g2efec4ad4e77 #2
[   34.259031] Hardware name: Generic DRA74X (Flattened Device Tree)
[   34.265165] Backtrace: 
[   34.267659] [<c010f5e0>] (dump_backtrace) from [<c010f8b0>] (show_stack+0x18/0x1c)
[   34.275277]  r7:00000000 r6:600f0013 r5:00000000 r4:c0fc1320
[   34.280981] [<c010f898>] (show_stack) from [<c09c7578>] (dump_stack+0xac/0xe0)
[   34.288255] [<c09c74cc>] (dump_stack) from [<c013eb54>] (__warn+0xe8/0x114)
[   34.295262]  r7:00000009 r6:bf01a19c r5:00000000 r4:00000000
[   34.300965] [<c013ea6c>] (__warn) from [<c013ec9c>] (warn_slowpath_null+0x44/0x50)
[   34.308586]  r9:eb958000 r8:ed215000 r7:ed215000 r6:bf0194cc r5:000000e3 r4:bf01a19c
[   34.316393] [<c013ec58>] (warn_slowpath_null) from [<bf0194cc>] (omapdss_device_disconnect+0xa8/0xec [omapdss_base])
[   34.326975]  r6:00000000 r5:00000000 r4:ed342d50
[   34.331660] [<bf019424>] (omapdss_device_disconnect [omapdss_base]) from [<bf187280>] (omap_disconnect_pipelines+0x34/0x7c [omapdrm])
[   34.343724]  r5:00000000 r4:ed215000
[   34.347367] [<bf18724c>] (omap_disconnect_pipelines [omapdrm]) from [<bf187378>] (pdev_remove+0xb0/0xd4 [omapdrm])
[   34.357777]  r7:ed215000 r6:ed12a000 r5:ed215014 r4:00000001
[   34.363501] [<bf1872c8>] (pdev_remove [omapdrm]) from [<c0646750>] (platform_drv_remove+0x28/0x48)
[   34.372515]  r9:eb958000 r8:c0f987c4 r7:c0f98790 r6:bf194104 r5:ed347810 r4:ed347810
[   34.380312] [<c0646728>] (platform_drv_remove) from [<c0644754>] (device_release_driver_internal+0x170/0x218)
[   34.390283]  r5:ed347844 r4:ed347810
[   34.393895] [<c06445e4>] (device_release_driver_internal) from [<c0644858>] (driver_detach+0x40/0x74)
[   34.403171]  r9:eb958000 r8:c0fd12f0 r7:c0c55eb8 r6:c0fd12d8 r5:bf194104 r4:ed347810
[   34.410968] [<c0644818>] (driver_detach) from [<c0643334>] (bus_remove_driver+0x64/0xdc)
[   34.419106]  r5:bf1910c4 r4:bf194104
[   34.422716] [<c06432d0>] (bus_remove_driver) from [<c06456b0>] (driver_unregister+0x30/0x50)
[   34.431205]  r5:bf1910c4 r4:bf194104
[   34.434812] [<c0645680>] (driver_unregister) from [<c0646870>] (platform_unregister_drivers+0x34/0x68)
[   34.444171]  r5:bf1910c4 r4:bf1910c8
[   34.447800] [<c064683c>] (platform_unregister_drivers) from [<bf190100>] (omap_drm_fini+0x24/0xf24 [omapdrm])
[   34.457776]  r9:eb958000 r8:c01011c4 r7:0003deec r6:00000800 r5:c0f08948 r4:bf1944c0
[   34.465591] [<bf1900dc>] (omap_drm_fini [omapdrm]) from [<c01fc8b4>] (sys_delete_module+0x1ac/0x26c)
[   34.474785] [<c01fc708>] (sys_delete_module) from [<c0101000>] (ret_fast_syscall+0x0/0x28)
[   34.483098] Exception stack(0xeb959fa8 to 0xeb959ff0)
[   34.488187] 9fa0:                   0003deb0 bee2dc18 0003deec 00000800 b6f6ed78 00000000
[   34.496418] 9fc0: 0003deb0 bee2dc18 00000000 00000081 bee2defd 0003deb0 bee2ddfc 00000001
[   34.504644] 9fe0: b6f31f30 bee2dbbc 000205bc b6f31f3c
[   34.509734]  r7:00000081 r6:00000000 r5:bee2dc18 r4:0003deb0
[   34.519526] irq event stamp: 6357
[   34.522880] hardirqs last  enabled at (6365): [<c01bb228>] console_unlock+0x458/0x678
[   34.530880] hardirqs last disabled at (6402): [<c09de3ec>] __schedule+0xcc/0xe6c
[   34.538436] softirqs last  enabled at (6434): [<c0102524>] __do_softirq+0x37c/0x69c
[   34.546226] softirqs last disabled at (6447): [<c01478b0>] irq_exit+0x12c/0x15c
[   34.553585] ---[ end trace 5f947c42d0296722 ]---

 Tomi

-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

end of thread, other threads:[~2018-06-13  6:56 UTC | newest]

Thread overview: 127+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-26 17:24 [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
2018-05-26 17:24 ` [PATCH v2 01/60] drm/omap: Allocate drm_device earlier and unref it as last step Laurent Pinchart
2018-06-10 14:16   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 02/60] drm/omap: Manage the usable omap_dss_device list within omap_drm_private Laurent Pinchart
2018-06-10 15:19   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 03/60] drm/omap: Do dss_device (display) ordering in omap_drv.c Laurent Pinchart
2018-06-10 15:23   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 04/60] drm/omap: dss: Remove display ordering from dss/display.c Laurent Pinchart
2018-06-10 15:23   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 05/60] drm/omap: dss: Gather OMAP DSS components at probe time Laurent Pinchart
2018-06-10 15:33   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 06/60] drm/omap: dss: Move platform_device_register from core.c to dss.c probe Laurent Pinchart
2018-06-10 15:40   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 07/60] drm/omap: dss: Handle DPI and SDI port initialization failures Laurent Pinchart
2018-06-10 16:04   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 08/60] drm/omap: dss: Remove omapdss_atv_ops get_wss and set_wss operations Laurent Pinchart
2018-06-10 16:10   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 09/60] drm/omap: dss: Remove DSS encoders get_timings operation Laurent Pinchart
2018-06-10 16:13   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 10/60] drm/omap: dss: Remove unused omapdss_default_get_timings() Laurent Pinchart
2018-06-10 16:18   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 11/60] drm/omap: dss: Constify omap_dss_driver operations structure Laurent Pinchart
2018-06-10 16:20   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 12/60] drm/omap: displays: Remove videomode from omap_dss_device structure Laurent Pinchart
2018-06-10 17:44   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 13/60] drm/omap: dss: Remove omap_dss_device panel fields Laurent Pinchart
2018-06-10 17:48   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 14/60] drm/omap: dss: Rename omap_dss_device list field to output_list Laurent Pinchart
2018-06-10 18:55   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances Laurent Pinchart
2018-06-10 19:03   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 16/60] drm/omap: dss: Create and use omapdss_device_is_registered() Laurent Pinchart
2018-06-10 19:04   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 17/60] drm/omap: dss: Rework output lookup by port node Laurent Pinchart
2018-06-10 19:19   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 18/60] drm/omap: dss: Allow looking up any device by port Laurent Pinchart
2018-06-10 19:25   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 19/60] drm/omap: dss: Move common device operations to common structure Laurent Pinchart
2018-06-10 19:42   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 20/60] drm/omap: dss: Add functions to connect and disconnect devices Laurent Pinchart
2018-06-10 19:47   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 21/60] drm/omap: dss: Move debug message and checks to connection handlers Laurent Pinchart
2018-06-10 19:47   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 22/60] drm/omap: dss: Move src and dst check and set " Laurent Pinchart
2018-06-10 19:54   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 23/60] drm/omap: displays: Remove input omap_dss_device from panel data Laurent Pinchart
2018-06-10 20:03   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 24/60] drm/omap: dsi: Simplify debugfs implementation Laurent Pinchart
2018-06-10 20:08   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 25/60] drm/omap: Move DSI debugfs clocks dump to dsi%u_clks files Laurent Pinchart
2018-06-10 20:09   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 26/60] drm/omap: dss: Remove output devices list Laurent Pinchart
2018-06-10 20:12   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 27/60] drm/omap: dss: Rename for_each_dss_dev macro to for_each_dss_display Laurent Pinchart
2018-06-10 20:17   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 28/60] drm/omap: dss: Make omap_dss_get_next_device() more generic Laurent Pinchart
2018-06-10 20:17   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 29/60] drm/omap: dss: Split omapdss_register_display() Laurent Pinchart
2018-06-10 20:24   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 30/60] drm/omap: dss: Remove panel devices list Laurent Pinchart
2018-06-10 20:32   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 31/60] drm/omap: dss: Move and rename omap_dss_(get|put)_device() Laurent Pinchart
2018-06-10 20:36   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 32/60] drm/omap: dss: Store dss_device pointer in omap_dss_device Laurent Pinchart
2018-06-10 20:43   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 33/60] drm/omap: dss: Move DSS mgr ops and private data to dss_device Laurent Pinchart
2018-06-10 20:43   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 34/60] drm/omap: dss: Modify omapdss_find_output_from_display() to return channel Laurent Pinchart
2018-06-10 20:46   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 35/60] drm/omap: dss: Replace omap_dss_device port number with bitmask Laurent Pinchart
2018-06-10 21:00   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 36/60] drm/omap: dss: Extend omapdss_of_find_source_for_first_ep() to sinks Laurent Pinchart
2018-06-10 21:13   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 37/60] drm/omap: displays: Don't cast dssdev to panel data unnecessarily Laurent Pinchart
2018-06-10 21:14   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 38/60] drm/omap: dss: Cleanup error paths in output init functions Laurent Pinchart
2018-06-10 21:17   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 39/60] drm/omap: dss: dsi: Move initialization code from bind to probe Laurent Pinchart
2018-06-10 22:32   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 40/60] drm/omap: dss: hdmi4: " Laurent Pinchart
2018-06-10 22:54   ` Sebastian Reichel
2018-05-26 17:24 ` [PATCH v2 41/60] drm/omap: dss: hdmi5: " Laurent Pinchart
2018-06-10 23:08   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 42/60] drm/omap: dss: venc: " Laurent Pinchart
2018-06-10 23:17   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 43/60] drm/omap: dss: Acquire next dssdev at probe time Laurent Pinchart
2018-06-10 23:49   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 44/60] drm/omap: dss: Add for_each_dss_output() macro Laurent Pinchart
2018-06-10 23:52   ` Sebastian Reichel
2018-06-11 17:11     ` Laurent Pinchart
2018-06-11 21:06       ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 45/60] drm/omap: dss: Add function to retrieve display for an output Laurent Pinchart
2018-06-10 23:49   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 46/60] drm/omap: dss: Remove duplicated parameter to dss_mgr_(dis)connect() Laurent Pinchart
2018-06-10 23:48   ` Sebastian Reichel
2018-06-11 17:16     ` Laurent Pinchart
2018-06-11 21:02       ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 47/60] drm/omap: dss: Get regulators at probe time Laurent Pinchart
2018-06-10 23:58   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 48/60] drm/omap: Remove unneeded variable assignments in omap_modeset_init Laurent Pinchart
2018-06-11  0:01   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 49/60] drm/omap: Create all planes before CRTCs Laurent Pinchart
2018-06-11  0:07   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 50/60] drm/omap: Group CRTC, encoder, connector and dssdev in a structure Laurent Pinchart
2018-06-11 10:50   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 51/60] drm/omap: Reverse direction of DSS device (dis)connect operations Laurent Pinchart
2018-06-11 11:59   ` Sebastian Reichel
2018-06-11 19:21     ` Laurent Pinchart
2018-05-26 17:25 ` [PATCH v2 52/60] drm/omap: dss: Move connection checks to omapdss_device_(dis)connect Laurent Pinchart
2018-06-11 11:59   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 53/60] drm/omap: dss: Move display type validation to initialization time Laurent Pinchart
2018-06-11 11:59   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 54/60] drm/omap: dss: Merge two disconnection helpers Laurent Pinchart
2018-06-11 11:59   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 55/60] drm/omap: Pass pipe pointer to omap_crtc_init() Laurent Pinchart
2018-06-11 12:00   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 56/60] drm/omap: Store CRTC lookup by channel table in omap_drm_private Laurent Pinchart
2018-06-11 12:00   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 57/60] drm/omap: Remove omap_crtc_output global array Laurent Pinchart
2018-06-11 12:00   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 58/60] drm/omap: Remove supported output check in CRTC connect handler Laurent Pinchart
2018-06-11 12:00   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 59/60] drm/omap: Set dispc_channel_connect from DSS output connect handlers Laurent Pinchart
2018-06-11 12:00   ` Sebastian Reichel
2018-05-26 17:25 ` [PATCH v2 60/60] drm/omap: dss: Remove the dss_mgr_(dis)connect() operations Laurent Pinchart
2018-06-11 12:01   ` Sebastian Reichel
2018-06-13  6:56 ` [PATCH v2 00/60] omapdrm: Reverse direction of DSS device (dis)connect operations Tomi Valkeinen

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.