These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / clk / sunxi / clk-factors.c
index 8c20190..59428db 100644 (file)
@@ -79,41 +79,42 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate,
        return rate;
 }
 
-static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
-                                      unsigned long min_rate,
-                                      unsigned long max_rate,
-                                      unsigned long *best_parent_rate,
-                                      struct clk_hw **best_parent_p)
+static int clk_factors_determine_rate(struct clk_hw *hw,
+                                     struct clk_rate_request *req)
 {
-       struct clk *clk = hw->clk, *parent, *best_parent = NULL;
+       struct clk_hw *parent, *best_parent = NULL;
        int i, num_parents;
        unsigned long parent_rate, best = 0, child_rate, best_child_rate = 0;
 
        /* find the parent that can help provide the fastest rate <= rate */
-       num_parents = __clk_get_num_parents(clk);
+       num_parents = clk_hw_get_num_parents(hw);
        for (i = 0; i < num_parents; i++) {
-               parent = clk_get_parent_by_index(clk, i);
+               parent = clk_hw_get_parent_by_index(hw, i);
                if (!parent)
                        continue;
-               if (__clk_get_flags(clk) & CLK_SET_RATE_PARENT)
-                       parent_rate = __clk_round_rate(parent, rate);
+               if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)
+                       parent_rate = clk_hw_round_rate(parent, req->rate);
                else
-                       parent_rate = __clk_get_rate(parent);
+                       parent_rate = clk_hw_get_rate(parent);
 
-               child_rate = clk_factors_round_rate(hw, rate, &parent_rate);
+               child_rate = clk_factors_round_rate(hw, req->rate,
+                                                   &parent_rate);
 
-               if (child_rate <= rate && child_rate > best_child_rate) {
+               if (child_rate <= req->rate && child_rate > best_child_rate) {
                        best_parent = parent;
                        best = parent_rate;
                        best_child_rate = child_rate;
                }
        }
 
-       if (best_parent)
-               *best_parent_p = __clk_get_hw(best_parent);
-       *best_parent_rate = best;
+       if (!best_parent)
+               return -EINVAL;
 
-       return best_child_rate;
+       req->best_parent_hw = best_parent;
+       req->best_parent_rate = best;
+       req->rate = best_child_rate;
+
+       return 0;
 }
 
 static int clk_factors_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -174,9 +175,7 @@ struct clk *sunxi_factors_register(struct device_node *node,
        int i = 0;
 
        /* if we have a mux, we will have >1 parents */
-       while (i < FACTORS_MAX_PARENTS &&
-              (parents[i] = of_clk_get_parent_name(node, i)) != NULL)
-               i++;
+       i = of_clk_parent_fill(node, parents, FACTORS_MAX_PARENTS);
 
        /*
         * some factor clocks, such as pll5 and pll6, may have multiple