Patch "clk: ingenic: Fix bugs with divided dividers" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    clk: ingenic: Fix bugs with divided dividers

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     clk-ingenic-fix-bugs-with-divided-dividers.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 11cd51e1de0f8ff3c30c8a877b4701b3c74a760e
Author: Paul Cercueil <paul@xxxxxxxxxxxxxxx>
Date:   Fri Oct 1 18:20:33 2021 +0100

    clk: ingenic: Fix bugs with divided dividers
    
    [ Upstream commit ed84ef1cd7eddf933d4ffce2caa8161d6f947245 ]
    
    Two fixes in one:
    
    - In the "impose hardware constraints" block, the "logical" divider
      value (aka. not translated to the hardware) was clamped to fit in the
      register area, but this totally ignored the fact that the divider
      value can itself have a fixed divider.
    
    - The code that made sure that the divider value returned by the
      function was a multiple of its own fixed divider could result in a
      wrong value being calculated, because it was rounded down instead of
      rounded up.
    
    Fixes: 4afe2d1a6ed5 ("clk: ingenic: Allow divider value to be divided")
    Co-developed-by: Artur Rojek <contact@xxxxxxxxxxxxxx>
    Signed-off-by: Artur Rojek <contact@xxxxxxxxxxxxxx>
    Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20211001172033.122329-1-paul@xxxxxxxxxxxxxxx
    Signed-off-by: Stephen Boyd <sboyd@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/clk/ingenic/cgu.c b/drivers/clk/ingenic/cgu.c
index 7490d4f4d9366..dff759c0f6193 100644
--- a/drivers/clk/ingenic/cgu.c
+++ b/drivers/clk/ingenic/cgu.c
@@ -426,15 +426,15 @@ ingenic_clk_calc_div(const struct ingenic_cgu_clk_info *clk_info,
 	}
 
 	/* Impose hardware constraints */
-	div = min_t(unsigned, div, 1 << clk_info->div.bits);
-	div = max_t(unsigned, div, 1);
+	div = clamp_t(unsigned int, div, clk_info->div.div,
+		      clk_info->div.div << clk_info->div.bits);
 
 	/*
 	 * If the divider value itself must be divided before being written to
 	 * the divider register, we must ensure we don't have any bits set that
 	 * would be lost as a result of doing so.
 	 */
-	div /= clk_info->div.div;
+	div = DIV_ROUND_UP(div, clk_info->div.div);
 	div *= clk_info->div.div;
 
 	return div;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux