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

Rahul Sharma rahul.sharma at samsung.com
Wed Jun 18 21:37:41 PDT 2014


Thanks Inki,

On 19 June 2014 09:34, Inki Dae <inki.dae at samsung.com> wrote:
> 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.
>

Yea you are right. Its returning  -EPROBE_DEFER. I will change this in next
version.

Regards,
Rahul Sharma.

> 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