usb-da8xx.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /*
  2. * DA8xx USB
  3. */
  4. #include <linux/clk.h>
  5. #include <linux/delay.h>
  6. #include <linux/dma-mapping.h>
  7. #include <linux/init.h>
  8. #include <linux/mfd/da8xx-cfgchip.h>
  9. #include <linux/phy/phy.h>
  10. #include <linux/platform_data/usb-davinci.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/usb/musb.h>
  13. #include <mach/clock.h>
  14. #include <mach/common.h>
  15. #include <mach/cputype.h>
  16. #include <mach/da8xx.h>
  17. #include <mach/irqs.h>
  18. #include "clock.h"
  19. #define DA8XX_USB0_BASE 0x01e00000
  20. #define DA8XX_USB1_BASE 0x01e25000
  21. static struct clk *usb20_clk;
  22. static struct platform_device da8xx_usb_phy = {
  23. .name = "da8xx-usb-phy",
  24. .id = -1,
  25. .dev = {
  26. /*
  27. * Setting init_name so that clock lookup will work in
  28. * da8xx_register_usb11_phy_clk() even if this device is not
  29. * registered yet.
  30. */
  31. .init_name = "da8xx-usb-phy",
  32. },
  33. };
  34. int __init da8xx_register_usb_phy(void)
  35. {
  36. return platform_device_register(&da8xx_usb_phy);
  37. }
  38. static struct musb_hdrc_config musb_config = {
  39. .multipoint = true,
  40. .num_eps = 5,
  41. .ram_bits = 10,
  42. };
  43. static struct musb_hdrc_platform_data usb_data = {
  44. /* OTG requires a Mini-AB connector */
  45. .mode = MUSB_OTG,
  46. .clock = "usb20",
  47. .config = &musb_config,
  48. };
  49. static struct resource da8xx_usb20_resources[] = {
  50. {
  51. .start = DA8XX_USB0_BASE,
  52. .end = DA8XX_USB0_BASE + SZ_64K - 1,
  53. .flags = IORESOURCE_MEM,
  54. },
  55. {
  56. .start = IRQ_DA8XX_USB_INT,
  57. .flags = IORESOURCE_IRQ,
  58. .name = "mc",
  59. },
  60. };
  61. static u64 usb_dmamask = DMA_BIT_MASK(32);
  62. static struct platform_device da8xx_usb20_dev = {
  63. .name = "musb-da8xx",
  64. .id = -1,
  65. .dev = {
  66. /*
  67. * Setting init_name so that clock lookup will work in
  68. * usb20_phy_clk_enable() even if this device is not registered.
  69. */
  70. .init_name = "musb-da8xx",
  71. .platform_data = &usb_data,
  72. .dma_mask = &usb_dmamask,
  73. .coherent_dma_mask = DMA_BIT_MASK(32),
  74. },
  75. .resource = da8xx_usb20_resources,
  76. .num_resources = ARRAY_SIZE(da8xx_usb20_resources),
  77. };
  78. int __init da8xx_register_usb20(unsigned int mA, unsigned int potpgt)
  79. {
  80. usb_data.power = mA > 510 ? 255 : mA / 2;
  81. usb_data.potpgt = (potpgt + 1) / 2;
  82. return platform_device_register(&da8xx_usb20_dev);
  83. }
  84. static struct resource da8xx_usb11_resources[] = {
  85. [0] = {
  86. .start = DA8XX_USB1_BASE,
  87. .end = DA8XX_USB1_BASE + SZ_4K - 1,
  88. .flags = IORESOURCE_MEM,
  89. },
  90. [1] = {
  91. .start = IRQ_DA8XX_IRQN,
  92. .end = IRQ_DA8XX_IRQN,
  93. .flags = IORESOURCE_IRQ,
  94. },
  95. };
  96. static u64 da8xx_usb11_dma_mask = DMA_BIT_MASK(32);
  97. static struct platform_device da8xx_usb11_device = {
  98. .name = "ohci-da8xx",
  99. .id = -1,
  100. .dev = {
  101. .dma_mask = &da8xx_usb11_dma_mask,
  102. .coherent_dma_mask = DMA_BIT_MASK(32),
  103. },
  104. .num_resources = ARRAY_SIZE(da8xx_usb11_resources),
  105. .resource = da8xx_usb11_resources,
  106. };
  107. int __init da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata)
  108. {
  109. da8xx_usb11_device.dev.platform_data = pdata;
  110. return platform_device_register(&da8xx_usb11_device);
  111. }
  112. static struct clk usb_refclkin = {
  113. .name = "usb_refclkin",
  114. .set_rate = davinci_simple_set_rate,
  115. };
  116. static struct clk_lookup usb_refclkin_lookup =
  117. CLK(NULL, "usb_refclkin", &usb_refclkin);
  118. /**
  119. * da8xx_register_usb_refclkin - register USB_REFCLKIN clock
  120. *
  121. * @rate: The clock rate in Hz
  122. *
  123. * This clock is only needed if the board provides an external USB_REFCLKIN
  124. * signal, in which case it will be used as the parent of usb20_phy_clk and/or
  125. * usb11_phy_clk.
  126. */
  127. int __init da8xx_register_usb_refclkin(int rate)
  128. {
  129. int ret;
  130. usb_refclkin.rate = rate;
  131. ret = clk_register(&usb_refclkin);
  132. if (ret)
  133. return ret;
  134. clkdev_add(&usb_refclkin_lookup);
  135. return 0;
  136. }
  137. static void usb20_phy_clk_enable(struct clk *clk)
  138. {
  139. u32 val;
  140. u32 timeout = 500000; /* 500 msec */
  141. val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  142. /* The USB 2.O PLL requires that the USB 2.O PSC is enabled as well. */
  143. davinci_clk_enable(usb20_clk);
  144. /*
  145. * Turn on the USB 2.0 PHY, but just the PLL, and not OTG. The USB 1.1
  146. * host may use the PLL clock without USB 2.0 OTG being used.
  147. */
  148. val &= ~(CFGCHIP2_RESET | CFGCHIP2_PHYPWRDN);
  149. val |= CFGCHIP2_PHY_PLLON;
  150. writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  151. while (--timeout) {
  152. val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  153. if (val & CFGCHIP2_PHYCLKGD)
  154. goto done;
  155. udelay(1);
  156. }
  157. pr_err("Timeout waiting for USB 2.0 PHY clock good\n");
  158. done:
  159. davinci_clk_disable(usb20_clk);
  160. }
  161. static void usb20_phy_clk_disable(struct clk *clk)
  162. {
  163. u32 val;
  164. val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  165. val |= CFGCHIP2_PHYPWRDN;
  166. writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  167. }
  168. static int usb20_phy_clk_set_parent(struct clk *clk, struct clk *parent)
  169. {
  170. u32 val;
  171. val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  172. /* Set the mux depending on the parent clock. */
  173. if (parent == &usb_refclkin) {
  174. val &= ~CFGCHIP2_USB2PHYCLKMUX;
  175. } else if (strcmp(parent->name, "pll0_aux_clk") == 0) {
  176. val |= CFGCHIP2_USB2PHYCLKMUX;
  177. } else {
  178. pr_err("Bad parent on USB 2.0 PHY clock\n");
  179. return -EINVAL;
  180. }
  181. /* reference frequency also comes from parent clock */
  182. val &= ~CFGCHIP2_REFFREQ_MASK;
  183. switch (clk_get_rate(parent)) {
  184. case 12000000:
  185. val |= CFGCHIP2_REFFREQ_12MHZ;
  186. break;
  187. case 13000000:
  188. val |= CFGCHIP2_REFFREQ_13MHZ;
  189. break;
  190. case 19200000:
  191. val |= CFGCHIP2_REFFREQ_19_2MHZ;
  192. break;
  193. case 20000000:
  194. val |= CFGCHIP2_REFFREQ_20MHZ;
  195. break;
  196. case 24000000:
  197. val |= CFGCHIP2_REFFREQ_24MHZ;
  198. break;
  199. case 26000000:
  200. val |= CFGCHIP2_REFFREQ_26MHZ;
  201. break;
  202. case 38400000:
  203. val |= CFGCHIP2_REFFREQ_38_4MHZ;
  204. break;
  205. case 40000000:
  206. val |= CFGCHIP2_REFFREQ_40MHZ;
  207. break;
  208. case 48000000:
  209. val |= CFGCHIP2_REFFREQ_48MHZ;
  210. break;
  211. default:
  212. pr_err("Bad parent clock rate on USB 2.0 PHY clock\n");
  213. return -EINVAL;
  214. }
  215. writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  216. return 0;
  217. }
  218. static struct clk usb20_phy_clk = {
  219. .name = "usb20_phy",
  220. .clk_enable = usb20_phy_clk_enable,
  221. .clk_disable = usb20_phy_clk_disable,
  222. .set_parent = usb20_phy_clk_set_parent,
  223. };
  224. static struct clk_lookup usb20_phy_clk_lookup =
  225. CLK("da8xx-usb-phy", "usb20_phy", &usb20_phy_clk);
  226. /**
  227. * da8xx_register_usb20_phy_clk - register USB0PHYCLKMUX clock
  228. *
  229. * @use_usb_refclkin: Selects the parent clock - either "usb_refclkin" if true
  230. * or "pll0_aux" if false.
  231. */
  232. int __init da8xx_register_usb20_phy_clk(bool use_usb_refclkin)
  233. {
  234. struct clk *parent;
  235. int ret;
  236. usb20_clk = clk_get(&da8xx_usb20_dev.dev, "usb20");
  237. ret = PTR_ERR_OR_ZERO(usb20_clk);
  238. if (ret)
  239. return ret;
  240. parent = clk_get(NULL, use_usb_refclkin ? "usb_refclkin" : "pll0_aux");
  241. ret = PTR_ERR_OR_ZERO(parent);
  242. if (ret) {
  243. clk_put(usb20_clk);
  244. return ret;
  245. }
  246. usb20_phy_clk.parent = parent;
  247. ret = clk_register(&usb20_phy_clk);
  248. if (!ret)
  249. clkdev_add(&usb20_phy_clk_lookup);
  250. clk_put(parent);
  251. return ret;
  252. }
  253. static int usb11_phy_clk_set_parent(struct clk *clk, struct clk *parent)
  254. {
  255. u32 val;
  256. val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  257. /* Set the USB 1.1 PHY clock mux based on the parent clock. */
  258. if (parent == &usb20_phy_clk) {
  259. val &= ~CFGCHIP2_USB1PHYCLKMUX;
  260. } else if (parent == &usb_refclkin) {
  261. val |= CFGCHIP2_USB1PHYCLKMUX;
  262. } else {
  263. pr_err("Bad parent on USB 1.1 PHY clock\n");
  264. return -EINVAL;
  265. }
  266. writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
  267. return 0;
  268. }
  269. static struct clk usb11_phy_clk = {
  270. .name = "usb11_phy",
  271. .set_parent = usb11_phy_clk_set_parent,
  272. };
  273. static struct clk_lookup usb11_phy_clk_lookup =
  274. CLK("da8xx-usb-phy", "usb11_phy", &usb11_phy_clk);
  275. /**
  276. * da8xx_register_usb11_phy_clk - register USB1PHYCLKMUX clock
  277. *
  278. * @use_usb_refclkin: Selects the parent clock - either "usb_refclkin" if true
  279. * or "usb20_phy" if false.
  280. */
  281. int __init da8xx_register_usb11_phy_clk(bool use_usb_refclkin)
  282. {
  283. struct clk *parent;
  284. int ret = 0;
  285. if (use_usb_refclkin)
  286. parent = clk_get(NULL, "usb_refclkin");
  287. else
  288. parent = clk_get(&da8xx_usb_phy.dev, "usb20_phy");
  289. if (IS_ERR(parent))
  290. return PTR_ERR(parent);
  291. usb11_phy_clk.parent = parent;
  292. ret = clk_register(&usb11_phy_clk);
  293. if (!ret)
  294. clkdev_add(&usb11_phy_clk_lookup);
  295. clk_put(parent);
  296. return ret;
  297. }