To support bridge hotplug we will need better control over the steps
involved in the crm_connector creation, especially in terms of error
management. This will be complicated by the length and amount of return
points in this function. In preparation, split the code to grab the various
bridge pointers out to a separate function.

No functional changes. Just moving code around.

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

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index eb1912611cd6..97d9a4c6d166 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -772,44 +772,24 @@ static void drm_bridge_connector_put_bridges(struct 
drm_device *dev, void *data)
        drm_bridge_put(bridge_connector->bridge_hdmi_cec);
 }
 
-/**
- * drm_bridge_connector_add_connector - add the drm_connector
- * @bridge_connector: drm_bridge_connector to add the drm_connector to
- *
- * Preconditions: the drm_bridge_connector is initialized (the
- * @bridge_connector->drm and @bridge_connector->encoder fields are
- * assigned at least)
- *
- * Returns a pointer to @bridge_connector on success, or a negative error
- * pointer otherwise.
- */
 static struct drm_bridge_connector *
-drm_bridge_connector_add_connector(struct drm_bridge_connector 
*bridge_connector)
+drm_bridge_connector_get_bridges(struct drm_bridge_connector *bridge_connector,
+                                int *connector_type,
+                                unsigned int *supported_formats,
+                                unsigned int *max_bpc,
+                                struct i2c_adapter **ddc,
+                                struct drm_bridge **panel_bridge,
+                                bool *support_hdcp)
 {
-       struct drm_connector *connector;
-       struct i2c_adapter *ddc = NULL;
-       struct drm_bridge *panel_bridge __free(drm_bridge_put) = NULL;
-       unsigned int supported_formats = BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444);
-       unsigned int max_bpc = 8;
-       bool support_hdcp = false;
-       int connector_type;
-       int ret;
+       struct drm_connector *connector = &bridge_connector->base;
 
        /*
         * TODO: Handle doublescan_allowed and stereo_allowed.
         */
-       connector = &bridge_connector->base;
        connector->interlace_allowed = true;
        connector->ycbcr_420_allowed = true;
+       *connector_type = DRM_MODE_CONNECTOR_Unknown;
 
-       /*
-        * Initialise connector status handling. First locate the furthest
-        * bridges in the pipeline that support HPD and output detection. Then
-        * initialise the connector polling mode, using HPD if available and
-        * falling back to polling if supported. If neither HPD nor output
-        * detection are available, we don't support hotplug detection at all.
-        */
-       connector_type = DRM_MODE_CONNECTOR_Unknown;
        drm_for_each_bridge_in_chain_scoped(bridge_connector->encoder, bridge) {
                if (!bridge->interlace_allowed)
                        connector->interlace_allowed = false;
@@ -865,9 +845,9 @@ drm_bridge_connector_add_connector(struct 
drm_bridge_connector *bridge_connector
                        bridge_connector->bridge_hdmi = drm_bridge_get(bridge);
 
                        if (bridge->supported_formats)
-                               supported_formats = bridge->supported_formats;
+                               *supported_formats = bridge->supported_formats;
                        if (bridge->max_bpc)
-                               max_bpc = bridge->max_bpc;
+                               *max_bpc = bridge->max_bpc;
                }
 
                if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) {
@@ -926,7 +906,7 @@ drm_bridge_connector_add_connector(struct 
drm_bridge_connector *bridge_connector
                }
 
                if (drm_bridge_is_last(bridge))
-                       connector_type = bridge->type;
+                       *connector_type = bridge->type;
 
 #ifdef CONFIG_OF
                if (drm_bridge_is_last(bridge) && bridge->of_node)
@@ -934,20 +914,54 @@ drm_bridge_connector_add_connector(struct 
drm_bridge_connector *bridge_connector
 #endif
 
                if (bridge->ddc)
-                       ddc = bridge->ddc;
+                       *ddc = bridge->ddc;
 
                if (drm_bridge_is_panel(bridge)) {
-                       drm_bridge_put(panel_bridge);
-                       panel_bridge = drm_bridge_get(bridge);
+                       drm_bridge_put(*panel_bridge);
+                       *panel_bridge = drm_bridge_get(bridge);
                }
 
                if (bridge->support_hdcp)
-                       support_hdcp = true;
+                       *support_hdcp = true;
        }
 
        if (connector_type == DRM_MODE_CONNECTOR_Unknown)
                return ERR_PTR(-EINVAL);
 
+       return bridge_connector;
+}
+
+/**
+ * drm_bridge_connector_add_connector - add the drm_connector
+ * @bridge_connector: drm_bridge_connector to add the drm_connector to
+ *
+ * Preconditions: the drm_bridge_connector is initialized (the
+ * @bridge_connector->drm and @bridge_connector->encoder fields are
+ * assigned at least)
+ *
+ * Returns a pointer to @bridge_connector on success, or a negative error
+ * pointer otherwise.
+ */
+static struct drm_bridge_connector *
+drm_bridge_connector_add_connector(struct drm_bridge_connector 
*bridge_connector)
+{
+       struct drm_connector *connector;
+       struct i2c_adapter *ddc = NULL;
+       struct drm_bridge *panel_bridge __free(drm_bridge_put) = NULL;
+       unsigned int supported_formats = BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444);
+       unsigned int max_bpc = 8;
+       bool support_hdcp = false;
+       int connector_type;
+       int ret;
+
+       connector = &bridge_connector->base;
+
+       bridge_connector = drm_bridge_connector_get_bridges(bridge_connector, 
&connector_type,
+                                                           &supported_formats, 
&max_bpc, &ddc,
+                                                           &panel_bridge, 
&support_hdcp);
+       if (IS_ERR(bridge_connector))
+               return bridge_connector;
+
        if (bridge_connector->bridge_hdmi) {
                if (!connector->ycbcr_420_allowed)
                        supported_formats &= 
~BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);

-- 
2.54.0

Reply via email to