Allow HDMI DRM bridges to create CEC notifier. Physical address is
handled automatically by drm_atomic_helper_connector_hdmi_hotplug()
being called from .detect() path.

Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@oss.qualcomm.com>
---
 drivers/gpu/drm/display/Kconfig                |  1 +
 drivers/gpu/drm/display/drm_bridge_connector.c | 24 ++++++++++++++++++++++++
 include/drm/drm_bridge.h                       | 11 +++++++++++
 3 files changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kconfig
index 
6376ea01ec3093a72de25064e31223d2c9868ed7..df09cf9a8ca19ea894d6f2fad68c0b191e81e3d0
 100644
--- a/drivers/gpu/drm/display/Kconfig
+++ b/drivers/gpu/drm/display/Kconfig
@@ -17,6 +17,7 @@ if DRM_DISPLAY_HELPER
 config DRM_BRIDGE_CONNECTOR
        bool
        select DRM_DISPLAY_HDMI_AUDIO_HELPER
+       select DRM_DISPLAY_HDMI_CEC_HELPER
        select DRM_DISPLAY_HDMI_STATE_HELPER
        help
          DRM connector implementation terminating DRM bridge chains.
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index 
381a0f9d4259bf9f72d3a292b7dcc82e45c61bae..daf6117268d9d3bb0c0c12b5094e79ad13cf72dd
 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -20,6 +20,7 @@
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/display/drm_hdmi_audio_helper.h>
+#include <drm/display/drm_hdmi_cec_helper.h>
 #include <drm/display/drm_hdmi_helper.h>
 #include <drm/display/drm_hdmi_state_helper.h>
 
@@ -113,6 +114,13 @@ struct drm_bridge_connector {
         * &DRM_BRIDGE_OP_DP_AUDIO).
         */
        struct drm_bridge *bridge_dp_audio;
+       /**
+        * @bridge_hdmi_cec:
+        *
+        * The bridge in the chain that implements CEC support, if any (see
+        * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER).
+        */
+       struct drm_bridge *bridge_hdmi_cec;
 };
 
 #define to_drm_bridge_connector(x) \
@@ -662,6 +670,13 @@ struct drm_connector *drm_bridge_connector_init(struct 
drm_device *drm,
                        bridge_connector->bridge_dp_audio = bridge;
                }
 
+               if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) {
+                       if (bridge_connector->bridge_hdmi_cec)
+                               return ERR_PTR(-EBUSY);
+
+                       bridge_connector->bridge_hdmi_cec = bridge;
+               }
+
                if (!drm_bridge_get_next_bridge(bridge))
                        connector_type = bridge->type;
 
@@ -724,6 +739,15 @@ struct drm_connector *drm_bridge_connector_init(struct 
drm_device *drm,
                        return ERR_PTR(ret);
        }
 
+       if (bridge_connector->bridge_hdmi_cec &&
+           bridge_connector->bridge_hdmi_cec->ops & 
DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) {
+               ret = drm_connector_hdmi_cec_notifier_register(connector,
+                                                              NULL,
+                                                              
bridge->hdmi_cec_dev);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
        drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs);
 
        if (bridge_connector->bridge_hpd)
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 
db0d374d863b0b1f774d395743f1e29bb84e8937..0e5f6a007d536215bd50e11846433290c2060b9c
 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -907,6 +907,11 @@ enum drm_bridge_ops {
         * flag.
         */
        DRM_BRIDGE_OP_DP_AUDIO = BIT(6),
+       /**
+        * @DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER: The bridge requires CEC notifier
+        * to be present.
+        */
+       DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER = BIT(7),
 };
 
 /**
@@ -1003,6 +1008,12 @@ struct drm_bridge {
         */
        unsigned int max_bpc;
 
+       /**
+        * @hdmi_cec_dev: device to be used as a containing device for CEC
+        * functions.
+        */
+       struct device *hdmi_cec_dev;
+
        /**
         * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if
         * either of @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO is 
set.

-- 
2.39.5

Reply via email to