|
42 | 42 | #define GET_SHIFT(val) ((val >> 12) & 0xff)
|
43 | 43 | #define GET_WIDTH(val) ((val >> 8) & 0xf)
|
44 | 44 |
|
45 |
| -#define KDIV(val) FIELD_GET(GENMASK(31, 16), val) |
| 45 | +#define KDIV(val) ((s16)FIELD_GET(GENMASK(31, 16), val)) |
46 | 46 | #define MDIV(val) FIELD_GET(GENMASK(15, 6), val)
|
47 | 47 | #define PDIV(val) FIELD_GET(GENMASK(5, 0), val)
|
48 | 48 | #define SDIV(val) FIELD_GET(GENMASK(2, 0), val)
|
@@ -695,18 +695,18 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
|
695 | 695 | struct pll_clk *pll_clk = to_pll(hw);
|
696 | 696 | struct rzg2l_cpg_priv *priv = pll_clk->priv;
|
697 | 697 | unsigned int val1, val2;
|
698 |
| - unsigned int mult = 1; |
699 |
| - unsigned int div = 1; |
| 698 | + u64 rate; |
700 | 699 |
|
701 | 700 | if (pll_clk->type != CLK_TYPE_SAM_PLL)
|
702 | 701 | return parent_rate;
|
703 | 702 |
|
704 | 703 | val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
|
705 | 704 | val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
|
706 |
| - mult = MDIV(val1) + KDIV(val1) / 65536; |
707 |
| - div = PDIV(val1) << SDIV(val2); |
708 | 705 |
|
709 |
| - return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, div); |
| 706 | + rate = mul_u64_u32_shr(parent_rate, (MDIV(val1) << 16) + KDIV(val1), |
| 707 | + 16 + SDIV(val2)); |
| 708 | + |
| 709 | + return DIV_ROUND_CLOSEST_ULL(rate, PDIV(val1)); |
710 | 710 | }
|
711 | 711 |
|
712 | 712 | static const struct clk_ops rzg2l_cpg_pll_ops = {
|
|
0 commit comments