From ec727e3f61845d6d64b3c5eba464096d6cc7f8e9 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 17:30:30 +0200 Subject: [PATCH] drm/omap: dss: Add functions to connect and disconnect devices 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- .../omapdrm/displays/connector-analog-tv.c | 4 ++-- .../gpu/drm/omapdrm/displays/connector-dvi.c | 4 ++-- .../gpu/drm/omapdrm/displays/connector-hdmi.c | 4 ++-- .../gpu/drm/omapdrm/displays/encoder-opa362.c | 4 ++-- .../gpu/drm/omapdrm/displays/encoder-tfp410.c | 4 ++-- .../drm/omapdrm/displays/encoder-tpd12s015.c | 4 ++-- drivers/gpu/drm/omapdrm/displays/panel-dpi.c | 4 ++-- .../gpu/drm/omapdrm/displays/panel-dsi-cm.c | 6 +++--- .../displays/panel-lgphilips-lb035q02.c | 4 ++-- .../omapdrm/displays/panel-nec-nl8048hl11.c | 4 ++-- .../displays/panel-sharp-ls037v7dw01.c | 4 ++-- .../omapdrm/displays/panel-sony-acx565akm.c | 4 ++-- .../omapdrm/displays/panel-tpo-td028ttec1.c | 4 ++-- .../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 694ac42b7247..9033e9d25b7f 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 3cd1e4ccd43a..8865459b6c90 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 e411d46bd803..6bc4b01c8e9c 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;