Re: [PATCH v2 15/60] drm/omap: dss: Create global list of all omap_dss_device instances
Hi, On Sat, May 26, 2018 at 08:24:33PM +0300, Laurent Pinchart wrote: > The omap_dss_device instances are stored in two separate lists, > depending on whether they are panels or outputs. Create a third list > that stores all omap_dss_device instances to allow generic code to > operate on all instances. > > Signed-off-by: Laurent Pinchart > --- Reviewed-by: Sebastian Reichel -- Sebastian > drivers/gpu/drm/omapdrm/dss/base.c| 45 > --- > drivers/gpu/drm/omapdrm/dss/display.c | 4 > drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 > drivers/gpu/drm/omapdrm/dss/output.c | 2 ++ > 4 files changed, 46 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/dss/base.c > b/drivers/gpu/drm/omapdrm/dss/base.c > index 99e8cb8dc65b..18b72d7c717a 100644 > --- a/drivers/gpu/drm/omapdrm/dss/base.c > +++ b/drivers/gpu/drm/omapdrm/dss/base.c > @@ -14,24 +14,17 @@ > */ > > #include > +#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 e07e3319d6e0..eacbbf45f737 100644 > --- a/drivers/gpu/drm/omapdrm/dss/display.c > +++ b/drivers/gpu/drm/omapdrm/dss/display.c > @@ -56,6 +56,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev) > mutex_lock(&panel_list_mutex); > list_add_tail(&dssdev->panel_list, &panel_list); > mutex_unlock(&panel_list_mutex); > + > + omapdss_device_register(dssdev); > return 0; > } > EXPORT_SYMBOL(omapdss_register_display); > @@ -65,6 +67,8 @@ void omapdss_unregister_display(struct omap_dss_device > *dssdev) > mutex_lock(&panel_list_mutex); > list_del(&dssdev->panel_list); > mutex_unlock(&panel_list_mutex); > + > + omapdss_device_register(dssdev); > } > EXPORT_SYMBOL(omapdss_unregister_display); > > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h > b/drivers/gpu/drm/omapdrm/dss/omapdss.h > index abf101bb27ea..e029613509a1 100644 > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h > @@ -450,6 +450,7 @@ struct omap_dss_device { > > struct module *owner; > > + struct list_head list; > struct list_head panel_list; > > unsigned int alias_id; > @@ -560,6 +561,9 @@ static inline bool omapdss_is_initialized(void) > int omapdss_register_display(struct omap_dss_device *dssdev); > void omapdss_unregister_display(struct omap_dss_device *dssdev); > > +void omapdss_device_register(struct omap_dss_device *dssdev); > +void omapdss_device_unregister(struct omap_dss_device *dssdev); > + > struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev); > void omap_dss_put_device(struct omap_dss_device *dssdev); > #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL) > diff --git a/drivers/gpu/drm/omapdrm/dss/output.c > b/drivers/gpu/drm/omapdrm/dss/output.c > index 0fcd13ea8824..1a2d24906edd 100644 > --- a/drivers/gpu/drm/omapdrm/dss/output.c > +++ b/drivers/gpu/drm/omapdrm/dss/output.c > @@ -97,6 +97,7 @@ EXPORT_SYMBOL(omapdss_output_unset_device); > int omapdss_register_output(struct omap_dss_device *out) > { > list_add_tail(&out->output_list, &output_list); > + omapdss_device_register(out); > return 0; > } > EXPORT_SYMBOL(omapdss_register_output); > @@ -104,6 +105,7 @@ EXPORT_SYMBO
[PATCH v2 15/60] 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 --- 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 e07e3319d6e0..eacbbf45f737 100644 --- a/drivers/gpu/drm/omapdrm/dss/display.c +++ b/drivers/gpu/drm/omapdrm/dss/display.c @@ -56,6 +56,8 @@ int omapdss_register_display(struct omap_dss_device *dssdev) mutex_lock(&panel_list_mutex); list_add_tail(&dssdev->panel_list, &panel_list); mutex_unlock(&panel_list_mutex); + + omapdss_device_register(dssdev); return 0; } EXPORT_SYMBOL(omapdss_register_display); @@ -65,6 +67,8 @@ void omapdss_unregister_display(struct omap_dss_device *dssdev) mutex_lock(&panel_list_mutex); list_del(&dssdev->panel_list); mutex_unlock(&panel_list_mutex); + + omapdss_device_register(dssdev); } EXPORT_SYMBOL(omapdss_unregister_display); diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index abf101bb27ea..e029613509a1 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -450,6 +450,7 @@ struct omap_dss_device { struct module *owner; + struct list_head list; struct list_head panel_list; unsigned int alias_id; @@ -560,6 +561,9 @@ static inline bool omapdss_is_initialized(void) int omapdss_register_display(struct omap_dss_device *dssdev); void omapdss_unregister_display(struct omap_dss_device *dssdev); +void omapdss_device_register(struct omap_dss_device *dssdev); +void omapdss_device_unregister(struct omap_dss_device *dssdev); + struct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev); void omap_dss_put_device(struct omap_dss_device *dssdev); #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL) diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c index 0fcd13ea8824..1a2d24906edd 100644 --- a/drivers/gpu/drm/omapdrm/dss/output.c +++ b/drivers/gpu/drm/omapdrm/dss/output.c @@ -97,6 +97,7 @@ EXPORT_SYMBOL(omapdss_output_unset_device); int omapdss_register_output(struct omap_dss_device *out) { list_add_tail(&out->output_list, &output_list); + omapdss_device_register(out); return 0; } EXPORT_SYMBOL(omapdss_register_output); @@ -104,6 +105,7 @@ EXPORT_SYMBOL(omapdss_register_output); void omapdss_unregister_output(struct omap_dss_device *out) { list_del(&out->output_list); + omapdss_device_unregister(out); } EXPORT_SYMBOL(omapdss_unregister_output); -- Regards, Laurent Pinchart ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lis