Lines Matching +full:device +full:- +full:addr
1 // SPDX-License-Identifier: GPL-2.0+
8 * Copyright (C) 2010 - 2014 Xilinx, Inc.
10 * Some parts of this driver code is based on the driver for at91-series
15 #include <linux/device.h>
16 #include <linux/dma-mapping.h>
28 /* Register offsets for the USB device.*/
41 #define XUSB_DMA_DDAR_ADDR_OFFSET 0x020C /* DMA destination Addr Reg */
83 /* USB device specific global configuration constants.*/
110 * struct xusb_req - Xilinx USB device request structure
112 * @queue: usb device request queue
122 * struct xusb_ep - USB end point structure.
160 * struct xusb_udc - USB peripheral driver structure
166 * @dev: pointer to device structure in gadget
167 * @usb_state: device in suspended state or not
171 * @addr: the usb device base address
174 * @read_fn: function pointer to read device registers
175 * @write_fn: function pointer to write to device registers
183 struct device *dev;
188 void __iomem *addr; member
200 static const char driver_name[] = "xilinx-udc";
213 * xudc_write32 - little endian write to device registers
214 * @addr: base addr of device registers
218 static void xudc_write32(void __iomem *addr, u32 offset, u32 val) in xudc_write32() argument
220 iowrite32(val, addr + offset); in xudc_write32()
224 * xudc_read32 - little endian read from device registers
225 * @addr: addr of device register
226 * Return: value at addr
228 static unsigned int xudc_read32(void __iomem *addr) in xudc_read32() argument
230 return ioread32(addr); in xudc_read32()
234 * xudc_write32_be - big endian write to device registers
235 * @addr: base addr of device registers
239 static void xudc_write32_be(void __iomem *addr, u32 offset, u32 val) in xudc_write32_be() argument
241 iowrite32be(val, addr + offset); in xudc_write32_be()
245 * xudc_read32_be - big endian read from device registers
246 * @addr: addr of device register
247 * Return: value at addr
249 static unsigned int xudc_read32_be(void __iomem *addr) in xudc_read32_be() argument
251 return ioread32be(addr); in xudc_read32_be()
255 * xudc_wrstatus - Sets up the usb device status stages.
256 * @udc: pointer to the usb device controller structure.
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()
271 * xudc_epconfig - Configures the given endpoint.
272 * @ep: pointer to the usb device endpoint structure.
286 epcfgreg = ((ep->is_in << 29) | (ep->is_iso << 28) | in xudc_epconfig()
287 (ep->ep_usb.maxpacket << 15) | (ep->rambase)); in xudc_epconfig()
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()
292 ep->buffer0count); in xudc_epconfig()
293 udc->write_fn(udc->addr, ep->offset + XUSB_EP_BUF1COUNT_OFFSET, in xudc_epconfig()
294 ep->buffer1count); in xudc_epconfig()
295 if (ep->buffer0ready) in xudc_epconfig()
296 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_epconfig()
297 1 << ep->epnumber); in xudc_epconfig()
298 if (ep->buffer1ready) in xudc_epconfig()
299 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in xudc_epconfig()
300 1 << (ep->epnumber + XUSB_STATUS_EP_BUFF2_SHIFT)); in xudc_epconfig()
304 * xudc_start_dma - Starts DMA transfer.
305 * @ep: pointer to the usb device endpoint structure.
318 struct xusb_udc *udc = ep->udc; in xudc_start_dma()
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()
346 timeout--; in xudc_start_dma()
348 dev_err(udc->dev, "DMA timeout\n"); in xudc_start_dma()
349 return -ETIMEDOUT; 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()
357 rc = -EINVAL; in xudc_start_dma()
364 * xudc_dma_send - Sends IN data using DMA.
365 * @ep: pointer to the usb device endpoint structure.
370 * Return: 0 on success, -EAGAIN if no buffer is free and error
381 struct xusb_udc *udc = ep->udc; in xudc_dma_send()
383 src = req->usb_req.dma + req->usb_req.actual; in xudc_dma_send()
384 if (req->usb_req.length) in xudc_dma_send()
385 dma_sync_single_for_device(udc->dev, src, in xudc_dma_send()
387 if (!ep->curbufnum && !ep->buffer0ready) { 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()
394 XUSB_DMA_BRR_CTRL | (1 << ep->epnumber)); in xudc_dma_send()
395 ep->buffer0ready = 1; in xudc_dma_send()
396 ep->curbufnum = 1; in xudc_dma_send()
397 } else if (ep->curbufnum && !ep->buffer1ready) { in xudc_dma_send()
399 eprambase = (u32 __force *)(udc->addr + ep->rambase + in xudc_dma_send()
400 ep->ep_usb.maxpacket); 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()
405 XUSB_DMA_BRR_CTRL | (1 << (ep->epnumber + in xudc_dma_send()
407 ep->buffer1ready = 1; in xudc_dma_send()
408 ep->curbufnum = 0; in xudc_dma_send()
411 return -EAGAIN; in xudc_dma_send()
418 * xudc_dma_receive - Receives OUT data using DMA.
419 * @ep: pointer to the usb device endpoint structure.
424 * Return: 0 on success, -EAGAIN if no buffer is free and error
435 struct xusb_udc *udc = ep->udc; in xudc_dma_receive()
437 dst = req->usb_req.dma + req->usb_req.actual; in xudc_dma_receive()
438 if (!ep->curbufnum && !ep->buffer0ready) { in xudc_dma_receive()
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()
444 (1 << ep->epnumber)); in xudc_dma_receive()
445 ep->buffer0ready = 1; in xudc_dma_receive()
446 ep->curbufnum = 1; in xudc_dma_receive()
447 } else if (ep->curbufnum && !ep->buffer1ready) { in xudc_dma_receive()
449 eprambase = (u32 __force *)(udc->addr + in xudc_dma_receive()
450 ep->rambase + ep->ep_usb.maxpacket); in xudc_dma_receive()
452 udc->write_fn(udc->addr, XUSB_DMA_CONTROL_OFFSET, in xudc_dma_receive()
454 (1 << (ep->epnumber + in xudc_dma_receive()
456 ep->buffer1ready = 1; in xudc_dma_receive()
457 ep->curbufnum = 0; in xudc_dma_receive()
459 /* None of the ping-pong buffers are ready currently */ in xudc_dma_receive()
460 return -EAGAIN; in xudc_dma_receive()
467 * xudc_eptxrx - Transmits or receives data to or from an endpoint.
473 * Return: 0 on success, -EAGAIN if no buffer is free.
484 struct xusb_udc *udc = ep->udc; in xudc_eptxrx()
487 if (udc->dma_enabled) { in xudc_eptxrx()
488 if (ep->is_in) in xudc_eptxrx()
494 /* Put the transmit buffer into the correct ping-pong buffer.*/ in xudc_eptxrx()
495 if (!ep->curbufnum && !ep->buffer0ready) { in xudc_eptxrx()
497 eprambase = (u32 __force *)(udc->addr + ep->rambase); in xudc_eptxrx()
498 if (ep->is_in) { 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()
509 1 << ep->epnumber); in xudc_eptxrx()
510 ep->buffer0ready = 1; in xudc_eptxrx()
511 ep->curbufnum = 1; in xudc_eptxrx()
512 } else if (ep->curbufnum && !ep->buffer1ready) { in xudc_eptxrx()
514 eprambase = (u32 __force *)(udc->addr + ep->rambase + in xudc_eptxrx()
515 ep->ep_usb.maxpacket); in xudc_eptxrx()
516 if (ep->is_in) { 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()
527 1 << (ep->epnumber + XUSB_STATUS_EP_BUFF2_SHIFT)); in xudc_eptxrx()
528 ep->buffer1ready = 1; in xudc_eptxrx()
529 ep->curbufnum = 0; in xudc_eptxrx()
531 /* None of the ping-pong buffers are ready currently */ in xudc_eptxrx()
532 return -EAGAIN; in xudc_eptxrx()
538 * xudc_done - Exeutes the endpoint data transfer completion tasks.
539 * @ep: pointer to the usb device endpoint structure.
548 struct xusb_udc *udc = ep->udc; in xudc_done()
550 list_del_init(&req->queue); in xudc_done()
552 if (req->usb_req.status == -EINPROGRESS) in xudc_done()
553 req->usb_req.status = status; in xudc_done()
555 status = req->usb_req.status; in xudc_done()
557 if (status && status != -ESHUTDOWN) in xudc_done()
558 dev_dbg(udc->dev, "%s done %p, status %d\n", in xudc_done()
559 ep->ep_usb.name, req, status); 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()
563 ep->is_in); in xudc_done()
565 if (req->usb_req.complete) { in xudc_done()
566 spin_unlock(&udc->lock); in xudc_done()
567 req->usb_req.complete(&ep->ep_usb, &req->usb_req); in xudc_done()
568 spin_lock(&udc->lock); in xudc_done()
573 * xudc_read_fifo - Reads the data from the given endpoint buffer.
574 * @ep: pointer to the usb device endpoint structure.
577 * Return: 0 if request is completed and -EAGAIN if not completed.
588 int retval = -EAGAIN; in xudc_read_fifo()
589 struct xusb_udc *udc = ep->udc; in xudc_read_fifo()
591 if (ep->buffer0ready && ep->buffer1ready) { in xudc_read_fifo()
592 dev_dbg(udc->dev, "Packet NOT ready!\n"); in xudc_read_fifo()
596 if (ep->curbufnum) in xudc_read_fifo()
601 count = udc->read_fn(udc->addr + ep->offset + bufoffset); in xudc_read_fifo()
603 if (!ep->buffer0ready && !ep->buffer1ready) in xudc_read_fifo()
606 buf = req->usb_req.buf + req->usb_req.actual; in xudc_read_fifo()
608 bufferspace = req->usb_req.length - req->usb_req.actual; in xudc_read_fifo()
609 is_short = count < ep->ep_usb.maxpacket; in xudc_read_fifo()
617 if (req->usb_req.status != -EOVERFLOW) in xudc_read_fifo()
618 dev_dbg(udc->dev, "%s overflow %d\n", in xudc_read_fifo()
619 ep->ep_usb.name, count); in xudc_read_fifo()
620 req->usb_req.status = -EOVERFLOW; in xudc_read_fifo()
621 xudc_done(ep, req, -EOVERFLOW); in xudc_read_fifo()
628 req->usb_req.actual += min(count, bufferspace); in xudc_read_fifo()
629 dev_dbg(udc->dev, "read %s, %d bytes%s req %p %d/%d\n", in xudc_read_fifo()
630 ep->ep_usb.name, count, is_short ? "/S" : "", req, in xudc_read_fifo()
631 req->usb_req.actual, req->usb_req.length); in xudc_read_fifo()
632 bufferspace -= count; in xudc_read_fifo()
634 if ((req->usb_req.actual == req->usb_req.length) || is_short) { 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()
637 req->usb_req.dma, in xudc_read_fifo()
638 req->usb_req.actual, in xudc_read_fifo()
648 case -EAGAIN: in xudc_read_fifo()
649 dev_dbg(udc->dev, "receive busy\n"); in xudc_read_fifo()
651 case -EINVAL: in xudc_read_fifo()
652 case -ETIMEDOUT: in xudc_read_fifo()
654 xudc_done(ep, req, -ECONNRESET); in xudc_read_fifo()
663 * xudc_write_fifo - Writes data into the given endpoint buffer.
664 * @ep: pointer to the usb device endpoint structure.
667 * Return: 0 if request is completed and -EAGAIN if not completed.
676 int retval = -EAGAIN; in xudc_write_fifo()
677 struct xusb_udc *udc = ep->udc; in xudc_write_fifo()
681 max = le16_to_cpu(ep->desc->wMaxPacketSize); in xudc_write_fifo()
682 buf = req->usb_req.buf + req->usb_req.actual; in xudc_write_fifo()
684 length = req->usb_req.length - req->usb_req.actual; in xudc_write_fifo()
690 req->usb_req.actual += length; in xudc_write_fifo()
694 if (likely(req->usb_req.length != in xudc_write_fifo()
695 req->usb_req.actual) || req->usb_req.zero) in xudc_write_fifo()
700 dev_dbg(udc->dev, "%s: wrote %s %d bytes%s%s %d left %p\n", in xudc_write_fifo()
701 __func__, ep->ep_usb.name, length, is_last ? "/L" : "", in xudc_write_fifo()
703 req->usb_req.length - req->usb_req.actual, req); in xudc_write_fifo()
710 case -EAGAIN: in xudc_write_fifo()
711 dev_dbg(udc->dev, "Send busy\n"); in xudc_write_fifo()
713 case -EINVAL: in xudc_write_fifo()
714 case -ETIMEDOUT: in xudc_write_fifo()
716 xudc_done(ep, req, -ECONNRESET); in xudc_write_fifo()
725 * xudc_nuke - Cleans up the data transfer message list.
726 * @ep: pointer to the usb device endpoint structure.
733 while (!list_empty(&ep->queue)) { in xudc_nuke()
734 req = list_first_entry(&ep->queue, struct xusb_req, queue); in xudc_nuke()
740 * xudc_ep_set_halt - Stalls/unstalls the given endpoint.
741 * @_ep: pointer to the usb device endpoint structure.
753 if (!_ep || (!ep->desc && ep->epnumber)) { in xudc_ep_set_halt()
755 return -EINVAL; in xudc_ep_set_halt()
757 udc = ep->udc; in xudc_ep_set_halt()
759 if (ep->is_in && (!list_empty(&ep->queue)) && value) { in xudc_ep_set_halt()
760 dev_dbg(udc->dev, "requests pending can't halt\n"); in xudc_ep_set_halt()
761 return -EAGAIN; in xudc_ep_set_halt()
764 if (ep->buffer0ready || ep->buffer1ready) { in xudc_ep_set_halt()
765 dev_dbg(udc->dev, "HW buffers busy can't halt\n"); in xudc_ep_set_halt()
766 return -EAGAIN; in xudc_ep_set_halt()
769 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_set_halt()
772 /* Stall the device.*/ 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()
777 /* Unstall the device.*/ 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()
781 if (ep->epnumber) { 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()
794 * __xudc_ep_enable - Enables the given endpoint.
803 struct xusb_udc *udc = ep->udc; in __xudc_ep_enable()
809 ep->is_in = ((desc->bEndpointAddress & USB_DIR_IN) != 0); in __xudc_ep_enable()
811 ep->epnumber = (desc->bEndpointAddress & 0x0f); in __xudc_ep_enable()
812 ep->desc = desc; in __xudc_ep_enable()
813 ep->ep_usb.desc = desc; in __xudc_ep_enable()
814 tmp = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; in __xudc_ep_enable()
815 ep->ep_usb.maxpacket = maxpacket = le16_to_cpu(desc->wMaxPacketSize); in __xudc_ep_enable()
819 dev_dbg(udc->dev, "only one control endpoint\n"); in __xudc_ep_enable()
820 /* NON- ISO */ in __xudc_ep_enable()
821 ep->is_iso = 0; in __xudc_ep_enable()
822 return -EINVAL; in __xudc_ep_enable()
824 /* NON- ISO */ in __xudc_ep_enable()
825 ep->is_iso = 0; in __xudc_ep_enable()
827 dev_dbg(udc->dev, "bogus maxpacket %d\n", maxpacket); in __xudc_ep_enable()
828 return -EINVAL; in __xudc_ep_enable()
832 /* NON- ISO */ in __xudc_ep_enable()
833 ep->is_iso = 0; in __xudc_ep_enable()
836 dev_dbg(udc->dev, "bogus maxpacket %d\n", maxpacket); in __xudc_ep_enable()
837 return -EINVAL; in __xudc_ep_enable()
842 ep->is_iso = 1; in __xudc_ep_enable()
846 ep->buffer0ready = false; in __xudc_ep_enable()
847 ep->buffer1ready = false; in __xudc_ep_enable()
848 ep->curbufnum = 0; in __xudc_ep_enable()
849 ep->rambase = rambase[ep->epnumber]; in __xudc_ep_enable()
852 dev_dbg(udc->dev, "Enable Endpoint %d max pkt is %d\n", in __xudc_ep_enable()
853 ep->epnumber, maxpacket); 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()
859 if (ep->epnumber) in __xudc_ep_enable()
860 ep->rambase <<= 2; in __xudc_ep_enable()
863 ier = udc->read_fn(udc->addr + XUSB_IER_OFFSET); in __xudc_ep_enable()
864 ier |= (XUSB_STATUS_INTR_BUFF_COMP_SHIFT_MASK << ep->epnumber); in __xudc_ep_enable()
865 udc->write_fn(udc->addr, XUSB_IER_OFFSET, ier); in __xudc_ep_enable()
868 if (ep->epnumber && !ep->is_in) { in __xudc_ep_enable()
869 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in __xudc_ep_enable()
870 1 << ep->epnumber); in __xudc_ep_enable()
871 ep->buffer0ready = true; in __xudc_ep_enable()
872 udc->write_fn(udc->addr, XUSB_BUFFREADY_OFFSET, in __xudc_ep_enable()
873 (1 << (ep->epnumber + in __xudc_ep_enable()
875 ep->buffer1ready = true; in __xudc_ep_enable()
882 * xudc_ep_enable - Enables the given endpoint.
896 if (!_ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) { in xudc_ep_enable()
898 return -EINVAL; in xudc_ep_enable()
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()
906 return -ESHUTDOWN; 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()
917 * xudc_ep_disable - Disables the given endpoint.
931 return -EINVAL; in xudc_ep_disable()
935 udc = ep->udc; in xudc_ep_disable()
937 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_disable()
939 xudc_nuke(ep, -ESHUTDOWN); in xudc_ep_disable()
942 ep->desc = NULL; in xudc_ep_disable()
943 ep->ep_usb.desc = NULL; 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()
956 * xudc_ep_alloc_request - Initializes the request queue.
972 req->ep = ep; in xudc_ep_alloc_request()
973 INIT_LIST_HEAD(&req->queue); in xudc_ep_alloc_request()
974 return &req->usb_req; in xudc_ep_alloc_request()
978 * xudc_free_request - Releases the request from queue.
979 * @_ep: pointer to the usb device endpoint structure.
990 * __xudc_ep0_queue - Adds the request to endpoint 0 queue.
998 struct xusb_udc *udc = ep0->udc; in __xudc_ep0_queue()
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()
1004 return -EINVAL; in __xudc_ep0_queue()
1006 if (!list_empty(&ep0->queue)) { in __xudc_ep0_queue()
1007 dev_dbg(udc->dev, "%s:ep0 busy\n", __func__); in __xudc_ep0_queue()
1008 return -EBUSY; in __xudc_ep0_queue()
1011 req->usb_req.status = -EINPROGRESS; in __xudc_ep0_queue()
1012 req->usb_req.actual = 0; in __xudc_ep0_queue()
1014 list_add_tail(&req->queue, &ep0->queue); in __xudc_ep0_queue()
1016 if (udc->setup.bRequestType & USB_DIR_IN) { in __xudc_ep0_queue()
1017 prefetch(req->usb_req.buf); in __xudc_ep0_queue()
1018 length = req->usb_req.length; in __xudc_ep0_queue()
1019 corebuf = (void __force *) ((ep0->rambase << 2) + in __xudc_ep0_queue()
1020 udc->addr); in __xudc_ep0_queue()
1021 length = req->usb_req.actual = min_t(u32, length, in __xudc_ep0_queue()
1023 memcpy(corebuf, req->usb_req.buf, length); 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()
1040 * xudc_ep0_queue - Adds the request to endpoint 0 queue.
1052 struct xusb_udc *udc = ep0->udc; in xudc_ep0_queue()
1056 spin_lock_irqsave(&udc->lock, flags); in xudc_ep0_queue()
1058 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep0_queue()
1064 * xudc_ep_queue - Adds the request to endpoint queue.
1076 struct xusb_udc *udc = ep->udc; in xudc_ep_queue()
1080 if (!ep->desc) { in xudc_ep_queue()
1081 dev_dbg(udc->dev, "%s: queuing request to disabled %s\n", in xudc_ep_queue()
1082 __func__, ep->name); in xudc_ep_queue()
1083 return -ESHUTDOWN; 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()
1088 return -EINVAL; in xudc_ep_queue()
1091 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_queue()
1093 _req->status = -EINPROGRESS; in xudc_ep_queue()
1094 _req->actual = 0; 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()
1098 ep->is_in); in xudc_ep_queue()
1100 dev_dbg(udc->dev, "gadget_map failed ep%d\n", in xudc_ep_queue()
1101 ep->epnumber); in xudc_ep_queue()
1102 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_queue()
1103 return -EAGAIN; in xudc_ep_queue()
1107 if (list_empty(&ep->queue)) { in xudc_ep_queue()
1108 if (ep->is_in) { 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()
1120 list_add_tail(&req->queue, &ep->queue); in xudc_ep_queue()
1122 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_queue()
1127 * xudc_ep_dequeue - Removes the request from the queue.
1128 * @_ep: pointer to the usb device endpoint structure.
1137 struct xusb_udc *udc = ep->udc; in xudc_ep_dequeue()
1140 spin_lock_irqsave(&udc->lock, flags); in xudc_ep_dequeue()
1142 list_for_each_entry(req, &ep->queue, queue) { in xudc_ep_dequeue()
1143 if (&req->usb_req == _req) in xudc_ep_dequeue()
1146 if (&req->usb_req != _req) { in xudc_ep_dequeue()
1147 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_dequeue()
1148 return -EINVAL; in xudc_ep_dequeue()
1150 xudc_done(ep, req, -ECONNRESET); in xudc_ep_dequeue()
1151 spin_unlock_irqrestore(&udc->lock, flags); in xudc_ep_dequeue()
1157 * xudc_ep0_enable - Enables the given endpoint.
1168 return -EINVAL; in xudc_ep0_enable()
1172 * xudc_ep0_disable - Disables the given endpoint.
1181 return -EINVAL; in xudc_ep0_disable()
1205 * xudc_get_frame - Reads the current usb frame number.
1216 return -ENODEV; in xudc_get_frame()
1219 frame = udc->read_fn(udc->addr + XUSB_FRAMENUM_OFFSET); in xudc_get_frame()
1224 * xudc_wakeup - Send remote wakeup signal to host
1233 int status = -EINVAL; in xudc_wakeup()
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()
1261 * xudc_pullup - start/stop USB traffic
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()
1291 * xudc_eps_init - initialize endpoints.
1292 * @udc: pointer to the usb device controller structure.
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()
1304 list_add_tail(&ep->ep_usb.ep_list, in xudc_eps_init()
1305 &udc->gadget.ep_list); in xudc_eps_init()
1306 usb_ep_set_maxpacket_limit(&ep->ep_usb, in xudc_eps_init()
1308 snprintf(ep->name, EPNAME_SIZE, "ep%d", ep_number); in xudc_eps_init()
1309 ep->ep_usb.name = ep->name; in xudc_eps_init()
1310 ep->ep_usb.ops = &xusb_ep_ops; in xudc_eps_init()
1312 ep->ep_usb.caps.type_iso = true; in xudc_eps_init()
1313 ep->ep_usb.caps.type_bulk = true; in xudc_eps_init()
1314 ep->ep_usb.caps.type_int = true; in xudc_eps_init()
1316 ep->ep_usb.name = ep0name; in xudc_eps_init()
1317 usb_ep_set_maxpacket_limit(&ep->ep_usb, EP0_MAX_PACKET); in xudc_eps_init()
1318 ep->ep_usb.ops = &xusb_ep0_ops; in xudc_eps_init()
1320 ep->ep_usb.caps.type_control = true; in xudc_eps_init()
1323 ep->ep_usb.caps.dir_in = true; in xudc_eps_init()
1324 ep->ep_usb.caps.dir_out = true; in xudc_eps_init()
1326 ep->udc = udc; in xudc_eps_init()
1327 ep->epnumber = ep_number; in xudc_eps_init()
1328 ep->desc = NULL; in xudc_eps_init()
1333 ep->offset = XUSB_EP0_CONFIG_OFFSET + (ep_number * 0x10); in xudc_eps_init()
1334 ep->is_in = 0; in xudc_eps_init()
1335 ep->is_iso = 0; in xudc_eps_init()
1336 ep->maxpacket = 0; in xudc_eps_init()
1340 INIT_LIST_HEAD(&ep->queue); in xudc_eps_init()
1345 * xudc_stop_activity - Stops any further activity on the device.
1346 * @udc: pointer to the usb device controller structure.
1354 ep = &udc->ep[i]; in xudc_stop_activity()
1355 xudc_nuke(ep, -ESHUTDOWN); in xudc_stop_activity()
1360 * xudc_start - Starts the device.
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()
1380 ret = -EBUSY; in xudc_start()
1385 udc->driver = driver; in xudc_start()
1386 udc->gadget.speed = driver->max_speed; in xudc_start()
1391 /* Set device address and remote wakeup to 0 */ 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()
1400 * xudc_stop - stops the device.
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()
1415 /* Set device address and remote wakeup to 0 */ in xudc_stop()
1416 udc->write_fn(udc->addr, XUSB_ADDRESS_OFFSET, 0); in xudc_stop()
1417 udc->remote_wkp = 0; in xudc_stop()
1421 spin_unlock_irqrestore(&udc->lock, flags); in xudc_stop()
1435 * xudc_clear_stall_all_ep - clears stall of every endpoint.
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()
1449 if (ep->epnumber) { 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()
1459 * xudc_startup_handler - The usb device controller interrupt handler.
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()
1480 udc->write_fn(udc->addr, XUSB_TESTMODE_OFFSET, 0); in xudc_startup_handler()
1482 /* Set device address and remote wakeup to 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()
1551 * xudc_ep0_stall - Stall endpoint zero.
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()
1567 * xudc_setaddress - executes SET_ADDRESS command
1574 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_setaddress()
1575 struct xusb_req *req = udc->req; in xudc_setaddress()
1578 req->usb_req.length = 0; in xudc_setaddress()
1583 dev_err(udc->dev, "Can't respond to SET ADDRESS request\n"); in xudc_setaddress()
1588 * xudc_getstatus - executes GET_STATUS command
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()
1606 /* Get device status */ 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()
1619 if (!target_ep->is_in) in xudc_getstatus()
1622 if (target_ep->is_in) in xudc_getstatus()
1632 req->usb_req.length = 2; in xudc_getstatus()
1633 *(u16 *)req->usb_req.buf = cpu_to_le16(status); in xudc_getstatus()
1638 dev_err(udc->dev, "Can't respond to getstatus request\n"); in xudc_getstatus()
1643 * xudc_set_clear_feature - Executes the set feature and clear feature commands.
1644 * @udc: pointer to the usb device controller structure.
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()
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()
1687 if (outinbit != target_ep->is_in) { 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()
1696 target_ep->offset, epcfgreg); in xudc_set_clear_feature()
1700 udc->write_fn(udc->addr, in xudc_set_clear_feature()
1701 target_ep->offset, in xudc_set_clear_feature()
1707 udc->write_fn(udc->addr, in xudc_set_clear_feature()
1708 target_ep->offset, in xudc_set_clear_feature()
1719 req->usb_req.length = 0; in xudc_set_clear_feature()
1724 dev_err(udc->dev, "Can't respond to SET/CLEAR FEATURE\n"); in xudc_set_clear_feature()
1729 * xudc_handle_setup - Processes the setup packet.
1730 * @udc: pointer to the usb device controller structure.
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()
1751 xudc_nuke(ep0, -ECONNRESET); 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()
1766 if ((udc->setup.bRequestType & in xudc_handle_setup()
1774 if (udc->setup.bRequestType != (USB_DIR_OUT | in xudc_handle_setup()
1782 if ((udc->setup.bRequestType & USB_TYPE_MASK) 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()
1794 spin_lock(&udc->lock); in xudc_handle_setup()
1798 * xudc_ep0_out - Processes the endpoint 0 OUT token.
1799 * @udc: pointer to the usb device controller structure.
1803 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_ep0_out()
1809 req = list_first_entry(&ep0->queue, struct xusb_req, queue); 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()
1819 req->usb_req.actual = req->usb_req.length; 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()
1827 (ep0->rambase << 2)); in xudc_ep0_out()
1828 buffer = req->usb_req.buf + req->usb_req.actual; in xudc_ep0_out()
1829 req->usb_req.actual = req->usb_req.actual + bytes_to_rx; in xudc_ep0_out()
1832 if (req->usb_req.length == req->usb_req.actual) { 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()
1847 * xudc_ep0_in - Processes the endpoint 0 IN token.
1848 * @udc: pointer to the usb device controller structure.
1852 struct xusb_ep *ep0 = &udc->ep[0]; in xudc_ep0_in()
1860 u8 test_mode = udc->setup.wIndex >> 8; in xudc_ep0_in()
1862 req = list_first_entry(&ep0->queue, struct xusb_req, queue); in xudc_ep0_in()
1863 bytes_to_tx = req->usb_req.length - req->usb_req.actual; in xudc_ep0_in()
1865 switch (udc->setupseqtx) { in xudc_ep0_in()
1867 switch (udc->setup.bRequest) { in xudc_ep0_in()
1869 /* Set the address of the device.*/ 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()
1884 req->usb_req.actual = req->usb_req.length; 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()
1903 (ep0->rambase << 2)); in xudc_ep0_in()
1904 buffer = req->usb_req.buf + req->usb_req.actual; in xudc_ep0_in()
1905 req->usb_req.actual = req->usb_req.actual + length; 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()
1917 * xudc_ctrl_ep_handler - Endpoint 0 interrupt handler.
1937 * xudc_nonctrl_ep_handler - Non control endpoint interrupt handler.
1952 ep = &udc->ep[epnum]; in xudc_nonctrl_ep_handler()
1955 ep->buffer0ready = 0; in xudc_nonctrl_ep_handler()
1957 ep->buffer1ready = false; in xudc_nonctrl_ep_handler()
1959 if (list_empty(&ep->queue)) in xudc_nonctrl_ep_handler()
1962 req = list_first_entry(&ep->queue, struct xusb_req, queue); in xudc_nonctrl_ep_handler()
1964 if (ep->is_in) in xudc_nonctrl_ep_handler()
1971 * xudc_irq - The main interrupt handler.
1973 * @_udc: pointer to the usb device controller structure.
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()
2003 * - USB Reset received {XUSB_STATUS_RESET_MASK} in xudc_irq()
2004 * - USB Suspend received {XUSB_STATUS_SUSPEND_MASK} in xudc_irq()
2005 * - USB Resume received {XUSB_STATUS_RESUME_MASK} in xudc_irq()
2006 * - USB Disconnect received {XUSB_STATUS_DISCONNECT_MASK} 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()
2024 (index - 1))) || (intrstatus & in xudc_irq()
2026 (index - 1)))); in xudc_irq()
2034 spin_unlock_irqrestore(&udc->lock, flags); in xudc_irq()
2039 * xudc_probe - The device probe function for driver initialization.
2040 * @pdev: pointer to the platform device structure.
2046 struct device_node *np = pdev->dev.of_node; in xudc_probe()
2054 udc = devm_kzalloc(&pdev->dev, sizeof(*udc), GFP_KERNEL); in xudc_probe()
2056 return -ENOMEM; in xudc_probe()
2059 udc->req = devm_kzalloc(&pdev->dev, sizeof(struct xusb_req), in xudc_probe()
2061 if (!udc->req) in xudc_probe()
2062 return -ENOMEM; in xudc_probe()
2064 buff = devm_kzalloc(&pdev->dev, STATUSBUFF_SIZE, GFP_KERNEL); in xudc_probe()
2066 return -ENOMEM; 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()
2079 ret = devm_request_irq(&pdev->dev, irq, xudc_irq, 0, in xudc_probe()
2080 dev_name(&pdev->dev), udc); in xudc_probe()
2082 dev_dbg(&pdev->dev, "unable to request irq %d", irq); 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()
2110 /* Set device address to 0.*/ 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()
2129 dev_vdbg(&pdev->dev, "%s at 0x%08X mapped to %p %s\n", 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()
2135 dev_err(&pdev->dev, "probe failed, %d\n", ret); in xudc_probe()
2140 * xudc_remove - Releases the resources allocated during the initialization.
2141 * @pdev: pointer to the platform device structure.
2149 usb_del_gadget_udc(&udc->gadget); in xudc_remove()
2156 { .compatible = "xlnx,usb2-device-4.00.a", },