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); | ||
