mach-mx27_3ds.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /*
  2. * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
  3. *
  4. * Author: Fabio Estevam <fabio.estevam@freescale.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. /*
  17. * This machine is known as:
  18. * - i.MX27 3-Stack Development System
  19. * - i.MX27 Platform Development Kit (i.MX27 PDK)
  20. */
  21. #include <linux/platform_device.h>
  22. #include <linux/gpio.h>
  23. #include <linux/irq.h>
  24. #include <linux/usb/otg.h>
  25. #include <linux/usb/ulpi.h>
  26. #include <linux/delay.h>
  27. #include <linux/mfd/mc13783.h>
  28. #include <linux/spi/spi.h>
  29. #include <linux/regulator/machine.h>
  30. #include <asm/mach-types.h>
  31. #include <asm/mach/arch.h>
  32. #include <asm/mach/time.h>
  33. #include <mach/hardware.h>
  34. #include <mach/common.h>
  35. #include <mach/iomux-mx27.h>
  36. #include <mach/ulpi.h>
  37. #include "devices-imx27.h"
  38. #define SD1_EN_GPIO (GPIO_PORTB + 25)
  39. #define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23)
  40. #define SPI2_SS0 (GPIO_PORTD + 21)
  41. static const int mx27pdk_pins[] __initconst = {
  42. /* UART1 */
  43. PE12_PF_UART1_TXD,
  44. PE13_PF_UART1_RXD,
  45. PE14_PF_UART1_CTS,
  46. PE15_PF_UART1_RTS,
  47. /* FEC */
  48. PD0_AIN_FEC_TXD0,
  49. PD1_AIN_FEC_TXD1,
  50. PD2_AIN_FEC_TXD2,
  51. PD3_AIN_FEC_TXD3,
  52. PD4_AOUT_FEC_RX_ER,
  53. PD5_AOUT_FEC_RXD1,
  54. PD6_AOUT_FEC_RXD2,
  55. PD7_AOUT_FEC_RXD3,
  56. PD8_AF_FEC_MDIO,
  57. PD9_AIN_FEC_MDC,
  58. PD10_AOUT_FEC_CRS,
  59. PD11_AOUT_FEC_TX_CLK,
  60. PD12_AOUT_FEC_RXD0,
  61. PD13_AOUT_FEC_RX_DV,
  62. PD14_AOUT_FEC_RX_CLK,
  63. PD15_AOUT_FEC_COL,
  64. PD16_AIN_FEC_TX_ER,
  65. PF23_AIN_FEC_TX_EN,
  66. /* SDHC1 */
  67. PE18_PF_SD1_D0,
  68. PE19_PF_SD1_D1,
  69. PE20_PF_SD1_D2,
  70. PE21_PF_SD1_D3,
  71. PE22_PF_SD1_CMD,
  72. PE23_PF_SD1_CLK,
  73. SD1_EN_GPIO | GPIO_GPIO | GPIO_OUT,
  74. /* OTG */
  75. OTG_PHY_RESET_GPIO | GPIO_GPIO | GPIO_OUT,
  76. PC7_PF_USBOTG_DATA5,
  77. PC8_PF_USBOTG_DATA6,
  78. PC9_PF_USBOTG_DATA0,
  79. PC10_PF_USBOTG_DATA2,
  80. PC11_PF_USBOTG_DATA1,
  81. PC12_PF_USBOTG_DATA4,
  82. PC13_PF_USBOTG_DATA3,
  83. PE0_PF_USBOTG_NXT,
  84. PE1_PF_USBOTG_STP,
  85. PE2_PF_USBOTG_DIR,
  86. PE24_PF_USBOTG_CLK,
  87. PE25_PF_USBOTG_DATA7,
  88. /* CSPI2 */
  89. PD22_PF_CSPI2_SCLK,
  90. PD23_PF_CSPI2_MISO,
  91. PD24_PF_CSPI2_MOSI,
  92. };
  93. static const struct imxuart_platform_data uart_pdata __initconst = {
  94. .flags = IMXUART_HAVE_RTSCTS,
  95. };
  96. /*
  97. * Matrix keyboard
  98. */
  99. static const uint32_t mx27_3ds_keymap[] = {
  100. KEY(0, 0, KEY_UP),
  101. KEY(0, 1, KEY_DOWN),
  102. KEY(1, 0, KEY_RIGHT),
  103. KEY(1, 1, KEY_LEFT),
  104. KEY(1, 2, KEY_ENTER),
  105. KEY(2, 0, KEY_F6),
  106. KEY(2, 1, KEY_F8),
  107. KEY(2, 2, KEY_F9),
  108. KEY(2, 3, KEY_F10),
  109. };
  110. static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = {
  111. .keymap = mx27_3ds_keymap,
  112. .keymap_size = ARRAY_SIZE(mx27_3ds_keymap),
  113. };
  114. static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
  115. void *data)
  116. {
  117. return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING |
  118. IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
  119. }
  120. static void mx27_3ds_sdhc1_exit(struct device *dev, void *data)
  121. {
  122. free_irq(IRQ_GPIOB(26), data);
  123. }
  124. static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
  125. .init = mx27_3ds_sdhc1_init,
  126. .exit = mx27_3ds_sdhc1_exit,
  127. };
  128. static void mx27_3ds_sdhc1_enable_level_translator(void)
  129. {
  130. /* Turn on TXB0108 OE pin */
  131. gpio_request(SD1_EN_GPIO, "sd1_enable");
  132. gpio_direction_output(SD1_EN_GPIO, 1);
  133. }
  134. static int otg_phy_init(void)
  135. {
  136. gpio_request(OTG_PHY_RESET_GPIO, "usb-otg-reset");
  137. gpio_direction_output(OTG_PHY_RESET_GPIO, 0);
  138. mdelay(1);
  139. gpio_set_value(OTG_PHY_RESET_GPIO, 1);
  140. return 0;
  141. }
  142. #if defined(CONFIG_USB_ULPI)
  143. static struct mxc_usbh_platform_data otg_pdata __initdata = {
  144. .portsc = MXC_EHCI_MODE_ULPI,
  145. .flags = MXC_EHCI_INTERFACE_DIFF_UNI,
  146. };
  147. #endif
  148. static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
  149. .operating_mode = FSL_USB2_DR_DEVICE,
  150. .phy_mode = FSL_USB2_PHY_ULPI,
  151. };
  152. static int otg_mode_host;
  153. static int __init mx27_3ds_otg_mode(char *options)
  154. {
  155. if (!strcmp(options, "host"))
  156. otg_mode_host = 1;
  157. else if (!strcmp(options, "device"))
  158. otg_mode_host = 0;
  159. else
  160. pr_info("otg_mode neither \"host\" nor \"device\". "
  161. "Defaulting to device\n");
  162. return 0;
  163. }
  164. __setup("otg_mode=", mx27_3ds_otg_mode);
  165. /* Regulators */
  166. static struct regulator_consumer_supply vmmc1_consumers[] = {
  167. REGULATOR_SUPPLY("lcd_2v8", NULL),
  168. };
  169. static struct regulator_init_data vmmc1_init = {
  170. .constraints = {
  171. .min_uV = 2800000,
  172. .max_uV = 2800000,
  173. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
  174. },
  175. .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),
  176. .consumer_supplies = vmmc1_consumers,
  177. };
  178. static struct regulator_consumer_supply vgen_consumers[] = {
  179. REGULATOR_SUPPLY("vdd_lcdio", NULL),
  180. };
  181. static struct regulator_init_data vgen_init = {
  182. .constraints = {
  183. .min_uV = 1800000,
  184. .max_uV = 1800000,
  185. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
  186. },
  187. .num_consumer_supplies = ARRAY_SIZE(vgen_consumers),
  188. .consumer_supplies = vgen_consumers,
  189. };
  190. static struct mc13783_regulator_init_data mx27_3ds_regulators[] = {
  191. {
  192. .id = MC13783_REGU_VMMC1,
  193. .init_data = &vmmc1_init,
  194. }, {
  195. .id = MC13783_REGU_VGEN,
  196. .init_data = &vgen_init,
  197. },
  198. };
  199. /* MC13783 */
  200. static struct mc13783_platform_data mc13783_pdata __initdata = {
  201. .regulators = mx27_3ds_regulators,
  202. .num_regulators = ARRAY_SIZE(mx27_3ds_regulators),
  203. .flags = MC13783_USE_REGULATOR,
  204. };
  205. /* SPI */
  206. static int spi2_internal_chipselect[] = {SPI2_SS0};
  207. static const struct spi_imx_master spi2_pdata __initconst = {
  208. .chipselect = spi2_internal_chipselect,
  209. .num_chipselect = ARRAY_SIZE(spi2_internal_chipselect),
  210. };
  211. static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {
  212. {
  213. .modalias = "mc13783",
  214. .max_speed_hz = 1000000,
  215. .bus_num = 1,
  216. .chip_select = 0, /* SS0 */
  217. .platform_data = &mc13783_pdata,
  218. .irq = IRQ_GPIOC(14),
  219. .mode = SPI_CS_HIGH,
  220. },
  221. };
  222. static void __init mx27pdk_init(void)
  223. {
  224. mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
  225. "mx27pdk");
  226. mx27_3ds_sdhc1_enable_level_translator();
  227. imx27_add_imx_uart0(&uart_pdata);
  228. imx27_add_fec(NULL);
  229. imx27_add_imx_keypad(&mx27_3ds_keymap_data);
  230. imx27_add_mxc_mmc(0, &sdhc1_pdata);
  231. imx27_add_imx2_wdt(NULL);
  232. otg_phy_init();
  233. #if defined(CONFIG_USB_ULPI)
  234. if (otg_mode_host) {
  235. otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
  236. ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
  237. imx27_add_mxc_ehci_otg(&otg_pdata);
  238. }
  239. #endif
  240. if (!otg_mode_host)
  241. imx27_add_fsl_usb2_udc(&otg_device_pdata);
  242. imx27_add_spi_imx1(&spi2_pdata);
  243. spi_register_board_info(mx27_3ds_spi_devs,
  244. ARRAY_SIZE(mx27_3ds_spi_devs));
  245. }
  246. static void __init mx27pdk_timer_init(void)
  247. {
  248. mx27_clocks_init(26000000);
  249. }
  250. static struct sys_timer mx27pdk_timer = {
  251. .init = mx27pdk_timer_init,
  252. };
  253. MACHINE_START(MX27_3DS, "Freescale MX27PDK")
  254. /* maintainer: Freescale Semiconductor, Inc. */
  255. .boot_params = MX27_PHYS_OFFSET + 0x100,
  256. .map_io = mx27_map_io,
  257. .init_irq = mx27_init_irq,
  258. .init_machine = mx27pdk_init,
  259. .timer = &mx27pdk_timer,
  260. MACHINE_END