diff options
Diffstat (limited to 'drivers/clk/pxa/clk-pxa.c')
-rw-r--r-- | drivers/clk/pxa/clk-pxa.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/drivers/clk/pxa/clk-pxa.c b/drivers/clk/pxa/clk-pxa.c index ef3c05389c0a..4e834753ab09 100644 --- a/drivers/clk/pxa/clk-pxa.c +++ b/drivers/clk/pxa/clk-pxa.c | |||
@@ -26,12 +26,20 @@ static struct clk_onecell_data onecell_data = { | |||
26 | .clk_num = CLK_MAX, | 26 | .clk_num = CLK_MAX, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | #define to_pxa_clk(_hw) container_of(_hw, struct pxa_clk_cken, hw) | 29 | struct pxa_clk { |
30 | struct clk_hw hw; | ||
31 | struct clk_fixed_factor lp; | ||
32 | struct clk_fixed_factor hp; | ||
33 | struct clk_gate gate; | ||
34 | bool (*is_in_low_power)(void); | ||
35 | }; | ||
36 | |||
37 | #define to_pxa_clk(_hw) container_of(_hw, struct pxa_clk, hw) | ||
30 | 38 | ||
31 | static unsigned long cken_recalc_rate(struct clk_hw *hw, | 39 | static unsigned long cken_recalc_rate(struct clk_hw *hw, |
32 | unsigned long parent_rate) | 40 | unsigned long parent_rate) |
33 | { | 41 | { |
34 | struct pxa_clk_cken *pclk = to_pxa_clk(hw); | 42 | struct pxa_clk *pclk = to_pxa_clk(hw); |
35 | struct clk_fixed_factor *fix; | 43 | struct clk_fixed_factor *fix; |
36 | 44 | ||
37 | if (!pclk->is_in_low_power || pclk->is_in_low_power()) | 45 | if (!pclk->is_in_low_power || pclk->is_in_low_power()) |
@@ -48,7 +56,7 @@ static struct clk_ops cken_rate_ops = { | |||
48 | 56 | ||
49 | static u8 cken_get_parent(struct clk_hw *hw) | 57 | static u8 cken_get_parent(struct clk_hw *hw) |
50 | { | 58 | { |
51 | struct pxa_clk_cken *pclk = to_pxa_clk(hw); | 59 | struct pxa_clk *pclk = to_pxa_clk(hw); |
52 | 60 | ||
53 | if (!pclk->is_in_low_power) | 61 | if (!pclk->is_in_low_power) |
54 | return 0; | 62 | return 0; |
@@ -69,29 +77,32 @@ void __init clkdev_pxa_register(int ckid, const char *con_id, | |||
69 | clk_register_clkdev(clk, con_id, dev_id); | 77 | clk_register_clkdev(clk, con_id, dev_id); |
70 | } | 78 | } |
71 | 79 | ||
72 | int __init clk_pxa_cken_init(struct pxa_clk_cken *clks, int nb_clks) | 80 | int __init clk_pxa_cken_init(const struct desc_clk_cken *clks, int nb_clks) |
73 | { | 81 | { |
74 | int i; | 82 | int i; |
75 | struct pxa_clk_cken *pclk; | 83 | struct pxa_clk *pxa_clk; |
76 | struct clk *clk; | 84 | struct clk *clk; |
77 | 85 | ||
78 | for (i = 0; i < nb_clks; i++) { | 86 | for (i = 0; i < nb_clks; i++) { |
79 | pclk = clks + i; | 87 | pxa_clk = kzalloc(sizeof(*pxa_clk), GFP_KERNEL); |
80 | pclk->gate.lock = &lock; | 88 | pxa_clk->is_in_low_power = clks[i].is_in_low_power; |
81 | clk = clk_register_composite(NULL, pclk->name, | 89 | pxa_clk->lp = clks[i].lp; |
82 | pclk->parent_names, 2, | 90 | pxa_clk->hp = clks[i].hp; |
83 | &pclk->hw, &cken_mux_ops, | 91 | pxa_clk->gate = clks[i].gate; |
84 | &pclk->hw, &cken_rate_ops, | 92 | pxa_clk->gate.lock = &lock; |
85 | &pclk->gate.hw, &clk_gate_ops, | 93 | clk = clk_register_composite(NULL, clks[i].name, |
86 | pclk->flags); | 94 | clks[i].parent_names, 2, |
87 | clkdev_pxa_register(pclk->ckid, pclk->con_id, pclk->dev_id, | 95 | &pxa_clk->hw, &cken_mux_ops, |
88 | clk); | 96 | &pxa_clk->hw, &cken_rate_ops, |
97 | &pxa_clk->gate.hw, &clk_gate_ops, | ||
98 | clks[i].flags); | ||
99 | clkdev_pxa_register(clks[i].ckid, clks[i].con_id, | ||
100 | clks[i].dev_id, clk); | ||
89 | } | 101 | } |
90 | return 0; | 102 | return 0; |
91 | } | 103 | } |
92 | 104 | ||
93 | static void __init pxa_dt_clocks_init(struct device_node *np) | 105 | void __init clk_pxa_dt_common_init(struct device_node *np) |
94 | { | 106 | { |
95 | of_clk_add_provider(np, of_clk_src_onecell_get, &onecell_data); | 107 | of_clk_add_provider(np, of_clk_src_onecell_get, &onecell_data); |
96 | } | 108 | } |
97 | CLK_OF_DECLARE(pxa_clks, "marvell,pxa-clocks", pxa_dt_clocks_init); | ||