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.barysh...@linaro.org>
---
 drivers/gpu/drm/bridge/display-connector.c | 55 ++++++++++++----------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/bridge/display-connector.c 
b/drivers/gpu/drm/bridge/display-connector.c
index cad3105ab186..f7f436cf96e0 100644
--- a/drivers/gpu/drm/bridge/display-connector.c
+++ b/drivers/gpu/drm/bridge/display-connector.c
@@ -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;
-- 
2.39.2

Reply via email to