Message ID | 20230417094215.2049231-1-s.hauer@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/rockchip: vop2: fix suspend/resume | expand |
Hi Sascha, Am Montag, 17. April 2023, 11:42:15 CEST schrieb Sascha Hauer: > 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 marking the regcache as dirty each time we disable > the VOP2 and call regcache_sync() each time we enable it again. 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> somehow we overlapped with this v2 and me applying the original one [0] to drm-misc. With drm-misc being a shared tree there is also no way back. So if this v2 is better suited, could do a follow-up patch instead - on top of your original one? Thanks Heiko [0] https://cgit.freedesktop.org/drm/drm-misc/commit/?h=drm-misc-fixes&id=afa965a45e01e541cdbe5c8018226eff117610f0 > --- > > Changes since v1: > - Use regcache_mark_dirty()/regcache_sync() instead of regmap_reinit_cache() > > drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c > index ba3b817895091..293c228a83f90 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c > @@ -839,6 +839,8 @@ static void vop2_enable(struct vop2 *vop2) > return; > } > > + regcache_sync(vop2->map); > + > if (vop2->data->soc_id == 3566) > vop2_writel(vop2, RK3568_OTP_WIN_EN, 1); > > @@ -867,6 +869,8 @@ static void vop2_disable(struct vop2 *vop2) > > pm_runtime_put_sync(vop2->dev); > > + regcache_mark_dirty(vop2->map); > + > clk_disable_unprepare(vop2->aclk); > clk_disable_unprepare(vop2->hclk); > } >
On Mon, Apr 17, 2023 at 12:46:05PM +0200, Heiko Stübner wrote: > Hi Sascha, > > Am Montag, 17. April 2023, 11:42:15 CEST schrieb Sascha Hauer: > > 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 marking the regcache as dirty each time we disable > > the VOP2 and call regcache_sync() each time we enable it again. 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> > > somehow we overlapped with this v2 and me applying the original one [0] > to drm-misc. With drm-misc being a shared tree there is also no way back. > > So if this v2 is better suited, could do a follow-up patch instead - on > top of your original one? Alright, just did that. You should find it in your inbox. Sascha
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index ba3b817895091..293c228a83f90 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -839,6 +839,8 @@ static void vop2_enable(struct vop2 *vop2) return; } + regcache_sync(vop2->map); + if (vop2->data->soc_id == 3566) vop2_writel(vop2, RK3568_OTP_WIN_EN, 1); @@ -867,6 +869,8 @@ static void vop2_disable(struct vop2 *vop2) pm_runtime_put_sync(vop2->dev); + regcache_mark_dirty(vop2->map); + clk_disable_unprepare(vop2->aclk); clk_disable_unprepare(vop2->hclk); }
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 marking the regcache as dirty each time we disable the VOP2 and call regcache_sync() each time we enable it again. 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> --- Changes since v1: - Use regcache_mark_dirty()/regcache_sync() instead of regmap_reinit_cache() drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 4 ++++ 1 file changed, 4 insertions(+)