vf610twr.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. /*
  2. * Copyright 2013 Freescale Semiconductor, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of
  7. * the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  17. * MA 02111-1307 USA
  18. */
  19. #include <common.h>
  20. #include <malloc.h>
  21. #include <asm/io.h>
  22. #include <asm/arch/imx-regs.h>
  23. #include <asm/arch/iomux-vf610.h>
  24. #include <asm/imx-common/iomux-v3.h>
  25. #include <asm/arch/crm_regs.h>
  26. #include <asm/arch/clock.h>
  27. #include <mmc.h>
  28. #include <fsl_esdhc.h>
  29. #include <miiphy.h>
  30. #include <netdev.h>
  31. #include <usb_mass_storage.h>
  32. #include <usb/arcotg_udc.h>
  33. DECLARE_GLOBAL_DATA_PTR;
  34. #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
  35. PAD_CTL_DSE_25ohm | PAD_CTL_OBE_IBE_ENABLE)
  36. #define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
  37. PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
  38. #define ENET_PAD_CTRL (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
  39. PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
  40. #define USB_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED| \
  41. PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
  42. void setup_iomux_ddr(void)
  43. {
  44. static const iomux_v3_cfg_t ddr_pads[] = {
  45. VF610_PAD_DDR_A15__DDR_A_15,
  46. VF610_PAD_DDR_A15__DDR_A_15,
  47. VF610_PAD_DDR_A14__DDR_A_14,
  48. VF610_PAD_DDR_A13__DDR_A_13,
  49. VF610_PAD_DDR_A12__DDR_A_12,
  50. VF610_PAD_DDR_A11__DDR_A_11,
  51. VF610_PAD_DDR_A10__DDR_A_10,
  52. VF610_PAD_DDR_A9__DDR_A_9,
  53. VF610_PAD_DDR_A8__DDR_A_8,
  54. VF610_PAD_DDR_A7__DDR_A_7,
  55. VF610_PAD_DDR_A6__DDR_A_6,
  56. VF610_PAD_DDR_A5__DDR_A_5,
  57. VF610_PAD_DDR_A4__DDR_A_4,
  58. VF610_PAD_DDR_A3__DDR_A_3,
  59. VF610_PAD_DDR_A2__DDR_A_2,
  60. VF610_PAD_DDR_A1__DDR_A_1,
  61. VF610_PAD_DDR_A0__DDR_A_0,
  62. VF610_PAD_DDR_BA2__DDR_BA_2,
  63. VF610_PAD_DDR_BA1__DDR_BA_1,
  64. VF610_PAD_DDR_BA0__DDR_BA_0,
  65. VF610_PAD_DDR_CAS__DDR_CAS_B,
  66. VF610_PAD_DDR_CKE__DDR_CKE_0,
  67. VF610_PAD_DDR_CLK__DDR_CLK_0,
  68. VF610_PAD_DDR_CS__DDR_CS_B_0,
  69. VF610_PAD_DDR_D15__DDR_D_15,
  70. VF610_PAD_DDR_D14__DDR_D_14,
  71. VF610_PAD_DDR_D13__DDR_D_13,
  72. VF610_PAD_DDR_D12__DDR_D_12,
  73. VF610_PAD_DDR_D11__DDR_D_11,
  74. VF610_PAD_DDR_D10__DDR_D_10,
  75. VF610_PAD_DDR_D9__DDR_D_9,
  76. VF610_PAD_DDR_D8__DDR_D_8,
  77. VF610_PAD_DDR_D7__DDR_D_7,
  78. VF610_PAD_DDR_D6__DDR_D_6,
  79. VF610_PAD_DDR_D5__DDR_D_5,
  80. VF610_PAD_DDR_D4__DDR_D_4,
  81. VF610_PAD_DDR_D3__DDR_D_3,
  82. VF610_PAD_DDR_D2__DDR_D_2,
  83. VF610_PAD_DDR_D1__DDR_D_1,
  84. VF610_PAD_DDR_D0__DDR_D_0,
  85. VF610_PAD_DDR_DQM1__DDR_DQM_1,
  86. VF610_PAD_DDR_DQM0__DDR_DQM_0,
  87. VF610_PAD_DDR_DQS1__DDR_DQS_1,
  88. VF610_PAD_DDR_DQS0__DDR_DQS_0,
  89. VF610_PAD_DDR_RAS__DDR_RAS_B,
  90. VF610_PAD_DDR_WE__DDR_WE_B,
  91. VF610_PAD_DDR_ODT1__DDR_ODT_0,
  92. VF610_PAD_DDR_ODT0__DDR_ODT_1,
  93. VF610_PAD_DDR_RESET,
  94. };
  95. imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
  96. }
  97. void ddr_phy_init(void)
  98. {
  99. struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
  100. writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
  101. writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
  102. writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
  103. writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
  104. writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
  105. writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
  106. writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
  107. writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
  108. writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
  109. writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
  110. writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
  111. writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
  112. writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
  113. /* LPDDR2 only parameter */
  114. writel(DDRMC_PHY_OFF, &ddrmr->phy[49]);
  115. writel(DDRMC_PHY50_DDR3_MODE | DDRMC_PHY50_EN_SW_HALF_CYCLE,
  116. &ddrmr->phy[50]);
  117. /* Processor Pad ODT settings */
  118. writel(DDRMC_PHY_PROC_PAD_ODT, &ddrmr->phy[52]);
  119. }
  120. void ddr_ctrl_init(void)
  121. {
  122. struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
  123. writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
  124. writel(DDRMC_CR02_DRAM_TINIT(32), &ddrmr->cr[2]);
  125. writel(DDRMC_CR10_TRST_PWRON(80000), &ddrmr->cr[10]);
  126. writel(DDRMC_CR11_CKE_INACTIVE(200000), &ddrmr->cr[11]);
  127. writel(DDRMC_CR12_WRLAT(5) | DDRMC_CR12_CASLAT_LIN(12), &ddrmr->cr[12]);
  128. writel(DDRMC_CR13_TRC(21) | DDRMC_CR13_TRRD(4) | DDRMC_CR13_TCCD(4),
  129. &ddrmr->cr[13]);
  130. writel(DDRMC_CR14_TFAW(20) | DDRMC_CR14_TRP(6) | DDRMC_CR14_TWTR(4) |
  131. DDRMC_CR14_TRAS_MIN(15), &ddrmr->cr[14]);
  132. writel(DDRMC_CR16_TMRD(4) | DDRMC_CR16_TRTP(4), &ddrmr->cr[16]);
  133. writel(DDRMC_CR17_TRAS_MAX(28080) | DDRMC_CR17_TMOD(12),
  134. &ddrmr->cr[17]);
  135. writel(DDRMC_CR18_TCKESR(4) | DDRMC_CR18_TCKE(3), &ddrmr->cr[18]);
  136. writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
  137. writel(DDRMC_CR21_TRCD_INT(6) | DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
  138. writel(DDRMC_CR22_TDAL(12), &ddrmr->cr[22]);
  139. writel(DDRMC_CR23_BSTLEN(3) | DDRMC_CR23_TDLL(512), &ddrmr->cr[23]);
  140. writel(DDRMC_CR24_TRP_AB(6), &ddrmr->cr[24]);
  141. writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
  142. writel(DDRMC_CR26_TREF(3120) | DDRMC_CR26_TRFC(44), &ddrmr->cr[26]);
  143. writel(DDRMC_CR28_TREF_INT(0), &ddrmr->cr[28]);
  144. writel(DDRMC_CR29_TPDEX(3), &ddrmr->cr[29]);
  145. writel(DDRMC_CR30_TXPDLL(10), &ddrmr->cr[30]);
  146. writel(DDRMC_CR31_TXSNR(48) | DDRMC_CR31_TXSR(468), &ddrmr->cr[31]);
  147. writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
  148. writel(DDRMC_CR34_CKSRX(5) | DDRMC_CR34_CKSRE(5), &ddrmr->cr[34]);
  149. writel(DDRMC_CR38_FREQ_CHG_EN(0), &ddrmr->cr[38]);
  150. writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
  151. DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
  152. writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
  153. writel(DDRMC_CR48_MR1_DA_0(70) | DDRMC_CR48_MR0_DA_0(1056),
  154. &ddrmr->cr[48]);
  155. writel(DDRMC_CR66_ZQCL(256) | DDRMC_CR66_ZQINIT(512), &ddrmr->cr[66]);
  156. writel(DDRMC_CR67_ZQCS(64), &ddrmr->cr[67]);
  157. writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
  158. writel(DDRMC_CR70_REF_PER_ZQ(64), &ddrmr->cr[70]);
  159. writel(DDRMC_CR72_ZQCS_ROTATE(0), &ddrmr->cr[72]);
  160. writel(DDRMC_CR73_APREBIT(10) | DDRMC_CR73_COL_DIFF(1) |
  161. DDRMC_CR73_ROW_DIFF(3), &ddrmr->cr[73]);
  162. writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
  163. DDRMC_CR74_CMD_AGE_CNT(64) | DDRMC_CR74_AGE_CNT(64),
  164. &ddrmr->cr[74]);
  165. writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
  166. DDRMC_CR75_PLEN, &ddrmr->cr[75]);
  167. writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
  168. DDRMC_CR76_W2R_SPLT_EN, &ddrmr->cr[76]);
  169. writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
  170. DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
  171. writel(DDRMC_CR78_Q_FULLNESS(7) | DDRMC_CR78_BUR_ON_FLY_BIT(12),
  172. &ddrmr->cr[78]);
  173. writel(DDRMC_CR79_CTLUPD_AREF(0), &ddrmr->cr[79]);
  174. writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
  175. writel(DDRMC_CR87_ODT_WR_MAPCS0, &ddrmr->cr[87]);
  176. writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
  177. writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
  178. writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
  179. writel(DDRMC_CR96_WLMRD(40) | DDRMC_CR96_WLDQSEN(25), &ddrmr->cr[96]);
  180. writel(DDRMC_CR97_WRLVL_EN, &ddrmr->cr[97]);
  181. writel(DDRMC_CR98_WRLVL_DL_0, &ddrmr->cr[98]);
  182. writel(DDRMC_CR99_WRLVL_DL_1, &ddrmr->cr[99]);
  183. writel(DDRMC_CR102_RDLVL_GT_REGEN(0) | DDRMC_CR102_RDLVL_REG_EN(0),
  184. &ddrmr->cr[102]);
  185. writel(DDRMC_CR105_RDLVL_DL_0(12), &ddrmr->cr[105]);
  186. writel(DDRMC_CR106_RDLVL_GTDL_0(0), &ddrmr->cr[106]);
  187. writel(DDRMC_CR110_RDLVL_GTDL_1(0) | DDRMC_CR110_RDLVL_DL_1(12),
  188. &ddrmr->cr[110]);
  189. writel(DDRMC_CR114_RDLVL_GTDL_2(0), &ddrmr->cr[114]);
  190. writel(DDRMC_CR115_RDLVL_GTDL_2(0), &ddrmr->cr[115]);
  191. writel(DDRMC_CR117_AXI0_W_PRI(0) | DDRMC_CR117_AXI0_R_PRI(0),
  192. &ddrmr->cr[117]);
  193. writel(DDRMC_CR118_AXI1_W_PRI(1) | DDRMC_CR118_AXI1_R_PRI(1),
  194. &ddrmr->cr[118]);
  195. writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) | DDRMC_CR120_AXI0_PRI0_RPRI(2),
  196. &ddrmr->cr[120]);
  197. writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) | DDRMC_CR121_AXI0_PRI2_RPRI(2),
  198. &ddrmr->cr[121]);
  199. writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
  200. DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
  201. writel(DDRMC_CR123_AXI1_P_ODR_EN | DDRMC_CR123_AXI1_PRI3_RPRI(1) |
  202. DDRMC_CR123_AXI1_PRI2_RPRI(1), &ddrmr->cr[123]);
  203. writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
  204. writel(DDRMC_CR126_PHY_RDLAT(8), &ddrmr->cr[126]);
  205. writel(DDRMC_CR132_WRLAT_ADJ(5) | DDRMC_CR132_RDLAT_ADJ(6),
  206. &ddrmr->cr[132]);
  207. writel(DDRMC_CR137_PHYCTL_DL(2), &ddrmr->cr[137]);
  208. writel(DDRMC_CR138_PHY_WRLV_MXDL(256) | DDRMC_CR138_PHYDRAM_CK_EN(1),
  209. &ddrmr->cr[138]);
  210. writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
  211. DDRMC_CR139_PHY_WRLV_DLL(3) | DDRMC_CR139_PHY_WRLV_EN(3),
  212. &ddrmr->cr[139]);
  213. writel(DDRMC_CR140_PHY_WRLV_WW(64), &ddrmr->cr[140]);
  214. writel(DDRMC_CR143_RDLV_GAT_MXDL(1536) | DDRMC_CR143_RDLV_MXDL(128),
  215. &ddrmr->cr[143]);
  216. writel(DDRMC_CR144_PHY_RDLVL_RES(4) | DDRMC_CR144_PHY_RDLV_LOAD(7) |
  217. DDRMC_CR144_PHY_RDLV_DLL(3) | DDRMC_CR144_PHY_RDLV_EN(3),
  218. &ddrmr->cr[144]);
  219. writel(DDRMC_CR145_PHY_RDLV_RR(64), &ddrmr->cr[145]);
  220. writel(DDRMC_CR146_PHY_RDLVL_RESP(64), &ddrmr->cr[146]);
  221. writel(DDRMC_CR147_RDLV_RESP_MASK(983040), &ddrmr->cr[147]);
  222. writel(DDRMC_CR148_RDLV_GATE_RESP_MASK(983040), &ddrmr->cr[148]);
  223. writel(DDRMC_CR151_RDLV_GAT_DQ_ZERO_CNT(1) |
  224. DDRMC_CR151_RDLVL_DQ_ZERO_CNT(1), &ddrmr->cr[151]);
  225. writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
  226. DDRMC_CR154_PAD_ZQ_MODE(1) | DDRMC_CR154_DDR_SEL_PAD_CONTR(3) |
  227. DDRMC_CR154_PAD_ZQ_HW_FOR(1), &ddrmr->cr[154]);
  228. writel(DDRMC_CR155_PAD_ODT_BYTE1(2) | DDRMC_CR155_PAD_ODT_BYTE0(2),
  229. &ddrmr->cr[155]);
  230. writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
  231. writel(DDRMC_CR161_ODT_EN(1) | DDRMC_CR161_TODTH_RD(2) |
  232. DDRMC_CR161_TODTH_WR(2), &ddrmr->cr[161]);
  233. ddr_phy_init();
  234. writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
  235. udelay(200);
  236. }
  237. int dram_init(void)
  238. {
  239. setup_iomux_ddr();
  240. ddr_ctrl_init();
  241. gd->ram_size = PHYS_SDRAM_SIZE;
  242. return 0;
  243. }
  244. static void setup_iomux_uart(void)
  245. {
  246. static const iomux_v3_cfg_t uart1_pads[] = {
  247. NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, UART_PAD_CTRL),
  248. NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, UART_PAD_CTRL),
  249. };
  250. imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
  251. }
  252. static void setup_iomux_enet(void)
  253. {
  254. static const iomux_v3_cfg_t enet0_pads[] = {
  255. NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKIN, ENET_PAD_CTRL),
  256. NEW_PAD_CTRL(VF610_PAD_PTC1__RMII0_MDIO, ENET_PAD_CTRL),
  257. NEW_PAD_CTRL(VF610_PAD_PTC0__RMII0_MDC, ENET_PAD_CTRL),
  258. NEW_PAD_CTRL(VF610_PAD_PTC2__RMII0_CRS_DV, ENET_PAD_CTRL),
  259. NEW_PAD_CTRL(VF610_PAD_PTC3__RMII0_RD1, ENET_PAD_CTRL),
  260. NEW_PAD_CTRL(VF610_PAD_PTC4__RMII0_RD0, ENET_PAD_CTRL),
  261. NEW_PAD_CTRL(VF610_PAD_PTC5__RMII0_RXER, ENET_PAD_CTRL),
  262. NEW_PAD_CTRL(VF610_PAD_PTC6__RMII0_TD1, ENET_PAD_CTRL),
  263. NEW_PAD_CTRL(VF610_PAD_PTC7__RMII0_TD0, ENET_PAD_CTRL),
  264. NEW_PAD_CTRL(VF610_PAD_PTC8__RMII0_TXEN, ENET_PAD_CTRL),
  265. };
  266. imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
  267. }
  268. #ifdef CONFIG_FSL_ESDHC
  269. struct fsl_esdhc_cfg esdhc_cfg[1] = {
  270. {ESDHC1_BASE_ADDR},
  271. };
  272. int board_mmc_getcd(struct mmc *mmc)
  273. {
  274. /* eSDHC1 is always present */
  275. return 1;
  276. }
  277. int board_mmc_init(bd_t *bis)
  278. {
  279. static const iomux_v3_cfg_t esdhc1_pads[] = {
  280. NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
  281. NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
  282. NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
  283. NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
  284. NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
  285. NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
  286. };
  287. esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
  288. imx_iomux_v3_setup_multiple_pads(
  289. esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
  290. return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
  291. }
  292. #endif
  293. static void clock_init(void)
  294. {
  295. struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
  296. struct anadig_reg *anadig = (struct anadig_reg *)ANADIG_BASE_ADDR;
  297. clrsetbits_le32(&ccm->ccgr0, CCM_REG_CTRL_MASK,
  298. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  299. clrsetbits_le32(&ccm->ccgr1, CCM_REG_CTRL_MASK,
  300. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  301. clrsetbits_le32(&ccm->ccgr2, CCM_REG_CTRL_MASK,
  302. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  303. clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
  304. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  305. clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
  306. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  307. clrsetbits_le32(&ccm->ccgr6, CCM_REG_CTRL_MASK,
  308. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  309. clrsetbits_le32(&ccm->ccgr7, CCM_REG_CTRL_MASK,
  310. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  311. clrsetbits_le32(&ccm->ccgr8, CCM_REG_CTRL_MASK,
  312. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  313. clrsetbits_le32(&ccm->ccgr9, CCM_REG_CTRL_MASK,
  314. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  315. clrsetbits_le32(&ccm->ccgr10, CCM_REG_CTRL_MASK,
  316. CCM_CCGRX_ENABLE_ALL_CTRL_MASK);
  317. clrsetbits_le32(&ccm->ccr, CCM_CCR_OSCNT_MASK,
  318. CCM_CCR_FIRC_EN | CCM_CCR_OSCNT(5));
  319. #ifdef CONFIG_VF610_500MHZ
  320. clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL3_CTRL_BYPASS |
  321. ANADIG_PLL2_CTRL_POWERDOWN, ANADIG_PLL2_CTRL_ENABLE |
  322. ANADIG_PLL2_CTRL_DIV_SELECT);
  323. #else
  324. clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL2_CTRL_POWERDOWN,
  325. ANADIG_PLL2_CTRL_ENABLE | ANADIG_PLL2_CTRL_DIV_SELECT);
  326. #endif
  327. clrsetbits_le32(&anadig->pll1_ctrl, ANADIG_PLL1_CTRL_POWERDOWN,
  328. ANADIG_PLL1_CTRL_ENABLE | ANADIG_PLL1_CTRL_DIV_SELECT);
  329. #ifdef CONFIG_VF610_500MHZ
  330. clrsetbits_le32(&ccm->ccsr, CCM_REG_CTRL_MASK,
  331. CCM_CCSR_PLL1_PFD_CLK_SEL(1) | CCM_CCSR_PLL2_PFD4_EN |
  332. CCM_CCSR_PLL2_PFD3_EN | CCM_CCSR_PLL2_PFD2_EN |
  333. CCM_CCSR_PLL2_PFD1_EN | CCM_CCSR_PLL1_PFD4_EN |
  334. CCM_CCSR_PLL1_PFD3_EN | CCM_CCSR_PLL1_PFD2_EN |
  335. CCM_CCSR_PLL1_PFD1_EN | CCM_CCSR_DDRC_CLK_SEL(0) |
  336. CCM_CCSR_FAST_CLK_SEL(1) | CCM_CCSR_SYS_CLK_SEL(4));
  337. #else
  338. clrsetbits_le32(&ccm->ccsr, CCM_REG_CTRL_MASK,
  339. CCM_CCSR_PLL1_PFD_CLK_SEL(3) | CCM_CCSR_PLL2_PFD4_EN |
  340. CCM_CCSR_PLL2_PFD3_EN | CCM_CCSR_PLL2_PFD2_EN |
  341. CCM_CCSR_PLL2_PFD1_EN | CCM_CCSR_PLL1_PFD4_EN |
  342. CCM_CCSR_PLL1_PFD3_EN | CCM_CCSR_PLL1_PFD2_EN |
  343. CCM_CCSR_PLL1_PFD1_EN | CCM_CCSR_DDRC_CLK_SEL(1) |
  344. CCM_CCSR_FAST_CLK_SEL(1) | CCM_CCSR_SYS_CLK_SEL(4));
  345. #endif
  346. clrsetbits_le32(&ccm->cacrr, CCM_REG_CTRL_MASK,
  347. CCM_CACRR_IPG_CLK_DIV(1) | CCM_CACRR_BUS_CLK_DIV(2) |
  348. CCM_CACRR_ARM_CLK_DIV(0));
  349. clrsetbits_le32(&ccm->cscmr1, CCM_REG_CTRL_MASK,
  350. CCM_CSCMR1_ESDHC1_CLK_SEL(3));
  351. clrsetbits_le32(&ccm->cscdr1, CCM_REG_CTRL_MASK,
  352. CCM_CSCDR1_RMII_CLK_EN);
  353. clrsetbits_le32(&ccm->cscdr2, CCM_REG_CTRL_MASK,
  354. CCM_CSCDR2_ESDHC1_EN | CCM_CSCDR2_ESDHC1_CLK_DIV(0));
  355. clrsetbits_le32(&ccm->cscmr2, CCM_REG_CTRL_MASK,
  356. CCM_CSCMR2_RMII_CLK_SEL(0));
  357. }
  358. static void mscm_init(void)
  359. {
  360. struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_IR_BASE_ADDR;
  361. int i;
  362. for (i = 0; i < MSCM_IRSPRC_NUM; i++)
  363. writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
  364. }
  365. int board_phy_config(struct phy_device *phydev)
  366. {
  367. if (phydev->drv->config)
  368. phydev->drv->config(phydev);
  369. return 0;
  370. }
  371. int board_early_init_f(void)
  372. {
  373. clock_init();
  374. mscm_init();
  375. setup_iomux_uart();
  376. setup_iomux_enet();
  377. return 0;
  378. }
  379. int board_init(void)
  380. {
  381. /* address of boot parameters */
  382. gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
  383. return 0;
  384. }
  385. int checkboard(void)
  386. {
  387. puts("Board: TWR-VF65GS10\n");
  388. return 0;
  389. }
  390. #ifdef CONFIG_USB_GADGET_ARCOTG_UDC
  391. void udc_pins_setting(void)
  392. {
  393. u32 reg;
  394. void *gpio_reg = (void *)GPIO2_PSOR;
  395. static const iomux_v3_cfg_t usb0_pads[] = {
  396. NEW_PAD_CTRL(VF610_PAD_PTD6__GPIO85, USB_PAD_CTRL),
  397. NEW_PAD_CTRL(VF610_PAD_PTD13__GPIO92, USB_PAD_CTRL),
  398. };
  399. imx_iomux_v3_setup_multiple_pads(usb0_pads, ARRAY_SIZE(usb0_pads));
  400. /*set PTD6 and PTD13*/
  401. reg = readl(GPIO2_PSOR);
  402. reg |= (1<<21);
  403. reg |= (1<<28);
  404. writel(0x10200000, &gpio_reg);
  405. }
  406. #endif
  407. #ifdef CONFIG_USB_GADGET
  408. void board_usb_init(void)
  409. {
  410. struct fsl_usb2_platform_data *pdata;
  411. pdata = calloc(sizeof(*pdata), 1);
  412. fsl_udc_probe(pdata);
  413. }
  414. #endif
  415. #ifdef CONFIG_USB_GADGET_MASS_STORAGE
  416. static int ums_read_sector(struct ums_device *ums_dev,
  417. ulong start, lbaint_t blkcnt, void *buf)
  418. {
  419. if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num,
  420. start + ums_dev->offset, blkcnt, buf) != blkcnt)
  421. return -1;
  422. return 0;
  423. }
  424. static int ums_write_sector(struct ums_device *ums_dev,
  425. ulong start, lbaint_t blkcnt, const void *buf)
  426. {
  427. if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num,
  428. start + ums_dev->offset, blkcnt, buf) != blkcnt)
  429. return -1;
  430. return 0;
  431. }
  432. static void ums_get_capacity(struct ums_device *ums_dev,
  433. long long int *capacity)
  434. {
  435. long long int tmp_capacity;
  436. tmp_capacity = (long long int) ((ums_dev->offset + ums_dev->part_size)
  437. * SECTOR_SIZE);
  438. *capacity = ums_dev->mmc->capacity - tmp_capacity;
  439. }
  440. static struct ums_board_info ums_board = {
  441. .read_sector = ums_read_sector,
  442. .write_sector = ums_write_sector,
  443. .get_capacity = ums_get_capacity,
  444. .name = "Vybrid UMS disk",
  445. .ums_dev = {
  446. .mmc = NULL,
  447. .dev_num = 0,
  448. .offset = 0,
  449. .part_size = 0.
  450. },
  451. };
  452. struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset,
  453. unsigned int part_size)
  454. {
  455. struct mmc *mmc;
  456. mmc = find_mmc_device(dev_num);
  457. if (!mmc)
  458. return NULL;
  459. ums_board.ums_dev.mmc = mmc;
  460. ums_board.ums_dev.dev_num = dev_num;
  461. ums_board.ums_dev.offset = offset;
  462. ums_board.ums_dev.part_size = part_size;
  463. return &ums_board;
  464. }
  465. #endif