cm_fx6.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * Board functions for Compulab CM-FX6 board
  3. *
  4. * Copyright (C) 2014, Compulab Ltd - http://compulab.co.il/
  5. *
  6. * Author: Nikita Kiryanov <nikita@compulab.co.il>
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <fsl_esdhc.h>
  12. #include <miiphy.h>
  13. #include <netdev.h>
  14. #include <fdt_support.h>
  15. #include <asm/arch/crm_regs.h>
  16. #include <asm/arch/sys_proto.h>
  17. #include <asm/io.h>
  18. #include <asm/gpio.h>
  19. #include "common.h"
  20. DECLARE_GLOBAL_DATA_PTR;
  21. #ifdef CONFIG_FEC_MXC
  22. #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
  23. PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
  24. static int mx6_rgmii_rework(struct phy_device *phydev)
  25. {
  26. unsigned short val;
  27. /* Ar8031 phy SmartEEE feature cause link status generates glitch,
  28. * which cause ethernet link down/up issue, so disable SmartEEE
  29. */
  30. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x3);
  31. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x805d);
  32. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4003);
  33. val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
  34. val &= ~(0x1 << 8);
  35. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
  36. /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
  37. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
  38. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
  39. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
  40. val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
  41. val &= 0xffe3;
  42. val |= 0x18;
  43. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
  44. /* introduce tx clock delay */
  45. phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
  46. val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
  47. val |= 0x0100;
  48. phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
  49. return 0;
  50. }
  51. int board_phy_config(struct phy_device *phydev)
  52. {
  53. mx6_rgmii_rework(phydev);
  54. if (phydev->drv->config)
  55. return phydev->drv->config(phydev);
  56. return 0;
  57. }
  58. static iomux_v3_cfg_t const enet_pads[] = {
  59. IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  60. IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  61. IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  62. IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  63. IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  64. IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  65. IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  66. IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  67. IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  68. IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  69. IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  70. IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  71. IOMUX_PADS(PAD_GPIO_0__CCM_CLKO1 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  72. IOMUX_PADS(PAD_GPIO_3__CCM_CLKO2 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  73. IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | MUX_PAD_CTRL(0x84)),
  74. IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK |
  75. MUX_PAD_CTRL(ENET_PAD_CTRL)),
  76. IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL |
  77. MUX_PAD_CTRL(ENET_PAD_CTRL)),
  78. IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL |
  79. MUX_PAD_CTRL(ENET_PAD_CTRL)),
  80. };
  81. int board_eth_init(bd_t *bis)
  82. {
  83. SETUP_IOMUX_PADS(enet_pads);
  84. /* phy reset */
  85. gpio_direction_output(CM_FX6_ENET_NRST, 0);
  86. udelay(500);
  87. gpio_set_value(CM_FX6_ENET_NRST, 1);
  88. enable_enet_clk(1);
  89. return cpu_eth_init(bis);
  90. }
  91. #endif
  92. #ifdef CONFIG_NAND_MXS
  93. static iomux_v3_cfg_t const nand_pads[] = {
  94. IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(NO_PAD_CTRL)),
  95. IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(NO_PAD_CTRL)),
  96. IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  97. IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  98. IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  99. IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  100. IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  101. IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  102. IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  103. IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  104. IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  105. IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  106. IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  107. IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  108. };
  109. static void cm_fx6_setup_gpmi_nand(void)
  110. {
  111. SETUP_IOMUX_PADS(nand_pads);
  112. /* Enable clock roots */
  113. enable_usdhc_clk(1, 3);
  114. enable_usdhc_clk(1, 4);
  115. setup_gpmi_io_clk(MXC_CCM_CS2CDR_ENFC_CLK_PODF(0xf) |
  116. MXC_CCM_CS2CDR_ENFC_CLK_PRED(1) |
  117. MXC_CCM_CS2CDR_ENFC_CLK_SEL(0));
  118. }
  119. #else
  120. static void cm_fx6_setup_gpmi_nand(void) {}
  121. #endif
  122. #ifdef CONFIG_FSL_ESDHC
  123. static struct fsl_esdhc_cfg usdhc_cfg[3] = {
  124. {USDHC1_BASE_ADDR},
  125. {USDHC2_BASE_ADDR},
  126. {USDHC3_BASE_ADDR},
  127. };
  128. static enum mxc_clock usdhc_clk[3] = {
  129. MXC_ESDHC_CLK,
  130. MXC_ESDHC2_CLK,
  131. MXC_ESDHC3_CLK,
  132. };
  133. int board_mmc_init(bd_t *bis)
  134. {
  135. int i;
  136. cm_fx6_set_usdhc_iomux();
  137. for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
  138. usdhc_cfg[i].sdhc_clk = mxc_get_clock(usdhc_clk[i]);
  139. usdhc_cfg[i].max_bus_width = 4;
  140. fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
  141. enable_usdhc_clk(1, i);
  142. }
  143. return 0;
  144. }
  145. #endif
  146. #ifdef CONFIG_OF_BOARD_SETUP
  147. void ft_board_setup(void *blob, bd_t *bd)
  148. {
  149. uint8_t enetaddr[6];
  150. /* MAC addr */
  151. if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
  152. fdt_find_and_setprop(blob, "/fec", "local-mac-address",
  153. enetaddr, 6, 1);
  154. }
  155. }
  156. #endif
  157. int board_init(void)
  158. {
  159. gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
  160. cm_fx6_setup_gpmi_nand();
  161. return 0;
  162. }
  163. int checkboard(void)
  164. {
  165. puts("Board: CM-FX6\n");
  166. return 0;
  167. }
  168. void dram_init_banksize(void)
  169. {
  170. gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
  171. gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
  172. switch (gd->ram_size) {
  173. case 0x10000000: /* DDR_16BIT_256MB */
  174. gd->bd->bi_dram[0].size = 0x10000000;
  175. gd->bd->bi_dram[1].size = 0;
  176. break;
  177. case 0x20000000: /* DDR_32BIT_512MB */
  178. gd->bd->bi_dram[0].size = 0x20000000;
  179. gd->bd->bi_dram[1].size = 0;
  180. break;
  181. case 0x40000000:
  182. if (is_cpu_type(MXC_CPU_MX6SOLO)) { /* DDR_32BIT_1GB */
  183. gd->bd->bi_dram[0].size = 0x20000000;
  184. gd->bd->bi_dram[1].size = 0x20000000;
  185. } else { /* DDR_64BIT_1GB */
  186. gd->bd->bi_dram[0].size = 0x40000000;
  187. gd->bd->bi_dram[1].size = 0;
  188. }
  189. break;
  190. case 0x80000000: /* DDR_64BIT_2GB */
  191. gd->bd->bi_dram[0].size = 0x40000000;
  192. gd->bd->bi_dram[1].size = 0x40000000;
  193. break;
  194. case 0xEFF00000: /* DDR_64BIT_4GB */
  195. gd->bd->bi_dram[0].size = 0x70000000;
  196. gd->bd->bi_dram[1].size = 0x7FF00000;
  197. break;
  198. }
  199. }
  200. int dram_init(void)
  201. {
  202. gd->ram_size = imx_ddr_size();
  203. switch (gd->ram_size) {
  204. case 0x10000000:
  205. case 0x20000000:
  206. case 0x40000000:
  207. case 0x80000000:
  208. break;
  209. case 0xF0000000:
  210. gd->ram_size -= 0x100000;
  211. break;
  212. default:
  213. printf("ERROR: Unsupported DRAM size 0x%lx\n", gd->ram_size);
  214. return -1;
  215. }
  216. return 0;
  217. }