diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-11-23 08:38:07 -0500 |
---|---|---|
committer | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-12-21 17:51:37 -0500 |
commit | 7c74c220e9c6d756953235e1f8e5b704569ea613 (patch) | |
tree | 4df1c4b2558b36188fa250a85a16ad581b9a04e6 /drivers/clk | |
parent | ff8bbf78e45ee3a07d28642ee6fa1f3424f1bab8 (diff) |
clk: sunxi: Give sunxi_factors_register a registers parameter
Before this commit sunxi_factors_register uses of_iomap(node, 0) to get
the clk registers. The sun6i prcm has factor clocks, for which we want to
use sunxi_factors_register, but of_iomap(node, 0) does not work for the prcm
factor clocks, because the prcm uses the mfd framework, so the registers
are not part of the dt-node, instead they are added to the platform_device,
as platform_device resources.
This commit makes getting the registers the callers duty, so that
sunxi_factors_register can be used with mfd instantiated platform device too.
While at it also add error checking to the of_iomap calls.
This commit also drops the __init function from sunxi_factors_register since
platform driver probe functions are not __init.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Diffstat (limited to 'drivers/clk')
-rw-r--r-- | drivers/clk/sunxi/clk-factors.c | 10 | ||||
-rw-r--r-- | drivers/clk/sunxi/clk-factors.h | 7 | ||||
-rw-r--r-- | drivers/clk/sunxi/clk-mod0.c | 24 | ||||
-rw-r--r-- | drivers/clk/sunxi/clk-sun8i-mbus.c | 13 | ||||
-rw-r--r-- | drivers/clk/sunxi/clk-sunxi.c | 11 |
5 files changed, 51 insertions, 14 deletions
diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c index 62e08fb58554..a9ebbd207d58 100644 --- a/drivers/clk/sunxi/clk-factors.c +++ b/drivers/clk/sunxi/clk-factors.c | |||
@@ -156,9 +156,10 @@ static const struct clk_ops clk_factors_ops = { | |||
156 | .set_rate = clk_factors_set_rate, | 156 | .set_rate = clk_factors_set_rate, |
157 | }; | 157 | }; |
158 | 158 | ||
159 | struct clk * __init sunxi_factors_register(struct device_node *node, | 159 | struct clk *sunxi_factors_register(struct device_node *node, |
160 | const struct factors_data *data, | 160 | const struct factors_data *data, |
161 | spinlock_t *lock) | 161 | spinlock_t *lock, |
162 | void __iomem *reg) | ||
162 | { | 163 | { |
163 | struct clk *clk; | 164 | struct clk *clk; |
164 | struct clk_factors *factors; | 165 | struct clk_factors *factors; |
@@ -168,11 +169,8 @@ struct clk * __init sunxi_factors_register(struct device_node *node, | |||
168 | struct clk_hw *mux_hw = NULL; | 169 | struct clk_hw *mux_hw = NULL; |
169 | const char *clk_name = node->name; | 170 | const char *clk_name = node->name; |
170 | const char *parents[FACTORS_MAX_PARENTS]; | 171 | const char *parents[FACTORS_MAX_PARENTS]; |
171 | void __iomem *reg; | ||
172 | int i = 0; | 172 | int i = 0; |
173 | 173 | ||
174 | reg = of_iomap(node, 0); | ||
175 | |||
176 | /* if we have a mux, we will have >1 parents */ | 174 | /* if we have a mux, we will have >1 parents */ |
177 | while (i < FACTORS_MAX_PARENTS && | 175 | while (i < FACTORS_MAX_PARENTS && |
178 | (parents[i] = of_clk_get_parent_name(node, i)) != NULL) | 176 | (parents[i] = of_clk_get_parent_name(node, i)) != NULL) |
diff --git a/drivers/clk/sunxi/clk-factors.h b/drivers/clk/sunxi/clk-factors.h index 912238fde132..171085ab5513 100644 --- a/drivers/clk/sunxi/clk-factors.h +++ b/drivers/clk/sunxi/clk-factors.h | |||
@@ -36,8 +36,9 @@ struct clk_factors { | |||
36 | spinlock_t *lock; | 36 | spinlock_t *lock; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | struct clk * __init sunxi_factors_register(struct device_node *node, | 39 | struct clk *sunxi_factors_register(struct device_node *node, |
40 | const struct factors_data *data, | 40 | const struct factors_data *data, |
41 | spinlock_t *lock); | 41 | spinlock_t *lock, |
42 | void __iomem *reg); | ||
42 | 43 | ||
43 | #endif | 44 | #endif |
diff --git a/drivers/clk/sunxi/clk-mod0.c b/drivers/clk/sunxi/clk-mod0.c index da0524eaee94..658d74f39451 100644 --- a/drivers/clk/sunxi/clk-mod0.c +++ b/drivers/clk/sunxi/clk-mod0.c | |||
@@ -79,7 +79,17 @@ static DEFINE_SPINLOCK(sun4i_a10_mod0_lock); | |||
79 | 79 | ||
80 | static void __init sun4i_a10_mod0_setup(struct device_node *node) | 80 | static void __init sun4i_a10_mod0_setup(struct device_node *node) |
81 | { | 81 | { |
82 | sunxi_factors_register(node, &sun4i_a10_mod0_data, &sun4i_a10_mod0_lock); | 82 | void __iomem *reg; |
83 | |||
84 | reg = of_iomap(node, 0); | ||
85 | if (!reg) { | ||
86 | pr_err("Could not get registers for mod0-clk: %s\n", | ||
87 | node->name); | ||
88 | return; | ||
89 | } | ||
90 | |||
91 | sunxi_factors_register(node, &sun4i_a10_mod0_data, | ||
92 | &sun4i_a10_mod0_lock, reg); | ||
83 | } | 93 | } |
84 | CLK_OF_DECLARE(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", sun4i_a10_mod0_setup); | 94 | CLK_OF_DECLARE(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", sun4i_a10_mod0_setup); |
85 | 95 | ||
@@ -87,7 +97,17 @@ static DEFINE_SPINLOCK(sun5i_a13_mbus_lock); | |||
87 | 97 | ||
88 | static void __init sun5i_a13_mbus_setup(struct device_node *node) | 98 | static void __init sun5i_a13_mbus_setup(struct device_node *node) |
89 | { | 99 | { |
90 | struct clk *mbus = sunxi_factors_register(node, &sun4i_a10_mod0_data, &sun5i_a13_mbus_lock); | 100 | struct clk *mbus; |
101 | void __iomem *reg; | ||
102 | |||
103 | reg = of_iomap(node, 0); | ||
104 | if (!reg) { | ||
105 | pr_err("Could not get registers for a13-mbus-clk\n"); | ||
106 | return; | ||
107 | } | ||
108 | |||
109 | mbus = sunxi_factors_register(node, &sun4i_a10_mod0_data, | ||
110 | &sun5i_a13_mbus_lock, reg); | ||
91 | 111 | ||
92 | /* The MBUS clocks needs to be always enabled */ | 112 | /* The MBUS clocks needs to be always enabled */ |
93 | __clk_get(mbus); | 113 | __clk_get(mbus); |
diff --git a/drivers/clk/sunxi/clk-sun8i-mbus.c b/drivers/clk/sunxi/clk-sun8i-mbus.c index ef49786eefd3..14cd026064bf 100644 --- a/drivers/clk/sunxi/clk-sun8i-mbus.c +++ b/drivers/clk/sunxi/clk-sun8i-mbus.c | |||
@@ -69,8 +69,17 @@ static DEFINE_SPINLOCK(sun8i_a23_mbus_lock); | |||
69 | 69 | ||
70 | static void __init sun8i_a23_mbus_setup(struct device_node *node) | 70 | static void __init sun8i_a23_mbus_setup(struct device_node *node) |
71 | { | 71 | { |
72 | struct clk *mbus = sunxi_factors_register(node, &sun8i_a23_mbus_data, | 72 | struct clk *mbus; |
73 | &sun8i_a23_mbus_lock); | 73 | void __iomem *reg; |
74 | |||
75 | reg = of_iomap(node, 0); | ||
76 | if (!reg) { | ||
77 | pr_err("Could not get registers for a23-mbus-clk\n"); | ||
78 | return; | ||
79 | } | ||
80 | |||
81 | mbus = sunxi_factors_register(node, &sun8i_a23_mbus_data, | ||
82 | &sun8i_a23_mbus_lock, reg); | ||
74 | 83 | ||
75 | /* The MBUS clocks needs to be always enabled */ | 84 | /* The MBUS clocks needs to be always enabled */ |
76 | __clk_get(mbus); | 85 | __clk_get(mbus); |
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c index cc5eab2d0469..9ba2c5ff2aeb 100644 --- a/drivers/clk/sunxi/clk-sunxi.c +++ b/drivers/clk/sunxi/clk-sunxi.c | |||
@@ -728,7 +728,16 @@ static const struct factors_data sun7i_a20_out_data __initconst = { | |||
728 | static struct clk * __init sunxi_factors_clk_setup(struct device_node *node, | 728 | static struct clk * __init sunxi_factors_clk_setup(struct device_node *node, |
729 | const struct factors_data *data) | 729 | const struct factors_data *data) |
730 | { | 730 | { |
731 | return sunxi_factors_register(node, data, &clk_lock); | 731 | void __iomem *reg; |
732 | |||
733 | reg = of_iomap(node, 0); | ||
734 | if (!reg) { | ||
735 | pr_err("Could not get registers for factors-clk: %s\n", | ||
736 | node->name); | ||
737 | return NULL; | ||
738 | } | ||
739 | |||
740 | return sunxi_factors_register(node, data, &clk_lock, reg); | ||
732 | } | 741 | } |
733 | 742 | ||
734 | 743 | ||