diff options
author | Tero Kristo | 2014-09-01 04:37:42 -0500 |
---|---|---|
committer | Lokesh Vutla | 2014-09-01 06:51:13 -0500 |
commit | 02a7eb06458090cc0104abd306891d05f2e49b59 (patch) | |
tree | 32e6aadd9eea99726a2b20b2d34eb858aa87c637 | |
parent | e80e55ebbf2856614f48dc060713b37dbc468ecc (diff) | |
download | kernel-video-02a7eb06458090cc0104abd306891d05f2e49b59.tar.gz kernel-video-02a7eb06458090cc0104abd306891d05f2e49b59.tar.xz kernel-video-02a7eb06458090cc0104abd306891d05f2e49b59.zip |
clk: ti: fix clk_init retry logic with generic of_clk_init use
Adding support for using generic of_clk_init caused an issue with retrying
clock init, in such way that retry init was never attempted for failed
clocks. Fixed by exporting the retry init call into its own driver API,
and calling this after of_clk_init from low level IO init.
Fixes: e80e55ebbf2856614 ("clk: ti: change clock init to use generic of_clk_init")
Reported-by: Carlos Hernandez <ceh@ti.com>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Tested-by: Sekhar Nori <nsekhar@ti.com>
-rw-r--r-- | arch/arm/mach-omap2/io.c | 2 | ||||
-rw-r--r-- | drivers/clk/ti/clk.c | 22 | ||||
-rw-r--r-- | include/linux/clk/ti.h | 1 |
3 files changed, 18 insertions, 7 deletions
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 70fabad68f6..0e0d425492e 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -736,6 +736,8 @@ int __init omap_clk_init(void) | |||
736 | 736 | ||
737 | of_clk_init(NULL); | 737 | of_clk_init(NULL); |
738 | 738 | ||
739 | ti_dt_clk_init_retry(); | ||
740 | |||
739 | ti_dt_clockdomains_setup(); | 741 | ti_dt_clockdomains_setup(); |
740 | 742 | ||
741 | ret = omap_clk_soc_init(); | 743 | ret = omap_clk_soc_init(); |
diff --git a/drivers/clk/ti/clk.c b/drivers/clk/ti/clk.c index f7201d06e5f..94e78936d95 100644 --- a/drivers/clk/ti/clk.c +++ b/drivers/clk/ti/clk.c | |||
@@ -146,8 +146,6 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
146 | void ti_dt_clk_init_provider(struct device_node *parent, int index) | 146 | void ti_dt_clk_init_provider(struct device_node *parent, int index) |
147 | { | 147 | { |
148 | struct device_node *clocks; | 148 | struct device_node *clocks; |
149 | struct clk_init_item *retry; | ||
150 | struct clk_init_item *tmp; | ||
151 | 149 | ||
152 | /* get clocks for this parent */ | 150 | /* get clocks for this parent */ |
153 | clocks = of_get_child_by_name(parent, "clocks"); | 151 | clocks = of_get_child_by_name(parent, "clocks"); |
@@ -158,11 +156,21 @@ void ti_dt_clk_init_provider(struct device_node *parent, int index) | |||
158 | 156 | ||
159 | /* add clocks node info */ | 157 | /* add clocks node info */ |
160 | clocks_node_ptr[index] = clocks; | 158 | clocks_node_ptr[index] = clocks; |
159 | } | ||
161 | 160 | ||
162 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | 161 | void ti_dt_clk_init_retry(void) |
163 | pr_debug("retry-init: %s\n", retry->node->name); | 162 | { |
164 | retry->func(retry->hw, retry->node); | 163 | struct clk_init_item *retry; |
165 | list_del(&retry->link); | 164 | struct clk_init_item *tmp; |
166 | kfree(retry); | 165 | int retries = 5; |
166 | |||
167 | while (!list_empty(&retry_list) && retries) { | ||
168 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | ||
169 | pr_debug("retry-init: %s\n", retry->node->name); | ||
170 | retry->func(retry->hw, retry->node); | ||
171 | list_del(&retry->link); | ||
172 | kfree(retry); | ||
173 | } | ||
174 | retries--; | ||
167 | } | 175 | } |
168 | } | 176 | } |
diff --git a/include/linux/clk/ti.h b/include/linux/clk/ti.h index e8d8a35034a..6001135c1ff 100644 --- a/include/linux/clk/ti.h +++ b/include/linux/clk/ti.h | |||
@@ -292,6 +292,7 @@ void omap2xxx_clkt_vps_init(void); | |||
292 | void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index); | 292 | void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index); |
293 | void ti_dt_clocks_register(struct ti_dt_clk *oclks); | 293 | void ti_dt_clocks_register(struct ti_dt_clk *oclks); |
294 | void ti_dt_clk_init_provider(struct device_node *np, int index); | 294 | void ti_dt_clk_init_provider(struct device_node *np, int index); |
295 | void ti_dt_clk_init_retry(void); | ||
295 | void ti_dt_clockdomains_setup(void); | 296 | void ti_dt_clockdomains_setup(void); |
296 | int ti_clk_retry_init(struct device_node *node, struct clk_hw *hw, | 297 | int ti_clk_retry_init(struct device_node *node, struct clk_hw *hw, |
297 | ti_of_clk_init_cb_t func); | 298 | ti_of_clk_init_cb_t func); |