]>
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 | ||
13 | #include <common.h> | |
d96c2604 | 14 | #include <clock_legacy.h> |
3a7d5571 | 15 | #include <env.h> |
691d719d | 16 | #include <init.h> |
5d108ac8 | 17 | #include <pci.h> |
b79fdc76 | 18 | #include <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> |
29 | #include <mb862xx.h> | |
30 | #include <video_fb.h> | |
59abd15b | 31 | #include "upm_table.h" |
3e79b588 | 32 | |
5d108ac8 SP |
33 | DECLARE_GLOBAL_DATA_PTR; |
34 | ||
35 | extern flash_info_t flash_info[]; /* FLASH chips info */ | |
fb661ea4 | 36 | extern GraphicDevice mb862xx; |
5d108ac8 SP |
37 | |
38 | void local_bus_init (void); | |
39 | ulong flash_get_size (ulong base, int banknum); | |
40 | ||
41 | int checkboard (void) | |
42 | { | |
6d0f6bcf | 43 | volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); |
f0c0b3a9 | 44 | char buf[64]; |
5e1882df | 45 | int f; |
00caae6d | 46 | int i = env_get_f("serial#", buf, sizeof(buf)); |
f0c0b3a9 WD |
47 | #ifdef CONFIG_PCI |
48 | char *src; | |
49 | #endif | |
5d108ac8 SP |
50 | |
51 | puts("Board: Socrates"); | |
f0c0b3a9 | 52 | if (i > 0) { |
5d108ac8 | 53 | puts(", serial# "); |
f0c0b3a9 | 54 | puts(buf); |
5d108ac8 SP |
55 | } |
56 | putc('\n'); | |
57 | ||
2a51fe01 | 58 | #if defined(CONFIG_PCI) || defined(CONFIG_DM_PCI) |
e1eb0e25 AF |
59 | /* Check the PCI_clk sel bit */ |
60 | if (in_be32(&gur->porpllsr) & (1<<15)) { | |
5e1882df SP |
61 | src = "SYSCLK"; |
62 | f = CONFIG_SYS_CLK_FREQ; | |
63 | } else { | |
64 | src = "PCI_CLK"; | |
65 | f = CONFIG_PCI_CLK_FREQ; | |
66 | } | |
67 | printf ("PCI1: 32 bit, %d MHz (%s)\n", f/1000000, src); | |
5d108ac8 SP |
68 | #else |
69 | printf ("PCI1: disabled\n"); | |
70 | #endif | |
71 | ||
72 | /* | |
73 | * Initialize local bus. | |
74 | */ | |
75 | local_bus_init (); | |
5d108ac8 SP |
76 | return 0; |
77 | } | |
78 | ||
79 | int misc_init_r (void) | |
80 | { | |
5d108ac8 SP |
81 | /* |
82 | * Adjust flash start and offset to detected values | |
83 | */ | |
84 | gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; | |
85 | gd->bd->bi_flashoffset = 0; | |
86 | ||
87 | /* | |
88 | * Check if boot FLASH isn't max size | |
89 | */ | |
6d0f6bcf | 90 | if (gd->bd->bi_flashsize < (0 - CONFIG_SYS_FLASH0)) { |
f51cdaf1 BB |
91 | set_lbc_or(0, gd->bd->bi_flashstart | |
92 | (CONFIG_SYS_OR0_PRELIM & 0x00007fff)); | |
93 | set_lbc_br(0, gd->bd->bi_flashstart | | |
94 | (CONFIG_SYS_BR0_PRELIM & 0x00007fff)); | |
5d108ac8 SP |
95 | |
96 | /* | |
97 | * Re-check to get correct base address | |
98 | */ | |
6d0f6bcf | 99 | flash_get_size(gd->bd->bi_flashstart, CONFIG_SYS_MAX_FLASH_BANKS - 1); |
5d108ac8 SP |
100 | } |
101 | ||
102 | /* | |
103 | * Check if only one FLASH bank is available | |
104 | */ | |
6d0f6bcf | 105 | if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CONFIG_SYS_FLASH0)) { |
f51cdaf1 BB |
106 | set_lbc_or(1, 0); |
107 | set_lbc_br(1, 0); | |
5d108ac8 SP |
108 | |
109 | /* | |
110 | * Re-do flash protection upon new addresses | |
111 | */ | |
a595a0e9 SG |
112 | flash_protect(FLAG_PROTECT_CLEAR, |
113 | gd->bd->bi_flashstart, 0xffffffff, | |
114 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
115 | |
116 | /* Monitor protection ON by default */ | |
a595a0e9 SG |
117 | flash_protect(FLAG_PROTECT_SET, |
118 | CONFIG_SYS_MONITOR_BASE, CONFIG_SYS_MONITOR_BASE + | |
119 | monitor_flash_len - 1, | |
120 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
121 | |
122 | /* Environment protection ON by default */ | |
a595a0e9 SG |
123 | flash_protect(FLAG_PROTECT_SET, |
124 | CONFIG_ENV_ADDR, | |
125 | CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, | |
126 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); | |
5d108ac8 SP |
127 | |
128 | /* Redundant environment protection ON by default */ | |
a595a0e9 SG |
129 | flash_protect(FLAG_PROTECT_SET, |
130 | CONFIG_ENV_ADDR_REDUND, | |
131 | CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, | |
6d0f6bcf | 132 | &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); |
5d108ac8 SP |
133 | } |
134 | ||
2a51fe01 HS |
135 | #if defined(CONFIG_DM_PCI) |
136 | pci_init(); | |
137 | #endif | |
138 | ||
5d108ac8 SP |
139 | return 0; |
140 | } | |
141 | ||
142 | /* | |
143 | * Initialize Local Bus | |
144 | */ | |
145 | void local_bus_init (void) | |
146 | { | |
f51cdaf1 | 147 | volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; |
6d0f6bcf | 148 | volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR); |
3e79b588 DZ |
149 | sys_info_t sysinfo; |
150 | uint clkdiv; | |
151 | uint lbc_mhz; | |
6d0f6bcf | 152 | uint lcrr = CONFIG_SYS_LBC_LCRR; |
3e79b588 DZ |
153 | |
154 | get_sys_info (&sysinfo); | |
a5d212a2 | 155 | clkdiv = lbc->lcrr & LCRR_CLKDIV; |
997399fa | 156 | lbc_mhz = sysinfo.freq_systembus / 1000000 / clkdiv; |
3e79b588 DZ |
157 | |
158 | /* Disable PLL bypass for Local Bus Clock >= 66 MHz */ | |
159 | if (lbc_mhz >= 66) | |
160 | lcrr &= ~LCRR_DBYP; /* DLL Enabled */ | |
161 | else | |
162 | lcrr |= LCRR_DBYP; /* DLL Bypass */ | |
163 | ||
164 | out_be32 (&lbc->lcrr, lcrr); | |
165 | asm ("sync;isync;msync"); | |
5d108ac8 | 166 | |
3e79b588 DZ |
167 | out_be32 (&lbc->ltesr, 0xffffffff); /* Clear LBC error interrupts */ |
168 | out_be32 (&lbc->lteir, 0xffffffff); /* Enable LBC error interrupts */ | |
169 | out_be32 (&ecm->eedr, 0xffffffff); /* Clear ecm errors */ | |
170 | out_be32 (&ecm->eeer, 0xffffffff); /* Enable ecm errors */ | |
5d108ac8 | 171 | |
3e79b588 DZ |
172 | /* Init UPMA for FPGA access */ |
173 | out_be32 (&lbc->mamr, 0x44440); /* Use a customer-supplied value */ | |
6d1fdb1e | 174 | upmconfig(UPMA, (uint *)UPMTableA, sizeof(UPMTableA) / sizeof(int)); |
e64987a8 | 175 | |
fb661ea4 | 176 | /* Init UPMB for Lime controller access */ |
177 | out_be32 (&lbc->mbmr, 0x444440); /* Use a customer-supplied value */ | |
6d1fdb1e | 178 | upmconfig(UPMB, (uint *)UPMTableB, sizeof(UPMTableB) / sizeof(int)); |
5d108ac8 SP |
179 | } |
180 | ||
5d108ac8 SP |
181 | #ifdef CONFIG_BOARD_EARLY_INIT_R |
182 | int board_early_init_r (void) | |
183 | { | |
6d0f6bcf | 184 | volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); |
3e79b588 DZ |
185 | |
186 | /* set and reset the GPIO pin 2 which will reset the W83782G chip */ | |
187 | out_8((unsigned char*)&gur->gpoutdr, 0x3F ); | |
188 | out_be32((unsigned int*)&gur->gpiocr, 0x200 ); /* enable GPOut */ | |
189 | udelay(200); | |
190 | out_8( (unsigned char*)&gur->gpoutdr, 0x1F ); | |
191 | ||
5d108ac8 SP |
192 | return (0); |
193 | } | |
194 | #endif /* CONFIG_BOARD_EARLY_INIT_R */ | |
e18575d5 | 195 | |
7ffe3cd6 | 196 | #ifdef CONFIG_OF_BOARD_SETUP |
b75d8dc5 | 197 | int ft_board_setup(void *blob, struct bd_info *bd) |
e18575d5 | 198 | { |
3e79b588 DZ |
199 | u32 val[12]; |
200 | int rc, i = 0; | |
e18575d5 SP |
201 | |
202 | ft_cpu_setup(blob, bd); | |
203 | ||
3e79b588 DZ |
204 | /* Fixup NOR FLASH mapping */ |
205 | val[i++] = 0; /* chip select number */ | |
206 | val[i++] = 0; /* always 0 */ | |
207 | val[i++] = gd->bd->bi_flashstart; | |
208 | val[i++] = gd->bd->bi_flashsize; | |
e18575d5 | 209 | |
4c65a449 | 210 | #if defined(CONFIG_VIDEO_MB862xx) |
6d0f6bcf | 211 | if (mb862xx.frameAdrs == CONFIG_SYS_LIME_BASE) { |
e64987a8 AG |
212 | /* Fixup LIME mapping */ |
213 | val[i++] = 2; /* chip select number */ | |
214 | val[i++] = 0; /* always 0 */ | |
6d0f6bcf JCPV |
215 | val[i++] = CONFIG_SYS_LIME_BASE; |
216 | val[i++] = CONFIG_SYS_LIME_SIZE; | |
e64987a8 | 217 | } |
4c65a449 | 218 | #endif |
e64987a8 | 219 | |
3e79b588 DZ |
220 | /* Fixup FPGA mapping */ |
221 | val[i++] = 3; /* chip select number */ | |
222 | val[i++] = 0; /* always 0 */ | |
6d0f6bcf JCPV |
223 | val[i++] = CONFIG_SYS_FPGA_BASE; |
224 | val[i++] = CONFIG_SYS_FPGA_SIZE; | |
a23cddde | 225 | |
3e79b588 DZ |
226 | rc = fdt_find_and_setprop(blob, "/localbus", "ranges", |
227 | val, i * sizeof(u32), 1); | |
a23cddde | 228 | if (rc) |
3e79b588 | 229 | printf("Unable to update localbus ranges, err=%s\n", |
a23cddde | 230 | fdt_strerror(rc)); |
e895a4b0 SG |
231 | |
232 | return 0; | |
e18575d5 | 233 | } |
7ffe3cd6 | 234 | #endif /* CONFIG_OF_BOARD_SETUP */ |
e64987a8 | 235 | |
39642abf HS |
236 | #if defined(CONFIG_OF_SEPARATE) |
237 | void *board_fdt_blob_setup(void) | |
238 | { | |
239 | void *fw_dtb; | |
240 | ||
241 | fw_dtb = (void *)(CONFIG_SYS_TEXT_BASE - CONFIG_ENV_SECT_SIZE); | |
242 | if (fdt_magic(fw_dtb) != FDT_MAGIC) { | |
243 | printf("DTB is not passed via %x\n", (u32)fw_dtb); | |
244 | return NULL; | |
245 | } | |
246 | ||
247 | return fw_dtb; | |
248 | } | |
249 | #endif | |
98beb60a HS |
250 | |
251 | int get_serial_clock(void) | |
252 | { | |
253 | return 333333330; | |
254 | } |