Lines Matching full:udc
62 #define at91_udp_read(udc, reg) \ argument
63 __raw_readl((udc)->udp_baseaddr + (reg))
64 #define at91_udp_write(udc, reg, val) \ argument
65 __raw_writel((val), (udc)->udp_baseaddr + (reg))
74 struct at91_udc *udc = ep->udc; in done() local
85 spin_unlock(&udc->lock); in done()
87 spin_lock(&udc->lock); in done()
92 at91_udp_write(udc, AT91_UDP_IDR, ep->int_mask); in done()
287 struct at91_udc *udc; in at91_ep_enable() local
301 udc = ep->udc; in at91_ep_enable()
302 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) { in at91_ep_enable()
336 spin_lock_irqsave(&udc->lock, flags); in at91_ep_enable()
354 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_enable()
355 at91_udp_write(udc, AT91_UDP_RST_EP, 0); in at91_ep_enable()
357 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_enable()
364 struct at91_udc *udc = ep->udc; in at91_ep_disable() local
367 if (ep == &ep->udc->ep[0]) in at91_ep_disable()
370 spin_lock_irqsave(&udc->lock, flags); in at91_ep_disable()
379 if (ep->udc->clocked) { in at91_ep_disable()
380 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_disable()
381 at91_udp_write(udc, AT91_UDP_RST_EP, 0); in at91_ep_disable()
385 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_disable()
421 struct at91_udc *udc; in at91_ep_queue() local
439 udc = ep->udc; in at91_ep_queue()
441 if (!udc || !udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) { in at91_ep_queue()
449 spin_lock_irqsave(&udc->lock, flags); in at91_ep_queue()
467 if (!udc->req_pending) { in at91_ep_queue()
476 if (udc->wait_for_config_ack) { in at91_ep_queue()
477 tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); in at91_ep_queue()
480 at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); in at91_ep_queue()
490 udc->req_pending = 0; in at91_ep_queue()
509 at91_udp_write(udc, AT91_UDP_IER, ep->int_mask); in at91_ep_queue()
512 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_queue()
526 spin_lock_irqsave(&udc->lock, flags); in at91_ep_dequeue()
534 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_dequeue()
539 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_dequeue()
546 struct at91_udc *udc = ep->udc; in at91_ep_set_halt() local
552 if (!_ep || ep->is_iso || !ep->udc->clocked) in at91_ep_set_halt()
556 spin_lock_irqsave(&udc->lock, flags); in at91_ep_set_halt()
574 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_set_halt()
575 at91_udp_write(udc, AT91_UDP_RST_EP, 0); in at91_ep_set_halt()
581 spin_unlock_irqrestore(&udc->lock, flags); in at91_ep_set_halt()
600 struct at91_udc *udc = to_udc(gadget); in at91_get_frame() local
604 return at91_udp_read(udc, AT91_UDP_FRM_NUM) & AT91_UDP_NUM; in at91_get_frame()
609 struct at91_udc *udc = to_udc(gadget); in at91_wakeup() local
615 spin_lock_irqsave(&udc->lock, flags); in at91_wakeup()
617 if (!udc->clocked || !udc->suspended) in at91_wakeup()
622 glbstate = at91_udp_read(udc, AT91_UDP_GLB_STAT); in at91_wakeup()
626 at91_udp_write(udc, AT91_UDP_GLB_STAT, glbstate); in at91_wakeup()
629 spin_unlock_irqrestore(&udc->lock, flags); in at91_wakeup()
634 static void udc_reinit(struct at91_udc *udc) in udc_reinit() argument
638 INIT_LIST_HEAD(&udc->gadget.ep_list); in udc_reinit()
639 INIT_LIST_HEAD(&udc->gadget.ep0->ep_list); in udc_reinit()
642 struct at91_ep *ep = &udc->ep[i]; in udc_reinit()
645 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in udc_reinit()
650 ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i); in udc_reinit()
656 static void reset_gadget(struct at91_udc *udc) in reset_gadget() argument
658 struct usb_gadget_driver *driver = udc->driver; in reset_gadget()
661 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in reset_gadget()
663 udc->gadget.speed = USB_SPEED_UNKNOWN; in reset_gadget()
664 udc->suspended = 0; in reset_gadget()
667 struct at91_ep *ep = &udc->ep[i]; in reset_gadget()
673 spin_unlock(&udc->lock); in reset_gadget()
674 udc->driver->disconnect(&udc->gadget); in reset_gadget()
675 spin_lock(&udc->lock); in reset_gadget()
678 udc_reinit(udc); in reset_gadget()
681 static void stop_activity(struct at91_udc *udc) in stop_activity() argument
683 struct usb_gadget_driver *driver = udc->driver; in stop_activity()
686 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in stop_activity()
688 udc->gadget.speed = USB_SPEED_UNKNOWN; in stop_activity()
689 udc->suspended = 0; in stop_activity()
692 struct at91_ep *ep = &udc->ep[i]; in stop_activity()
697 spin_unlock(&udc->lock); in stop_activity()
698 driver->disconnect(&udc->gadget); in stop_activity()
699 spin_lock(&udc->lock); in stop_activity()
702 udc_reinit(udc); in stop_activity()
705 static void clk_on(struct at91_udc *udc) in clk_on() argument
707 if (udc->clocked) in clk_on()
709 udc->clocked = 1; in clk_on()
712 static void clk_off(struct at91_udc *udc) in clk_off() argument
714 if (!udc->clocked) in clk_off()
716 udc->clocked = 0; in clk_off()
717 udc->gadget.speed = USB_SPEED_UNKNOWN; in clk_off()
724 static void pullup(struct at91_udc *udc, int is_on) in pullup() argument
726 if (!udc->enabled || !udc->vbus) in pullup()
731 clk_on(udc); in pullup()
732 at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM); in pullup()
733 at91_udp_write(udc, AT91_UDP_TXVC, 0); in pullup()
735 stop_activity(udc); in pullup()
736 at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM); in pullup()
737 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); in pullup()
738 clk_off(udc); in pullup()
741 if (udc->caps && udc->caps->pullup) in pullup()
742 udc->caps->pullup(udc, is_on); in pullup()
748 struct at91_udc *udc = to_udc(gadget); in at91_vbus_session() local
752 spin_lock_irqsave(&udc->lock, flags); in at91_vbus_session()
753 udc->vbus = (is_active != 0); in at91_vbus_session()
754 if (udc->driver) in at91_vbus_session()
755 pullup(udc, is_active); in at91_vbus_session()
757 pullup(udc, 0); in at91_vbus_session()
758 spin_unlock_irqrestore(&udc->lock, flags); in at91_vbus_session()
764 struct at91_udc *udc = to_udc(gadget); in at91_pullup() local
767 spin_lock_irqsave(&udc->lock, flags); in at91_pullup()
768 udc->enabled = is_on = !!is_on; in at91_pullup()
769 pullup(udc, is_on); in at91_pullup()
770 spin_unlock_irqrestore(&udc->lock, flags); in at91_pullup()
776 struct at91_udc *udc = to_udc(gadget); in at91_set_selfpowered() local
779 spin_lock_irqsave(&udc->lock, flags); in at91_set_selfpowered()
780 udc->selfpowered = (is_on != 0); in at91_set_selfpowered()
781 spin_unlock_irqrestore(&udc->lock, flags); in at91_set_selfpowered()
849 static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) in handle_setup() argument
878 udc->wait_for_addr_ack = 0; in handle_setup()
879 udc->wait_for_config_ack = 0; in handle_setup()
896 udc->req_pending = 1; in handle_setup()
905 udc->addr = w_value; in handle_setup()
906 udc->wait_for_addr_ack = 1; in handle_setup()
907 udc->req_pending = 0; in handle_setup()
913 tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_CONFG; in handle_setup()
915 udc->wait_for_config_ack = (tmp == 0); in handle_setup()
917 udc->wait_for_config_ack = (tmp != 0); in handle_setup()
918 if (udc->wait_for_config_ack) in handle_setup()
929 tmp = (udc->selfpowered << USB_DEVICE_SELF_POWERED); in handle_setup()
930 if (at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_ESR) in handle_setup()
941 tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); in handle_setup()
943 at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); in handle_setup()
949 tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); in handle_setup()
951 at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); in handle_setup()
978 ep = &udc->ep[tmp]; in handle_setup()
1001 ep = &udc->ep[tmp]; in handle_setup()
1020 ep = &udc->ep[tmp]; in handle_setup()
1033 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in handle_setup()
1034 at91_udp_write(udc, AT91_UDP_RST_EP, 0); in handle_setup()
1049 if (udc->driver) { in handle_setup()
1050 spin_unlock(&udc->lock); in handle_setup()
1051 status = udc->driver->setup(&udc->gadget, &pkt.r); in handle_setup()
1052 spin_lock(&udc->lock); in handle_setup()
1062 udc->req_pending = 0; in handle_setup()
1072 udc->req_pending = 0; in handle_setup()
1075 static void handle_ep0(struct at91_udc *udc) in handle_ep0() argument
1077 struct at91_ep *ep0 = &udc->ep[0]; in handle_ep0()
1084 udc->req_pending = 0; in handle_ep0()
1093 udc->req_pending = 0; in handle_ep0()
1094 handle_setup(udc, ep0, csr); in handle_ep0()
1111 udc->req_pending = 0; in handle_ep0()
1122 udc->req_pending = 0; in handle_ep0()
1129 if (udc->wait_for_addr_ack) { in handle_ep0()
1132 at91_udp_write(udc, AT91_UDP_FADDR, in handle_ep0()
1133 AT91_UDP_FEN | udc->addr); in handle_ep0()
1134 tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); in handle_ep0()
1136 if (udc->addr) in handle_ep0()
1138 at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); in handle_ep0()
1140 udc->wait_for_addr_ack = 0; in handle_ep0()
1141 VDBG("address %d\n", udc->addr); in handle_ep0()
1161 udc->req_pending = 0; in handle_ep0()
1163 } else if (udc->req_pending) { in handle_ep0()
1183 udc->req_pending = 0; in handle_ep0()
1198 static irqreturn_t at91_udc_irq(struct at91_udc *udc) in at91_udc_irq() argument
1204 spin_lock_irqsave(&udc->lock, flags); in at91_udc_irq()
1206 if (!udc->clocked) { in at91_udc_irq()
1207 clk_on(udc); in at91_udc_irq()
1214 status = at91_udp_read(udc, AT91_UDP_ISR) in at91_udc_irq()
1215 & at91_udp_read(udc, AT91_UDP_IMR); in at91_udc_irq()
1221 at91_udp_write(udc, AT91_UDP_IDR, ~MINIMUS_INTERRUPTUS); in at91_udc_irq()
1222 at91_udp_write(udc, AT91_UDP_IER, MINIMUS_INTERRUPTUS); in at91_udc_irq()
1224 at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES); in at91_udc_irq()
1225 at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES); in at91_udc_irq()
1227 udc->addr = 0; in at91_udc_irq()
1228 reset_gadget(udc); in at91_udc_irq()
1231 at91_udp_write(udc, AT91_UDP_CSR(0), in at91_udc_irq()
1233 udc->gadget.speed = USB_SPEED_FULL; in at91_udc_irq()
1234 udc->suspended = 0; in at91_udc_irq()
1235 at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_EP(0)); in at91_udc_irq()
1246 at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXSUSP); in at91_udc_irq()
1247 at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXRSM); in at91_udc_irq()
1248 at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXSUSP); in at91_udc_irq()
1250 if (udc->suspended) in at91_udc_irq()
1252 udc->suspended = 1; in at91_udc_irq()
1260 if (udc->driver && udc->driver->suspend) { in at91_udc_irq()
1261 spin_unlock(&udc->lock); in at91_udc_irq()
1262 udc->driver->suspend(&udc->gadget); in at91_udc_irq()
1263 spin_lock(&udc->lock); in at91_udc_irq()
1268 at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM); in at91_udc_irq()
1269 at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXSUSP); in at91_udc_irq()
1270 at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM); in at91_udc_irq()
1272 if (!udc->suspended) in at91_udc_irq()
1274 udc->suspended = 0; in at91_udc_irq()
1281 if (udc->driver && udc->driver->resume) { in at91_udc_irq()
1282 spin_unlock(&udc->lock); in at91_udc_irq()
1283 udc->driver->resume(&udc->gadget); in at91_udc_irq()
1284 spin_lock(&udc->lock); in at91_udc_irq()
1291 struct at91_ep *ep = &udc->ep[1]; in at91_udc_irq()
1294 handle_ep0(udc); in at91_udc_irq()
1305 clk_off(udc); in at91_udc_irq()
1307 spin_unlock_irqrestore(&udc->lock, flags); in at91_udc_irq()
1317 struct at91_udc *udc = controller; in at91_start() local
1319 udc->driver = driver; in at91_start()
1320 udc->enabled = 1; in at91_start()
1321 udc->selfpowered = 1; in at91_start()
1328 struct at91_udc *udc = controller; in at91_stop() local
1331 spin_lock_irqsave(&udc->lock, flags); in at91_stop()
1332 udc->enabled = 0; in at91_stop()
1333 at91_udp_write(udc, AT91_UDP_IDR, ~0); in at91_stop()
1334 spin_unlock_irqrestore(&udc->lock, flags); in at91_stop()
1336 udc->driver = NULL; in at91_stop()
1344 static int at91sam9260_udc_init(struct at91_udc *udc) in at91sam9260_udc_init() argument
1350 ep = &udc->ep[i]; in at91sam9260_udc_init()
1365 static void at91sam9260_udc_pullup(struct at91_udc *udc, int is_on) in at91sam9260_udc_pullup() argument
1367 u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); in at91sam9260_udc_pullup()
1374 at91_udp_write(udc, AT91_UDP_TXVC, txvc); in at91sam9260_udc_pullup()
1384 static int at91sam9261_udc_init(struct at91_udc *udc) in at91sam9261_udc_init() argument
1390 ep = &udc->ep[i]; in at91sam9261_udc_init()
1405 udc->matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX; in at91sam9261_udc_init()
1407 if (IS_ERR(udc->matrix)) in at91sam9261_udc_init()
1408 return PTR_ERR(udc->matrix); in at91sam9261_udc_init()
1413 static void at91sam9261_udc_pullup(struct at91_udc *udc, int is_on) in at91sam9261_udc_pullup() argument
1417 usbpucr = readl(&udc->matrix->pucr); in at91sam9261_udc_pullup()
1421 writel(usbpucr, &udc->matrix->pucr); in at91sam9261_udc_pullup()
1432 struct at91_udc *udc = controller; in usb_gadget_handle_interrupts() local
1434 return at91_udc_irq(udc); in usb_gadget_handle_interrupts()
1439 struct at91_udc *udc = controller; in usb_gadget_register_driver() local
1447 if (udc->driver) { in usb_gadget_register_driver()
1448 printf("UDC already has a gadget driver\n"); in usb_gadget_register_driver()
1452 at91_start(&udc->gadget, driver); in usb_gadget_register_driver()
1454 udc->driver = driver; in usb_gadget_register_driver()
1456 ret = driver->bind(&udc->gadget); in usb_gadget_register_driver()
1459 udc->driver = NULL; in usb_gadget_register_driver()
1467 struct at91_udc *udc = controller; in usb_gadget_unregister_driver() local
1474 driver->disconnect(&udc->gadget); in usb_gadget_unregister_driver()
1475 driver->unbind(&udc->gadget); in usb_gadget_unregister_driver()
1476 udc->driver = NULL; in usb_gadget_unregister_driver()
1478 at91_stop(&udc->gadget); in usb_gadget_unregister_driver()
1485 struct at91_udc *udc; in at91_udc_probe() local
1490 udc = kzalloc(sizeof(*udc), GFP_KERNEL); in at91_udc_probe()
1491 if (!udc) in at91_udc_probe()
1494 controller = udc; in at91_udc_probe()
1495 memcpy(&udc->board, pdata, sizeof(struct at91_udc_data)); in at91_udc_probe()
1496 if (udc->board.vbus_pin) { in at91_udc_probe()
1501 udc->vbus = 1; in at91_udc_probe()
1505 udc->caps = &at91sam9260_udc_caps; in at91_udc_probe()
1508 udc->enabled = 0; in at91_udc_probe()
1509 spin_lock_init(&udc->lock); in at91_udc_probe()
1511 udc->gadget.ops = &at91_udc_ops; in at91_udc_probe()
1512 udc->gadget.ep0 = &udc->ep[0].ep; in at91_udc_probe()
1513 udc->gadget.name = driver_name; in at91_udc_probe()
1516 ep = &udc->ep[i]; in at91_udc_probe()
1519 ep->udc = udc; in at91_udc_probe()
1525 udc->udp_baseaddr = (void *)udc->board.baseaddr; in at91_udc_probe()
1526 if (IS_ERR(udc->udp_baseaddr)) in at91_udc_probe()
1527 return PTR_ERR(udc->udp_baseaddr); in at91_udc_probe()
1529 if (udc->caps && udc->caps->init) { in at91_udc_probe()
1530 retval = udc->caps->init(udc); in at91_udc_probe()
1535 udc_reinit(udc); in at91_udc_probe()
1537 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); in at91_udc_probe()
1538 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); in at91_udc_probe()
1540 at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff); in at91_udc_probe()