summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Horman <horms+renesas@verge.net.au>2019-03-25 17:35:54 +0100
committerGeert Uytterhoeven <geert+renesas@glider.be>2019-04-02 09:50:48 +0200
commit71119b54a2e6d9345f22d9501c4d3c28b06f955a (patch)
tree6c8d117bc56cbaaa9507d697e5246f7570a1f76f
parentcb8be119d21d8a0affc3598a928dd0baf5da238f (diff)
downloadlinux-stable-71119b54a2e6d9345f22d9501c4d3c28b06f955a.tar.gz
linux-stable-71119b54a2e6d9345f22d9501c4d3c28b06f955a.tar.bz2
linux-stable-71119b54a2e6d9345f22d9501c4d3c28b06f955a.zip
clk: renesas: rcar-gen3: Support Z and Z2 clocks with high frequency parents
Support Z and Z2 clocks with parent frequencies greater than UINT32_MAX Hz (~4.29GHz). The DIV_ROUND_CLOSEST_ULL() macro accepts a 64bit dividend and 32bit divisor. This leads to truncation of the divisor, which is the Z or Z2 parent clock frequency in HZ, on platforms where frequency of that clock is greater than UINT32_MAX Hz. To resolve this problem the DIV64_U64_ROUND_CLOSEST() macro, which takes on an unsigned 64bit dividend and divisor, is used. An earlier version of this patch made use of the existing DIV_ROUND_CLOSEST() macro, which accepts the prevailing type of the dividend and divisor. However, this does not compile on 32bit systems, such as i386 and mips, when called with the types used at this call site, an unsigned long long dividend and unsigned long divisor. This work is in preparation for supporting the Z2 clock on the R-Car Gen3 E3 (r8a77990) SoC which has a 4.8GHz parent clock. Signed-off-by: Simon Horman <horms+renesas@verge.net.au> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
-rw-r--r--drivers/clk/renesas/rcar-gen3-cpg.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/clk/renesas/rcar-gen3-cpg.c b/drivers/clk/renesas/rcar-gen3-cpg.c
index 62220d83b497..d5fb768b089f 100644
--- a/drivers/clk/renesas/rcar-gen3-cpg.c
+++ b/drivers/clk/renesas/rcar-gen3-cpg.c
@@ -134,8 +134,8 @@ static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned int mult;
unsigned int i;
- mult = DIV_ROUND_CLOSEST_ULL(rate * 32ULL * zclk->fixed_div,
- parent_rate);
+ mult = DIV64_U64_ROUND_CLOSEST(rate * 32ULL * zclk->fixed_div,
+ parent_rate);
mult = clamp(mult, 1U, 32U);
if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK)