ehci.c 9.3 KB

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