ehci.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License as published by the
  6. * Free Software Foundation; either version 2 of the License, or (at your
  7. * option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. * for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software Foundation,
  16. * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <linux/platform_device.h>
  19. #include <linux/io.h>
  20. #include <mach/hardware.h>
  21. #include <mach/mxc_ehci.h>
  22. #define USBCTRL_OTGBASE_OFFSET 0x600
  23. #define MX31_OTG_SIC_SHIFT 29
  24. #define MX31_OTG_SIC_MASK (0x3 << MX31_OTG_SIC_SHIFT)
  25. #define MX31_OTG_PM_BIT (1 << 24)
  26. #define MX31_H2_SIC_SHIFT 21
  27. #define MX31_H2_SIC_MASK (0x3 << MX31_H2_SIC_SHIFT)
  28. #define MX31_H2_PM_BIT (1 << 16)
  29. #define MX31_H2_DT_BIT (1 << 5)
  30. #define MX31_H1_SIC_SHIFT 13
  31. #define MX31_H1_SIC_MASK (0x3 << MX31_H1_SIC_SHIFT)
  32. #define MX31_H1_PM_BIT (1 << 8)
  33. #define MX31_H1_DT_BIT (1 << 4)
  34. #define MX35_OTG_SIC_SHIFT 29
  35. #define MX35_OTG_SIC_MASK (0x3 << MX35_OTG_SIC_SHIFT)
  36. #define MX35_OTG_PM_BIT (1 << 24)
  37. #define MX35_H1_SIC_SHIFT 21
  38. #define MX35_H1_SIC_MASK (0x3 << MX35_H1_SIC_SHIFT)
  39. #define MX35_H1_PM_BIT (1 << 8)
  40. #define MX35_H1_IPPUE_UP_BIT (1 << 7)
  41. #define MX35_H1_IPPUE_DOWN_BIT (1 << 6)
  42. #define MX35_H1_TLL_BIT (1 << 5)
  43. #define MX35_H1_USBTE_BIT (1 << 4)
  44. int mxc_set_usbcontrol(int port, unsigned int flags)
  45. {
  46. unsigned int v;
  47. #ifdef CONFIG_ARCH_MX3
  48. if (cpu_is_mx31()) {
  49. v = readl(MX31_IO_ADDRESS(MX31_OTG_BASE_ADDR +
  50. USBCTRL_OTGBASE_OFFSET));
  51. switch (port) {
  52. case 0: /* OTG port */
  53. v &= ~(MX31_OTG_SIC_MASK | MX31_OTG_PM_BIT);
  54. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  55. << MX31_OTG_SIC_SHIFT;
  56. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  57. v |= MX31_OTG_PM_BIT;
  58. break;
  59. case 1: /* H1 port */
  60. v &= ~(MX31_H1_SIC_MASK | MX31_H1_PM_BIT | MX31_H1_DT_BIT);
  61. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  62. << MX31_H1_SIC_SHIFT;
  63. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  64. v |= MX31_H1_PM_BIT;
  65. if (!(flags & MXC_EHCI_TTL_ENABLED))
  66. v |= MX31_H1_DT_BIT;
  67. break;
  68. case 2: /* H2 port */
  69. v &= ~(MX31_H2_SIC_MASK | MX31_H2_PM_BIT | MX31_H2_DT_BIT);
  70. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  71. << MX31_H2_SIC_SHIFT;
  72. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  73. v |= MX31_H2_PM_BIT;
  74. if (!(flags & MXC_EHCI_TTL_ENABLED))
  75. v |= MX31_H2_DT_BIT;
  76. break;
  77. default:
  78. return -EINVAL;
  79. }
  80. writel(v, MX31_IO_ADDRESS(MX31_OTG_BASE_ADDR +
  81. USBCTRL_OTGBASE_OFFSET));
  82. return 0;
  83. }
  84. if (cpu_is_mx35()) {
  85. v = readl(MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
  86. USBCTRL_OTGBASE_OFFSET));
  87. switch (port) {
  88. case 0: /* OTG port */
  89. v &= ~(MX35_OTG_SIC_MASK | MX35_OTG_PM_BIT);
  90. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  91. << MX35_OTG_SIC_SHIFT;
  92. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  93. v |= MX35_OTG_PM_BIT;
  94. break;
  95. case 1: /* H1 port */
  96. v &= ~(MX35_H1_SIC_MASK | MX35_H1_PM_BIT | MX35_H1_TLL_BIT |
  97. MX35_H1_USBTE_BIT | MX35_H1_IPPUE_DOWN_BIT | MX35_H1_IPPUE_UP_BIT);
  98. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  99. << MX35_H1_SIC_SHIFT;
  100. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  101. v |= MX35_H1_PM_BIT;
  102. if (!(flags & MXC_EHCI_TTL_ENABLED))
  103. v |= MX35_H1_TLL_BIT;
  104. if (flags & MXC_EHCI_INTERNAL_PHY)
  105. v |= MX35_H1_USBTE_BIT;
  106. if (flags & MXC_EHCI_IPPUE_DOWN)
  107. v |= MX35_H1_IPPUE_DOWN_BIT;
  108. if (flags & MXC_EHCI_IPPUE_UP)
  109. v |= MX35_H1_IPPUE_UP_BIT;
  110. break;
  111. default:
  112. return -EINVAL;
  113. }
  114. writel(v, MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
  115. USBCTRL_OTGBASE_OFFSET));
  116. return 0;
  117. }
  118. #endif /* CONFIG_ARCH_MX3 */
  119. #ifdef CONFIG_MACH_MX27
  120. if (cpu_is_mx27()) {
  121. /* On i.MX27 we can use the i.MX31 USBCTRL bits, they
  122. * are identical
  123. */
  124. v = readl(MX27_IO_ADDRESS(MX27_OTG_BASE_ADDR +
  125. USBCTRL_OTGBASE_OFFSET));
  126. switch (port) {
  127. case 0: /* OTG port */
  128. v &= ~(MX31_OTG_SIC_MASK | MX31_OTG_PM_BIT);
  129. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  130. << MX31_OTG_SIC_SHIFT;
  131. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  132. v |= MX31_OTG_PM_BIT;
  133. break;
  134. case 1: /* H1 port */
  135. v &= ~(MX31_H1_SIC_MASK | MX31_H1_PM_BIT | MX31_H1_DT_BIT);
  136. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  137. << MX31_H1_SIC_SHIFT;
  138. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  139. v |= MX31_H1_PM_BIT;
  140. if (!(flags & MXC_EHCI_TTL_ENABLED))
  141. v |= MX31_H1_DT_BIT;
  142. break;
  143. case 2: /* H2 port */
  144. v &= ~(MX31_H2_SIC_MASK | MX31_H2_PM_BIT | MX31_H2_DT_BIT);
  145. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  146. << MX31_H2_SIC_SHIFT;
  147. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  148. v |= MX31_H2_PM_BIT;
  149. if (!(flags & MXC_EHCI_TTL_ENABLED))
  150. v |= MX31_H2_DT_BIT;
  151. break;
  152. default:
  153. return -EINVAL;
  154. }
  155. writel(v, MX27_IO_ADDRESS(MX27_OTG_BASE_ADDR +
  156. USBCTRL_OTGBASE_OFFSET));
  157. return 0;
  158. }
  159. #endif /* CONFIG_MACH_MX27 */
  160. printk(KERN_WARNING
  161. "%s() unable to setup USBCONTROL for this CPU\n", __func__);
  162. return -EINVAL;
  163. }
  164. EXPORT_SYMBOL(mxc_set_usbcontrol);