1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- From b416520f239aeaa4207ebe84c22247cff2da444f Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <emilio@elopez.com.ar>
- Date: Thu, 5 Sep 2013 19:52:41 -0300
- Subject: [PATCH] clk: sunxi: factors: automatic reparenting support
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- This commit implements .determine_rate, so that our factor clocks can be
- reparented when needed.
- Signed-off-by: Emilio López <emilio@elopez.com.ar>
- ---
- drivers/clk/sunxi/clk-factors.c | 36 ++++++++++++++++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
- --- a/drivers/clk/sunxi/clk-factors.c
- +++ b/drivers/clk/sunxi/clk-factors.c
- @@ -77,6 +77,41 @@ static long clk_factors_round_rate(struc
- return rate;
- }
-
- +static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
- + unsigned long *best_parent_rate,
- + struct clk **best_parent_p)
- +{
- + struct clk *clk = hw->clk, *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);
- + for (i = 0; i < num_parents; i++) {
- + parent = clk_get_parent_by_index(clk, i);
- + if (!parent)
- + continue;
- + if (__clk_get_flags(clk) & CLK_SET_RATE_PARENT)
- + parent_rate = __clk_round_rate(parent, rate);
- + else
- + parent_rate = __clk_get_rate(parent);
- +
- + child_rate = clk_factors_round_rate(hw, rate, &parent_rate);
- +
- + if (child_rate <= rate && child_rate > best_child_rate) {
- + best_parent = parent;
- + best = parent_rate;
- + best_child_rate = child_rate;
- + }
- + }
- +
- + if (best_parent)
- + *best_parent_p = best_parent;
- + *best_parent_rate = best;
- +
- + return best_child_rate;
- +}
- +
- static int clk_factors_set_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long parent_rate)
- {
- @@ -113,6 +148,7 @@ static int clk_factors_set_rate(struct c
- }
-
- const struct clk_ops clk_factors_ops = {
- + .determine_rate = clk_factors_determine_rate,
- .recalc_rate = clk_factors_recalc_rate,
- .round_rate = clk_factors_round_rate,
- .set_rate = clk_factors_set_rate,
|