drm/bridge: display-connector: handle hdmi-pwr supply
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Wed, 31 May 2023 00:02:59 +0000 (03:02 +0300)
committerNeil Armstrong <neil.armstrong@linaro.org>
Wed, 31 May 2023 09:09:48 +0000 (11:09 +0200)
On some devices the +5V Power pin of the HDMI connector and/or the ESD
protection logic is powered on by a separate regulator. Instead of
declaring this regulator as always-on, make hdmi-connector support the
additional hdmi-pwr supply.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230531000259.3758235-4-dmitry.baryshkov@linaro.org
drivers/gpu/drm/bridge/display-connector.c

index cad3105ab1864eab933719ce64151267f9162e18..f7f436cf96e0a34db23dff5c368bb1d306c7088e 100644 (file)
@@ -191,6 +191,18 @@ static irqreturn_t display_connector_hpd_irq(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
+static int display_connector_get_supply(struct platform_device *pdev,
+                                       struct display_connector *conn,
+                                       const char *name)
+{
+       conn->supply = devm_regulator_get_optional(&pdev->dev, name);
+
+       if (conn->supply == ERR_PTR(-ENODEV))
+               conn->supply = NULL;
+
+       return PTR_ERR_OR_ZERO(conn->supply);
+}
+
 static int display_connector_probe(struct platform_device *pdev)
 {
        struct display_connector *conn;
@@ -316,36 +328,15 @@ static int display_connector_probe(struct platform_device *pdev)
        if (type == DRM_MODE_CONNECTOR_DisplayPort) {
                int ret;
 
-               conn->supply = devm_regulator_get_optional(&pdev->dev, "dp-pwr");
-
-               if (IS_ERR(conn->supply)) {
-                       ret = PTR_ERR(conn->supply);
-
-                       switch (ret) {
-                       case -ENODEV:
-                               conn->supply = NULL;
-                               break;
-
-                       case -EPROBE_DEFER:
-                               return -EPROBE_DEFER;
-
-                       default:
-                               dev_err(&pdev->dev, "failed to get DP PWR regulator: %d\n", ret);
-                               return ret;
-                       }
-               }
-
-               if (conn->supply) {
-                       ret = regulator_enable(conn->supply);
-                       if (ret) {
-                               dev_err(&pdev->dev, "failed to enable DP PWR regulator: %d\n", ret);
-                               return ret;
-                       }
-               }
+               ret = display_connector_get_supply(pdev, conn, "dp-pwr");
+               if (ret < 0)
+                       return dev_err_probe(&pdev->dev, ret, "failed to get DP PWR regulator\n");
        }
 
        /* enable DDC */
        if (type == DRM_MODE_CONNECTOR_HDMIA) {
+               int ret;
+
                conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
                                                       GPIOD_OUT_HIGH);
 
@@ -353,6 +344,18 @@ static int display_connector_probe(struct platform_device *pdev)
                        dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
                        return PTR_ERR(conn->ddc_en);
                }
+
+               ret = display_connector_get_supply(pdev, conn, "hdmi-pwr");
+               if (ret < 0)
+                       return dev_err_probe(&pdev->dev, ret, "failed to get HDMI +5V Power regulator\n");
+       }
+
+       if (conn->supply) {
+               ret = regulator_enable(conn->supply);
+               if (ret) {
+                       dev_err(&pdev->dev, "failed to enable PWR regulator: %d\n", ret);
+                       return ret;
+               }
        }
 
        conn->bridge.funcs = &display_connector_bridge_funcs;