diff options
author | Mike Turquette <mturquette@linaro.org> | 2014-09-30 02:38:59 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-09-30 02:38:59 -0400 |
commit | 82de1bc86c493ad832db270635fbf4e8c237f02f (patch) | |
tree | f70562cf3ae0a777ff55da734466627e2ab2478c | |
parent | 6e18ff26c2b529de06207caa2be9e5f1cf520972 (diff) | |
parent | 04ed831f224d4553682f48e1b4a6b68f2622b68e (diff) |
Merge branch 'for-v3.18/ti-clk-driver' of github.com:t-kristo/linux-pm into clk-next
-rw-r--r-- | arch/arm/mach-omap2/io.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 2 | ||||
-rw-r--r-- | drivers/clk/ti/clk-dra7-atl.c | 2 | ||||
-rw-r--r-- | drivers/clk/ti/clk.c | 68 | ||||
-rw-r--r-- | drivers/clk/ti/clockdomain.c | 5 | ||||
-rw-r--r-- | drivers/clk/ti/divider.c | 4 | ||||
-rw-r--r-- | include/linux/clk/ti.h | 1 |
7 files changed, 63 insertions, 31 deletions
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 5d0667c119f6..a1b82a994842 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -734,8 +734,16 @@ int __init omap_clk_init(void) | |||
734 | ti_clk_init_features(); | 734 | ti_clk_init_features(); |
735 | 735 | ||
736 | ret = of_prcm_init(); | 736 | ret = of_prcm_init(); |
737 | if (!ret) | 737 | if (ret) |
738 | ret = omap_clk_soc_init(); | 738 | return ret; |
739 | |||
740 | of_clk_init(NULL); | ||
741 | |||
742 | ti_dt_clk_init_retry_clks(); | ||
743 | |||
744 | ti_dt_clockdomains_setup(); | ||
745 | |||
746 | ret = omap_clk_soc_init(); | ||
739 | 747 | ||
740 | return ret; | 748 | return ret; |
741 | } | 749 | } |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 76ca320f007c..3b890807f5e6 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -525,8 +525,6 @@ int __init of_prcm_init(void) | |||
525 | memmap_index++; | 525 | memmap_index++; |
526 | } | 526 | } |
527 | 527 | ||
528 | ti_dt_clockdomains_setup(); | ||
529 | |||
530 | return 0; | 528 | return 0; |
531 | } | 529 | } |
532 | 530 | ||
diff --git a/drivers/clk/ti/clk-dra7-atl.c b/drivers/clk/ti/clk-dra7-atl.c index 990e1d9edc01..59bb4b39d12e 100644 --- a/drivers/clk/ti/clk-dra7-atl.c +++ b/drivers/clk/ti/clk-dra7-atl.c | |||
@@ -203,6 +203,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) | |||
203 | 203 | ||
204 | if (!IS_ERR(clk)) { | 204 | if (!IS_ERR(clk)) { |
205 | of_clk_add_provider(node, of_clk_src_simple_get, clk); | 205 | of_clk_add_provider(node, of_clk_src_simple_get, clk); |
206 | kfree(parent_names); | ||
206 | return; | 207 | return; |
207 | } | 208 | } |
208 | cleanup: | 209 | cleanup: |
@@ -228,6 +229,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) | |||
228 | cinfo->iobase = of_iomap(node, 0); | 229 | cinfo->iobase = of_iomap(node, 0); |
229 | cinfo->dev = &pdev->dev; | 230 | cinfo->dev = &pdev->dev; |
230 | pm_runtime_enable(cinfo->dev); | 231 | pm_runtime_enable(cinfo->dev); |
232 | pm_runtime_irq_safe(cinfo->dev); | ||
231 | 233 | ||
232 | pm_runtime_get_sync(cinfo->dev); | 234 | pm_runtime_get_sync(cinfo->dev); |
233 | atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX); | 235 | atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX); |
diff --git a/drivers/clk/ti/clk.c b/drivers/clk/ti/clk.c index b1a6f7144f3f..337abe5909e1 100644 --- a/drivers/clk/ti/clk.c +++ b/drivers/clk/ti/clk.c | |||
@@ -25,8 +25,8 @@ | |||
25 | #undef pr_fmt | 25 | #undef pr_fmt |
26 | #define pr_fmt(fmt) "%s: " fmt, __func__ | 26 | #define pr_fmt(fmt) "%s: " fmt, __func__ |
27 | 27 | ||
28 | static int ti_dt_clk_memmap_index; | ||
29 | struct ti_clk_ll_ops *ti_clk_ll_ops; | 28 | struct ti_clk_ll_ops *ti_clk_ll_ops; |
29 | static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS]; | ||
30 | 30 | ||
31 | /** | 31 | /** |
32 | * ti_dt_clocks_register - register DT alias clocks during boot | 32 | * ti_dt_clocks_register - register DT alias clocks during boot |
@@ -108,9 +108,21 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
108 | struct clk_omap_reg *reg; | 108 | struct clk_omap_reg *reg; |
109 | u32 val; | 109 | u32 val; |
110 | u32 tmp; | 110 | u32 tmp; |
111 | int i; | ||
111 | 112 | ||
112 | reg = (struct clk_omap_reg *)&tmp; | 113 | reg = (struct clk_omap_reg *)&tmp; |
113 | reg->index = ti_dt_clk_memmap_index; | 114 | |
115 | for (i = 0; i < CLK_MAX_MEMMAPS; i++) { | ||
116 | if (clocks_node_ptr[i] == node->parent) | ||
117 | break; | ||
118 | } | ||
119 | |||
120 | if (i == CLK_MAX_MEMMAPS) { | ||
121 | pr_err("clk-provider not found for %s!\n", node->name); | ||
122 | return NULL; | ||
123 | } | ||
124 | |||
125 | reg->index = i; | ||
114 | 126 | ||
115 | if (of_property_read_u32_index(node, "reg", index, &val)) { | 127 | if (of_property_read_u32_index(node, "reg", index, &val)) { |
116 | pr_err("%s must have reg[%d]!\n", node->name, index); | 128 | pr_err("%s must have reg[%d]!\n", node->name, index); |
@@ -127,20 +139,14 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
127 | * @parent: master node | 139 | * @parent: master node |
128 | * @index: internal index for clk_reg_ops | 140 | * @index: internal index for clk_reg_ops |
129 | * | 141 | * |
130 | * Initializes a master clock IP block and its child clock nodes. | 142 | * Initializes a master clock IP block. This basically sets up the |
131 | * Regmap is provided for accessing the register space for the | 143 | * mapping from clocks node to the memory map index. All the clocks |
132 | * IP block and all the clocks under it. | 144 | * are then initialized through the common of_clk_init call, and the |
145 | * clocks will access their memory maps based on the node layout. | ||
133 | */ | 146 | */ |
134 | void ti_dt_clk_init_provider(struct device_node *parent, int index) | 147 | void ti_dt_clk_init_provider(struct device_node *parent, int index) |
135 | { | 148 | { |
136 | const struct of_device_id *match; | ||
137 | struct device_node *np; | ||
138 | struct device_node *clocks; | 149 | struct device_node *clocks; |
139 | of_clk_init_cb_t clk_init_cb; | ||
140 | struct clk_init_item *retry; | ||
141 | struct clk_init_item *tmp; | ||
142 | |||
143 | ti_dt_clk_memmap_index = index; | ||
144 | 150 | ||
145 | /* get clocks for this parent */ | 151 | /* get clocks for this parent */ |
146 | clocks = of_get_child_by_name(parent, "clocks"); | 152 | clocks = of_get_child_by_name(parent, "clocks"); |
@@ -149,19 +155,31 @@ void ti_dt_clk_init_provider(struct device_node *parent, int index) | |||
149 | return; | 155 | return; |
150 | } | 156 | } |
151 | 157 | ||
152 | for_each_child_of_node(clocks, np) { | 158 | /* add clocks node info */ |
153 | match = of_match_node(&__clk_of_table, np); | 159 | clocks_node_ptr[index] = clocks; |
154 | if (!match) | 160 | } |
155 | continue; | ||
156 | clk_init_cb = (of_clk_init_cb_t)match->data; | ||
157 | pr_debug("%s: initializing: %s\n", __func__, np->name); | ||
158 | clk_init_cb(np); | ||
159 | } | ||
160 | 161 | ||
161 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | 162 | /** |
162 | pr_debug("retry-init: %s\n", retry->node->name); | 163 | * ti_dt_clk_init_retry_clks - init clocks from the retry list |
163 | retry->func(retry->hw, retry->node); | 164 | * |
164 | list_del(&retry->link); | 165 | * Initializes any clocks that have failed to initialize before, |
165 | kfree(retry); | 166 | * reasons being missing parent node(s) during earlier init. This |
167 | * typically happens only for DPLLs which need to have both of their | ||
168 | * parent clocks ready during init. | ||
169 | */ | ||
170 | void ti_dt_clk_init_retry_clks(void) | ||
171 | { | ||
172 | struct clk_init_item *retry; | ||
173 | struct clk_init_item *tmp; | ||
174 | int retries = 5; | ||
175 | |||
176 | while (!list_empty(&retry_list) && retries) { | ||
177 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | ||
178 | pr_debug("retry-init: %s\n", retry->node->name); | ||
179 | retry->func(retry->hw, retry->node); | ||
180 | list_del(&retry->link); | ||
181 | kfree(retry); | ||
182 | } | ||
183 | retries--; | ||
166 | } | 184 | } |
167 | } | 185 | } |
diff --git a/drivers/clk/ti/clockdomain.c b/drivers/clk/ti/clockdomain.c index f1e0038d76ac..b4c5faccaece 100644 --- a/drivers/clk/ti/clockdomain.c +++ b/drivers/clk/ti/clockdomain.c | |||
@@ -36,6 +36,11 @@ static void __init of_ti_clockdomain_setup(struct device_node *node) | |||
36 | 36 | ||
37 | for (i = 0; i < num_clks; i++) { | 37 | for (i = 0; i < num_clks; i++) { |
38 | clk = of_clk_get(node, i); | 38 | clk = of_clk_get(node, i); |
39 | if (IS_ERR(clk)) { | ||
40 | pr_err("%s: Failed get %s' clock nr %d (%ld)\n", | ||
41 | __func__, node->full_name, i, PTR_ERR(clk)); | ||
42 | continue; | ||
43 | } | ||
39 | if (__clk_get_flags(clk) & CLK_IS_BASIC) { | 44 | if (__clk_get_flags(clk) & CLK_IS_BASIC) { |
40 | pr_warn("can't setup clkdm for basic clk %s\n", | 45 | pr_warn("can't setup clkdm for basic clk %s\n", |
41 | __clk_get_name(clk)); | 46 | __clk_get_name(clk)); |
diff --git a/drivers/clk/ti/divider.c b/drivers/clk/ti/divider.c index a837f703be65..bff2b5b8ff59 100644 --- a/drivers/clk/ti/divider.c +++ b/drivers/clk/ti/divider.c | |||
@@ -300,8 +300,8 @@ static struct clk *_register_divider(struct device *dev, const char *name, | |||
300 | return clk; | 300 | return clk; |
301 | } | 301 | } |
302 | 302 | ||
303 | static struct clk_div_table | 303 | static struct clk_div_table * |
304 | __init *ti_clk_get_div_table(struct device_node *node) | 304 | __init ti_clk_get_div_table(struct device_node *node) |
305 | { | 305 | { |
306 | struct clk_div_table *table; | 306 | struct clk_div_table *table; |
307 | const __be32 *divspec; | 307 | const __be32 *divspec; |
diff --git a/include/linux/clk/ti.h b/include/linux/clk/ti.h index e8d8a35034a5..f75acbf70e96 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_clks(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); |