Re: [PATCH] drm/bridge: analogix dp: Fix runtime PM state on driver bind

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 30, 2016 at 4:57 AM, Marek Szyprowski
<m.szyprowski@xxxxxxxxxxx> wrote:
> Analogix_dp_bind() can be called from component framework, which doesn't
> guarantee proper runtime PM state of the device during bind operation,
> so ensure that device is runtime active before doing any register access.
> This ensures that the power domain, to which DP module belongs, is turned
> on. While at it, also fix the unbalanced call to phy_power_on() in
> analogix_dp_bind() function.
>
> This patch solves the following kernel oops on Samsung Exynos5250 Snow
> board:
>
> Unhandled fault: imprecise external abort (0x406) at 0x00000000
> pgd = c0004000
> [00000000] *pgd=00000000
> Internal error: : 406 [#1] PREEMPT SMP ARM
> Modules linked in:
> CPU: 0 PID: 75 Comm: kworker/0:2 Not tainted 4.9.0 #1046
> Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
> Workqueue: events deferred_probe_work_func
> task: ee272300 task.stack: ee312000
> PC is at analogix_dp_enable_sw_function+0x18/0x2c
> LR is at analogix_dp_init_dp+0x2c/0x50
> ...
> [<c03fcb38>] (analogix_dp_enable_sw_function) from [<c03fa9c4>] (analogix_dp_init_dp+0x2c/0x50)
> [<c03fa9c4>] (analogix_dp_init_dp) from [<c03fab6c>] (analogix_dp_bind+0x184/0x42c)
> [<c03fab6c>] (analogix_dp_bind) from [<c03fdb84>] (component_bind_all+0xf0/0x218)
> [<c03fdb84>] (component_bind_all) from [<c03ed64c>] (exynos_drm_load+0x134/0x200)
> [<c03ed64c>] (exynos_drm_load) from [<c03d5058>] (drm_dev_register+0xa0/0xd0)
> [<c03d5058>] (drm_dev_register) from [<c03d66b8>] (drm_platform_init+0x58/0xb0)
> [<c03d66b8>] (drm_platform_init) from [<c03fe0c4>] (try_to_bring_up_master+0x14c/0x188)
> [<c03fe0c4>] (try_to_bring_up_master) from [<c03fe188>] (component_add+0x88/0x138)
> [<c03fe188>] (component_add) from [<c0403a38>] (platform_drv_probe+0x50/0xb0)
> [<c0403a38>] (platform_drv_probe) from [<c0402470>] (driver_probe_device+0x1f0/0x2a8)
> [<c0402470>] (driver_probe_device) from [<c0400a54>] (bus_for_each_drv+0x44/0x8c)
> [<c0400a54>] (bus_for_each_drv) from [<c04021f8>] (__device_attach+0x9c/0x100)
> [<c04021f8>] (__device_attach) from [<c04018e8>] (bus_probe_device+0x84/0x8c)
> [<c04018e8>] (bus_probe_device) from [<c0401d1c>] (deferred_probe_work_func+0x60/0x8c)
> [<c0401d1c>] (deferred_probe_work_func) from [<c012fc14>] (process_one_work+0x120/0x318)
> [<c012fc14>] (process_one_work) from [<c012fe34>] (process_scheduled_works+0x28/0x38)
> [<c012fe34>] (process_scheduled_works) from [<c0130048>] (worker_thread+0x204/0x4ac)
> [<c0130048>] (worker_thread) from [<c01352c4>] (kthread+0xd8/0xf4)
> [<c01352c4>] (kthread) from [<c0107978>] (ret_from_fork+0x14/0x3c)
> Code: e59035f0 e5935018 f57ff04f e3c55001 (f57ff04e)
> ---[ end trace 3d1d0d87796de344 ]---
>

Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx>

> Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> ---
>  drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index eb9bf8786c24..18eefdcbf1ba 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -1382,6 +1382,7 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
>
>         pm_runtime_enable(dev);
>
> +       pm_runtime_get_sync(dev);
>         phy_power_on(dp->phy);
>
>         analogix_dp_init_dp(dp);
> @@ -1414,9 +1415,15 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
>                 goto err_disable_pm_runtime;
>         }
>
> +       phy_power_off(dp->phy);
> +       pm_runtime_put(dev);
> +
>         return 0;
>
>  err_disable_pm_runtime:
> +
> +       phy_power_off(dp->phy);
> +       pm_runtime_put(dev);
>         pm_runtime_disable(dev);
>
>         return ret;
> --
> 1.9.1
>



-- 
Sean Paul, Software Engineer, Google / Chromium OS
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  Powered by Linux