mach-mx27_3ds.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 <asm/mach-types.h>
  28. #include <asm/mach/arch.h>
  29. #include <asm/mach/time.h>
  30. #include <mach/hardware.h>
  31. #include <mach/common.h>
  32. #include <mach/iomux-mx27.h>
  33. #include <mach/ulpi.h>
  34. #include "devices-imx27.h"
  35. #define SD1_EN_GPIO (GPIO_PORTB + 25)
  36. #define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23)
  37. static const int mx27pdk_pins[] __initconst = {
  38. /* UART1 */
  39. PE12_PF_UART1_TXD,
  40. PE13_PF_UART1_RXD,
  41. PE14_PF_UART1_CTS,
  42. PE15_PF_UART1_RTS,
  43. /* FEC */
  44. PD0_AIN_FEC_TXD0,
  45. PD1_AIN_FEC_TXD1,
  46. PD2_AIN_FEC_TXD2,
  47. PD3_AIN_FEC_TXD3,
  48. PD4_AOUT_FEC_RX_ER,
  49. PD5_AOUT_FEC_RXD1,
  50. PD6_AOUT_FEC_RXD2,
  51. PD7_AOUT_FEC_RXD3,
  52. PD8_AF_FEC_MDIO,
  53. PD9_AIN_FEC_MDC,
  54. PD10_AOUT_FEC_CRS,
  55. PD11_AOUT_FEC_TX_CLK,
  56. PD12_AOUT_FEC_RXD0,
  57. PD13_AOUT_FEC_RX_DV,
  58. PD14_AOUT_FEC_RX_CLK,
  59. PD15_AOUT_FEC_COL,
  60. PD16_AIN_FEC_TX_ER,
  61. PF23_AIN_FEC_TX_EN,
  62. /* SDHC1 */
  63. PE18_PF_SD1_D0,
  64. PE19_PF_SD1_D1,
  65. PE20_PF_SD1_D2,
  66. PE21_PF_SD1_D3,
  67. PE22_PF_SD1_CMD,
  68. PE23_PF_SD1_CLK,
  69. SD1_EN_GPIO | GPIO_GPIO | GPIO_OUT,
  70. /* OTG */
  71. OTG_PHY_RESET_GPIO | GPIO_GPIO | GPIO_OUT,
  72. PC7_PF_USBOTG_DATA5,
  73. PC8_PF_USBOTG_DATA6,
  74. PC9_PF_USBOTG_DATA0,
  75. PC10_PF_USBOTG_DATA2,
  76. PC11_PF_USBOTG_DATA1,
  77. PC12_PF_USBOTG_DATA4,
  78. PC13_PF_USBOTG_DATA3,
  79. PE0_PF_USBOTG_NXT,
  80. PE1_PF_USBOTG_STP,
  81. PE2_PF_USBOTG_DIR,
  82. PE24_PF_USBOTG_CLK,
  83. PE25_PF_USBOTG_DATA7,
  84. };
  85. static const struct imxuart_platform_data uart_pdata __initconst = {
  86. .flags = IMXUART_HAVE_RTSCTS,
  87. };
  88. /*
  89. * Matrix keyboard
  90. */
  91. static const uint32_t mx27_3ds_keymap[] = {
  92. KEY(0, 0, KEY_UP),
  93. KEY(0, 1, KEY_DOWN),
  94. KEY(1, 0, KEY_RIGHT),
  95. KEY(1, 1, KEY_LEFT),
  96. KEY(1, 2, KEY_ENTER),
  97. KEY(2, 0, KEY_F6),
  98. KEY(2, 1, KEY_F8),
  99. KEY(2, 2, KEY_F9),
  100. KEY(2, 3, KEY_F10),
  101. };
  102. static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = {
  103. .keymap = mx27_3ds_keymap,
  104. .keymap_size = ARRAY_SIZE(mx27_3ds_keymap),
  105. };
  106. static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
  107. void *data)
  108. {
  109. return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING |
  110. IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
  111. }
  112. static void mx27_3ds_sdhc1_exit(struct device *dev, void *data)
  113. {
  114. free_irq(IRQ_GPIOB(26), data);
  115. }
  116. static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
  117. .init = mx27_3ds_sdhc1_init,
  118. .exit = mx27_3ds_sdhc1_exit,
  119. };
  120. static void mx27_3ds_sdhc1_enable_level_translator(void)
  121. {
  122. /* Turn on TXB0108 OE pin */
  123. gpio_request(SD1_EN_GPIO, "sd1_enable");
  124. gpio_direction_output(SD1_EN_GPIO, 1);
  125. }
  126. static int otg_phy_init(void)
  127. {
  128. gpio_request(OTG_PHY_RESET_GPIO, "usb-otg-reset");
  129. gpio_direction_output(OTG_PHY_RESET_GPIO, 0);
  130. mdelay(1);
  131. gpio_set_value(OTG_PHY_RESET_GPIO, 1);
  132. return 0;
  133. }
  134. #if defined(CONFIG_USB_ULPI)
  135. static struct mxc_usbh_platform_data otg_pdata __initdata = {
  136. .portsc = MXC_EHCI_MODE_ULPI,
  137. .flags = MXC_EHCI_INTERFACE_DIFF_UNI,
  138. };
  139. #endif
  140. static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
  141. .operating_mode = FSL_USB2_DR_DEVICE,
  142. .phy_mode = FSL_USB2_PHY_ULPI,
  143. };
  144. static int otg_mode_host;
  145. static int __init mx27_3ds_otg_mode(char *options)
  146. {
  147. if (!strcmp(options, "host"))
  148. otg_mode_host = 1;
  149. else if (!strcmp(options, "device"))
  150. otg_mode_host = 0;
  151. else
  152. pr_info("otg_mode neither \"host\" nor \"device\". "
  153. "Defaulting to device\n");
  154. return 0;
  155. }
  156. __setup("otg_mode=", mx27_3ds_otg_mode);
  157. static void __init mx27pdk_init(void)
  158. {
  159. mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
  160. "mx27pdk");
  161. mx27_3ds_sdhc1_enable_level_translator();
  162. imx27_add_imx_uart0(&uart_pdata);
  163. imx27_add_fec(NULL);
  164. imx27_add_imx_keypad(&mx27_3ds_keymap_data);
  165. imx27_add_mxc_mmc(0, &sdhc1_pdata);
  166. imx27_add_imx2_wdt(NULL);
  167. otg_phy_init();
  168. #if defined(CONFIG_USB_ULPI)
  169. if (otg_mode_host) {
  170. otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
  171. ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
  172. imx27_add_mxc_ehci_otg(&otg_pdata);
  173. }
  174. #endif
  175. if (!otg_mode_host)
  176. imx27_add_fsl_usb2_udc(&otg_device_pdata);
  177. }
  178. static void __init mx27pdk_timer_init(void)
  179. {
  180. mx27_clocks_init(26000000);
  181. }
  182. static struct sys_timer mx27pdk_timer = {
  183. .init = mx27pdk_timer_init,
  184. };
  185. MACHINE_START(MX27_3DS, "Freescale MX27PDK")
  186. /* maintainer: Freescale Semiconductor, Inc. */
  187. .boot_params = MX27_PHYS_OFFSET + 0x100,
  188. .map_io = mx27_map_io,
  189. .init_irq = mx27_init_irq,
  190. .init_machine = mx27pdk_init,
  191. .timer = &mx27pdk_timer,
  192. MACHINE_END