Commit 6eb6b6f0 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Neil Armstrong

drm/bridge: display-connector: handle hdmi-pwr supply

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: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230531000259.3758235-4-dmitry.baryshkov@linaro.org
parent 99304fd0
...@@ -191,6 +191,18 @@ static irqreturn_t display_connector_hpd_irq(int irq, void *arg) ...@@ -191,6 +191,18 @@ static irqreturn_t display_connector_hpd_irq(int irq, void *arg)
return IRQ_HANDLED; 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) static int display_connector_probe(struct platform_device *pdev)
{ {
struct display_connector *conn; struct display_connector *conn;
...@@ -316,36 +328,15 @@ static int display_connector_probe(struct platform_device *pdev) ...@@ -316,36 +328,15 @@ static int display_connector_probe(struct platform_device *pdev)
if (type == DRM_MODE_CONNECTOR_DisplayPort) { if (type == DRM_MODE_CONNECTOR_DisplayPort) {
int ret; int ret;
conn->supply = devm_regulator_get_optional(&pdev->dev, "dp-pwr"); ret = display_connector_get_supply(pdev, conn, "dp-pwr");
if (ret < 0)
if (IS_ERR(conn->supply)) { return dev_err_probe(&pdev->dev, ret, "failed to get DP PWR regulator\n");
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;
}
}
} }
/* enable DDC */ /* enable DDC */
if (type == DRM_MODE_CONNECTOR_HDMIA) { if (type == DRM_MODE_CONNECTOR_HDMIA) {
int ret;
conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en", conn->ddc_en = devm_gpiod_get_optional(&pdev->dev, "ddc-en",
GPIOD_OUT_HIGH); GPIOD_OUT_HIGH);
...@@ -353,6 +344,18 @@ static int display_connector_probe(struct platform_device *pdev) ...@@ -353,6 +344,18 @@ static int display_connector_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n"); dev_err(&pdev->dev, "Couldn't get ddc-en gpio\n");
return PTR_ERR(conn->ddc_en); 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; conn->bridge.funcs = &display_connector_bridge_funcs;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment