]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
clk: stm32f: fix setting of LCD clock
authorDario Binacchi <dario.binacchi@amarulasolutions.com>
Sat, 11 Nov 2023 10:46:19 +0000 (11:46 +0100)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 15 Dec 2023 14:03:18 +0000 (15:03 +0100)
Set pllsaidivr only if the PLLSAIR output frequency is an exact multiple
of the pixel clock rate. Otherwise, we search through all combinations
of pllsaidivr * pllsair and use the one which gives the rate closest to
requested one.

Fixes: 5e993508cb25 ("clk: clk_stm32f: Add set_rate for LTDC clock")
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
drivers/clk/stm32/clk-stm32f.c

index 4c1864193357f8fe4b8d1c503d846bf42a41e4f7..d68c75ed2013c6246a372dcfa99be0db5b3e87d2 100644 (file)
@@ -522,18 +522,20 @@ static ulong stm32_set_rate(struct clk *clk, ulong rate)
 
        /* get the current PLLSAIR output freq */
        pllsair_rate = stm32_clk_get_pllsai_rate(priv, PLLSAIR);
-       best_div = pllsair_rate / rate;
-
-       /* look into pllsaidivr_table if this divider is available*/
-       for (i = 0 ; i < sizeof(pllsaidivr_table); i++)
-               if (best_div == pllsaidivr_table[i]) {
-                       /* set pll_saidivr with found value */
-                       clrsetbits_le32(&regs->dckcfgr,
-                                       RCC_DCKCFGR_PLLSAIDIVR_MASK,
-                                       pllsaidivr_table[i] <<
-                                       RCC_DCKCFGR_PLLSAIDIVR_SHIFT);
-                       return rate;
-               }
+       if ((pllsair_rate % rate) == 0) {
+               best_div = pllsair_rate / rate;
+
+               /* look into pllsaidivr_table if this divider is available */
+               for (i = 0 ; i < sizeof(pllsaidivr_table); i++)
+                       if (best_div == pllsaidivr_table[i]) {
+                               /* set pll_saidivr with found value */
+                               clrsetbits_le32(&regs->dckcfgr,
+                                               RCC_DCKCFGR_PLLSAIDIVR_MASK,
+                                               pllsaidivr_table[i] <<
+                                               RCC_DCKCFGR_PLLSAIDIVR_SHIFT);
+                               return rate;
+                       }
+       }
 
        /*
         * As no pllsaidivr value is suitable to obtain requested freq,