[PATCH v2 3/3] drm/bridge: display-connector: handle hdmi-pwr supply

Neil Armstrong neil.armstrong at linaro.org
Mon May 22 14:11:59 UTC 2023


On 19/05/2023 20:40, Dmitry Baryshkov wrote:
> 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 at 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 1d37e57242dd..d6a9aa589d17 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, "dp-pwr");

You should use name here right ?

Neil

> +
> +	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;
> @@ -319,36 +331,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);
>   
> @@ -356,6 +347,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 DP PWR regulator: %d\n", ret);
> +			return ret;
> +		}
>   	}
>   
>   	conn->bridge.funcs = &display_connector_bridge_funcs;



More information about the dri-devel mailing list