diff options
author | Emil Medve <Emilian.Medve@Freescale.com> | 2015-01-21 05:03:31 -0500 |
---|---|---|
committer | Michael Turquette <mturquette@linaro.org> | 2015-02-18 12:56:43 -0500 |
commit | a513b72cc3606f49addca31bf2322bb26e374010 (patch) | |
tree | 7cb4a37595dc01f92eb97b07ce2821455dc57903 | |
parent | 8f0ab1e14139d86f63eff330db1f4389e1fbd851 (diff) |
clk: qoriq: Add support for the platform PLL
Change-Id: Iac11ed95f274485a86d2c11f32a3dc502bcd020f
Signed-off-by: Emil Medve <Emilian.Medve@Freescale.com>
Acked-by: Tang Yuantian <Yuantian.Tang@freescale.com>
Signed-off-by: Michael Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/clk-qoriq.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c index 07bdfc5375ea..cda90a971e39 100644 --- a/drivers/clk/clk-qoriq.c +++ b/drivers/clk/clk-qoriq.c | |||
@@ -271,9 +271,92 @@ static void __init sysclk_init(struct device_node *node) | |||
271 | if (!IS_ERR(clk)) | 271 | if (!IS_ERR(clk)) |
272 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | 272 | of_clk_add_provider(np, of_clk_src_simple_get, clk); |
273 | } | 273 | } |
274 | |||
275 | static void __init pltfrm_pll_init(struct device_node *np) | ||
276 | { | ||
277 | void __iomem *base; | ||
278 | uint32_t mult; | ||
279 | const char *parent_name, *clk_name; | ||
280 | int i, _errno; | ||
281 | struct clk_onecell_data *cod; | ||
282 | |||
283 | base = of_iomap(np, 0); | ||
284 | if (!base) { | ||
285 | pr_err("%s(): %s: of_iomap() failed\n", __func__, np->name); | ||
286 | return; | ||
287 | } | ||
288 | |||
289 | /* Get the multiple of PLL */ | ||
290 | mult = ioread32be(base); | ||
291 | |||
292 | iounmap(base); | ||
293 | |||
294 | /* Check if this PLL is disabled */ | ||
295 | if (mult & PLL_KILL) { | ||
296 | pr_debug("%s(): %s: Disabled\n", __func__, np->name); | ||
297 | return; | ||
298 | } | ||
299 | mult = (mult & GENMASK(6, 1)) >> 1; | ||
300 | |||
301 | parent_name = of_clk_get_parent_name(np, 0); | ||
302 | if (!parent_name) { | ||
303 | pr_err("%s(): %s: of_clk_get_parent_name() failed\n", | ||
304 | __func__, np->name); | ||
305 | return; | ||
306 | } | ||
307 | |||
308 | i = of_property_count_strings(np, "clock-output-names"); | ||
309 | if (i < 0) { | ||
310 | pr_err("%s(): %s: of_property_count_strings(clock-output-names) = %d\n", | ||
311 | __func__, np->name, i); | ||
312 | return; | ||
313 | } | ||
314 | |||
315 | cod = kmalloc(sizeof(*cod) + i * sizeof(struct clk *), GFP_KERNEL); | ||
316 | if (!cod) | ||
317 | return; | ||
318 | cod->clks = (struct clk **)(cod + 1); | ||
319 | cod->clk_num = i; | ||
320 | |||
321 | for (i = 0; i < cod->clk_num; i++) { | ||
322 | _errno = of_property_read_string_index(np, "clock-output-names", | ||
323 | i, &clk_name); | ||
324 | if (_errno < 0) { | ||
325 | pr_err("%s(): %s: of_property_read_string_index(clock-output-names) = %d\n", | ||
326 | __func__, np->name, _errno); | ||
327 | goto return_clk_unregister; | ||
328 | } | ||
329 | |||
330 | cod->clks[i] = clk_register_fixed_factor(NULL, clk_name, | ||
331 | parent_name, 0, mult, 1 + i); | ||
332 | if (IS_ERR(cod->clks[i])) { | ||
333 | pr_err("%s(): %s: clk_register_fixed_factor(%s) = %ld\n", | ||
334 | __func__, np->name, | ||
335 | clk_name, PTR_ERR(cod->clks[i])); | ||
336 | goto return_clk_unregister; | ||
337 | } | ||
338 | } | ||
339 | |||
340 | _errno = of_clk_add_provider(np, of_clk_src_onecell_get, cod); | ||
341 | if (_errno < 0) { | ||
342 | pr_err("%s(): %s: of_clk_add_provider() = %d\n", | ||
343 | __func__, np->name, _errno); | ||
344 | goto return_clk_unregister; | ||
345 | } | ||
346 | |||
347 | return; | ||
348 | |||
349 | return_clk_unregister: | ||
350 | while (--i >= 0) | ||
351 | clk_unregister(cod->clks[i]); | ||
352 | kfree(cod); | ||
353 | } | ||
354 | |||
274 | CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init); | 355 | CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init); |
275 | CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init); | 356 | CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init); |
276 | CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init); | 357 | CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init); |
277 | CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init); | 358 | CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init); |
278 | CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init); | 359 | CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init); |
279 | CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init); | 360 | CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init); |
361 | CLK_OF_DECLARE(qoriq_pltfrm_pll_1, "fsl,qoriq-platform-pll-1.0", pltfrm_pll_init); | ||
362 | CLK_OF_DECLARE(qoriq_pltfrm_pll_2, "fsl,qoriq-platform-pll-2.0", pltfrm_pll_init); | ||