Lines Matching full:ep
33 static void done(struct fusb300_ep *ep, struct fusb300_request *req,
55 static void fusb300_ep_setting(struct fusb300_ep *ep, in fusb300_ep_setting() argument
58 ep->epnum = info.epnum; in fusb300_ep_setting()
59 ep->type = info.type; in fusb300_ep_setting()
62 static int fusb300_ep_release(struct fusb300_ep *ep) in fusb300_ep_release() argument
64 if (!ep->epnum) in fusb300_ep_release()
66 ep->epnum = 0; in fusb300_ep_release()
67 ep->stall = 0; in fusb300_ep_release()
68 ep->wedged = 0; in fusb300_ep_release()
73 u32 ep) in fusb300_set_fifo_entry() argument
75 u32 val = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_fifo_entry()
79 iowrite32(val, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_fifo_entry()
83 u8 ep) in fusb300_set_start_entry() argument
85 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_start_entry()
90 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_start_entry()
143 u8 ep) in fusb300_set_ep_active() argument
145 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_ep_active()
148 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_ep_active()
197 static int config_ep(struct fusb300_ep *ep, in config_ep() argument
200 struct fusb300 *fusb300 = ep->fusb300; in config_ep()
203 ep->ep.desc = desc; in config_ep()
225 fusb300_ep_setting(ep, info); in config_ep()
227 fusb300->ep[info.epnum] = ep; in config_ep()
235 struct fusb300_ep *ep; in fusb300_enable() local
237 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_enable()
239 if (ep->fusb300->reenum) { in fusb300_enable()
240 ep->fusb300->fifo_entry_num = 0; in fusb300_enable()
241 ep->fusb300->addrofs = 0; in fusb300_enable()
242 ep->fusb300->reenum = 0; in fusb300_enable()
245 return config_ep(ep, desc); in fusb300_enable()
250 struct fusb300_ep *ep; in fusb300_disable() local
254 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_disable()
256 BUG_ON(!ep); in fusb300_disable()
258 while (!list_empty(&ep->queue)) { in fusb300_disable()
259 req = list_entry(ep->queue.next, struct fusb300_request, queue); in fusb300_disable()
260 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_disable()
261 done(ep, req, -ECONNRESET); in fusb300_disable()
262 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_disable()
265 return fusb300_ep_release(ep); in fusb300_disable()
289 static int enable_fifo_int(struct fusb300_ep *ep) in enable_fifo_int() argument
291 struct fusb300 *fusb300 = ep->fusb300; in enable_fifo_int()
293 if (ep->epnum) { in enable_fifo_int()
295 FUSB300_IGER0_EEPn_FIFO_INT(ep->epnum)); in enable_fifo_int()
304 static int disable_fifo_int(struct fusb300_ep *ep) in disable_fifo_int() argument
306 struct fusb300 *fusb300 = ep->fusb300; in disable_fifo_int()
308 if (ep->epnum) { in disable_fifo_int()
310 FUSB300_IGER0_EEPn_FIFO_INT(ep->epnum)); in disable_fifo_int()
330 static void fusb300_wrcxf(struct fusb300_ep *ep, in fusb300_wrcxf() argument
336 struct fusb300 *fusb300 = ep->fusb300; in fusb300_wrcxf()
382 static void fusb300_set_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_set_epnstall() argument
384 fusb300_enable_bit(fusb300, FUSB300_OFFSET_EPSET0(ep), in fusb300_set_epnstall()
388 static void fusb300_clear_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_clear_epnstall() argument
390 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_clear_epnstall()
393 printk(KERN_DEBUG "EP%d stall... Clear!!\n", ep); in fusb300_clear_epnstall()
395 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_clear_epnstall()
399 static void ep0_queue(struct fusb300_ep *ep, struct fusb300_request *req) in ep0_queue() argument
401 if (ep->fusb300->ep0_dir) { /* if IN */ in ep0_queue()
403 fusb300_wrcxf(ep, req); in ep0_queue()
408 (req->req.actual < ep->ep.maxpacket)) in ep0_queue()
409 done(ep, req, 0); in ep0_queue()
412 done(ep, req, 0); in ep0_queue()
414 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER1, in ep0_queue()
422 struct fusb300_ep *ep; in fusb300_queue() local
427 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_queue()
430 if (ep->fusb300->gadget.speed == USB_SPEED_UNKNOWN) in fusb300_queue()
433 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_queue()
435 if (list_empty(&ep->queue)) in fusb300_queue()
438 list_add_tail(&req->queue, &ep->queue); in fusb300_queue()
443 if (ep->ep.desc == NULL) /* ep0 */ in fusb300_queue()
444 ep0_queue(ep, req); in fusb300_queue()
445 else if (request && !ep->stall) in fusb300_queue()
446 enable_fifo_int(ep); in fusb300_queue()
448 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_queue()
455 struct fusb300_ep *ep; in fusb300_dequeue() local
459 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_dequeue()
462 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_dequeue()
463 if (!list_empty(&ep->queue)) in fusb300_dequeue()
464 done(ep, req, -ECONNRESET); in fusb300_dequeue()
465 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_dequeue()
472 struct fusb300_ep *ep; in fusb300_set_halt_and_wedge() local
477 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_set_halt_and_wedge()
479 fusb300 = ep->fusb300; in fusb300_set_halt_and_wedge()
481 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_set_halt_and_wedge()
483 if (!list_empty(&ep->queue)) { in fusb300_set_halt_and_wedge()
489 fusb300_set_epnstall(fusb300, ep->epnum); in fusb300_set_halt_and_wedge()
490 ep->stall = 1; in fusb300_set_halt_and_wedge()
492 ep->wedged = 1; in fusb300_set_halt_and_wedge()
494 fusb300_clear_epnstall(fusb300, ep->epnum); in fusb300_set_halt_and_wedge()
495 ep->stall = 0; in fusb300_set_halt_and_wedge()
496 ep->wedged = 0; in fusb300_set_halt_and_wedge()
500 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_set_halt_and_wedge()
600 static void fusb300_rdfifo(struct fusb300_ep *ep, in fusb300_rdfifo() argument
607 struct fusb300 *fusb300 = ep->fusb300; in fusb300_rdfifo()
617 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
628 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
633 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
639 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
657 static u8 fusb300_get_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_get_epnstall() argument
660 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_get_epnstall()
687 u8 ep; in get_status() local
699 ep = w_index & USB_ENDPOINT_NUMBER_MASK; in get_status()
700 if (ep) { in get_status()
701 if (fusb300_get_epnstall(fusb300, ep)) in get_status()
725 u8 ep; in set_feature() local
737 ep = w_index & USB_ENDPOINT_NUMBER_MASK; in set_feature()
738 if (ep) in set_feature()
739 fusb300_set_epnstall(fusb300, ep); in set_feature()
751 static void fusb300_clear_seqnum(struct fusb300 *fusb300, u8 ep) in fusb300_clear_seqnum() argument
753 fusb300_enable_bit(fusb300, FUSB300_OFFSET_EPSET0(ep), in fusb300_clear_seqnum()
759 struct fusb300_ep *ep = in clear_feature() local
760 fusb300->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK]; in clear_feature()
771 if (ep->wedged) { in clear_feature()
775 if (ep->stall) { in clear_feature()
776 ep->stall = 0; in clear_feature()
777 fusb300_clear_seqnum(fusb300, ep->epnum); in clear_feature()
778 fusb300_clear_epnstall(fusb300, ep->epnum); in clear_feature()
779 if (!list_empty(&ep->queue)) in clear_feature()
780 enable_fifo_int(ep); in clear_feature()
864 static void done(struct fusb300_ep *ep, struct fusb300_request *req, in done() argument
870 if (ep->fusb300->gadget.speed == USB_SPEED_UNKNOWN) in done()
875 spin_unlock(&ep->fusb300->lock); in done()
876 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
877 spin_lock(&ep->fusb300->lock); in done()
879 if (ep->epnum) { in done()
880 disable_fifo_int(ep); in done()
881 if (!list_empty(&ep->queue)) in done()
882 enable_fifo_int(ep); in done()
884 fusb300_set_cxdone(ep->fusb300); in done()
887 static void fusb300_fill_idma_prdtbl(struct fusb300_ep *ep, dma_addr_t d, in fusb300_fill_idma_prdtbl() argument
895 reg = ioread32(ep->fusb300->reg + in fusb300_fill_idma_prdtbl()
896 FUSB300_OFFSET_EPPRD_W0(ep->epnum)); in fusb300_fill_idma_prdtbl()
900 iowrite32(d, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W1(ep->epnum)); in fusb300_fill_idma_prdtbl()
904 iowrite32(value, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W0(ep->epnum)); in fusb300_fill_idma_prdtbl()
906 iowrite32(0x0, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W2(ep->epnum)); in fusb300_fill_idma_prdtbl()
908 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_EPPRDRDY, in fusb300_fill_idma_prdtbl()
909 FUSB300_EPPRDR_EP_PRD_RDY(ep->epnum)); in fusb300_fill_idma_prdtbl()
912 static void fusb300_wait_idma_finished(struct fusb300_ep *ep) in fusb300_wait_idma_finished() argument
917 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGR1); in fusb300_wait_idma_finished()
924 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGR0); in fusb300_wait_idma_finished()
925 reg &= FUSB300_IGR0_EPn_PRD_INT(ep->epnum); in fusb300_wait_idma_finished()
928 fusb300_clear_int(ep->fusb300, FUSB300_OFFSET_IGR0, in fusb300_wait_idma_finished()
929 FUSB300_IGR0_EPn_PRD_INT(ep->epnum)); in fusb300_wait_idma_finished()
933 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGER0); in fusb300_wait_idma_finished()
934 reg &= ~FUSB300_IGER0_EEPn_PRD_INT(ep->epnum); in fusb300_wait_idma_finished()
935 iowrite32(reg, ep->fusb300->reg + FUSB300_OFFSET_IGER0); in fusb300_wait_idma_finished()
938 static void fusb300_set_idma(struct fusb300_ep *ep, in fusb300_set_idma() argument
943 ret = usb_gadget_map_request(&ep->fusb300->gadget, in fusb300_set_idma()
948 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER0, in fusb300_set_idma()
949 FUSB300_IGER0_EEPn_PRD_INT(ep->epnum)); in fusb300_set_idma()
951 fusb300_fill_idma_prdtbl(ep, req->req.dma, req->req.length); in fusb300_set_idma()
953 fusb300_wait_idma_finished(ep); in fusb300_set_idma()
955 usb_gadget_unmap_request(&ep->fusb300->gadget, in fusb300_set_idma()
959 static void in_ep_fifo_handler(struct fusb300_ep *ep) in in_ep_fifo_handler() argument
961 struct fusb300_request *req = list_entry(ep->queue.next, in in_ep_fifo_handler()
965 fusb300_set_idma(ep, req); in in_ep_fifo_handler()
966 done(ep, req, 0); in in_ep_fifo_handler()
969 static void out_ep_fifo_handler(struct fusb300_ep *ep) in out_ep_fifo_handler() argument
971 struct fusb300 *fusb300 = ep->fusb300; in out_ep_fifo_handler()
972 struct fusb300_request *req = list_entry(ep->queue.next, in out_ep_fifo_handler()
974 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPFFR(ep->epnum)); in out_ep_fifo_handler()
977 fusb300_rdfifo(ep, req, length); in out_ep_fifo_handler()
980 if ((req->req.length == req->req.actual) || (length < ep->ep.maxpacket)) in out_ep_fifo_handler()
981 done(ep, req, 0); in out_ep_fifo_handler()
1008 struct fusb300_ep *ep = fusb300->ep[0]; in fusb300_ep0out() local
1011 if (!list_empty(&ep->queue)) { in fusb300_ep0out()
1014 req = list_first_entry(&ep->queue, in fusb300_ep0out()
1017 fusb300_rdcxf(ep->fusb300, req->req.buf, in fusb300_ep0out()
1019 done(ep, req, 0); in fusb300_ep0out()
1030 struct fusb300_ep *ep = fusb300->ep[0]; in fusb300_ep0in() local
1032 if ((!list_empty(&ep->queue)) && (fusb300->ep0_dir)) { in fusb300_ep0in()
1033 req = list_entry(ep->queue.next, in fusb300_ep0in()
1036 fusb300_wrcxf(ep, req); in fusb300_ep0in()
1037 if ((req->req.length - req->req.actual) < ep->ep.maxpacket) in fusb300_ep0in()
1038 done(ep, req, 0); in fusb300_ep0in()
1244 in_ep_fifo_handler(fusb300->ep[i]); in fusb300_irq()
1246 out_ep_fifo_handler(fusb300->ep[i]); in fusb300_irq()
1351 fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); in fusb300_remove()
1353 kfree(fusb300->ep[i]); in fusb300_remove()
1409 fusb300->ep[i] = _ep[i]; in fusb300_probe()
1439 struct fusb300_ep *ep = fusb300->ep[i]; in fusb300_probe() local
1442 INIT_LIST_HEAD(&fusb300->ep[i]->ep.ep_list); in fusb300_probe()
1443 list_add_tail(&fusb300->ep[i]->ep.ep_list, in fusb300_probe()
1446 ep->fusb300 = fusb300; in fusb300_probe()
1447 INIT_LIST_HEAD(&ep->queue); in fusb300_probe()
1448 ep->ep.name = fusb300_ep_name[i]; in fusb300_probe()
1449 ep->ep.ops = &fusb300_ep_ops; in fusb300_probe()
1450 usb_ep_set_maxpacket_limit(&ep->ep, HS_BULK_MAX_PACKET_SIZE); in fusb300_probe()
1453 ep->ep.caps.type_control = true; in fusb300_probe()
1455 ep->ep.caps.type_iso = true; in fusb300_probe()
1456 ep->ep.caps.type_bulk = true; in fusb300_probe()
1457 ep->ep.caps.type_int = true; in fusb300_probe()
1460 ep->ep.caps.dir_in = true; in fusb300_probe()
1461 ep->ep.caps.dir_out = true; in fusb300_probe()
1463 usb_ep_set_maxpacket_limit(&fusb300->ep[0]->ep, HS_CTL_MAX_PACKET_SIZE); in fusb300_probe()
1464 fusb300->ep[0]->epnum = 0; in fusb300_probe()
1465 fusb300->gadget.ep0 = &fusb300->ep[0]->ep; in fusb300_probe()
1468 fusb300->ep0_req = fusb300_alloc_request(&fusb300->ep[0]->ep, in fusb300_probe()
1485 fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); in fusb300_probe()
1496 fusb300_free_request(&fusb300->ep[0]->ep, in fusb300_probe()
1499 kfree(fusb300->ep[i]); in fusb300_probe()