Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

blackfin: bf60x: make clock changeable in kernel menuconfig

Add clock changeable support in kernel menuconfig for bf60x.

Signed-off-by: Bob Liu <lliubbo@gmail.com>

Bob Liu 7c141c1c 1c400939

+197 -29
+40 -5
arch/blackfin/Kconfig
··· 435 435 436 436 config PLL_BYPASS 437 437 bool "Bypass PLL" 438 - depends on BFIN_KERNEL_CLOCK 438 + depends on BFIN_KERNEL_CLOCK && (!BF60x) 439 439 default n 440 440 441 441 config CLKIN_HALF ··· 454 454 default "20" if (BFIN537_STAMP || BFIN527_EZKIT || BFIN527_EZKIT_V2 || BFIN548_EZKIT || BFIN548_BLUETECHNIX_CM || BFIN538_EZKIT) 455 455 default "22" if BFIN533_BLUETECHNIX_CM 456 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 458 default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN518F_EZBRD) 459 459 default "25" if BFIN527_AD7160EVAL 460 460 help ··· 486 486 int "System Clock Divider" 487 487 depends on BFIN_KERNEL_CLOCK 488 488 range 1 15 489 - default 5 489 + default 4 490 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 494 This can be between 1 and 15 493 495 System Clock = (PLL frequency) / (this setting) 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) 494 527 495 528 choice 496 529 prompt "DDR SDRAM Chip Type" ··· 540 507 541 508 choice 542 509 prompt "DDR/SDRAM Timing" 543 - depends on BFIN_KERNEL_CLOCK 510 + depends on BFIN_KERNEL_CLOCK && !BF60x 544 511 default BFIN_KERNEL_CLOCK_MEMINIT_CALC 545 512 help 546 513 This option allows you to specify Blackfin SDRAM/DDR Timing parameters ··· 622 589 default 600000000 if BF548 623 590 default 533333333 if BF549 624 591 default 600000000 if BF561 592 + default 800000000 if BF609 625 593 626 594 config MIN_VCO_HZ 627 595 int ··· 630 596 631 597 config MAX_SCLK_HZ 632 598 int 599 + default 200000000 if BF609 633 600 default 133333333 634 601 635 602 config MIN_SCLK_HZ
+1 -1
arch/blackfin/include/asm/bfin-global.h
··· 38 38 #ifdef CONFIG_BF60x 39 39 extern unsigned long get_sclk0(void); 40 40 extern unsigned long get_sclk1(void); 41 - extern unsigned long get_dramclk(void); 41 + extern unsigned long get_dclk(void); 42 42 #endif 43 43 extern unsigned long sclk_to_usecs(unsigned long sclk); 44 44 extern unsigned long usecs_to_sclk(unsigned long usecs);
+5 -19
arch/blackfin/kernel/setup.c
··· 892 892 { 893 893 u32 mmr; 894 894 unsigned long sclk, cclk; 895 - #ifdef CONFIG_BF60x 896 - struct clk *clk; 897 - #endif 898 895 899 896 native_machine_early_platform_add_devices(); 900 897 ··· 956 959 ~HYST_NONEGPIO_MASK) | HYST_NONEGPIO); 957 960 #endif 958 961 959 - #ifdef CONFIG_BF60x 960 - clk = clk_get(NULL, "CCLK"); 961 - if (!IS_ERR(clk)) { 962 - cclk = clk_get_rate(clk); 963 - clk_put(clk); 964 - } else 965 - cclk = 0; 966 - 967 - clk = clk_get(NULL, "SCLK0"); 968 - if (!IS_ERR(clk)) { 969 - sclk = clk_get_rate(clk); 970 - clk_put(clk); 971 - } else 972 - sclk = 0; 973 - #else 974 962 cclk = get_cclk(); 975 963 sclk = get_sclk(); 976 - #endif 977 964 978 965 if ((ANOMALY_05000273 || ANOMALY_05000274) && (cclk >> 1) < sclk) 979 966 panic("ANOMALY 05000273 or 05000274: CCLK must be >= 2*SCLK"); ··· 1043 1062 1044 1063 printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); 1045 1064 1065 + #ifdef CONFIG_BF60x 1066 + printk(KERN_INFO "Processor Speed: %lu MHz core clock, %lu MHz SCLk, %lu MHz SCLK0, %lu MHz SCLK1 and %lu MHz DCLK\n", 1067 + cclk / 1000000, sclk / 1000000, get_sclk0() / 1000000, get_sclk1() / 1000000, get_dclk() / 1000000); 1068 + #else 1046 1069 printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", 1047 1070 cclk / 1000000, sclk / 1000000); 1071 + #endif 1048 1072 1049 1073 setup_bootmem_allocator(); 1050 1074
+1 -1
arch/blackfin/mach-bf609/clock.c
··· 351 351 .rate = 500000000, 352 352 .mask = CGU0_DIV_DSEL_MASK, 353 353 .shift = CGU0_DIV_DSEL_SHIFT, 354 - .parent = &pll_clk, 354 + .parent = &sys_clkin, 355 355 .ops = &sys_clk_ops, 356 356 }; 357 357
+150 -3
arch/blackfin/mach-common/clocks-init.c
··· 15 15 #include <asm/mem_init.h> 16 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 128 #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */ 19 129 #define PLL_CTL_VAL \ 20 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 134 __attribute__((l1_text)) 24 135 static void do_sync(void) ··· 145 34 * For example, any automatic DMAs left by U-Boot for splash screens. 146 35 */ 147 36 148 - #if 0 37 + #ifdef CONFIG_BF60x 38 + int i, dlldatacycle, dll_ctl; 39 + bfin_write32(CGU0_DIV, CGU_DIV_VAL); 40 + bfin_write32(CGU0_CTL, CGU_CTL_VAL); 41 + while ((bfin_read32(CGU0_STAT) & 0x8) || !(bfin_read32(CGU0_STAT) & 0x4)) 42 + continue; 43 + 44 + bfin_write32(CGU0_DIV, CGU_DIV_VAL | (1 << UPDT_P)); 45 + while (bfin_read32(CGU0_STAT) & (1 << 3)) 46 + continue; 47 + 48 + for (i = 0; i < 7; i++) { 49 + if (ddr_config_table[i].ddr_clk == CONFIG_BFIN_DCLK) { 50 + bfin_write_DDR0_CFG(ddr_config_table[i].dmc_ddrcfg); 51 + bfin_write_DDR0_TR0(ddr_config_table[i].dmc_ddrtr0); 52 + bfin_write_DDR0_TR1(ddr_config_table[i].dmc_ddrtr1); 53 + bfin_write_DDR0_TR2(ddr_config_table[i].dmc_ddrtr2); 54 + bfin_write_DDR0_MR(ddr_config_table[i].dmc_ddrmr); 55 + bfin_write_DDR0_EMR1(ddr_config_table[i].dmc_ddrmr1); 56 + bfin_write_DDR0_CTL(ddr_config_table[i].dmc_ddrctl); 57 + break; 58 + } 59 + } 60 + 61 + do_sync(); 62 + while (!(bfin_read_DDR0_STAT() & 0x4)) 63 + continue; 64 + 65 + dlldatacycle = (bfin_read_DDR0_STAT() & 0x00f00000) >> 20; 66 + dll_ctl = bfin_read_DDR0_DLLCTL(); 67 + dll_ctl &= 0x0ff; 68 + bfin_write_DDR0_DLLCTL(dll_ctl | (dlldatacycle << 8)); 69 + 70 + do_sync(); 71 + while (!(bfin_read_DDR0_STAT() & 0x2000)) 72 + continue; 73 + #else 149 74 size_t i; 150 75 for (i = 0; i < MAX_DMA_CHANNELS; ++i) { 151 76 struct dma_register *dma = dma_io_base_addr[i]; ··· 240 93 bfin_write_EBIU_DDRQUE(CONFIG_MEM_EBIU_DDRQUE); 241 94 #endif 242 95 #endif 96 + #endif 243 97 do_sync(); 244 98 bfin_read16(0); 245 99 246 - #endif 247 100 }