aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/cpu/sh4a/clock-sh7722.c
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2009-06-10 07:31:16 -0400
committerPaul Mundt <lethal@linux-sh.org>2009-06-11 02:14:28 -0400
commitb621370a3505f8bd42acc41736cae47d5ce8bd06 (patch)
treecca005efbb85ba3f77bf5e34f828d22ae67a1439 /arch/sh/kernel/cpu/sh4a/clock-sh7722.c
parentc521dc02034df3681394a30b428bf081cfa22253 (diff)
sh: sh7724 clock framework rewrite V3
This patch contains V3 of the sh7724 clock framework rewrite. The new code makes use of the recently merged div4, div6 and mstp32 helper code. Both extal and fll are supported as input clocks to the pll. The div6 clocks are fed through a divide-by-3 block. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-sh7722.c')
-rw-r--r--arch/sh/kernel/cpu/sh4a/clock-sh7722.c85
1 files changed, 5 insertions, 80 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c
index ccefd7dde78c..5e08504da3a6 100644
--- a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c
+++ b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c
@@ -130,11 +130,7 @@ static void adjust_clocks(int originate, int *l, unsigned long v[],
130 * is quite simple.. 130 * is quite simple..
131 */ 131 */
132 132
133#if defined(CONFIG_CPU_SUBTYPE_SH7724)
134#define STCPLL(frqcr) ((((frqcr >> 24) & 0x3f) + 1) * 2)
135#else
136#define STCPLL(frqcr) (((frqcr >> 24) & 0x1f) + 1) 133#define STCPLL(frqcr) (((frqcr >> 24) & 0x1f) + 1)
137#endif
138 134
139/* 135/*
140 * Instead of having two separate multipliers/divisors set, like this: 136 * Instead of having two separate multipliers/divisors set, like this:
@@ -145,11 +141,7 @@ static void adjust_clocks(int originate, int *l, unsigned long v[],
145 * I created the divisors2 array, which is used to calculate rate like 141 * I created the divisors2 array, which is used to calculate rate like
146 * rate = parent * 2 / divisors2[ divisor ]; 142 * rate = parent * 2 / divisors2[ divisor ];
147*/ 143*/
148#if defined(CONFIG_CPU_SUBTYPE_SH7724)
149static int divisors2[] = { 4, 1, 8, 12, 16, 24, 32, 1, 48, 64, 72, 96, 1, 144 };
150#else
151static int divisors2[] = { 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40 }; 144static int divisors2[] = { 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40 };
152#endif
153 145
154static unsigned long master_clk_recalc(struct clk *clk) 146static unsigned long master_clk_recalc(struct clk *clk)
155{ 147{
@@ -171,17 +163,10 @@ static unsigned long module_clk_recalc(struct clk *clk)
171 return clk->parent->rate / STCPLL(frqcr); 163 return clk->parent->rate / STCPLL(frqcr);
172} 164}
173 165
174#if defined(CONFIG_CPU_SUBTYPE_SH7724)
175#define MASTERDIVS { 12, 16, 24, 30, 32, 36, 48 }
176#define STCMASK 0x3f
177#define DIVCALC(div) (div/2-1)
178#define FRQCRKICK 0x80000000
179#else
180#define MASTERDIVS { 2, 3, 4, 6, 8, 16 } 166#define MASTERDIVS { 2, 3, 4, 6, 8, 16 }
181#define STCMASK 0x1f 167#define STCMASK 0x1f
182#define DIVCALC(div) (div-1) 168#define DIVCALC(div) (div-1)
183#define FRQCRKICK 0x00000000 169#define FRQCRKICK 0x00000000
184#endif
185 170
186static int master_clk_setrate(struct clk *clk, unsigned long rate, int id) 171static int master_clk_setrate(struct clk *clk, unsigned long rate, int id)
187{ 172{
@@ -557,8 +542,7 @@ static struct clk sh7722_r_clock = {
557 .rate = 32768, 542 .rate = 32768,
558}; 543};
559 544
560#if !defined(CONFIG_CPU_SUBTYPE_SH7343) &&\ 545#if !defined(CONFIG_CPU_SUBTYPE_SH7343)
561 !defined(CONFIG_CPU_SUBTYPE_SH7724)
562/* 546/*
563 * these three clocks - SIU A, SIU B, IrDA - share the same clk_ops 547 * these three clocks - SIU A, SIU B, IrDA - share the same clk_ops
564 * methods of clk_ops determine which register they should access by 548 * methods of clk_ops determine which register they should access by
@@ -575,10 +559,9 @@ static struct clk sh7722_siu_b_clock = {
575 .arch_flags = SCLKBCR, 559 .arch_flags = SCLKBCR,
576 .ops = &sh7722_siu_clk_ops, 560 .ops = &sh7722_siu_clk_ops,
577}; 561};
578#endif /* CONFIG_CPU_SUBTYPE_SH7343, SH7724 */ 562#endif /* CONFIG_CPU_SUBTYPE_SH7343 */
579 563
580#if defined(CONFIG_CPU_SUBTYPE_SH7722) ||\ 564#if defined(CONFIG_CPU_SUBTYPE_SH7722)
581 defined(CONFIG_CPU_SUBTYPE_SH7724)
582static struct clk sh7722_irda_clock = { 565static struct clk sh7722_irda_clock = {
583 .name = "irda_clk", 566 .name = "irda_clk",
584 .arch_flags = IrDACLKCR, 567 .arch_flags = IrDACLKCR,
@@ -676,61 +659,6 @@ static struct clk sh7722_mstpcr_clocks[] = {
676 MSTPCR("vpu0", "bus_clk", 2, 1, CLK_ENABLE_ON_INIT), 659 MSTPCR("vpu0", "bus_clk", 2, 1, CLK_ENABLE_ON_INIT),
677 MSTPCR("lcdc0", "bus_clk", 2, 0, 0), 660 MSTPCR("lcdc0", "bus_clk", 2, 0, 0),
678#endif 661#endif
679#if defined(CONFIG_CPU_SUBTYPE_SH7724)
680 /* See Datasheet : Overview -> Block Diagram */
681 MSTPCR("tlb0", "cpu_clk", 0, 31, 0),
682 MSTPCR("ic0", "cpu_clk", 0, 30, 0),
683 MSTPCR("oc0", "cpu_clk", 0, 29, 0),
684 MSTPCR("rs0", "bus_clk", 0, 28, 0),
685 MSTPCR("ilmem0", "cpu_clk", 0, 27, 0),
686 MSTPCR("l2c0", "sh_clk", 0, 26, 0),
687 MSTPCR("fpu0", "cpu_clk", 0, 24, 0),
688 MSTPCR("intc0", "peripheral_clk", 0, 22, 0),
689 MSTPCR("dmac0", "bus_clk", 0, 21, 0),
690 MSTPCR("sh0", "sh_clk", 0, 20, 0),
691 MSTPCR("hudi0", "peripheral_clk", 0, 19, 0),
692 MSTPCR("ubc0", "cpu_clk", 0, 17, 0),
693 MSTPCR("tmu0", "peripheral_clk", 0, 15, 0),
694 MSTPCR("cmt0", "r_clk", 0, 14, 0),
695 MSTPCR("rwdt0", "r_clk", 0, 13, 0),
696 MSTPCR("dmac1", "bus_clk", 0, 12, 0),
697 MSTPCR("tmu1", "peripheral_clk", 0, 10, 0),
698 MSTPCR("scif0", "peripheral_clk", 0, 9, 0),
699 MSTPCR("scif1", "peripheral_clk", 0, 8, 0),
700 MSTPCR("scif2", "peripheral_clk", 0, 7, 0),
701 MSTPCR("scif3", "bus_clk", 0, 6, 0),
702 MSTPCR("scif4", "bus_clk", 0, 5, 0),
703 MSTPCR("scif5", "bus_clk", 0, 4, 0),
704 MSTPCR("msiof0", "bus_clk", 0, 2, 0),
705 MSTPCR("msiof1", "bus_clk", 0, 1, 0),
706 MSTPCR("keysc0", "r_clk", 1, 12, 0),
707 MSTPCR("rtc0", "r_clk", 1, 11, 0),
708 MSTPCR("i2c0", "peripheral_clk", 1, 9, 0),
709 MSTPCR("i2c1", "peripheral_clk", 1, 8, 0),
710 MSTPCR("mmc0", "bus_clk", 2, 29, 0),
711 MSTPCR("eth0", "bus_clk", 2, 28, 0),
712 MSTPCR("atapi0", "bus_clk", 2, 26, 0),
713 MSTPCR("tpu0", "bus_clk", 2, 25, 0),
714 MSTPCR("irda0", "peripheral_clk", 2, 24, 0),
715 MSTPCR("tsif0", "bus_clk", 2, 22, 0),
716 MSTPCR("usb1", "bus_clk", 2, 21, 0),
717 MSTPCR("usb0", "bus_clk", 2, 20, 0),
718 MSTPCR("2dg0", "bus_clk", 2, 19, 0),
719 MSTPCR("sdhi0", "bus_clk", 2, 18, 0),
720 MSTPCR("sdhi1", "bus_clk", 2, 17, 0),
721 MSTPCR("veu1", "bus_clk", 2, 15, CLK_ENABLE_ON_INIT),
722 MSTPCR("ceu1", "bus_clk", 2, 13, 0),
723 MSTPCR("beu1", "bus_clk", 2, 12, 0),
724 MSTPCR("2ddmac0", "sh_clk", 2, 10, 0),
725 MSTPCR("spu0", "bus_clk", 2, 9, 0),
726 MSTPCR("jpu0", "bus_clk", 2, 6, 0),
727 MSTPCR("vou0", "bus_clk", 2, 5, 0),
728 MSTPCR("beu0", "bus_clk", 2, 4, 0),
729 MSTPCR("ceu0", "bus_clk", 2, 3, 0),
730 MSTPCR("veu0", "bus_clk", 2, 2, CLK_ENABLE_ON_INIT),
731 MSTPCR("vpu0", "bus_clk", 2, 1, CLK_ENABLE_ON_INIT),
732 MSTPCR("lcdc0", "bus_clk", 2, 0, 0),
733#endif
734#if defined(CONFIG_CPU_SUBTYPE_SH7343) 662#if defined(CONFIG_CPU_SUBTYPE_SH7343)
735 MSTPCR("uram0", "umem_clk", 0, 28, CLK_ENABLE_ON_INIT), 663 MSTPCR("uram0", "umem_clk", 0, 28, CLK_ENABLE_ON_INIT),
736 MSTPCR("xymem0", "bus_clk", 0, 26, CLK_ENABLE_ON_INIT), 664 MSTPCR("xymem0", "bus_clk", 0, 26, CLK_ENABLE_ON_INIT),
@@ -802,14 +730,11 @@ static struct clk *sh7722_clocks[] = {
802 &sh7722_sh_clock, 730 &sh7722_sh_clock,
803 &sh7722_peripheral_clock, 731 &sh7722_peripheral_clock,
804 &sh7722_sdram_clock, 732 &sh7722_sdram_clock,
805#if !defined(CONFIG_CPU_SUBTYPE_SH7343) &&\ 733#if !defined(CONFIG_CPU_SUBTYPE_SH7343)
806 !defined(CONFIG_CPU_SUBTYPE_SH7724)
807 &sh7722_siu_a_clock, 734 &sh7722_siu_a_clock,
808 &sh7722_siu_b_clock, 735 &sh7722_siu_b_clock,
809#endif 736#endif
810/* 7724 should support FSI clock */ 737#if defined(CONFIG_CPU_SUBTYPE_SH7722)
811#if defined(CONFIG_CPU_SUBTYPE_SH7722) || \
812 defined(CONFIG_CPU_SUBTYPE_SH7724)
813 &sh7722_irda_clock, 738 &sh7722_irda_clock,
814#endif 739#endif
815 &sh7722_video_clock, 740 &sh7722_video_clock,