diff options
-rw-r--r-- | drivers/video/omap2/dss/core.c | 2 | ||||
-rw-r--r-- | drivers/video/omap2/dss/display.c | 32 | ||||
-rw-r--r-- | include/video/omapdss.h | 8 |
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 7b2df2ff5667..17b52343f74c 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c @@ -477,6 +477,7 @@ struct omap_dss_device *dss_alloc_and_init_device(struct device *parent) int dss_add_device(struct omap_dss_device *dssdev) { + omapdss_register_display(dssdev); return device_add(&dssdev->dev); } @@ -488,6 +489,7 @@ void dss_put_device(struct omap_dss_device *dssdev) void dss_unregister_device(struct omap_dss_device *dssdev) { device_unregister(&dssdev->dev); + omapdss_unregister_display(dssdev); } static int dss_unregister_dss_dev(struct device *dev, void *data) diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c index 72ac058a56d3..1c175a4e7f6b 100644 --- a/drivers/video/omap2/dss/display.c +++ b/drivers/video/omap2/dss/display.c @@ -146,6 +146,38 @@ void dss_disable_all_devices(void) bus_for_each_dev(bus, NULL, NULL, dss_disable_device); } +static LIST_HEAD(panel_list); +static DEFINE_MUTEX(panel_list_mutex); +static int disp_num_counter; + +int omapdss_register_display(struct omap_dss_device *dssdev) +{ + struct omap_dss_driver *drv = dssdev->driver; + + snprintf(dssdev->alias, sizeof(dssdev->alias), + "display%d", disp_num_counter++); + + if (drv && drv->get_resolution == NULL) + drv->get_resolution = omapdss_default_get_resolution; + if (drv && drv->get_recommended_bpp == NULL) + drv->get_recommended_bpp = omapdss_default_get_recommended_bpp; + if (drv && drv->get_timings == NULL) + drv->get_timings = omapdss_default_get_timings; + + mutex_lock(&panel_list_mutex); + list_add_tail(&dssdev->panel_list, &panel_list); + mutex_unlock(&panel_list_mutex); + return 0; +} +EXPORT_SYMBOL(omapdss_register_display); + +void omapdss_unregister_display(struct omap_dss_device *dssdev) +{ + mutex_lock(&panel_list_mutex); + list_del(&dssdev->panel_list); + mutex_unlock(&panel_list_mutex); +} +EXPORT_SYMBOL(omapdss_unregister_display); void omap_dss_get_device(struct omap_dss_device *dssdev) { diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 0324c7b8a3e0..ee1645336fc4 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -598,6 +598,11 @@ struct omap_dss_output { struct omap_dss_device { struct device dev; + struct list_head panel_list; + + /* alias in the form of "display%d" */ + char alias[16]; + enum omap_display_type type; /* obsolete, to be removed */ @@ -759,6 +764,9 @@ bool omapdss_is_initialized(void); int omap_dss_register_driver(struct omap_dss_driver *); void omap_dss_unregister_driver(struct omap_dss_driver *); +int omapdss_register_display(struct omap_dss_device *dssdev); +void omapdss_unregister_display(struct omap_dss_device *dssdev); + void 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) |