diff options
| author | Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | 2014-01-25 13:19:10 -0500 |
|---|---|---|
| committer | Jason Cooper <jason@lakedaemon.net> | 2014-02-06 13:07:01 -0500 |
| commit | 58d516ae95cbf7eed44f85a01cdfad41f17b4197 (patch) | |
| tree | 6510e37f801d3af9b056e3fb761ddab29207d999 | |
| parent | 8f7fc5450b64210b08cb3daabb3473dbad197e54 (diff) | |
clk: mvebu: kirkwood: maintain clock init order
Init order of CLK_OF_DECLARE'd drivers depends on compile order.
Unfortunately, clk_of_init does not allow drivers to return errors,
e.g. -EPROBE_DEFER if parent clocks have not been registered, yet.
To avoid init order woes for MVEBU clock drivers, we take care of
proper init order ourselves. This patch joins core-clk and gating-clk
init to maintain proper init order.
Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tested-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
| -rw-r--r-- | drivers/clk/mvebu/kirkwood.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c index 2636a55f29f9..ddb666a86500 100644 --- a/drivers/clk/mvebu/kirkwood.c +++ b/drivers/clk/mvebu/kirkwood.c | |||
| @@ -193,13 +193,6 @@ static const struct coreclk_soc_desc kirkwood_coreclks = { | |||
| 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | static void __init kirkwood_coreclk_init(struct device_node *np) | ||
| 197 | { | ||
| 198 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 199 | } | ||
| 200 | CLK_OF_DECLARE(kirkwood_core_clk, "marvell,kirkwood-core-clock", | ||
| 201 | kirkwood_coreclk_init); | ||
| 202 | |||
| 203 | static const struct coreclk_soc_desc mv88f6180_coreclks = { | 196 | static const struct coreclk_soc_desc mv88f6180_coreclks = { |
| 204 | .get_tclk_freq = kirkwood_get_tclk_freq, | 197 | .get_tclk_freq = kirkwood_get_tclk_freq, |
| 205 | .get_cpu_freq = mv88f6180_get_cpu_freq, | 198 | .get_cpu_freq = mv88f6180_get_cpu_freq, |
| @@ -208,13 +201,6 @@ static const struct coreclk_soc_desc mv88f6180_coreclks = { | |||
| 208 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 201 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 209 | }; | 202 | }; |
| 210 | 203 | ||
| 211 | static void __init mv88f6180_coreclk_init(struct device_node *np) | ||
| 212 | { | ||
| 213 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 214 | } | ||
| 215 | CLK_OF_DECLARE(mv88f6180_core_clk, "marvell,mv88f6180-core-clock", | ||
| 216 | mv88f6180_coreclk_init); | ||
| 217 | |||
| 218 | /* | 204 | /* |
| 219 | * Clock Gating Control | 205 | * Clock Gating Control |
| 220 | */ | 206 | */ |
| @@ -239,9 +225,21 @@ static const struct clk_gating_soc_desc kirkwood_gating_desc[] __initconst = { | |||
| 239 | { } | 225 | { } |
| 240 | }; | 226 | }; |
| 241 | 227 | ||
| 242 | static void __init kirkwood_clk_gating_init(struct device_node *np) | 228 | static void __init kirkwood_clk_init(struct device_node *np) |
| 243 | { | 229 | { |
| 244 | mvebu_clk_gating_setup(np, kirkwood_gating_desc); | 230 | struct device_node *cgnp = |
| 231 | of_find_compatible_node(NULL, NULL, "marvell,kirkwood-gating-clock"); | ||
| 232 | |||
| 233 | |||
| 234 | if (of_device_is_compatible(np, "marvell,mv88f6180-core-clock")) | ||
| 235 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 236 | else | ||
| 237 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 238 | |||
| 239 | if (cgnp) | ||
| 240 | mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); | ||
| 245 | } | 241 | } |
| 246 | CLK_OF_DECLARE(kirkwood_clk_gating, "marvell,kirkwood-gating-clock", | 242 | CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", |
| 247 | kirkwood_clk_gating_init); | 243 | kirkwood_clk_init); |
| 244 | CLK_OF_DECLARE(mv88f6180_clk, "marvell,mv88f6180-core-clock", | ||
| 245 | kirkwood_clk_init); | ||
