rockchip: backport upstream fix for vop2 driver
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
parent
a34f22a06c
commit
aa89ed3e2a
@ -0,0 +1,47 @@
|
||||
From afa965a45e01e541cdbe5c8018226eff117610f0 Mon Sep 17 00:00:00 2001
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Date: Thu, 13 Apr 2023 16:43:47 +0200
|
||||
Subject: [PATCH] drm/rockchip: vop2: fix suspend/resume
|
||||
|
||||
During a suspend/resume cycle the VO power domain will be disabled and
|
||||
the VOP2 registers will reset to their default values. After that the
|
||||
cached register values will be out of sync and the read/modify/write
|
||||
operations we do on the window registers will result in bogus values
|
||||
written. Fix this by re-initializing the register cache each time we
|
||||
enable the VOP2. With this the VOP2 will show a picture after a
|
||||
suspend/resume cycle whereas without this the screen stays dark.
|
||||
|
||||
Fixes: 604be85547ce4 ("drm/rockchip: Add VOP2 driver")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Tested-by: Chris Morgan <macromorgan@hotmail.com>
|
||||
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20230413144347.3506023-1-s.hauer@pengutronix.de
|
||||
---
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
||||
@@ -214,6 +214,8 @@ struct vop2 {
|
||||
struct vop2_win win[];
|
||||
};
|
||||
|
||||
+static const struct regmap_config vop2_regmap_config;
|
||||
+
|
||||
static struct vop2_video_port *to_vop2_video_port(struct drm_crtc *crtc)
|
||||
{
|
||||
return container_of(crtc, struct vop2_video_port, crtc);
|
||||
@@ -838,6 +840,12 @@ 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);
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From b63a553e8f5aa6574eeb535a551817a93c426d8c Mon Sep 17 00:00:00 2001
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Date: Mon, 17 Apr 2023 14:37:47 +0200
|
||||
Subject: [PATCH] drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume
|
||||
|
||||
afa965a45e01 ("drm/rockchip: vop2: fix suspend/resume") uses
|
||||
regmap_reinit_cache() to fix the suspend/resume issue with the VOP2
|
||||
driver. During discussion it came up that we should rather use
|
||||
regcache_sync() instead. As the original patch is already applied
|
||||
fix this up in this follow-up patch.
|
||||
|
||||
Fixes: afa965a45e01 ("drm/rockchip: vop2: fix suspend/resume")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20230417123747.2179695-1-s.hauer@pengutronix.de
|
||||
---
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 10 +++-------
|
||||
1 file changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
||||
@@ -214,8 +214,6 @@ struct vop2 {
|
||||
struct vop2_win win[];
|
||||
};
|
||||
|
||||
-static const struct regmap_config vop2_regmap_config;
|
||||
-
|
||||
static struct vop2_video_port *to_vop2_video_port(struct drm_crtc *crtc)
|
||||
{
|
||||
return container_of(crtc, struct vop2_video_port, crtc);
|
||||
@@ -840,11 +838,7 @@ 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;
|
||||
- }
|
||||
+ regcache_sync(vop2->map);
|
||||
|
||||
if (vop2->data->soc_id == 3566)
|
||||
vop2_writel(vop2, RK3568_OTP_WIN_EN, 1);
|
||||
@@ -874,6 +868,8 @@ static void vop2_disable(struct vop2 *vo
|
||||
|
||||
pm_runtime_put_sync(vop2->dev);
|
||||
|
||||
+ regcache_mark_dirty(vop2->map);
|
||||
+
|
||||
clk_disable_unprepare(vop2->aclk);
|
||||
clk_disable_unprepare(vop2->hclk);
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user