ehci.c 10 KB

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