struct meson_clk_pll_data *pll)
 {
        u64 rate = (u64)parent_rate * m;
+       unsigned int frac_max = pll->frac_max ? pll->frac_max :
+                                               (1 << pll->frac.width);
 
        if (frac && MESON_PARM_APPLICABLE(&pll->frac)) {
                u64 frac_rate = (u64)parent_rate * frac;
 
-               rate += DIV_ROUND_UP_ULL(frac_rate,
-                                        (1 << pll->frac.width));
+               rate += DIV_ROUND_UP_ULL(frac_rate, frac_max);
        }
 
        return DIV_ROUND_UP_ULL(rate, n);
                                           unsigned int n,
                                           struct meson_clk_pll_data *pll)
 {
-       unsigned int frac_max = (1 << pll->frac.width);
+       unsigned int frac_max = pll->frac_max ? pll->frac_max :
+                                               (1 << pll->frac.width);
        u64 val = (u64)rate * n;
 
        /* Bail out if we are already over the requested rate */