Bridge hotplug will make the connector dynamically created and destroyed
based on hotplug events.

In preparation for that, add a mutex to mutually exclude connector creation
and destruction.

Signed-off-by: Luca Ceresoli <[email protected]>
---
 drivers/gpu/drm/display/drm_bridge_connector.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index bd421b6beb7c..b83da529cc7a 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -8,6 +8,7 @@
 #include <linux/export.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/of.h>
 #include <linux/property.h>
 #include <linux/slab.h>
@@ -152,6 +153,11 @@ struct drm_bridge_connector {
         * @dynconn: The DRM connector added by the drm_bridge_connector
         */
        struct drm_bridge_connector_dynconn *dynconn;
+       /**
+        * @dynconn_mutex: Protect @dynconn from concurrent creation and
+        * destruction
+        */
+       struct mutex dynconn_mutex;
 };
 
 static struct drm_bridge_connector_dynconn *
@@ -810,6 +816,8 @@ static const struct drm_connector_hdmi_cec_funcs 
drm_bridge_connector_hdmi_cec_f
 
 static void drm_bridge_connector_dynconn_release(struct drm_bridge_connector 
*bridge_connector)
 {
+       guard(mutex)(&bridge_connector->dynconn_mutex);
+
        if (!bridge_connector->dynconn)
                return;
 
@@ -1050,6 +1058,8 @@ static int drm_bridge_connector_add_connector(struct 
drm_bridge_connector *bridg
        int connector_type;
        int ret;
 
+       guard(mutex)(&bridge_connector->dynconn_mutex);
+
        struct drm_bridge_connector_dynconn *dynconn = kzalloc_obj(*dynconn);
        if (!dynconn)
                return -ENOMEM;
@@ -1177,6 +1187,7 @@ struct drm_connector *drm_bridge_connector_init(struct 
drm_device *drm,
        if (!bridge_connector)
                return ERR_PTR(-ENOMEM);
 
+       mutex_init(&bridge_connector->dynconn_mutex);
        bridge_connector->drm = drm;
        bridge_connector->encoder = encoder;
 

-- 
2.54.0

Reply via email to