From 6a7c5a2200ad10a23912d3f40ef104f0d0543de4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 23:49:24 +0200 Subject: drm/omap: dss: Create global list of all omap_dss_device instances 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/base.c | 45 ++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') 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 +#include #include +#include #include #include -#include #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; -- cgit v1.2.3 From 9184f8d94c389c4712b4f393cca4a09c9e770514 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 23:53:16 +0200 Subject: drm/omap: dss: Create and use omapdss_device_is_registered() 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') 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 f0f9239f09d1..e7872e0c8dab 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; -- cgit v1.2.3 From e10bd354ad79d2772842300c85ffd1a49722cfae Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 1 Mar 2018 23:35:55 +0200 Subject: drm/omap: dss: Allow looking up any device by port 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') 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) -- cgit v1.2.3 From ec727e3f61845d6d64b3c5eba464096d6cc7f8e9 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 17:30:30 +0200 Subject: 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 --- .../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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') 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; -- cgit v1.2.3 From 1f507968c30b0e86a307164a212ef11def1e5899 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 17:30:30 +0200 Subject: drm/omap: dss: Move debug message and checks to connection handlers 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') 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 9033e9d25b7f..82797df80e66 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 8865459b6c90..298fedf96efe 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..599ef628736b 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 (!src->id && !omapdss_device_is_connected(src)) { + WARN_ON(!src->driver); + return; + } + if (src->driver) src->driver->disconnect(src); else -- cgit v1.2.3 From fb5571717c24c264518aaaf1ab4ec4df73e4cebd Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 17:30:30 +0200 Subject: drm/omap: dss: Move src and dst check and set to connection handlers 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c index 5724bdf53a42..c058f889700d 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 d65fed251b13..b0e75af56485 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 bdd9d39215a4..218cf73d1455 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 599ef628736b..22d3818208d7 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 11d94b310d1a..bb7dcd88026f 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 3cc91e973f01..8e3dce1ddfb0 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 b21499e124c1..e782be2c36bc 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -301,11 +301,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 4cae03f24e1b..17668da8ac5a 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); -- cgit v1.2.3 From de57e9dbc1454704a54190cb3b544b841c34301a Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 2 Mar 2018 01:25:32 +0200 Subject: drm/omap: dss: Remove output devices list 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c index a190bcf08738..52ceaae14647 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 db52eb49cff7..f4223cf7f03f 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 4537867f833f..90e07036fb48 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 22d3818208d7..8fac816ca481 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 bb7dcd88026f..372f1070bd69 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 ac6ec1f20d31..e061816e5381 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 @@ err: } 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 e782be2c36bc..2f39e1f47990 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -331,12 +331,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 17668da8ac5a..70418cf4eea2 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) -- cgit v1.2.3 From b9f4d2ebf641d157be89a68227a5feb00c961d10 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 2 Mar 2018 02:07:34 +0200 Subject: drm/omap: dss: Make omap_dss_get_next_device() more generic 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 8fac816ca481..9f01a4f28145 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 e7872e0c8dab..5df73cd76153 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); -- cgit v1.2.3 From c1dfe721e0966947019c43b65f2837c591fdcb3c Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 2 Mar 2018 02:43:45 +0200 Subject: drm/omap: dss: Move and rename omap_dss_(get|put)_device() 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- .../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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c index 49720117da15..0eacd2dc302d 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 7876e61bf63e..754f15bc0115 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 5e07a8479cfc..e05f2964f8e1 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 52ceaae14647..f665f2caea22 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 f4223cf7f03f..11c123ca7916 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 90e07036fb48..eb2d5af34a35 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 3e2bca737de0..64eab64e5f0d 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 0614db1c7366..bd9401c1c11e 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 @@ err_vc_id: 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 0698b64e5bdc..9f9caeadf5dd 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 da34c35009dd..d07c955ea06f 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 d92ee6f1ae7f..d02f22a858e2 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 4602f7cd1b53..a98c1181887a 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 b7c95b903d03..07c3f8143e4c 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 e6b2381b971c..c32ab872e9f9 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 9f01a4f28145..08846eea5a53 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 178d88841e0c..53cb46f6503d 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 -#include -#include -#include #include #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 3b60086f2938..69ebb0fa1df5 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 4f402eb8088d..a3b7dbf1b92b 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; } } -- cgit v1.2.3 From f324b2798c871511c64ea4232405e6f248e20d52 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 2 Mar 2018 02:54:16 +0200 Subject: drm/omap: dss: Store dss_device pointer in omap_dss_device 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c index 0eacd2dc302d..e416e9e1566a 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 754f15bc0115..a35d39f6cca9 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 e05f2964f8e1..dd6e67f9ae47 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 f665f2caea22..41a51364c985 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 11c123ca7916..cadb8f52aa88 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 eb2d5af34a35..4f671dc272a0 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 64eab64e5f0d..c03986d7df73 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 bd9401c1c11e..aeeec81f8fcf 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 9f9caeadf5dd..d4a7925e3f16 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 d07c955ea06f..b0fe60aba729 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 d02f22a858e2..d96eb1a1397f 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 a98c1181887a..65068eea0647 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 07c3f8143e4c..96e2e30dd999 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 c32ab872e9f9..5845f9e6c6ba 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 08846eea5a53..991c424960c7 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -177,7 +177,8 @@ done: } 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 a3b7dbf1b92b..95ebb6b1fc36 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; -- cgit v1.2.3 From 5c718e015a0f1280440f90ebf1c18e2b98a102e4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 2 Mar 2018 03:11:49 +0200 Subject: drm/omap: dss: Modify omapdss_find_output_from_display() to return channel 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 991c424960c7..272858972496 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 @@ err: } 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]); -- cgit v1.2.3 From 4e20bda68e01f723d7fcc4e7d55a4afc78223fb7 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 4 Mar 2018 21:49:28 +0200 Subject: drm/omap: dss: Replace omap_dss_device port number with bitmask 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- .../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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c index e416e9e1566a..5b151b88e1c1 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 a35d39f6cca9..14f7941eb83a 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 dd6e67f9ae47..005b1b0cbc46 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 41a51364c985..d74b90961c68 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 cadb8f52aa88..2bb1af8f815f 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 4f671dc272a0..e33f73f06e00 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 c03986d7df73..c8cd2f663ddf 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 aeeec81f8fcf..febb20961dc5 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 d4a7925e3f16..52e30bd1ed4a 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 b0fe60aba729..3f88407fe3c0 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 d96eb1a1397f..08576ae94d55 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 65068eea0647..181c3c271918 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 96e2e30dd999..39234f5db144 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 5845f9e6c6ba..61fcf2286387 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 272858972496..67086cbb3e24 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 372f1070bd69..0c11d17f23a4 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 e061816e5381..ee260353b9ca 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 2f39e1f47990..4b70a3044dd6 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -327,7 +327,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 70418cf4eea2..dd9af335dba0 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); } -- cgit v1.2.3 From f7e376aece4636afb0c4da5ce54d5e805ce47a76 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 4 Mar 2018 22:28:25 +0200 Subject: drm/omap: dss: Add for_each_dss_output() macro Similarly to for_each_dss_display(), the for_each_dss_output() macro iterates over all the DSS connected outputs. Signed-off-by: Laurent Pinchart Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/base.c | 19 +++++++++++++------ drivers/gpu/drm/omapdrm/dss/omapdss.h | 13 ++++++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 67086cbb3e24..1dbd08e6e029 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -126,12 +126,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. + * Search for the next device starting at @from. The type argument specfies + * which device types to consider when searching. Searching for multiple types + * is supported by and'ing their type flags. Release the reference to the @from + * device, and acquire a reference to the returned device if found. */ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from, - bool display_only) + enum omap_dss_device_type type) { struct omap_dss_device *dssdev; struct list_head *list; @@ -159,8 +160,14 @@ 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) + /* + * Accept display entities if the display type is requested, + * and output entities if the output type is requested. + */ + if ((type & OMAP_DSS_DEVICE_TYPE_DISPLAY) && dssdev->driver) + goto done; + if ((type & OMAP_DSS_DEVICE_TYPE_OUTPUT) && dssdev->id && + dssdev->next) goto done; } diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 5d3e4ced73d1..5cbbfb16369b 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -385,6 +385,11 @@ struct omap_dss_device_ops { }; }; +enum omap_dss_device_type { + OMAP_DSS_DEVICE_TYPE_OUTPUT = (1 << 0), + OMAP_DSS_DEVICE_TYPE_DISPLAY = (1 << 1), +}; + struct omap_dss_device { struct kobject kobj; struct device *dev; @@ -488,9 +493,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, OMAP_DSS_DEVICE_TYPE_DISPLAY)) != 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 +504,7 @@ 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); + enum omap_dss_device_type type); int omapdss_device_connect(struct dss_device *dss, struct omap_dss_device *src, struct omap_dss_device *dst); @@ -511,6 +516,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, OMAP_DSS_DEVICE_TYPE_OUTPUT)) != 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); -- cgit v1.2.3 From 511afb44d72aa7b6b871fa71f829afaaa27e84f0 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 4 Mar 2018 23:42:36 +0200 Subject: drm/omap: Reverse direction of DSS device (dis)connect operations 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 Signed-off-by: Tomi Valkeinen --- .../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 | 32 ++++++++--------- 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, 239 insertions(+), 432 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c index cda6c312ad05..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); - omapdss_device_disconnect(dssdev, NULL); return 0; } diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c index f8510cd7b166..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); - omapdss_device_disconnect(dssdev, NULL); 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 6eb4c24d6aa7..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); - omapdss_device_disconnect(dssdev, NULL); return 0; } diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c index f661ba8f3fa0..3243e5f9bd06 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)) - omapdss_device_disconnect(dssdev, dssdev->dst); + omapdss_device_disconnect(NULL, dssdev); return 0; } diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c index 3be35ba564da..7114ea672e69 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)) - omapdss_device_disconnect(dssdev, dssdev->dst); + omapdss_device_disconnect(NULL, dssdev); return 0; } diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c index cee53346f6fc..c99e55487d38 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)) - omapdss_device_disconnect(dssdev, dssdev->dst); + omapdss_device_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 8c17ad4ddf84..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); - omapdss_device_disconnect(dssdev, NULL); 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 501c47f95130..e30f0ab315f5 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); - omapdss_device_disconnect(dssdev, NULL); + omapdss_device_disconnect(dssdev->src, dssdev); sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c index 73416b1c7386..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); - omapdss_device_disconnect(dssdev, NULL); 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 cf5d9e1522a8..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); - omapdss_device_disconnect(dssdev, NULL); 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 1c3180495dfd..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); - omapdss_device_disconnect(dssdev, NULL); 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 d91ab8dab4d9..036fd8e57074 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); - omapdss_device_disconnect(dssdev, NULL); 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 a57daf44d421..fc08f71b95a0 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); - omapdss_device_disconnect(dssdev, NULL); 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 719c298d3996..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); - omapdss_device_disconnect(dssdev, NULL); 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 1dbd08e6e029..c3e451440d4b 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -190,24 +190,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; } @@ -219,14 +219,14 @@ 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"); + dev_dbg(dst->dev, "disconnect\n"); - if (!src->id && !omapdss_device_is_connected(src)) { - WARN_ON(!src->driver); + if (!dst->id && !omapdss_device_is_connected(dst)) { + WARN_ON(!dst->driver); return; } - if (dst) { + if (src) { if (WARN_ON(dst != src->dst)) return; @@ -234,12 +234,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 35d63c686393..6bd0fd12883e 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 41a98021d5bf..0e88ae1178f7 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 5d03e9066a33..80c4c2ae306a 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -437,8 +437,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 1fb25e2c5f87..c32e8ed2a96f 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -252,32 +252,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 7aa06b796481..db0aa8f1ff7c 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 f10e5053580b..0052f151bf7a 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; }; -- cgit v1.2.3 From 79ddb2f0c348e991edca106a0e5ab414a822ccfc Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sat, 26 May 2018 20:25:10 +0300 Subject: drm/omap: dss: Move connection checks to omapdss_device_(dis)connect 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/base.c | 1 + drivers/gpu/drm/omapdrm/dss/output.c | 29 ++--------------------------- 2 files changed, 3 insertions(+), 27 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index c3e451440d4b..02c6ed97d632 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -208,6 +208,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); -- cgit v1.2.3 From 3be0f15bd6e94aa17a571020704bde413342e8eb Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 6 Mar 2018 01:51:31 +0200 Subject: drm/omap: dss: Merge two disconnection helpers 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 02c6ed97d632..89472715ee8f 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -235,6 +235,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 eeeea936f889..178b463c2d60 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 9c617e35efd1..948e3b873523 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 600ac7c25724..8f9538e17ea4 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -522,7 +522,6 @@ int omap_dss_get_num_overlays(void); #define for_each_dss_output(d) \ while ((d = omapdss_device_get_next(d, OMAP_DSS_DEVICE_TYPE_OUTPUT)) != NULL) int omapdss_output_validate(struct omap_dss_device *out); -int omapdss_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 2101a697a08a..764299cafbe2 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -274,7 +274,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 e673f3e78c69..c2811c425195 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); } -- cgit v1.2.3 From 00b30e794ffc3bd8f4c6dc357fe7e881ae6e5373 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 6 Mar 2018 23:37:25 +0200 Subject: drm/omap: Pass pipe pointer to omap_crtc_init() 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 Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- 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(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 89472715ee8f..2051bab30484 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -246,15 +246,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 8f9538e17ea4..a732a4a0dc36 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -513,7 +513,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 0052f151bf7a..bb9ee2c93eca 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); -- cgit v1.2.3 From 1298977f0c8a06743dad0bf64d9a9e5a1e863fa3 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 27 May 2018 22:01:24 +0300 Subject: drm/omap: Check omap_dss_device type based on the output_type field Various functions that need to differentiate between omap_dss_device instances corresponding to displays and to internal encoders use the omap_dss_device.driver field, which is only set for display instances. This gets in the way of the omap_dss_device operations refactoring. Replace that with a check based on the output_type field which is set for all omap_dss_device instances but displays. Signed-off-by: Laurent Pinchart Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/base.c | 5 +++-- drivers/gpu/drm/omapdrm/dss/omapdss.h | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 2051bab30484..614331b7d702 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -164,7 +164,8 @@ struct omap_dss_device *omapdss_device_get_next(struct omap_dss_device *from, * Accept display entities if the display type is requested, * and output entities if the output type is requested. */ - if ((type & OMAP_DSS_DEVICE_TYPE_DISPLAY) && dssdev->driver) + if ((type & OMAP_DSS_DEVICE_TYPE_DISPLAY) && + !dssdev->output_type) goto done; if ((type & OMAP_DSS_DEVICE_TYPE_OUTPUT) && dssdev->id && dssdev->next) @@ -223,7 +224,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src, dev_dbg(dst->dev, "disconnect\n"); if (!dst->id && !omapdss_device_is_connected(dst)) { - WARN_ON(!dst->driver); + WARN_ON(dst->output_type); return; } diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index c29633765898..6d22b38f2ce5 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -406,6 +406,12 @@ struct omap_dss_device { unsigned int alias_id; enum omap_display_type type; + /* + * DSS output type that this device generates (for DSS internal devices) + * or requires (for external encoders). Must be OMAP_DISPLAY_TYPE_NONE + * for display devices (connectors and panels) and to non-zero value for + * all other devices. + */ enum omap_display_type output_type; const char *name; -- cgit v1.2.3 From 83910ad3f51fbc0e6546b60aafa90697b5127a8a Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 1 Jun 2018 19:45:01 +0300 Subject: drm/omap: Move most omap_dss_driver operations to omap_dss_device_ops omap_dss_device instances have two ops structures, omap_dss_driver and omap_dss_device_ops. The former is used for devices at the end of the pipeline (a.k.a. display devices), and the latter for intermediate devices. Having two sets of operations isn't convenient as code that iterates over omap_dss_device instances need to take them both into account. There's currently a reasonably small amount of such code, but more will be introduced to move the driver away from recursive operations. To simplify current and future code, move all operations that are not specific to the display device to the omap_dss_device_ops. Signed-off-by: Laurent Pinchart Reviewed-by: Sebastian Reichel Signed-off-by: Tomi Valkeinen --- .../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 | 31 +++++++------ .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c | 14 +++--- drivers/gpu/drm/omapdrm/displays/panel-dpi.c | 4 +- drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 12 +++-- .../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 | 12 +---- drivers/gpu/drm/omapdrm/dss/dss.c | 2 +- drivers/gpu/drm/omapdrm/dss/hdmi4.c | 3 +- drivers/gpu/drm/omapdrm/dss/hdmi5.c | 3 +- drivers/gpu/drm/omapdrm/dss/omapdss.h | 54 ++++++---------------- drivers/gpu/drm/omapdrm/omap_connector.c | 37 +++++++-------- drivers/gpu/drm/omapdrm/omap_crtc.c | 2 +- drivers/gpu/drm/omapdrm/omap_drv.c | 12 ++--- drivers/gpu/drm/omapdrm/omap_encoder.c | 25 +++++----- 21 files changed, 106 insertions(+), 137 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/dss/base.c') diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c index d59b4f2e22dc..563fc7e618b3 100644 --- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c +++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c @@ -119,7 +119,7 @@ static int tvc_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver tvc_driver = { +static const struct omap_dss_device_ops tvc_ops = { .connect = tvc_connect, .disconnect = tvc_disconnect, @@ -146,7 +146,7 @@ static int tvc_probe(struct platform_device *pdev) ddata->vm = tvc_pal_vm; dssdev = &ddata->dssdev; - dssdev->driver = &tvc_driver; + dssdev->ops = &tvc_ops; dssdev->dev = &pdev->dev; dssdev->type = OMAP_DISPLAY_TYPE_VENC; dssdev->owner = THIS_MODULE; diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c index 39e7d0be887f..a639a86cd47b 100644 --- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c +++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c @@ -265,7 +265,7 @@ static void dvic_disable_hpd(struct omap_dss_device *dssdev) mutex_unlock(&ddata->hpd_lock); } -static const struct omap_dss_driver dvic_driver = { +static const struct omap_dss_device_ops dvic_ops = { .connect = dvic_connect, .disconnect = dvic_disconnect, @@ -367,7 +367,7 @@ static int dvic_probe(struct platform_device *pdev) ddata->vm = dvic_default_vm; dssdev = &ddata->dssdev; - dssdev->driver = &dvic_driver; + dssdev->ops = &dvic_ops; dssdev->dev = &pdev->dev; dssdev->type = OMAP_DISPLAY_TYPE_DVI; dssdev->owner = THIS_MODULE; diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c index d39480b8cf6b..54bfd7156360 100644 --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c @@ -132,7 +132,7 @@ static int hdmic_read_edid(struct omap_dss_device *dssdev, { struct omap_dss_device *src = dssdev->src; - return src->ops->hdmi.read_edid(src, edid, len); + return src->ops->read_edid(src, edid, len); } static bool hdmic_detect(struct omap_dss_device *dssdev) @@ -144,7 +144,7 @@ static bool hdmic_detect(struct omap_dss_device *dssdev) if (ddata->hpd_gpio) connected = gpiod_get_value_cansleep(ddata->hpd_gpio); else - connected = src->ops->hdmi.detect(src); + connected = src->ops->detect(src); if (!connected && src->ops->hdmi.lost_hotplug) src->ops->hdmi.lost_hotplug(src); return connected; @@ -164,8 +164,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 (src->ops->hdmi.register_hpd_cb) { - return src->ops->hdmi.register_hpd_cb(src, cb, cb_data); + } else if (src->ops->register_hpd_cb) { + return src->ops->register_hpd_cb(src, cb, cb_data); } return -ENOTSUPP; @@ -181,8 +181,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 (src->ops->hdmi.unregister_hpd_cb) { - src->ops->hdmi.unregister_hpd_cb(src); + } else if (src->ops->unregister_hpd_cb) { + src->ops->unregister_hpd_cb(src); } } @@ -195,8 +195,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 (src->ops->hdmi.enable_hpd) { - src->ops->hdmi.enable_hpd(src); + } else if (src->ops->enable_hpd) { + src->ops->enable_hpd(src); } } @@ -209,8 +209,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 (src->ops->hdmi.disable_hpd) { - src->ops->hdmi.disable_hpd(src); + } else if (src->ops->disable_hpd) { + src->ops->disable_hpd(src); } } @@ -229,7 +229,7 @@ static int hdmic_set_infoframe(struct omap_dss_device *dssdev, return src->ops->hdmi.set_infoframe(src, avi); } -static const struct omap_dss_driver hdmic_driver = { +static const struct omap_dss_device_ops hdmic_ops = { .connect = hdmic_connect, .disconnect = hdmic_disconnect, @@ -246,8 +246,11 @@ static const struct omap_dss_driver hdmic_driver = { .unregister_hpd_cb = hdmic_unregister_hpd_cb, .enable_hpd = hdmic_enable_hpd, .disable_hpd = hdmic_disable_hpd, - .set_hdmi_mode = hdmic_set_hdmi_mode, - .set_hdmi_infoframe = hdmic_set_infoframe, + + .hdmi = { + .set_hdmi_mode = hdmic_set_hdmi_mode, + .set_infoframe = hdmic_set_infoframe, + }, }; static irqreturn_t hdmic_hpd_isr(int irq, void *data) @@ -309,7 +312,7 @@ static int hdmic_probe(struct platform_device *pdev) ddata->vm = hdmic_default_vm; dssdev = &ddata->dssdev; - dssdev->driver = &hdmic_driver; + dssdev->ops = &hdmic_ops; dssdev->dev = &pdev->dev; dssdev->type = OMAP_DISPLAY_TYPE_HDMI; dssdev->owner = THIS_MODULE; diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c index c99e55487d38..0cc7bd656473 100644 --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c @@ -125,7 +125,7 @@ static int tpd_read_edid(struct omap_dss_device *dssdev, if (!gpiod_get_value_cansleep(ddata->hpd_gpio)) return -ENODEV; - return src->ops->hdmi.read_edid(src, edid, len); + return src->ops->read_edid(src, edid, len); } static bool tpd_detect(struct omap_dss_device *dssdev) @@ -205,14 +205,14 @@ static const struct omap_dss_device_ops tpd_ops = { .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, .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, }, diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c index 91f99c95c4c4..c03877af9cdb 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c @@ -122,7 +122,7 @@ static int panel_dpi_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver panel_dpi_ops = { +static const struct omap_dss_device_ops panel_dpi_ops = { .connect = panel_dpi_connect, .disconnect = panel_dpi_disconnect, @@ -196,7 +196,7 @@ static int panel_dpi_probe(struct platform_device *pdev) dssdev = &ddata->dssdev; dssdev->dev = &pdev->dev; - dssdev->driver = &panel_dpi_ops; + dssdev->ops = &panel_dpi_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c index e30f0ab315f5..29692a5217c5 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c @@ -1179,18 +1179,21 @@ static void dsicm_get_size(struct omap_dss_device *dssdev, *height = ddata->height_mm; } -static const struct omap_dss_driver dsicm_ops = { +static const struct omap_dss_device_ops dsicm_ops = { .connect = dsicm_connect, .disconnect = dsicm_disconnect, .enable = dsicm_enable, .disable = dsicm_disable, + .get_timings = dsicm_get_timings, + .check_timings = dsicm_check_timings, +}; + +static const struct omap_dss_driver dsicm_dss_driver = { .update = dsicm_update, .sync = dsicm_sync, - .get_timings = dsicm_get_timings, - .check_timings = dsicm_check_timings, .get_size = dsicm_get_size, .enable_te = dsicm_enable_te, @@ -1299,7 +1302,8 @@ static int dsicm_probe(struct platform_device *pdev) dssdev = &ddata->dssdev; dssdev->dev = dev; - dssdev->driver = &dsicm_ops; + dssdev->ops = &dsicm_ops; + dssdev->driver = &dsicm_dss_driver; dssdev->type = OMAP_DISPLAY_TYPE_DSI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c index 66763a12fc3d..62576e4f89e3 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c @@ -199,7 +199,7 @@ static int lb035q02_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver lb035q02_ops = { +static const struct omap_dss_device_ops lb035q02_ops = { .connect = lb035q02_connect, .disconnect = lb035q02_disconnect, @@ -249,7 +249,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi) dssdev = &ddata->dssdev; dssdev->dev = &spi->dev; - dssdev->driver = &lb035q02_ops; + dssdev->ops = &lb035q02_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c index 767ffd2fa0f4..9f34cf02a114 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c @@ -187,7 +187,7 @@ static int nec_8048_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver nec_8048_ops = { +static const struct omap_dss_device_ops nec_8048_ops = { .connect = nec_8048_connect, .disconnect = nec_8048_disconnect, @@ -239,7 +239,7 @@ static int nec_8048_probe(struct spi_device *spi) dssdev = &ddata->dssdev; dssdev->dev = &spi->dev; - dssdev->driver = &nec_8048_ops; + dssdev->ops = &nec_8048_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c index 7fbdf3ec0113..9ee6b8376916 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c @@ -161,7 +161,7 @@ static int sharp_ls_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver sharp_ls_ops = { +static const struct omap_dss_device_ops sharp_ls_ops = { .connect = sharp_ls_connect, .disconnect = sharp_ls_disconnect, @@ -247,7 +247,7 @@ static int sharp_ls_probe(struct platform_device *pdev) dssdev = &ddata->dssdev; dssdev->dev = &pdev->dev; - dssdev->driver = &sharp_ls_ops; + dssdev->ops = &sharp_ls_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c index 3eca39821d79..d0a8d2810c33 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c @@ -660,7 +660,7 @@ static int acx565akm_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver acx565akm_ops = { +static const struct omap_dss_device_ops acx565akm_ops = { .connect = acx565akm_connect, .disconnect = acx565akm_disconnect, @@ -762,7 +762,7 @@ static int acx565akm_probe(struct spi_device *spi) dssdev = &ddata->dssdev; dssdev->dev = &spi->dev; - dssdev->driver = &acx565akm_ops; + dssdev->ops = &acx565akm_ops; dssdev->type = OMAP_DISPLAY_TYPE_SDI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c index ecb903a93cf4..1b0e42daa296 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c @@ -330,7 +330,7 @@ static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver td028ttec1_ops = { +static const struct omap_dss_device_ops td028ttec1_ops = { .connect = td028ttec1_panel_connect, .disconnect = td028ttec1_panel_disconnect, @@ -371,7 +371,7 @@ static int td028ttec1_panel_probe(struct spi_device *spi) dssdev = &ddata->dssdev; dssdev->dev = &spi->dev; - dssdev->driver = &td028ttec1_ops; + dssdev->ops = &td028ttec1_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c index 1521812ab15b..b211a7809a26 100644 --- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c +++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c @@ -404,7 +404,7 @@ static int tpo_td043_check_timings(struct omap_dss_device *dssdev, return src->ops->check_timings(src, vm); } -static const struct omap_dss_driver tpo_td043_ops = { +static const struct omap_dss_device_ops tpo_td043_ops = { .connect = tpo_td043_connect, .disconnect = tpo_td043_disconnect, @@ -469,7 +469,7 @@ static int tpo_td043_probe(struct spi_device *spi) dssdev = &ddata->dssdev; dssdev->dev = &spi->dev; - dssdev->driver = &tpo_td043_ops; + dssdev->ops = &tpo_td043_ops; dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->owner = THIS_MODULE; dssdev->of_ports = BIT(0); diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 614331b7d702..472f56e3de70 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -198,11 +198,7 @@ int omapdss_device_connect(struct dss_device *dss, dst->dss = dss; - if (dst->driver) - ret = dst->driver->connect(src, dst); - else - ret = dst->ops->connect(src, dst); - + ret = dst->ops->connect(src, dst); if (ret < 0) { dst->dss = NULL; return ret; @@ -238,11 +234,7 @@ void omapdss_device_disconnect(struct omap_dss_device *src, WARN_ON(dst->state != OMAP_DSS_DISPLAY_DISABLED); - if (dst->driver) - dst->driver->disconnect(src, dst); - else - dst->ops->disconnect(src, dst); - + dst->ops->disconnect(src, dst); dst->dss = NULL; } EXPORT_SYMBOL_GPL(omapdss_device_disconnect); diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c index 14ffe23b5ecf..19fc4dfc429e 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.c +++ b/drivers/gpu/drm/omapdrm/dss/dss.c @@ -1553,7 +1553,7 @@ static void dss_shutdown(struct platform_device *pdev) for_each_dss_display(dssdev) { if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) - dssdev->driver->disable(dssdev); + dssdev->ops->disable(dssdev); } } diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c index c4fcdc9ed62d..bebce93fed3e 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c @@ -511,8 +511,9 @@ static const struct omap_dss_device_ops hdmi_ops = { .check_timings = hdmi_display_check_timing, .set_timings = hdmi_display_set_timing, + .read_edid = hdmi_read_edid, + .hdmi = { - .read_edid = hdmi_read_edid, .lost_hotplug = hdmi_lost_hotplug, .set_infoframe = hdmi_set_infoframe, .set_hdmi_mode = hdmi_set_hdmi_mode, diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c index 889c31745492..7c07e0208107 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c @@ -505,8 +505,9 @@ static const struct omap_dss_device_ops hdmi_ops = { .check_timings = hdmi_display_check_timing, .set_timings = hdmi_display_set_timing, + .read_edid = hdmi_read_edid, + .hdmi = { - .read_edid = hdmi_read_edid, .set_infoframe = hdmi_set_infoframe, .set_hdmi_mode = hdmi_set_hdmi_mode, }, diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 6d22b38f2ce5..60e4269e6c88 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -297,18 +297,7 @@ struct omap_dss_writeback_info { }; struct omapdss_hdmi_ops { - 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); - - int (*register_hpd_cb)(struct omap_dss_device *dssdev, - void (*cb)(void *cb_data, - enum drm_connector_status status), - void *cb_data); - void (*unregister_hpd_cb)(struct omap_dss_device *dssdev); - void (*enable_hpd)(struct omap_dss_device *dssdev); - void (*disable_hpd)(struct omap_dss_device *dssdev); - int (*set_hdmi_mode)(struct omap_dss_device *dssdev, bool hdmi_mode); int (*set_infoframe)(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi); @@ -376,9 +365,23 @@ struct omap_dss_device_ops { int (*check_timings)(struct omap_dss_device *dssdev, struct videomode *vm); + void (*get_timings)(struct omap_dss_device *dssdev, + struct videomode *vm); void (*set_timings)(struct omap_dss_device *dssdev, struct videomode *vm); + bool (*detect)(struct omap_dss_device *dssdev); + + int (*register_hpd_cb)(struct omap_dss_device *dssdev, + void (*cb)(void *cb_data, + enum drm_connector_status status), + void *cb_data); + void (*unregister_hpd_cb)(struct omap_dss_device *dssdev); + void (*enable_hpd)(struct omap_dss_device *dssdev); + void (*disable_hpd)(struct omap_dss_device *dssdev); + + int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); + union { const struct omapdss_hdmi_ops hdmi; const struct omapdss_dsi_ops dsi; @@ -440,14 +443,6 @@ struct omap_dss_device { }; struct omap_dss_driver { - 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); - int (*update)(struct omap_dss_device *dssdev, u16 x, u16 y, u16 w, u16 h); int (*sync)(struct omap_dss_device *dssdev); @@ -459,29 +454,8 @@ struct omap_dss_driver { void *buf, size_t size, u16 x, u16 y, u16 w, u16 h); - int (*check_timings)(struct omap_dss_device *dssdev, - 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); void (*get_size)(struct omap_dss_device *dssdev, unsigned int *width, unsigned int *height); - - int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); - bool (*detect)(struct omap_dss_device *dssdev); - - int (*register_hpd_cb)(struct omap_dss_device *dssdev, - void (*cb)(void *cb_data, - enum drm_connector_status status), - void *cb_data); - void (*unregister_hpd_cb)(struct omap_dss_device *dssdev); - void (*enable_hpd)(struct omap_dss_device *dssdev); - void (*disable_hpd)(struct omap_dss_device *dssdev); - - int (*set_hdmi_mode)(struct omap_dss_device *dssdev, bool hdmi_mode); - int (*set_hdmi_infoframe)(struct omap_dss_device *dssdev, - const struct hdmi_avi_infoframe *avi); }; struct dss_device *omapdss_get_dss(void); diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index 69ebb0fa1df5..f9cc04c7c0fa 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c @@ -62,11 +62,10 @@ 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; - const struct omap_dss_driver *dssdrv = dssdev->driver; enum drm_connector_status ret; - if (dssdrv->detect) { - if (dssdrv->detect(dssdev)) + if (dssdev->ops->detect) { + if (dssdev->ops->detect(dssdev)) ret = connector_status_connected; else ret = connector_status_disconnected; @@ -91,8 +90,8 @@ static void omap_connector_destroy(struct drm_connector *connector) DBG("%s", omap_connector->dssdev->name); if (connector->polled == DRM_CONNECTOR_POLL_HPD && - dssdev->driver->unregister_hpd_cb) { - dssdev->driver->unregister_hpd_cb(dssdev); + dssdev->ops->unregister_hpd_cb) { + dssdev->ops->unregister_hpd_cb(dssdev); } drm_connector_unregister(connector); drm_connector_cleanup(connector); @@ -107,7 +106,6 @@ static int omap_connector_get_modes(struct drm_connector *connector) { struct omap_connector *omap_connector = to_omap_connector(connector); struct omap_dss_device *dssdev = omap_connector->dssdev; - const struct omap_dss_driver *dssdrv = dssdev->driver; struct drm_device *dev = connector->dev; int n = 0; @@ -118,13 +116,13 @@ static int omap_connector_get_modes(struct drm_connector *connector) * LCD panels) we just return a single mode corresponding to the * currently configured timings: */ - if (dssdrv->read_edid) { + if (dssdev->ops->read_edid) { void *edid = kzalloc(MAX_EDID, GFP_KERNEL); if (!edid) return 0; - if ((dssdrv->read_edid(dssdev, edid, MAX_EDID) > 0) && + if ((dssdev->ops->read_edid(dssdev, edid, MAX_EDID) > 0) && drm_edid_is_valid(edid)) { drm_connector_update_edid_property( connector, edid); @@ -145,7 +143,7 @@ static int omap_connector_get_modes(struct drm_connector *connector) if (!mode) return 0; - dssdrv->get_timings(dssdev, &vm); + dssdev->ops->get_timings(dssdev, &vm); drm_display_mode_from_videomode(&vm, mode); @@ -153,8 +151,8 @@ static int omap_connector_get_modes(struct drm_connector *connector) drm_mode_set_name(mode); drm_mode_probed_add(connector, mode); - if (dssdrv->get_size) { - dssdrv->get_size(dssdev, + if (dssdev->driver && dssdev->driver->get_size) { + dssdev->driver->get_size(dssdev, &connector->display_info.width_mm, &connector->display_info.height_mm); } @@ -170,7 +168,6 @@ 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; - const struct omap_dss_driver *dssdrv = dssdev->driver; struct videomode vm = {0}; struct drm_device *dev = connector->dev; struct drm_display_mode *new_mode; @@ -184,12 +181,12 @@ static int omap_connector_mode_valid(struct drm_connector *connector, * a fixed resolution panel, check if the timings match with the * panel's timings */ - if (dssdrv->check_timings) { - r = dssdrv->check_timings(dssdev, &vm); + if (dssdev->ops->check_timings) { + r = dssdev->ops->check_timings(dssdev, &vm); } else { struct videomode t = {0}; - dssdrv->get_timings(dssdev, &t); + dssdev->ops->get_timings(dssdev, &t); /* * Ignore the flags, as we don't get them from @@ -268,10 +265,10 @@ struct drm_connector *omap_connector_init(struct drm_device *dev, connector_type); drm_connector_helper_add(connector, &omap_connector_helper_funcs); - if (dssdev->driver->register_hpd_cb) { - int ret = dssdev->driver->register_hpd_cb(dssdev, - omap_connector_hpd_cb, - omap_connector); + if (dssdev->ops->register_hpd_cb) { + int ret = dssdev->ops->register_hpd_cb(dssdev, + omap_connector_hpd_cb, + omap_connector); if (!ret) hpd_supported = true; else if (ret != -ENOTSUPP) @@ -281,7 +278,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev, if (hpd_supported) connector->polled = DRM_CONNECTOR_POLL_HPD; - else if (dssdev->driver->detect) + else if (dssdev->ops->detect) connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; else diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 80498dcde6d7..197d05312306 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -458,7 +458,7 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc) if (dssdev) { struct videomode vm = {0}; - dssdev->driver->get_timings(dssdev, &vm); + dssdev->ops->get_timings(dssdev, &vm); omap_crtc->vm.flags |= vm.flags & flags_mask; } diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index d0f6929857bb..843222118fa7 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -378,8 +378,8 @@ static void omap_modeset_enable_external_hpd(struct drm_device *ddev) for (i = 0; i < priv->num_pipes; i++) { struct omap_dss_device *display = priv->pipes[i].display; - if (display->driver->enable_hpd) - display->driver->enable_hpd(display); + if (display->ops->enable_hpd) + display->ops->enable_hpd(display); } } @@ -394,8 +394,8 @@ static void omap_modeset_disable_external_hpd(struct drm_device *ddev) for (i = 0; i < priv->num_pipes; i++) { struct omap_dss_device *display = priv->pipes[i].display; - if (display->driver->disable_hpd) - display->driver->disable_hpd(display); + if (display->ops->disable_hpd) + display->ops->disable_hpd(display); } } @@ -724,7 +724,7 @@ static int omap_drm_suspend_all_displays(struct drm_device *ddev) struct omap_dss_device *display = priv->pipes[i].display; if (display->state == OMAP_DSS_DISPLAY_ACTIVE) { - display->driver->disable(display); + display->ops->disable(display); display->activate_after_resume = true; } else { display->activate_after_resume = false; @@ -743,7 +743,7 @@ static int omap_drm_resume_all_displays(struct drm_device *ddev) struct omap_dss_device *display = priv->pipes[i].display; if (display->activate_after_resume) { - display->driver->enable(display); + display->ops->enable(display); display->activate_after_resume = false; } } diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c index ec0f451e3b36..7bbf3700e393 100644 --- a/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c @@ -77,16 +77,16 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, } } - if (dssdev->driver->set_hdmi_mode) - dssdev->driver->set_hdmi_mode(dssdev, hdmi_mode); + if (dssdev->ops->hdmi.set_hdmi_mode) + dssdev->ops->hdmi.set_hdmi_mode(dssdev, hdmi_mode); - if (hdmi_mode && dssdev->driver->set_hdmi_infoframe) { + if (hdmi_mode && dssdev->ops->hdmi.set_infoframe) { struct hdmi_avi_infoframe avi; r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode, false); if (r == 0) - dssdev->driver->set_hdmi_infoframe(dssdev, &avi); + dssdev->ops->hdmi.set_infoframe(dssdev, &avi); } } @@ -94,9 +94,8 @@ 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; - const struct omap_dss_driver *dssdrv = dssdev->driver; - dssdrv->disable(dssdev); + dssdev->ops->disable(dssdev); } static int omap_encoder_update(struct drm_encoder *encoder, @@ -106,15 +105,14 @@ 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; - const struct omap_dss_driver *dssdrv = dssdev->driver; int ret; - if (dssdrv->check_timings) { - ret = dssdrv->check_timings(dssdev, vm); + if (dssdev->ops->check_timings) { + ret = dssdev->ops->check_timings(dssdev, vm); } else { struct videomode t = {0}; - dssdrv->get_timings(dssdev, &t); + dssdev->ops->get_timings(dssdev, &t); if (memcmp(vm, &t, sizeof(*vm))) ret = -EINVAL; @@ -127,8 +125,8 @@ static int omap_encoder_update(struct drm_encoder *encoder, return ret; } - if (dssdrv->set_timings) - dssdrv->set_timings(dssdev, vm); + if (dssdev->ops->set_timings) + dssdev->ops->set_timings(dssdev, vm); return 0; } @@ -137,13 +135,12 @@ 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; - const struct omap_dss_driver *dssdrv = dssdev->driver; int r; omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc), omap_crtc_timings(encoder->crtc)); - r = dssdrv->enable(dssdev); + r = dssdev->ops->enable(dssdev); if (r) dev_err(encoder->dev->dev, "Failed to enable display '%s': %d\n", -- cgit v1.2.3