[PATCH] drm/exynos: hdmi: don't leak enable HDMI_EN regulator if probe fails
Andrzej Hajda
a.hajda at samsung.com
Thu Feb 27 09:03:26 UTC 2020
On 20.02.2020 13:57, Marek Szyprowski wrote:
> Move enabling and disabling HDMI_EN optional regulator to probe() function
> to keep track on the regulator status. This fixes following warning if
> probe() fails (for example when I2C DDC adapter cannot be yet gathered
> due to the missing driver). This fixes following warning observed on
> Arndale5250 board with multi_v7_defconfig:
>
> [drm] Failed to get ddc i2c adapter by node
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 214 at drivers/regulator/core.c:2051 _regulator_put+0x16c/0x184
> Modules linked in: ...
> CPU: 0 PID: 214 Comm: systemd-udevd Not tainted 5.6.0-rc2-next-20200219-00040-g38af1dfafdbb #7570
> Hardware name: Samsung Exynos (Flattened Device Tree)
> [<c0312258>] (unwind_backtrace) from [<c030cc10>] (show_stack+0x10/0x14)
> [<c030cc10>] (show_stack) from [<c0f0d3a0>] (dump_stack+0xcc/0xe0)
> [<c0f0d3a0>] (dump_stack) from [<c0346a58>] (__warn+0xe0/0xf8)
> [<c0346a58>] (__warn) from [<c0346b20>] (warn_slowpath_fmt+0xb0/0xb8)
> [<c0346b20>] (warn_slowpath_fmt) from [<c0893f58>] (_regulator_put+0x16c/0x184)
> [<c0893f58>] (_regulator_put) from [<c0893f8c>] (regulator_put+0x1c/0x2c)
> [<c0893f8c>] (regulator_put) from [<c09b2664>] (release_nodes+0x17c/0x200)
> [<c09b2664>] (release_nodes) from [<c09aebe8>] (really_probe+0x10c/0x350)
> [<c09aebe8>] (really_probe) from [<c09aefa8>] (driver_probe_device+0x60/0x1a0)
> [<c09aefa8>] (driver_probe_device) from [<c09af288>] (device_driver_attach+0x58/0x60)
> [<c09af288>] (device_driver_attach) from [<c09af310>] (__driver_attach+0x80/0xbc)
> [<c09af310>] (__driver_attach) from [<c09ace34>] (bus_for_each_dev+0x68/0xb4)
> [<c09ace34>] (bus_for_each_dev) from [<c09ae00c>] (bus_add_driver+0x130/0x1e8)
> [<c09ae00c>] (bus_add_driver) from [<c09afd98>] (driver_register+0x78/0x110)
> [<c09afd98>] (driver_register) from [<bf139558>] (exynos_drm_init+0xe8/0x11c [exynosdrm])
> [<bf139558>] (exynos_drm_init [exynosdrm]) from [<c0302fa8>] (do_one_initcall+0x50/0x220)
> [<c0302fa8>] (do_one_initcall) from [<c03dc02c>] (do_init_module+0x60/0x210)
> [<c03dc02c>] (do_init_module) from [<c03daf44>] (load_module+0x1c0c/0x2310)
> [<c03daf44>] (load_module) from [<c03db85c>] (sys_finit_module+0xac/0xbc)
> [<c03db85c>] (sys_finit_module) from [<c0301000>] (ret_fast_syscall+0x0/0x54)
> Exception stack(0xecca3fa8 to 0xecca3ff0)
> ...
> ---[ end trace 276c91214635905c ]---
>
> Signed-off-by: Marek Szyprowski <m.szyprowski at samsung.com>
Reviewed-by: Andrzej Hajda <a.hajda at samsung.com>
--
Regards
Andrzej
> ---
> drivers/gpu/drm/exynos/exynos_hdmi.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
> index 9ff921f43a93..f141916eade6 100644
> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c
> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
> @@ -1805,18 +1805,10 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
>
> hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en");
>
> - if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV) {
> + if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV)
> if (IS_ERR(hdata->reg_hdmi_en))
> return PTR_ERR(hdata->reg_hdmi_en);
>
> - ret = regulator_enable(hdata->reg_hdmi_en);
> - if (ret) {
> - DRM_DEV_ERROR(dev,
> - "failed to enable hdmi-en regulator\n");
> - return ret;
> - }
> - }
> -
> return hdmi_bridge_init(hdata);
> }
>
> @@ -2023,6 +2015,15 @@ static int hdmi_probe(struct platform_device *pdev)
> }
> }
>
> + if (!IS_ERR(hdata->reg_hdmi_en)) {
> + ret = regulator_enable(hdata->reg_hdmi_en);
> + if (ret) {
> + DRM_DEV_ERROR(dev,
> + "failed to enable hdmi-en regulator\n");
> + goto err_hdmiphy;
> + }
> + }
> +
> pm_runtime_enable(dev);
>
> audio_infoframe = &hdata->audio.infoframe;
> @@ -2047,7 +2048,8 @@ static int hdmi_probe(struct platform_device *pdev)
>
> err_rpm_disable:
> pm_runtime_disable(dev);
> -
> + if (!IS_ERR(hdata->reg_hdmi_en))
> + regulator_disable(hdata->reg_hdmi_en);
> err_hdmiphy:
> if (hdata->hdmiphy_port)
> put_device(&hdata->hdmiphy_port->dev);
More information about the dri-devel
mailing list