usb-ehci.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * linux/arch/arm/mach-omap2/usb-ehci.c
  3. *
  4. * This file will contain the board specific details for the
  5. * Synopsys EHCI host controller on OMAP3430
  6. *
  7. * Copyright (C) 2007 Texas Instruments
  8. * Author: Vikram Pandita <vikram.pandita@ti.com>
  9. *
  10. * Generalization by:
  11. * Felipe Balbi <felipe.balbi@nokia.com>
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. */
  17. #include <linux/types.h>
  18. #include <linux/errno.h>
  19. #include <linux/delay.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/clk.h>
  22. #include <asm/io.h>
  23. #include <plat/mux.h>
  24. #include <mach/hardware.h>
  25. #include <mach/irqs.h>
  26. #include <plat/usb.h>
  27. #include "mux.h"
  28. #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
  29. static struct resource ehci_resources[] = {
  30. {
  31. .start = OMAP34XX_EHCI_BASE,
  32. .end = OMAP34XX_EHCI_BASE + SZ_1K - 1,
  33. .flags = IORESOURCE_MEM,
  34. },
  35. {
  36. .start = OMAP34XX_UHH_CONFIG_BASE,
  37. .end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1,
  38. .flags = IORESOURCE_MEM,
  39. },
  40. {
  41. .start = OMAP34XX_USBTLL_BASE,
  42. .end = OMAP34XX_USBTLL_BASE + SZ_4K - 1,
  43. .flags = IORESOURCE_MEM,
  44. },
  45. { /* general IRQ */
  46. .start = INT_34XX_EHCI_IRQ,
  47. .flags = IORESOURCE_IRQ,
  48. }
  49. };
  50. static u64 ehci_dmamask = ~(u32)0;
  51. static struct platform_device ehci_device = {
  52. .name = "ehci-omap",
  53. .id = 0,
  54. .dev = {
  55. .dma_mask = &ehci_dmamask,
  56. .coherent_dma_mask = 0xffffffff,
  57. .platform_data = NULL,
  58. },
  59. .num_resources = ARRAY_SIZE(ehci_resources),
  60. .resource = ehci_resources,
  61. };
  62. /* MUX settings for EHCI pins */
  63. /*
  64. * setup_ehci_io_mux - initialize IO pad mux for USBHOST
  65. */
  66. static void setup_ehci_io_mux(enum ehci_hcd_omap_mode *port_mode)
  67. {
  68. switch (port_mode[0]) {
  69. case EHCI_HCD_OMAP_MODE_PHY:
  70. omap_mux_init_signal("hsusb1_stp", OMAP_PIN_OUTPUT);
  71. omap_mux_init_signal("hsusb1_clk", OMAP_PIN_OUTPUT);
  72. omap_mux_init_signal("hsusb1_dir", OMAP_PIN_INPUT_PULLDOWN);
  73. omap_mux_init_signal("hsusb1_nxt", OMAP_PIN_INPUT_PULLDOWN);
  74. omap_mux_init_signal("hsusb1_data0", OMAP_PIN_INPUT_PULLDOWN);
  75. omap_mux_init_signal("hsusb1_data1", OMAP_PIN_INPUT_PULLDOWN);
  76. omap_mux_init_signal("hsusb1_data2", OMAP_PIN_INPUT_PULLDOWN);
  77. omap_mux_init_signal("hsusb1_data3", OMAP_PIN_INPUT_PULLDOWN);
  78. omap_mux_init_signal("hsusb1_data4", OMAP_PIN_INPUT_PULLDOWN);
  79. omap_mux_init_signal("hsusb1_data5", OMAP_PIN_INPUT_PULLDOWN);
  80. omap_mux_init_signal("hsusb1_data6", OMAP_PIN_INPUT_PULLDOWN);
  81. omap_mux_init_signal("hsusb1_data7", OMAP_PIN_INPUT_PULLDOWN);
  82. break;
  83. case EHCI_HCD_OMAP_MODE_TLL:
  84. omap_mux_init_signal("hsusb1_tll_stp",
  85. OMAP_PIN_INPUT_PULLUP);
  86. omap_mux_init_signal("hsusb1_tll_clk",
  87. OMAP_PIN_INPUT_PULLDOWN);
  88. omap_mux_init_signal("hsusb1_tll_dir",
  89. OMAP_PIN_INPUT_PULLDOWN);
  90. omap_mux_init_signal("hsusb1_tll_nxt",
  91. OMAP_PIN_INPUT_PULLDOWN);
  92. omap_mux_init_signal("hsusb1_tll_data0",
  93. OMAP_PIN_INPUT_PULLDOWN);
  94. omap_mux_init_signal("hsusb1_tll_data1",
  95. OMAP_PIN_INPUT_PULLDOWN);
  96. omap_mux_init_signal("hsusb1_tll_data2",
  97. OMAP_PIN_INPUT_PULLDOWN);
  98. omap_mux_init_signal("hsusb1_tll_data3",
  99. OMAP_PIN_INPUT_PULLDOWN);
  100. omap_mux_init_signal("hsusb1_tll_data4",
  101. OMAP_PIN_INPUT_PULLDOWN);
  102. omap_mux_init_signal("hsusb1_tll_data5",
  103. OMAP_PIN_INPUT_PULLDOWN);
  104. omap_mux_init_signal("hsusb1_tll_data6",
  105. OMAP_PIN_INPUT_PULLDOWN);
  106. omap_mux_init_signal("hsusb1_tll_data7",
  107. OMAP_PIN_INPUT_PULLDOWN);
  108. break;
  109. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  110. /* FALLTHROUGH */
  111. default:
  112. break;
  113. }
  114. switch (port_mode[1]) {
  115. case EHCI_HCD_OMAP_MODE_PHY:
  116. omap_mux_init_signal("hsusb2_stp", OMAP_PIN_OUTPUT);
  117. omap_mux_init_signal("hsusb2_clk", OMAP_PIN_OUTPUT);
  118. omap_mux_init_signal("hsusb2_dir", OMAP_PIN_INPUT_PULLDOWN);
  119. omap_mux_init_signal("hsusb2_nxt", OMAP_PIN_INPUT_PULLDOWN);
  120. omap_mux_init_signal("hsusb2_data0",
  121. OMAP_PIN_INPUT_PULLDOWN);
  122. omap_mux_init_signal("hsusb2_data1",
  123. OMAP_PIN_INPUT_PULLDOWN);
  124. omap_mux_init_signal("hsusb2_data2",
  125. OMAP_PIN_INPUT_PULLDOWN);
  126. omap_mux_init_signal("hsusb2_data3",
  127. OMAP_PIN_INPUT_PULLDOWN);
  128. omap_mux_init_signal("hsusb2_data4",
  129. OMAP_PIN_INPUT_PULLDOWN);
  130. omap_mux_init_signal("hsusb2_data5",
  131. OMAP_PIN_INPUT_PULLDOWN);
  132. omap_mux_init_signal("hsusb2_data6",
  133. OMAP_PIN_INPUT_PULLDOWN);
  134. omap_mux_init_signal("hsusb2_data7",
  135. OMAP_PIN_INPUT_PULLDOWN);
  136. break;
  137. case EHCI_HCD_OMAP_MODE_TLL:
  138. omap_mux_init_signal("hsusb2_tll_stp",
  139. OMAP_PIN_INPUT_PULLUP);
  140. omap_mux_init_signal("hsusb2_tll_clk",
  141. OMAP_PIN_INPUT_PULLDOWN);
  142. omap_mux_init_signal("hsusb2_tll_dir",
  143. OMAP_PIN_INPUT_PULLDOWN);
  144. omap_mux_init_signal("hsusb2_tll_nxt",
  145. OMAP_PIN_INPUT_PULLDOWN);
  146. omap_mux_init_signal("hsusb2_tll_data0",
  147. OMAP_PIN_INPUT_PULLDOWN);
  148. omap_mux_init_signal("hsusb2_tll_data1",
  149. OMAP_PIN_INPUT_PULLDOWN);
  150. omap_mux_init_signal("hsusb2_tll_data2",
  151. OMAP_PIN_INPUT_PULLDOWN);
  152. omap_mux_init_signal("hsusb2_tll_data3",
  153. OMAP_PIN_INPUT_PULLDOWN);
  154. omap_mux_init_signal("hsusb2_tll_data4",
  155. OMAP_PIN_INPUT_PULLDOWN);
  156. omap_mux_init_signal("hsusb2_tll_data5",
  157. OMAP_PIN_INPUT_PULLDOWN);
  158. omap_mux_init_signal("hsusb2_tll_data6",
  159. OMAP_PIN_INPUT_PULLDOWN);
  160. omap_mux_init_signal("hsusb2_tll_data7",
  161. OMAP_PIN_INPUT_PULLDOWN);
  162. break;
  163. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  164. /* FALLTHROUGH */
  165. default:
  166. break;
  167. }
  168. switch (port_mode[2]) {
  169. case EHCI_HCD_OMAP_MODE_PHY:
  170. printk(KERN_WARNING "Port3 can't be used in PHY mode\n");
  171. break;
  172. case EHCI_HCD_OMAP_MODE_TLL:
  173. omap_mux_init_signal("hsusb3_tll_stp",
  174. OMAP_PIN_INPUT_PULLUP);
  175. omap_mux_init_signal("hsusb3_tll_clk",
  176. OMAP_PIN_INPUT_PULLDOWN);
  177. omap_mux_init_signal("hsusb3_tll_dir",
  178. OMAP_PIN_INPUT_PULLDOWN);
  179. omap_mux_init_signal("hsusb3_tll_nxt",
  180. OMAP_PIN_INPUT_PULLDOWN);
  181. omap_mux_init_signal("hsusb3_tll_data0",
  182. OMAP_PIN_INPUT_PULLDOWN);
  183. omap_mux_init_signal("hsusb3_tll_data1",
  184. OMAP_PIN_INPUT_PULLDOWN);
  185. omap_mux_init_signal("hsusb3_tll_data2",
  186. OMAP_PIN_INPUT_PULLDOWN);
  187. omap_mux_init_signal("hsusb3_tll_data3",
  188. OMAP_PIN_INPUT_PULLDOWN);
  189. omap_mux_init_signal("hsusb3_tll_data4",
  190. OMAP_PIN_INPUT_PULLDOWN);
  191. omap_mux_init_signal("hsusb3_tll_data5",
  192. OMAP_PIN_INPUT_PULLDOWN);
  193. omap_mux_init_signal("hsusb3_tll_data6",
  194. OMAP_PIN_INPUT_PULLDOWN);
  195. omap_mux_init_signal("hsusb3_tll_data7",
  196. OMAP_PIN_INPUT_PULLDOWN);
  197. break;
  198. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  199. /* FALLTHROUGH */
  200. default:
  201. break;
  202. }
  203. return;
  204. }
  205. void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
  206. {
  207. platform_device_add_data(&ehci_device, pdata, sizeof(*pdata));
  208. /* Setup Pin IO MUX for EHCI */
  209. if (cpu_is_omap34xx())
  210. setup_ehci_io_mux(pdata->port_mode);
  211. if (platform_device_register(&ehci_device) < 0) {
  212. printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n");
  213. return;
  214. }
  215. }
  216. #else
  217. void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
  218. {
  219. }
  220. #endif /* CONFIG_USB_EHCI_HCD */