usb-ehci.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
  28. static struct resource ehci_resources[] = {
  29. {
  30. .start = OMAP34XX_EHCI_BASE,
  31. .end = OMAP34XX_EHCI_BASE + SZ_1K - 1,
  32. .flags = IORESOURCE_MEM,
  33. },
  34. {
  35. .start = OMAP34XX_UHH_CONFIG_BASE,
  36. .end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1,
  37. .flags = IORESOURCE_MEM,
  38. },
  39. {
  40. .start = OMAP34XX_USBTLL_BASE,
  41. .end = OMAP34XX_USBTLL_BASE + SZ_4K - 1,
  42. .flags = IORESOURCE_MEM,
  43. },
  44. { /* general IRQ */
  45. .start = INT_34XX_EHCI_IRQ,
  46. .flags = IORESOURCE_IRQ,
  47. }
  48. };
  49. static u64 ehci_dmamask = ~(u32)0;
  50. static struct platform_device ehci_device = {
  51. .name = "ehci-omap",
  52. .id = 0,
  53. .dev = {
  54. .dma_mask = &ehci_dmamask,
  55. .coherent_dma_mask = 0xffffffff,
  56. .platform_data = NULL,
  57. },
  58. .num_resources = ARRAY_SIZE(ehci_resources),
  59. .resource = ehci_resources,
  60. };
  61. /* MUX settings for EHCI pins */
  62. /*
  63. * setup_ehci_io_mux - initialize IO pad mux for USBHOST
  64. */
  65. static void setup_ehci_io_mux(enum ehci_hcd_omap_mode *port_mode)
  66. {
  67. switch (port_mode[0]) {
  68. case EHCI_HCD_OMAP_MODE_PHY:
  69. omap_cfg_reg(Y9_3430_USB1HS_PHY_STP);
  70. omap_cfg_reg(Y8_3430_USB1HS_PHY_CLK);
  71. omap_cfg_reg(AA14_3430_USB1HS_PHY_DIR);
  72. omap_cfg_reg(AA11_3430_USB1HS_PHY_NXT);
  73. omap_cfg_reg(W13_3430_USB1HS_PHY_DATA0);
  74. omap_cfg_reg(W12_3430_USB1HS_PHY_DATA1);
  75. omap_cfg_reg(W11_3430_USB1HS_PHY_DATA2);
  76. omap_cfg_reg(Y11_3430_USB1HS_PHY_DATA3);
  77. omap_cfg_reg(W9_3430_USB1HS_PHY_DATA4);
  78. omap_cfg_reg(Y12_3430_USB1HS_PHY_DATA5);
  79. omap_cfg_reg(W8_3430_USB1HS_PHY_DATA6);
  80. omap_cfg_reg(Y13_3430_USB1HS_PHY_DATA7);
  81. break;
  82. case EHCI_HCD_OMAP_MODE_TLL:
  83. omap_cfg_reg(Y9_3430_USB1HS_TLL_STP);
  84. omap_cfg_reg(Y8_3430_USB1HS_TLL_CLK);
  85. omap_cfg_reg(AA14_3430_USB1HS_TLL_DIR);
  86. omap_cfg_reg(AA11_3430_USB1HS_TLL_NXT);
  87. omap_cfg_reg(W13_3430_USB1HS_TLL_DATA0);
  88. omap_cfg_reg(W12_3430_USB1HS_TLL_DATA1);
  89. omap_cfg_reg(W11_3430_USB1HS_TLL_DATA2);
  90. omap_cfg_reg(Y11_3430_USB1HS_TLL_DATA3);
  91. omap_cfg_reg(W9_3430_USB1HS_TLL_DATA4);
  92. omap_cfg_reg(Y12_3430_USB1HS_TLL_DATA5);
  93. omap_cfg_reg(W8_3430_USB1HS_TLL_DATA6);
  94. omap_cfg_reg(Y13_3430_USB1HS_TLL_DATA7);
  95. break;
  96. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  97. /* FALLTHROUGH */
  98. default:
  99. break;
  100. }
  101. switch (port_mode[1]) {
  102. case EHCI_HCD_OMAP_MODE_PHY:
  103. omap_cfg_reg(AA10_3430_USB2HS_PHY_STP);
  104. omap_cfg_reg(AA8_3430_USB2HS_PHY_CLK);
  105. omap_cfg_reg(AA9_3430_USB2HS_PHY_DIR);
  106. omap_cfg_reg(AB11_3430_USB2HS_PHY_NXT);
  107. omap_cfg_reg(AB10_3430_USB2HS_PHY_DATA0);
  108. omap_cfg_reg(AB9_3430_USB2HS_PHY_DATA1);
  109. omap_cfg_reg(W3_3430_USB2HS_PHY_DATA2);
  110. omap_cfg_reg(T4_3430_USB2HS_PHY_DATA3);
  111. omap_cfg_reg(T3_3430_USB2HS_PHY_DATA4);
  112. omap_cfg_reg(R3_3430_USB2HS_PHY_DATA5);
  113. omap_cfg_reg(R4_3430_USB2HS_PHY_DATA6);
  114. omap_cfg_reg(T2_3430_USB2HS_PHY_DATA7);
  115. break;
  116. case EHCI_HCD_OMAP_MODE_TLL:
  117. omap_cfg_reg(AA10_3430_USB2HS_TLL_STP);
  118. omap_cfg_reg(AA8_3430_USB2HS_TLL_CLK);
  119. omap_cfg_reg(AA9_3430_USB2HS_TLL_DIR);
  120. omap_cfg_reg(AB11_3430_USB2HS_TLL_NXT);
  121. omap_cfg_reg(AB10_3430_USB2HS_TLL_DATA0);
  122. omap_cfg_reg(AB9_3430_USB2HS_TLL_DATA1);
  123. omap_cfg_reg(W3_3430_USB2HS_TLL_DATA2);
  124. omap_cfg_reg(T4_3430_USB2HS_TLL_DATA3);
  125. omap_cfg_reg(T3_3430_USB2HS_TLL_DATA4);
  126. omap_cfg_reg(R3_3430_USB2HS_TLL_DATA5);
  127. omap_cfg_reg(R4_3430_USB2HS_TLL_DATA6);
  128. omap_cfg_reg(T2_3430_USB2HS_TLL_DATA7);
  129. break;
  130. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  131. /* FALLTHROUGH */
  132. default:
  133. break;
  134. }
  135. switch (port_mode[2]) {
  136. case EHCI_HCD_OMAP_MODE_PHY:
  137. printk(KERN_WARNING "Port3 can't be used in PHY mode\n");
  138. break;
  139. case EHCI_HCD_OMAP_MODE_TLL:
  140. omap_cfg_reg(AB3_3430_USB3HS_TLL_STP);
  141. omap_cfg_reg(AA6_3430_USB3HS_TLL_CLK);
  142. omap_cfg_reg(AA3_3430_USB3HS_TLL_DIR);
  143. omap_cfg_reg(Y3_3430_USB3HS_TLL_NXT);
  144. omap_cfg_reg(AA5_3430_USB3HS_TLL_DATA0);
  145. omap_cfg_reg(Y4_3430_USB3HS_TLL_DATA1);
  146. omap_cfg_reg(Y5_3430_USB3HS_TLL_DATA2);
  147. omap_cfg_reg(W5_3430_USB3HS_TLL_DATA3);
  148. omap_cfg_reg(AB12_3430_USB3HS_TLL_DATA4);
  149. omap_cfg_reg(AB13_3430_USB3HS_TLL_DATA5);
  150. omap_cfg_reg(AA13_3430_USB3HS_TLL_DATA6);
  151. omap_cfg_reg(AA12_3430_USB3HS_TLL_DATA7);
  152. break;
  153. case EHCI_HCD_OMAP_MODE_UNKNOWN:
  154. /* FALLTHROUGH */
  155. default:
  156. break;
  157. }
  158. return;
  159. }
  160. void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
  161. {
  162. platform_device_add_data(&ehci_device, pdata, sizeof(*pdata));
  163. /* Setup Pin IO MUX for EHCI */
  164. if (cpu_is_omap34xx())
  165. setup_ehci_io_mux(pdata->port_mode);
  166. if (platform_device_register(&ehci_device) < 0) {
  167. printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n");
  168. return;
  169. }
  170. }
  171. #else
  172. void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
  173. {
  174. }
  175. #endif /* CONFIG_USB_EHCI_HCD */