• Emil Renner Berthing's avatar
    clk: starfive: jh7100: Don't round divisor up twice · 40dda353
    Emil Renner Berthing authored
    The problem is best illustrated by an example. Suppose a consumer wants
    a 4MHz clock rate from a divider with a 10MHz parent. It would then
    call
    
      clk_round_rate(clk, 4000000)
    
    which would call into our determine_rate() callback that correctly
    rounds up and finds that a divisor of 3 gives the highest possible
    frequency below the requested 4MHz and returns 10000000 / 3 = 3333333Hz.
    
    However the consumer would then call
    
      clk_set_rate(clk, 3333333)
    
    but since 3333333 doesn't divide 10000000 evenly our set_rate() callback
    would again round the divisor up and set it to 4 which results in an
    unnecessarily low rate of 2.5MHz.
    
    Fix it by using DIV_ROUND_CLOSEST in the set_rate() callback.
    
    Fixes: 4210be66 ("clk: starfive: Add JH7100 clock generator driver")
    Signed-off-by: default avatarEmil Renner Berthing <kernel@esmil.dk>
    Link: https://lore.kernel.org/r/20220126173953.1016706-2-kernel@esmil.dkSigned-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    40dda353
clk-starfive-jh7100.c 27 KB