Lines Matching full:udc
125 * @udc: xilinx usb peripheral driver instance pointer
143 struct xusb_udc *udc; member
200 static const char driver_name[] = "xilinx-udc";
256 * @udc: pointer to the usb device controller structure.
258 static void xudc_wrstatus(struct xusb_udc *udc) in xudc_wrstatus() argument
260 struct xusb_ep *ep0 = &udc->ep[XUSB_EP_NUMBER_ZERO]; in xudc_wrstatus()
263 epcfgreg = udc->read_fn(udc->addr + ep0->offset)| in xudc_wrstatus()
265 udc->write_fn(udc->addr, ep0->offset, epcfgreg); in xudc_wrstatus()
266 udc->write_fn(udc->addr, ep0->offset + XUSB_EP_BUF0COUNT_OFFSET, 0); in xudc_wrstatus()
267 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); in xudc_wrstatus()
273 * @udc: pointer to the usb peripheral controller structure.
278 static void xudc_epconfig(struct xusb_ep *ep, struct xusb_udc *udc) in xudc_epconfig() argument
288 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_epconfig()
291 udc->write_fn(udc->addr, ep->offset + XUSB_EP_BUF0COUNT_OFFSET, in xudc_epconfig()
293 udc->write_fn(udc->addr, ep->offset + XUSB_EP_BUF1COUNT_OFFSET, in xudc_epconfig()
296 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_epconfig()
299 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_epconfig()
318 struct xusb_udc *udc = ep->udc; in xudc_start_dma() local
328 udc->write_fn(udc->addr, XUSB_DMA_DSAR_ADDR_OFFSET, src); in xudc_start_dma()
329 udc->write_fn(udc->addr, XUSB_DMA_DDAR_ADDR_OFFSET, dst); in xudc_start_dma()
330 udc->write_fn(udc->addr, XUSB_DMA_LENGTH_OFFSET, length); in xudc_start_dma()
338 reg = udc->read_fn(udc->addr + XUSB_DMA_STATUS_OFFSET); in xudc_start_dma()
348 dev_err(udc->dev, "DMA timeout\n"); in xudc_start_dma()
354 if ((udc->read_fn(udc->addr + XUSB_DMA_STATUS_OFFSET) & in xudc_start_dma()
356 dev_err(udc->dev, "DMA Error\n"); in xudc_start_dma()
381 struct xusb_udc *udc = ep->udc; in xudc_dma_send() local
385 dma_sync_single_for_device(udc->dev, src, in xudc_dma_send()
389 eprambase = (u32 __force *)(udc->addr + ep->rambase); in xudc_dma_send()
391 udc->write_fn(udc->addr, ep->offset + in xudc_dma_send()
393 udc->write_fn(udc->addr, XUSB_DMA_CONTROL_OFFSET, in xudc_dma_send()
399 eprambase = (u32 __force *)(udc->addr + ep->rambase + in xudc_dma_send()
402 udc->write_fn(udc->addr, ep->offset + in xudc_dma_send()
404 udc->write_fn(udc->addr, XUSB_DMA_CONTROL_OFFSET, in xudc_dma_send()
435 struct xusb_udc *udc = ep->udc; in xudc_dma_receive() local
440 eprambase = (u32 __force *)(udc->addr + ep->rambase); in xudc_dma_receive()
442 udc->write_fn(udc->addr, XUSB_DMA_CONTROL_OFFSET, in xudc_dma_receive()
449 eprambase = (u32 __force *)(udc->addr + in xudc_dma_receive()
452 udc->write_fn(udc->addr, XUSB_DMA_CONTROL_OFFSET, in xudc_dma_receive()
484 struct xusb_udc *udc = ep->udc; in xudc_eptxrx() local
487 if (udc->dma_enabled) { in xudc_eptxrx()
497 eprambase = (u32 __force *)(udc->addr + ep->rambase); in xudc_eptxrx()
500 udc->write_fn(udc->addr, ep->offset + in xudc_eptxrx()
508 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_eptxrx()
514 eprambase = (u32 __force *)(udc->addr + ep->rambase + in xudc_eptxrx()
518 udc->write_fn(udc->addr, ep->offset + in xudc_eptxrx()
526 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_eptxrx()
548 struct xusb_udc *udc = ep->udc; in xudc_done() local
558 dev_dbg(udc->dev, "%s done %p, status %d\n", in xudc_done()
561 if (udc->dma_enabled && ep->epnumber && req->usb_req.length) in xudc_done()
562 usb_gadget_unmap_request(&udc->gadget, &req->usb_req, in xudc_done()
566 spin_unlock(&udc->lock); in xudc_done()
568 spin_lock(&udc->lock); in xudc_done()
589 struct xusb_udc *udc = ep->udc; in xudc_read_fifo() local
592 dev_dbg(udc->dev, "Packet NOT ready!\n"); in xudc_read_fifo()
601 count = udc->read_fn(udc->addr + ep->offset + bufoffset); in xudc_read_fifo()
618 dev_dbg(udc->dev, "%s overflow %d\n", in xudc_read_fifo()
629 dev_dbg(udc->dev, "read %s, %d bytes%s req %p %d/%d\n", in xudc_read_fifo()
635 if (udc->dma_enabled && req->usb_req.length) in xudc_read_fifo()
636 dma_sync_single_for_cpu(udc->dev, in xudc_read_fifo()
649 dev_dbg(udc->dev, "receive busy\n"); in xudc_read_fifo()
677 struct xusb_udc *udc = ep->udc; in xudc_write_fifo() local
700 dev_dbg(udc->dev, "%s: wrote %s %d bytes%s%s %d left %p\n", in xudc_write_fifo()
711 dev_dbg(udc->dev, "Send busy\n"); in xudc_write_fifo()
749 struct xusb_udc *udc; in xudc_ep_set_halt() local
757 udc = ep->udc; in xudc_ep_set_halt()
760 dev_dbg(udc->dev, "requests pending can't halt\n"); in xudc_ep_set_halt()
765 dev_dbg(udc->dev, "HW buffers busy can't halt\n"); in xudc_ep_set_halt()
769 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_set_halt()
773 epcfgreg = udc->read_fn(udc->addr + ep->offset); in xudc_ep_set_halt()
775 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_ep_set_halt()
778 epcfgreg = udc->read_fn(udc->addr + ep->offset); in xudc_ep_set_halt()
780 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_ep_set_halt()
783 epcfgreg = udc->read_fn(ep->udc->addr + ep->offset); in xudc_ep_set_halt()
785 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_ep_set_halt()
789 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_set_halt()
803 struct xusb_udc *udc = ep->udc; in __xudc_ep_enable() local
819 dev_dbg(udc->dev, "only one control endpoint\n"); in __xudc_ep_enable()
827 dev_dbg(udc->dev, "bogus maxpacket %d\n", maxpacket); in __xudc_ep_enable()
836 dev_dbg(udc->dev, "bogus maxpacket %d\n", maxpacket); in __xudc_ep_enable()
850 xudc_epconfig(ep, udc); in __xudc_ep_enable()
852 dev_dbg(udc->dev, "Enable Endpoint %d max pkt is %d\n", in __xudc_ep_enable()
856 epcfg = udc->read_fn(udc->addr + ep->offset); in __xudc_ep_enable()
858 udc->write_fn(udc->addr, ep->offset, epcfg); in __xudc_ep_enable()
863 ier = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in __xudc_ep_enable()
865 udc->write_fn(udc->addr, XUSB_IER_OFFSET, ier); in __xudc_ep_enable()
869 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in __xudc_ep_enable()
872 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in __xudc_ep_enable()
892 struct xusb_udc *udc; in xudc_ep_enable() local
902 udc = ep->udc; in xudc_ep_enable()
904 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) { in xudc_ep_enable()
905 dev_dbg(udc->dev, "bogus device state\n"); in xudc_ep_enable()
909 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_enable()
911 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_enable()
927 struct xusb_udc *udc; in xudc_ep_disable() local
935 udc = ep->udc; in xudc_ep_disable()
937 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_disable()
945 dev_dbg(udc->dev, "USB Ep %d disable\n ", ep->epnumber); in xudc_ep_disable()
947 epcfg = udc->read_fn(udc->addr + ep->offset); in xudc_ep_disable()
949 udc->write_fn(udc->addr, ep->offset, epcfg); in xudc_ep_disable()
951 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_disable()
998 struct xusb_udc *udc = ep0->udc; in __xudc_ep0_queue() local
1002 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) { in __xudc_ep0_queue()
1003 dev_dbg(udc->dev, "%s, bogus device state\n", __func__); in __xudc_ep0_queue()
1007 dev_dbg(udc->dev, "%s:ep0 busy\n", __func__); in __xudc_ep0_queue()
1016 if (udc->setup.bRequestType & USB_DIR_IN) { in __xudc_ep0_queue()
1020 udc->addr); in __xudc_ep0_queue()
1024 udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, length); in __xudc_ep0_queue()
1025 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); in __xudc_ep0_queue()
1027 if (udc->setup.wLength) { in __xudc_ep0_queue()
1029 udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, 0); in __xudc_ep0_queue()
1030 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); in __xudc_ep0_queue()
1032 xudc_wrstatus(udc); in __xudc_ep0_queue()
1052 struct xusb_udc *udc = ep0->udc; in xudc_ep0_queue() local
1056 spin_lock_irqsave(&udc->lock, flags); in xudc_ep0_queue()
1058 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep0_queue()
1076 struct xusb_udc *udc = ep->udc; in xudc_ep_queue() local
1081 dev_dbg(udc->dev, "%s: queuing request to disabled %s\n", in xudc_ep_queue()
1086 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) { in xudc_ep_queue()
1087 dev_dbg(udc->dev, "%s, bogus device state\n", __func__); in xudc_ep_queue()
1091 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_queue()
1096 if (udc->dma_enabled) { in xudc_ep_queue()
1097 ret = usb_gadget_map_request(&udc->gadget, &req->usb_req, in xudc_ep_queue()
1100 dev_dbg(udc->dev, "gadget_map failed ep%d\n", in xudc_ep_queue()
1102 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_queue()
1109 dev_dbg(udc->dev, "xudc_write_fifo from ep_queue\n"); in xudc_ep_queue()
1113 dev_dbg(udc->dev, "xudc_read_fifo from ep_queue\n"); in xudc_ep_queue()
1122 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_queue()
1137 struct xusb_udc *udc = ep->udc; in xudc_ep_dequeue() local
1140 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_dequeue()
1147 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_dequeue()
1151 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_dequeue()
1212 struct xusb_udc *udc; in xudc_get_frame() local
1218 udc = to_udc(gadget); in xudc_get_frame()
1219 frame = udc->read_fn(udc->addr + XUSB_FRAMENUM_OFFSET); in xudc_get_frame()
1231 struct xusb_udc *udc = to_udc(gadget); in xudc_wakeup() local
1236 spin_lock_irqsave(&udc->lock, flags); in xudc_wakeup()
1239 if (!udc->remote_wkp) in xudc_wakeup()
1242 crtlreg = udc->read_fn(udc->addr + XUSB_CONTROL_OFFSET); in xudc_wakeup()
1245 udc->write_fn(udc->addr, XUSB_CONTROL_OFFSET, crtlreg); in xudc_wakeup()
1253 udc->write_fn(udc->addr, XUSB_CONTROL_OFFSET, crtlreg); in xudc_wakeup()
1256 spin_unlock_irqrestore(&udc->lock, flags); in xudc_wakeup()
1271 struct xusb_udc *udc = to_udc(gadget); in xudc_pullup() local
1275 spin_lock_irqsave(&udc->lock, flags); in xudc_pullup()
1277 crtlreg = udc->read_fn(udc->addr + XUSB_CONTROL_OFFSET); in xudc_pullup()
1283 udc->write_fn(udc->addr, XUSB_CONTROL_OFFSET, crtlreg); in xudc_pullup()
1285 spin_unlock_irqrestore(&udc->lock, flags); in xudc_pullup()
1292 * @udc: pointer to the usb device controller structure.
1294 static void xudc_eps_init(struct xusb_udc *udc) in xudc_eps_init() argument
1298 INIT_LIST_HEAD(&udc->gadget.ep_list); in xudc_eps_init()
1301 struct xusb_ep *ep = &udc->ep[ep_number]; in xudc_eps_init()
1305 &udc->gadget.ep_list); in xudc_eps_init()
1326 ep->udc = udc; in xudc_eps_init()
1337 xudc_epconfig(ep, udc); in xudc_eps_init()
1346 * @udc: pointer to the usb device controller structure.
1348 static void xudc_stop_activity(struct xusb_udc *udc) in xudc_stop_activity() argument
1354 ep = &udc->ep[i]; in xudc_stop_activity()
1369 struct xusb_udc *udc = to_udc(gadget); in xudc_start() local
1370 struct xusb_ep *ep0 = &udc->ep[XUSB_EP_NUMBER_ZERO]; in xudc_start()
1375 spin_lock_irqsave(&udc->lock, flags); in xudc_start()
1377 if (udc->driver) { in xudc_start()
1378 dev_err(udc->dev, "%s is already bound to %s\n", in xudc_start()
1379 udc->gadget.name, udc->driver->driver.name); in xudc_start()
1385 udc->driver = driver; in xudc_start()
1386 udc->gadget.speed = driver->max_speed; in xudc_start()
1392 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, 0); in xudc_start()
1393 udc->remote_wkp = 0; in xudc_start()
1395 spin_unlock_irqrestore(&udc->lock, flags); in xudc_start()
1407 struct xusb_udc *udc = to_udc(gadget); in xudc_stop() local
1410 spin_lock_irqsave(&udc->lock, flags); in xudc_stop()
1412 udc->gadget.speed = USB_SPEED_UNKNOWN; in xudc_stop()
1413 udc->driver = NULL; in xudc_stop()
1416 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, 0); in xudc_stop()
1417 udc->remote_wkp = 0; in xudc_stop()
1419 xudc_stop_activity(udc); in xudc_stop()
1421 spin_unlock_irqrestore(&udc->lock, flags); in xudc_stop()
1436 * @udc: pointer to the udc structure.
1438 static void xudc_clear_stall_all_ep(struct xusb_udc *udc) in xudc_clear_stall_all_ep() argument
1445 ep = &udc->ep[i]; in xudc_clear_stall_all_ep()
1446 epcfgreg = udc->read_fn(udc->addr + ep->offset); in xudc_clear_stall_all_ep()
1448 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_clear_stall_all_ep()
1451 epcfgreg = udc->read_fn(udc->addr + ep->offset); in xudc_clear_stall_all_ep()
1453 udc->write_fn(udc->addr, ep->offset, epcfgreg); in xudc_clear_stall_all_ep()
1460 * @udc: pointer to the udc structure.
1465 static void xudc_startup_handler(struct xusb_udc *udc, u32 intrstatus) in xudc_startup_handler() argument
1471 dev_dbg(udc->dev, "Reset\n"); in xudc_startup_handler()
1474 udc->gadget.speed = USB_SPEED_HIGH; in xudc_startup_handler()
1476 udc->gadget.speed = USB_SPEED_FULL; in xudc_startup_handler()
1478 xudc_stop_activity(udc); in xudc_startup_handler()
1479 xudc_clear_stall_all_ep(udc); in xudc_startup_handler()
1480 udc->write_fn(udc->addr, XUSB_TESTMODE_OFFSET, 0); in xudc_startup_handler()
1483 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, 0); in xudc_startup_handler()
1484 udc->remote_wkp = 0; in xudc_startup_handler()
1487 intrreg = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_startup_handler()
1490 udc->write_fn(udc->addr, XUSB_IER_OFFSET, intrreg); in xudc_startup_handler()
1494 dev_dbg(udc->dev, "Suspend\n"); in xudc_startup_handler()
1497 intrreg = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_startup_handler()
1500 udc->write_fn(udc->addr, XUSB_IER_OFFSET, intrreg); in xudc_startup_handler()
1502 udc->usb_state = USB_STATE_SUSPENDED; in xudc_startup_handler()
1504 if (udc->driver->suspend) { in xudc_startup_handler()
1505 spin_unlock(&udc->lock); in xudc_startup_handler()
1506 udc->driver->suspend(&udc->gadget); in xudc_startup_handler()
1507 spin_lock(&udc->lock); in xudc_startup_handler()
1511 bool condition = (udc->usb_state != USB_STATE_SUSPENDED); in xudc_startup_handler()
1513 dev_WARN_ONCE(udc->dev, condition, in xudc_startup_handler()
1516 dev_dbg(udc->dev, "Resume\n"); in xudc_startup_handler()
1519 intrreg = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_startup_handler()
1522 udc->write_fn(udc->addr, XUSB_IER_OFFSET, intrreg); in xudc_startup_handler()
1524 udc->usb_state = 0; in xudc_startup_handler()
1526 if (udc->driver->resume) { in xudc_startup_handler()
1527 spin_unlock(&udc->lock); in xudc_startup_handler()
1528 udc->driver->resume(&udc->gadget); in xudc_startup_handler()
1529 spin_lock(&udc->lock); in xudc_startup_handler()
1534 dev_dbg(udc->dev, "Disconnect\n"); in xudc_startup_handler()
1537 intrreg = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_startup_handler()
1540 udc->write_fn(udc->addr, XUSB_IER_OFFSET, intrreg); in xudc_startup_handler()
1542 if (udc->driver && udc->driver->disconnect) { in xudc_startup_handler()
1543 spin_unlock(&udc->lock); in xudc_startup_handler()
1544 udc->driver->disconnect(&udc->gadget); in xudc_startup_handler()
1545 spin_lock(&udc->lock); in xudc_startup_handler()
1552 * @udc: pointer to the udc structure.
1556 static void xudc_ep0_stall(struct xusb_udc *udc) in xudc_ep0_stall() argument
1559 struct xusb_ep *ep0 = &udc->ep[XUSB_EP_NUMBER_ZERO]; in xudc_ep0_stall()
1561 epcfgreg = udc->read_fn(udc->addr + ep0->offset); in xudc_ep0_stall()
1563 udc->write_fn(udc->addr, ep0->offset, epcfgreg); in xudc_ep0_stall()
1568 * @udc: pointer to the udc structure.
1572 static void xudc_setaddress(struct xusb_udc *udc) in xudc_setaddress() argument
1574 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_setaddress()
1575 struct xusb_req *req = udc->req; in xudc_setaddress()
1583 dev_err(udc->dev, "Can't respond to SET ADDRESS request\n"); in xudc_setaddress()
1584 xudc_ep0_stall(udc); in xudc_setaddress()
1589 * @udc: pointer to the udc structure.
1593 static void xudc_getstatus(struct xusb_udc *udc) in xudc_getstatus() argument
1595 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_getstatus()
1596 struct xusb_req *req = udc->req; in xudc_getstatus()
1604 switch (udc->setup.bRequestType & USB_RECIP_MASK) { in xudc_getstatus()
1608 if (udc->remote_wkp) in xudc_getstatus()
1614 epnum = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK; in xudc_getstatus()
1615 target_ep = &udc->ep[epnum]; in xudc_getstatus()
1616 epcfgreg = udc->read_fn(udc->addr + target_ep->offset); in xudc_getstatus()
1618 if (udc->setup.wIndex & USB_DIR_IN) { in xudc_getstatus()
1638 dev_err(udc->dev, "Can't respond to getstatus request\n"); in xudc_getstatus()
1639 xudc_ep0_stall(udc); in xudc_getstatus()
1644 * @udc: pointer to the usb device controller structure.
1648 static void xudc_set_clear_feature(struct xusb_udc *udc) in xudc_set_clear_feature() argument
1650 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_set_clear_feature()
1651 struct xusb_req *req = udc->req; in xudc_set_clear_feature()
1656 int flag = (udc->setup.bRequest == USB_REQ_SET_FEATURE ? 1 : 0); in xudc_set_clear_feature()
1659 switch (udc->setup.bRequestType) { in xudc_set_clear_feature()
1661 switch (udc->setup.wValue) { in xudc_set_clear_feature()
1670 udc->remote_wkp = 1; in xudc_set_clear_feature()
1672 udc->remote_wkp = 0; in xudc_set_clear_feature()
1675 xudc_ep0_stall(udc); in xudc_set_clear_feature()
1680 if (!udc->setup.wValue) { in xudc_set_clear_feature()
1681 endpoint = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK; in xudc_set_clear_feature()
1682 target_ep = &udc->ep[endpoint]; in xudc_set_clear_feature()
1683 outinbit = udc->setup.wIndex & USB_ENDPOINT_DIR_MASK; in xudc_set_clear_feature()
1688 xudc_ep0_stall(udc); in xudc_set_clear_feature()
1691 epcfgreg = udc->read_fn(udc->addr + target_ep->offset); in xudc_set_clear_feature()
1695 udc->write_fn(udc->addr, in xudc_set_clear_feature()
1700 udc->write_fn(udc->addr, in xudc_set_clear_feature()
1707 udc->write_fn(udc->addr, in xudc_set_clear_feature()
1715 xudc_ep0_stall(udc); in xudc_set_clear_feature()
1724 dev_err(udc->dev, "Can't respond to SET/CLEAR FEATURE\n"); in xudc_set_clear_feature()
1725 xudc_ep0_stall(udc); in xudc_set_clear_feature()
1730 * @udc: pointer to the usb device controller structure.
1734 static void xudc_handle_setup(struct xusb_udc *udc) in xudc_handle_setup() argument
1735 __must_hold(&udc->lock) in xudc_handle_setup()
1737 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_handle_setup()
1742 ep0rambase = (u32 __force *) (udc->addr + XUSB_SETUP_PKT_ADDR_OFFSET); in xudc_handle_setup()
1745 udc->setup = setup; in xudc_handle_setup()
1746 udc->setup.wValue = cpu_to_le16(setup.wValue); in xudc_handle_setup()
1747 udc->setup.wIndex = cpu_to_le16(setup.wIndex); in xudc_handle_setup()
1748 udc->setup.wLength = cpu_to_le16(setup.wLength); in xudc_handle_setup()
1753 if (udc->setup.bRequestType & USB_DIR_IN) { in xudc_handle_setup()
1755 udc->setupseqrx = STATUS_PHASE; in xudc_handle_setup()
1756 udc->setupseqtx = DATA_PHASE; in xudc_handle_setup()
1759 udc->setupseqrx = DATA_PHASE; in xudc_handle_setup()
1760 udc->setupseqtx = STATUS_PHASE; in xudc_handle_setup()
1763 switch (udc->setup.bRequest) { in xudc_handle_setup()
1765 /* Data+Status phase form udc */ in xudc_handle_setup()
1766 if ((udc->setup.bRequestType & in xudc_handle_setup()
1770 xudc_getstatus(udc); in xudc_handle_setup()
1773 /* Status phase from udc */ in xudc_handle_setup()
1774 if (udc->setup.bRequestType != (USB_DIR_OUT | in xudc_handle_setup()
1777 xudc_setaddress(udc); in xudc_handle_setup()
1781 /* Requests with no data phase, status phase from udc */ in xudc_handle_setup()
1782 if ((udc->setup.bRequestType & USB_TYPE_MASK) in xudc_handle_setup()
1785 xudc_set_clear_feature(udc); in xudc_handle_setup()
1791 spin_unlock(&udc->lock); in xudc_handle_setup()
1792 if (udc->driver->setup(&udc->gadget, &setup) < 0) in xudc_handle_setup()
1793 xudc_ep0_stall(udc); in xudc_handle_setup()
1794 spin_lock(&udc->lock); in xudc_handle_setup()
1799 * @udc: pointer to the usb device controller structure.
1801 static void xudc_ep0_out(struct xusb_udc *udc) in xudc_ep0_out() argument
1803 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_ep0_out()
1811 switch (udc->setupseqrx) { in xudc_ep0_out()
1817 udc->setupseqrx = SETUP_PHASE; in xudc_ep0_out()
1818 udc->setupseqtx = SETUP_PHASE; in xudc_ep0_out()
1823 bytes_to_rx = udc->read_fn(udc->addr + in xudc_ep0_out()
1826 ep0rambase = (u8 __force *) (udc->addr + in xudc_ep0_out()
1834 xudc_wrstatus(udc); in xudc_ep0_out()
1837 udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, 0); in xudc_ep0_out()
1838 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); in xudc_ep0_out()
1848 * @udc: pointer to the usb device controller structure.
1850 static void xudc_ep0_in(struct xusb_udc *udc) in xudc_ep0_in() argument
1852 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_ep0_in()
1860 u8 test_mode = udc->setup.wIndex >> 8; in xudc_ep0_in()
1865 switch (udc->setupseqtx) { in xudc_ep0_in()
1867 switch (udc->setup.bRequest) { in xudc_ep0_in()
1870 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, in xudc_ep0_in()
1871 udc->setup.wValue); in xudc_ep0_in()
1874 if (udc->setup.bRequestType == in xudc_ep0_in()
1876 if (udc->setup.wValue == in xudc_ep0_in()
1878 udc->write_fn(udc->addr, in xudc_ep0_in()
1894 epcfgreg = udc->read_fn(udc->addr + ep0->offset); in xudc_ep0_in()
1896 udc->write_fn(udc->addr, ep0->offset, epcfgreg); in xudc_ep0_in()
1897 udc->setupseqtx = STATUS_PHASE; in xudc_ep0_in()
1902 ep0rambase = (u8 __force *) (udc->addr + in xudc_ep0_in()
1908 udc->write_fn(udc->addr, XUSB_EP_BUF0COUNT_OFFSET, count); in xudc_ep0_in()
1909 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, 1); in xudc_ep0_in()
1918 * @udc: pointer to the udc structure.
1923 static void xudc_ctrl_ep_handler(struct xusb_udc *udc, u32 intrstatus) in xudc_ctrl_ep_handler() argument
1927 xudc_handle_setup(udc); in xudc_ctrl_ep_handler()
1930 xudc_ep0_out(udc); in xudc_ctrl_ep_handler()
1932 xudc_ep0_in(udc); in xudc_ctrl_ep_handler()
1938 * @udc: pointer to the udc structure.
1945 static void xudc_nonctrl_ep_handler(struct xusb_udc *udc, u8 epnum, in xudc_nonctrl_ep_handler() argument
1952 ep = &udc->ep[epnum]; in xudc_nonctrl_ep_handler()
1979 struct xusb_udc *udc = _udc; in xudc_irq() local
1986 spin_lock_irqsave(&udc->lock, flags); in xudc_irq()
1992 ier = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_irq()
1994 udc->write_fn(udc->addr, XUSB_IER_OFFSET, ier); in xudc_irq()
1997 intrstatus = udc->read_fn(udc->addr + XUSB_STATUS_OFFSET); in xudc_irq()
2008 xudc_startup_handler(udc, intrstatus); in xudc_irq()
2014 ier = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in xudc_irq()
2016 udc->write_fn(udc->addr, XUSB_IER_OFFSET, ier); in xudc_irq()
2019 xudc_ctrl_ep_handler(udc, intrstatus); in xudc_irq()
2028 xudc_nonctrl_ep_handler(udc, index, in xudc_irq()
2034 spin_unlock_irqrestore(&udc->lock, flags); in xudc_irq()
2048 struct xusb_udc *udc; in xudc_probe() local
2054 udc = devm_kzalloc(&pdev->dev, sizeof(*udc), GFP_KERNEL); in xudc_probe()
2055 if (!udc) in xudc_probe()
2059 udc->req = devm_kzalloc(&pdev->dev, sizeof(struct xusb_req), in xudc_probe()
2061 if (!udc->req) in xudc_probe()
2068 udc->req->usb_req.buf = buff; in xudc_probe()
2072 udc->addr = devm_ioremap_resource(&pdev->dev, res); in xudc_probe()
2073 if (IS_ERR(udc->addr)) in xudc_probe()
2074 return PTR_ERR(udc->addr); in xudc_probe()
2080 dev_name(&pdev->dev), udc); in xudc_probe()
2086 udc->dma_enabled = of_property_read_bool(np, "xlnx,has-builtin-dma"); in xudc_probe()
2089 udc->gadget.ops = &xusb_udc_ops; in xudc_probe()
2090 udc->gadget.max_speed = USB_SPEED_HIGH; in xudc_probe()
2091 udc->gadget.speed = USB_SPEED_UNKNOWN; in xudc_probe()
2092 udc->gadget.ep0 = &udc->ep[XUSB_EP_NUMBER_ZERO].ep_usb; in xudc_probe()
2093 udc->gadget.name = driver_name; in xudc_probe()
2095 spin_lock_init(&udc->lock); in xudc_probe()
2098 udc->write_fn = xudc_write32_be; in xudc_probe()
2099 udc->read_fn = xudc_read32_be; in xudc_probe()
2100 udc->write_fn(udc->addr, XUSB_TESTMODE_OFFSET, USB_TEST_J); in xudc_probe()
2101 if ((udc->read_fn(udc->addr + XUSB_TESTMODE_OFFSET)) in xudc_probe()
2103 udc->write_fn = xudc_write32; in xudc_probe()
2104 udc->read_fn = xudc_read32; in xudc_probe()
2106 udc->write_fn(udc->addr, XUSB_TESTMODE_OFFSET, 0); in xudc_probe()
2108 xudc_eps_init(udc); in xudc_probe()
2111 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, 0); in xudc_probe()
2113 ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget); in xudc_probe()
2117 udc->dev = &udc->gadget.dev; in xudc_probe()
2125 udc->write_fn(udc->addr, XUSB_IER_OFFSET, ier); in xudc_probe()
2127 platform_set_drvdata(pdev, udc); in xudc_probe()
2130 driver_name, (u32)res->start, udc->addr, in xudc_probe()
2131 udc->dma_enabled ? "with DMA" : "without DMA"); in xudc_probe()
2147 struct xusb_udc *udc = platform_get_drvdata(pdev); in xudc_remove() local
2149 usb_del_gadget_udc(&udc->gadget); in xudc_remove()
2172 MODULE_DESCRIPTION("Xilinx udc driver");