60 lines
2.3 KiB
Diff
60 lines
2.3 KiB
Diff
From 3ee348eb36f14e9303a7e9757efb91b0bbf3f7a9 Mon Sep 17 00:00:00 2001
|
|
From: Andy Yan <andy.yan@rock-chips.com>
|
|
Date: Sun, 17 Dec 2023 16:44:15 +0800
|
|
Subject: [PATCH] drm/rockchip: vop2: Avoid use regmap_reinit_cache at runtime
|
|
|
|
Marek Report a possible irq lock inversion dependency warning when
|
|
commit 81a06f1d02e5 ("Revert "drm/rockchip: vop2: Use regcache_sync()
|
|
to fix suspend/resume"") lands linux-next.
|
|
|
|
I can reproduce this warning with:
|
|
CONFIG_PROVE_LOCKING=y
|
|
CONFIG_DEBUG_LOCKDEP=y
|
|
|
|
It seems than when use regmap_reinit_cache at runtime whith Mark's
|
|
commit 3d59c22bbb8d ("drm/rockchip: vop2: Convert to use maple tree
|
|
register cache"), it will trigger a possible irq lock inversion dependency
|
|
warning.
|
|
|
|
One solution is switch back to REGCACHE_RBTREE, but it seems that
|
|
REGCACHE_MAPLE is the future, so I avoid using regmap_reinit_cache,
|
|
and drop all the regcache when vop is disabled, then we get a fresh
|
|
start at next enbable time.
|
|
|
|
Fixes: 81a06f1d02e5 ("Revert "drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume"")
|
|
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
Closes: https://lore.kernel.org/all/98a9f15d-30ac-47bf-9b93-3aa2c9900f7b@samsung.com/
|
|
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
|
|
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
[dropped the large kernel log of the lockdep report from the message]
|
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20231217084415.2373043-1-andyshrk@163.com
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 8 ++------
|
|
1 file changed, 2 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
@@ -970,12 +970,6 @@ static void vop2_enable(struct vop2 *vop
|
|
return;
|
|
}
|
|
|
|
- ret = regmap_reinit_cache(vop2->map, &vop2_regmap_config);
|
|
- if (ret) {
|
|
- drm_err(vop2->drm, "failed to reinit cache: %d\n", ret);
|
|
- return;
|
|
- }
|
|
-
|
|
if (vop2->data->soc_id == 3566)
|
|
vop2_writel(vop2, RK3568_OTP_WIN_EN, 1);
|
|
|
|
@@ -1007,6 +1001,8 @@ static void vop2_disable(struct vop2 *vo
|
|
|
|
pm_runtime_put_sync(vop2->dev);
|
|
|
|
+ regcache_drop_region(vop2->map, 0, vop2_regmap_config.max_register);
|
|
+
|
|
clk_disable_unprepare(vop2->pclk);
|
|
clk_disable_unprepare(vop2->aclk);
|
|
clk_disable_unprepare(vop2->hclk);
|