aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorVishwanath BS <vishwanath.bs@ti.com>2010-02-23 00:09:09 -0500
committerPaul Walmsley <paul@pwsan.com>2010-02-24 14:15:03 -0500
commit678bc9a2eabb7f444ef8ad1cfc5ef394e2bd8bf2 (patch)
treed9849e2d6c57dee95dd72634a86b9bf097f45c1f /arch/arm
parent358965d7bab9c70c11b64931da02667b161cb03a (diff)
OMAP3 clock: Introduce 3630 DPLL4 HSDivider changes
Divider (M2, M3, M4, M5 and M6) field width has been increased by 1 bit in 3630. This patch has changes to accommodate this in CM dynamically based on chip version. Basically new clock nodes have been added for 3630 DPLL4 M2,M3,M4,M5 and M6 and value of these nodes are used if cpu type is 3630. Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com> [paul@pwsan.com: updated to apply on 2.6.34 queue; comments added] Signed-off-by: Paul Walmsley <paul@pwsan.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-omap2/clock34xx_data.c146
-rw-r--r--arch/arm/mach-omap2/cm-regbits-34xx.h5
-rw-r--r--arch/arm/plat-omap/include/plat/clock.h5
3 files changed, 149 insertions, 7 deletions
diff --git a/arch/arm/mach-omap2/clock34xx_data.c b/arch/arm/mach-omap2/clock34xx_data.c
index 60c6140b86af..4dd5926ad980 100644
--- a/arch/arm/mach-omap2/clock34xx_data.c
+++ b/arch/arm/mach-omap2/clock34xx_data.c
@@ -237,6 +237,42 @@ static const struct clksel_rate div16_dpll_rates[] = {
237 { .div = 0 } 237 { .div = 0 }
238}; 238};
239 239
240static const struct clksel_rate div32_dpll4_rates_3630[] = {
241 { .div = 1, .val = 1, .flags = RATE_IN_36XX | DEFAULT_RATE },
242 { .div = 2, .val = 2, .flags = RATE_IN_36XX },
243 { .div = 3, .val = 3, .flags = RATE_IN_36XX },
244 { .div = 4, .val = 4, .flags = RATE_IN_36XX },
245 { .div = 5, .val = 5, .flags = RATE_IN_36XX },
246 { .div = 6, .val = 6, .flags = RATE_IN_36XX },
247 { .div = 7, .val = 7, .flags = RATE_IN_36XX },
248 { .div = 8, .val = 8, .flags = RATE_IN_36XX },
249 { .div = 9, .val = 9, .flags = RATE_IN_36XX },
250 { .div = 10, .val = 10, .flags = RATE_IN_36XX },
251 { .div = 11, .val = 11, .flags = RATE_IN_36XX },
252 { .div = 12, .val = 12, .flags = RATE_IN_36XX },
253 { .div = 13, .val = 13, .flags = RATE_IN_36XX },
254 { .div = 14, .val = 14, .flags = RATE_IN_36XX },
255 { .div = 15, .val = 15, .flags = RATE_IN_36XX },
256 { .div = 16, .val = 16, .flags = RATE_IN_36XX },
257 { .div = 17, .val = 17, .flags = RATE_IN_36XX },
258 { .div = 18, .val = 18, .flags = RATE_IN_36XX },
259 { .div = 19, .val = 19, .flags = RATE_IN_36XX },
260 { .div = 20, .val = 20, .flags = RATE_IN_36XX },
261 { .div = 21, .val = 21, .flags = RATE_IN_36XX },
262 { .div = 22, .val = 22, .flags = RATE_IN_36XX },
263 { .div = 23, .val = 23, .flags = RATE_IN_36XX },
264 { .div = 24, .val = 24, .flags = RATE_IN_36XX },
265 { .div = 25, .val = 25, .flags = RATE_IN_36XX },
266 { .div = 26, .val = 26, .flags = RATE_IN_36XX },
267 { .div = 27, .val = 27, .flags = RATE_IN_36XX },
268 { .div = 28, .val = 28, .flags = RATE_IN_36XX },
269 { .div = 29, .val = 29, .flags = RATE_IN_36XX },
270 { .div = 30, .val = 30, .flags = RATE_IN_36XX },
271 { .div = 31, .val = 31, .flags = RATE_IN_36XX },
272 { .div = 32, .val = 32, .flags = RATE_IN_36XX },
273 { .div = 0 }
274};
275
240/* DPLL1 */ 276/* DPLL1 */
241/* MPU clock source */ 277/* MPU clock source */
242/* Type: DPLL */ 278/* Type: DPLL */
@@ -606,8 +642,15 @@ static const struct clksel div16_dpll4_clksel[] = {
606 { .parent = NULL } 642 { .parent = NULL }
607}; 643};
608 644
645static const struct clksel div32_dpll4_clksel[] = {
646 { .parent = &dpll4_ck, .rates = div32_dpll4_rates_3630 },
647 { .parent = NULL }
648};
649
609/* This virtual clock is the source for dpll4_m2x2_ck */ 650/* This virtual clock is the source for dpll4_m2x2_ck */
610static struct clk dpll4_m2_ck = { 651static struct clk dpll4_m2_ck;
652
653static struct clk dpll4_m2_ck_34xx __initdata = {
611 .name = "dpll4_m2_ck", 654 .name = "dpll4_m2_ck",
612 .ops = &clkops_null, 655 .ops = &clkops_null,
613 .parent = &dpll4_ck, 656 .parent = &dpll4_ck,
@@ -619,6 +662,18 @@ static struct clk dpll4_m2_ck = {
619 .recalc = &omap2_clksel_recalc, 662 .recalc = &omap2_clksel_recalc,
620}; 663};
621 664
665static struct clk dpll4_m2_ck_3630 __initdata = {
666 .name = "dpll4_m2_ck",
667 .ops = &clkops_null,
668 .parent = &dpll4_ck,
669 .init = &omap2_init_clksel_parent,
670 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
671 .clksel_mask = OMAP3630_DIV_96M_MASK,
672 .clksel = div32_dpll4_clksel,
673 .clkdm_name = "dpll4_clkdm",
674 .recalc = &omap2_clksel_recalc,
675};
676
622/* The PWRDN bit is apparently only available on 3430ES2 and above */ 677/* The PWRDN bit is apparently only available on 3430ES2 and above */
623static struct clk dpll4_m2x2_ck = { 678static struct clk dpll4_m2x2_ck = {
624 .name = "dpll4_m2x2_ck", 679 .name = "dpll4_m2x2_ck",
@@ -679,7 +734,9 @@ static struct clk omap_96m_fck = {
679}; 734};
680 735
681/* This virtual clock is the source for dpll4_m3x2_ck */ 736/* This virtual clock is the source for dpll4_m3x2_ck */
682static struct clk dpll4_m3_ck = { 737static struct clk dpll4_m3_ck;
738
739static struct clk dpll4_m3_ck_34xx __initdata = {
683 .name = "dpll4_m3_ck", 740 .name = "dpll4_m3_ck",
684 .ops = &clkops_null, 741 .ops = &clkops_null,
685 .parent = &dpll4_ck, 742 .parent = &dpll4_ck,
@@ -691,6 +748,18 @@ static struct clk dpll4_m3_ck = {
691 .recalc = &omap2_clksel_recalc, 748 .recalc = &omap2_clksel_recalc,
692}; 749};
693 750
751static struct clk dpll4_m3_ck_3630 __initdata = {
752 .name = "dpll4_m3_ck",
753 .ops = &clkops_null,
754 .parent = &dpll4_ck,
755 .init = &omap2_init_clksel_parent,
756 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
757 .clksel_mask = OMAP3630_CLKSEL_TV_MASK,
758 .clksel = div32_dpll4_clksel,
759 .clkdm_name = "dpll4_clkdm",
760 .recalc = &omap2_clksel_recalc,
761};
762
694/* The PWRDN bit is apparently only available on 3430ES2 and above */ 763/* The PWRDN bit is apparently only available on 3430ES2 and above */
695static struct clk dpll4_m3x2_ck = { 764static struct clk dpll4_m3x2_ck = {
696 .name = "dpll4_m3x2_ck", 765 .name = "dpll4_m3x2_ck",
@@ -764,7 +833,9 @@ static struct clk omap_12m_fck = {
764}; 833};
765 834
766/* This virstual clock is the source for dpll4_m4x2_ck */ 835/* This virstual clock is the source for dpll4_m4x2_ck */
767static struct clk dpll4_m4_ck = { 836static struct clk dpll4_m4_ck;
837
838static struct clk dpll4_m4_ck_34xx __initdata = {
768 .name = "dpll4_m4_ck", 839 .name = "dpll4_m4_ck",
769 .ops = &clkops_null, 840 .ops = &clkops_null,
770 .parent = &dpll4_ck, 841 .parent = &dpll4_ck,
@@ -778,6 +849,20 @@ static struct clk dpll4_m4_ck = {
778 .round_rate = &omap2_clksel_round_rate, 849 .round_rate = &omap2_clksel_round_rate,
779}; 850};
780 851
852static struct clk dpll4_m4_ck_3630 __initdata = {
853 .name = "dpll4_m4_ck",
854 .ops = &clkops_null,
855 .parent = &dpll4_ck,
856 .init = &omap2_init_clksel_parent,
857 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
858 .clksel_mask = OMAP3630_CLKSEL_DSS1_MASK,
859 .clksel = div32_dpll4_clksel,
860 .clkdm_name = "dpll4_clkdm",
861 .recalc = &omap2_clksel_recalc,
862 .set_rate = &omap2_clksel_set_rate,
863 .round_rate = &omap2_clksel_round_rate,
864};
865
781/* The PWRDN bit is apparently only available on 3430ES2 and above */ 866/* The PWRDN bit is apparently only available on 3430ES2 and above */
782static struct clk dpll4_m4x2_ck = { 867static struct clk dpll4_m4x2_ck = {
783 .name = "dpll4_m4x2_ck", 868 .name = "dpll4_m4x2_ck",
@@ -791,7 +876,9 @@ static struct clk dpll4_m4x2_ck = {
791}; 876};
792 877
793/* This virtual clock is the source for dpll4_m5x2_ck */ 878/* This virtual clock is the source for dpll4_m5x2_ck */
794static struct clk dpll4_m5_ck = { 879static struct clk dpll4_m5_ck;
880
881static struct clk dpll4_m5_ck_34xx __initdata = {
795 .name = "dpll4_m5_ck", 882 .name = "dpll4_m5_ck",
796 .ops = &clkops_null, 883 .ops = &clkops_null,
797 .parent = &dpll4_ck, 884 .parent = &dpll4_ck,
@@ -805,6 +892,18 @@ static struct clk dpll4_m5_ck = {
805 .recalc = &omap2_clksel_recalc, 892 .recalc = &omap2_clksel_recalc,
806}; 893};
807 894
895static struct clk dpll4_m5_ck_3630 __initdata = {
896 .name = "dpll4_m5_ck",
897 .ops = &clkops_null,
898 .parent = &dpll4_ck,
899 .init = &omap2_init_clksel_parent,
900 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
901 .clksel_mask = OMAP3630_CLKSEL_CAM_MASK,
902 .clksel = div32_dpll4_clksel,
903 .clkdm_name = "dpll4_clkdm",
904 .recalc = &omap2_clksel_recalc,
905};
906
808/* The PWRDN bit is apparently only available on 3430ES2 and above */ 907/* The PWRDN bit is apparently only available on 3430ES2 and above */
809static struct clk dpll4_m5x2_ck = { 908static struct clk dpll4_m5x2_ck = {
810 .name = "dpll4_m5x2_ck", 909 .name = "dpll4_m5x2_ck",
@@ -818,7 +917,9 @@ static struct clk dpll4_m5x2_ck = {
818}; 917};
819 918
820/* This virtual clock is the source for dpll4_m6x2_ck */ 919/* This virtual clock is the source for dpll4_m6x2_ck */
821static struct clk dpll4_m6_ck = { 920static struct clk dpll4_m6_ck;
921
922static struct clk dpll4_m6_ck_34xx __initdata = {
822 .name = "dpll4_m6_ck", 923 .name = "dpll4_m6_ck",
823 .ops = &clkops_null, 924 .ops = &clkops_null,
824 .parent = &dpll4_ck, 925 .parent = &dpll4_ck,
@@ -830,6 +931,18 @@ static struct clk dpll4_m6_ck = {
830 .recalc = &omap2_clksel_recalc, 931 .recalc = &omap2_clksel_recalc,
831}; 932};
832 933
934static struct clk dpll4_m6_ck_3630 __initdata = {
935 .name = "dpll4_m6_ck",
936 .ops = &clkops_null,
937 .parent = &dpll4_ck,
938 .init = &omap2_init_clksel_parent,
939 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
940 .clksel_mask = OMAP3630_DIV_DPLL4_MASK,
941 .clksel = div32_dpll4_clksel,
942 .clkdm_name = "dpll4_clkdm",
943 .recalc = &omap2_clksel_recalc,
944};
945
833/* The PWRDN bit is apparently only available on 3430ES2 and above */ 946/* The PWRDN bit is apparently only available on 3430ES2 and above */
834static struct clk dpll4_m6x2_ck = { 947static struct clk dpll4_m6x2_ck = {
835 .name = "dpll4_m6x2_ck", 948 .name = "dpll4_m6x2_ck",
@@ -3384,6 +3497,19 @@ int __init omap3xxx_clk_init(void)
3384 } 3497 }
3385 3498
3386 if (cpu_is_omap3630()) { 3499 if (cpu_is_omap3630()) {
3500 cpu_mask |= RATE_IN_36XX;
3501 cpu_clkflg |= CK_36XX;
3502
3503 /*
3504 * XXX This type of dynamic rewriting of the clock tree is
3505 * deprecated and should be revised soon.
3506 */
3507 dpll4_m2_ck = dpll4_m2_ck_3630;
3508 dpll4_m3_ck = dpll4_m3_ck_3630;
3509 dpll4_m4_ck = dpll4_m4_ck_3630;
3510 dpll4_m5_ck = dpll4_m5_ck_3630;
3511 dpll4_m6_ck = dpll4_m6_ck_3630;
3512
3387 /* 3513 /*
3388 * For 3630: override clkops_omap2_dflt_wait for the 3514 * For 3630: override clkops_omap2_dflt_wait for the
3389 * clocks affected from PWRDN reset Limitation 3515 * clocks affected from PWRDN reset Limitation
@@ -3400,6 +3526,16 @@ int __init omap3xxx_clk_init(void)
3400 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; 3526 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3401 dpll4_m6x2_ck.ops = 3527 dpll4_m6x2_ck.ops =
3402 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; 3528 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3529 } else {
3530 /*
3531 * XXX This type of dynamic rewriting of the clock tree is
3532 * deprecated and should be revised soon.
3533 */
3534 dpll4_m2_ck = dpll4_m2_ck_34xx;
3535 dpll4_m3_ck = dpll4_m3_ck_34xx;
3536 dpll4_m4_ck = dpll4_m4_ck_34xx;
3537 dpll4_m5_ck = dpll4_m5_ck_34xx;
3538 dpll4_m6_ck = dpll4_m6_ck_34xx;
3403 } 3539 }
3404 3540
3405 if (cpu_is_omap3630()) 3541 if (cpu_is_omap3630())
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h
index 29cd13b838ca..e6a724cc63f1 100644
--- a/arch/arm/mach-omap2/cm-regbits-34xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-34xx.h
@@ -542,6 +542,7 @@
542/* CM_CLKSEL3_PLL */ 542/* CM_CLKSEL3_PLL */
543#define OMAP3430_DIV_96M_SHIFT 0 543#define OMAP3430_DIV_96M_SHIFT 0
544#define OMAP3430_DIV_96M_MASK (0x1f << 0) 544#define OMAP3430_DIV_96M_MASK (0x1f << 0)
545#define OMAP3630_DIV_96M_MASK (0x3f << 0)
545 546
546/* CM_CLKSEL4_PLL */ 547/* CM_CLKSEL4_PLL */
547#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8 548#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8
@@ -588,8 +589,10 @@
588/* CM_CLKSEL_DSS */ 589/* CM_CLKSEL_DSS */
589#define OMAP3430_CLKSEL_TV_SHIFT 8 590#define OMAP3430_CLKSEL_TV_SHIFT 8
590#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8) 591#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8)
592#define OMAP3630_CLKSEL_TV_MASK (0x3f << 8)
591#define OMAP3430_CLKSEL_DSS1_SHIFT 0 593#define OMAP3430_CLKSEL_DSS1_SHIFT 0
592#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0) 594#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0)
595#define OMAP3630_CLKSEL_DSS1_MASK (0x3f << 0)
593 596
594/* CM_SLEEPDEP_DSS specific bits */ 597/* CM_SLEEPDEP_DSS specific bits */
595 598
@@ -617,6 +620,7 @@
617/* CM_CLKSEL_CAM */ 620/* CM_CLKSEL_CAM */
618#define OMAP3430_CLKSEL_CAM_SHIFT 0 621#define OMAP3430_CLKSEL_CAM_SHIFT 0
619#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0) 622#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0)
623#define OMAP3630_CLKSEL_CAM_MASK (0x3f << 0)
620 624
621/* CM_SLEEPDEP_CAM specific bits */ 625/* CM_SLEEPDEP_CAM specific bits */
622 626
@@ -712,6 +716,7 @@
712/* CM_CLKSEL1_EMU */ 716/* CM_CLKSEL1_EMU */
713#define OMAP3430_DIV_DPLL4_SHIFT 24 717#define OMAP3430_DIV_DPLL4_SHIFT 24
714#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24) 718#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24)
719#define OMAP3630_DIV_DPLL4_MASK (0x3f << 24)
715#define OMAP3430_DIV_DPLL3_SHIFT 16 720#define OMAP3430_DIV_DPLL3_SHIFT 16
716#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16) 721#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16)
717#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11 722#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h
index f5f30c73db33..63a233490d6d 100644
--- a/arch/arm/plat-omap/include/plat/clock.h
+++ b/arch/arm/plat-omap/include/plat/clock.h
@@ -167,8 +167,9 @@ extern const struct clkops clkops_null;
167#define RATE_IN_242X (1 << 1) 167#define RATE_IN_242X (1 << 1)
168#define RATE_IN_243X (1 << 2) 168#define RATE_IN_243X (1 << 2)
169#define RATE_IN_343X (1 << 3) /* rates common to all 343X */ 169#define RATE_IN_343X (1 << 3) /* rates common to all 343X */
170#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */ 170#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */
171#define RATE_IN_4430 (1 << 5) 171#define RATE_IN_36XX (1 << 5)
172#define RATE_IN_4430 (1 << 6)
172 173
173#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X) 174#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X)
174 175