[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