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 * 13 * SPDX-License-Identifier: GPL-2.0+ 14 */ 15 #include <common.h> 16 #include <dm.h> 17 #include <ns16550.h> 18 #include <netdev.h> 19 #include <twl4030.h> 20 #include <linux/mtd/nand.h> 21 #include <asm/io.h> 22 #include <asm/arch/mmc_host_def.h> 23 #include <asm/arch/mux.h> 24 #include <asm/arch/mem.h> 25 #include <asm/arch/sys_proto.h> 26 #include <asm/gpio.h> 27 #include <asm/mach-types.h> 28 #include "overo.h" 29 30 #ifdef CONFIG_USB_EHCI 31 #include <usb.h> 32 #include <asm/ehci-omap.h> 33 #endif 34 35 DECLARE_GLOBAL_DATA_PTR; 36 37 #define TWL4030_I2C_BUS 0 38 #define EXPANSION_EEPROM_I2C_BUS 2 39 #define EXPANSION_EEPROM_I2C_ADDRESS 0x51 40 41 #define GUMSTIX_EMPTY_EEPROM 0x0 42 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 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 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]; 68 } expansion_config = {0x0}; 69 70 static const struct ns16550_platdata overo_serial = { 71 OMAP34XX_UART3, 72 2, 73 V_NS16550_CLK 74 }; 75 76 U_BOOT_DEVICE(overo_uart) = { 77 "serial_omap", 78 &overo_serial 79 }; 80 81 /* 82 * Routine: board_init 83 * Description: Early hardware init. 84 */ 85 int board_init(void) 86 { 87 gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 88 /* board id for Linux */ 89 gd->bd->bi_arch_number = MACH_TYPE_OVERO; 90 /* boot param addr */ 91 gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 92 93 return 0; 94 } 95 96 /* 97 * Routine: get_board_revision 98 * Description: Returns the board revision 99 */ 100 int get_board_revision(void) 101 { 102 int revision; 103 104 #ifdef CONFIG_SYS_I2C_OMAP34XX 105 unsigned char data; 106 107 /* board revisions <= R2410 connect 4030 irq_1 to gpio112 */ 108 /* these boards should return a revision number of 0 */ 109 /* the code below forces a 4030 RTC irq to ensure that gpio112 is low */ 110 i2c_set_bus_num(TWL4030_I2C_BUS); 111 data = 0x01; 112 i2c_write(0x4B, 0x29, 1, &data, 1); 113 data = 0x0c; 114 i2c_write(0x4B, 0x2b, 1, &data, 1); 115 i2c_read(0x4B, 0x2a, 1, &data, 1); 116 #endif 117 118 if (!gpio_request(112, "") && 119 !gpio_request(113, "") && 120 !gpio_request(115, "")) { 121 122 gpio_direction_input(112); 123 gpio_direction_input(113); 124 gpio_direction_input(115); 125 126 revision = gpio_get_value(115) << 2 | 127 gpio_get_value(113) << 1 | 128 gpio_get_value(112); 129 } else { 130 puts("Error: unable to acquire board revision GPIOs\n"); 131 revision = -1; 132 } 133 134 return revision; 135 } 136 137 #ifdef CONFIG_SPL_BUILD 138 /* 139 * Routine: get_board_mem_timings 140 * Description: If we use SPL then there is no x-loader nor config header 141 * so we have to setup the DDR timings ourself on both banks. 142 */ 143 void get_board_mem_timings(struct board_sdrc_timings *timings) 144 { 145 timings->mr = MICRON_V_MR_165; 146 switch (get_board_revision()) { 147 case REVISION_0: /* Micron 1286MB/256MB, 1/2 banks of 128MB */ 148 timings->mcfg = MICRON_V_MCFG_165(128 << 20); 149 timings->ctrla = MICRON_V_ACTIMA_165; 150 timings->ctrlb = MICRON_V_ACTIMB_165; 151 timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 152 break; 153 case REVISION_1: /* Micron 256MB/512MB, 1/2 banks of 256MB */ 154 case REVISION_4: 155 timings->mcfg = MICRON_V_MCFG_200(256 << 20); 156 timings->ctrla = MICRON_V_ACTIMA_200; 157 timings->ctrlb = MICRON_V_ACTIMB_200; 158 timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 159 break; 160 case REVISION_2: /* Hynix 256MB/512MB, 1/2 banks of 256MB */ 161 timings->mcfg = HYNIX_V_MCFG_200(256 << 20); 162 timings->ctrla = HYNIX_V_ACTIMA_200; 163 timings->ctrlb = HYNIX_V_ACTIMB_200; 164 timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 165 break; 166 case REVISION_3: /* Micron 512MB/1024MB, 1/2 banks of 512MB */ 167 timings->mcfg = MCFG(512 << 20, 15); 168 timings->ctrla = MICRON_V_ACTIMA_200; 169 timings->ctrlb = MICRON_V_ACTIMB_200; 170 timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 171 break; 172 default: 173 timings->mcfg = MICRON_V_MCFG_165(128 << 20); 174 timings->ctrla = MICRON_V_ACTIMA_165; 175 timings->ctrlb = MICRON_V_ACTIMB_165; 176 timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 177 } 178 } 179 #endif 180 181 /* 182 * Routine: get_sdio2_config 183 * Description: Return information about the wifi module connection 184 * Returns 0 if the module connects though a level translator 185 * Returns 1 if the module connects directly 186 */ 187 int get_sdio2_config(void) 188 { 189 int sdio_direct; 190 191 if (!gpio_request(130, "") && !gpio_request(139, "")) { 192 193 gpio_direction_output(130, 0); 194 gpio_direction_input(139); 195 196 sdio_direct = 1; 197 gpio_set_value(130, 0); 198 if (gpio_get_value(139) == 0) { 199 gpio_set_value(130, 1); 200 if (gpio_get_value(139) == 1) 201 sdio_direct = 0; 202 } 203 204 gpio_direction_input(130); 205 } else { 206 puts("Error: unable to acquire sdio2 clk GPIOs\n"); 207 sdio_direct = -1; 208 } 209 210 return sdio_direct; 211 } 212 213 /* 214 * Routine: get_expansion_id 215 * Description: This function checks for expansion board by checking I2C 216 * bus 2 for the availability of an AT24C01B serial EEPROM. 217 * returns the device_vendor field from the EEPROM 218 */ 219 unsigned int get_expansion_id(void) 220 { 221 if (expansion_config.device_vendor != 0x0) 222 return expansion_config.device_vendor; 223 224 i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); 225 226 /* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */ 227 if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { 228 i2c_set_bus_num(TWL4030_I2C_BUS); 229 return GUMSTIX_NO_EEPROM; 230 } 231 232 /* read configuration data */ 233 i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, 234 sizeof(expansion_config)); 235 236 i2c_set_bus_num(TWL4030_I2C_BUS); 237 238 return expansion_config.device_vendor; 239 } 240 241 /* 242 * Routine: misc_init_r 243 * Description: Configure board specific parts 244 */ 245 int misc_init_r(void) 246 { 247 unsigned int expansion_id; 248 249 twl4030_power_init(); 250 twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 251 252 printf("Board revision: %d\n", get_board_revision()); 253 254 switch (get_sdio2_config()) { 255 case 0: 256 puts("Tranceiver detected on mmc2\n"); 257 MUX_OVERO_SDIO2_TRANSCEIVER(); 258 break; 259 case 1: 260 puts("Direct connection on mmc2\n"); 261 MUX_OVERO_SDIO2_DIRECT(); 262 break; 263 default: 264 puts("Unable to detect mmc2 connection type\n"); 265 } 266 267 expansion_id = get_expansion_id(); 268 switch (expansion_id) { 269 case GUMSTIX_SUMMIT: 270 printf("Recognized Summit expansion board (rev %d %s)\n", 271 expansion_config.revision, 272 expansion_config.fab_revision); 273 MUX_GUMSTIX(); 274 setenv("defaultdisplay", "dvi"); 275 setenv("expansionname", "summit"); 276 break; 277 case GUMSTIX_TOBI: 278 printf("Recognized Tobi expansion board (rev %d %s)\n", 279 expansion_config.revision, 280 expansion_config.fab_revision); 281 MUX_GUMSTIX(); 282 setenv("defaultdisplay", "dvi"); 283 setenv("expansionname", "tobi"); 284 break; 285 case GUMSTIX_TOBI_DUO: 286 printf("Recognized Tobi Duo expansion board (rev %d %s)\n", 287 expansion_config.revision, 288 expansion_config.fab_revision); 289 MUX_GUMSTIX(); 290 break; 291 case GUMSTIX_PALO35: 292 printf("Recognized Palo35 expansion board (rev %d %s)\n", 293 expansion_config.revision, 294 expansion_config.fab_revision); 295 MUX_GUMSTIX(); 296 setenv("defaultdisplay", "lcd35"); 297 break; 298 case GUMSTIX_PALO43: 299 printf("Recognized Palo43 expansion board (rev %d %s)\n", 300 expansion_config.revision, 301 expansion_config.fab_revision); 302 MUX_GUMSTIX(); 303 setenv("defaultdisplay", "lcd43"); 304 setenv("expansionname", "palo43"); 305 break; 306 case GUMSTIX_CHESTNUT43: 307 printf("Recognized Chestnut43 expansion board (rev %d %s)\n", 308 expansion_config.revision, 309 expansion_config.fab_revision); 310 MUX_GUMSTIX(); 311 setenv("defaultdisplay", "lcd43"); 312 setenv("expansionname", "chestnut43"); 313 break; 314 case GUMSTIX_PINTO: 315 printf("Recognized Pinto expansion board (rev %d %s)\n", 316 expansion_config.revision, 317 expansion_config.fab_revision); 318 MUX_GUMSTIX(); 319 break; 320 case GUMSTIX_GALLOP43: 321 printf("Recognized Gallop43 expansion board (rev %d %s)\n", 322 expansion_config.revision, 323 expansion_config.fab_revision); 324 MUX_GUMSTIX(); 325 setenv("defaultdisplay", "lcd43"); 326 setenv("expansionname", "gallop43"); 327 break; 328 case GUMSTIX_ALTO35: 329 printf("Recognized Alto35 expansion board (rev %d %s)\n", 330 expansion_config.revision, 331 expansion_config.fab_revision); 332 MUX_GUMSTIX(); 333 MUX_ALTO35(); 334 setenv("defaultdisplay", "lcd35"); 335 setenv("expansionname", "alto35"); 336 break; 337 case GUMSTIX_STAGECOACH: 338 printf("Recognized Stagecoach expansion board (rev %d %s)\n", 339 expansion_config.revision, 340 expansion_config.fab_revision); 341 MUX_GUMSTIX(); 342 break; 343 case GUMSTIX_THUMBO: 344 printf("Recognized Thumbo expansion board (rev %d %s)\n", 345 expansion_config.revision, 346 expansion_config.fab_revision); 347 MUX_GUMSTIX(); 348 break; 349 case GUMSTIX_TURTLECORE: 350 printf("Recognized Turtlecore expansion board (rev %d %s)\n", 351 expansion_config.revision, 352 expansion_config.fab_revision); 353 MUX_GUMSTIX(); 354 break; 355 case GUMSTIX_ARBOR43C: 356 printf("Recognized Arbor43C expansion board (rev %d %s)\n", 357 expansion_config.revision, 358 expansion_config.fab_revision); 359 MUX_GUMSTIX(); 360 MUX_ARBOR43C(); 361 setenv("defaultdisplay", "lcd43"); 362 break; 363 case ETTUS_USRP_E: 364 printf("Recognized Ettus Research USRP-E (rev %d %s)\n", 365 expansion_config.revision, 366 expansion_config.fab_revision); 367 MUX_GUMSTIX(); 368 MUX_USRP_E(); 369 setenv("defaultdisplay", "dvi"); 370 break; 371 case GUMSTIX_NO_EEPROM: 372 case GUMSTIX_EMPTY_EEPROM: 373 puts("No or empty EEPROM on expansion board\n"); 374 MUX_GUMSTIX(); 375 setenv("expansionname", "tobi"); 376 break; 377 default: 378 printf("Unrecognized expansion board 0x%08x\n", expansion_id); 379 break; 380 } 381 382 if (expansion_config.content == 1) 383 setenv(expansion_config.env_var, expansion_config.env_setting); 384 385 dieid_num_r(); 386 387 if (get_cpu_family() == CPU_OMAP34XX) 388 setenv("boardname", "overo"); 389 else 390 setenv("boardname", "overo-storm"); 391 392 return 0; 393 } 394 395 /* 396 * Routine: set_muxconf_regs 397 * Description: Setting up the configuration Mux registers specific to the 398 * hardware. Many pins need to be moved from protect to primary 399 * mode. 400 */ 401 void set_muxconf_regs(void) 402 { 403 MUX_OVERO(); 404 } 405 406 #if defined(CONFIG_CMD_NET) && !defined(CONFIG_SPL_BUILD) 407 /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ 408 static const u32 gpmc_lan_config[] = { 409 NET_LAN9221_GPMC_CONFIG1, 410 NET_LAN9221_GPMC_CONFIG2, 411 NET_LAN9221_GPMC_CONFIG3, 412 NET_LAN9221_GPMC_CONFIG4, 413 NET_LAN9221_GPMC_CONFIG5, 414 NET_LAN9221_GPMC_CONFIG6, 415 /*CONFIG7- computed as params */ 416 }; 417 418 /* 419 * Routine: setup_net_chip 420 * Description: Setting up the configuration GPMC registers specific to the 421 * Ethernet hardware. 422 */ 423 static void setup_net_chip(void) 424 { 425 struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 426 427 /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 428 writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 429 /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 430 writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 431 /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 432 writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 433 &ctrl_base->gpmc_nadv_ale); 434 } 435 436 /* 437 * Routine: reset_net_chip 438 * Description: Reset the Ethernet hardware. 439 */ 440 static void reset_net_chip(void) 441 { 442 /* Make GPIO 64 as output pin and send a magic pulse through it */ 443 if (!gpio_request(64, "")) { 444 gpio_direction_output(64, 0); 445 gpio_set_value(64, 1); 446 udelay(1); 447 gpio_set_value(64, 0); 448 udelay(1); 449 gpio_set_value(64, 1); 450 } 451 } 452 453 int board_eth_init(bd_t *bis) 454 { 455 unsigned int expansion_id; 456 int rc = 0; 457 458 #ifdef CONFIG_SMC911X 459 expansion_id = get_expansion_id(); 460 switch (expansion_id) { 461 case GUMSTIX_TOBI_DUO: 462 /* second lan chip */ 463 enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 464 0x2B000000, GPMC_SIZE_16M); 465 /* no break */ 466 case GUMSTIX_TOBI: 467 case GUMSTIX_CHESTNUT43: 468 case GUMSTIX_STAGECOACH: 469 case GUMSTIX_NO_EEPROM: 470 case GUMSTIX_EMPTY_EEPROM: 471 /* first lan chip */ 472 enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 473 0x2C000000, GPMC_SIZE_16M); 474 475 setup_net_chip(); 476 reset_net_chip(); 477 478 rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 479 break; 480 default: 481 break; 482 } 483 #endif 484 485 return rc; 486 } 487 #endif 488 489 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 490 int board_mmc_init(bd_t *bis) 491 { 492 return omap_mmc_init(0, 0, 0, -1, -1); 493 } 494 #endif 495 496 #if defined(CONFIG_GENERIC_MMC) 497 void board_mmc_power_init(void) 498 { 499 twl4030_power_mmc_init(0); 500 } 501 #endif 502 503 #if defined(CONFIG_USB_EHCI) && !defined(CONFIG_SPL_BUILD) 504 static struct omap_usbhs_board_data usbhs_bdata = { 505 .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, 506 .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 507 .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED 508 }; 509 510 #define GUMSTIX_GPIO_USBH_CPEN 168 511 int ehci_hcd_init(int index, enum usb_init_type init, 512 struct ehci_hccr **hccr, struct ehci_hcor **hcor) 513 { 514 /* Enable USB power */ 515 if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen")) 516 gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1); 517 518 return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); 519 } 520 521 int ehci_hcd_stop(void) 522 { 523 /* Disable USB power */ 524 gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0); 525 gpio_free(GUMSTIX_GPIO_USBH_CPEN); 526 527 return omap_ehci_hcd_stop(); 528 } 529 530 #endif /* CONFIG_USB_EHCI */ 531