diff options
Diffstat (limited to 'arch/blackfin')
-rw-r--r-- | arch/blackfin/Kconfig | 45 | ||||
-rw-r--r-- | arch/blackfin/include/asm/bfin-global.h | 2 | ||||
-rw-r--r-- | arch/blackfin/kernel/setup.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf609/clock.c | 2 | ||||
-rw-r--r-- | arch/blackfin/mach-common/clocks-init.c | 153 |
5 files changed, 197 insertions, 29 deletions
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 23bae9a3f787..4e48e72291a9 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -435,7 +435,7 @@ config BFIN_KERNEL_CLOCK | |||
435 | 435 | ||
436 | config PLL_BYPASS | 436 | config PLL_BYPASS |
437 | bool "Bypass PLL" | 437 | bool "Bypass PLL" |
438 | depends on BFIN_KERNEL_CLOCK | 438 | depends on BFIN_KERNEL_CLOCK && (!BF60x) |
439 | default n | 439 | default n |
440 | 440 | ||
441 | config CLKIN_HALF | 441 | config CLKIN_HALF |
@@ -454,7 +454,7 @@ config VCO_MULT | |||
454 | default "20" if (BFIN537_STAMP || BFIN527_EZKIT || BFIN527_EZKIT_V2 || BFIN548_EZKIT || BFIN548_BLUETECHNIX_CM || BFIN538_EZKIT) | 454 | default "20" if (BFIN537_STAMP || BFIN527_EZKIT || BFIN527_EZKIT_V2 || BFIN548_EZKIT || BFIN548_BLUETECHNIX_CM || BFIN538_EZKIT) |
455 | default "22" if BFIN533_BLUETECHNIX_CM | 455 | default "22" if BFIN533_BLUETECHNIX_CM |
456 | default "20" if (BFIN537_BLUETECHNIX_CM_E || BFIN537_BLUETECHNIX_CM_U || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) | 456 | default "20" if (BFIN537_BLUETECHNIX_CM_E || BFIN537_BLUETECHNIX_CM_U || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) |
457 | default "20" if BFIN561_EZKIT | 457 | default "20" if (BFIN561_EZKIT || BF609) |
458 | default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN518F_EZBRD) | 458 | default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN518F_EZBRD) |
459 | default "25" if BFIN527_AD7160EVAL | 459 | default "25" if BFIN527_AD7160EVAL |
460 | help | 460 | help |
@@ -486,12 +486,45 @@ config SCLK_DIV | |||
486 | int "System Clock Divider" | 486 | int "System Clock Divider" |
487 | depends on BFIN_KERNEL_CLOCK | 487 | depends on BFIN_KERNEL_CLOCK |
488 | range 1 15 | 488 | range 1 15 |
489 | default 5 | 489 | default 4 |
490 | help | 490 | help |
491 | This sets the frequency of the system clock (including SDRAM or DDR). | 491 | This sets the frequency of the system clock (including SDRAM or DDR) on |
492 | !BF60x else it set the clock for system buses and provides the | ||
493 | source from which SCLK0 and SCLK1 are derived. | ||
492 | This can be between 1 and 15 | 494 | This can be between 1 and 15 |
493 | System Clock = (PLL frequency) / (this setting) | 495 | System Clock = (PLL frequency) / (this setting) |
494 | 496 | ||
497 | config SCLK0_DIV | ||
498 | int "System Clock0 Divider" | ||
499 | depends on BFIN_KERNEL_CLOCK && BF60x | ||
500 | range 1 15 | ||
501 | default 1 | ||
502 | help | ||
503 | This sets the frequency of the system clock0 for PVP and all other | ||
504 | peripherals not clocked by SCLK1. | ||
505 | This can be between 1 and 15 | ||
506 | System Clock0 = (System Clock) / (this setting) | ||
507 | |||
508 | config SCLK1_DIV | ||
509 | int "System Clock1 Divider" | ||
510 | depends on BFIN_KERNEL_CLOCK && BF60x | ||
511 | range 1 15 | ||
512 | default 1 | ||
513 | help | ||
514 | This sets the frequency of the system clock1 (including SPORT, SPI and ACM). | ||
515 | This can be between 1 and 15 | ||
516 | System Clock1 = (System Clock) / (this setting) | ||
517 | |||
518 | config DCLK_DIV | ||
519 | int "DDR Clock Divider" | ||
520 | depends on BFIN_KERNEL_CLOCK && BF60x | ||
521 | range 1 15 | ||
522 | default 2 | ||
523 | help | ||
524 | This sets the frequency of the DDR memory. | ||
525 | This can be between 1 and 15 | ||
526 | DDR Clock = (PLL frequency) / (this setting) | ||
527 | |||
495 | choice | 528 | choice |
496 | prompt "DDR SDRAM Chip Type" | 529 | prompt "DDR SDRAM Chip Type" |
497 | depends on BFIN_KERNEL_CLOCK | 530 | depends on BFIN_KERNEL_CLOCK |
@@ -507,7 +540,7 @@ endchoice | |||
507 | 540 | ||
508 | choice | 541 | choice |
509 | prompt "DDR/SDRAM Timing" | 542 | prompt "DDR/SDRAM Timing" |
510 | depends on BFIN_KERNEL_CLOCK | 543 | depends on BFIN_KERNEL_CLOCK && !BF60x |
511 | default BFIN_KERNEL_CLOCK_MEMINIT_CALC | 544 | default BFIN_KERNEL_CLOCK_MEMINIT_CALC |
512 | help | 545 | help |
513 | This option allows you to specify Blackfin SDRAM/DDR Timing parameters | 546 | This option allows you to specify Blackfin SDRAM/DDR Timing parameters |
@@ -589,6 +622,7 @@ config MAX_VCO_HZ | |||
589 | default 600000000 if BF548 | 622 | default 600000000 if BF548 |
590 | default 533333333 if BF549 | 623 | default 533333333 if BF549 |
591 | default 600000000 if BF561 | 624 | default 600000000 if BF561 |
625 | default 800000000 if BF609 | ||
592 | 626 | ||
593 | config MIN_VCO_HZ | 627 | config MIN_VCO_HZ |
594 | int | 628 | int |
@@ -596,6 +630,7 @@ config MIN_VCO_HZ | |||
596 | 630 | ||
597 | config MAX_SCLK_HZ | 631 | config MAX_SCLK_HZ |
598 | int | 632 | int |
633 | default 200000000 if BF609 | ||
599 | default 133333333 | 634 | default 133333333 |
600 | 635 | ||
601 | config MIN_SCLK_HZ | 636 | config MIN_SCLK_HZ |
diff --git a/arch/blackfin/include/asm/bfin-global.h b/arch/blackfin/include/asm/bfin-global.h index a83e922a878d..608be5e6d25c 100644 --- a/arch/blackfin/include/asm/bfin-global.h +++ b/arch/blackfin/include/asm/bfin-global.h | |||
@@ -38,7 +38,7 @@ extern unsigned long get_sclk(void); | |||
38 | #ifdef CONFIG_BF60x | 38 | #ifdef CONFIG_BF60x |
39 | extern unsigned long get_sclk0(void); | 39 | extern unsigned long get_sclk0(void); |
40 | extern unsigned long get_sclk1(void); | 40 | extern unsigned long get_sclk1(void); |
41 | extern unsigned long get_dramclk(void); | 41 | extern unsigned long get_dclk(void); |
42 | #endif | 42 | #endif |
43 | extern unsigned long sclk_to_usecs(unsigned long sclk); | 43 | extern unsigned long sclk_to_usecs(unsigned long sclk); |
44 | extern unsigned long usecs_to_sclk(unsigned long usecs); | 44 | extern unsigned long usecs_to_sclk(unsigned long usecs); |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index ed041541ea19..55fb42b50463 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -892,9 +892,6 @@ void __init setup_arch(char **cmdline_p) | |||
892 | { | 892 | { |
893 | u32 mmr; | 893 | u32 mmr; |
894 | unsigned long sclk, cclk; | 894 | unsigned long sclk, cclk; |
895 | #ifdef CONFIG_BF60x | ||
896 | struct clk *clk; | ||
897 | #endif | ||
898 | 895 | ||
899 | native_machine_early_platform_add_devices(); | 896 | native_machine_early_platform_add_devices(); |
900 | 897 | ||
@@ -959,24 +956,8 @@ void __init setup_arch(char **cmdline_p) | |||
959 | ~HYST_NONEGPIO_MASK) | HYST_NONEGPIO); | 956 | ~HYST_NONEGPIO_MASK) | HYST_NONEGPIO); |
960 | #endif | 957 | #endif |
961 | 958 | ||
962 | #ifdef CONFIG_BF60x | ||
963 | clk = clk_get(NULL, "CCLK"); | ||
964 | if (!IS_ERR(clk)) { | ||
965 | cclk = clk_get_rate(clk); | ||
966 | clk_put(clk); | ||
967 | } else | ||
968 | cclk = 0; | ||
969 | |||
970 | clk = clk_get(NULL, "SCLK0"); | ||
971 | if (!IS_ERR(clk)) { | ||
972 | sclk = clk_get_rate(clk); | ||
973 | clk_put(clk); | ||
974 | } else | ||
975 | sclk = 0; | ||
976 | #else | ||
977 | cclk = get_cclk(); | 959 | cclk = get_cclk(); |
978 | sclk = get_sclk(); | 960 | sclk = get_sclk(); |
979 | #endif | ||
980 | 961 | ||
981 | if ((ANOMALY_05000273 || ANOMALY_05000274) && (cclk >> 1) < sclk) | 962 | if ((ANOMALY_05000273 || ANOMALY_05000274) && (cclk >> 1) < sclk) |
982 | panic("ANOMALY 05000273 or 05000274: CCLK must be >= 2*SCLK"); | 963 | panic("ANOMALY 05000273 or 05000274: CCLK must be >= 2*SCLK"); |
@@ -1062,8 +1043,13 @@ void __init setup_arch(char **cmdline_p) | |||
1062 | 1043 | ||
1063 | printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); | 1044 | printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); |
1064 | 1045 | ||
1046 | #ifdef CONFIG_BF60x | ||
1047 | printk(KERN_INFO "Processor Speed: %lu MHz core clock, %lu MHz SCLk, %lu MHz SCLK0, %lu MHz SCLK1 and %lu MHz DCLK\n", | ||
1048 | cclk / 1000000, sclk / 1000000, get_sclk0() / 1000000, get_sclk1() / 1000000, get_dclk() / 1000000); | ||
1049 | #else | ||
1065 | printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", | 1050 | printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", |
1066 | cclk / 1000000, sclk / 1000000); | 1051 | cclk / 1000000, sclk / 1000000); |
1052 | #endif | ||
1067 | 1053 | ||
1068 | setup_bootmem_allocator(); | 1054 | setup_bootmem_allocator(); |
1069 | 1055 | ||
diff --git a/arch/blackfin/mach-bf609/clock.c b/arch/blackfin/mach-bf609/clock.c index b50412c8cab0..7f8f529693ae 100644 --- a/arch/blackfin/mach-bf609/clock.c +++ b/arch/blackfin/mach-bf609/clock.c | |||
@@ -351,7 +351,7 @@ static struct clk dclk = { | |||
351 | .rate = 500000000, | 351 | .rate = 500000000, |
352 | .mask = CGU0_DIV_DSEL_MASK, | 352 | .mask = CGU0_DIV_DSEL_MASK, |
353 | .shift = CGU0_DIV_DSEL_SHIFT, | 353 | .shift = CGU0_DIV_DSEL_SHIFT, |
354 | .parent = &pll_clk, | 354 | .parent = &sys_clkin, |
355 | .ops = &sys_clk_ops, | 355 | .ops = &sys_clk_ops, |
356 | }; | 356 | }; |
357 | 357 | ||
diff --git a/arch/blackfin/mach-common/clocks-init.c b/arch/blackfin/mach-common/clocks-init.c index 1e6beca8d403..7ad2407d1571 100644 --- a/arch/blackfin/mach-common/clocks-init.c +++ b/arch/blackfin/mach-common/clocks-init.c | |||
@@ -15,10 +15,121 @@ | |||
15 | #include <asm/mem_init.h> | 15 | #include <asm/mem_init.h> |
16 | #include <asm/dpmc.h> | 16 | #include <asm/dpmc.h> |
17 | 17 | ||
18 | #ifdef CONFIG_BF60x | ||
19 | #define CSEL_P 0 | ||
20 | #define S0SEL_P 5 | ||
21 | #define SYSSEL_P 8 | ||
22 | #define S1SEL_P 13 | ||
23 | #define DSEL_P 16 | ||
24 | #define OSEL_P 22 | ||
25 | #define ALGN_P 29 | ||
26 | #define UPDT_P 30 | ||
27 | #define LOCK_P 31 | ||
28 | |||
29 | #define CGU_CTL_VAL ((CONFIG_VCO_MULT << 8) | CLKIN_HALF) | ||
30 | #define CGU_DIV_VAL \ | ||
31 | ((CONFIG_CCLK_DIV << CSEL_P) | \ | ||
32 | (CONFIG_SCLK_DIV << SYSSEL_P) | \ | ||
33 | (CONFIG_SCLK0_DIV << S0SEL_P) | \ | ||
34 | (CONFIG_SCLK1_DIV << S1SEL_P) | \ | ||
35 | (CONFIG_DCLK_DIV << DSEL_P)) | ||
36 | |||
37 | #define CONFIG_BFIN_DCLK (((CONFIG_CLKIN_HZ * CONFIG_VCO_MULT) / CONFIG_DCLK_DIV) / 1000000) | ||
38 | #if ((CONFIG_BFIN_DCLK != 125) && \ | ||
39 | (CONFIG_BFIN_DCLK != 133) && (CONFIG_BFIN_DCLK != 150) && \ | ||
40 | (CONFIG_BFIN_DCLK != 166) && (CONFIG_BFIN_DCLK != 200) && \ | ||
41 | (CONFIG_BFIN_DCLK != 225) && (CONFIG_BFIN_DCLK != 250)) | ||
42 | #error "DCLK must be in (125, 133, 150, 166, 200, 225, 250)MHz" | ||
43 | #endif | ||
44 | struct ddr_config { | ||
45 | u32 ddr_clk; | ||
46 | u32 dmc_ddrctl; | ||
47 | u32 dmc_ddrcfg; | ||
48 | u32 dmc_ddrtr0; | ||
49 | u32 dmc_ddrtr1; | ||
50 | u32 dmc_ddrtr2; | ||
51 | u32 dmc_ddrmr; | ||
52 | u32 dmc_ddrmr1; | ||
53 | }; | ||
54 | |||
55 | struct ddr_config ddr_config_table[] __attribute__((section(".data_l1"))) = { | ||
56 | [0] = { | ||
57 | .ddr_clk = 125, | ||
58 | .dmc_ddrctl = 0x00000904, | ||
59 | .dmc_ddrcfg = 0x00000422, | ||
60 | .dmc_ddrtr0 = 0x20705212, | ||
61 | .dmc_ddrtr1 = 0x201003CF, | ||
62 | .dmc_ddrtr2 = 0x00320107, | ||
63 | .dmc_ddrmr = 0x00000422, | ||
64 | .dmc_ddrmr1 = 0x4, | ||
65 | }, | ||
66 | [1] = { | ||
67 | .ddr_clk = 133, | ||
68 | .dmc_ddrctl = 0x00000904, | ||
69 | .dmc_ddrcfg = 0x00000422, | ||
70 | .dmc_ddrtr0 = 0x20806313, | ||
71 | .dmc_ddrtr1 = 0x2013040D, | ||
72 | .dmc_ddrtr2 = 0x00320108, | ||
73 | .dmc_ddrmr = 0x00000632, | ||
74 | .dmc_ddrmr1 = 0x4, | ||
75 | }, | ||
76 | [2] = { | ||
77 | .ddr_clk = 150, | ||
78 | .dmc_ddrctl = 0x00000904, | ||
79 | .dmc_ddrcfg = 0x00000422, | ||
80 | .dmc_ddrtr0 = 0x20A07323, | ||
81 | .dmc_ddrtr1 = 0x20160492, | ||
82 | .dmc_ddrtr2 = 0x00320209, | ||
83 | .dmc_ddrmr = 0x00000632, | ||
84 | .dmc_ddrmr1 = 0x4, | ||
85 | }, | ||
86 | [3] = { | ||
87 | .ddr_clk = 166, | ||
88 | .dmc_ddrctl = 0x00000904, | ||
89 | .dmc_ddrcfg = 0x00000422, | ||
90 | .dmc_ddrtr0 = 0x20A07323, | ||
91 | .dmc_ddrtr1 = 0x2016050E, | ||
92 | .dmc_ddrtr2 = 0x00320209, | ||
93 | .dmc_ddrmr = 0x00000632, | ||
94 | .dmc_ddrmr1 = 0x4, | ||
95 | }, | ||
96 | [4] = { | ||
97 | .ddr_clk = 200, | ||
98 | .dmc_ddrctl = 0x00000904, | ||
99 | .dmc_ddrcfg = 0x00000422, | ||
100 | .dmc_ddrtr0 = 0x20a07323, | ||
101 | .dmc_ddrtr1 = 0x2016050f, | ||
102 | .dmc_ddrtr2 = 0x00320509, | ||
103 | .dmc_ddrmr = 0x00000632, | ||
104 | .dmc_ddrmr1 = 0x4, | ||
105 | }, | ||
106 | [5] = { | ||
107 | .ddr_clk = 225, | ||
108 | .dmc_ddrctl = 0x00000904, | ||
109 | .dmc_ddrcfg = 0x00000422, | ||
110 | .dmc_ddrtr0 = 0x20E0A424, | ||
111 | .dmc_ddrtr1 = 0x302006DB, | ||
112 | .dmc_ddrtr2 = 0x0032020D, | ||
113 | .dmc_ddrmr = 0x00000842, | ||
114 | .dmc_ddrmr1 = 0x4, | ||
115 | }, | ||
116 | [6] = { | ||
117 | .ddr_clk = 250, | ||
118 | .dmc_ddrctl = 0x00000904, | ||
119 | .dmc_ddrcfg = 0x00000422, | ||
120 | .dmc_ddrtr0 = 0x20E0A424, | ||
121 | .dmc_ddrtr1 = 0x3020079E, | ||
122 | .dmc_ddrtr2 = 0x0032020D, | ||
123 | .dmc_ddrmr = 0x00000842, | ||
124 | .dmc_ddrmr1 = 0x4, | ||
125 | }, | ||
126 | }; | ||
127 | #else | ||
18 | #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */ | 128 | #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */ |
19 | #define PLL_CTL_VAL \ | 129 | #define PLL_CTL_VAL \ |
20 | (((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \ | 130 | (((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \ |
21 | (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000)) | 131 | (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000)) |
132 | #endif | ||
22 | 133 | ||
23 | __attribute__((l1_text)) | 134 | __attribute__((l1_text)) |
24 | static void do_sync(void) | 135 | static void do_sync(void) |
@@ -34,7 +145,43 @@ void init_clocks(void) | |||
34 | * For example, any automatic DMAs left by U-Boot for splash screens. | 145 | * For example, any automatic DMAs left by U-Boot for splash screens. |
35 | */ | 146 | */ |
36 | 147 | ||
37 | #if 0 | 148 | #ifdef CONFIG_BF60x |
149 | int i, dlldatacycle, dll_ctl; | ||
150 | bfin_write32(CGU0_DIV, CGU_DIV_VAL); | ||
151 | bfin_write32(CGU0_CTL, CGU_CTL_VAL); | ||
152 | while ((bfin_read32(CGU0_STAT) & 0x8) || !(bfin_read32(CGU0_STAT) & 0x4)) | ||
153 | continue; | ||
154 | |||
155 | bfin_write32(CGU0_DIV, CGU_DIV_VAL | (1 << UPDT_P)); | ||
156 | while (bfin_read32(CGU0_STAT) & (1 << 3)) | ||
157 | continue; | ||
158 | |||
159 | for (i = 0; i < 7; i++) { | ||
160 | if (ddr_config_table[i].ddr_clk == CONFIG_BFIN_DCLK) { | ||
161 | bfin_write_DDR0_CFG(ddr_config_table[i].dmc_ddrcfg); | ||
162 | bfin_write_DDR0_TR0(ddr_config_table[i].dmc_ddrtr0); | ||
163 | bfin_write_DDR0_TR1(ddr_config_table[i].dmc_ddrtr1); | ||
164 | bfin_write_DDR0_TR2(ddr_config_table[i].dmc_ddrtr2); | ||
165 | bfin_write_DDR0_MR(ddr_config_table[i].dmc_ddrmr); | ||
166 | bfin_write_DDR0_EMR1(ddr_config_table[i].dmc_ddrmr1); | ||
167 | bfin_write_DDR0_CTL(ddr_config_table[i].dmc_ddrctl); | ||
168 | break; | ||
169 | } | ||
170 | } | ||
171 | |||
172 | do_sync(); | ||
173 | while (!(bfin_read_DDR0_STAT() & 0x4)) | ||
174 | continue; | ||
175 | |||
176 | dlldatacycle = (bfin_read_DDR0_STAT() & 0x00f00000) >> 20; | ||
177 | dll_ctl = bfin_read_DDR0_DLLCTL(); | ||
178 | dll_ctl &= 0x0ff; | ||
179 | bfin_write_DDR0_DLLCTL(dll_ctl | (dlldatacycle << 8)); | ||
180 | |||
181 | do_sync(); | ||
182 | while (!(bfin_read_DDR0_STAT() & 0x2000)) | ||
183 | continue; | ||
184 | #else | ||
38 | size_t i; | 185 | size_t i; |
39 | for (i = 0; i < MAX_DMA_CHANNELS; ++i) { | 186 | for (i = 0; i < MAX_DMA_CHANNELS; ++i) { |
40 | struct dma_register *dma = dma_io_base_addr[i]; | 187 | struct dma_register *dma = dma_io_base_addr[i]; |
@@ -93,8 +240,8 @@ void init_clocks(void) | |||
93 | bfin_write_EBIU_DDRQUE(CONFIG_MEM_EBIU_DDRQUE); | 240 | bfin_write_EBIU_DDRQUE(CONFIG_MEM_EBIU_DDRQUE); |
94 | #endif | 241 | #endif |
95 | #endif | 242 | #endif |
243 | #endif | ||
96 | do_sync(); | 244 | do_sync(); |
97 | bfin_read16(0); | 245 | bfin_read16(0); |
98 | 246 | ||
99 | #endif | ||
100 | } | 247 | } |