From 6a7c5a2200ad10a23912d3f40ef104f0d0543de4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 28 Feb 2018 23:49:24 +0200 Subject: [PATCH] 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 +++++++++++++++++++++------ drivers/gpu/drm/omapdrm/dss/display.c | 4 +++ drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 +++ drivers/gpu/drm/omapdrm/dss/output.c | 2 ++ 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index 99e8cb8dc65b..18b72d7c717a 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -14,24 +14,17 @@ */ #include +#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; diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c index 752c9811c73a..f0f9239f09d1 100644 --- a/drivers/gpu/drm/omapdrm/dss/display.c +++ b/drivers/gpu/drm/omapdrm/dss/display.c @@ -56,6 +56,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev) mutex_lock(&panel_list_mutex); list_add_tail(&dssdev->panel_list, &panel_list); mutex_unlock(&panel_list_mutex); + + omapdss_device_register(dssdev); return 0; } EXPORT_SYMBOL(omapdss_register_display); @@ -65,6 +67,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev) mutex_lock(&panel_list_mutex); list_del(&dssdev->panel_list); mutex_unlock(&panel_list_mutex); + + omapdss_device_register(dssdev); } EXPORT_SYMBOL(omapdss_unregister_display); diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index abf101bb27ea..e029613509a1 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -450,6 +450,7 @@ struct omap_dss_device { struct module *owner; + struct list_head list; struct list_head panel_list; unsigned int alias_id; @@ -560,6 +561,9 @@ static inline bool omapdss_is_initialized(void) int omapdss_register_display(struct omap_dss_device *dssdev); void omapdss_unregister_display(struct omap_dss_device *dssdev); +void omapdss_device_register(struct omap_dss_device *dssdev); +void omapdss_device_unregister(struct omap_dss_device *dssdev); + struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev); void omap_dss_put_device(struct omap_dss_device *dssdev); #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL) diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c index 0fcd13ea8824..1a2d24906edd 100644 --- a/drivers/gpu/drm/omapdrm/dss/output.c +++ b/drivers/gpu/drm/omapdrm/dss/output.c @@ -97,6 +97,7 @@ EXPORT_SYMBOL(omapdss_output_unset_device); int omapdss_register_output(struct omap_dss_device *out) { list_add_tail(&out->output_list, &output_list); + omapdss_device_register(out); return 0; } EXPORT_SYMBOL(omapdss_register_output); @@ -104,6 +105,7 @@ EXPORT_SYMBOL(omapdss_register_output); void omapdss_unregister_output(struct omap_dss_device *out) { list_del(&out->output_list); + omapdss_device_unregister(out); } EXPORT_SYMBOL(omapdss_unregister_output); -- 2.30.2