u64 val = (u64)rate * pllt->n;
val <<= pllt->od + pllt->od2 + pllt->od3;
- val = div_u64(val * frac_max, parent_rate);
+
+ if (pll->flags & CLK_MESON_PLL_ROUND_CLOSEST)
+ val = DIV_ROUND_CLOSEST_ULL(val * frac_max, parent_rate);
+ else
+ val = div_u64(val * frac_max, parent_rate);
+
val -= pllt->m * frac_max;
return min((u16)val, (u16)(frac_max - 1));
while (table[i].rate && table[i].rate <= rate)
i++;
- /* Select the setting of the rounded down rate */
- if (i != 0)
- i--;
+ if (i != 0) {
+ if (MESON_PARM_APPLICABLE(&pll->frac) ||
+ !(pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) ||
+ (abs(rate - table[i - 1].rate) <
+ abs(rate - table[i].rate)))
+ i--;
+ }
return (struct pll_rate_table *)&table[i];
}