From f6d0086fa6b9be817ca473567417a096757a4188 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 5 Jun 2015 10:47:21 +0300 Subject: [PATCH] drm/omap: ensure all displays have been probed DRM offers no ways to add new displays after the DRM driver has been loaded. This causes issues on boards that have multiple displays, and omapdrm is loaded when some of them are loaded but not all. The result is that omapdrm starts with the displays that were loaded at that time, ignoring the displays loaded later. This patch changes the behavior so that omapdrm ensures all display are loaded which have an alias in the .dts file. The downside is that this prevents omapdrm from loading if, say, the user has not compiled a kernel module for one of the displays, or there's some kind of failure in one of the displays. Thus, after this patch, all the displays have to work, or none does. Signed-off-by: Tomi Valkeinen Signed-off-by: Jyri Sarha --- drivers/gpu/drm/omapdrm/omap_drv.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 15e4fe5..b0efa83 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -94,11 +94,38 @@ static void omap_disconnect_dssdevs(void) dssdev->driver->disconnect(dssdev); } +static bool dssdev_with_alias_exists(const char *alias) +{ + struct omap_dss_device *dssdev = NULL; + + for_each_dss_dev(dssdev) { + if (strcmp(alias, dssdev->alias) == 0) { + omap_dss_put_device(dssdev); + return true; + } + } + + return false; +} + static int omap_connect_dssdevs(void) { int r; struct omap_dss_device *dssdev = NULL; bool no_displays = true; + struct device_node *aliases; + struct property *pp; + + aliases = of_find_node_by_path("/aliases"); + if (aliases) { + for_each_property_of_node(aliases, pp) { + if (strncmp(pp->name, "display", 7) != 0) + continue; + + if (dssdev_with_alias_exists(pp->name) == false) + return -EPROBE_DEFER; + } + } for_each_dss_dev(dssdev) { r = dssdev->driver->connect(dssdev); -- 1.9.1