overo.c 10 KB

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