aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-09-17 05:33:05 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-09-26 05:05:49 -0400
commit89da2dfafc9ffc79067e196053431d957c77db45 (patch)
tree5b5cd8ed6ec96c4f02b63ffbdfc765698215e9aa
parent2d0803001f0736c22ef6c05d8ae683166059f0bf (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.c32
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
21static struct clk *prcmu_clk[PRCMU_NUM_CLKS]; 21static struct clk *prcmu_clk[PRCMU_NUM_CLKS];
22static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; 22static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER];
23static 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
29struct clk *ux500_twocell_get(struct of_phandle_args *clkspec, void *data) 32struct 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}