[PATCH] drm/exynos: defer hdmi probe when fail to get regulators

Inki Dae inki.dae at samsung.com
Wed Jun 18 21:04:11 PDT 2014


On 2014년 06월 18일 22:42, Rahul Sharma wrote:
> HDMI probe proceeds with dummy regulators when the regulators
> are not provided in DT node or regulator provider has not get
> probed or failed to register the regulators.
> 
> This patch modify hdmi driver to defer the probe in case the
> regulators are not available.

No, already available. See the below comments.

> 
> Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com>
> ---
> Based on exynos-drm-fixes branch in Inki dae's tree.
>  drivers/gpu/drm/exynos/exynos_hdmi.c |   69 ++++++++++++++++++++++++----------
>  1 file changed, 50 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
> index aa259b0..3f24c49 100644
> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c
> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
> @@ -83,7 +83,7 @@ struct hdmi_resources {
>  	struct clk			*sclk_pixel;
>  	struct clk			*sclk_hdmiphy;
>  	struct clk			*mout_hdmi;
> -	struct regulator_bulk_data	*regul_bulk;
> +	struct regulator		**regulators;
>  	int				regul_count;
>  };
>  
> @@ -2022,6 +2022,36 @@ static void hdmi_commit(struct exynos_drm_display *display)
>  	hdmi_conf_apply(hdata);
>  }
>  
> +int hdmi_regulator_enable(struct hdmi_context *hdata)
> +{
> +	struct hdmi_resources *res = &hdata->res;
> +	int i, ret;
> +
> +	for (i = 0; i < res->regul_count; ++i) {
> +		ret = regulator_enable(res->regulators[i]);
> +		if (ret < 0) {
> +			DRM_ERROR("fail to enable regulators.\n");
> +			return ret;
> +		}
> +	}
> +	return 0;
> +}
> +
> +int hdmi_regulator_disable(struct hdmi_context *hdata)
> +{
> +	struct hdmi_resources *res = &hdata->res;
> +	int i, ret;
> +
> +	for (i = 0; i < res->regul_count; ++i) {
> +		ret = regulator_disable(res->regulators[i]);
> +		if (ret < 0) {
> +			DRM_ERROR("fail to disable regulators.\n");
> +			return ret;
> +		}
> +	}
> +	return 0;
> +}
> +
>  static void hdmi_poweron(struct exynos_drm_display *display)
>  {
>  	struct hdmi_context *hdata = display->ctx;
> @@ -2039,8 +2069,8 @@ static void hdmi_poweron(struct exynos_drm_display *display)
>  
>  	pm_runtime_get_sync(hdata->dev);
>  
> -	if (regulator_bulk_enable(res->regul_count, res->regul_bulk))
> -		DRM_DEBUG_KMS("failed to enable regulator bulk\n");
> +	if (hdmi_regulator_enable(hdata))
> +		DRM_DEBUG_KMS("failed to enable regulators\n");
>  
>  	/* set pmu hdmiphy control bit to enable hdmiphy */
>  	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
> @@ -2077,7 +2107,8 @@ static void hdmi_poweroff(struct exynos_drm_display *display)
>  	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
>  			PMU_HDMI_PHY_ENABLE_BIT, 0);
>  
> -	regulator_bulk_disable(res->regul_count, res->regul_bulk);
> +	if (hdmi_regulator_disable(hdata))
> +		DRM_DEBUG_KMS("failed to disable regulators\n");
>  
>  	pm_runtime_put_sync(hdata->dev);
>  
> @@ -2211,24 +2242,24 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
>  
>  	clk_set_parent(res->mout_hdmi, res->sclk_pixel);
>  
> -	res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
> -		sizeof(res->regul_bulk[0]), GFP_KERNEL);
> -	if (!res->regul_bulk) {
> -		ret = -ENOMEM;
> -		goto fail;
> -	}
> +	res->regul_count = ARRAY_SIZE(supply);
> +
> +	res->regulators = devm_kzalloc(dev, res->regul_count *
> +		sizeof(res->regulators[0]), GFP_KERNEL);
> +	if (!res->regulators)
> +		return -ENOMEM;
> +
>  	for (i = 0; i < ARRAY_SIZE(supply); ++i) {
> -		res->regul_bulk[i].supply = supply[i];
> -		res->regul_bulk[i].consumer = NULL;
> -	}
> -	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
> -	if (ret) {
> -		DRM_ERROR("failed to get regulators\n");
> -		return ret;
> +		res->regulators[i] =
> +			devm_regulator_get_optional(dev, supply[i]);
> +		if (IS_ERR(res->regulators[i])) {
> +			DRM_ERROR("fail to get regulator: %s.\n",
> +				supply[i]);
> +			return -EPROBE_DEFER;

devm_regulator_get_optional function would return -EPROBE_DEFER if
needed. So it's not good to force returning -EPROBE_DEFER in case of all
errors.

Thanks,
Inki Dae

> +		}
>  	}
> -	res->regul_count = ARRAY_SIZE(supply);
>  
> -	return ret;
> +	return 0;
>  fail:
>  	DRM_ERROR("HDMI resource init - failed\n");
>  	return ret;
> 



More information about the dri-devel mailing list