upgrade 3.13 targets to 3.13.2, refresh patches
[openwrt/openwrt.git] / target / linux / sunxi / patches-3.13 / 100-clk-composite-determine-rate.patch
1 From a968e9dc5983d258a4aa7e496d58c92e9e4cf670 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <emilio@elopez.com.ar>
3 Date: Sat, 14 Sep 2013 21:37:59 -0300
4 Subject: [PATCH] clk: composite: .determine_rate support
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 This commit adds .determine_rate support to the composite clock. It will
10 use the .determine_rate callback from the rate component if available,
11 and fall back on the mux component otherwise. This allows composite
12 clocks to enjoy the benefits of automatic clock reparenting.
13
14 Signed-off-by: Emilio López <emilio@elopez.com.ar>
15 Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
16 ---
17 drivers/clk/clk-composite.c | 28 ++++++++++++++++++++++++++++
18 1 file changed, 28 insertions(+)
19
20 --- a/drivers/clk/clk-composite.c
21 +++ b/drivers/clk/clk-composite.c
22 @@ -55,6 +55,30 @@ static unsigned long clk_composite_recal
23 return rate_ops->recalc_rate(rate_hw, parent_rate);
24 }
25
26 +static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
27 + unsigned long *best_parent_rate,
28 + struct clk **best_parent_p)
29 +{
30 + struct clk_composite *composite = to_clk_composite(hw);
31 + const struct clk_ops *rate_ops = composite->rate_ops;
32 + const struct clk_ops *mux_ops = composite->mux_ops;
33 + struct clk_hw *rate_hw = composite->rate_hw;
34 + struct clk_hw *mux_hw = composite->mux_hw;
35 +
36 + if (rate_hw && rate_ops && rate_ops->determine_rate) {
37 + rate_hw->clk = hw->clk;
38 + return rate_ops->determine_rate(rate_hw, rate, best_parent_rate,
39 + best_parent_p);
40 + } else if (mux_hw && mux_ops && mux_ops->determine_rate) {
41 + mux_hw->clk = hw->clk;
42 + return mux_ops->determine_rate(rate_hw, rate, best_parent_rate,
43 + best_parent_p);
44 + } else {
45 + pr_err("clk: clk_composite_determine_rate function called, but no mux or rate callback set!\n");
46 + return 0;
47 + }
48 +}
49 +
50 static long clk_composite_round_rate(struct clk_hw *hw, unsigned long rate,
51 unsigned long *prate)
52 {
53 @@ -147,6 +171,8 @@ struct clk *clk_register_composite(struc
54 composite->mux_ops = mux_ops;
55 clk_composite_ops->get_parent = clk_composite_get_parent;
56 clk_composite_ops->set_parent = clk_composite_set_parent;
57 + if (mux_ops->determine_rate)
58 + clk_composite_ops->determine_rate = clk_composite_determine_rate;
59 }
60
61 if (rate_hw && rate_ops) {
62 @@ -170,6 +196,8 @@ struct clk *clk_register_composite(struc
63 composite->rate_hw = rate_hw;
64 composite->rate_ops = rate_ops;
65 clk_composite_ops->recalc_rate = clk_composite_recalc_rate;
66 + if (rate_ops->determine_rate)
67 + clk_composite_ops->determine_rate = clk_composite_determine_rate;
68 }
69
70 if (gate_hw && gate_ops) {