]>
Commit | Line | Data |
---|---|---|
9d0fc811 DB |
1 | /* |
2 | * Maintainer : Steve Sakoman <steve@sakoman.com> | |
3 | * | |
4 | * Derived from Beagle Board, 3430 SDP, and OMAP3EVM code by | |
5 | * Richard Woodruff <r-woodruff2@ti.com> | |
6 | * Syed Mohammed Khasim <khasim@ti.com> | |
7 | * Sunil Kumar <sunilsaini05@gmail.com> | |
8 | * Shashi Ranjan <shashiranjanmca05@gmail.com> | |
9 | * | |
10 | * (C) Copyright 2004-2008 | |
11 | * Texas Instruments, <www.ti.com> | |
12 | * | |
1a459660 | 13 | * SPDX-License-Identifier: GPL-2.0+ |
9d0fc811 DB |
14 | */ |
15 | #include <common.h> | |
b3f4ca11 SG |
16 | #include <dm.h> |
17 | #include <ns16550.h> | |
df382626 | 18 | #include <netdev.h> |
2c155130 | 19 | #include <twl4030.h> |
137703b8 | 20 | #include <linux/mtd/nand.h> |
9d0fc811 | 21 | #include <asm/io.h> |
cd7c5726 | 22 | #include <asm/arch/mmc_host_def.h> |
9d0fc811 | 23 | #include <asm/arch/mux.h> |
df382626 | 24 | #include <asm/arch/mem.h> |
9d0fc811 | 25 | #include <asm/arch/sys_proto.h> |
84c3b631 | 26 | #include <asm/gpio.h> |
9d0fc811 DB |
27 | #include <asm/mach-types.h> |
28 | #include "overo.h" | |
29 | ||
8850c5d5 | 30 | #ifdef CONFIG_USB_EHCI_HCD |
f5c30c1b SH |
31 | #include <usb.h> |
32 | #include <asm/ehci-omap.h> | |
33 | #endif | |
34 | ||
29565326 JR |
35 | DECLARE_GLOBAL_DATA_PTR; |
36 | ||
d64b5b89 SS |
37 | #define TWL4030_I2C_BUS 0 |
38 | #define EXPANSION_EEPROM_I2C_BUS 2 | |
39 | #define EXPANSION_EEPROM_I2C_ADDRESS 0x51 | |
40 | ||
4ed914a2 SH |
41 | #define GUMSTIX_EMPTY_EEPROM 0x0 |
42 | ||
d64b5b89 SS |
43 | #define GUMSTIX_SUMMIT 0x01000200 |
44 | #define GUMSTIX_TOBI 0x02000200 | |
45 | #define GUMSTIX_TOBI_DUO 0x03000200 | |
46 | #define GUMSTIX_PALO35 0x04000200 | |
47 | #define GUMSTIX_PALO43 0x05000200 | |
48 | #define GUMSTIX_CHESTNUT43 0x06000200 | |
49 | #define GUMSTIX_PINTO 0x07000200 | |
50 | #define GUMSTIX_GALLOP43 0x08000200 | |
ea5940e9 AC |
51 | #define GUMSTIX_ALTO35 0x09000200 |
52 | #define GUMSTIX_STAGECOACH 0x0A000200 | |
53 | #define GUMSTIX_THUMBO 0x0B000200 | |
54 | #define GUMSTIX_TURTLECORE 0x0C000200 | |
55 | #define GUMSTIX_ARBOR43C 0x0D000200 | |
d64b5b89 SS |
56 | |
57 | #define ETTUS_USRP_E 0x01000300 | |
58 | ||
59 | #define GUMSTIX_NO_EEPROM 0xffffffff | |
60 | ||
61 | static struct { | |
62 | unsigned int device_vendor; | |
63 | unsigned char revision; | |
64 | unsigned char content; | |
65 | char fab_revision[8]; | |
66 | char env_var[16]; | |
67 | char env_setting[64]; | |
4ed914a2 | 68 | } expansion_config = {0x0}; |
ba9a11e4 | 69 | |
b3f4ca11 | 70 | static const struct ns16550_platdata overo_serial = { |
2f6ed3b8 AF |
71 | .base = OMAP34XX_UART3, |
72 | .reg_shift = 2, | |
17fa0326 HS |
73 | .clock = V_NS16550_CLK, |
74 | .fcr = UART_FCR_DEFVAL, | |
b3f4ca11 SG |
75 | }; |
76 | ||
77 | U_BOOT_DEVICE(overo_uart) = { | |
c7b9686d | 78 | "ns16550_serial", |
b3f4ca11 SG |
79 | &overo_serial |
80 | }; | |
81 | ||
a06e1629 SS |
82 | /* |
83 | * Routine: get_sdio2_config | |
84 | * Description: Return information about the wifi module connection | |
85 | * Returns 0 if the module connects though a level translator | |
86 | * Returns 1 if the module connects directly | |
87 | */ | |
88 | int get_sdio2_config(void) | |
89 | { | |
90 | int sdio_direct; | |
91 | ||
84c3b631 | 92 | if (!gpio_request(130, "") && !gpio_request(139, "")) { |
a06e1629 | 93 | |
84c3b631 SP |
94 | gpio_direction_output(130, 0); |
95 | gpio_direction_input(139); | |
a06e1629 SS |
96 | |
97 | sdio_direct = 1; | |
84c3b631 SP |
98 | gpio_set_value(130, 0); |
99 | if (gpio_get_value(139) == 0) { | |
100 | gpio_set_value(130, 1); | |
101 | if (gpio_get_value(139) == 1) | |
a06e1629 SS |
102 | sdio_direct = 0; |
103 | } | |
104 | ||
b5db0a06 | 105 | gpio_direction_input(130); |
a06e1629 | 106 | } else { |
bae485db | 107 | puts("Error: unable to acquire sdio2 clk GPIOs\n"); |
a06e1629 SS |
108 | sdio_direct = -1; |
109 | } | |
110 | ||
111 | return sdio_direct; | |
112 | } | |
113 | ||
d64b5b89 SS |
114 | /* |
115 | * Routine: get_expansion_id | |
116 | * Description: This function checks for expansion board by checking I2C | |
117 | * bus 2 for the availability of an AT24C01B serial EEPROM. | |
118 | * returns the device_vendor field from the EEPROM | |
119 | */ | |
120 | unsigned int get_expansion_id(void) | |
121 | { | |
4ed914a2 SH |
122 | if (expansion_config.device_vendor != 0x0) |
123 | return expansion_config.device_vendor; | |
124 | ||
d64b5b89 SS |
125 | i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); |
126 | ||
127 | /* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */ | |
128 | if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { | |
129 | i2c_set_bus_num(TWL4030_I2C_BUS); | |
130 | return GUMSTIX_NO_EEPROM; | |
131 | } | |
132 | ||
133 | /* read configuration data */ | |
134 | i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, | |
135 | sizeof(expansion_config)); | |
136 | ||
137 | i2c_set_bus_num(TWL4030_I2C_BUS); | |
138 | ||
139 | return expansion_config.device_vendor; | |
140 | } | |
141 | ||
58911517 | 142 | /* |
9d0fc811 DB |
143 | * Routine: misc_init_r |
144 | * Description: Configure board specific parts | |
58911517 | 145 | */ |
9d0fc811 DB |
146 | int misc_init_r(void) |
147 | { | |
ea5940e9 AC |
148 | unsigned int expansion_id; |
149 | ||
2c155130 | 150 | twl4030_power_init(); |
ead39d7a | 151 | twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); |
9d0fc811 | 152 | |
c2d5b341 | 153 | printf("Board revision: %d\n", get_board_revision()); |
a06e1629 SS |
154 | |
155 | switch (get_sdio2_config()) { | |
156 | case 0: | |
bae485db | 157 | puts("Tranceiver detected on mmc2\n"); |
a06e1629 SS |
158 | MUX_OVERO_SDIO2_TRANSCEIVER(); |
159 | break; | |
160 | case 1: | |
bae485db | 161 | puts("Direct connection on mmc2\n"); |
a06e1629 SS |
162 | MUX_OVERO_SDIO2_DIRECT(); |
163 | break; | |
164 | default: | |
bae485db | 165 | puts("Unable to detect mmc2 connection type\n"); |
a06e1629 SS |
166 | } |
167 | ||
ea5940e9 AC |
168 | expansion_id = get_expansion_id(); |
169 | switch (expansion_id) { | |
d64b5b89 SS |
170 | case GUMSTIX_SUMMIT: |
171 | printf("Recognized Summit expansion board (rev %d %s)\n", | |
172 | expansion_config.revision, | |
173 | expansion_config.fab_revision); | |
4ed914a2 | 174 | MUX_GUMSTIX(); |
382bee57 SG |
175 | env_set("defaultdisplay", "dvi"); |
176 | env_set("expansionname", "summit"); | |
d64b5b89 SS |
177 | break; |
178 | case GUMSTIX_TOBI: | |
179 | printf("Recognized Tobi expansion board (rev %d %s)\n", | |
180 | expansion_config.revision, | |
181 | expansion_config.fab_revision); | |
4ed914a2 | 182 | MUX_GUMSTIX(); |
382bee57 SG |
183 | env_set("defaultdisplay", "dvi"); |
184 | env_set("expansionname", "tobi"); | |
d64b5b89 SS |
185 | break; |
186 | case GUMSTIX_TOBI_DUO: | |
187 | printf("Recognized Tobi Duo expansion board (rev %d %s)\n", | |
188 | expansion_config.revision, | |
189 | expansion_config.fab_revision); | |
4ed914a2 | 190 | MUX_GUMSTIX(); |
382bee57 | 191 | env_set("expansionname", "tobiduo"); |
d64b5b89 SS |
192 | break; |
193 | case GUMSTIX_PALO35: | |
194 | printf("Recognized Palo35 expansion board (rev %d %s)\n", | |
195 | expansion_config.revision, | |
196 | expansion_config.fab_revision); | |
4ed914a2 | 197 | MUX_GUMSTIX(); |
382bee57 SG |
198 | env_set("defaultdisplay", "lcd35"); |
199 | env_set("expansionname", "palo35"); | |
d64b5b89 SS |
200 | break; |
201 | case GUMSTIX_PALO43: | |
202 | printf("Recognized Palo43 expansion board (rev %d %s)\n", | |
203 | expansion_config.revision, | |
204 | expansion_config.fab_revision); | |
4ed914a2 | 205 | MUX_GUMSTIX(); |
382bee57 SG |
206 | env_set("defaultdisplay", "lcd43"); |
207 | env_set("expansionname", "palo43"); | |
d64b5b89 SS |
208 | break; |
209 | case GUMSTIX_CHESTNUT43: | |
210 | printf("Recognized Chestnut43 expansion board (rev %d %s)\n", | |
211 | expansion_config.revision, | |
212 | expansion_config.fab_revision); | |
4ed914a2 | 213 | MUX_GUMSTIX(); |
382bee57 SG |
214 | env_set("defaultdisplay", "lcd43"); |
215 | env_set("expansionname", "chestnut43"); | |
d64b5b89 SS |
216 | break; |
217 | case GUMSTIX_PINTO: | |
218 | printf("Recognized Pinto expansion board (rev %d %s)\n", | |
219 | expansion_config.revision, | |
220 | expansion_config.fab_revision); | |
4ed914a2 | 221 | MUX_GUMSTIX(); |
d64b5b89 SS |
222 | break; |
223 | case GUMSTIX_GALLOP43: | |
224 | printf("Recognized Gallop43 expansion board (rev %d %s)\n", | |
225 | expansion_config.revision, | |
226 | expansion_config.fab_revision); | |
4ed914a2 | 227 | MUX_GUMSTIX(); |
382bee57 SG |
228 | env_set("defaultdisplay", "lcd43"); |
229 | env_set("expansionname", "gallop43"); | |
d64b5b89 | 230 | break; |
ea5940e9 AC |
231 | case GUMSTIX_ALTO35: |
232 | printf("Recognized Alto35 expansion board (rev %d %s)\n", | |
233 | expansion_config.revision, | |
234 | expansion_config.fab_revision); | |
4ed914a2 | 235 | MUX_GUMSTIX(); |
ea5940e9 | 236 | MUX_ALTO35(); |
382bee57 SG |
237 | env_set("defaultdisplay", "lcd35"); |
238 | env_set("expansionname", "alto35"); | |
ea5940e9 AC |
239 | break; |
240 | case GUMSTIX_STAGECOACH: | |
241 | printf("Recognized Stagecoach expansion board (rev %d %s)\n", | |
242 | expansion_config.revision, | |
243 | expansion_config.fab_revision); | |
4ed914a2 | 244 | MUX_GUMSTIX(); |
ea5940e9 AC |
245 | break; |
246 | case GUMSTIX_THUMBO: | |
247 | printf("Recognized Thumbo expansion board (rev %d %s)\n", | |
248 | expansion_config.revision, | |
249 | expansion_config.fab_revision); | |
4ed914a2 | 250 | MUX_GUMSTIX(); |
ea5940e9 AC |
251 | break; |
252 | case GUMSTIX_TURTLECORE: | |
253 | printf("Recognized Turtlecore expansion board (rev %d %s)\n", | |
254 | expansion_config.revision, | |
255 | expansion_config.fab_revision); | |
4ed914a2 | 256 | MUX_GUMSTIX(); |
ea5940e9 AC |
257 | break; |
258 | case GUMSTIX_ARBOR43C: | |
259 | printf("Recognized Arbor43C expansion board (rev %d %s)\n", | |
260 | expansion_config.revision, | |
261 | expansion_config.fab_revision); | |
4ed914a2 | 262 | MUX_GUMSTIX(); |
ea5940e9 | 263 | MUX_ARBOR43C(); |
382bee57 SG |
264 | env_set("defaultdisplay", "lcd43"); |
265 | env_set("expansionname", "arbor43c"); | |
ea5940e9 | 266 | break; |
d64b5b89 SS |
267 | case ETTUS_USRP_E: |
268 | printf("Recognized Ettus Research USRP-E (rev %d %s)\n", | |
269 | expansion_config.revision, | |
270 | expansion_config.fab_revision); | |
4ed914a2 | 271 | MUX_GUMSTIX(); |
d64b5b89 | 272 | MUX_USRP_E(); |
382bee57 | 273 | env_set("defaultdisplay", "dvi"); |
d64b5b89 SS |
274 | break; |
275 | case GUMSTIX_NO_EEPROM: | |
4ed914a2 SH |
276 | case GUMSTIX_EMPTY_EEPROM: |
277 | puts("No or empty EEPROM on expansion board\n"); | |
278 | MUX_GUMSTIX(); | |
382bee57 | 279 | env_set("expansionname", "tobi"); |
d64b5b89 SS |
280 | break; |
281 | default: | |
ea5940e9 AC |
282 | printf("Unrecognized expansion board 0x%08x\n", expansion_id); |
283 | break; | |
d64b5b89 SS |
284 | } |
285 | ||
286 | if (expansion_config.content == 1) | |
382bee57 | 287 | env_set(expansion_config.env_var, expansion_config.env_setting); |
d64b5b89 | 288 | |
679f82c3 | 289 | omap_die_id_display(); |
e6a6a704 | 290 | |
12cc5437 | 291 | if (get_cpu_family() == CPU_OMAP34XX) |
382bee57 | 292 | env_set("boardname", "overo"); |
12cc5437 | 293 | else |
382bee57 | 294 | env_set("boardname", "overo-storm"); |
12cc5437 | 295 | |
9d0fc811 DB |
296 | return 0; |
297 | } | |
298 | ||
fe5d488f | 299 | #if defined(CONFIG_CMD_NET) |
113429a2 SH |
300 | /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ |
301 | static const u32 gpmc_lan_config[] = { | |
302 | NET_LAN9221_GPMC_CONFIG1, | |
303 | NET_LAN9221_GPMC_CONFIG2, | |
304 | NET_LAN9221_GPMC_CONFIG3, | |
305 | NET_LAN9221_GPMC_CONFIG4, | |
306 | NET_LAN9221_GPMC_CONFIG5, | |
307 | NET_LAN9221_GPMC_CONFIG6, | |
308 | /*CONFIG7- computed as params */ | |
309 | }; | |
310 | ||
df382626 OJ |
311 | /* |
312 | * Routine: setup_net_chip | |
313 | * Description: Setting up the configuration GPMC registers specific to the | |
314 | * Ethernet hardware. | |
315 | */ | |
316 | static void setup_net_chip(void) | |
317 | { | |
318 | struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; | |
319 | ||
df382626 OJ |
320 | /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ |
321 | writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); | |
322 | /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ | |
323 | writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); | |
324 | /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ | |
325 | writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, | |
326 | &ctrl_base->gpmc_nadv_ale); | |
113429a2 | 327 | } |
df382626 | 328 | |
113429a2 SH |
329 | /* |
330 | * Routine: reset_net_chip | |
331 | * Description: Reset the Ethernet hardware. | |
332 | */ | |
333 | static void reset_net_chip(void) | |
334 | { | |
df382626 | 335 | /* Make GPIO 64 as output pin and send a magic pulse through it */ |
84c3b631 SP |
336 | if (!gpio_request(64, "")) { |
337 | gpio_direction_output(64, 0); | |
338 | gpio_set_value(64, 1); | |
df382626 | 339 | udelay(1); |
84c3b631 | 340 | gpio_set_value(64, 0); |
df382626 | 341 | udelay(1); |
84c3b631 | 342 | gpio_set_value(64, 1); |
df382626 OJ |
343 | } |
344 | } | |
df382626 OJ |
345 | |
346 | int board_eth_init(bd_t *bis) | |
347 | { | |
113429a2 | 348 | unsigned int expansion_id; |
df382626 | 349 | int rc = 0; |
113429a2 | 350 | |
df382626 | 351 | #ifdef CONFIG_SMC911X |
113429a2 SH |
352 | expansion_id = get_expansion_id(); |
353 | switch (expansion_id) { | |
354 | case GUMSTIX_TOBI_DUO: | |
355 | /* second lan chip */ | |
356 | enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], | |
357 | 0x2B000000, GPMC_SIZE_16M); | |
358 | /* no break */ | |
359 | case GUMSTIX_TOBI: | |
360 | case GUMSTIX_CHESTNUT43: | |
361 | case GUMSTIX_STAGECOACH: | |
362 | case GUMSTIX_NO_EEPROM: | |
363 | case GUMSTIX_EMPTY_EEPROM: | |
364 | /* first lan chip */ | |
365 | enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], | |
366 | 0x2C000000, GPMC_SIZE_16M); | |
367 | ||
368 | setup_net_chip(); | |
369 | reset_net_chip(); | |
370 | ||
371 | rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); | |
372 | break; | |
373 | default: | |
374 | break; | |
375 | } | |
df382626 | 376 | #endif |
113429a2 | 377 | |
df382626 OJ |
378 | return rc; |
379 | } | |
113429a2 | 380 | #endif |
cd7c5726 | 381 | |
4aa2ba3a | 382 | #if defined(CONFIG_MMC) |
cd7c5726 SS |
383 | int board_mmc_init(bd_t *bis) |
384 | { | |
e3913f56 | 385 | return omap_mmc_init(0, 0, 0, -1, -1); |
cd7c5726 SS |
386 | } |
387 | #endif | |
f5c30c1b | 388 | |
4aa2ba3a | 389 | #if defined(CONFIG_MMC) |
aac5450e PK |
390 | void board_mmc_power_init(void) |
391 | { | |
392 | twl4030_power_mmc_init(0); | |
393 | } | |
394 | #endif | |
395 | ||
8850c5d5 | 396 | #if defined(CONFIG_USB_EHCI_HCD) |
f5c30c1b SH |
397 | static struct omap_usbhs_board_data usbhs_bdata = { |
398 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | |
399 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | |
400 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED | |
401 | }; | |
402 | ||
403 | #define GUMSTIX_GPIO_USBH_CPEN 168 | |
404 | int ehci_hcd_init(int index, enum usb_init_type init, | |
405 | struct ehci_hccr **hccr, struct ehci_hcor **hcor) | |
406 | { | |
407 | /* Enable USB power */ | |
408 | if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen")) | |
409 | gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1); | |
410 | ||
411 | return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); | |
412 | } | |
413 | ||
414 | int ehci_hcd_stop(void) | |
415 | { | |
416 | /* Disable USB power */ | |
417 | gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0); | |
418 | gpio_free(GUMSTIX_GPIO_USBH_CPEN); | |
419 | ||
420 | return omap_ehci_hcd_stop(); | |
421 | } | |
422 | ||
8850c5d5 | 423 | #endif /* CONFIG_USB_EHCI_HCD */ |