musb_uboot.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. #include <common.h>
  2. #include <console.h>
  3. #include <watchdog.h>
  4. #include <linux/errno.h>
  5. #include <linux/usb/ch9.h>
  6. #include <linux/usb/gadget.h>
  7. #include <usb.h>
  8. #include "linux-compat.h"
  9. #include "usb-compat.h"
  10. #include "musb_core.h"
  11. #include "musb_host.h"
  12. #include "musb_gadget.h"
  13. #include "musb_uboot.h"
  14. #ifdef CONFIG_USB_MUSB_HOST
  15. struct int_queue {
  16. struct usb_host_endpoint hep;
  17. struct urb urb;
  18. };
  19. #ifndef CONFIG_DM_USB
  20. struct musb_host_data musb_host;
  21. #endif
  22. static void musb_host_complete_urb(struct urb *urb)
  23. {
  24. urb->dev->status &= ~USB_ST_NOT_PROC;
  25. urb->dev->act_len = urb->actual_length;
  26. }
  27. static void construct_urb(struct urb *urb, struct usb_host_endpoint *hep,
  28. struct usb_device *dev, int endpoint_type,
  29. unsigned long pipe, void *buffer, int len,
  30. struct devrequest *setup, int interval)
  31. {
  32. int epnum = usb_pipeendpoint(pipe);
  33. int is_in = usb_pipein(pipe);
  34. memset(urb, 0, sizeof(struct urb));
  35. memset(hep, 0, sizeof(struct usb_host_endpoint));
  36. INIT_LIST_HEAD(&hep->urb_list);
  37. INIT_LIST_HEAD(&urb->urb_list);
  38. urb->ep = hep;
  39. urb->complete = musb_host_complete_urb;
  40. urb->status = -EINPROGRESS;
  41. urb->dev = dev;
  42. urb->pipe = pipe;
  43. urb->transfer_buffer = buffer;
  44. urb->transfer_dma = (unsigned long)buffer;
  45. urb->transfer_buffer_length = len;
  46. urb->setup_packet = (unsigned char *)setup;
  47. urb->ep->desc.wMaxPacketSize =
  48. __cpu_to_le16(is_in ? dev->epmaxpacketin[epnum] :
  49. dev->epmaxpacketout[epnum]);
  50. urb->ep->desc.bmAttributes = endpoint_type;
  51. urb->ep->desc.bEndpointAddress =
  52. (is_in ? USB_DIR_IN : USB_DIR_OUT) | epnum;
  53. urb->ep->desc.bInterval = interval;
  54. }
  55. static int submit_urb(struct usb_hcd *hcd, struct urb *urb)
  56. {
  57. struct musb *host = hcd->hcd_priv;
  58. int ret;
  59. unsigned long timeout;
  60. ret = musb_urb_enqueue(hcd, urb, 0);
  61. if (ret < 0) {
  62. printf("Failed to enqueue URB to controller\n");
  63. return ret;
  64. }
  65. timeout = get_timer(0) + USB_TIMEOUT_MS(urb->pipe);
  66. do {
  67. if (ctrlc())
  68. return -EIO;
  69. host->isr(0, host);
  70. } while (urb->status == -EINPROGRESS &&
  71. get_timer(0) < timeout);
  72. if (urb->status == -EINPROGRESS)
  73. musb_urb_dequeue(hcd, urb, -ETIME);
  74. return urb->status;
  75. }
  76. static int _musb_submit_control_msg(struct musb_host_data *host,
  77. struct usb_device *dev, unsigned long pipe,
  78. void *buffer, int len, struct devrequest *setup)
  79. {
  80. construct_urb(&host->urb, &host->hep, dev, USB_ENDPOINT_XFER_CONTROL,
  81. pipe, buffer, len, setup, 0);
  82. /* Fix speed for non hub-attached devices */
  83. if (!usb_dev_get_parent(dev))
  84. dev->speed = host->host_speed;
  85. return submit_urb(&host->hcd, &host->urb);
  86. }
  87. static int _musb_submit_bulk_msg(struct musb_host_data *host,
  88. struct usb_device *dev, unsigned long pipe, void *buffer, int len)
  89. {
  90. construct_urb(&host->urb, &host->hep, dev, USB_ENDPOINT_XFER_BULK,
  91. pipe, buffer, len, NULL, 0);
  92. return submit_urb(&host->hcd, &host->urb);
  93. }
  94. static int _musb_submit_int_msg(struct musb_host_data *host,
  95. struct usb_device *dev, unsigned long pipe,
  96. void *buffer, int len, int interval)
  97. {
  98. construct_urb(&host->urb, &host->hep, dev, USB_ENDPOINT_XFER_INT, pipe,
  99. buffer, len, NULL, interval);
  100. return submit_urb(&host->hcd, &host->urb);
  101. }
  102. static struct int_queue *_musb_create_int_queue(struct musb_host_data *host,
  103. struct usb_device *dev, unsigned long pipe, int queuesize,
  104. int elementsize, void *buffer, int interval)
  105. {
  106. struct int_queue *queue;
  107. int ret, index = usb_pipein(pipe) * 16 + usb_pipeendpoint(pipe);
  108. if (queuesize != 1) {
  109. printf("ERROR musb int-queues only support queuesize 1\n");
  110. return NULL;
  111. }
  112. if (dev->int_pending & (1 << index)) {
  113. printf("ERROR int-urb is already pending on pipe %lx\n", pipe);
  114. return NULL;
  115. }
  116. queue = malloc(sizeof(*queue));
  117. if (!queue)
  118. return NULL;
  119. construct_urb(&queue->urb, &queue->hep, dev, USB_ENDPOINT_XFER_INT,
  120. pipe, buffer, elementsize, NULL, interval);
  121. ret = musb_urb_enqueue(&host->hcd, &queue->urb, 0);
  122. if (ret < 0) {
  123. printf("Failed to enqueue URB to controller\n");
  124. free(queue);
  125. return NULL;
  126. }
  127. dev->int_pending |= 1 << index;
  128. return queue;
  129. }
  130. static int _musb_destroy_int_queue(struct musb_host_data *host,
  131. struct usb_device *dev, struct int_queue *queue)
  132. {
  133. int index = usb_pipein(queue->urb.pipe) * 16 +
  134. usb_pipeendpoint(queue->urb.pipe);
  135. if (queue->urb.status == -EINPROGRESS)
  136. musb_urb_dequeue(&host->hcd, &queue->urb, -ETIME);
  137. dev->int_pending &= ~(1 << index);
  138. free(queue);
  139. return 0;
  140. }
  141. static void *_musb_poll_int_queue(struct musb_host_data *host,
  142. struct usb_device *dev, struct int_queue *queue)
  143. {
  144. if (queue->urb.status != -EINPROGRESS)
  145. return NULL; /* URB has already completed in a prev. poll */
  146. host->host->isr(0, host->host);
  147. if (queue->urb.status != -EINPROGRESS)
  148. return queue->urb.transfer_buffer; /* Done */
  149. return NULL; /* URB still pending */
  150. }
  151. static int _musb_reset_root_port(struct musb_host_data *host,
  152. struct usb_device *dev)
  153. {
  154. void *mbase = host->host->mregs;
  155. u8 power;
  156. power = musb_readb(mbase, MUSB_POWER);
  157. power &= 0xf0;
  158. musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
  159. mdelay(50);
  160. if (host->host->ops->pre_root_reset_end)
  161. host->host->ops->pre_root_reset_end(host->host);
  162. power = musb_readb(mbase, MUSB_POWER);
  163. musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
  164. if (host->host->ops->post_root_reset_end)
  165. host->host->ops->post_root_reset_end(host->host);
  166. host->host->isr(0, host->host);
  167. host->host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
  168. USB_SPEED_HIGH :
  169. (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_FSDEV) ?
  170. USB_SPEED_FULL : USB_SPEED_LOW;
  171. mdelay((host->host_speed == USB_SPEED_LOW) ? 200 : 50);
  172. return 0;
  173. }
  174. int musb_lowlevel_init(struct musb_host_data *host)
  175. {
  176. void *mbase;
  177. /* USB spec says it may take up to 1 second for a device to connect */
  178. unsigned long timeout = get_timer(0) + 1000;
  179. int ret;
  180. if (!host->host) {
  181. printf("MUSB host is not registered\n");
  182. return -ENODEV;
  183. }
  184. ret = musb_start(host->host);
  185. if (ret)
  186. return ret;
  187. mbase = host->host->mregs;
  188. do {
  189. if (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_HM)
  190. break;
  191. } while (get_timer(0) < timeout);
  192. if (get_timer(0) >= timeout) {
  193. musb_stop(host->host);
  194. return -ENODEV;
  195. }
  196. _musb_reset_root_port(host, NULL);
  197. host->host->is_active = 1;
  198. host->hcd.hcd_priv = host->host;
  199. return 0;
  200. }
  201. #ifndef CONFIG_DM_USB
  202. int usb_lowlevel_stop(int index)
  203. {
  204. if (!musb_host.host) {
  205. printf("MUSB host is not registered\n");
  206. return -ENODEV;
  207. }
  208. musb_stop(musb_host.host);
  209. return 0;
  210. }
  211. int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
  212. void *buffer, int length)
  213. {
  214. return _musb_submit_bulk_msg(&musb_host, dev, pipe, buffer, length);
  215. }
  216. int submit_control_msg(struct usb_device *dev, unsigned long pipe,
  217. void *buffer, int length, struct devrequest *setup)
  218. {
  219. return _musb_submit_control_msg(&musb_host, dev, pipe, buffer, length, setup);
  220. }
  221. int submit_int_msg(struct usb_device *dev, unsigned long pipe,
  222. void *buffer, int length, int interval)
  223. {
  224. return _musb_submit_int_msg(&musb_host, dev, pipe, buffer, length, interval);
  225. }
  226. struct int_queue *create_int_queue(struct usb_device *dev,
  227. unsigned long pipe, int queuesize, int elementsize,
  228. void *buffer, int interval)
  229. {
  230. return _musb_create_int_queue(&musb_host, dev, pipe, queuesize, elementsize,
  231. buffer, interval);
  232. }
  233. void *poll_int_queue(struct usb_device *dev, struct int_queue *queue)
  234. {
  235. return _musb_poll_int_queue(&musb_host, dev, queue);
  236. }
  237. int destroy_int_queue(struct usb_device *dev, struct int_queue *queue)
  238. {
  239. return _musb_destroy_int_queue(&musb_host, dev, queue);
  240. }
  241. int usb_reset_root_port(struct usb_device *dev)
  242. {
  243. return _musb_reset_root_port(&musb_host, dev);
  244. }
  245. int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
  246. {
  247. return musb_lowlevel_init(&musb_host);
  248. }
  249. #endif /* !CONFIG_DM_USB */
  250. #ifdef CONFIG_DM_USB
  251. static int musb_submit_control_msg(struct udevice *dev, struct usb_device *udev,
  252. unsigned long pipe, void *buffer, int length,
  253. struct devrequest *setup)
  254. {
  255. struct musb_host_data *host = dev_get_priv(dev);
  256. return _musb_submit_control_msg(host, udev, pipe, buffer, length, setup);
  257. }
  258. static int musb_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
  259. unsigned long pipe, void *buffer, int length)
  260. {
  261. struct musb_host_data *host = dev_get_priv(dev);
  262. return _musb_submit_bulk_msg(host, udev, pipe, buffer, length);
  263. }
  264. static int musb_submit_int_msg(struct udevice *dev, struct usb_device *udev,
  265. unsigned long pipe, void *buffer, int length,
  266. int interval)
  267. {
  268. struct musb_host_data *host = dev_get_priv(dev);
  269. return _musb_submit_int_msg(host, udev, pipe, buffer, length, interval);
  270. }
  271. static struct int_queue *musb_create_int_queue(struct udevice *dev,
  272. struct usb_device *udev, unsigned long pipe, int queuesize,
  273. int elementsize, void *buffer, int interval)
  274. {
  275. struct musb_host_data *host = dev_get_priv(dev);
  276. return _musb_create_int_queue(host, udev, pipe, queuesize, elementsize,
  277. buffer, interval);
  278. }
  279. static void *musb_poll_int_queue(struct udevice *dev, struct usb_device *udev,
  280. struct int_queue *queue)
  281. {
  282. struct musb_host_data *host = dev_get_priv(dev);
  283. return _musb_poll_int_queue(host, udev, queue);
  284. }
  285. static int musb_destroy_int_queue(struct udevice *dev, struct usb_device *udev,
  286. struct int_queue *queue)
  287. {
  288. struct musb_host_data *host = dev_get_priv(dev);
  289. return _musb_destroy_int_queue(host, udev, queue);
  290. }
  291. static int musb_reset_root_port(struct udevice *dev, struct usb_device *udev)
  292. {
  293. struct musb_host_data *host = dev_get_priv(dev);
  294. return _musb_reset_root_port(host, udev);
  295. }
  296. struct dm_usb_ops musb_usb_ops = {
  297. .control = musb_submit_control_msg,
  298. .bulk = musb_submit_bulk_msg,
  299. .interrupt = musb_submit_int_msg,
  300. .create_int_queue = musb_create_int_queue,
  301. .poll_int_queue = musb_poll_int_queue,
  302. .destroy_int_queue = musb_destroy_int_queue,
  303. .reset_root_port = musb_reset_root_port,
  304. };
  305. #endif /* CONFIG_DM_USB */
  306. #endif /* CONFIG_USB_MUSB_HOST */
  307. #ifdef CONFIG_USB_MUSB_GADGET
  308. static struct musb *gadget;
  309. int usb_gadget_handle_interrupts(int index)
  310. {
  311. WATCHDOG_RESET();
  312. if (!gadget || !gadget->isr)
  313. return -EINVAL;
  314. return gadget->isr(0, gadget);
  315. }
  316. int usb_gadget_register_driver(struct usb_gadget_driver *driver)
  317. {
  318. int ret;
  319. if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind ||
  320. !driver->setup) {
  321. printf("bad parameter.\n");
  322. return -EINVAL;
  323. }
  324. if (!gadget) {
  325. printf("Controller uninitialized\n");
  326. return -ENXIO;
  327. }
  328. ret = musb_gadget_start(&gadget->g, driver);
  329. if (ret < 0) {
  330. printf("gadget_start failed with %d\n", ret);
  331. return ret;
  332. }
  333. ret = driver->bind(&gadget->g);
  334. if (ret < 0) {
  335. printf("bind failed with %d\n", ret);
  336. return ret;
  337. }
  338. return 0;
  339. }
  340. int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
  341. {
  342. if (driver->disconnect)
  343. driver->disconnect(&gadget->g);
  344. if (driver->unbind)
  345. driver->unbind(&gadget->g);
  346. return 0;
  347. }
  348. #endif /* CONFIG_USB_MUSB_GADGET */
  349. struct musb *musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
  350. void *ctl_regs)
  351. {
  352. struct musb **musbp;
  353. switch (plat->mode) {
  354. #if defined(CONFIG_USB_MUSB_HOST) && !defined(CONFIG_DM_USB)
  355. case MUSB_HOST:
  356. musbp = &musb_host.host;
  357. break;
  358. #endif
  359. #ifdef CONFIG_USB_MUSB_GADGET
  360. case MUSB_PERIPHERAL:
  361. musbp = &gadget;
  362. break;
  363. #endif
  364. default:
  365. return ERR_PTR(-EINVAL);
  366. }
  367. *musbp = musb_init_controller(plat, (struct device *)bdata, ctl_regs);
  368. if (IS_ERR(*musbp)) {
  369. printf("Failed to init the controller\n");
  370. return ERR_CAST(*musbp);
  371. }
  372. return *musbp;
  373. }