ehci.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
  3. * Copyright (C) 2010 Freescale Semiconductor, Inc.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  12. * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  13. * for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software Foundation,
  17. * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <linux/platform_device.h>
  20. #include <linux/io.h>
  21. #include <mach/hardware.h>
  22. #include <mach/mxc_ehci.h>
  23. #define USBCTRL_OTGBASE_OFFSET 0x600
  24. #define MX31_OTG_SIC_SHIFT 29
  25. #define MX31_OTG_SIC_MASK (0x3 << MX31_OTG_SIC_SHIFT)
  26. #define MX31_OTG_PM_BIT (1 << 24)
  27. #define MX31_H2_SIC_SHIFT 21
  28. #define MX31_H2_SIC_MASK (0x3 << MX31_H2_SIC_SHIFT)
  29. #define MX31_H2_PM_BIT (1 << 16)
  30. #define MX31_H2_DT_BIT (1 << 5)
  31. #define MX31_H1_SIC_SHIFT 13
  32. #define MX31_H1_SIC_MASK (0x3 << MX31_H1_SIC_SHIFT)
  33. #define MX31_H1_PM_BIT (1 << 8)
  34. #define MX31_H1_DT_BIT (1 << 4)
  35. #define MX35_OTG_SIC_SHIFT 29
  36. #define MX35_OTG_SIC_MASK (0x3 << MX35_OTG_SIC_SHIFT)
  37. #define MX35_OTG_PM_BIT (1 << 24)
  38. #define MX35_H1_SIC_SHIFT 21
  39. #define MX35_H1_SIC_MASK (0x3 << MX35_H1_SIC_SHIFT)
  40. #define MX35_H1_PM_BIT (1 << 8)
  41. #define MX35_H1_IPPUE_UP_BIT (1 << 7)
  42. #define MX35_H1_IPPUE_DOWN_BIT (1 << 6)
  43. #define MX35_H1_TLL_BIT (1 << 5)
  44. #define MX35_H1_USBTE_BIT (1 << 4)
  45. #define MXC_OTG_OFFSET 0
  46. #define MXC_H1_OFFSET 0x200
  47. /* USB_CTRL */
  48. #define MXC_OTG_UCTRL_OWIE_BIT (1 << 27) /* OTG wakeup intr enable */
  49. #define MXC_OTG_UCTRL_OPM_BIT (1 << 24) /* OTG power mask */
  50. #define MXC_H1_UCTRL_H1UIE_BIT (1 << 12) /* Host1 ULPI interrupt enable */
  51. #define MXC_H1_UCTRL_H1WIE_BIT (1 << 11) /* HOST1 wakeup intr enable */
  52. #define MXC_H1_UCTRL_H1PM_BIT (1 << 8) /* HOST1 power mask */
  53. /* USB_PHY_CTRL_FUNC */
  54. #define MXC_OTG_PHYCTRL_OC_DIS_BIT (1 << 8) /* OTG Disable Overcurrent Event */
  55. #define MXC_H1_OC_DIS_BIT (1 << 5) /* UH1 Disable Overcurrent Event */
  56. #define MXC_USBCMD_OFFSET 0x140
  57. /* USBCMD */
  58. #define MXC_UCMD_ITC_NO_THRESHOLD_MASK (~(0xff << 16)) /* Interrupt Threshold Control */
  59. int mxc_initialize_usb_hw(int port, unsigned int flags)
  60. {
  61. unsigned int v;
  62. #if defined(CONFIG_ARCH_MX25)
  63. if (cpu_is_mx25()) {
  64. v = readl(MX25_IO_ADDRESS(MX25_OTG_BASE_ADDR +
  65. USBCTRL_OTGBASE_OFFSET));
  66. switch (port) {
  67. case 0: /* OTG port */
  68. v &= ~(MX35_OTG_SIC_MASK | MX35_OTG_PM_BIT);
  69. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  70. << MX35_OTG_SIC_SHIFT;
  71. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  72. v |= MX35_OTG_PM_BIT;
  73. break;
  74. case 1: /* H1 port */
  75. v &= ~(MX35_H1_SIC_MASK | MX35_H1_PM_BIT | MX35_H1_TLL_BIT |
  76. MX35_H1_USBTE_BIT | MX35_H1_IPPUE_DOWN_BIT | MX35_H1_IPPUE_UP_BIT);
  77. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  78. << MX35_H1_SIC_SHIFT;
  79. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  80. v |= MX35_H1_PM_BIT;
  81. if (!(flags & MXC_EHCI_TTL_ENABLED))
  82. v |= MX35_H1_TLL_BIT;
  83. if (flags & MXC_EHCI_INTERNAL_PHY)
  84. v |= MX35_H1_USBTE_BIT;
  85. if (flags & MXC_EHCI_IPPUE_DOWN)
  86. v |= MX35_H1_IPPUE_DOWN_BIT;
  87. if (flags & MXC_EHCI_IPPUE_UP)
  88. v |= MX35_H1_IPPUE_UP_BIT;
  89. break;
  90. default:
  91. return -EINVAL;
  92. }
  93. writel(v, MX25_IO_ADDRESS(MX25_OTG_BASE_ADDR +
  94. USBCTRL_OTGBASE_OFFSET));
  95. return 0;
  96. }
  97. #endif /* CONFIG_ARCH_MX25 */
  98. #if defined(CONFIG_ARCH_MX3)
  99. if (cpu_is_mx31()) {
  100. v = readl(MX31_IO_ADDRESS(MX31_OTG_BASE_ADDR +
  101. USBCTRL_OTGBASE_OFFSET));
  102. switch (port) {
  103. case 0: /* OTG port */
  104. v &= ~(MX31_OTG_SIC_MASK | MX31_OTG_PM_BIT);
  105. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  106. << MX31_OTG_SIC_SHIFT;
  107. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  108. v |= MX31_OTG_PM_BIT;
  109. break;
  110. case 1: /* H1 port */
  111. v &= ~(MX31_H1_SIC_MASK | MX31_H1_PM_BIT | MX31_H1_DT_BIT);
  112. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  113. << MX31_H1_SIC_SHIFT;
  114. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  115. v |= MX31_H1_PM_BIT;
  116. if (!(flags & MXC_EHCI_TTL_ENABLED))
  117. v |= MX31_H1_DT_BIT;
  118. break;
  119. case 2: /* H2 port */
  120. v &= ~(MX31_H2_SIC_MASK | MX31_H2_PM_BIT | MX31_H2_DT_BIT);
  121. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  122. << MX31_H2_SIC_SHIFT;
  123. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  124. v |= MX31_H2_PM_BIT;
  125. if (!(flags & MXC_EHCI_TTL_ENABLED))
  126. v |= MX31_H2_DT_BIT;
  127. break;
  128. default:
  129. return -EINVAL;
  130. }
  131. writel(v, MX31_IO_ADDRESS(MX31_OTG_BASE_ADDR +
  132. USBCTRL_OTGBASE_OFFSET));
  133. return 0;
  134. }
  135. if (cpu_is_mx35()) {
  136. v = readl(MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
  137. USBCTRL_OTGBASE_OFFSET));
  138. switch (port) {
  139. case 0: /* OTG port */
  140. v &= ~(MX35_OTG_SIC_MASK | MX35_OTG_PM_BIT);
  141. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  142. << MX35_OTG_SIC_SHIFT;
  143. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  144. v |= MX35_OTG_PM_BIT;
  145. break;
  146. case 1: /* H1 port */
  147. v &= ~(MX35_H1_SIC_MASK | MX35_H1_PM_BIT | MX35_H1_TLL_BIT |
  148. MX35_H1_USBTE_BIT | MX35_H1_IPPUE_DOWN_BIT | MX35_H1_IPPUE_UP_BIT);
  149. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  150. << MX35_H1_SIC_SHIFT;
  151. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  152. v |= MX35_H1_PM_BIT;
  153. if (!(flags & MXC_EHCI_TTL_ENABLED))
  154. v |= MX35_H1_TLL_BIT;
  155. if (flags & MXC_EHCI_INTERNAL_PHY)
  156. v |= MX35_H1_USBTE_BIT;
  157. if (flags & MXC_EHCI_IPPUE_DOWN)
  158. v |= MX35_H1_IPPUE_DOWN_BIT;
  159. if (flags & MXC_EHCI_IPPUE_UP)
  160. v |= MX35_H1_IPPUE_UP_BIT;
  161. break;
  162. default:
  163. return -EINVAL;
  164. }
  165. writel(v, MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
  166. USBCTRL_OTGBASE_OFFSET));
  167. return 0;
  168. }
  169. #endif /* CONFIG_ARCH_MX3 */
  170. #ifdef CONFIG_MACH_MX27
  171. if (cpu_is_mx27()) {
  172. /* On i.MX27 we can use the i.MX31 USBCTRL bits, they
  173. * are identical
  174. */
  175. v = readl(MX27_IO_ADDRESS(MX27_OTG_BASE_ADDR +
  176. USBCTRL_OTGBASE_OFFSET));
  177. switch (port) {
  178. case 0: /* OTG port */
  179. v &= ~(MX31_OTG_SIC_MASK | MX31_OTG_PM_BIT);
  180. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  181. << MX31_OTG_SIC_SHIFT;
  182. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  183. v |= MX31_OTG_PM_BIT;
  184. break;
  185. case 1: /* H1 port */
  186. v &= ~(MX31_H1_SIC_MASK | MX31_H1_PM_BIT | MX31_H1_DT_BIT);
  187. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  188. << MX31_H1_SIC_SHIFT;
  189. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  190. v |= MX31_H1_PM_BIT;
  191. if (!(flags & MXC_EHCI_TTL_ENABLED))
  192. v |= MX31_H1_DT_BIT;
  193. break;
  194. case 2: /* H2 port */
  195. v &= ~(MX31_H2_SIC_MASK | MX31_H2_PM_BIT | MX31_H2_DT_BIT);
  196. v |= (flags & MXC_EHCI_INTERFACE_MASK)
  197. << MX31_H2_SIC_SHIFT;
  198. if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))
  199. v |= MX31_H2_PM_BIT;
  200. if (!(flags & MXC_EHCI_TTL_ENABLED))
  201. v |= MX31_H2_DT_BIT;
  202. break;
  203. default:
  204. return -EINVAL;
  205. }
  206. writel(v, MX27_IO_ADDRESS(MX27_OTG_BASE_ADDR +
  207. USBCTRL_OTGBASE_OFFSET));
  208. return 0;
  209. }
  210. #endif /* CONFIG_MACH_MX27 */
  211. #ifdef CONFIG_ARCH_MX51
  212. if (cpu_is_mx51()) {
  213. void __iomem *usb_base;
  214. u32 usbotg_base;
  215. u32 usbother_base;
  216. int ret = 0;
  217. usb_base = ioremap(MX51_OTG_BASE_ADDR, SZ_4K);
  218. switch (port) {
  219. case 0: /* OTG port */
  220. usbotg_base = usb_base + MXC_OTG_OFFSET;
  221. break;
  222. case 1: /* Host 1 port */
  223. usbotg_base = usb_base + MXC_H1_OFFSET;
  224. break;
  225. default:
  226. printk(KERN_ERR"%s no such port %d\n", __func__, port);
  227. ret = -ENOENT;
  228. goto error;
  229. }
  230. usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET;
  231. switch (port) {
  232. case 0: /*OTG port */
  233. if (flags & MXC_EHCI_INTERNAL_PHY) {
  234. v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
  235. if (flags & MXC_EHCI_POWER_PINS_ENABLED)
  236. v |= (MXC_OTG_PHYCTRL_OC_DIS_BIT | MXC_OTG_UCTRL_OPM_BIT); /* OC/USBPWR is not used */
  237. else
  238. v &= ~(MXC_OTG_PHYCTRL_OC_DIS_BIT | MXC_OTG_UCTRL_OPM_BIT); /* OC/USBPWR is used */
  239. __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
  240. v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET);
  241. if (flags & MXC_EHCI_WAKEUP_ENABLED)
  242. v |= MXC_OTG_UCTRL_OWIE_BIT;/* OTG wakeup enable */
  243. else
  244. v &= ~MXC_OTG_UCTRL_OWIE_BIT;/* OTG wakeup disable */
  245. __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);
  246. }
  247. break;
  248. case 1: /* Host 1 */
  249. /*Host ULPI */
  250. v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET);
  251. if (flags & MXC_EHCI_WAKEUP_ENABLED)
  252. v &= ~(MXC_H1_UCTRL_H1WIE_BIT | MXC_H1_UCTRL_H1UIE_BIT);/* HOST1 wakeup/ULPI intr disable */
  253. else
  254. v &= ~(MXC_H1_UCTRL_H1WIE_BIT | MXC_H1_UCTRL_H1UIE_BIT);/* HOST1 wakeup/ULPI intr disable */
  255. if (flags & MXC_EHCI_POWER_PINS_ENABLED)
  256. v &= ~MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask used*/
  257. else
  258. v |= MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask used*/
  259. __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);
  260. v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
  261. if (flags & MXC_EHCI_POWER_PINS_ENABLED)
  262. v &= ~MXC_H1_OC_DIS_BIT; /* OC is used */
  263. else
  264. v |= MXC_H1_OC_DIS_BIT; /* OC is not used */
  265. __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
  266. v = __raw_readl(usbotg_base + MXC_USBCMD_OFFSET);
  267. if (flags & MXC_EHCI_ITC_NO_THRESHOLD)
  268. /* Interrupt Threshold Control:Immediate (no threshold) */
  269. v &= MXC_UCMD_ITC_NO_THRESHOLD_MASK;
  270. __raw_writel(v, usbotg_base + MXC_USBCMD_OFFSET);
  271. break;
  272. }
  273. error:
  274. iounmap(usb_base);
  275. return ret;
  276. }
  277. #endif
  278. printk(KERN_WARNING
  279. "%s() unable to setup USBCONTROL for this CPU\n", __func__);
  280. return -EINVAL;
  281. }
  282. EXPORT_SYMBOL(mxc_initialize_usb_hw);