mx53loco.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. /*
  2. * Copyright (C) 2011 Freescale Semiconductor, Inc.
  3. * Jason Liu <r64343@freescale.com>
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. * MA 02111-1307 USA
  22. */
  23. #include <common.h>
  24. #include <asm/io.h>
  25. #include <asm/arch/imx-regs.h>
  26. #include <asm/arch/mx5x_pins.h>
  27. #include <asm/arch/sys_proto.h>
  28. #include <asm/arch/crm_regs.h>
  29. #include <asm/arch/clock.h>
  30. #include <asm/arch/iomux.h>
  31. #include <asm/arch/clock.h>
  32. #include <asm/errno.h>
  33. #include <netdev.h>
  34. #include <i2c.h>
  35. #include <mmc.h>
  36. #include <fsl_esdhc.h>
  37. #include <asm/gpio.h>
  38. #include <power/pmic.h>
  39. #include <dialog_pmic.h>
  40. #include <fsl_pmic.h>
  41. #include <linux/fb.h>
  42. #include <ipu_pixfmt.h>
  43. #define MX53LOCO_LCD_POWER IMX_GPIO_NR(3, 24)
  44. DECLARE_GLOBAL_DATA_PTR;
  45. int dram_init(void)
  46. {
  47. u32 size1, size2;
  48. size1 = get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
  49. size2 = get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE);
  50. gd->ram_size = size1 + size2;
  51. return 0;
  52. }
  53. void dram_init_banksize(void)
  54. {
  55. gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
  56. gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
  57. gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
  58. gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
  59. }
  60. u32 get_board_rev(void)
  61. {
  62. struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
  63. struct fuse_bank *bank = &iim->bank[0];
  64. struct fuse_bank0_regs *fuse =
  65. (struct fuse_bank0_regs *)bank->fuse_regs;
  66. int rev = readl(&fuse->gp[6]);
  67. if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR))
  68. rev = 0;
  69. return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
  70. }
  71. static void setup_iomux_uart(void)
  72. {
  73. /* UART1 RXD */
  74. mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2);
  75. mxc_iomux_set_pad(MX53_PIN_CSI0_D11,
  76. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  77. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  78. PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU |
  79. PAD_CTL_ODE_OPENDRAIN_ENABLE);
  80. mxc_iomux_set_input(MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
  81. /* UART1 TXD */
  82. mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2);
  83. mxc_iomux_set_pad(MX53_PIN_CSI0_D10,
  84. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  85. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  86. PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU |
  87. PAD_CTL_ODE_OPENDRAIN_ENABLE);
  88. }
  89. #ifdef CONFIG_USB_EHCI_MX5
  90. int board_ehci_hcd_init(int port)
  91. {
  92. /* request VBUS power enable pin, GPIO7_8 */
  93. mxc_request_iomux(MX53_PIN_ATA_DA_2, IOMUX_CONFIG_ALT1);
  94. gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1);
  95. return 0;
  96. }
  97. #endif
  98. static void setup_iomux_fec(void)
  99. {
  100. /*FEC_MDIO*/
  101. mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0);
  102. mxc_iomux_set_pad(MX53_PIN_FEC_MDIO,
  103. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  104. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  105. PAD_CTL_22K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE);
  106. mxc_iomux_set_input(MX53_FEC_FEC_MDI_SELECT_INPUT, 0x1);
  107. /*FEC_MDC*/
  108. mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0);
  109. mxc_iomux_set_pad(MX53_PIN_FEC_MDC, PAD_CTL_DRV_HIGH);
  110. /* FEC RXD1 */
  111. mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT0);
  112. mxc_iomux_set_pad(MX53_PIN_FEC_RXD1,
  113. PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE);
  114. /* FEC RXD0 */
  115. mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT0);
  116. mxc_iomux_set_pad(MX53_PIN_FEC_RXD0,
  117. PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE);
  118. /* FEC TXD1 */
  119. mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT0);
  120. mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, PAD_CTL_DRV_HIGH);
  121. /* FEC TXD0 */
  122. mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT0);
  123. mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, PAD_CTL_DRV_HIGH);
  124. /* FEC TX_EN */
  125. mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT0);
  126. mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, PAD_CTL_DRV_HIGH);
  127. /* FEC TX_CLK */
  128. mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT0);
  129. mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK,
  130. PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE);
  131. /* FEC RX_ER */
  132. mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT0);
  133. mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER,
  134. PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE);
  135. /* FEC CRS */
  136. mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT0);
  137. mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV,
  138. PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE);
  139. }
  140. #ifdef CONFIG_FSL_ESDHC
  141. struct fsl_esdhc_cfg esdhc_cfg[2] = {
  142. {MMC_SDHC1_BASE_ADDR},
  143. {MMC_SDHC3_BASE_ADDR},
  144. };
  145. int board_mmc_getcd(struct mmc *mmc)
  146. {
  147. struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
  148. int ret;
  149. mxc_request_iomux(MX53_PIN_EIM_DA11, IOMUX_CONFIG_ALT1);
  150. gpio_direction_input(IMX_GPIO_NR(3, 11));
  151. mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT1);
  152. gpio_direction_input(IMX_GPIO_NR(3, 13));
  153. if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
  154. ret = !gpio_get_value(IMX_GPIO_NR(3, 13));
  155. else
  156. ret = !gpio_get_value(IMX_GPIO_NR(3, 11));
  157. return ret;
  158. }
  159. int board_mmc_init(bd_t *bis)
  160. {
  161. u32 index;
  162. s32 status = 0;
  163. esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
  164. esdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  165. for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
  166. switch (index) {
  167. case 0:
  168. mxc_request_iomux(MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0);
  169. mxc_request_iomux(MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0);
  170. mxc_request_iomux(MX53_PIN_SD1_DATA0,
  171. IOMUX_CONFIG_ALT0);
  172. mxc_request_iomux(MX53_PIN_SD1_DATA1,
  173. IOMUX_CONFIG_ALT0);
  174. mxc_request_iomux(MX53_PIN_SD1_DATA2,
  175. IOMUX_CONFIG_ALT0);
  176. mxc_request_iomux(MX53_PIN_SD1_DATA3,
  177. IOMUX_CONFIG_ALT0);
  178. mxc_request_iomux(MX53_PIN_EIM_DA13,
  179. IOMUX_CONFIG_ALT1);
  180. mxc_iomux_set_pad(MX53_PIN_SD1_CMD,
  181. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  182. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  183. PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU);
  184. mxc_iomux_set_pad(MX53_PIN_SD1_CLK,
  185. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  186. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
  187. PAD_CTL_DRV_HIGH);
  188. mxc_iomux_set_pad(MX53_PIN_SD1_DATA0,
  189. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  190. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  191. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  192. mxc_iomux_set_pad(MX53_PIN_SD1_DATA1,
  193. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  194. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  195. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  196. mxc_iomux_set_pad(MX53_PIN_SD1_DATA2,
  197. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  198. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  199. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  200. mxc_iomux_set_pad(MX53_PIN_SD1_DATA3,
  201. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  202. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  203. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  204. break;
  205. case 1:
  206. mxc_request_iomux(MX53_PIN_ATA_RESET_B,
  207. IOMUX_CONFIG_ALT2);
  208. mxc_request_iomux(MX53_PIN_ATA_IORDY,
  209. IOMUX_CONFIG_ALT2);
  210. mxc_request_iomux(MX53_PIN_ATA_DATA8,
  211. IOMUX_CONFIG_ALT4);
  212. mxc_request_iomux(MX53_PIN_ATA_DATA9,
  213. IOMUX_CONFIG_ALT4);
  214. mxc_request_iomux(MX53_PIN_ATA_DATA10,
  215. IOMUX_CONFIG_ALT4);
  216. mxc_request_iomux(MX53_PIN_ATA_DATA11,
  217. IOMUX_CONFIG_ALT4);
  218. mxc_request_iomux(MX53_PIN_ATA_DATA0,
  219. IOMUX_CONFIG_ALT4);
  220. mxc_request_iomux(MX53_PIN_ATA_DATA1,
  221. IOMUX_CONFIG_ALT4);
  222. mxc_request_iomux(MX53_PIN_ATA_DATA2,
  223. IOMUX_CONFIG_ALT4);
  224. mxc_request_iomux(MX53_PIN_ATA_DATA3,
  225. IOMUX_CONFIG_ALT4);
  226. mxc_request_iomux(MX53_PIN_EIM_DA11,
  227. IOMUX_CONFIG_ALT1);
  228. mxc_iomux_set_pad(MX53_PIN_ATA_RESET_B,
  229. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  230. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  231. PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU);
  232. mxc_iomux_set_pad(MX53_PIN_ATA_IORDY,
  233. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  234. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
  235. PAD_CTL_DRV_HIGH);
  236. mxc_iomux_set_pad(MX53_PIN_ATA_DATA8,
  237. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  238. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  239. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  240. mxc_iomux_set_pad(MX53_PIN_ATA_DATA9,
  241. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  242. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  243. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  244. mxc_iomux_set_pad(MX53_PIN_ATA_DATA10,
  245. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  246. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  247. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  248. mxc_iomux_set_pad(MX53_PIN_ATA_DATA11,
  249. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  250. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  251. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  252. mxc_iomux_set_pad(MX53_PIN_ATA_DATA0,
  253. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  254. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  255. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  256. mxc_iomux_set_pad(MX53_PIN_ATA_DATA1,
  257. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  258. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  259. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  260. mxc_iomux_set_pad(MX53_PIN_ATA_DATA2,
  261. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  262. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  263. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  264. mxc_iomux_set_pad(MX53_PIN_ATA_DATA3,
  265. PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
  266. PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE |
  267. PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
  268. break;
  269. default:
  270. printf("Warning: you configured more ESDHC controller"
  271. "(%d) as supported by the board(2)\n",
  272. CONFIG_SYS_FSL_ESDHC_NUM);
  273. return status;
  274. }
  275. status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
  276. }
  277. return status;
  278. }
  279. #endif
  280. static void setup_iomux_i2c(void)
  281. {
  282. /* I2C1 SDA */
  283. mxc_request_iomux(MX53_PIN_CSI0_D8,
  284. IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
  285. mxc_iomux_set_input(MX53_I2C1_IPP_SDA_IN_SELECT_INPUT,
  286. INPUT_CTL_PATH0);
  287. mxc_iomux_set_pad(MX53_PIN_CSI0_D8,
  288. PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
  289. PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE |
  290. PAD_CTL_PUE_PULL |
  291. PAD_CTL_ODE_OPENDRAIN_ENABLE);
  292. /* I2C1 SCL */
  293. mxc_request_iomux(MX53_PIN_CSI0_D9,
  294. IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
  295. mxc_iomux_set_input(MX53_I2C1_IPP_SCL_IN_SELECT_INPUT,
  296. INPUT_CTL_PATH0);
  297. mxc_iomux_set_pad(MX53_PIN_CSI0_D9,
  298. PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
  299. PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE |
  300. PAD_CTL_PUE_PULL |
  301. PAD_CTL_ODE_OPENDRAIN_ENABLE);
  302. }
  303. static int power_init(void)
  304. {
  305. unsigned int val;
  306. int ret = -1;
  307. struct pmic *p;
  308. int retval;
  309. if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
  310. retval = pmic_dialog_init(I2C_PMIC);
  311. if (retval)
  312. return retval;
  313. p = pmic_get("DIALOG_PMIC");
  314. if (!p)
  315. return -ENODEV;
  316. /* Set VDDA to 1.25V */
  317. val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
  318. ret = pmic_reg_write(p, DA9053_BUCKCORE_REG, val);
  319. ret |= pmic_reg_read(p, DA9053_SUPPLY_REG, &val);
  320. val |= DA9052_SUPPLY_VBCOREGO;
  321. ret |= pmic_reg_write(p, DA9053_SUPPLY_REG, val);
  322. /* Set Vcc peripheral to 1.30V */
  323. ret |= pmic_reg_write(p, DA9053_BUCKPRO_REG, 0x62);
  324. ret |= pmic_reg_write(p, DA9053_SUPPLY_REG, 0x62);
  325. }
  326. if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
  327. retval = pmic_init(I2C_PMIC);
  328. if (retval)
  329. return retval;
  330. p = pmic_get("DIALOG_PMIC");
  331. if (!p)
  332. return -ENODEV;
  333. /* Set VDDGP to 1.25V for 1GHz on SW1 */
  334. pmic_reg_read(p, REG_SW_0, &val);
  335. val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_250V_MC34708;
  336. ret = pmic_reg_write(p, REG_SW_0, val);
  337. /* Set VCC as 1.30V on SW2 */
  338. pmic_reg_read(p, REG_SW_1, &val);
  339. val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_300V_MC34708;
  340. ret |= pmic_reg_write(p, REG_SW_1, val);
  341. /* Set global reset timer to 4s */
  342. pmic_reg_read(p, REG_POWER_CTL2, &val);
  343. val = (val & ~TIMER_MASK_MC34708) | TIMER_4S_MC34708;
  344. ret |= pmic_reg_write(p, REG_POWER_CTL2, val);
  345. /* Set VUSBSEL and VUSBEN for USB PHY supply*/
  346. pmic_reg_read(p, REG_MODE_0, &val);
  347. val |= (VUSBSEL_MC34708 | VUSBEN_MC34708);
  348. ret |= pmic_reg_write(p, REG_MODE_0, val);
  349. /* Set SWBST to 5V in auto mode */
  350. val = SWBST_AUTO;
  351. ret |= pmic_reg_write(p, SWBST_CTRL, val);
  352. }
  353. return ret;
  354. }
  355. static void clock_1GHz(void)
  356. {
  357. int ret;
  358. u32 ref_clk = MXC_HCLK;
  359. /*
  360. * After increasing voltage to 1.25V, we can switch
  361. * CPU clock to 1GHz and DDR to 400MHz safely
  362. */
  363. ret = mxc_set_clock(ref_clk, 1000, MXC_ARM_CLK);
  364. if (ret)
  365. printf("CPU: Switch CPU clock to 1GHZ failed\n");
  366. ret = mxc_set_clock(ref_clk, 400, MXC_PERIPH_CLK);
  367. ret |= mxc_set_clock(ref_clk, 400, MXC_DDR_CLK);
  368. if (ret)
  369. printf("CPU: Switch DDR clock to 400MHz failed\n");
  370. }
  371. static struct fb_videomode const claa_wvga = {
  372. .name = "CLAA07LC0ACW",
  373. .refresh = 57,
  374. .xres = 800,
  375. .yres = 480,
  376. .pixclock = 37037,
  377. .left_margin = 40,
  378. .right_margin = 60,
  379. .upper_margin = 10,
  380. .lower_margin = 10,
  381. .hsync_len = 20,
  382. .vsync_len = 10,
  383. .sync = 0,
  384. .vmode = FB_VMODE_NONINTERLACED
  385. };
  386. void lcd_iomux(void)
  387. {
  388. mxc_request_iomux(MX53_PIN_DI0_DISP_CLK, IOMUX_CONFIG_ALT0);
  389. mxc_request_iomux(MX53_PIN_DI0_PIN15, IOMUX_CONFIG_ALT0);
  390. mxc_request_iomux(MX53_PIN_DI0_PIN2, IOMUX_CONFIG_ALT0);
  391. mxc_request_iomux(MX53_PIN_DI0_PIN3, IOMUX_CONFIG_ALT0);
  392. mxc_request_iomux(MX53_PIN_DISP0_DAT0, IOMUX_CONFIG_ALT0);
  393. mxc_request_iomux(MX53_PIN_DISP0_DAT1, IOMUX_CONFIG_ALT0);
  394. mxc_request_iomux(MX53_PIN_DISP0_DAT2, IOMUX_CONFIG_ALT0);
  395. mxc_request_iomux(MX53_PIN_DISP0_DAT3, IOMUX_CONFIG_ALT0);
  396. mxc_request_iomux(MX53_PIN_DISP0_DAT4, IOMUX_CONFIG_ALT0);
  397. mxc_request_iomux(MX53_PIN_DISP0_DAT5, IOMUX_CONFIG_ALT0);
  398. mxc_request_iomux(MX53_PIN_DISP0_DAT6, IOMUX_CONFIG_ALT0);
  399. mxc_request_iomux(MX53_PIN_DISP0_DAT7, IOMUX_CONFIG_ALT0);
  400. mxc_request_iomux(MX53_PIN_DISP0_DAT8, IOMUX_CONFIG_ALT0);
  401. mxc_request_iomux(MX53_PIN_DISP0_DAT9, IOMUX_CONFIG_ALT0);
  402. mxc_request_iomux(MX53_PIN_DISP0_DAT10, IOMUX_CONFIG_ALT0);
  403. mxc_request_iomux(MX53_PIN_DISP0_DAT11, IOMUX_CONFIG_ALT0);
  404. mxc_request_iomux(MX53_PIN_DISP0_DAT12, IOMUX_CONFIG_ALT0);
  405. mxc_request_iomux(MX53_PIN_DISP0_DAT13, IOMUX_CONFIG_ALT0);
  406. mxc_request_iomux(MX53_PIN_DISP0_DAT14, IOMUX_CONFIG_ALT0);
  407. mxc_request_iomux(MX53_PIN_DISP0_DAT15, IOMUX_CONFIG_ALT0);
  408. mxc_request_iomux(MX53_PIN_DISP0_DAT16, IOMUX_CONFIG_ALT0);
  409. mxc_request_iomux(MX53_PIN_DISP0_DAT17, IOMUX_CONFIG_ALT0);
  410. mxc_request_iomux(MX53_PIN_DISP0_DAT18, IOMUX_CONFIG_ALT0);
  411. mxc_request_iomux(MX53_PIN_DISP0_DAT19, IOMUX_CONFIG_ALT0);
  412. mxc_request_iomux(MX53_PIN_DISP0_DAT20, IOMUX_CONFIG_ALT0);
  413. mxc_request_iomux(MX53_PIN_DISP0_DAT21, IOMUX_CONFIG_ALT0);
  414. mxc_request_iomux(MX53_PIN_DISP0_DAT22, IOMUX_CONFIG_ALT0);
  415. mxc_request_iomux(MX53_PIN_DISP0_DAT23, IOMUX_CONFIG_ALT0);
  416. /* Turn on GPIO backlight */
  417. mxc_request_iomux(MX53_PIN_EIM_D24, IOMUX_CONFIG_ALT1);
  418. gpio_direction_output(MX53LOCO_LCD_POWER, 1);
  419. /* Turn on display contrast */
  420. mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT1);
  421. gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_1), 1);
  422. }
  423. void lcd_enable(void)
  424. {
  425. int ret = ipuv3_fb_init(&claa_wvga, 0, IPU_PIX_FMT_RGB565);
  426. if (ret)
  427. printf("LCD cannot be configured: %d\n", ret);
  428. }
  429. int board_early_init_f(void)
  430. {
  431. setup_iomux_uart();
  432. setup_iomux_fec();
  433. lcd_iomux();
  434. return 0;
  435. }
  436. int print_cpuinfo(void)
  437. {
  438. u32 cpurev;
  439. cpurev = get_cpu_rev();
  440. printf("CPU: Freescale i.MX%x family rev%d.%d at %d MHz\n",
  441. (cpurev & 0xFF000) >> 12,
  442. (cpurev & 0x000F0) >> 4,
  443. (cpurev & 0x0000F) >> 0,
  444. mxc_get_clock(MXC_ARM_CLK) / 1000000);
  445. printf("Reset cause: %s\n", get_reset_cause());
  446. return 0;
  447. }
  448. /*
  449. * Do not overwrite the console
  450. * Use always serial for U-Boot console
  451. */
  452. int overwrite_console(void)
  453. {
  454. return 1;
  455. }
  456. int board_init(void)
  457. {
  458. gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
  459. mxc_set_sata_internal_clock();
  460. setup_iomux_i2c();
  461. if (!power_init())
  462. clock_1GHz();
  463. print_cpuinfo();
  464. lcd_enable();
  465. return 0;
  466. }
  467. int checkboard(void)
  468. {
  469. puts("Board: MX53 LOCO\n");
  470. return 0;
  471. }