In preparation to allow bridge drivers relying on the HDMI connector
framework to provide HDMI 2.0 support, make use of the atomic version of
drm_connector_funcs.detect() hook and invoke the newly introduced
drm_bridge_detect_ctx() helper.

In particular, this is going to be used for triggering an empty modeset
in drm_bridge_funcs.detect_ctx() callback, in order to manage SCDC
status lost on sink disconnects.

Signed-off-by: Cristian Ciocaltea <[email protected]>
---
 drivers/gpu/drm/display/drm_bridge_connector.c | 73 ++++++++++++++------------
 1 file changed, 38 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index a2d30cf9e06d..0142c612545f 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -200,39 +200,6 @@ static void drm_bridge_connector_disable_hpd(struct 
drm_connector *connector)
  * Bridge Connector Functions
  */
 
-static enum drm_connector_status
-drm_bridge_connector_detect(struct drm_connector *connector, bool force)
-{
-       struct drm_bridge_connector *bridge_connector =
-               to_drm_bridge_connector(connector);
-       struct drm_bridge *detect = bridge_connector->bridge_detect;
-       struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
-       enum drm_connector_status status;
-
-       if (detect) {
-               status = detect->funcs->detect(detect, connector);
-
-               if (hdmi)
-                       drm_atomic_helper_connector_hdmi_hotplug(connector, 
status);
-
-               drm_bridge_connector_hpd_notify(connector, status);
-       } else {
-               switch (connector->connector_type) {
-               case DRM_MODE_CONNECTOR_DPI:
-               case DRM_MODE_CONNECTOR_LVDS:
-               case DRM_MODE_CONNECTOR_DSI:
-               case DRM_MODE_CONNECTOR_eDP:
-                       status = connector_status_connected;
-                       break;
-               default:
-                       status = connector_status_unknown;
-                       break;
-               }
-       }
-
-       return status;
-}
-
 static void drm_bridge_connector_force(struct drm_connector *connector)
 {
        struct drm_bridge_connector *bridge_connector =
@@ -270,7 +237,6 @@ static void drm_bridge_connector_reset(struct drm_connector 
*connector)
 
 static const struct drm_connector_funcs drm_bridge_connector_funcs = {
        .reset = drm_bridge_connector_reset,
-       .detect = drm_bridge_connector_detect,
        .force = drm_bridge_connector_force,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
@@ -283,6 +249,42 @@ static const struct drm_connector_funcs 
drm_bridge_connector_funcs = {
  * Bridge Connector Helper Functions
  */
 
+static int drm_bridge_connector_detect_ctx(struct drm_connector *connector,
+                                          struct drm_modeset_acquire_ctx *ctx,
+                                          bool force)
+{
+       struct drm_bridge_connector *bridge_connector =
+               to_drm_bridge_connector(connector);
+       struct drm_bridge *detect = bridge_connector->bridge_detect;
+       struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
+       int ret;
+
+       if (detect) {
+               ret = drm_bridge_detect_ctx(detect, connector, ctx);
+               if (ret < 0)
+                       return ret;
+
+               if (hdmi)
+                       drm_atomic_helper_connector_hdmi_hotplug(connector, 
ret);
+
+               drm_bridge_connector_hpd_notify(connector, ret);
+       } else {
+               switch (connector->connector_type) {
+               case DRM_MODE_CONNECTOR_DPI:
+               case DRM_MODE_CONNECTOR_LVDS:
+               case DRM_MODE_CONNECTOR_DSI:
+               case DRM_MODE_CONNECTOR_eDP:
+                       ret = connector_status_connected;
+                       break;
+               default:
+                       ret = connector_status_unknown;
+                       break;
+               }
+       }
+
+       return ret;
+}
+
 static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
                                               struct drm_bridge *bridge)
 {
@@ -290,7 +292,7 @@ static int drm_bridge_connector_get_modes_edid(struct 
drm_connector *connector,
        const struct drm_edid *drm_edid;
        int n;
 
-       status = drm_bridge_connector_detect(connector, false);
+       status = drm_bridge_connector_detect_ctx(connector, NULL, false);
        if (status != connector_status_connected)
                goto no_edid;
 
@@ -376,6 +378,7 @@ static int drm_bridge_connector_atomic_check(struct 
drm_connector *connector,
 
 static const struct drm_connector_helper_funcs 
drm_bridge_connector_helper_funcs = {
        .get_modes = drm_bridge_connector_get_modes,
+       .detect_ctx = drm_bridge_connector_detect_ctx,
        .mode_valid = drm_bridge_connector_mode_valid,
        .enable_hpd = drm_bridge_connector_enable_hpd,
        .disable_hpd = drm_bridge_connector_disable_hpd,

-- 
2.51.2

Reply via email to