aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin
diff options
context:
space:
mode:
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/Kconfig45
-rw-r--r--arch/blackfin/include/asm/bfin-global.h2
-rw-r--r--arch/blackfin/kernel/setup.c24
-rw-r--r--arch/blackfin/mach-bf609/clock.c2
-rw-r--r--arch/blackfin/mach-common/clocks-init.c153
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
436config PLL_BYPASS 436config 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
441config CLKIN_HALF 441config 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
497config 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
508config 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
518config 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
495choice 528choice
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
508choice 541choice
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
593config MIN_VCO_HZ 627config MIN_VCO_HZ
594 int 628 int
@@ -596,6 +630,7 @@ config MIN_VCO_HZ
596 630
597config MAX_SCLK_HZ 631config MAX_SCLK_HZ
598 int 632 int
633 default 200000000 if BF609
599 default 133333333 634 default 133333333
600 635
601config MIN_SCLK_HZ 636config 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
39extern unsigned long get_sclk0(void); 39extern unsigned long get_sclk0(void);
40extern unsigned long get_sclk1(void); 40extern unsigned long get_sclk1(void);
41extern unsigned long get_dramclk(void); 41extern unsigned long get_dclk(void);
42#endif 42#endif
43extern unsigned long sclk_to_usecs(unsigned long sclk); 43extern unsigned long sclk_to_usecs(unsigned long sclk);
44extern unsigned long usecs_to_sclk(unsigned long usecs); 44extern 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
44struct 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
55struct 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))
24static void do_sync(void) 135static 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}