[PATCH 17/34] imx-drm: delay publishing sysfs connector entries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Delay publishing sysfs connector entries until all components have
initialised.  This reduces the probability of generating false hotplug
events when we're uncertain whether the driver can fully initialise.
This also pulls that code out of the individual imx-drm connector
drivers.

Acked-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>
Acked-by: Shawn Guo <shawn.guo@xxxxxxxxxx>
Reviewed-by: Fabio Estevam <fabio.estevam@xxxxxxxxxxxxx>
Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx>
---
 drivers/staging/imx-drm/imx-drm-core.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
index 82b0337096b0..3cd330e646f7 100644
--- a/drivers/staging/imx-drm/imx-drm-core.c
+++ b/drivers/staging/imx-drm/imx-drm-core.c
@@ -355,7 +355,7 @@ static int imx_drm_connector_register(
 			imx_drm_connector->connector->connector_type);
 	drm_mode_group_reinit(imxdrm->drm);
 
-	return drm_sysfs_connector_add(imx_drm_connector->connector);
+	return 0;
 }
 
 /*
@@ -379,6 +379,7 @@ static void imx_drm_connector_unregister(
 static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
 {
 	struct imx_drm_device *imxdrm = __imx_drm_device();
+	struct drm_connector *connector;
 	int ret;
 
 	imxdrm->drm = drm;
@@ -432,8 +433,27 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
 	ret = component_bind_all(drm->dev, drm);
 	if (ret)
 		goto err_relock;
+
+	/*
+	 * All components are now added, we can publish the connector sysfs
+	 * entries to userspace.  This will generate hotplug events and so
+	 * userspace will expect to be able to access DRM at this point.
+	 */
+	list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
+		ret = drm_sysfs_connector_add(connector);
+		if (ret) {
+			dev_err(drm->dev,
+				"[CONNECTOR:%d:%s] drm_sysfs_connector_add failed: %d\n",
+				connector->base.id,
+				drm_get_connector_name(connector), ret);
+			goto err_unbind;
+		}
+	}
+
 	return 0;
 
+err_unbind:
+	component_unbind_all(drm->dev, drm);
 err_relock:
 	mutex_lock(&imxdrm->mutex);
 err_vblank:
-- 
1.8.3.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel




[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [CentOS ARM]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]     [Photos]