]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
5d108ac8 SP |
2 | /* |
3 | * (C) Copyright 2008 | |
4 | * Sergei Poselenov, Emcraft Systems, [email protected]. | |
5 | * | |
6 | * Copyright 2004 Freescale Semiconductor. | |
7 | * (C) Copyright 2002,2003, Motorola Inc. | |
8 | * Xianghua Xiao, ([email protected]) | |
9 | * | |
10 | * (C) Copyright 2002 Scott McNutt <[email protected]> | |
5d108ac8 SP |
11 | */ |
12 | ||
03de305e | 13 | #include <config.h> |
d96c2604 | 14 | #include <clock_legacy.h> |
3a7d5571 | 15 | #include <env.h> |
691d719d | 16 | #include <init.h> |
5d108ac8 | 17 | #include <pci.h> |
58d825fb | 18 | #include <u-boot/uuid.h> |
401d1c4f | 19 | #include <asm/global_data.h> |
5d108ac8 SP |
20 | #include <asm/processor.h> |
21 | #include <asm/immap_85xx.h> | |
22 | #include <ioports.h> | |
23 | #include <flash.h> | |
c05ed00a | 24 | #include <linux/delay.h> |
b08c8c48 | 25 | #include <linux/libfdt.h> |
e18575d5 | 26 | #include <fdt_support.h> |
e1eb0e25 | 27 | #include <asm/io.h> |
fb661ea4 | 28 | #include <i2c.h> |
59abd15b | 29 | #include "upm_table.h" |
3e79b588 | 30 | |
5d108ac8 SP |
31 | DECLARE_GLOBAL_DATA_PTR; |
32 | ||
5d108ac8 SP |
33 | void local_bus_init (void); |
34 | ulong flash_get_size (ulong base, int banknum); | |
35 | ||
36 | int checkboard (void) | |
37 | { | |
5155207a | 38 | volatile ccsr_gur_t *gur = (void *)(CFG_SYS_MPC85xx_GUTS_ADDR); |
f0c0b3a9 | 39 | char buf[64]; |
5e1882df | 40 | int f; |
00caae6d | 41 | int i = env_get_f("serial#", buf, sizeof(buf)); |
f0c0b3a9 WD |
42 | #ifdef CONFIG_PCI |
43 | char *src; | |
44 | #endif | |
5d108ac8 SP |
45 | |
46 | puts("Board: Socrates"); | |
f0c0b3a9 | 47 | if (i > 0) { |
5d108ac8 | 48 | puts(", serial# "); |
f0c0b3a9 | 49 | puts(buf); |
5d108ac8 SP |
50 | } |
51 | putc('\n'); | |
52 | ||
0ecc7a0c | 53 | #if defined(CONFIG_PCI) |
e1eb0e25 AF |
54 | /* Check the PCI_clk sel bit */ |
55 | if (in_be32(&gur->porpllsr) & (1<<15)) { | |
5e1882df | 56 | src = "SYSCLK"; |
2f8a6db5 | 57 | f = get_board_sys_clk(); |
5e1882df SP |
58 | } else { |
59 | src = "PCI_CLK"; | |
1bc8ef4d TR |
60 | /* PCI is clocked by the external source at 33 MHz */ |
61 | f = 33000000; | |
5e1882df SP |
62 | } |
63 | printf ("PCI1: 32 bit, %d MHz (%s)\n", f/1000000, src); | |
5d108ac8 SP |
64 | #else |
65 | printf ("PCI1: disabled\n"); | |
66 | #endif | |
67 | ||
68 | /* | |
69 | * Initialize local bus. | |
70 | */ | |
71 | local_bus_init (); | |
5d108ac8 SP |
72 | return 0; |
73 | } | |
74 | ||
75 | int misc_init_r (void) | |
76 | { | |
5d108ac8 SP |
77 | /* |
78 | * Adjust flash start and offset to detected values | |
79 | */ | |
80 | gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; | |
81 | gd->bd->bi_flashoffset = 0; | |
82 | ||
83 | /* | |
84 | * Check if boot FLASH isn't max size | |
85 | */ | |
65cc0e2a | 86 | if (gd->bd->bi_flashsize < (0 - CFG_SYS_FLASH0)) { |
f51cdaf1 BB |
87 | set_lbc_or(0, gd->bd->bi_flashstart | |
88 | (CONFIG_SYS_OR0_PRELIM & 0x00007fff)); | |
89 | set_lbc_br(0, gd->bd->bi_flashstart | | |
90 | (CONFIG_SYS_BR0_PRELIM & 0x00007fff)); | |
5d108ac8 SP |
91 | |
92 | /* | |
93 | * Re-check to get correct base address | |
94 | */ | |
6d0f6bcf | 95 | flash_get_size(gd->bd->bi_flashstart, CONFIG_SYS_MAX_FLASH_BANKS - 1); |
5d108ac8 SP |
96 | } |
97 | ||
98 | /* | |
99 | * Check if only one FLASH bank is available | |
100 | */ | |
65cc0e2a | 101 | if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CFG_SYS_FLASH0)) { |
f51cdaf1 BB |
102 | set_lbc_or(1, 0); |
103 | set_lbc_br(1, 0); | |
5d108ac8 SP |
104 | |
105 | /* | |
106 | * Re-do flash protection upon new addresses | |
107 | */ | |
a595a0e9 SG |
108 | flash_protect(FLAG_PROTECT_CLEAR, |
109 | gd->bd->bi_flashstart, 0xffffffff, | |
110 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
111 | |
112 | /* Monitor protection ON by default */ | |
a595a0e9 SG |
113 | flash_protect(FLAG_PROTECT_SET, |
114 | CONFIG_SYS_MONITOR_BASE, CONFIG_SYS_MONITOR_BASE + | |
115 | monitor_flash_len - 1, | |
116 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
117 | |
118 | /* Environment protection ON by default */ | |
a595a0e9 SG |
119 | flash_protect(FLAG_PROTECT_SET, |
120 | CONFIG_ENV_ADDR, | |
121 | CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, | |
122 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
123 | |
124 | /* Redundant environment protection ON by default */ | |
a595a0e9 SG |
125 | flash_protect(FLAG_PROTECT_SET, |
126 | CONFIG_ENV_ADDR_REDUND, | |
127 | CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, | |
6d0f6bcf | 128 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); |
5d108ac8 SP |
129 | } |
130 | ||
2a51fe01 | 131 | pci_init(); |
2a51fe01 | 132 | |
5d108ac8 SP |
133 | return 0; |
134 | } | |
135 | ||
136 | /* | |
137 | * Initialize Local Bus | |
138 | */ | |
139 | void local_bus_init (void) | |
140 | { | |
f51cdaf1 | 141 | volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; |
5155207a | 142 | volatile ccsr_local_ecm_t *ecm = (void *)(CFG_SYS_MPC85xx_ECM_ADDR); |
3e79b588 DZ |
143 | sys_info_t sysinfo; |
144 | uint clkdiv; | |
145 | uint lbc_mhz; | |
65cc0e2a | 146 | uint lcrr = CFG_SYS_LBC_LCRR; |
3e79b588 DZ |
147 | |
148 | get_sys_info (&sysinfo); | |
a5d212a2 | 149 | clkdiv = lbc->lcrr & LCRR_CLKDIV; |
997399fa | 150 | lbc_mhz = sysinfo.freq_systembus / 1000000 / clkdiv; |
3e79b588 DZ |
151 | |
152 | /* Disable PLL bypass for Local Bus Clock >= 66 MHz */ | |
153 | if (lbc_mhz >= 66) | |
154 | lcrr &= ~LCRR_DBYP; /* DLL Enabled */ | |
155 | else | |
156 | lcrr |= LCRR_DBYP; /* DLL Bypass */ | |
157 | ||
158 | out_be32 (&lbc->lcrr, lcrr); | |
159 | asm ("sync;isync;msync"); | |
5d108ac8 | 160 | |
3e79b588 DZ |
161 | out_be32 (&lbc->ltesr, 0xffffffff); /* Clear LBC error interrupts */ |
162 | out_be32 (&lbc->lteir, 0xffffffff); /* Enable LBC error interrupts */ | |
163 | out_be32 (&ecm->eedr, 0xffffffff); /* Clear ecm errors */ | |
164 | out_be32 (&ecm->eeer, 0xffffffff); /* Enable ecm errors */ | |
5d108ac8 | 165 | |
3e79b588 DZ |
166 | /* Init UPMA for FPGA access */ |
167 | out_be32 (&lbc->mamr, 0x44440); /* Use a customer-supplied value */ | |
6d1fdb1e | 168 | upmconfig(UPMA, (uint *)UPMTableA, sizeof(UPMTableA) / sizeof(int)); |
e64987a8 | 169 | |
fb661ea4 | 170 | /* Init UPMB for Lime controller access */ |
171 | out_be32 (&lbc->mbmr, 0x444440); /* Use a customer-supplied value */ | |
6d1fdb1e | 172 | upmconfig(UPMB, (uint *)UPMTableB, sizeof(UPMTableB) / sizeof(int)); |
5d108ac8 SP |
173 | } |
174 | ||
5d108ac8 SP |
175 | #ifdef CONFIG_BOARD_EARLY_INIT_R |
176 | int board_early_init_r (void) | |
177 | { | |
5155207a | 178 | volatile ccsr_gur_t *gur = (void *)(CFG_SYS_MPC85xx_GUTS_ADDR); |
3e79b588 DZ |
179 | |
180 | /* set and reset the GPIO pin 2 which will reset the W83782G chip */ | |
181 | out_8((unsigned char*)&gur->gpoutdr, 0x3F ); | |
182 | out_be32((unsigned int*)&gur->gpiocr, 0x200 ); /* enable GPOut */ | |
183 | udelay(200); | |
184 | out_8( (unsigned char*)&gur->gpoutdr, 0x1F ); | |
185 | ||
5d108ac8 SP |
186 | return (0); |
187 | } | |
188 | #endif /* CONFIG_BOARD_EARLY_INIT_R */ | |
e18575d5 | 189 | |
7ffe3cd6 | 190 | #ifdef CONFIG_OF_BOARD_SETUP |
b75d8dc5 | 191 | int ft_board_setup(void *blob, struct bd_info *bd) |
e18575d5 | 192 | { |
3e79b588 DZ |
193 | u32 val[12]; |
194 | int rc, i = 0; | |
e18575d5 SP |
195 | |
196 | ft_cpu_setup(blob, bd); | |
197 | ||
3e79b588 DZ |
198 | /* Fixup NOR FLASH mapping */ |
199 | val[i++] = 0; /* chip select number */ | |
200 | val[i++] = 0; /* always 0 */ | |
201 | val[i++] = gd->bd->bi_flashstart; | |
202 | val[i++] = gd->bd->bi_flashsize; | |
e18575d5 | 203 | |
3e79b588 DZ |
204 | /* Fixup FPGA mapping */ |
205 | val[i++] = 3; /* chip select number */ | |
206 | val[i++] = 0; /* always 0 */ | |
65cc0e2a TR |
207 | val[i++] = CFG_SYS_FPGA_BASE; |
208 | val[i++] = CFG_SYS_FPGA_SIZE; | |
a23cddde | 209 | |
3e79b588 DZ |
210 | rc = fdt_find_and_setprop(blob, "/localbus", "ranges", |
211 | val, i * sizeof(u32), 1); | |
a23cddde | 212 | if (rc) |
3e79b588 | 213 | printf("Unable to update localbus ranges, err=%s\n", |
a23cddde | 214 | fdt_strerror(rc)); |
e895a4b0 SG |
215 | |
216 | return 0; | |
e18575d5 | 217 | } |
7ffe3cd6 | 218 | #endif /* CONFIG_OF_BOARD_SETUP */ |
e64987a8 | 219 | |
98beb60a HS |
220 | int get_serial_clock(void) |
221 | { | |
222 | return 333333330; | |
223 | } |