aristainetos-v1.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * (C) Copyright 2015
  3. * Heiko Schocher, DENX Software Engineering, hs@denx.de.
  4. *
  5. * Based on:
  6. * Copyright (C) 2012 Freescale Semiconductor, Inc.
  7. *
  8. * Author: Fabio Estevam <fabio.estevam@freescale.com>
  9. *
  10. * SPDX-License-Identifier: GPL-2.0+
  11. */
  12. #include <asm/arch/clock.h>
  13. #include <asm/arch/imx-regs.h>
  14. #include <asm/arch/iomux.h>
  15. #include <asm/arch/mx6-pins.h>
  16. #include <linux/errno.h>
  17. #include <asm/gpio.h>
  18. #include <asm/imx-common/iomux-v3.h>
  19. #include <asm/imx-common/boot_mode.h>
  20. #include <asm/imx-common/mxc_i2c.h>
  21. #include <asm/imx-common/video.h>
  22. #include <mmc.h>
  23. #include <fsl_esdhc.h>
  24. #include <miiphy.h>
  25. #include <netdev.h>
  26. #include <asm/arch/mxc_hdmi.h>
  27. #include <asm/arch/crm_regs.h>
  28. #include <linux/fb.h>
  29. #include <ipu_pixfmt.h>
  30. #include <asm/io.h>
  31. #include <asm/arch/sys_proto.h>
  32. #include <pwm.h>
  33. struct i2c_pads_info i2c_pad_info3 = {
  34. .scl = {
  35. .i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | PC,
  36. .gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | PC,
  37. .gp = IMX_GPIO_NR(3, 17)
  38. },
  39. .sda = {
  40. .i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | PC,
  41. .gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | PC,
  42. .gp = IMX_GPIO_NR(3, 18)
  43. }
  44. };
  45. iomux_v3_cfg_t const uart1_pads[] = {
  46. MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
  47. MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
  48. };
  49. iomux_v3_cfg_t const uart5_pads[] = {
  50. MX6_PAD_CSI0_DAT14__UART5_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
  51. MX6_PAD_CSI0_DAT15__UART5_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
  52. };
  53. iomux_v3_cfg_t const gpio_pads[] = {
  54. /* LED enable */
  55. MX6_PAD_SD4_DAT5__GPIO2_IO13 | MUX_PAD_CTRL(NO_PAD_CTRL),
  56. /* spi flash WP protect */
  57. MX6_PAD_SD4_DAT7__GPIO2_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
  58. /* backlight enable */
  59. MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
  60. /* LED yellow */
  61. MX6_PAD_GPIO_3__GPIO1_IO03 | MUX_PAD_CTRL(NO_PAD_CTRL),
  62. /* LED red */
  63. MX6_PAD_GPIO_4__GPIO1_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL),
  64. /* LED green */
  65. MX6_PAD_GPIO_5__GPIO1_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
  66. /* LED blue */
  67. MX6_PAD_GPIO_6__GPIO1_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
  68. /* i2c4 scl */
  69. MX6_PAD_GPIO_7__GPIO1_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
  70. /* i2c4 sda */
  71. MX6_PAD_GPIO_8__GPIO1_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
  72. /* spi CS 1 */
  73. MX6_PAD_EIM_A25__GPIO5_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
  74. };
  75. static iomux_v3_cfg_t const misc_pads[] = {
  76. MX6_PAD_GPIO_1__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL),
  77. /* OTG Power enable */
  78. MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
  79. MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
  80. };
  81. iomux_v3_cfg_t const enet_pads[] = {
  82. MX6_PAD_GPIO_16__ENET_REF_CLK | MUX_PAD_CTRL(0x4001b0a8),
  83. MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),
  84. MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
  85. MX6_PAD_ENET_TXD0__ENET_TX_DATA0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
  86. MX6_PAD_ENET_TXD1__ENET_TX_DATA1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
  87. MX6_PAD_ENET_TX_EN__ENET_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
  88. MX6_PAD_ENET_RX_ER__ENET_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
  89. MX6_PAD_ENET_RXD0__ENET_RX_DATA0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
  90. MX6_PAD_ENET_RXD1__ENET_RX_DATA1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
  91. MX6_PAD_ENET_CRS_DV__ENET_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
  92. };
  93. static void setup_iomux_enet(void)
  94. {
  95. struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
  96. imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
  97. /* set GPIO_16 as ENET_REF_CLK_OUT */
  98. setbits_le32(&iomux->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
  99. }
  100. static iomux_v3_cfg_t const backlight_pads[] = {
  101. MX6_PAD_GPIO_9__PWM1_OUT | MUX_PAD_CTRL(NO_PAD_CTRL),
  102. MX6_PAD_SD4_DAT1__PWM3_OUT | MUX_PAD_CTRL(NO_PAD_CTRL),
  103. MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
  104. };
  105. iomux_v3_cfg_t const ecspi4_pads[] = {
  106. MX6_PAD_EIM_D21__ECSPI4_SCLK | MUX_PAD_CTRL(NO_PAD_CTRL),
  107. MX6_PAD_EIM_D22__ECSPI4_MISO | MUX_PAD_CTRL(NO_PAD_CTRL),
  108. MX6_PAD_EIM_D28__ECSPI4_MOSI | MUX_PAD_CTRL(NO_PAD_CTRL),
  109. MX6_PAD_EIM_D20__GPIO3_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
  110. };
  111. static iomux_v3_cfg_t const display_pads[] = {
  112. MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(DISP_PAD_CTRL),
  113. MX6_PAD_DI0_PIN15__IPU1_DI0_PIN15,
  114. MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02,
  115. MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03,
  116. MX6_PAD_DI0_PIN4__GPIO4_IO20,
  117. MX6_PAD_DISP0_DAT0__IPU1_DISP0_DATA00,
  118. MX6_PAD_DISP0_DAT1__IPU1_DISP0_DATA01,
  119. MX6_PAD_DISP0_DAT2__IPU1_DISP0_DATA02,
  120. MX6_PAD_DISP0_DAT3__IPU1_DISP0_DATA03,
  121. MX6_PAD_DISP0_DAT4__IPU1_DISP0_DATA04,
  122. MX6_PAD_DISP0_DAT5__IPU1_DISP0_DATA05,
  123. MX6_PAD_DISP0_DAT6__IPU1_DISP0_DATA06,
  124. MX6_PAD_DISP0_DAT7__IPU1_DISP0_DATA07,
  125. MX6_PAD_DISP0_DAT8__IPU1_DISP0_DATA08,
  126. MX6_PAD_DISP0_DAT9__IPU1_DISP0_DATA09,
  127. MX6_PAD_DISP0_DAT10__IPU1_DISP0_DATA10,
  128. MX6_PAD_DISP0_DAT11__IPU1_DISP0_DATA11,
  129. MX6_PAD_DISP0_DAT12__IPU1_DISP0_DATA12,
  130. MX6_PAD_DISP0_DAT13__IPU1_DISP0_DATA13,
  131. MX6_PAD_DISP0_DAT14__IPU1_DISP0_DATA14,
  132. MX6_PAD_DISP0_DAT15__IPU1_DISP0_DATA15,
  133. MX6_PAD_DISP0_DAT16__IPU1_DISP0_DATA16,
  134. MX6_PAD_DISP0_DAT17__IPU1_DISP0_DATA17,
  135. MX6_PAD_DISP0_DAT18__IPU1_DISP0_DATA18,
  136. MX6_PAD_DISP0_DAT19__IPU1_DISP0_DATA19,
  137. MX6_PAD_DISP0_DAT20__IPU1_DISP0_DATA20,
  138. MX6_PAD_DISP0_DAT21__IPU1_DISP0_DATA21,
  139. MX6_PAD_DISP0_DAT22__IPU1_DISP0_DATA22,
  140. MX6_PAD_DISP0_DAT23__IPU1_DISP0_DATA23,
  141. };
  142. int board_spi_cs_gpio(unsigned bus, unsigned cs)
  143. {
  144. return (bus == CONFIG_SF_DEFAULT_BUS && cs == CONFIG_SF_DEFAULT_CS)
  145. ? (IMX_GPIO_NR(3, 20)) : -1;
  146. }
  147. static void setup_spi(void)
  148. {
  149. int i;
  150. imx_iomux_v3_setup_multiple_pads(ecspi4_pads, ARRAY_SIZE(ecspi4_pads));
  151. for (i = 0; i < 3; i++)
  152. enable_spi_clk(true, i);
  153. /* set cs1 to high */
  154. gpio_direction_output(ECSPI4_CS1, 1);
  155. }
  156. static void setup_iomux_uart(void)
  157. {
  158. imx_iomux_v3_setup_multiple_pads(uart5_pads, ARRAY_SIZE(uart5_pads));
  159. }
  160. int board_eth_init(bd_t *bis)
  161. {
  162. struct iomuxc *iomuxc_regs =
  163. (struct iomuxc *)IOMUXC_BASE_ADDR;
  164. int ret;
  165. /* clear gpr1[14], gpr1[18:17] to select anatop clock */
  166. clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC_MASK, 0);
  167. ret = enable_fec_anatop_clock(0, ENET_50MHZ);
  168. if (ret)
  169. return ret;
  170. setup_iomux_enet();
  171. return cpu_eth_init(bis);
  172. }
  173. static void enable_lvds(struct display_info_t const *dev)
  174. {
  175. imx_iomux_v3_setup_multiple_pads(
  176. display_pads,
  177. ARRAY_SIZE(display_pads));
  178. imx_iomux_v3_setup_multiple_pads(
  179. backlight_pads,
  180. ARRAY_SIZE(backlight_pads));
  181. /* enable backlight PWM 3 */
  182. if (pwm_init(2, 0, 0))
  183. goto error;
  184. /* duty cycle 500ns, period: 3000ns */
  185. if (pwm_config(2, 500, 3000))
  186. goto error;
  187. if (pwm_enable(2))
  188. goto error;
  189. return;
  190. error:
  191. puts("error init pwm for backlight\n");
  192. return;
  193. }
  194. static void setup_display(void)
  195. {
  196. struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  197. int reg;
  198. enable_ipu_clock();
  199. reg = readl(&mxc_ccm->cs2cdr);
  200. /* select pll 5 clock */
  201. reg &= MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
  202. reg &= MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
  203. writel(reg, &mxc_ccm->cs2cdr);
  204. imx_iomux_v3_setup_multiple_pads(backlight_pads,
  205. ARRAY_SIZE(backlight_pads));
  206. }
  207. static void setup_iomux_gpio(void)
  208. {
  209. imx_iomux_v3_setup_multiple_pads(gpio_pads, ARRAY_SIZE(gpio_pads));
  210. }
  211. int board_early_init_f(void)
  212. {
  213. setup_iomux_uart();
  214. setup_iomux_gpio();
  215. setup_display();
  216. return 0;
  217. }
  218. static void setup_i2c4(void)
  219. {
  220. /* i2c4 not used, set it to gpio input */
  221. gpio_request(IMX_GPIO_NR(1, 7), "i2c4_scl");
  222. gpio_direction_input(IMX_GPIO_NR(1, 7));
  223. gpio_request(IMX_GPIO_NR(1, 8), "i2c4_sda");
  224. gpio_direction_input(IMX_GPIO_NR(1, 8));
  225. }
  226. static void setup_board_gpio(void)
  227. {
  228. /* enable LED */
  229. gpio_request(IMX_GPIO_NR(2, 13), "LED ena");
  230. gpio_direction_output(IMX_GPIO_NR(2, 13), 0);
  231. gpio_request(IMX_GPIO_NR(1, 3), "LED yellow");
  232. gpio_direction_output(IMX_GPIO_NR(1, 3), 1);
  233. gpio_request(IMX_GPIO_NR(1, 4), "LED red");
  234. gpio_direction_output(IMX_GPIO_NR(1, 4), 1);
  235. gpio_request(IMX_GPIO_NR(1, 5), "LED green");
  236. gpio_direction_output(IMX_GPIO_NR(1, 5), 1);
  237. gpio_request(IMX_GPIO_NR(1, 6), "LED blue");
  238. gpio_direction_output(IMX_GPIO_NR(1, 6), 1);
  239. }
  240. static void setup_board_spi(void)
  241. {
  242. }