unsigned long *prate)
 {
        struct mmp_clk_factor *factor = to_clk_factor(hw);
-       unsigned long rate = 0, prev_rate;
+       u64 rate = 0, prev_rate;
        int i;
 
        for (i = 0; i < factor->ftbl_cnt; i++) {
                prev_rate = rate;
-               rate = (((*prate / 10000) * factor->ftbl[i].den) /
-                       (factor->ftbl[i].num * factor->masks->factor)) * 10000;
+               rate = *prate;
+               rate *= factor->ftbl[i].den;
+               do_div(rate, factor->ftbl[i].num * factor->masks->factor);
+
                if (rate > drate)
                        break;
        }
        struct mmp_clk_factor *factor = to_clk_factor(hw);
        struct mmp_clk_factor_masks *masks = factor->masks;
        unsigned int val, num, den;
+       u64 rate;
 
        val = readl_relaxed(factor->base);
 
        if (!den)
                return 0;
 
-       return (((parent_rate / 10000)  * den) /
-                       (num * factor->masks->factor)) * 10000;
+       rate = parent_rate;
+       rate *= den;
+       do_div(rate, num * factor->masks->factor);
+
+       return rate;
 }
 
 /* Configures new clock rate*/
        struct mmp_clk_factor_masks *masks = factor->masks;
        int i;
        unsigned long val;
-       unsigned long rate = 0;
        unsigned long flags = 0;
+       u64 rate = 0;
 
        for (i = 0; i < factor->ftbl_cnt; i++) {
-               rate = (((prate / 10000) * factor->ftbl[i].den) /
-                       (factor->ftbl[i].num * factor->masks->factor)) * 10000;
+               rate = prate;
+               rate *= factor->ftbl[i].den;
+               do_div(rate, factor->ftbl[i].num * factor->masks->factor);
+
                if (rate > drate)
                        break;
        }