diff options
author | Lee Jones <lee.jones@linaro.org> | 2013-09-17 05:33:05 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2013-09-26 05:05:49 -0400 |
commit | 89da2dfafc9ffc79067e196053431d957c77db45 (patch) | |
tree | 5b5cd8ed6ec96c4f02b63ffbdfc765698215e9aa | |
parent | 2d0803001f0736c22ef6c05d8ae683166059f0bf (diff) |
clk: ux500: Add Device Tree support for the PRCC Kernel clock
This patch enables clocks to be specified from Device Tree via phandles
to the "prcc-kernel-clock" node.
Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | drivers/clk/ux500/u8500_of_clk.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/clk/ux500/u8500_of_clk.c b/drivers/clk/ux500/u8500_of_clk.c index dcc736afde77..4fcafd007656 100644 --- a/drivers/clk/ux500/u8500_of_clk.c +++ b/drivers/clk/ux500/u8500_of_clk.c | |||
@@ -20,11 +20,14 @@ | |||
20 | 20 | ||
21 | static struct clk *prcmu_clk[PRCMU_NUM_CLKS]; | 21 | static struct clk *prcmu_clk[PRCMU_NUM_CLKS]; |
22 | static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; | 22 | static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; |
23 | static struct clk *prcc_kclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; | ||
23 | 24 | ||
24 | #define PRCC_SHOW(clk, base, bit) \ | 25 | #define PRCC_SHOW(clk, base, bit) \ |
25 | clk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] | 26 | clk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] |
26 | #define PRCC_PCLK_STORE(clk, base, bit) \ | 27 | #define PRCC_PCLK_STORE(clk, base, bit) \ |
27 | prcc_pclk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] = clk | 28 | prcc_pclk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] = clk |
29 | #define PRCC_KCLK_STORE(clk, base, bit) \ | ||
30 | prcc_kclk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] = clk | ||
28 | 31 | ||
29 | struct clk *ux500_twocell_get(struct of_phandle_args *clkspec, void *data) | 32 | struct clk *ux500_twocell_get(struct of_phandle_args *clkspec, void *data) |
30 | { | 33 | { |
@@ -428,83 +431,109 @@ void u8500_of_clk_init(u32 clkrst1_base, u32 clkrst2_base, u32 clkrst3_base, | |||
428 | /* Periph1 */ | 431 | /* Periph1 */ |
429 | clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk", | 432 | clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk", |
430 | clkrst1_base, BIT(0), CLK_SET_RATE_GATE); | 433 | clkrst1_base, BIT(0), CLK_SET_RATE_GATE); |
434 | PRCC_KCLK_STORE(clk, 1, 0); | ||
431 | 435 | ||
432 | clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk", | 436 | clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk", |
433 | clkrst1_base, BIT(1), CLK_SET_RATE_GATE); | 437 | clkrst1_base, BIT(1), CLK_SET_RATE_GATE); |
438 | PRCC_KCLK_STORE(clk, 1, 1); | ||
434 | 439 | ||
435 | clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", | 440 | clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", |
436 | clkrst1_base, BIT(2), CLK_SET_RATE_GATE); | 441 | clkrst1_base, BIT(2), CLK_SET_RATE_GATE); |
442 | PRCC_KCLK_STORE(clk, 1, 2); | ||
437 | 443 | ||
438 | clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", | 444 | clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", |
439 | clkrst1_base, BIT(3), CLK_SET_RATE_GATE); | 445 | clkrst1_base, BIT(3), CLK_SET_RATE_GATE); |
446 | PRCC_KCLK_STORE(clk, 1, 3); | ||
440 | 447 | ||
441 | clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", | 448 | clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", |
442 | clkrst1_base, BIT(4), CLK_SET_RATE_GATE); | 449 | clkrst1_base, BIT(4), CLK_SET_RATE_GATE); |
450 | PRCC_KCLK_STORE(clk, 1, 4); | ||
443 | 451 | ||
444 | clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", | 452 | clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", |
445 | clkrst1_base, BIT(5), CLK_SET_RATE_GATE); | 453 | clkrst1_base, BIT(5), CLK_SET_RATE_GATE); |
454 | PRCC_KCLK_STORE(clk, 1, 5); | ||
446 | 455 | ||
447 | clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", | 456 | clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", |
448 | clkrst1_base, BIT(6), CLK_SET_RATE_GATE); | 457 | clkrst1_base, BIT(6), CLK_SET_RATE_GATE); |
458 | PRCC_KCLK_STORE(clk, 1, 6); | ||
449 | 459 | ||
450 | clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", | 460 | clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", |
451 | clkrst1_base, BIT(8), CLK_SET_RATE_GATE); | 461 | clkrst1_base, BIT(8), CLK_SET_RATE_GATE); |
462 | PRCC_KCLK_STORE(clk, 1, 8); | ||
452 | 463 | ||
453 | clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", | 464 | clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", |
454 | clkrst1_base, BIT(9), CLK_SET_RATE_GATE); | 465 | clkrst1_base, BIT(9), CLK_SET_RATE_GATE); |
466 | PRCC_KCLK_STORE(clk, 1, 9); | ||
455 | 467 | ||
456 | clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", | 468 | clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", |
457 | clkrst1_base, BIT(10), CLK_SET_RATE_GATE); | 469 | clkrst1_base, BIT(10), CLK_SET_RATE_GATE); |
470 | PRCC_KCLK_STORE(clk, 1, 10); | ||
458 | 471 | ||
459 | /* Periph2 */ | 472 | /* Periph2 */ |
460 | clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", | 473 | clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", |
461 | clkrst2_base, BIT(0), CLK_SET_RATE_GATE); | 474 | clkrst2_base, BIT(0), CLK_SET_RATE_GATE); |
475 | PRCC_KCLK_STORE(clk, 2, 0); | ||
462 | 476 | ||
463 | clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", | 477 | clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", |
464 | clkrst2_base, BIT(2), CLK_SET_RATE_GATE); | 478 | clkrst2_base, BIT(2), CLK_SET_RATE_GATE); |
479 | PRCC_KCLK_STORE(clk, 2, 2); | ||
465 | 480 | ||
466 | clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", | 481 | clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", |
467 | clkrst2_base, BIT(3), CLK_SET_RATE_GATE); | 482 | clkrst2_base, BIT(3), CLK_SET_RATE_GATE); |
483 | PRCC_KCLK_STORE(clk, 2, 3); | ||
468 | 484 | ||
469 | clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", | 485 | clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", |
470 | clkrst2_base, BIT(4), CLK_SET_RATE_GATE); | 486 | clkrst2_base, BIT(4), CLK_SET_RATE_GATE); |
487 | PRCC_KCLK_STORE(clk, 2, 4); | ||
471 | 488 | ||
472 | clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk", | 489 | clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk", |
473 | clkrst2_base, BIT(5), CLK_SET_RATE_GATE); | 490 | clkrst2_base, BIT(5), CLK_SET_RATE_GATE); |
491 | PRCC_KCLK_STORE(clk, 2, 5); | ||
474 | 492 | ||
475 | /* Note that rate is received from parent. */ | 493 | /* Note that rate is received from parent. */ |
476 | clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk", | 494 | clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk", |
477 | clkrst2_base, BIT(6), | 495 | clkrst2_base, BIT(6), |
478 | CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); | 496 | CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); |
497 | PRCC_KCLK_STORE(clk, 2, 6); | ||
498 | |||
479 | clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk", | 499 | clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk", |
480 | clkrst2_base, BIT(7), | 500 | clkrst2_base, BIT(7), |
481 | CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); | 501 | CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); |
502 | PRCC_KCLK_STORE(clk, 2, 7); | ||
482 | 503 | ||
483 | /* Periph3 */ | 504 | /* Periph3 */ |
484 | clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", | 505 | clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", |
485 | clkrst3_base, BIT(1), CLK_SET_RATE_GATE); | 506 | clkrst3_base, BIT(1), CLK_SET_RATE_GATE); |
507 | PRCC_KCLK_STORE(clk, 3, 1); | ||
486 | 508 | ||
487 | clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", | 509 | clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", |
488 | clkrst3_base, BIT(2), CLK_SET_RATE_GATE); | 510 | clkrst3_base, BIT(2), CLK_SET_RATE_GATE); |
511 | PRCC_KCLK_STORE(clk, 3, 2); | ||
489 | 512 | ||
490 | clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", | 513 | clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", |
491 | clkrst3_base, BIT(3), CLK_SET_RATE_GATE); | 514 | clkrst3_base, BIT(3), CLK_SET_RATE_GATE); |
515 | PRCC_KCLK_STORE(clk, 3, 3); | ||
492 | 516 | ||
493 | clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", | 517 | clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", |
494 | clkrst3_base, BIT(4), CLK_SET_RATE_GATE); | 518 | clkrst3_base, BIT(4), CLK_SET_RATE_GATE); |
519 | PRCC_KCLK_STORE(clk, 3, 4); | ||
495 | 520 | ||
496 | clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k", | 521 | clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k", |
497 | clkrst3_base, BIT(5), CLK_SET_RATE_GATE); | 522 | clkrst3_base, BIT(5), CLK_SET_RATE_GATE); |
523 | PRCC_KCLK_STORE(clk, 3, 5); | ||
498 | 524 | ||
499 | clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk", | 525 | clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk", |
500 | clkrst3_base, BIT(6), CLK_SET_RATE_GATE); | 526 | clkrst3_base, BIT(6), CLK_SET_RATE_GATE); |
527 | PRCC_KCLK_STORE(clk, 3, 6); | ||
501 | 528 | ||
502 | clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk", | 529 | clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk", |
503 | clkrst3_base, BIT(7), CLK_SET_RATE_GATE); | 530 | clkrst3_base, BIT(7), CLK_SET_RATE_GATE); |
531 | PRCC_KCLK_STORE(clk, 3, 7); | ||
504 | 532 | ||
505 | /* Periph6 */ | 533 | /* Periph6 */ |
506 | clk = clk_reg_prcc_kclk("p3_rng_kclk", "rngclk", | 534 | clk = clk_reg_prcc_kclk("p3_rng_kclk", "rngclk", |
507 | clkrst6_base, BIT(0), CLK_SET_RATE_GATE); | 535 | clkrst6_base, BIT(0), CLK_SET_RATE_GATE); |
536 | PRCC_KCLK_STORE(clk, 6, 0); | ||
508 | 537 | ||
509 | for_each_child_of_node(np, child) { | 538 | for_each_child_of_node(np, child) { |
510 | static struct clk_onecell_data clk_data; | 539 | static struct clk_onecell_data clk_data; |
@@ -516,5 +545,8 @@ void u8500_of_clk_init(u32 clkrst1_base, u32 clkrst2_base, u32 clkrst3_base, | |||
516 | } | 545 | } |
517 | if (!of_node_cmp(child->name, "prcc-periph-clock")) | 546 | if (!of_node_cmp(child->name, "prcc-periph-clock")) |
518 | of_clk_add_provider(child, ux500_twocell_get, prcc_pclk); | 547 | of_clk_add_provider(child, ux500_twocell_get, prcc_pclk); |
548 | |||
549 | if (!of_node_cmp(child->name, "prcc-kernel-clock")) | ||
550 | of_clk_add_provider(child, ux500_twocell_get, prcc_kclk); | ||
519 | } | 551 | } |
520 | } | 552 | } |