Lines Matching refs: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
285 struct usb_ep ep; member
343 struct pch_udc_ep ep[PCH_UDC_EP_NUM]; member
426 static inline u32 pch_udc_ep_readl(struct pch_udc_ep *ep, unsigned long reg) in pch_udc_ep_readl() argument
428 return ioread32(ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_readl()
431 static inline void pch_udc_ep_writel(struct pch_udc_ep *ep, in pch_udc_ep_writel() argument
434 iowrite32(val, ep->dev->base_addr + ep->offset_addr + reg); in pch_udc_ep_writel()
437 static inline void pch_udc_ep_bit_set(struct pch_udc_ep *ep, in pch_udc_ep_bit_set() argument
441 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) | bitmask, reg); in pch_udc_ep_bit_set()
444 static inline void pch_udc_ep_bit_clr(struct pch_udc_ep *ep, in pch_udc_ep_bit_clr() argument
448 pch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) & ~(bitmask), reg); in pch_udc_ep_bit_clr()
474 unsigned int ep) in pch_udc_write_csr() argument
476 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_write_csr()
490 static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep) in pch_udc_read_csr() argument
492 unsigned long reg = PCH_UDC_CSR(ep); in pch_udc_read_csr()
619 static void pch_udc_ep_set_stall(struct pch_udc_ep *ep) in pch_udc_ep_set_stall() argument
621 if (ep->in) { in pch_udc_ep_set_stall()
622 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_set_stall()
623 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
625 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_set_stall()
633 static inline void pch_udc_ep_clear_stall(struct pch_udc_ep *ep) in pch_udc_ep_clear_stall() argument
636 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S); in pch_udc_ep_clear_stall()
638 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_stall()
646 static inline void pch_udc_ep_set_trfr_type(struct pch_udc_ep *ep, in pch_udc_ep_set_trfr_type() argument
649 pch_udc_ep_writel(ep, ((type << UDC_EPCTL_ET_SHIFT) & in pch_udc_ep_set_trfr_type()
659 static void pch_udc_ep_set_bufsz(struct pch_udc_ep *ep, in pch_udc_ep_set_bufsz() argument
664 data = pch_udc_ep_readl(ep, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
666 pch_udc_ep_writel(ep, data, UDC_BUFIN_FRAMENUM_ADDR); in pch_udc_ep_set_bufsz()
668 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
670 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_bufsz()
679 static void pch_udc_ep_set_maxpkt(struct pch_udc_ep *ep, u32 pkt_size) in pch_udc_ep_set_maxpkt() argument
681 u32 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
683 pch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR); in pch_udc_ep_set_maxpkt()
691 static inline void pch_udc_ep_set_subptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_subptr() argument
693 pch_udc_ep_writel(ep, addr, UDC_SUBPTR_ADDR); in pch_udc_ep_set_subptr()
701 static inline void pch_udc_ep_set_ddptr(struct pch_udc_ep *ep, u32 addr) in pch_udc_ep_set_ddptr() argument
703 pch_udc_ep_writel(ep, addr, UDC_DESPTR_ADDR); in pch_udc_ep_set_ddptr()
710 static inline void pch_udc_ep_set_pd(struct pch_udc_ep *ep) in pch_udc_ep_set_pd() argument
712 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_P); in pch_udc_ep_set_pd()
719 static inline void pch_udc_ep_set_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_set_rrdy() argument
721 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_set_rrdy()
728 static inline void pch_udc_ep_clear_rrdy(struct pch_udc_ep *ep) in pch_udc_ep_clear_rrdy() argument
730 pch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY); in pch_udc_ep_clear_rrdy()
876 static inline u32 pch_udc_read_ep_control(struct pch_udc_ep *ep) in pch_udc_read_ep_control() argument
878 return pch_udc_ep_readl(ep, UDC_EPCTL_ADDR); in pch_udc_read_ep_control()
886 static inline void pch_udc_clear_ep_control(struct pch_udc_ep *ep) in pch_udc_clear_ep_control() argument
888 return pch_udc_ep_writel(ep, 0, UDC_EPCTL_ADDR); in pch_udc_clear_ep_control()
896 static inline u32 pch_udc_read_ep_status(struct pch_udc_ep *ep) in pch_udc_read_ep_status() argument
898 return pch_udc_ep_readl(ep, UDC_EPSTS_ADDR); in pch_udc_read_ep_status()
906 static inline void pch_udc_clear_ep_status(struct pch_udc_ep *ep, in pch_udc_clear_ep_status() argument
909 return pch_udc_ep_writel(ep, stat, UDC_EPSTS_ADDR); in pch_udc_clear_ep_status()
917 static inline void pch_udc_ep_set_nak(struct pch_udc_ep *ep) in pch_udc_ep_set_nak() argument
919 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_SNAK); in pch_udc_ep_set_nak()
927 static void pch_udc_ep_clear_nak(struct pch_udc_ep *ep) in pch_udc_ep_clear_nak() argument
930 struct pch_udc_dev *dev = ep->dev; in pch_udc_ep_clear_nak()
932 if (!(pch_udc_ep_readl(ep, UDC_EPCTL_ADDR) & UDC_EPCTL_NAK)) in pch_udc_ep_clear_nak()
934 if (!ep->in) { in pch_udc_ep_clear_nak()
936 while (!(pch_udc_read_ep_status(ep) & UDC_EPSTS_MRXFIFO_EMP) && in pch_udc_ep_clear_nak()
944 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_NAK) && --loopcnt) { in pch_udc_ep_clear_nak()
945 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK); in pch_udc_ep_clear_nak()
950 __func__, ep->num, (ep->in ? "in" : "out")); in pch_udc_ep_clear_nak()
960 static void pch_udc_ep_fifo_flush(struct pch_udc_ep *ep, int dir) in pch_udc_ep_fifo_flush() argument
963 pch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F); in pch_udc_ep_fifo_flush()
974 static void pch_udc_ep_enable(struct pch_udc_ep *ep, in pch_udc_ep_enable() argument
981 pch_udc_ep_set_trfr_type(ep, desc->bmAttributes); in pch_udc_ep_enable()
982 if (ep->in) in pch_udc_ep_enable()
986 pch_udc_ep_set_bufsz(ep, buff_size, ep->in); in pch_udc_ep_enable()
987 pch_udc_ep_set_maxpkt(ep, usb_endpoint_maxp(desc)); in pch_udc_ep_enable()
988 pch_udc_ep_set_nak(ep); in pch_udc_ep_enable()
989 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_ep_enable()
991 val = ep->num << UDC_CSR_NE_NUM_SHIFT | ep->in << UDC_CSR_NE_DIR_SHIFT | in pch_udc_ep_enable()
999 if (ep->in) in pch_udc_ep_enable()
1000 pch_udc_write_csr(ep->dev, val, UDC_EPIN_IDX(ep->num)); in pch_udc_ep_enable()
1002 pch_udc_write_csr(ep->dev, val, UDC_EPOUT_IDX(ep->num)); in pch_udc_ep_enable()
1009 static void pch_udc_ep_disable(struct pch_udc_ep *ep) in pch_udc_ep_disable() argument
1011 if (ep->in) { in pch_udc_ep_disable()
1013 pch_udc_ep_writel(ep, UDC_EPCTL_F, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1015 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1016 pch_udc_ep_bit_set(ep, UDC_EPSTS_ADDR, UDC_EPSTS_IN); in pch_udc_ep_disable()
1019 pch_udc_ep_writel(ep, UDC_EPCTL_SNAK, UDC_EPCTL_ADDR); in pch_udc_ep_disable()
1022 pch_udc_ep_writel(ep, 0, UDC_DESPTR_ADDR); in pch_udc_ep_disable()
1029 static void pch_udc_wait_ep_stall(struct pch_udc_ep *ep) in pch_udc_wait_ep_stall() argument
1034 while ((pch_udc_read_ep_control(ep) & UDC_EPCTL_S) && --count) in pch_udc_wait_ep_stall()
1037 dev_err(&ep->dev->pdev->dev, "%s: wait error\n", __func__); in pch_udc_wait_ep_stall()
1422 static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, in complete_req() argument
1428 unsigned halted = ep->halted; in complete_req()
1438 dev = ep->dev; in complete_req()
1439 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->in); in complete_req()
1440 ep->halted = 1; in complete_req()
1442 if (!ep->in) in complete_req()
1443 pch_udc_ep_clear_rrdy(ep); in complete_req()
1444 usb_gadget_giveback_request(&ep->ep, &req->req); in complete_req()
1446 ep->halted = halted; in complete_req()
1453 static void empty_req_queue(struct pch_udc_ep *ep) in empty_req_queue() argument
1457 ep->halted = 1; in empty_req_queue()
1458 while (!list_empty(&ep->queue)) { in empty_req_queue()
1459 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in empty_req_queue()
1460 complete_req(ep, req, -ESHUTDOWN); /* Remove from list */ in empty_req_queue()
1504 static int pch_udc_create_dma_chain(struct pch_udc_ep *ep, in pch_udc_create_dma_chain() argument
1515 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1525 td = dma_pool_alloc(ep->dev->data_requests, gfp_flags, in pch_udc_create_dma_chain()
1543 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_create_dma_chain()
1560 static int prepare_dma(struct pch_udc_ep *ep, struct pch_udc_request *req, in prepare_dma() argument
1566 retval = pch_udc_create_dma_chain(ep, req, ep->ep.maxpacket, gfp); in prepare_dma()
1571 if (ep->in) in prepare_dma()
1583 static void process_zlp(struct pch_udc_ep *ep, struct pch_udc_request *req) in process_zlp() argument
1585 struct pch_udc_dev *dev = ep->dev; in process_zlp()
1588 complete_req(ep, req, 0); in process_zlp()
1599 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in process_zlp()
1609 static void pch_udc_start_rxrequest(struct pch_udc_ep *ep, in pch_udc_start_rxrequest() argument
1614 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1625 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_rxrequest()
1627 pch_udc_enable_ep_interrupts(ep->dev, UDC_EPINT_OUT_EP0 << ep->num); in pch_udc_start_rxrequest()
1628 pch_udc_set_dma(ep->dev, DMA_DIR_RX); in pch_udc_start_rxrequest()
1629 pch_udc_ep_clear_nak(ep); in pch_udc_start_rxrequest()
1630 pch_udc_ep_set_rrdy(ep); in pch_udc_start_rxrequest()
1647 struct pch_udc_ep *ep; in pch_udc_pcd_ep_enable() local
1655 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_enable()
1656 dev = ep->dev; in pch_udc_pcd_ep_enable()
1660 ep->ep.desc = desc; in pch_udc_pcd_ep_enable()
1661 ep->halted = 0; in pch_udc_pcd_ep_enable()
1662 pch_udc_ep_enable(ep, &ep->dev->cfg_data, desc); in pch_udc_pcd_ep_enable()
1663 ep->ep.maxpacket = usb_endpoint_maxp(desc); in pch_udc_pcd_ep_enable()
1664 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_enable()
1680 struct pch_udc_ep *ep; in pch_udc_pcd_ep_disable() local
1686 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_ep_disable()
1687 if ((usbep->name == ep0_string) || !ep->ep.desc) in pch_udc_pcd_ep_disable()
1690 spin_lock_irqsave(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1691 empty_req_queue(ep); in pch_udc_pcd_ep_disable()
1692 ep->halted = 1; in pch_udc_pcd_ep_disable()
1693 pch_udc_ep_disable(ep); in pch_udc_pcd_ep_disable()
1694 pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_ep_disable()
1695 ep->ep.desc = NULL; in pch_udc_pcd_ep_disable()
1696 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_ep_disable()
1697 spin_unlock_irqrestore(&ep->dev->lock, iflags); in pch_udc_pcd_ep_disable()
1715 struct pch_udc_ep *ep; in pch_udc_alloc_request() local
1720 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_alloc_request()
1726 if (!ep->dev->dma_addr) in pch_udc_alloc_request()
1729 dma_desc = dma_pool_alloc(ep->dev->data_requests, gfp, in pch_udc_alloc_request()
1753 struct pch_udc_ep *ep; in pch_udc_free_request() local
1759 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_free_request()
1761 dev = ep->dev; in pch_udc_free_request()
1767 pch_udc_free_dma_chain(ep->dev, req); in pch_udc_free_request()
1768 dma_pool_free(ep->dev->data_requests, req->td_data, in pch_udc_free_request()
1789 struct pch_udc_ep *ep; in pch_udc_pcd_queue() local
1796 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_queue()
1797 dev = ep->dev; in pch_udc_pcd_queue()
1798 if (!ep->ep.desc && ep->num) in pch_udc_pcd_queue()
1807 retval = usb_gadget_map_request(&dev->gadget, usbreq, ep->in); in pch_udc_pcd_queue()
1811 retval = prepare_dma(ep, req, GFP_ATOMIC); in pch_udc_pcd_queue()
1818 if (list_empty(&ep->queue) && !ep->halted) { in pch_udc_pcd_queue()
1821 process_zlp(ep, req); in pch_udc_pcd_queue()
1825 if (!ep->in) { in pch_udc_pcd_queue()
1826 pch_udc_start_rxrequest(ep, req); in pch_udc_pcd_queue()
1833 pch_udc_wait_ep_stall(ep); in pch_udc_pcd_queue()
1834 pch_udc_ep_clear_nak(ep); in pch_udc_pcd_queue()
1835 pch_udc_enable_ep_interrupts(ep->dev, (1 << ep->num)); in pch_udc_pcd_queue()
1840 list_add_tail(&req->queue, &ep->queue); in pch_udc_pcd_queue()
1860 struct pch_udc_ep *ep; in pch_udc_pcd_dequeue() local
1865 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_dequeue()
1866 if (!usbep || !usbreq || (!ep->ep.desc && ep->num)) in pch_udc_pcd_dequeue()
1869 spin_lock_irqsave(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1871 list_for_each_entry(req, &ep->queue, queue) { in pch_udc_pcd_dequeue()
1873 pch_udc_ep_set_nak(ep); in pch_udc_pcd_dequeue()
1875 complete_req(ep, req, -ECONNRESET); in pch_udc_pcd_dequeue()
1880 spin_unlock_irqrestore(&ep->dev->lock, flags); in pch_udc_pcd_dequeue()
1896 struct pch_udc_ep *ep; in pch_udc_pcd_set_halt() local
1902 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_halt()
1903 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_halt()
1905 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_halt()
1908 if (list_empty(&ep->queue)) { in pch_udc_pcd_set_halt()
1910 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_halt()
1911 ep->dev->stall = 1; in pch_udc_pcd_set_halt()
1912 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_halt()
1914 ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_set_halt()
1916 pch_udc_ep_clear_stall(ep); in pch_udc_pcd_set_halt()
1937 struct pch_udc_ep *ep; in pch_udc_pcd_set_wedge() local
1943 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_set_wedge()
1944 if (!ep->ep.desc && !ep->num) in pch_udc_pcd_set_wedge()
1946 if (!ep->dev->driver || (ep->dev->gadget.speed == USB_SPEED_UNKNOWN)) in pch_udc_pcd_set_wedge()
1949 if (!list_empty(&ep->queue)) { in pch_udc_pcd_set_wedge()
1952 if (ep->num == PCH_UDC_EP0) in pch_udc_pcd_set_wedge()
1953 ep->dev->stall = 1; in pch_udc_pcd_set_wedge()
1954 pch_udc_ep_set_stall(ep); in pch_udc_pcd_set_wedge()
1955 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_pcd_set_wedge()
1956 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_pcd_set_wedge()
1957 ep->dev->prot_stall = 1; in pch_udc_pcd_set_wedge()
1970 struct pch_udc_ep *ep; in pch_udc_pcd_fifo_flush() local
1975 ep = container_of(usbep, struct pch_udc_ep, ep); in pch_udc_pcd_fifo_flush()
1976 if (ep->ep.desc || !ep->num) in pch_udc_pcd_fifo_flush()
1977 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_pcd_fifo_flush()
2013 static void pch_udc_start_next_txrequest(struct pch_udc_ep *ep) in pch_udc_start_next_txrequest() argument
2018 if (pch_udc_read_ep_control(ep) & UDC_EPCTL_P) in pch_udc_start_next_txrequest()
2021 if (list_empty(&ep->queue)) in pch_udc_start_next_txrequest()
2025 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_start_next_txrequest()
2030 pch_udc_wait_ep_stall(ep); in pch_udc_start_next_txrequest()
2032 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_start_next_txrequest()
2041 pch_udc_ep_set_ddptr(ep, req->td_data_phys); in pch_udc_start_next_txrequest()
2042 pch_udc_set_dma(ep->dev, DMA_DIR_TX); in pch_udc_start_next_txrequest()
2043 pch_udc_ep_set_pd(ep); in pch_udc_start_next_txrequest()
2044 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_start_next_txrequest()
2045 pch_udc_ep_clear_nak(ep); in pch_udc_start_next_txrequest()
2052 static void pch_udc_complete_transfer(struct pch_udc_ep *ep) in pch_udc_complete_transfer() argument
2055 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_transfer()
2057 if (list_empty(&ep->queue)) in pch_udc_complete_transfer()
2059 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_transfer()
2068 (int)(ep->epsts)); in pch_udc_complete_transfer()
2075 complete_req(ep, req, 0); in pch_udc_complete_transfer()
2077 if (!list_empty(&ep->queue)) { in pch_udc_complete_transfer()
2078 pch_udc_wait_ep_stall(ep); in pch_udc_complete_transfer()
2079 pch_udc_ep_clear_nak(ep); in pch_udc_complete_transfer()
2080 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2081 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2083 pch_udc_disable_ep_interrupts(ep->dev, in pch_udc_complete_transfer()
2084 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_complete_transfer()
2092 static void pch_udc_complete_receiver(struct pch_udc_ep *ep) in pch_udc_complete_receiver() argument
2095 struct pch_udc_dev *dev = ep->dev; in pch_udc_complete_receiver()
2100 if (list_empty(&ep->queue)) in pch_udc_complete_receiver()
2103 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2104 pch_udc_clear_dma(ep->dev, DMA_DIR_RX); in pch_udc_complete_receiver()
2105 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_complete_receiver()
2117 (int)(ep->epsts)); in pch_udc_complete_receiver()
2140 complete_req(ep, req, 0); in pch_udc_complete_receiver()
2142 if (!list_empty(&ep->queue)) { in pch_udc_complete_receiver()
2143 req = list_entry(ep->queue.next, struct pch_udc_request, queue); in pch_udc_complete_receiver()
2144 pch_udc_start_rxrequest(ep, req); in pch_udc_complete_receiver()
2157 struct pch_udc_ep *ep; in pch_udc_svc_data_in() local
2159 ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_svc_data_in()
2160 epsts = ep->epsts; in pch_udc_svc_data_in()
2161 ep->epsts = 0; in pch_udc_svc_data_in()
2172 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2173 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2174 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2178 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_in()
2180 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_in()
2181 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_in()
2182 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_in()
2186 pch_udc_complete_transfer(ep); in pch_udc_svc_data_in()
2190 pch_udc_start_next_txrequest(ep); in pch_udc_svc_data_in()
2201 struct pch_udc_ep *ep; in pch_udc_svc_data_out() local
2204 ep = &dev->ep[UDC_EPOUT_IDX(ep_num)]; in pch_udc_svc_data_out()
2205 epsts = ep->epsts; in pch_udc_svc_data_out()
2206 ep->epsts = 0; in pch_udc_svc_data_out()
2208 if ((epsts & UDC_EPSTS_BNA) && (!list_empty(&ep->queue))) { in pch_udc_svc_data_out()
2210 req = list_entry(ep->queue.next, struct pch_udc_request, in pch_udc_svc_data_out()
2215 pch_udc_start_rxrequest(ep, req); in pch_udc_svc_data_out()
2222 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2223 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2224 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2228 pch_udc_ep_clear_stall(ep); in pch_udc_svc_data_out()
2230 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2231 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2232 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2237 if (ep->dev->prot_stall == 1) { in pch_udc_svc_data_out()
2238 pch_udc_ep_set_stall(ep); in pch_udc_svc_data_out()
2239 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_data_out()
2240 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_data_out()
2242 pch_udc_complete_receiver(ep); in pch_udc_svc_data_out()
2245 if (list_empty(&ep->queue)) in pch_udc_svc_data_out()
2271 struct pch_udc_ep *ep; in pch_udc_svc_control_in() local
2274 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_svc_control_in()
2275 ep_out = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_in()
2276 epsts = ep->epsts; in pch_udc_svc_control_in()
2277 ep->epsts = 0; in pch_udc_svc_control_in()
2288 pch_udc_complete_transfer(ep); in pch_udc_svc_control_in()
2300 pch_udc_start_next_txrequest(ep); in pch_udc_svc_control_in()
2314 struct pch_udc_ep *ep; in pch_udc_svc_control_out() local
2316 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_svc_control_out()
2317 stat = ep->epsts; in pch_udc_svc_control_out()
2318 ep->epsts = 0; in pch_udc_svc_control_out()
2324 dev->ep[UDC_EP0IN_IDX].halted = 0; in pch_udc_svc_control_out()
2325 dev->ep[UDC_EP0OUT_IDX].halted = 0; in pch_udc_svc_control_out()
2326 dev->setup_data = ep->td_stp->request; in pch_udc_svc_control_out()
2327 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_svc_control_out()
2329 pch_udc_ep_fifo_flush(&(dev->ep[UDC_EP0IN_IDX]), in pch_udc_svc_control_out()
2330 dev->ep[UDC_EP0IN_IDX].in); in pch_udc_svc_control_out()
2332 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_svc_control_out()
2334 dev->gadget.ep0 = &ep->ep; in pch_udc_svc_control_out()
2343 ep->td_data->status = (ep->td_data->status & in pch_udc_svc_control_out()
2346 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_svc_control_out()
2351 pch_udc_ep_clear_nak(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2356 pch_udc_ep_clear_nak(ep); in pch_udc_svc_control_out()
2360 pch_udc_ep_set_stall(&(dev->ep[UDC_EP0IN_IDX])); in pch_udc_svc_control_out()
2361 pch_udc_enable_ep_interrupts(ep->dev, in pch_udc_svc_control_out()
2362 PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_svc_control_out()
2371 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_control_out()
2372 if (!list_empty(&ep->queue)) { in pch_udc_svc_control_out()
2373 ep->epsts = stat; in pch_udc_svc_control_out()
2378 pch_udc_ep_set_rrdy(ep); in pch_udc_svc_control_out()
2390 struct pch_udc_ep *ep = &dev->ep[UDC_EPIN_IDX(ep_num)]; in pch_udc_postsvc_epinters() local
2391 if (list_empty(&ep->queue)) in pch_udc_postsvc_epinters()
2393 pch_udc_enable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); in pch_udc_postsvc_epinters()
2394 pch_udc_ep_clear_nak(ep); in pch_udc_postsvc_epinters()
2405 struct pch_udc_ep *ep; in pch_udc_read_all_epstatus() local
2410 ep = &dev->ep[UDC_EPIN_IDX(i)]; in pch_udc_read_all_epstatus()
2411 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2412 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2416 ep = &dev->ep[UDC_EPOUT_IDX(i)]; in pch_udc_read_all_epstatus()
2417 ep->epsts = pch_udc_read_ep_status(ep); in pch_udc_read_all_epstatus()
2418 pch_udc_clear_ep_status(ep, ep->epsts); in pch_udc_read_all_epstatus()
2430 struct pch_udc_ep *ep; in pch_udc_activate_control_ep() local
2434 ep = &dev->ep[UDC_EP0IN_IDX]; in pch_udc_activate_control_ep()
2435 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2436 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2437 pch_udc_ep_set_bufsz(ep, UDC_EP0IN_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2438 pch_udc_ep_set_maxpkt(ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2440 ep->td_data = NULL; in pch_udc_activate_control_ep()
2441 ep->td_stp = NULL; in pch_udc_activate_control_ep()
2442 ep->td_data_phys = 0; in pch_udc_activate_control_ep()
2443 ep->td_stp_phys = 0; in pch_udc_activate_control_ep()
2446 ep = &dev->ep[UDC_EP0OUT_IDX]; in pch_udc_activate_control_ep()
2447 pch_udc_clear_ep_control(ep); in pch_udc_activate_control_ep()
2448 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_activate_control_ep()
2449 pch_udc_ep_set_bufsz(ep, UDC_EP0OUT_BUFF_SIZE, ep->in); in pch_udc_activate_control_ep()
2450 pch_udc_ep_set_maxpkt(ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_activate_control_ep()
2452 pch_udc_write_csr(ep->dev, val, UDC_EP0OUT_IDX); in pch_udc_activate_control_ep()
2455 pch_udc_init_setup_buff(ep->td_stp); in pch_udc_activate_control_ep()
2457 pch_udc_ep_set_subptr(ep, ep->td_stp_phys); in pch_udc_activate_control_ep()
2459 pch_udc_ep_set_ddptr(ep, ep->td_data_phys); in pch_udc_activate_control_ep()
2462 ep->td_data->status = PCH_UDC_DMA_LAST; in pch_udc_activate_control_ep()
2463 ep->td_data->dataptr = dev->dma_addr; in pch_udc_activate_control_ep()
2464 ep->td_data->next = ep->td_data_phys; in pch_udc_activate_control_ep()
2466 pch_udc_ep_clear_nak(ep); in pch_udc_activate_control_ep()
2476 struct pch_udc_ep *ep; in pch_udc_svc_ur_interrupt() local
2487 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2488 pch_udc_clear_ep_status(ep, UDC_EPSTS_ALL_CLR_MASK); in pch_udc_svc_ur_interrupt()
2489 pch_udc_clear_ep_control(ep); in pch_udc_svc_ur_interrupt()
2490 pch_udc_ep_set_ddptr(ep, 0); in pch_udc_svc_ur_interrupt()
2491 pch_udc_write_csr(ep->dev, 0x00, i); in pch_udc_svc_ur_interrupt()
2500 ep = &dev->ep[i]; in pch_udc_svc_ur_interrupt()
2501 pch_udc_ep_set_nak(ep); in pch_udc_svc_ur_interrupt()
2502 pch_udc_ep_fifo_flush(ep, ep->in); in pch_udc_svc_ur_interrupt()
2504 empty_req_queue(ep); in pch_udc_svc_ur_interrupt()
2544 pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); in pch_udc_svc_enum_interrupt()
2584 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_intf_interrupt()
2585 dev->ep[i].halted = 0; in pch_udc_svc_intf_interrupt()
2617 pch_udc_ep_clear_stall(&(dev->ep[i])); in pch_udc_svc_cfg_interrupt()
2618 dev->ep[i].halted = 0; in pch_udc_svc_cfg_interrupt()
2784 memset(dev->ep, 0, sizeof dev->ep); in pch_udc_pcd_reinit()
2786 struct pch_udc_ep *ep = &dev->ep[i]; in pch_udc_pcd_reinit() local
2787 ep->dev = dev; in pch_udc_pcd_reinit()
2788 ep->halted = 1; in pch_udc_pcd_reinit()
2789 ep->num = i / 2; in pch_udc_pcd_reinit()
2790 ep->in = ~i & 1; in pch_udc_pcd_reinit()
2791 ep->ep.name = ep_string[i]; in pch_udc_pcd_reinit()
2792 ep->ep.ops = &pch_udc_ep_ops; in pch_udc_pcd_reinit()
2793 if (ep->in) { in pch_udc_pcd_reinit()
2794 ep->offset_addr = ep->num * UDC_EP_REG_SHIFT; in pch_udc_pcd_reinit()
2795 ep->ep.caps.dir_in = true; in pch_udc_pcd_reinit()
2797 ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) * in pch_udc_pcd_reinit()
2799 ep->ep.caps.dir_out = true; in pch_udc_pcd_reinit()
2802 ep->ep.caps.type_control = true; in pch_udc_pcd_reinit()
2804 ep->ep.caps.type_iso = true; in pch_udc_pcd_reinit()
2805 ep->ep.caps.type_bulk = true; in pch_udc_pcd_reinit()
2806 ep->ep.caps.type_int = true; in pch_udc_pcd_reinit()
2809 usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2810 list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); in pch_udc_pcd_reinit()
2811 INIT_LIST_HEAD(&ep->queue); in pch_udc_pcd_reinit()
2813 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IDX].ep, UDC_EP0IN_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2814 usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IDX].ep, UDC_EP0OUT_MAX_PKT_SIZE); in pch_udc_pcd_reinit()
2817 list_del_init(&dev->ep[UDC_EP0IN_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2818 list_del_init(&dev->ep[UDC_EP0OUT_IDX].ep.ep_list); in pch_udc_pcd_reinit()
2820 dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep; in pch_udc_pcd_reinit()
2874 &dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in init_dma_pools()
2880 dev->ep[UDC_EP0OUT_IDX].td_stp = td_stp; in init_dma_pools()
2884 &dev->ep[UDC_EP0OUT_IDX].td_data_phys); in init_dma_pools()
2890 dev->ep[UDC_EP0OUT_IDX].td_data = td_data; in init_dma_pools()
2891 dev->ep[UDC_EP0IN_IDX].td_stp = NULL; in init_dma_pools()
2892 dev->ep[UDC_EP0IN_IDX].td_stp_phys = 0; in init_dma_pools()
2893 dev->ep[UDC_EP0IN_IDX].td_data = NULL; in init_dma_pools()
2894 dev->ep[UDC_EP0IN_IDX].td_data_phys = 0; in init_dma_pools()
2998 if (dev->ep[UDC_EP0OUT_IDX].td_stp) { in pch_udc_remove()
3000 dev->ep[UDC_EP0OUT_IDX].td_stp, in pch_udc_remove()
3001 dev->ep[UDC_EP0OUT_IDX].td_stp_phys); in pch_udc_remove()
3003 if (dev->ep[UDC_EP0OUT_IDX].td_data) { in pch_udc_remove()
3005 dev->ep[UDC_EP0OUT_IDX].td_data, in pch_udc_remove()
3006 dev->ep[UDC_EP0OUT_IDX].td_data_phys); in pch_udc_remove()