Lines Matching refs:ep
71 static void done(struct at91_ep *ep, struct at91_request *req, int status) in done() argument
73 unsigned stopped = ep->stopped; in done()
74 struct at91_udc *udc = ep->udc; in done()
82 VDBG("%s done %p, status %d\n", ep->ep.name, req, status); in done()
84 ep->stopped = 1; in done()
86 req->req.complete(&ep->ep, &req->req); in done()
88 ep->stopped = stopped; in done()
91 if (list_empty(&ep->queue) && ep->int_mask != (1 << 0)) in done()
92 at91_udp_write(udc, AT91_UDP_IDR, ep->int_mask); in done()
122 static int read_fifo (struct at91_ep *ep, struct at91_request *req) in read_fifo() argument
124 u32 __iomem *creg = ep->creg; in read_fifo()
125 u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0)); in read_fifo()
143 if (count > ep->ep.maxpacket) in read_fifo()
144 count = ep->ep.maxpacket; in read_fifo()
146 DBG("%s buffer overflow\n", ep->ep.name); in read_fifo()
154 if (ep->is_pingpong) { in read_fifo()
155 if (ep->fifo_bank == 0) { in read_fifo()
157 ep->fifo_bank = 1; in read_fifo()
160 ep->fifo_bank = 0; in read_fifo()
167 is_done = (count < ep->ep.maxpacket); in read_fifo()
171 PACKET("%s %p out/%d%s\n", ep->ep.name, &req->req, count, in read_fifo()
179 done(ep, req, 0); in read_fifo()
180 else if (ep->is_pingpong) { in read_fifo()
197 static int write_fifo(struct at91_ep *ep, struct at91_request *req) in write_fifo() argument
199 u32 __iomem *creg = ep->creg; in write_fifo()
201 u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0)); in write_fifo()
231 if (ep->ep.maxpacket < total) { in write_fifo()
232 count = ep->ep.maxpacket; in write_fifo()
236 is_last = (count < ep->ep.maxpacket) || !req->req.zero; in write_fifo()
258 PACKET("%s %p in/%d%s\n", ep->ep.name, &req->req, count, in write_fifo()
261 done(ep, req, 0); in write_fifo()
265 static void nuke(struct at91_ep *ep, int status) in nuke() argument
270 ep->stopped = 1; in nuke()
271 if (list_empty(&ep->queue)) in nuke()
274 VDBG("%s %s\n", __func__, ep->ep.name); in nuke()
275 while (!list_empty(&ep->queue)) { in nuke()
276 req = list_entry(ep->queue.next, struct at91_request, queue); in nuke()
277 done(ep, req, status); in nuke()
286 struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); in at91_ep_enable() local
292 if (!_ep || !ep in at91_ep_enable()
296 || maxpacket > ep->maxpacket) { in at91_ep_enable()
301 udc = ep->udc; in at91_ep_enable()
328 if (!ep->is_pingpong) { in at91_ep_enable()
339 ep->is_in = usb_endpoint_dir_in(desc); in at91_ep_enable()
340 ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC); in at91_ep_enable()
341 ep->stopped = 0; in at91_ep_enable()
342 if (ep->is_in) in at91_ep_enable()
346 __raw_writel(tmp, ep->creg); in at91_ep_enable()
348 ep->ep.maxpacket = maxpacket; in at91_ep_enable()
354 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_enable()
363 struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); in at91_ep_disable() local
364 struct at91_udc *udc = ep->udc; in at91_ep_disable()
367 if (ep == &ep->udc->ep[0]) in at91_ep_disable()
372 nuke(ep, -ESHUTDOWN); in at91_ep_disable()
375 ep->ep.desc = NULL; in at91_ep_disable()
376 ep->ep.maxpacket = ep->maxpacket; in at91_ep_disable()
379 if (ep->udc->clocked) { in at91_ep_disable()
380 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_disable()
382 __raw_writel(0, ep->creg); in at91_ep_disable()
420 struct at91_ep *ep; in at91_ep_queue() local
426 ep = container_of(_ep, struct at91_ep, ep); in at91_ep_queue()
434 if (!_ep || (!ep->ep.desc && ep->ep.name != ep0name)) { in at91_ep_queue()
439 udc = ep->udc; in at91_ep_queue()
452 if (list_empty(&ep->queue) && !ep->stopped) { in at91_ep_queue()
463 is_ep0 = (ep->ep.name == ep0name); in at91_ep_queue()
486 tmp = __raw_readl(ep->creg); in at91_ep_queue()
489 __raw_writel(tmp, ep->creg); in at91_ep_queue()
495 if (ep->is_in) in at91_ep_queue()
496 status = write_fifo(ep, req); in at91_ep_queue()
498 status = read_fifo(ep, req); in at91_ep_queue()
508 list_add_tail (&req->queue, &ep->queue); in at91_ep_queue()
509 at91_udp_write(udc, AT91_UDP_IER, ep->int_mask); in at91_ep_queue()
518 struct at91_ep *ep; in at91_ep_dequeue() local
522 ep = container_of(_ep, struct at91_ep, ep); in at91_ep_dequeue()
523 if (!_ep || ep->ep.name == ep0name) in at91_ep_dequeue()
529 list_for_each_entry (req, &ep->queue, queue) { in at91_ep_dequeue()
538 done(ep, req, -ECONNRESET); in at91_ep_dequeue()
545 struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); in at91_ep_set_halt() local
546 struct at91_udc *udc = ep->udc; in at91_ep_set_halt()
552 if (!_ep || ep->is_iso || !ep->udc->clocked) in at91_ep_set_halt()
555 creg = ep->creg; in at91_ep_set_halt()
565 if (ep->is_in && (!list_empty(&ep->queue) || (csr >> 16) != 0)) in at91_ep_set_halt()
572 VDBG("halt %s\n", ep->ep.name); in at91_ep_set_halt()
574 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in at91_ep_set_halt()
642 struct at91_ep *ep = &udc->ep[i]; in udc_reinit() local
645 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in udc_reinit()
646 ep->ep.desc = NULL; in udc_reinit()
647 ep->stopped = 0; in udc_reinit()
648 ep->fifo_bank = 0; in udc_reinit()
649 usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket); in udc_reinit()
650 ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i); in udc_reinit()
652 INIT_LIST_HEAD(&ep->queue); in udc_reinit()
667 struct at91_ep *ep = &udc->ep[i]; in reset_gadget() local
669 ep->stopped = 1; in reset_gadget()
670 nuke(ep, -ESHUTDOWN); in reset_gadget()
692 struct at91_ep *ep = &udc->ep[i]; in stop_activity() local
693 ep->stopped = 1; in stop_activity()
694 nuke(ep, -ESHUTDOWN); in stop_activity()
807 static int handle_ep(struct at91_ep *ep) in handle_ep() argument
810 u32 __iomem *creg = ep->creg; in handle_ep()
813 if (!list_empty(&ep->queue)) in handle_ep()
814 req = list_entry(ep->queue.next, in handle_ep()
819 if (ep->is_in) { in handle_ep()
826 return write_fifo(ep, req); in handle_ep()
831 if (ep->is_iso && req) in handle_ep()
839 return read_fifo(ep, req); in handle_ep()
849 static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) in handle_setup() argument
851 u32 __iomem *creg = ep->creg; in handle_setup()
852 u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0)); in handle_setup()
865 ep->is_in = 1; in handle_setup()
868 ep->is_in = 0; in handle_setup()
880 ep->stopped = 0; in handle_setup()
978 ep = &udc->ep[tmp]; in handle_setup()
979 if (tmp >= NUM_ENDPOINTS || (tmp && !ep->ep.desc)) in handle_setup()
984 if (!ep->is_in) in handle_setup()
986 } else if (ep->is_in) in handle_setup()
989 PACKET("get %s status\n", ep->ep.name); in handle_setup()
990 if (__raw_readl(ep->creg) & AT91_UDP_FORCESTALL) in handle_setup()
1001 ep = &udc->ep[tmp]; in handle_setup()
1004 if (!ep->ep.desc || ep->is_iso) in handle_setup()
1007 if (!ep->is_in) in handle_setup()
1009 } else if (ep->is_in) in handle_setup()
1012 tmp = __raw_readl(ep->creg); in handle_setup()
1015 __raw_writel(tmp, ep->creg); in handle_setup()
1020 ep = &udc->ep[tmp]; in handle_setup()
1025 if (!ep->ep.desc || ep->is_iso) in handle_setup()
1028 if (!ep->is_in) in handle_setup()
1030 } else if (ep->is_in) in handle_setup()
1033 at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); in handle_setup()
1035 tmp = __raw_readl(ep->creg); in handle_setup()
1038 __raw_writel(tmp, ep->creg); in handle_setup()
1039 if (!list_empty(&ep->queue)) in handle_setup()
1040 handle_ep(ep); in handle_setup()
1077 struct at91_ep *ep0 = &udc->ep[0]; in handle_ep0()
1291 struct at91_ep *ep = &udc->ep[1]; in at91_udc_irq() local
1298 handle_ep(ep); in at91_udc_irq()
1299 ep++; in at91_udc_irq()
1346 struct at91_ep *ep; in at91sam9260_udc_init() local
1350 ep = &udc->ep[i]; in at91sam9260_udc_init()
1354 ep->maxpacket = 64; in at91sam9260_udc_init()
1357 ep->maxpacket = 512; in at91sam9260_udc_init()
1386 struct at91_ep *ep; in at91sam9261_udc_init() local
1390 ep = &udc->ep[i]; in at91sam9261_udc_init()
1394 ep->maxpacket = 8; in at91sam9261_udc_init()
1397 ep->maxpacket = 64; in at91sam9261_udc_init()
1400 ep->maxpacket = 256; in at91sam9261_udc_init()
1487 struct at91_ep *ep; in at91_udc_probe() local
1512 udc->gadget.ep0 = &udc->ep[0].ep; in at91_udc_probe()
1516 ep = &udc->ep[i]; in at91_udc_probe()
1517 ep->ep.name = ep_names[i]; in at91_udc_probe()
1518 ep->ep.ops = &at91_ep_ops; in at91_udc_probe()
1519 ep->udc = udc; in at91_udc_probe()
1520 ep->int_mask = (1 << i); in at91_udc_probe()
1522 ep->is_pingpong = 1; in at91_udc_probe()