simplefb_clocks_enable() calls clk_prepare_enable() to avoid clocks used by the framebuffer getting turned off while in use.
This requires simplefb_clocks_destroy() calling clk_disable_unprepare() to balance the enable count. clk_disable_unprepare() actually turns the clock off, messing with the hardware state before the real display driver loads, without any knowledge of the proper display power-off sequence. Sometimes this leaves the hardware in an undefined state e.g. on some Qualcomm platforms turning off the DP clocks at simplefb_destroy() results in the following error when the msm display driver tries to re-enable them: [ 2.980181] disp_cc_mdss_dptx3_pixel0_clk_src: rcg didn't update its configuration. [ 2.980272] WARNING: drivers/clk/qcom/clk-rcg2.c:136 at update_config+0xdc/0x100 Resulting in a non work display output. Switch to using the new __clk_disable_unprepare_counts_only() function, which decrements the counts without actually turning off the clocks. Signed-off-by: Hans de Goede <[email protected]> --- drivers/video/fbdev/simplefb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c index 60e5dcec201f..b1e0dba6d127 100644 --- a/drivers/video/fbdev/simplefb.c +++ b/drivers/video/fbdev/simplefb.c @@ -303,7 +303,7 @@ static void simplefb_clocks_destroy(struct simplefb_par *par) for (i = 0; i < par->clk_count; i++) { if (par->clks[i]) { if (par->clks_enabled) - clk_disable_unprepare(par->clks[i]); + __clk_disable_unprepare_counts_only(par->clks[i]); clk_put(par->clks[i]); } } -- 2.54.0
