vision2.c 16 KB

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