aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Medve <Emilian.Medve@Freescale.com>2015-01-21 05:03:31 -0500
committerMichael Turquette <mturquette@linaro.org>2015-02-18 12:56:43 -0500
commita513b72cc3606f49addca31bf2322bb26e374010 (patch)
tree7cb4a37595dc01f92eb97b07ce2821455dc57903
parent8f0ab1e14139d86f63eff330db1f4389e1fbd851 (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.c83
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
275static 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
349return_clk_unregister:
350 while (--i >= 0)
351 clk_unregister(cod->clks[i]);
352 kfree(cod);
353}
354
274CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init); 355CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init);
275CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init); 356CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init);
276CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init); 357CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init);
277CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init); 358CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init);
278CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init); 359CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init);
279CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init); 360CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init);
361CLK_OF_DECLARE(qoriq_pltfrm_pll_1, "fsl,qoriq-platform-pll-1.0", pltfrm_pll_init);
362CLK_OF_DECLARE(qoriq_pltfrm_pll_2, "fsl,qoriq-platform-pll-2.0", pltfrm_pll_init);