Lines Matching refs:ep
179 #define PCH_UDC_CSR(ep) (UDC_CSR_ADDR + ep*4) argument
186 #define UDC_EPIN_IDX(ep) (ep * 2) argument
187 #define UDC_EPOUT_IDX(ep) (ep * 2 + 1) argument
291 struct usb_ep ep; member
355 struct pch_udc_ep ep[PCH_UDC_EP_NUM]; member
448 static inline u32 pch_udc_ep_readl(struct pch_udc_ep *ep, unsigned long reg) in pch_udc_ep_readl() argument
450 return ioread32(ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_readl()
453 static inline void pch_udc_ep_writel(struct pch_udc_ep *ep, in pch_udc_ep_writel() argument
456 iowrite32(val, ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_writel()
459 static inline void pch_udc_ep_bit_set(struct pch_udc_ep *ep, in pch_udc_ep_bit_set() argument
463 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) | bitmask, reg); in pch_udc_ep_bit_set()
466 static inline void pch_udc_ep_bit_clr(struct pch_udc_ep *ep, in pch_udc_ep_bit_clr() argument
470 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) & ~(bitmask), reg); in pch_udc_ep_bit_clr()
496 unsigned int ep) in pch_udc_write_csr() argument
498 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_write_csr()
512 static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep) in pch_udc_read_csr() argument
514 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_read_csr()
636 static void pch_udc_ep_set_stall(struct pch_udc_ep *ep) in pch_udc_ep_set_stall() argument
638 if (ep->in) { in pch_udc_ep_set_stall()
639 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_set_stall()
640 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
642 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
650 static inline void pch_udc_ep_clear_stall(struct pch_udc_ep *ep) in pch_udc_ep_clear_stall() argument
653 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_clear_stall()
655 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_stall()
663 static inline void pch_udc_ep_set_trfr_type(struct pch_udc_ep *ep, in pch_udc_ep_set_trfr_type() argument
666 pch_udc_ep_writel(ep, ((type << UDC_EPCTL_ET_SHIFT) & in pch_udc_ep_set_trfr_type()
675 static void pch_udc_ep_set_bufsz(struct pch_udc_ep *ep, in pch_udc_ep_set_bufsz() argument
680 data = pch_udc_ep_readl(ep, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
682 pch_udc_ep_writel(ep, data, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
684 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
686 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
695 static void pch_udc_ep_set_maxpkt(struct pch_udc_ep *ep, u32 pkt_size) in pch_udc_ep_set_maxpkt() argument
697 u32 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
699 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
707 static inline void pch_udc_ep_set_subptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_subptr() argument
709 pch_udc_ep_writel(ep, addr, UDC_SUBPTR_ADDR); in pch_udc_ep_set_subptr()
717 static inline void pch_udc_ep_set_ddptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_ddptr() argument
719 pch_udc_ep_writel(ep, addr, UDC_DESPTR_ADDR); in pch_udc_ep_set_ddptr()
726 static inline void pch_udc_ep_set_pd(struct pch_udc_ep *ep) in pch_udc_ep_set_pd() argument
728 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_P); in pch_udc_ep_set_pd()
735 static inline void pch_udc_ep_set_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_set_rrdy() argument
737 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_set_rrdy()
744 static inline void pch_udc_ep_clear_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_clear_rrdy() argument
746 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_clear_rrdy()
892 static inline u32 pch_udc_read_ep_control(struct pch_udc_ep *ep) in pch_udc_read_ep_control() argument
894 return pch_udc_ep_readl(ep, UDC_EPCTL_ADDR); in pch_udc_read_ep_control()
902 static inline void pch_udc_clear_ep_control(struct pch_udc_ep *ep) in pch_udc_clear_ep_control() argument
904 return pch_udc_ep_writel(ep, 0, UDC_EPCTL_ADDR); in pch_udc_clear_ep_control()
912 static inline u32 pch_udc_read_ep_status(struct pch_udc_ep *ep) in pch_udc_read_ep_status() argument
914 return pch_udc_ep_readl(ep, UDC_EPSTS_ADDR); in pch_udc_read_ep_status()
922 static inline void pch_udc_clear_ep_status(struct pch_udc_ep *ep, in pch_udc_clear_ep_status() argument
925 return pch_udc_ep_writel(ep, stat, UDC_EPSTS_ADDR); in pch_udc_clear_ep_status()
933 static inline void pch_udc_ep_set_nak(struct pch_udc_ep *ep) in pch_udc_ep_set_nak() argument
935 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_SNAK); in pch_udc_ep_set_nak()
943 static void pch_udc_ep_clear_nak(struct pch_udc_ep *ep) in pch_udc_ep_clear_nak() argument
946 struct pch_udc_dev *dev = ep->dev; in pch_udc_ep_clear_nak()
948 if (!(pch_udc_ep_readl(ep, UDC_EPCTL_ADDR) & UDC_EPCTL_NAK)) in pch_udc_ep_clear_nak()
950 if (!ep->in) { in pch_udc_ep_clear_nak()
952 while (!(pch_udc_read_ep_status(ep) & UDC_EPSTS_MRXFIFO_EMP) && in pch_udc_ep_clear_nak()
960 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_NAK) && --loopcnt) { in pch_udc_ep_clear_nak()
961 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_nak()
966 __func__, ep->num, (ep->in ? "in" : "out")); in pch_udc_ep_clear_nak()
976 static void pch_udc_ep_fifo_flush(struct pch_udc_ep *ep, int dir) in pch_udc_ep_fifo_flush() argument
979 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_fifo_flush()
989 static void pch_udc_ep_enable(struct pch_udc_ep *ep, in pch_udc_ep_enable() argument
996 pch_udc_ep_set_trfr_type(ep, desc->bmAttributes); in pch_udc_ep_enable()
997 if (ep->in) in pch_udc_ep_enable()
1001 pch_udc_ep_set_bufsz(ep, buff_size, ep->in); in pch_udc_ep_enable()
1002 pch_udc_ep_set_maxpkt(ep, usb_endpoint_maxp(desc)); in pch_udc_ep_enable()
1003 pch_udc_ep_set_nak(ep); in pch_udc_ep_enable()
1004 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_ep_enable()
1006 val = ep->num << UDC_CSR_NE_NUM_SHIFT | ep->in << UDC_CSR_NE_DIR_SHIFT | in pch_udc_ep_enable()
1014 if (ep->in) in pch_udc_ep_enable()
1015 pch_udc_write_csr(ep->dev, val, UDC_EPIN_IDX(ep->num)); in pch_udc_ep_enable()
1017 pch_udc_write_csr(ep->dev, val, UDC_EPOUT_IDX(ep->num)); in pch_udc_ep_enable()
1024 static void pch_udc_ep_disable(struct pch_udc_ep *ep) in pch_udc_ep_disable() argument
1026 if (ep->in) { in pch_udc_ep_disable()
1028 pch_udc_ep_writel(ep, UDC_EPCTL_F, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1030 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1031 pch_udc_ep_bit_set(ep, UDC_EPSTS_ADDR, UDC_EPSTS_IN); in pch_udc_ep_disable()
1034 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1037 pch_udc_ep_writel(ep, 0, UDC_DESPTR_ADDR); in pch_udc_ep_disable()
1044 static void pch_udc_wait_ep_stall(struct pch_udc_ep *ep) in pch_udc_wait_ep_stall() argument
1049 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_S) && --count) in pch_udc_wait_ep_stall()
1052 dev_err(&ep->dev->pdev->dev, "%s: wait error\n", __func__); in pch_udc_wait_ep_stall()
1446 static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, in complete_req() argument
1452 unsigned halted = ep->halted; in complete_req()
1462 dev = ep->dev; in complete_req()
1465 if (ep->in) in complete_req()
1475 if (ep->in) in complete_req()
1490 ep->halted = 1; in complete_req()
1492 if (!ep->in) in complete_req()
1493 pch_udc_ep_clear_rrdy(ep); in complete_req()
1494 usb_gadget_giveback_request(&ep->ep, &req->req); in complete_req()
1496 ep->halted = halted; in complete_req()
1503 static void empty_req_queue(struct pch_udc_ep *ep) in empty_req_queue() argument
1507 ep->halted = 1; in empty_req_queue()
1508 while (!list_empty(&ep->queue)) { in empty_req_queue()
1509 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in empty_req_queue()
1510 complete_req(ep, req, -ESHUTDOWN); /* Remove from list */ in empty_req_queue()
1555 static int pch_udc_create_dma_chain(struct pch_udc_ep *ep, in pch_udc_create_dma_chain() argument
1566 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1579 td = pci_pool_alloc(ep->dev->data_requests, gfp_flags, in pch_udc_create_dma_chain()
1597 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1614 static int prepare_dma(struct pch_udc_ep *ep, struct pch_udc_request *req, in prepare_dma() argument
1620 retval = pch_udc_create_dma_chain(ep, req, ep->ep.maxpacket, gfp); in prepare_dma()
1625 if (ep->in) in prepare_dma()
1637 static void process_zlp(struct pch_udc_ep *ep, struct pch_udc_request *req) in process_zlp() argument
1639 struct pch_udc_dev *dev = ep->dev; in process_zlp()
1642 complete_req(ep, req, 0); in process_zlp()
1653 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in process_zlp()
1663 static void pch_udc_start_rxrequest(struct pch_udc_ep *ep, in pch_udc_start_rxrequest() argument
1668 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1679 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_rxrequest()
1681 pch_udc_enable_ep_interrupts(ep->dev, UDC_EPINT_OUT_EP0 << ep->num); in pch_udc_start_rxrequest()
1682 pch_udc_set_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1683 pch_udc_ep_clear_nak(ep); in pch_udc_start_rxrequest()
1684 pch_udc_ep_set_rrdy(ep); in pch_udc_start_rxrequest()
1701 struct pch_udc_ep *ep; in pch_udc_pcd_ep_enable() local
1709 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_enable()
1710 dev = ep->dev; in pch_udc_pcd_ep_enable()
1714 ep->ep.desc = desc; in pch_udc_pcd_ep_enable()
1715 ep->halted = 0; in pch_udc_pcd_ep_enable()
1716 pch_udc_ep_enable(ep, &ep->dev->cfg_data, desc); in pch_udc_pcd_ep_enable()
1717 ep->ep.maxpacket = usb_endpoint_maxp(desc); in pch_udc_pcd_ep_enable()
1718 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_enable()
1734 struct pch_udc_ep *ep; in pch_udc_pcd_ep_disable() local
1741 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_disable()
1742 dev = ep->dev; in pch_udc_pcd_ep_disable()
1743 if ((usbep->name == ep0_string) || !ep->ep.desc) in pch_udc_pcd_ep_disable()
1746 spin_lock_irqsave(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1747 empty_req_queue(ep); in pch_udc_pcd_ep_disable()
1748 ep->halted = 1; in pch_udc_pcd_ep_disable()
1749 pch_udc_ep_disable(ep); in pch_udc_pcd_ep_disable()
1750 pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_disable()
1751 ep->ep.desc = NULL; in pch_udc_pcd_ep_disable()
1752 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_ep_disable()
1753 spin_unlock_irqrestore(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1771 struct pch_udc_ep *ep; in pch_udc_alloc_request() local
1777 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_alloc_request()
1778 dev = ep->dev; in pch_udc_alloc_request()
1785 if (!ep->dev->dma_addr) in pch_udc_alloc_request()
1788 dma_desc = pci_pool_alloc(ep->dev->data_requests, gfp, in pch_udc_alloc_request()
1812 struct pch_udc_ep *ep; in pch_udc_free_request() local
1818 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_free_request()
1820 dev = ep->dev; in pch_udc_free_request()
1826 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_free_request()
1827 pci_pool_free(ep->dev->data_requests, req->td_data, in pch_udc_free_request()
1848 struct pch_udc_ep *ep; in pch_udc_pcd_queue() local
1855 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_queue()
1856 dev = ep->dev; in pch_udc_pcd_queue()
1857 if (!ep->ep.desc && ep->num) in pch_udc_pcd_queue()
1869 if (ep->in) in pch_udc_pcd_queue()
1885 if (ep->in) { in pch_udc_pcd_queue()
1900 retval = prepare_dma(ep, req, GFP_ATOMIC); in pch_udc_pcd_queue()
1907 if (list_empty(&ep->queue) && !ep->halted) { in pch_udc_pcd_queue()
1910 process_zlp(ep, req); in pch_udc_pcd_queue()
1914 if (!ep->in) { in pch_udc_pcd_queue()
1915 pch_udc_start_rxrequest(ep, req); in pch_udc_pcd_queue()
1922 pch_udc_wait_ep_stall(ep); in pch_udc_pcd_queue()
1923 pch_udc_ep_clear_nak(ep); in pch_udc_pcd_queue()
1924 pch_udc_enable_ep_interrupts(ep->dev, (1 << ep->num)); in pch_udc_pcd_queue()
1929 list_add_tail(&req->queue, &ep->queue); in pch_udc_pcd_queue()
1949 struct pch_udc_ep *ep; in pch_udc_pcd_dequeue() local
1955 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_dequeue()
1956 dev = ep->dev; in pch_udc_pcd_dequeue()
1957 if (!usbep || !usbreq || (!ep->ep.desc && ep->num)) in pch_udc_pcd_dequeue()
1960 spin_lock_irqsave(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1962 list_for_each_entry(req, &ep->queue, queue) { in pch_udc_pcd_dequeue()
1964 pch_udc_ep_set_nak(ep); in pch_udc_pcd_dequeue()
1966 complete_req(ep, req, -ECONNRESET); in pch_udc_pcd_dequeue()
1971 spin_unlock_irqrestore(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1987 struct pch_udc_ep *ep; in pch_udc_pcd_set_halt() local
1994 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_halt()
1995 dev = ep->dev; in pch_udc_pcd_set_halt()
1996 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_halt()
1998 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_halt()
2001 if (list_empty(&ep->queue)) { in pch_udc_pcd_set_halt()
2003 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_halt()
2004 ep->dev->stall = 1; in pch_udc_pcd_set_halt()
2005 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_halt()
2006 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_pcd_set_halt()
2007 PCH_UDC_EPINT(ep->in, in pch_udc_pcd_set_halt()
2008 ep->num)); in pch_udc_pcd_set_halt()
2010 pch_udc_ep_clear_stall(ep); in pch_udc_pcd_set_halt()
2032 struct pch_udc_ep *ep; in pch_udc_pcd_set_wedge() local
2039 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_wedge()
2040 dev = ep->dev; in pch_udc_pcd_set_wedge()
2041 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_wedge()
2043 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_wedge()
2046 if (!list_empty(&ep->queue)) { in pch_udc_pcd_set_wedge()
2049 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_wedge()
2050 ep->dev->stall = 1; in pch_udc_pcd_set_wedge()
2051 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_wedge()
2052 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_pcd_set_wedge()
2053 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_set_wedge()
2054 ep->dev->prot_stall = 1; in pch_udc_pcd_set_wedge()
2067 struct pch_udc_ep *ep; in pch_udc_pcd_fifo_flush() local
2072 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_fifo_flush()
2073 if (ep->ep.desc || !ep->num) in pch_udc_pcd_fifo_flush()
2074 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_pcd_fifo_flush()
2110 static void pch_udc_start_next_txrequest(struct pch_udc_ep *ep) in pch_udc_start_next_txrequest() argument
2115 if (pch_udc_read_ep_control(ep) & UDC_EPCTL_P) in pch_udc_start_next_txrequest()
2118 if (list_empty(&ep->queue)) in pch_udc_start_next_txrequest()
2122 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_start_next_txrequest()
2127 pch_udc_wait_ep_stall(ep); in pch_udc_start_next_txrequest()
2129 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_start_next_txrequest()
2138 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_next_txrequest()
2139 pch_udc_set_dma(ep->dev, DMA_DIR_TX); in pch_udc_start_next_txrequest()
2140 pch_udc_ep_set_pd(ep); in pch_udc_start_next_txrequest()
2141 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_start_next_txrequest()
2142 pch_udc_ep_clear_nak(ep); in pch_udc_start_next_txrequest()
2149 static void pch_udc_complete_transfer(struct pch_udc_ep *ep) in pch_udc_complete_transfer() argument
2152 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_transfer()
2154 if (list_empty(&ep->queue)) in pch_udc_complete_transfer()
2156 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_transfer()
2165 (int)(ep->epsts)); in pch_udc_complete_transfer()
2172 complete_req(ep, req, 0); in pch_udc_complete_transfer()
2174 if (!list_empty(&ep->queue)) { in pch_udc_complete_transfer()
2175 pch_udc_wait_ep_stall(ep); in pch_udc_complete_transfer()
2176 pch_udc_ep_clear_nak(ep); in pch_udc_complete_transfer()
2177 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2178 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2180 pch_udc_disable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2181 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2189 static void pch_udc_complete_receiver(struct pch_udc_ep *ep) in pch_udc_complete_receiver() argument
2192 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_receiver()
2197 if (list_empty(&ep->queue)) in pch_udc_complete_receiver()
2200 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2201 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_complete_receiver()
2202 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_complete_receiver()
2214 (int)(ep->epsts)); in pch_udc_complete_receiver()
2237 complete_req(ep, req, 0); in pch_udc_complete_receiver()
2239 if (!list_empty(&ep->queue)) { in pch_udc_complete_receiver()
2240 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2241 pch_udc_start_rxrequest(ep, req); in pch_udc_complete_receiver()
2254 struct pch_udc_ep *ep; in pch_udc_svc_data_in() local
2256 ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_svc_data_in()
2257 epsts = ep->epsts; in pch_udc_svc_data_in()
2258 ep->epsts = 0; in pch_udc_svc_data_in()
2269 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2270 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2271 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2275 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_in()
2277 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2278 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2279 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2283 pch_udc_complete_transfer(ep); in pch_udc_svc_data_in()
2287 pch_udc_start_next_txrequest(ep); in pch_udc_svc_data_in()
2298 struct pch_udc_ep *ep; in pch_udc_svc_data_out() local
2301 ep = &dev->ep[UDC_EPOUT_IDX(ep_num)]; in pch_udc_svc_data_out()
2302 epsts = ep->epsts; in pch_udc_svc_data_out()
2303 ep->epsts = 0; in pch_udc_svc_data_out()
2305 if ((epsts & UDC_EPSTS_BNA) && (!list_empty(&ep->queue))) { in pch_udc_svc_data_out()
2307 req = list_entry(ep->queue.next, struct pch_udc_request, in pch_udc_svc_data_out()
2312 pch_udc_start_rxrequest(ep, req); in pch_udc_svc_data_out()
2319 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2320 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2321 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2325 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_out()
2327 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2328 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2329 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2334 if (ep->dev->prot_stall == 1) { in pch_udc_svc_data_out()
2335 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2336 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2337 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2339 pch_udc_complete_receiver(ep); in pch_udc_svc_data_out()
2342 if (list_empty(&ep->queue)) in pch_udc_svc_data_out()
2353 struct pch_udc_ep *ep; in pch_udc_svc_control_in() local
2356 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_svc_control_in()
2357 ep_out = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_in()
2358 epsts = ep->epsts; in pch_udc_svc_control_in()
2359 ep->epsts = 0; in pch_udc_svc_control_in()
2370 pch_udc_complete_transfer(ep); in pch_udc_svc_control_in()
2382 pch_udc_start_next_txrequest(ep); in pch_udc_svc_control_in()
2396 struct pch_udc_ep *ep; in pch_udc_svc_control_out() local
2398 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_out()
2399 stat = ep->epsts; in pch_udc_svc_control_out()
2400 ep->epsts = 0; in pch_udc_svc_control_out()
2406 dev->ep[UDC_EP0IN_IDX].halted = 0; in pch_udc_svc_control_out()
2407 dev->ep[UDC_EP0OUT_IDX].halted = 0; in pch_udc_svc_control_out()
2408 dev->setup_data = ep->td_stp->request; in pch_udc_svc_control_out()
2409 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_svc_control_out()
2411 pch_udc_ep_fifo_flush(&(dev->ep[UDC_EP0IN_IDX]), in pch_udc_svc_control_out()
2412 dev->ep[UDC_EP0IN_IDX].in); in pch_udc_svc_control_out()
2414 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_svc_control_out()
2416 dev->gadget.ep0 = &ep->ep; in pch_udc_svc_control_out()
2428 ep->td_data->status = (ep->td_data->status & in pch_udc_svc_control_out()
2431 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_svc_control_out()
2436 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2441 pch_udc_ep_clear_nak(ep); in pch_udc_svc_control_out()
2445 pch_udc_ep_set_stall(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2446 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_control_out()
2447 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_control_out()
2456 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_control_out()
2457 if (!list_empty(&ep->queue)) { in pch_udc_svc_control_out()
2458 ep->epsts = stat; in pch_udc_svc_control_out()
2463 pch_udc_ep_set_rrdy(ep); in pch_udc_svc_control_out()
2475 struct pch_udc_ep *ep; in pch_udc_postsvc_epinters() local
2478 ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_postsvc_epinters()
2479 if (!list_empty(&ep->queue)) { in pch_udc_postsvc_epinters()
2480 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_postsvc_epinters()
2481 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_postsvc_epinters()
2482 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_postsvc_epinters()
2483 pch_udc_ep_clear_nak(ep); in pch_udc_postsvc_epinters()
2495 struct pch_udc_ep *ep; in pch_udc_read_all_epstatus() local
2500 ep = &dev->ep[UDC_EPIN_IDX(i)]; in pch_udc_read_all_epstatus()
2501 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2502 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2506 ep = &dev->ep[UDC_EPOUT_IDX(i)]; in pch_udc_read_all_epstatus()
2507 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2508 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2520 struct pch_udc_ep *ep; in pch_udc_activate_control_ep() local
2524 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_activate_control_ep()
2525 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2526 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2527 pch_udc_ep_set_bufsz(ep, UDC_EP0IN_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2528 pch_udc_ep_set_maxpkt(ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2530 ep->td_data = NULL; in pch_udc_activate_control_ep()
2531 ep->td_stp = NULL; in pch_udc_activate_control_ep()
2532 ep->td_data_phys = 0; in pch_udc_activate_control_ep()
2533 ep->td_stp_phys = 0; in pch_udc_activate_control_ep()
2536 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_activate_control_ep()
2537 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2538 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2539 pch_udc_ep_set_bufsz(ep, UDC_EP0OUT_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2540 pch_udc_ep_set_maxpkt(ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2542 pch_udc_write_csr(ep->dev, val, UDC_EP0OUT_IDX); in pch_udc_activate_control_ep()
2545 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_activate_control_ep()
2547 pch_udc_ep_set_subptr(ep, ep->td_stp_phys); in pch_udc_activate_control_ep()
2549 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_activate_control_ep()
2552 ep->td_data->status = PCH_UDC_DMA_LAST; in pch_udc_activate_control_ep()
2553 ep->td_data->dataptr = dev->dma_addr; in pch_udc_activate_control_ep()
2554 ep->td_data->next = ep->td_data_phys; in pch_udc_activate_control_ep()
2556 pch_udc_ep_clear_nak(ep); in pch_udc_activate_control_ep()
2566 struct pch_udc_ep *ep; in pch_udc_svc_ur_interrupt() local
2577 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2578 pch_udc_clear_ep_status(ep, UDC_EPSTS_ALL_CLR_MASK); in pch_udc_svc_ur_interrupt()
2579 pch_udc_clear_ep_control(ep); in pch_udc_svc_ur_interrupt()
2580 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_ur_interrupt()
2581 pch_udc_write_csr(ep->dev, 0x00, i); in pch_udc_svc_ur_interrupt()
2590 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2591 pch_udc_ep_set_nak(ep); in pch_udc_svc_ur_interrupt()
2592 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_svc_ur_interrupt()
2594 empty_req_queue(ep); in pch_udc_svc_ur_interrupt()
2634 pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); in pch_udc_svc_enum_interrupt()
2674 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_intf_interrupt()
2675 dev->ep[i].halted = 0; in pch_udc_svc_intf_interrupt()
2709 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_cfg_interrupt()
2710 dev->ep[i].halted = 0; in pch_udc_svc_cfg_interrupt()
2889 memset(dev->ep, 0, sizeof dev->ep); in pch_udc_pcd_reinit()
2891 struct pch_udc_ep *ep = &dev->ep[i]; in pch_udc_pcd_reinit() local
2892 ep->dev = dev; in pch_udc_pcd_reinit()
2893 ep->halted = 1; in pch_udc_pcd_reinit()
2894 ep->num = i / 2; in pch_udc_pcd_reinit()
2895 ep->in = ~i & 1; in pch_udc_pcd_reinit()
2896 ep->ep.name = ep_string[i]; in pch_udc_pcd_reinit()
2897 ep->ep.ops = &pch_udc_ep_ops; in pch_udc_pcd_reinit()
2898 if (ep->in) { in pch_udc_pcd_reinit()
2899 ep->offset_addr = ep->num * UDC_EP_REG_SHIFT; in pch_udc_pcd_reinit()
2900 ep->ep.caps.dir_in = true; in pch_udc_pcd_reinit()
2902 ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) * in pch_udc_pcd_reinit()
2904 ep->ep.caps.dir_out = true; in pch_udc_pcd_reinit()
2907 ep->ep.caps.type_control = true; in pch_udc_pcd_reinit()
2909 ep->ep.caps.type_iso = true; in pch_udc_pcd_reinit()
2910 ep->ep.caps.type_bulk = true; in pch_udc_pcd_reinit()
2911 ep->ep.caps.type_int = true; in pch_udc_pcd_reinit()
2914 usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2915 list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); in pch_udc_pcd_reinit()
2916 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_reinit()
2918 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IDX].ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2919 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IDX].ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2922 list_del_init(&dev->ep[UDC_EP0IN_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2923 list_del_init(&dev->ep[UDC_EP0OUT_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2925 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_pcd_reinit()
2972 &dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in init_dma_pools()
2978 dev->ep[UDC_EP0OUT_IDX].td_stp = td_stp; in init_dma_pools()
2982 &dev->ep[UDC_EP0OUT_IDX].td_data_phys); in init_dma_pools()
2988 dev->ep[UDC_EP0OUT_IDX].td_data = td_data; in init_dma_pools()
2989 dev->ep[UDC_EP0IN_IDX].td_stp = NULL; in init_dma_pools()
2990 dev->ep[UDC_EP0IN_IDX].td_stp_phys = 0; in init_dma_pools()
2991 dev->ep[UDC_EP0IN_IDX].td_data = NULL; in init_dma_pools()
2992 dev->ep[UDC_EP0IN_IDX].td_data_phys = 0; in init_dma_pools()
3065 if (dev->ep[UDC_EP0OUT_IDX].td_stp) { in pch_udc_remove()
3067 dev->ep[UDC_EP0OUT_IDX].td_stp, in pch_udc_remove()
3068 dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in pch_udc_remove()
3070 if (dev->ep[UDC_EP0OUT_IDX].td_data) { in pch_udc_remove()
3072 dev->ep[UDC_EP0OUT_IDX].td_data, in pch_udc_remove()
3073 dev->ep[UDC_EP0OUT_IDX].td_data_phys); in pch_udc_remove()