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