Lines Matching full:ep
23 #define UDC_EP_REG_SHIFT 0x20 /* Offset to next EP */
174 #define PCH_UDC_CSR(ep) (UDC_CSR_ADDR + ep*4) argument
181 #define UDC_EPIN_IDX(ep) (ep * 2) argument
182 #define UDC_EPOUT_IDX(ep) (ep * 2 + 1) argument
190 #define PCH_UDC_USED_EP_NUM 4 /* EP number of EP's really used */
194 /* Value of EP Buffer Size */
199 /* Value of EP maximum packet size */
270 * @ep: embedded ep request
276 * @offset_addr: offset address of ep register
284 struct usb_ep ep; member
319 * @ep: array of endpoints
342 struct pch_udc_ep ep[PCH_UDC_EP_NUM]; member
380 * @req: embedded ep request
425 static inline u32 pch_udc_ep_readl(struct pch_udc_ep *ep, unsigned long reg) in pch_udc_ep_readl() argument
427 return ioread32(ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_readl()
430 static inline void pch_udc_ep_writel(struct pch_udc_ep *ep, in pch_udc_ep_writel() argument
433 iowrite32(val, ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_writel()
436 static inline void pch_udc_ep_bit_set(struct pch_udc_ep *ep, in pch_udc_ep_bit_set() argument
440 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) | bitmask, reg); in pch_udc_ep_bit_set()
443 static inline void pch_udc_ep_bit_clr(struct pch_udc_ep *ep, in pch_udc_ep_bit_clr() argument
447 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) & ~(bitmask), reg); in pch_udc_ep_bit_clr()
470 * @ep: end-point number
473 unsigned int ep) in pch_udc_write_csr() argument
475 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_write_csr()
485 * @ep: end-point number
489 static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep) in pch_udc_read_csr() argument
491 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_read_csr()
616 * @ep: Reference to structure of type pch_udc_ep_regs
618 static void pch_udc_ep_set_stall(struct pch_udc_ep *ep) in pch_udc_ep_set_stall() argument
620 if (ep->in) { in pch_udc_ep_set_stall()
621 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_set_stall()
622 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
624 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
630 * @ep: Reference to structure of type pch_udc_ep_regs
632 static inline void pch_udc_ep_clear_stall(struct pch_udc_ep *ep) in pch_udc_ep_clear_stall() argument
635 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_clear_stall()
637 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_stall()
642 * @ep: Reference to structure of type pch_udc_ep_regs
645 static inline void pch_udc_ep_set_trfr_type(struct pch_udc_ep *ep, in pch_udc_ep_set_trfr_type() argument
648 pch_udc_ep_writel(ep, ((type << UDC_EPCTL_ET_SHIFT) & in pch_udc_ep_set_trfr_type()
654 * @ep: Reference to structure of type pch_udc_ep_regs
656 * @ep_in: EP is IN
658 static void pch_udc_ep_set_bufsz(struct pch_udc_ep *ep, in pch_udc_ep_set_bufsz() argument
663 data = pch_udc_ep_readl(ep, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
665 pch_udc_ep_writel(ep, data, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
667 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
669 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
675 * @ep: Reference to structure of type pch_udc_ep_regs
678 static void pch_udc_ep_set_maxpkt(struct pch_udc_ep *ep, u32 pkt_size) in pch_udc_ep_set_maxpkt() argument
680 u32 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
682 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
687 * @ep: Reference to structure of type pch_udc_ep_regs
690 static inline void pch_udc_ep_set_subptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_subptr() argument
692 pch_udc_ep_writel(ep, addr, UDC_SUBPTR_ADDR); in pch_udc_ep_set_subptr()
697 * @ep: Reference to structure of type pch_udc_ep_regs
700 static inline void pch_udc_ep_set_ddptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_ddptr() argument
702 pch_udc_ep_writel(ep, addr, UDC_DESPTR_ADDR); in pch_udc_ep_set_ddptr()
707 * @ep: Reference to structure of type pch_udc_ep_regs
709 static inline void pch_udc_ep_set_pd(struct pch_udc_ep *ep) in pch_udc_ep_set_pd() argument
711 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_P); in pch_udc_ep_set_pd()
716 * @ep: Reference to structure of type pch_udc_ep_regs
718 static inline void pch_udc_ep_set_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_set_rrdy() argument
720 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_set_rrdy()
725 * @ep: Reference to structure of type pch_udc_ep_regs
727 static inline void pch_udc_ep_clear_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_clear_rrdy() argument
729 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_clear_rrdy()
872 * @ep: Reference to structure of type pch_udc_ep_regs
875 static inline u32 pch_udc_read_ep_control(struct pch_udc_ep *ep) in pch_udc_read_ep_control() argument
877 return pch_udc_ep_readl(ep, UDC_EPCTL_ADDR); in pch_udc_read_ep_control()
882 * @ep: Reference to structure of type pch_udc_ep_regs
885 static inline void pch_udc_clear_ep_control(struct pch_udc_ep *ep) in pch_udc_clear_ep_control() argument
887 return pch_udc_ep_writel(ep, 0, UDC_EPCTL_ADDR); in pch_udc_clear_ep_control()
892 * @ep: Reference to structure of type pch_udc_ep_regs
895 static inline u32 pch_udc_read_ep_status(struct pch_udc_ep *ep) in pch_udc_read_ep_status() argument
897 return pch_udc_ep_readl(ep, UDC_EPSTS_ADDR); in pch_udc_read_ep_status()
902 * @ep: Reference to structure of type pch_udc_ep_regs
905 static inline void pch_udc_clear_ep_status(struct pch_udc_ep *ep, in pch_udc_clear_ep_status() argument
908 return pch_udc_ep_writel(ep, stat, UDC_EPSTS_ADDR); in pch_udc_clear_ep_status()
914 * @ep: Reference to structure of type pch_udc_ep_regs
916 static inline void pch_udc_ep_set_nak(struct pch_udc_ep *ep) in pch_udc_ep_set_nak() argument
918 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_SNAK); in pch_udc_ep_set_nak()
924 * @ep: reference to structure of type pch_udc_ep_regs
926 static void pch_udc_ep_clear_nak(struct pch_udc_ep *ep) in pch_udc_ep_clear_nak() argument
929 struct pch_udc_dev *dev = ep->dev; in pch_udc_ep_clear_nak()
931 if (!(pch_udc_ep_readl(ep, UDC_EPCTL_ADDR) & UDC_EPCTL_NAK)) in pch_udc_ep_clear_nak()
933 if (!ep->in) { in pch_udc_ep_clear_nak()
935 while (!(pch_udc_read_ep_status(ep) & UDC_EPSTS_MRXFIFO_EMP) && in pch_udc_ep_clear_nak()
943 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_NAK) && --loopcnt) { in pch_udc_ep_clear_nak()
944 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_nak()
948 dev_err(&dev->pdev->dev, "%s: Clear NAK not set for ep%d%s\n", in pch_udc_ep_clear_nak()
949 __func__, ep->num, (ep->in ? "in" : "out")); in pch_udc_ep_clear_nak()
954 * @ep: reference to structure of type pch_udc_ep_regs
959 static void pch_udc_ep_fifo_flush(struct pch_udc_ep *ep, int dir) in pch_udc_ep_fifo_flush() argument
961 if (dir) { /* IN ep */ in pch_udc_ep_fifo_flush()
962 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_fifo_flush()
969 * @ep: reference to structure of type pch_udc_ep_regs
973 static void pch_udc_ep_enable(struct pch_udc_ep *ep, in pch_udc_ep_enable() argument
980 pch_udc_ep_set_trfr_type(ep, desc->bmAttributes); in pch_udc_ep_enable()
981 if (ep->in) in pch_udc_ep_enable()
985 pch_udc_ep_set_bufsz(ep, buff_size, ep->in); in pch_udc_ep_enable()
986 pch_udc_ep_set_maxpkt(ep, usb_endpoint_maxp(desc)); in pch_udc_ep_enable()
987 pch_udc_ep_set_nak(ep); in pch_udc_ep_enable()
988 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_ep_enable()
990 val = ep->num << UDC_CSR_NE_NUM_SHIFT | ep->in << UDC_CSR_NE_DIR_SHIFT | in pch_udc_ep_enable()
998 if (ep->in) in pch_udc_ep_enable()
999 pch_udc_write_csr(ep->dev, val, UDC_EPIN_IDX(ep->num)); in pch_udc_ep_enable()
1001 pch_udc_write_csr(ep->dev, val, UDC_EPOUT_IDX(ep->num)); in pch_udc_ep_enable()
1006 * @ep: reference to structure of type pch_udc_ep_regs
1008 static void pch_udc_ep_disable(struct pch_udc_ep *ep) in pch_udc_ep_disable() argument
1010 if (ep->in) { in pch_udc_ep_disable()
1012 pch_udc_ep_writel(ep, UDC_EPCTL_F, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1014 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1015 pch_udc_ep_bit_set(ep, UDC_EPSTS_ADDR, UDC_EPSTS_IN); in pch_udc_ep_disable()
1018 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1021 pch_udc_ep_writel(ep, 0, UDC_DESPTR_ADDR); in pch_udc_ep_disable()
1025 * pch_udc_wait_ep_stall() - Wait EP stall.
1026 * @ep: reference to structure of type pch_udc_ep_regs
1028 static void pch_udc_wait_ep_stall(struct pch_udc_ep *ep) in pch_udc_wait_ep_stall() argument
1033 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_S) && --count) in pch_udc_wait_ep_stall()
1036 dev_err(&ep->dev->pdev->dev, "%s: wait error\n", __func__); in pch_udc_wait_ep_stall()
1060 /* mask and clear all ep interrupts */ in pch_udc_init()
1086 /* mask all ep interrupts */ in pch_udc_exit()
1417 * @ep: Reference to the endpoint structure
1421 static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, in complete_req() argument
1427 unsigned halted = ep->halted; in complete_req()
1437 dev = ep->dev; in complete_req()
1438 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->in); in complete_req()
1439 ep->halted = 1; in complete_req()
1441 if (!ep->in) in complete_req()
1442 pch_udc_ep_clear_rrdy(ep); in complete_req()
1443 usb_gadget_giveback_request(&ep->ep, &req->req); in complete_req()
1445 ep->halted = halted; in complete_req()
1450 * @ep: Reference to the endpoint structure
1452 static void empty_req_queue(struct pch_udc_ep *ep) in empty_req_queue() argument
1456 ep->halted = 1; in empty_req_queue()
1457 while (!list_empty(&ep->queue)) { in empty_req_queue()
1458 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in empty_req_queue()
1459 complete_req(ep, req, -ESHUTDOWN); /* Remove from list */ in empty_req_queue()
1494 * @ep: Reference to the endpoint structure
1503 static int pch_udc_create_dma_chain(struct pch_udc_ep *ep, in pch_udc_create_dma_chain() argument
1514 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1524 td = dma_pool_alloc(ep->dev->data_requests, gfp_flags, in pch_udc_create_dma_chain()
1542 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1551 * @ep: Reference to the endpoint structure
1559 static int prepare_dma(struct pch_udc_ep *ep, struct pch_udc_request *req, in prepare_dma() argument
1565 retval = pch_udc_create_dma_chain(ep, req, ep->ep.maxpacket, gfp); in prepare_dma()
1570 if (ep->in) in prepare_dma()
1579 * @ep: Reference to the endpoint structure
1582 static void process_zlp(struct pch_udc_ep *ep, struct pch_udc_request *req) in process_zlp() argument
1584 struct pch_udc_dev *dev = ep->dev; in process_zlp()
1587 complete_req(ep, req, 0); in process_zlp()
1598 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in process_zlp()
1605 * @ep: Reference to the endpoint structure
1608 static void pch_udc_start_rxrequest(struct pch_udc_ep *ep, in pch_udc_start_rxrequest() argument
1613 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1624 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_rxrequest()
1626 pch_udc_enable_ep_interrupts(ep->dev, UDC_EPINT_OUT_EP0 << ep->num); in pch_udc_start_rxrequest()
1627 pch_udc_set_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1628 pch_udc_ep_clear_nak(ep); in pch_udc_start_rxrequest()
1629 pch_udc_ep_set_rrdy(ep); in pch_udc_start_rxrequest()
1646 struct pch_udc_ep *ep; in pch_udc_pcd_ep_enable() local
1654 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_enable()
1655 dev = ep->dev; in pch_udc_pcd_ep_enable()
1659 ep->ep.desc = desc; in pch_udc_pcd_ep_enable()
1660 ep->halted = 0; in pch_udc_pcd_ep_enable()
1661 pch_udc_ep_enable(ep, &ep->dev->cfg_data, desc); in pch_udc_pcd_ep_enable()
1662 ep->ep.maxpacket = usb_endpoint_maxp(desc); in pch_udc_pcd_ep_enable()
1663 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_enable()
1679 struct pch_udc_ep *ep; in pch_udc_pcd_ep_disable() local
1685 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_disable()
1686 if ((usbep->name == ep0_string) || !ep->ep.desc) in pch_udc_pcd_ep_disable()
1689 spin_lock_irqsave(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1690 empty_req_queue(ep); in pch_udc_pcd_ep_disable()
1691 ep->halted = 1; in pch_udc_pcd_ep_disable()
1692 pch_udc_ep_disable(ep); in pch_udc_pcd_ep_disable()
1693 pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_disable()
1694 ep->ep.desc = NULL; in pch_udc_pcd_ep_disable()
1695 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_ep_disable()
1696 spin_unlock_irqrestore(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1714 struct pch_udc_ep *ep; in pch_udc_alloc_request() local
1719 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_alloc_request()
1725 if (!ep->dev->dma_addr) in pch_udc_alloc_request()
1728 dma_desc = dma_pool_alloc(ep->dev->data_requests, gfp, in pch_udc_alloc_request()
1752 struct pch_udc_ep *ep; in pch_udc_free_request() local
1758 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_free_request()
1760 dev = ep->dev; in pch_udc_free_request()
1766 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_free_request()
1767 dma_pool_free(ep->dev->data_requests, req->td_data, in pch_udc_free_request()
1788 struct pch_udc_ep *ep; in pch_udc_pcd_queue() local
1795 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_queue()
1796 dev = ep->dev; in pch_udc_pcd_queue()
1797 if (!ep->ep.desc && ep->num) in pch_udc_pcd_queue()
1806 retval = usb_gadget_map_request(&dev->gadget, usbreq, ep->in); in pch_udc_pcd_queue()
1810 retval = prepare_dma(ep, req, GFP_ATOMIC); in pch_udc_pcd_queue()
1817 if (list_empty(&ep->queue) && !ep->halted) { in pch_udc_pcd_queue()
1820 process_zlp(ep, req); in pch_udc_pcd_queue()
1824 if (!ep->in) { in pch_udc_pcd_queue()
1825 pch_udc_start_rxrequest(ep, req); in pch_udc_pcd_queue()
1832 pch_udc_wait_ep_stall(ep); in pch_udc_pcd_queue()
1833 pch_udc_ep_clear_nak(ep); in pch_udc_pcd_queue()
1834 pch_udc_enable_ep_interrupts(ep->dev, (1 << ep->num)); in pch_udc_pcd_queue()
1837 /* Now add this request to the ep's pending requests */ in pch_udc_pcd_queue()
1839 list_add_tail(&req->queue, &ep->queue); in pch_udc_pcd_queue()
1859 struct pch_udc_ep *ep; in pch_udc_pcd_dequeue() local
1864 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_dequeue()
1865 if (!usbep || !usbreq || (!ep->ep.desc && ep->num)) in pch_udc_pcd_dequeue()
1868 spin_lock_irqsave(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1870 list_for_each_entry(req, &ep->queue, queue) { in pch_udc_pcd_dequeue()
1872 pch_udc_ep_set_nak(ep); in pch_udc_pcd_dequeue()
1874 complete_req(ep, req, -ECONNRESET); in pch_udc_pcd_dequeue()
1879 spin_unlock_irqrestore(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1895 struct pch_udc_ep *ep; in pch_udc_pcd_set_halt() local
1901 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_halt()
1902 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_halt()
1904 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_halt()
1907 if (list_empty(&ep->queue)) { in pch_udc_pcd_set_halt()
1909 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_halt()
1910 ep->dev->stall = 1; in pch_udc_pcd_set_halt()
1911 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_halt()
1913 ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_set_halt()
1915 pch_udc_ep_clear_stall(ep); in pch_udc_pcd_set_halt()
1936 struct pch_udc_ep *ep; in pch_udc_pcd_set_wedge() local
1942 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_wedge()
1943 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_wedge()
1945 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_wedge()
1948 if (!list_empty(&ep->queue)) { in pch_udc_pcd_set_wedge()
1951 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_wedge()
1952 ep->dev->stall = 1; in pch_udc_pcd_set_wedge()
1953 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_wedge()
1954 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_pcd_set_wedge()
1955 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_set_wedge()
1956 ep->dev->prot_stall = 1; in pch_udc_pcd_set_wedge()
1969 struct pch_udc_ep *ep; in pch_udc_pcd_fifo_flush() local
1974 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_fifo_flush()
1975 if (ep->ep.desc || !ep->num) in pch_udc_pcd_fifo_flush()
1976 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_pcd_fifo_flush()
2010 * @ep: Reference to the endpoint structure
2012 static void pch_udc_start_next_txrequest(struct pch_udc_ep *ep) in pch_udc_start_next_txrequest() argument
2017 if (pch_udc_read_ep_control(ep) & UDC_EPCTL_P) in pch_udc_start_next_txrequest()
2020 if (list_empty(&ep->queue)) in pch_udc_start_next_txrequest()
2024 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_start_next_txrequest()
2029 pch_udc_wait_ep_stall(ep); in pch_udc_start_next_txrequest()
2031 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_start_next_txrequest()
2040 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_next_txrequest()
2041 pch_udc_set_dma(ep->dev, DMA_DIR_TX); in pch_udc_start_next_txrequest()
2042 pch_udc_ep_set_pd(ep); in pch_udc_start_next_txrequest()
2043 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_start_next_txrequest()
2044 pch_udc_ep_clear_nak(ep); in pch_udc_start_next_txrequest()
2049 * @ep: Reference to the endpoint structure
2051 static void pch_udc_complete_transfer(struct pch_udc_ep *ep) in pch_udc_complete_transfer() argument
2054 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_transfer()
2056 if (list_empty(&ep->queue)) in pch_udc_complete_transfer()
2058 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_transfer()
2067 (int)(ep->epsts)); in pch_udc_complete_transfer()
2074 complete_req(ep, req, 0); in pch_udc_complete_transfer()
2076 if (!list_empty(&ep->queue)) { in pch_udc_complete_transfer()
2077 pch_udc_wait_ep_stall(ep); in pch_udc_complete_transfer()
2078 pch_udc_ep_clear_nak(ep); in pch_udc_complete_transfer()
2079 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2080 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2082 pch_udc_disable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2083 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2089 * @ep: Reference to the endpoint structure
2091 static void pch_udc_complete_receiver(struct pch_udc_ep *ep) in pch_udc_complete_receiver() argument
2094 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_receiver()
2099 if (list_empty(&ep->queue)) in pch_udc_complete_receiver()
2102 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2103 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_complete_receiver()
2104 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_complete_receiver()
2116 (int)(ep->epsts)); in pch_udc_complete_receiver()
2139 complete_req(ep, req, 0); in pch_udc_complete_receiver()
2141 if (!list_empty(&ep->queue)) { in pch_udc_complete_receiver()
2142 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2143 pch_udc_start_rxrequest(ep, req); in pch_udc_complete_receiver()
2156 struct pch_udc_ep *ep; in pch_udc_svc_data_in() local
2158 ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_svc_data_in()
2159 epsts = ep->epsts; in pch_udc_svc_data_in()
2160 ep->epsts = 0; in pch_udc_svc_data_in()
2171 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2172 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2173 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2177 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_in()
2179 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2180 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2181 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2185 pch_udc_complete_transfer(ep); in pch_udc_svc_data_in()
2189 pch_udc_start_next_txrequest(ep); in pch_udc_svc_data_in()
2200 struct pch_udc_ep *ep; in pch_udc_svc_data_out() local
2203 ep = &dev->ep[UDC_EPOUT_IDX(ep_num)]; in pch_udc_svc_data_out()
2204 epsts = ep->epsts; in pch_udc_svc_data_out()
2205 ep->epsts = 0; in pch_udc_svc_data_out()
2207 if ((epsts & UDC_EPSTS_BNA) && (!list_empty(&ep->queue))) { in pch_udc_svc_data_out()
2209 req = list_entry(ep->queue.next, struct pch_udc_request, in pch_udc_svc_data_out()
2214 pch_udc_start_rxrequest(ep, req); in pch_udc_svc_data_out()
2221 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2222 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2223 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2227 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_out()
2229 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2230 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2231 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2236 if (ep->dev->prot_stall == 1) { in pch_udc_svc_data_out()
2237 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2238 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2239 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2241 pch_udc_complete_receiver(ep); in pch_udc_svc_data_out()
2244 if (list_empty(&ep->queue)) in pch_udc_svc_data_out()
2270 struct pch_udc_ep *ep; in pch_udc_svc_control_in() local
2273 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_svc_control_in()
2274 ep_out = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_in()
2275 epsts = ep->epsts; in pch_udc_svc_control_in()
2276 ep->epsts = 0; in pch_udc_svc_control_in()
2287 pch_udc_complete_transfer(ep); in pch_udc_svc_control_in()
2299 pch_udc_start_next_txrequest(ep); in pch_udc_svc_control_in()
2313 struct pch_udc_ep *ep; in pch_udc_svc_control_out() local
2315 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_out()
2316 stat = ep->epsts; in pch_udc_svc_control_out()
2317 ep->epsts = 0; in pch_udc_svc_control_out()
2323 dev->ep[UDC_EP0IN_IDX].halted = 0; in pch_udc_svc_control_out()
2324 dev->ep[UDC_EP0OUT_IDX].halted = 0; in pch_udc_svc_control_out()
2325 dev->setup_data = ep->td_stp->request; in pch_udc_svc_control_out()
2326 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_svc_control_out()
2328 pch_udc_ep_fifo_flush(&(dev->ep[UDC_EP0IN_IDX]), in pch_udc_svc_control_out()
2329 dev->ep[UDC_EP0IN_IDX].in); in pch_udc_svc_control_out()
2331 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_svc_control_out()
2333 dev->gadget.ep0 = &ep->ep; in pch_udc_svc_control_out()
2342 ep->td_data->status = (ep->td_data->status & in pch_udc_svc_control_out()
2345 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_svc_control_out()
2350 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2355 pch_udc_ep_clear_nak(ep); in pch_udc_svc_control_out()
2359 pch_udc_ep_set_stall(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2360 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_control_out()
2361 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_control_out()
2370 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_control_out()
2371 if (!list_empty(&ep->queue)) { in pch_udc_svc_control_out()
2372 ep->epsts = stat; in pch_udc_svc_control_out()
2377 pch_udc_ep_set_rrdy(ep); in pch_udc_svc_control_out()
2389 struct pch_udc_ep *ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_postsvc_epinters() local
2390 if (list_empty(&ep->queue)) in pch_udc_postsvc_epinters()
2392 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_postsvc_epinters()
2393 pch_udc_ep_clear_nak(ep); in pch_udc_postsvc_epinters()
2404 struct pch_udc_ep *ep; in pch_udc_read_all_epstatus() local
2409 ep = &dev->ep[UDC_EPIN_IDX(i)]; in pch_udc_read_all_epstatus()
2410 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2411 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2415 ep = &dev->ep[UDC_EPOUT_IDX(i)]; in pch_udc_read_all_epstatus()
2416 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2417 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2429 struct pch_udc_ep *ep; in pch_udc_activate_control_ep() local
2433 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_activate_control_ep()
2434 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2435 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2436 pch_udc_ep_set_bufsz(ep, UDC_EP0IN_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2437 pch_udc_ep_set_maxpkt(ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2438 /* Initialize the IN EP Descriptor */ in pch_udc_activate_control_ep()
2439 ep->td_data = NULL; in pch_udc_activate_control_ep()
2440 ep->td_stp = NULL; in pch_udc_activate_control_ep()
2441 ep->td_data_phys = 0; in pch_udc_activate_control_ep()
2442 ep->td_stp_phys = 0; in pch_udc_activate_control_ep()
2445 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_activate_control_ep()
2446 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2447 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2448 pch_udc_ep_set_bufsz(ep, UDC_EP0OUT_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2449 pch_udc_ep_set_maxpkt(ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2451 pch_udc_write_csr(ep->dev, val, UDC_EP0OUT_IDX); in pch_udc_activate_control_ep()
2454 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_activate_control_ep()
2456 pch_udc_ep_set_subptr(ep, ep->td_stp_phys); in pch_udc_activate_control_ep()
2458 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_activate_control_ep()
2461 ep->td_data->status = PCH_UDC_DMA_LAST; in pch_udc_activate_control_ep()
2462 ep->td_data->dataptr = dev->dma_addr; in pch_udc_activate_control_ep()
2463 ep->td_data->next = ep->td_data_phys; in pch_udc_activate_control_ep()
2465 pch_udc_ep_clear_nak(ep); in pch_udc_activate_control_ep()
2475 struct pch_udc_ep *ep; in pch_udc_svc_ur_interrupt() local
2486 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2487 pch_udc_clear_ep_status(ep, UDC_EPSTS_ALL_CLR_MASK); in pch_udc_svc_ur_interrupt()
2488 pch_udc_clear_ep_control(ep); in pch_udc_svc_ur_interrupt()
2489 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_ur_interrupt()
2490 pch_udc_write_csr(ep->dev, 0x00, i); in pch_udc_svc_ur_interrupt()
2497 /* disable ep to empty req queue. Skip the control EP's */ in pch_udc_svc_ur_interrupt()
2499 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2500 pch_udc_ep_set_nak(ep); in pch_udc_svc_ur_interrupt()
2501 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_svc_ur_interrupt()
2503 empty_req_queue(ep); in pch_udc_svc_ur_interrupt()
2543 pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); in pch_udc_svc_enum_interrupt()
2583 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_intf_interrupt()
2584 dev->ep[i].halted = 0; in pch_udc_svc_intf_interrupt()
2616 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_cfg_interrupt()
2617 dev->ep[i].halted = 0; in pch_udc_svc_cfg_interrupt()
2713 /* Clear ep interrupts */ in pch_udc_isr()
2783 memset(dev->ep, 0, sizeof dev->ep); in pch_udc_pcd_reinit()
2785 struct pch_udc_ep *ep = &dev->ep[i]; in pch_udc_pcd_reinit() local
2786 ep->dev = dev; in pch_udc_pcd_reinit()
2787 ep->halted = 1; in pch_udc_pcd_reinit()
2788 ep->num = i / 2; in pch_udc_pcd_reinit()
2789 ep->in = ~i & 1; in pch_udc_pcd_reinit()
2790 ep->ep.name = ep_string[i]; in pch_udc_pcd_reinit()
2791 ep->ep.ops = &pch_udc_ep_ops; in pch_udc_pcd_reinit()
2792 if (ep->in) { in pch_udc_pcd_reinit()
2793 ep->offset_addr = ep->num * UDC_EP_REG_SHIFT; in pch_udc_pcd_reinit()
2794 ep->ep.caps.dir_in = true; in pch_udc_pcd_reinit()
2796 ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) * in pch_udc_pcd_reinit()
2798 ep->ep.caps.dir_out = true; in pch_udc_pcd_reinit()
2801 ep->ep.caps.type_control = true; in pch_udc_pcd_reinit()
2803 ep->ep.caps.type_iso = true; in pch_udc_pcd_reinit()
2804 ep->ep.caps.type_bulk = true; in pch_udc_pcd_reinit()
2805 ep->ep.caps.type_int = true; in pch_udc_pcd_reinit()
2807 /* need to set ep->ep.maxpacket and set Default Configuration?*/ in pch_udc_pcd_reinit()
2808 usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2809 list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); in pch_udc_pcd_reinit()
2810 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_reinit()
2812 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IDX].ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2813 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IDX].ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2816 list_del_init(&dev->ep[UDC_EP0IN_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2817 list_del_init(&dev->ep[UDC_EP0OUT_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2819 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_pcd_reinit()
2873 &dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in init_dma_pools()
2879 dev->ep[UDC_EP0OUT_IDX].td_stp = td_stp; in init_dma_pools()
2883 &dev->ep[UDC_EP0OUT_IDX].td_data_phys); in init_dma_pools()
2889 dev->ep[UDC_EP0OUT_IDX].td_data = td_data; in init_dma_pools()
2890 dev->ep[UDC_EP0IN_IDX].td_stp = NULL; in init_dma_pools()
2891 dev->ep[UDC_EP0IN_IDX].td_stp_phys = 0; in init_dma_pools()
2892 dev->ep[UDC_EP0IN_IDX].td_data = NULL; in init_dma_pools()
2893 dev->ep[UDC_EP0IN_IDX].td_data_phys = 0; in init_dma_pools()
2997 if (dev->ep[UDC_EP0OUT_IDX].td_stp) { in pch_udc_remove()
2999 dev->ep[UDC_EP0OUT_IDX].td_stp, in pch_udc_remove()
3000 dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in pch_udc_remove()
3002 if (dev->ep[UDC_EP0OUT_IDX].td_data) { in pch_udc_remove()
3004 dev->ep[UDC_EP0OUT_IDX].td_data, in pch_udc_remove()
3005 dev->ep[UDC_EP0OUT_IDX].td_data_phys); in pch_udc_remove()