• Paul Cercueil's avatar
    clk: ingenic: jz4760: Update M/N/OD calculation algorithm · ecfb9f40
    Paul Cercueil authored
    The previous algorithm was pretty broken.
    
    - The inner loop had a '(m > m_max)' condition, and the value of 'm'
      would increase in each iteration;
    
    - Each iteration would actually multiply 'm' by two, so it is not needed
      to re-compute the whole equation at each iteration;
    
    - It would loop until (m & 1) == 0, which means it would loop at most
      once.
    
    - The outer loop would divide the 'n' value by two at the end of each
      iteration. This meant that for a 12 MHz parent clock and a 1.2 GHz
      requested clock, it would first try n=12, then n=6, then n=3, then
      n=1, none of which would work; the only valid value is n=2 in this
      case.
    
    Simplify this algorithm with a single for loop, which decrements 'n'
    after each iteration, addressing all of the above problems.
    
    Fixes: bdbfc029
    
     ("clk: ingenic: Add support for the JZ4760")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarPaul Cercueil <paul@crapouillou.net>
    Link: https://lore.kernel.org/r/202212141237...
    ecfb9f40
jz4760-cgu.c 10.8 KB