aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-11-23 08:38:07 -0500
committerMaxime Ripard <maxime.ripard@free-electrons.com>2014-12-21 17:51:37 -0500
commit7c74c220e9c6d756953235e1f8e5b704569ea613 (patch)
tree4df1c4b2558b36188fa250a85a16ad581b9a04e6 /drivers/clk
parentff8bbf78e45ee3a07d28642ee6fa1f3424f1bab8 (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.c10
-rw-r--r--drivers/clk/sunxi/clk-factors.h7
-rw-r--r--drivers/clk/sunxi/clk-mod0.c24
-rw-r--r--drivers/clk/sunxi/clk-sun8i-mbus.c13
-rw-r--r--drivers/clk/sunxi/clk-sunxi.c11
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
159struct clk * __init sunxi_factors_register(struct device_node *node, 159struct 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
39struct clk * __init sunxi_factors_register(struct device_node *node, 39struct 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
80static void __init sun4i_a10_mod0_setup(struct device_node *node) 80static 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}
84CLK_OF_DECLARE(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", sun4i_a10_mod0_setup); 94CLK_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
88static void __init sun5i_a13_mbus_setup(struct device_node *node) 98static 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
70static void __init sun8i_a23_mbus_setup(struct device_node *node) 70static 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 = {
728static struct clk * __init sunxi_factors_clk_setup(struct device_node *node, 728static 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