if (divider->flags & CLK_DIVIDER_ONE_BASED)
                maxdiv--;
 
-       if (!best_parent_rate) {
-               parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
+       if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) {
+               parent_rate = *best_parent_rate;
                bestdiv = DIV_ROUND_UP(parent_rate, rate);
                bestdiv = bestdiv == 0 ? 1 : bestdiv;
                bestdiv = bestdiv > maxdiv ? maxdiv : bestdiv;
        int div;
        div = clk_divider_bestdiv(hw, rate, prate);
 
-       if (prate)
-               return *prate / div;
-       else {
-               unsigned long r;
-               r = __clk_get_rate(__clk_get_parent(hw->clk));
-               return r / div;
-       }
+       return *prate / div;
 }
 
 static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate)
 
  */
 unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
 {
-       unsigned long unused;
+       unsigned long parent_rate = 0;
 
        if (!clk)
                return -EINVAL;
        if (!clk->ops->round_rate)
                return clk->rate;
 
-       if (clk->flags & CLK_SET_RATE_PARENT)
-               return clk->ops->round_rate(clk->hw, rate, &unused);
-       else
-               return clk->ops->round_rate(clk->hw, rate, NULL);
+       if (clk->parent)
+               parent_rate = clk->parent->rate;
+
+       return clk->ops->round_rate(clk->hw, rate, &parent_rate);
 }
 
 /**
 static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
 {
        struct clk *top = clk;
-       unsigned long best_parent_rate;
+       unsigned long best_parent_rate = 0;
        unsigned long new_rate;
 
        /* sanity */
                if (!clk->ops->round_rate) {
                        clk->new_rate = clk->rate;
                        return NULL;
-               } else {
-                       new_rate = clk->ops->round_rate(clk->hw, rate, NULL);
-                       goto out;
                }
        }
 
                goto out;
        }
 
+       best_parent_rate = clk->parent->rate;
        new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate);
 
        if (best_parent_rate != clk->parent->rate) {