From 82294562bcb794e29b1472ba85202e2c44b80233 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Fri, 21 Feb 2025 09:31:06 +0800 Subject: [PATCH] drm/rockchip: drv: move clk unprotect to the end of drm_bind rockchip_drm_bind() may be delayed for others driver delay probe, this maybe cause rockchip_drm_show_logo() be called after rockchip_clocks_loader_unprotect() and lead to display error, so move clk unprotect to the end of drm_bind. Signed-off-by: Sandy Huang Change-Id: I6eeae1c1307f91777fec23c66c5d5413443335d0 --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 1 + drivers/gpu/drm/rockchip/rockchip_drm_logo.c | 6 +++--- drivers/gpu/drm/rockchip/rockchip_drm_logo.h | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 938ca72fc9c3..fed632d849f2 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -1906,6 +1906,7 @@ static int rockchip_drm_bind(struct device *dev) goto err_drm_fbdev_fini; rockchip_drm_error_event_init(drm_dev); + rockchip_clocks_loader_unprotect(); return 0; err_drm_fbdev_fini: diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c index 1be914c14841..2b7076fac108 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c @@ -1316,7 +1316,7 @@ static const char *const loader_protect_clocks[] __initconst = { "dclk_vp3", }; -static struct clk **loader_clocks __initdata; +static struct clk **loader_clocks; static int __init rockchip_clocks_loader_protect(void) { int nclocks = ARRAY_SIZE(loader_protect_clocks); @@ -1340,7 +1340,7 @@ static int __init rockchip_clocks_loader_protect(void) } arch_initcall_sync(rockchip_clocks_loader_protect); -static int __init rockchip_clocks_loader_unprotect(void) +int rockchip_clocks_loader_unprotect(void) { int i; @@ -1354,8 +1354,8 @@ static int __init rockchip_clocks_loader_unprotect(void) clk_disable_unprepare(clk); } kfree(loader_clocks); + loader_clocks = NULL; return 0; } -late_initcall_sync(rockchip_clocks_loader_unprotect); #endif diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.h b/drivers/gpu/drm/rockchip/rockchip_drm_logo.h index 7e1b1d2dfdf4..ab3fe550713c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.h @@ -42,5 +42,13 @@ struct rockchip_drm_mode_set { void rockchip_drm_show_logo(struct drm_device *drm_dev); void rockchip_free_loader_memory(struct drm_device *drm); +#ifndef MODULE +int rockchip_clocks_loader_unprotect(void); +#else +static inline int rockchip_clocks_loader_unprotect(void) +{ + return 0; +} +#endif #endif