Lines Matching full:udc

23 static int vbus_is_present(struct usba_udc *udc)  in vbus_is_present()  argument
83 static void send_status(struct usba_udc *udc, struct usba_ep *ep) in send_status() argument
92 struct usba_udc *udc = ep->udc; in receive_data() local
130 spin_lock(&udc->lock); in receive_data()
132 spin_unlock(&udc->lock); in receive_data()
139 send_status(udc, ep); in receive_data()
172 struct usba_udc *udc = ep->udc; in usba_ep_enable() local
249 spin_lock_irqsave(&ep->udc->lock, flags); in usba_ep_enable()
257 usba_writel(udc, INT_ENB, in usba_ep_enable()
258 (usba_readl(udc, INT_ENB) in usba_ep_enable()
261 spin_unlock_irqrestore(&udc->lock, flags); in usba_ep_enable()
266 (unsigned long)usba_readl(udc, INT_ENB)); in usba_ep_enable()
274 struct usba_udc *udc = ep->udc; in usba_ep_disable() local
280 spin_lock_irqsave(&udc->lock, flags); in usba_ep_disable()
283 spin_unlock_irqrestore(&udc->lock, flags); in usba_ep_disable()
288 if (udc->gadget.speed != USB_SPEED_UNKNOWN) in usba_ep_disable()
298 usba_writel(udc, INT_ENB, in usba_ep_disable()
299 usba_readl(udc, INT_ENB) & in usba_ep_disable()
304 spin_unlock_irqrestore(&udc->lock, flags); in usba_ep_disable()
340 struct usba_udc *udc = ep->udc; in usba_ep_queue() local
347 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN || in usba_ep_queue()
360 spin_lock_irqsave(&udc->lock, flags); in usba_ep_queue()
373 spin_unlock_irqrestore(&udc->lock, flags); in usba_ep_queue()
421 spin_lock_irqsave(&udc->lock, flags); in usba_ep_set_halt()
440 spin_unlock_irqrestore(&udc->lock, flags); in usba_ep_set_halt()
455 struct usba_udc *udc = ep->udc; in usba_ep_fifo_flush() local
457 usba_writel(udc, EPT_RST, 1 << ep->index); in usba_ep_fifo_flush()
474 struct usba_udc *udc = to_usba_udc(gadget); in usba_udc_get_frame() local
476 return USBA_BFEXT(FRAME_NUMBER, usba_readl(udc, FNUM)); in usba_udc_get_frame()
481 struct usba_udc *udc = to_usba_udc(gadget); in usba_udc_wakeup() local
486 spin_lock_irqsave(&udc->lock, flags); in usba_udc_wakeup()
487 if (udc->devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { in usba_udc_wakeup()
488 ctrl = usba_readl(udc, CTRL); in usba_udc_wakeup()
489 usba_writel(udc, CTRL, ctrl | USBA_REMOTE_WAKE_UP); in usba_udc_wakeup()
492 spin_unlock_irqrestore(&udc->lock, flags); in usba_udc_wakeup()
500 struct usba_udc *udc = to_usba_udc(gadget); in usba_udc_set_selfpowered() local
503 spin_lock_irqsave(&udc->lock, flags); in usba_udc_set_selfpowered()
505 udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in usba_udc_set_selfpowered()
507 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in usba_udc_set_selfpowered()
508 spin_unlock_irqrestore(&udc->lock, flags); in usba_udc_set_selfpowered()
530 * Called with interrupts disabled and udc->lock held.
532 static void reset_all_endpoints(struct usba_udc *udc) in reset_all_endpoints() argument
537 usba_writel(udc, EPT_RST, ~0UL); in reset_all_endpoints()
539 ep = to_usba_ep(udc->gadget.ep0); in reset_all_endpoints()
551 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { in reset_all_endpoints()
553 spin_unlock(&udc->lock); in reset_all_endpoints()
555 spin_lock(&udc->lock); in reset_all_endpoints()
560 static struct usba_ep *get_ep_by_addr(struct usba_udc *udc, u16 wIndex) in get_ep_by_addr() argument
565 return to_usba_ep(udc->gadget.ep0); in get_ep_by_addr()
567 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { in get_ep_by_addr()
583 /* Called with interrupts disabled and udc->lock held */
584 static inline void set_protocol_stall(struct usba_udc *udc, struct usba_ep *ep) in set_protocol_stall() argument
590 static inline int is_stalled(struct usba_udc *udc, struct usba_ep *ep) in is_stalled() argument
597 static inline void set_address(struct usba_udc *udc, unsigned int addr) in set_address() argument
602 regval = usba_readl(udc, CTRL); in set_address()
604 usba_writel(udc, CTRL, regval); in set_address()
607 static int do_test_mode(struct usba_udc *udc) in do_test_mode() argument
627 test_mode = udc->test_mode; in do_test_mode()
630 reset_all_endpoints(udc); in do_test_mode()
635 usba_writel(udc, TST, USBA_TST_J_MODE); in do_test_mode()
640 usba_writel(udc, TST, USBA_TST_K_MODE); in do_test_mode()
648 ep = &udc->usba_ep[0]; in do_test_mode()
649 usba_writel(udc, TST, in do_test_mode()
657 set_protocol_stall(udc, ep); in do_test_mode()
666 ep = &udc->usba_ep[0]; in do_test_mode()
673 set_protocol_stall(udc, ep); in do_test_mode()
677 usba_writel(udc, TST, USBA_TST_PKT_MODE); in do_test_mode()
714 static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep, in handle_ep0_setup() argument
724 status = cpu_to_le16(udc->devstatus); in handle_ep0_setup()
732 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex)); in handle_ep0_setup()
737 if (is_stalled(udc, target)) in handle_ep0_setup()
755 udc->devstatus in handle_ep0_setup()
766 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex)); in handle_ep0_setup()
778 send_status(udc, ep); in handle_ep0_setup()
785 send_status(udc, ep); in handle_ep0_setup()
787 udc->test_mode = le16_to_cpu(crq->wIndex); in handle_ep0_setup()
790 udc->devstatus |= 1 << USB_DEVICE_REMOTE_WAKEUP; in handle_ep0_setup()
801 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex)); in handle_ep0_setup()
810 send_status(udc, ep); in handle_ep0_setup()
818 set_address(udc, le16_to_cpu(crq->wValue)); in handle_ep0_setup()
819 send_status(udc, ep); in handle_ep0_setup()
825 spin_unlock(&udc->lock); in handle_ep0_setup()
826 retval = udc->driver->setup(&udc->gadget, crq); in handle_ep0_setup()
827 spin_lock(&udc->lock); in handle_ep0_setup()
837 set_protocol_stall(udc, ep); in handle_ep0_setup()
842 static void usba_control_irq(struct usba_udc *udc, struct usba_ep *ep) in usba_control_irq() argument
883 usba_writel(udc, CTRL, (usba_readl(udc, CTRL) in usba_control_irq()
900 if (do_test_mode(udc)) in usba_control_irq()
901 set_protocol_stall(udc, ep); in usba_control_irq()
906 set_protocol_stall(udc, ep); in usba_control_irq()
934 set_protocol_stall(udc, ep); in usba_control_irq()
976 DBG(DBG_ALL, "udc: Invalid length %u (expected %zu)\n", in usba_control_irq()
978 set_protocol_stall(udc, ep); in usba_control_irq()
1006 ret = handle_ep0_setup(udc, ep, &crq.crq); in usba_control_irq()
1008 spin_unlock(&udc->lock); in usba_control_irq()
1009 ret = udc->driver->setup(&udc->gadget, &crq.crq); in usba_control_irq()
1010 spin_lock(&udc->lock); in usba_control_irq()
1019 set_protocol_stall(udc, ep); in usba_control_irq()
1024 static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep) in usba_ep_irq() argument
1067 static int usba_udc_irq(struct usba_udc *udc) in usba_udc_irq() argument
1071 spin_lock(&udc->lock); in usba_udc_irq()
1073 status = usba_readl(udc, INT_STA); in usba_udc_irq()
1077 usba_writel(udc, INT_CLR, USBA_DET_SUSPEND); in usba_udc_irq()
1079 if (udc->gadget.speed != USB_SPEED_UNKNOWN && in usba_udc_irq()
1080 udc->driver && udc->driver->suspend) { in usba_udc_irq()
1081 spin_unlock(&udc->lock); in usba_udc_irq()
1082 udc->driver->suspend(&udc->gadget); in usba_udc_irq()
1083 spin_lock(&udc->lock); in usba_udc_irq()
1088 usba_writel(udc, INT_CLR, USBA_WAKE_UP); in usba_udc_irq()
1093 usba_writel(udc, INT_CLR, USBA_END_OF_RESUME); in usba_udc_irq()
1095 if (udc->gadget.speed != USB_SPEED_UNKNOWN && in usba_udc_irq()
1096 udc->driver && udc->driver->resume) { in usba_udc_irq()
1097 spin_unlock(&udc->lock); in usba_udc_irq()
1098 udc->driver->resume(&udc->gadget); in usba_udc_irq()
1099 spin_lock(&udc->lock); in usba_udc_irq()
1109 if (ep_is_control(&udc->usba_ep[i])) in usba_udc_irq()
1110 usba_control_irq(udc, &udc->usba_ep[i]); in usba_udc_irq()
1112 usba_ep_irq(udc, &udc->usba_ep[i]); in usba_udc_irq()
1119 usba_writel(udc, INT_CLR, USBA_END_OF_RESET); in usba_udc_irq()
1120 reset_all_endpoints(udc); in usba_udc_irq()
1122 if (udc->gadget.speed != USB_SPEED_UNKNOWN && in usba_udc_irq()
1123 udc->driver->disconnect) { in usba_udc_irq()
1124 udc->gadget.speed = USB_SPEED_UNKNOWN; in usba_udc_irq()
1125 spin_unlock(&udc->lock); in usba_udc_irq()
1126 udc->driver->disconnect(&udc->gadget); in usba_udc_irq()
1127 spin_lock(&udc->lock); in usba_udc_irq()
1131 udc->gadget.speed = USB_SPEED_HIGH; in usba_udc_irq()
1133 udc->gadget.speed = USB_SPEED_FULL; in usba_udc_irq()
1135 ep0 = &udc->usba_ep[0]; in usba_udc_irq()
1144 usba_writel(udc, INT_ENB, in usba_udc_irq()
1145 (usba_readl(udc, INT_ENB) in usba_udc_irq()
1158 spin_unlock(&udc->lock); in usba_udc_irq()
1163 static int atmel_usba_start(struct usba_udc *udc) in atmel_usba_start() argument
1165 udc->devstatus = 1 << USB_DEVICE_SELF_POWERED; in atmel_usba_start()
1167 udc->vbus_prev = 0; in atmel_usba_start()
1170 if (vbus_is_present(udc) && udc->vbus_prev == 0) { in atmel_usba_start()
1171 usba_writel(udc, CTRL, USBA_ENABLE_MASK); in atmel_usba_start()
1172 usba_writel(udc, INT_ENB, USBA_END_OF_RESET); in atmel_usba_start()
1178 static int atmel_usba_stop(struct usba_udc *udc) in atmel_usba_stop() argument
1180 udc->gadget.speed = USB_SPEED_UNKNOWN; in atmel_usba_stop()
1181 reset_all_endpoints(udc); in atmel_usba_stop()
1184 usba_writel(udc, CTRL, USBA_DISABLE_MASK); in atmel_usba_stop()
1203 struct usba_udc *udc = &controller; in usb_gadget_handle_interrupts() local
1205 return usba_udc_irq(udc); in usb_gadget_handle_interrupts()
1211 struct usba_udc *udc = &controller; in usb_gadget_register_driver() local
1219 if (udc->driver) { in usb_gadget_register_driver()
1220 printf("UDC already has a gadget driver\n"); in usb_gadget_register_driver()
1224 atmel_usba_start(udc); in usb_gadget_register_driver()
1226 udc->driver = driver; in usb_gadget_register_driver()
1228 ret = driver->bind(&udc->gadget); in usb_gadget_register_driver()
1231 udc->driver = NULL; in usb_gadget_register_driver()
1239 struct usba_udc *udc = &controller; in usb_gadget_unregister_driver() local
1246 driver->disconnect(&udc->gadget); in usb_gadget_unregister_driver()
1247 driver->unbind(&udc->gadget); in usb_gadget_unregister_driver()
1248 udc->driver = NULL; in usb_gadget_unregister_driver()
1250 atmel_usba_stop(udc); in usb_gadget_unregister_driver()
1256 struct usba_udc *udc) in usba_udc_pdata() argument
1267 udc->gadget.ep0 = &eps[0].ep; in usba_udc_pdata()
1269 INIT_LIST_HEAD(&udc->gadget.ep_list); in usba_udc_pdata()
1275 ep->ep_regs = udc->regs + USBA_EPT_BASE(i); in usba_udc_pdata()
1276 ep->dma_regs = udc->regs + USBA_DMA_BASE(i); in usba_udc_pdata()
1277 ep->fifo = udc->fifo + USBA_FIFO_BASE(i); in usba_udc_pdata()
1282 ep->udc = udc; in usba_udc_pdata()
1289 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in usba_udc_pdata()
1297 struct usba_udc *udc; in usba_udc_probe() local
1299 udc = &controller; in usba_udc_probe()
1301 udc->usba_ep = usba_udc_pdata(pdata, udc); in usba_udc_probe()