vision2.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. /*
  2. * (C) Copyright 2010
  3. * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
  4. *
  5. * (C) Copyright 2009 Freescale Semiconductor, Inc.
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <asm/io.h>
  11. #include <asm/arch/imx-regs.h>
  12. #include <asm/arch/crm_regs.h>
  13. #include <asm/arch/clock.h>
  14. #include <asm/arch/iomux-mx51.h>
  15. #include <asm/gpio.h>
  16. #include <asm/arch/sys_proto.h>
  17. #include <asm/imx-common/spi.h>
  18. #include <i2c.h>
  19. #include <mmc.h>
  20. #include <power/pmic.h>
  21. #include <fsl_esdhc.h>
  22. #include <fsl_pmic.h>
  23. #include <mc13892.h>
  24. #include <linux/fb.h>
  25. #include <ipu_pixfmt.h>
  26. DECLARE_GLOBAL_DATA_PTR;
  27. static struct fb_videomode const nec_nl6448bc26_09c = {
  28. "NEC_NL6448BC26-09C",
  29. 60, /* Refresh */
  30. 640, /* xres */
  31. 480, /* yres */
  32. 37650, /* pixclock = 26.56Mhz */
  33. 48, /* left margin */
  34. 16, /* right margin */
  35. 31, /* upper margin */
  36. 12, /* lower margin */
  37. 96, /* hsync-len */
  38. 2, /* vsync-len */
  39. 0, /* sync */
  40. FB_VMODE_NONINTERLACED, /* vmode */
  41. 0, /* flag */
  42. };
  43. #ifdef CONFIG_HW_WATCHDOG
  44. #include <watchdog.h>
  45. void hw_watchdog_reset(void)
  46. {
  47. int val;
  48. /* toggle watchdog trigger pin */
  49. val = gpio_get_value(IMX_GPIO_NR(3, 2));
  50. val = val ? 0 : 1;
  51. gpio_set_value(IMX_GPIO_NR(3, 2), val);
  52. }
  53. #endif
  54. static void init_drive_strength(void)
  55. {
  56. static const iomux_v3_cfg_t ddr_pads[] = {
  57. NEW_PAD_CTRL(MX51_GRP_PKEDDR, 0),
  58. NEW_PAD_CTRL(MX51_GRP_PKEADDR, PAD_CTL_PKE),
  59. NEW_PAD_CTRL(MX51_GRP_DDRAPKS, 0),
  60. NEW_PAD_CTRL(MX51_GRP_DDRAPUS, PAD_CTL_PUS_100K_UP),
  61. NEW_PAD_CTRL(MX51_GRP_DDR_SR_A1, PAD_CTL_SRE_FAST),
  62. NEW_PAD_CTRL(MX51_GRP_DDR_A0, PAD_CTL_DSE_HIGH),
  63. NEW_PAD_CTRL(MX51_GRP_DDR_A1, PAD_CTL_DSE_HIGH),
  64. NEW_PAD_CTRL(MX51_PAD_DRAM_RAS__DRAM_RAS,
  65. PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
  66. NEW_PAD_CTRL(MX51_PAD_DRAM_CAS__DRAM_CAS,
  67. PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
  68. NEW_PAD_CTRL(MX51_GRP_PKEDDR, PAD_CTL_PKE),
  69. NEW_PAD_CTRL(MX51_GRP_DDRPKS, 0),
  70. NEW_PAD_CTRL(MX51_GRP_HYSDDR0, 0),
  71. NEW_PAD_CTRL(MX51_GRP_HYSDDR1, 0),
  72. NEW_PAD_CTRL(MX51_GRP_HYSDDR2, 0),
  73. NEW_PAD_CTRL(MX51_GRP_HYSDDR3, 0),
  74. NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B0, PAD_CTL_SRE_FAST),
  75. NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B1, PAD_CTL_SRE_FAST),
  76. NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B2, PAD_CTL_SRE_FAST),
  77. NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B4, PAD_CTL_SRE_FAST),
  78. NEW_PAD_CTRL(MX51_GRP_DDRPUS, PAD_CTL_PUS_100K_UP),
  79. NEW_PAD_CTRL(MX51_GRP_INMODE1, 0),
  80. NEW_PAD_CTRL(MX51_GRP_DRAM_B0, PAD_CTL_DSE_MED),
  81. NEW_PAD_CTRL(MX51_GRP_DRAM_B1, PAD_CTL_DSE_MED),
  82. NEW_PAD_CTRL(MX51_GRP_DRAM_B2, PAD_CTL_DSE_MED),
  83. NEW_PAD_CTRL(MX51_GRP_DRAM_B4, PAD_CTL_DSE_MED),
  84. NEW_PAD_CTRL(MX51_PAD_DRAM_SDWE__DRAM_SDWE, MX51_GPIO_PAD_CTRL),
  85. NEW_PAD_CTRL(MX51_PAD_DRAM_SDCKE0__DRAM_SDCKE0,
  86. MX51_GPIO_PAD_CTRL),
  87. NEW_PAD_CTRL(MX51_PAD_DRAM_SDCKE1__DRAM_SDCKE1,
  88. MX51_GPIO_PAD_CTRL),
  89. NEW_PAD_CTRL(MX51_PAD_DRAM_SDCLK__DRAM_SDCLK,
  90. MX51_GPIO_PAD_CTRL),
  91. NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS0__DRAM_SDQS0,
  92. MX51_GPIO_PAD_CTRL),
  93. NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS1__DRAM_SDQS1,
  94. MX51_GPIO_PAD_CTRL),
  95. NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS2__DRAM_SDQS2,
  96. MX51_GPIO_PAD_CTRL),
  97. NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS3__DRAM_SDQS3,
  98. MX51_GPIO_PAD_CTRL),
  99. NEW_PAD_CTRL(MX51_PAD_DRAM_CS0__DRAM_CS0, MX51_GPIO_PAD_CTRL),
  100. NEW_PAD_CTRL(MX51_PAD_DRAM_CS1__DRAM_CS1, MX51_GPIO_PAD_CTRL),
  101. NEW_PAD_CTRL(MX51_PAD_DRAM_DQM0__DRAM_DQM0, MX51_GPIO_PAD_CTRL),
  102. NEW_PAD_CTRL(MX51_PAD_DRAM_DQM1__DRAM_DQM1, MX51_GPIO_PAD_CTRL),
  103. NEW_PAD_CTRL(MX51_PAD_DRAM_DQM2__DRAM_DQM2, MX51_GPIO_PAD_CTRL),
  104. NEW_PAD_CTRL(MX51_PAD_DRAM_DQM3__DRAM_DQM3, MX51_GPIO_PAD_CTRL),
  105. };
  106. imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
  107. }
  108. int dram_init(void)
  109. {
  110. gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1,
  111. PHYS_SDRAM_1_SIZE);
  112. return 0;
  113. }
  114. static void setup_weim(void)
  115. {
  116. struct weim *pweim = (struct weim *)WEIM_BASE_ADDR;
  117. pweim->cs0gcr1 = 0x004100b9;
  118. pweim->cs0gcr2 = 0x00000001;
  119. pweim->cs0rcr1 = 0x0a018000;
  120. pweim->cs0rcr2 = 0;
  121. pweim->cs0wcr1 = 0x0704a240;
  122. }
  123. static void setup_uart(void)
  124. {
  125. static const iomux_v3_cfg_t uart_pads[] = {
  126. MX51_PAD_EIM_D25__UART3_RXD, /* console RX */
  127. MX51_PAD_EIM_D26__UART3_TXD, /* console TX */
  128. };
  129. imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
  130. }
  131. #ifdef CONFIG_MXC_SPI
  132. int board_spi_cs_gpio(unsigned bus, unsigned cs)
  133. {
  134. return (bus == 0 && cs == 1) ? 121 : -1;
  135. }
  136. void spi_io_init(void)
  137. {
  138. static const iomux_v3_cfg_t spi_pads[] = {
  139. NEW_PAD_CTRL(MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI, PAD_CTL_HYS |
  140. PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  141. NEW_PAD_CTRL(MX51_PAD_CSPI1_MISO__ECSPI1_MISO, PAD_CTL_HYS |
  142. PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  143. NEW_PAD_CTRL(MX51_PAD_CSPI1_SS0__ECSPI1_SS0, PAD_CTL_HYS |
  144. PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  145. NEW_PAD_CTRL(MX51_PAD_CSPI1_SS1__ECSPI1_SS1, PAD_CTL_HYS |
  146. PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  147. NEW_PAD_CTRL(MX51_PAD_DI1_PIN11__ECSPI1_SS2, PAD_CTL_HYS |
  148. PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  149. NEW_PAD_CTRL(MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK, PAD_CTL_HYS |
  150. PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
  151. };
  152. imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
  153. }
  154. static void reset_peripherals(int reset)
  155. {
  156. #ifdef CONFIG_VISION2_HW_1_0
  157. static const iomux_v3_cfg_t fec_cfg_pads[] = {
  158. /* RXD1 */
  159. NEW_PAD_CTRL(MX51_PAD_EIM_EB3__GPIO2_23, NO_PAD_CTRL),
  160. /* RXD2 */
  161. NEW_PAD_CTRL(MX51_PAD_EIM_CS2__GPIO2_27, NO_PAD_CTRL),
  162. /* RXD3 */
  163. NEW_PAD_CTRL(MX51_PAD_EIM_CS3__GPIO2_28, NO_PAD_CTRL),
  164. /* RXER */
  165. NEW_PAD_CTRL(MX51_PAD_EIM_CS4__GPIO2_29, NO_PAD_CTRL),
  166. /* COL */
  167. NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__GPIO3_10, NO_PAD_CTRL),
  168. /* RCLK */
  169. NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__GPIO3_11, NO_PAD_CTRL),
  170. /* RXD0 */
  171. NEW_PAD_CTRL(MX51_PAD_NANDF_D9__GPIO3_31, NO_PAD_CTRL),
  172. };
  173. static const iomux_v3_cfg_t fec_pads[] = {
  174. NEW_PAD_CTRL(MX51_PAD_EIM_CS3__FEC_RDATA3, MX51_PAD_CTRL_2),
  175. NEW_PAD_CTRL(MX51_PAD_EIM_CS2__FEC_RDATA2, MX51_PAD_CTRL_2),
  176. NEW_PAD_CTRL(MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_CTRL_2),
  177. MX51_PAD_NANDF_D9__FEC_RDATA0,
  178. NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__FEC_RX_CLK, MX51_PAD_CTRL_4),
  179. MX51_PAD_EIM_CS4__FEC_RX_ER,
  180. NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__FEC_COL, MX51_PAD_CTRL_4),
  181. };
  182. #endif
  183. if (reset) {
  184. /* reset_n is on NANDF_D15 */
  185. gpio_direction_output(IMX_GPIO_NR(3, 25), 0);
  186. #ifdef CONFIG_VISION2_HW_1_0
  187. /*
  188. * set FEC Configuration lines
  189. * set levels of FEC config lines
  190. */
  191. gpio_direction_output(IMX_GPIO_NR(3, 11), 0);
  192. gpio_direction_output(IMX_GPIO_NR(3, 10), 1);
  193. gpio_direction_output(IMX_GPIO_NR(3, 31), 1);
  194. /* set direction of FEC config lines */
  195. gpio_direction_output(IMX_GPIO_NR(2, 27), 0);
  196. gpio_direction_output(IMX_GPIO_NR(2, 28), 0);
  197. gpio_direction_output(IMX_GPIO_NR(2, 29), 0);
  198. gpio_direction_output(IMX_GPIO_NR(2, 23), 1);
  199. imx_iomux_v3_setup_multiple_pads(fec_cfg_pads,
  200. ARRAY_SIZE(fec_cfg_pads));
  201. #endif
  202. /* activate reset_n pin */
  203. imx_iomux_v3_setup_pad(
  204. NEW_PAD_CTRL(MX51_PAD_NANDF_D15__GPIO3_25,
  205. PAD_CTL_DSE_MAX));
  206. } else {
  207. /* set FEC Control lines */
  208. gpio_direction_input(IMX_GPIO_NR(3, 25));
  209. udelay(500);
  210. #ifdef CONFIG_VISION2_HW_1_0
  211. imx_iomux_v3_setup_multiple_pads(fec_pads,
  212. ARRAY_SIZE(fec_pads));
  213. #endif
  214. }
  215. }
  216. static void power_init_mx51(void)
  217. {
  218. unsigned int val;
  219. struct pmic *p;
  220. int ret;
  221. ret = pmic_init(I2C_PMIC);
  222. if (ret)
  223. return;
  224. p = pmic_get("FSL_PMIC");
  225. if (!p)
  226. return;
  227. /* Write needed to Power Gate 2 register */
  228. pmic_reg_read(p, REG_POWER_MISC, &val);
  229. /* enable VCAM with 2.775V to enable read from PMIC */
  230. val = VCAMCONFIG | VCAMEN;
  231. pmic_reg_write(p, REG_MODE_1, val);
  232. /*
  233. * Set switchers in Auto in NORMAL mode & STANDBY mode
  234. * Setup the switcher mode for SW1 & SW2
  235. */
  236. pmic_reg_read(p, REG_SW_4, &val);
  237. val = (val & ~((SWMODE_MASK << SWMODE1_SHIFT) |
  238. (SWMODE_MASK << SWMODE2_SHIFT)));
  239. val |= (SWMODE_AUTO_AUTO << SWMODE1_SHIFT) |
  240. (SWMODE_AUTO_AUTO << SWMODE2_SHIFT);
  241. pmic_reg_write(p, REG_SW_4, val);
  242. /* Setup the switcher mode for SW3 & SW4 */
  243. pmic_reg_read(p, REG_SW_5, &val);
  244. val &= ~((SWMODE_MASK << SWMODE4_SHIFT) |
  245. (SWMODE_MASK << SWMODE3_SHIFT));
  246. val |= (SWMODE_AUTO_AUTO << SWMODE4_SHIFT) |
  247. (SWMODE_AUTO_AUTO << SWMODE3_SHIFT);
  248. pmic_reg_write(p, REG_SW_5, val);
  249. /* Set VGEN3 to 1.8V, VCAM to 3.0V */
  250. pmic_reg_read(p, REG_SETTING_0, &val);
  251. val &= ~(VCAM_MASK | VGEN3_MASK);
  252. val |= VCAM_3_0;
  253. pmic_reg_write(p, REG_SETTING_0, val);
  254. /* Set VVIDEO to 2.775V, VAUDIO to 3V0, VSD to 1.8V */
  255. pmic_reg_read(p, REG_SETTING_1, &val);
  256. val &= ~(VVIDEO_MASK | VSD_MASK | VAUDIO_MASK);
  257. val |= VVIDEO_2_775 | VAUDIO_3_0 | VSD_1_8;
  258. pmic_reg_write(p, REG_SETTING_1, val);
  259. /* Configure VGEN3 and VCAM regulators to use external PNP */
  260. val = VGEN3CONFIG | VCAMCONFIG;
  261. pmic_reg_write(p, REG_MODE_1, val);
  262. udelay(200);
  263. /* Enable VGEN3, VCAM, VAUDIO, VVIDEO, VSD regulators */
  264. val = VGEN3EN | VGEN3CONFIG | VCAMEN | VCAMCONFIG |
  265. VVIDEOEN | VAUDIOEN | VSDEN;
  266. pmic_reg_write(p, REG_MODE_1, val);
  267. pmic_reg_read(p, REG_POWER_CTL2, &val);
  268. val |= WDIRESET;
  269. pmic_reg_write(p, REG_POWER_CTL2, val);
  270. udelay(2500);
  271. }
  272. #endif
  273. static void setup_gpios(void)
  274. {
  275. static const iomux_v3_cfg_t gpio_pads_1[] = {
  276. NEW_PAD_CTRL(MX51_PAD_GPIO1_7__GPIO1_7, PAD_CTL_PKE |
  277. PAD_CTL_DSE_MED), /* CAM_SUP_DISn */
  278. NEW_PAD_CTRL(MX51_PAD_DI1_PIN12__GPIO3_1, PAD_CTL_PKE |
  279. PAD_CTL_DSE_MED), /* DAB Display EN */
  280. NEW_PAD_CTRL(MX51_PAD_DI1_PIN13__GPIO3_2, PAD_CTL_PKE |
  281. PAD_CTL_DSE_MED), /* WDOG_TRIGGER */
  282. };
  283. static const iomux_v3_cfg_t gpio_pads_2[] = {
  284. NEW_PAD_CTRL(MX51_PAD_DI1_D0_CS__GPIO3_3, PAD_CTL_PKE |
  285. PAD_CTL_DSE_MED), /* Display2 TxEN */
  286. NEW_PAD_CTRL(MX51_PAD_DI1_D1_CS__GPIO3_4, PAD_CTL_PKE |
  287. PAD_CTL_DSE_MED), /* DAB Light EN */
  288. NEW_PAD_CTRL(MX51_PAD_DISPB2_SER_DIN__GPIO3_5, PAD_CTL_PKE |
  289. PAD_CTL_DSE_MED), /* AUDIO_MUTE */
  290. NEW_PAD_CTRL(MX51_PAD_DISPB2_SER_DIO__GPIO3_6, PAD_CTL_PKE |
  291. PAD_CTL_DSE_MED), /* SPARE_OUT */
  292. NEW_PAD_CTRL(MX51_PAD_NANDF_D14__GPIO3_26, PAD_CTL_PKE |
  293. PAD_CTL_DSE_MED), /* BEEPER_EN */
  294. NEW_PAD_CTRL(MX51_PAD_NANDF_D13__GPIO3_27, PAD_CTL_PKE |
  295. PAD_CTL_DSE_MED), /* POWER_OFF */
  296. NEW_PAD_CTRL(MX51_PAD_NANDF_D10__GPIO3_30, PAD_CTL_PKE |
  297. PAD_CTL_DSE_MED), /* FRAM_WE */
  298. NEW_PAD_CTRL(MX51_PAD_CSPI1_RDY__GPIO4_26, PAD_CTL_PKE |
  299. PAD_CTL_DSE_MED), /* EXPANSION_EN */
  300. MX51_PAD_GPIO1_2__PWM1_PWMO,
  301. };
  302. unsigned int i;
  303. imx_iomux_v3_setup_multiple_pads(gpio_pads_1, ARRAY_SIZE(gpio_pads_1));
  304. /* Now we need to trigger the watchdog */
  305. WATCHDOG_RESET();
  306. imx_iomux_v3_setup_multiple_pads(gpio_pads_2, ARRAY_SIZE(gpio_pads_2));
  307. /*
  308. * Set GPIO1_4 to high and output; it is used to reset
  309. * the system on reboot
  310. */
  311. gpio_direction_output(IMX_GPIO_NR(1, 4), 1);
  312. gpio_direction_output(IMX_GPIO_NR(1, 7), 0);
  313. for (i = IMX_GPIO_NR(3, 1); i < IMX_GPIO_NR(3, 7); i++)
  314. gpio_direction_output(i, 0);
  315. gpio_direction_output(IMX_GPIO_NR(3, 30), 0);
  316. /* Set POWER_OFF high */
  317. gpio_direction_output(IMX_GPIO_NR(3, 27), 1);
  318. gpio_direction_output(IMX_GPIO_NR(3, 26), 0);
  319. gpio_direction_output(IMX_GPIO_NR(4, 26), 0);
  320. gpio_direction_output(IMX_GPIO_NR(4, 25), 1);
  321. WATCHDOG_RESET();
  322. }
  323. static void setup_fec(void)
  324. {
  325. static const iomux_v3_cfg_t fec_pads[] = {
  326. NEW_PAD_CTRL(MX51_PAD_EIM_EB2__FEC_MDIO, PAD_CTL_HYS |
  327. PAD_CTL_PUS_22K_UP | PAD_CTL_ODE |
  328. PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
  329. MX51_PAD_NANDF_CS3__FEC_MDC,
  330. NEW_PAD_CTRL(MX51_PAD_EIM_CS3__FEC_RDATA3, MX51_PAD_CTRL_2),
  331. NEW_PAD_CTRL(MX51_PAD_EIM_CS2__FEC_RDATA2, MX51_PAD_CTRL_2),
  332. NEW_PAD_CTRL(MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_CTRL_2),
  333. MX51_PAD_NANDF_D9__FEC_RDATA0,
  334. MX51_PAD_NANDF_CS6__FEC_TDATA3,
  335. MX51_PAD_NANDF_CS5__FEC_TDATA2,
  336. MX51_PAD_NANDF_CS4__FEC_TDATA1,
  337. MX51_PAD_NANDF_D8__FEC_TDATA0,
  338. MX51_PAD_NANDF_CS7__FEC_TX_EN,
  339. MX51_PAD_NANDF_CS2__FEC_TX_ER,
  340. MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK,
  341. NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__FEC_COL, MX51_PAD_CTRL_4),
  342. NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__FEC_RX_CLK, MX51_PAD_CTRL_4),
  343. MX51_PAD_EIM_CS5__FEC_CRS,
  344. MX51_PAD_EIM_CS4__FEC_RX_ER,
  345. NEW_PAD_CTRL(MX51_PAD_NANDF_D11__FEC_RX_DV, MX51_PAD_CTRL_4),
  346. };
  347. imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
  348. }
  349. struct fsl_esdhc_cfg esdhc_cfg[1] = {
  350. {MMC_SDHC1_BASE_ADDR},
  351. };
  352. int get_mmc_getcd(u8 *cd, struct mmc *mmc)
  353. {
  354. struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
  355. if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
  356. *cd = gpio_get_value(IMX_GPIO_NR(1, 0));
  357. else
  358. *cd = 0;
  359. return 0;
  360. }
  361. #ifdef CONFIG_FSL_ESDHC
  362. int board_mmc_init(bd_t *bis)
  363. {
  364. static const iomux_v3_cfg_t sd1_pads[] = {
  365. NEW_PAD_CTRL(MX51_PAD_SD1_CMD__SD1_CMD, PAD_CTL_DSE_MAX |
  366. PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
  367. NEW_PAD_CTRL(MX51_PAD_SD1_CLK__SD1_CLK, PAD_CTL_DSE_MAX |
  368. PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
  369. NEW_PAD_CTRL(MX51_PAD_SD1_DATA0__SD1_DATA0, PAD_CTL_DSE_MAX |
  370. PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
  371. NEW_PAD_CTRL(MX51_PAD_SD1_DATA1__SD1_DATA1, PAD_CTL_DSE_MAX |
  372. PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
  373. NEW_PAD_CTRL(MX51_PAD_SD1_DATA2__SD1_DATA2, PAD_CTL_DSE_MAX |
  374. PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
  375. NEW_PAD_CTRL(MX51_PAD_SD1_DATA3__SD1_DATA3, PAD_CTL_DSE_MAX |
  376. PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_SRE_FAST),
  377. NEW_PAD_CTRL(MX51_PAD_GPIO1_0__SD1_CD, PAD_CTL_HYS),
  378. NEW_PAD_CTRL(MX51_PAD_GPIO1_1__SD1_WP, PAD_CTL_HYS),
  379. };
  380. imx_iomux_v3_setup_multiple_pads(sd1_pads, ARRAY_SIZE(sd1_pads));
  381. esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
  382. return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
  383. }
  384. #endif
  385. void lcd_enable(void)
  386. {
  387. static const iomux_v3_cfg_t lcd_pads[] = {
  388. MX51_PAD_DI1_PIN2__DI1_PIN2,
  389. MX51_PAD_DI1_PIN3__DI1_PIN3,
  390. };
  391. int ret;
  392. imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
  393. gpio_set_value(IMX_GPIO_NR(1, 2), 1);
  394. imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_2__GPIO1_2,
  395. NO_PAD_CTRL));
  396. ret = ipuv3_fb_init(&nec_nl6448bc26_09c, 0, IPU_PIX_FMT_RGB666);
  397. if (ret)
  398. puts("LCD cannot be configured\n");
  399. }
  400. int board_early_init_f(void)
  401. {
  402. init_drive_strength();
  403. /* Setup debug led */
  404. gpio_direction_output(IMX_GPIO_NR(1, 6), 0);
  405. imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_6__GPIO1_6,
  406. PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST));
  407. /* wait a little while to give the pll time to settle */
  408. sdelay(100000);
  409. setup_weim();
  410. setup_uart();
  411. setup_fec();
  412. setup_gpios();
  413. spi_io_init();
  414. return 0;
  415. }
  416. static void backlight(int on)
  417. {
  418. if (on) {
  419. gpio_set_value(IMX_GPIO_NR(3, 1), 1);
  420. udelay(10000);
  421. gpio_set_value(IMX_GPIO_NR(3, 4), 1);
  422. } else {
  423. gpio_set_value(IMX_GPIO_NR(3, 1), 0);
  424. gpio_set_value(IMX_GPIO_NR(3, 4), 0);
  425. }
  426. }
  427. int board_init(void)
  428. {
  429. /* address of boot parameters */
  430. gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
  431. lcd_enable();
  432. backlight(1);
  433. return 0;
  434. }
  435. int board_late_init(void)
  436. {
  437. power_init_mx51();
  438. reset_peripherals(1);
  439. udelay(2000);
  440. reset_peripherals(0);
  441. udelay(2000);
  442. /* Early revisions require a second reset */
  443. #ifdef CONFIG_VISION2_HW_1_0
  444. reset_peripherals(1);
  445. udelay(2000);
  446. reset_peripherals(0);
  447. udelay(2000);
  448. #endif
  449. return 0;
  450. }
  451. /*
  452. * Do not overwrite the console
  453. * Use always serial for U-Boot console
  454. */
  455. int overwrite_console(void)
  456. {
  457. return 1;
  458. }
  459. int checkboard(void)
  460. {
  461. puts("Board: TTControl Vision II CPU V\n");
  462. return 0;
  463. }
  464. int do_vision_lcd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  465. {
  466. int on;
  467. if (argc < 2)
  468. return cmd_usage(cmdtp);
  469. on = (strcmp(argv[1], "on") == 0);
  470. backlight(on);
  471. return 0;
  472. }
  473. U_BOOT_CMD(
  474. lcdbl, CONFIG_SYS_MAXARGS, 1, do_vision_lcd,
  475. "Vision2 Backlight",
  476. "lcdbl [on|off]\n"
  477. );