Patch "clk: ingenic: Fix bugs with divided dividers" has been added to the 5.15-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.15-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.15 subdirectory.

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



commit 81dadf66e1019c8d4449525d36a04a99b24fdc73
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 266c7595d3302..af31633a8862e 100644
--- a/drivers/clk/ingenic/cgu.c
+++ b/drivers/clk/ingenic/cgu.c
@@ -453,15 +453,15 @@ ingenic_clk_calc_div(struct clk_hw *hw,
 	}
 
 	/* 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