Lines Matching refs:ep

36 static void done(struct fusb300_ep *ep, struct fusb300_request *req,
58 static void fusb300_ep_setting(struct fusb300_ep *ep, in fusb300_ep_setting() argument
61 ep->epnum = info.epnum; in fusb300_ep_setting()
62 ep->type = info.type; in fusb300_ep_setting()
65 static int fusb300_ep_release(struct fusb300_ep *ep) in fusb300_ep_release() argument
67 if (!ep->epnum) in fusb300_ep_release()
69 ep->epnum = 0; in fusb300_ep_release()
70 ep->stall = 0; in fusb300_ep_release()
71 ep->wedged = 0; in fusb300_ep_release()
76 u32 ep) in fusb300_set_fifo_entry() argument
78 u32 val = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_fifo_entry()
82 iowrite32(val, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_fifo_entry()
86 u8 ep) in fusb300_set_start_entry() argument
88 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_start_entry()
93 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_start_entry()
146 u8 ep) in fusb300_set_ep_active() argument
148 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_ep_active()
151 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET1(ep)); in fusb300_set_ep_active()
200 static int config_ep(struct fusb300_ep *ep, in config_ep() argument
203 struct fusb300 *fusb300 = ep->fusb300; in config_ep()
206 ep->ep.desc = desc; in config_ep()
228 fusb300_ep_setting(ep, info); in config_ep()
230 fusb300->ep[info.epnum] = ep; in config_ep()
238 struct fusb300_ep *ep; in fusb300_enable() local
240 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_enable()
242 if (ep->fusb300->reenum) { in fusb300_enable()
243 ep->fusb300->fifo_entry_num = 0; in fusb300_enable()
244 ep->fusb300->addrofs = 0; in fusb300_enable()
245 ep->fusb300->reenum = 0; in fusb300_enable()
248 return config_ep(ep, desc); in fusb300_enable()
253 struct fusb300_ep *ep; in fusb300_disable() local
257 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_disable()
259 BUG_ON(!ep); in fusb300_disable()
261 while (!list_empty(&ep->queue)) { in fusb300_disable()
262 req = list_entry(ep->queue.next, struct fusb300_request, queue); in fusb300_disable()
263 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_disable()
264 done(ep, req, -ECONNRESET); in fusb300_disable()
265 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_disable()
268 return fusb300_ep_release(ep); in fusb300_disable()
292 static int enable_fifo_int(struct fusb300_ep *ep) in enable_fifo_int() argument
294 struct fusb300 *fusb300 = ep->fusb300; in enable_fifo_int()
296 if (ep->epnum) { in enable_fifo_int()
298 FUSB300_IGER0_EEPn_FIFO_INT(ep->epnum)); in enable_fifo_int()
307 static int disable_fifo_int(struct fusb300_ep *ep) in disable_fifo_int() argument
309 struct fusb300 *fusb300 = ep->fusb300; in disable_fifo_int()
311 if (ep->epnum) { in disable_fifo_int()
313 FUSB300_IGER0_EEPn_FIFO_INT(ep->epnum)); in disable_fifo_int()
333 static void fusb300_wrcxf(struct fusb300_ep *ep, in fusb300_wrcxf() argument
339 struct fusb300 *fusb300 = ep->fusb300; in fusb300_wrcxf()
385 static void fusb300_set_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_set_epnstall() argument
387 fusb300_enable_bit(fusb300, FUSB300_OFFSET_EPSET0(ep), in fusb300_set_epnstall()
391 static void fusb300_clear_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_clear_epnstall() argument
393 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_clear_epnstall()
396 printk(KERN_DEBUG "EP%d stall... Clear!!\n", ep); in fusb300_clear_epnstall()
398 iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_clear_epnstall()
402 static void ep0_queue(struct fusb300_ep *ep, struct fusb300_request *req) in ep0_queue() argument
404 if (ep->fusb300->ep0_dir) { /* if IN */ in ep0_queue()
406 fusb300_wrcxf(ep, req); in ep0_queue()
411 (req->req.actual < ep->ep.maxpacket)) in ep0_queue()
412 done(ep, req, 0); in ep0_queue()
415 done(ep, req, 0); in ep0_queue()
417 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER1, in ep0_queue()
425 struct fusb300_ep *ep; in fusb300_queue() local
430 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_queue()
433 if (ep->fusb300->gadget.speed == USB_SPEED_UNKNOWN) in fusb300_queue()
436 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_queue()
438 if (list_empty(&ep->queue)) in fusb300_queue()
441 list_add_tail(&req->queue, &ep->queue); in fusb300_queue()
446 if (ep->ep.desc == NULL) /* ep0 */ in fusb300_queue()
447 ep0_queue(ep, req); in fusb300_queue()
448 else if (request && !ep->stall) in fusb300_queue()
449 enable_fifo_int(ep); in fusb300_queue()
451 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_queue()
458 struct fusb300_ep *ep; in fusb300_dequeue() local
462 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_dequeue()
465 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_dequeue()
466 if (!list_empty(&ep->queue)) in fusb300_dequeue()
467 done(ep, req, -ECONNRESET); in fusb300_dequeue()
468 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_dequeue()
475 struct fusb300_ep *ep; in fusb300_set_halt_and_wedge() local
480 ep = container_of(_ep, struct fusb300_ep, ep); in fusb300_set_halt_and_wedge()
482 fusb300 = ep->fusb300; in fusb300_set_halt_and_wedge()
484 spin_lock_irqsave(&ep->fusb300->lock, flags); in fusb300_set_halt_and_wedge()
486 if (!list_empty(&ep->queue)) { in fusb300_set_halt_and_wedge()
492 fusb300_set_epnstall(fusb300, ep->epnum); in fusb300_set_halt_and_wedge()
493 ep->stall = 1; in fusb300_set_halt_and_wedge()
495 ep->wedged = 1; in fusb300_set_halt_and_wedge()
497 fusb300_clear_epnstall(fusb300, ep->epnum); in fusb300_set_halt_and_wedge()
498 ep->stall = 0; in fusb300_set_halt_and_wedge()
499 ep->wedged = 0; in fusb300_set_halt_and_wedge()
503 spin_unlock_irqrestore(&ep->fusb300->lock, flags); in fusb300_set_halt_and_wedge()
603 static void fusb300_rdfifo(struct fusb300_ep *ep, in fusb300_rdfifo() argument
610 struct fusb300 *fusb300 = ep->fusb300; in fusb300_rdfifo()
620 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
631 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
636 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
642 FUSB300_OFFSET_EPPORT(ep->epnum)); in fusb300_rdfifo()
660 static u8 fusb300_get_epnstall(struct fusb300 *fusb300, u8 ep) in fusb300_get_epnstall() argument
663 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); in fusb300_get_epnstall()
690 u8 ep; in get_status() local
702 ep = w_index & USB_ENDPOINT_NUMBER_MASK; in get_status()
703 if (ep) { in get_status()
704 if (fusb300_get_epnstall(fusb300, ep)) in get_status()
728 u8 ep; in set_feature() local
740 ep = w_index & USB_ENDPOINT_NUMBER_MASK; in set_feature()
741 if (ep) in set_feature()
742 fusb300_set_epnstall(fusb300, ep); in set_feature()
754 static void fusb300_clear_seqnum(struct fusb300 *fusb300, u8 ep) in fusb300_clear_seqnum() argument
756 fusb300_enable_bit(fusb300, FUSB300_OFFSET_EPSET0(ep), in fusb300_clear_seqnum()
762 struct fusb300_ep *ep = in clear_feature() local
763 fusb300->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK]; in clear_feature()
774 if (ep->wedged) { in clear_feature()
778 if (ep->stall) { in clear_feature()
779 ep->stall = 0; in clear_feature()
780 fusb300_clear_seqnum(fusb300, ep->epnum); in clear_feature()
781 fusb300_clear_epnstall(fusb300, ep->epnum); in clear_feature()
782 if (!list_empty(&ep->queue)) in clear_feature()
783 enable_fifo_int(ep); in clear_feature()
867 static void done(struct fusb300_ep *ep, struct fusb300_request *req, in done() argument
873 if (ep->fusb300->gadget.speed == USB_SPEED_UNKNOWN) in done()
878 spin_unlock(&ep->fusb300->lock); in done()
879 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
880 spin_lock(&ep->fusb300->lock); in done()
882 if (ep->epnum) { in done()
883 disable_fifo_int(ep); in done()
884 if (!list_empty(&ep->queue)) in done()
885 enable_fifo_int(ep); in done()
887 fusb300_set_cxdone(ep->fusb300); in done()
890 static void fusb300_fill_idma_prdtbl(struct fusb300_ep *ep, dma_addr_t d, in fusb300_fill_idma_prdtbl() argument
898 reg = ioread32(ep->fusb300->reg + in fusb300_fill_idma_prdtbl()
899 FUSB300_OFFSET_EPPRD_W0(ep->epnum)); in fusb300_fill_idma_prdtbl()
903 iowrite32(d, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W1(ep->epnum)); in fusb300_fill_idma_prdtbl()
907 iowrite32(value, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W0(ep->epnum)); in fusb300_fill_idma_prdtbl()
909 iowrite32(0x0, ep->fusb300->reg + FUSB300_OFFSET_EPPRD_W2(ep->epnum)); in fusb300_fill_idma_prdtbl()
911 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_EPPRDRDY, in fusb300_fill_idma_prdtbl()
912 FUSB300_EPPRDR_EP_PRD_RDY(ep->epnum)); in fusb300_fill_idma_prdtbl()
915 static void fusb300_wait_idma_finished(struct fusb300_ep *ep) in fusb300_wait_idma_finished() argument
920 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGR1); in fusb300_wait_idma_finished()
927 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGR0); in fusb300_wait_idma_finished()
928 reg &= FUSB300_IGR0_EPn_PRD_INT(ep->epnum); in fusb300_wait_idma_finished()
931 fusb300_clear_int(ep->fusb300, FUSB300_OFFSET_IGR0, in fusb300_wait_idma_finished()
932 FUSB300_IGR0_EPn_PRD_INT(ep->epnum)); in fusb300_wait_idma_finished()
936 reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGER0); in fusb300_wait_idma_finished()
937 reg &= ~FUSB300_IGER0_EEPn_PRD_INT(ep->epnum); in fusb300_wait_idma_finished()
938 iowrite32(reg, ep->fusb300->reg + FUSB300_OFFSET_IGER0); in fusb300_wait_idma_finished()
941 static void fusb300_set_idma(struct fusb300_ep *ep, in fusb300_set_idma() argument
946 ret = usb_gadget_map_request(&ep->fusb300->gadget, in fusb300_set_idma()
951 fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER0, in fusb300_set_idma()
952 FUSB300_IGER0_EEPn_PRD_INT(ep->epnum)); in fusb300_set_idma()
954 fusb300_fill_idma_prdtbl(ep, req->req.dma, req->req.length); in fusb300_set_idma()
956 fusb300_wait_idma_finished(ep); in fusb300_set_idma()
958 usb_gadget_unmap_request(&ep->fusb300->gadget, in fusb300_set_idma()
962 static void in_ep_fifo_handler(struct fusb300_ep *ep) in in_ep_fifo_handler() argument
964 struct fusb300_request *req = list_entry(ep->queue.next, in in_ep_fifo_handler()
968 fusb300_set_idma(ep, req); in in_ep_fifo_handler()
969 done(ep, req, 0); in in_ep_fifo_handler()
972 static void out_ep_fifo_handler(struct fusb300_ep *ep) in out_ep_fifo_handler() argument
974 struct fusb300 *fusb300 = ep->fusb300; in out_ep_fifo_handler()
975 struct fusb300_request *req = list_entry(ep->queue.next, in out_ep_fifo_handler()
977 u32 reg = ioread32(fusb300->reg + FUSB300_OFFSET_EPFFR(ep->epnum)); in out_ep_fifo_handler()
980 fusb300_rdfifo(ep, req, length); in out_ep_fifo_handler()
983 if ((req->req.length == req->req.actual) || (length < ep->ep.maxpacket)) in out_ep_fifo_handler()
984 done(ep, req, 0); in out_ep_fifo_handler()
1011 struct fusb300_ep *ep = fusb300->ep[0]; in fusb300_ep0out() local
1014 if (!list_empty(&ep->queue)) { in fusb300_ep0out()
1017 req = list_first_entry(&ep->queue, in fusb300_ep0out()
1020 fusb300_rdcxf(ep->fusb300, req->req.buf, in fusb300_ep0out()
1022 done(ep, req, 0); in fusb300_ep0out()
1033 struct fusb300_ep *ep = fusb300->ep[0]; in fusb300_ep0in() local
1035 if ((!list_empty(&ep->queue)) && (fusb300->ep0_dir)) { in fusb300_ep0in()
1036 req = list_entry(ep->queue.next, in fusb300_ep0in()
1039 fusb300_wrcxf(ep, req); in fusb300_ep0in()
1040 if ((req->req.length - req->req.actual) < ep->ep.maxpacket) in fusb300_ep0in()
1041 done(ep, req, 0); in fusb300_ep0in()
1247 in_ep_fifo_handler(fusb300->ep[i]); in fusb300_irq()
1249 out_ep_fifo_handler(fusb300->ep[i]); in fusb300_irq()
1353 fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); in fusb300_remove()
1411 fusb300->ep[i] = _ep[i]; in fusb300_probe()
1441 struct fusb300_ep *ep = fusb300->ep[i]; in fusb300_probe() local
1444 INIT_LIST_HEAD(&fusb300->ep[i]->ep.ep_list); in fusb300_probe()
1445 list_add_tail(&fusb300->ep[i]->ep.ep_list, in fusb300_probe()
1448 ep->fusb300 = fusb300; in fusb300_probe()
1449 INIT_LIST_HEAD(&ep->queue); in fusb300_probe()
1450 ep->ep.name = fusb300_ep_name[i]; in fusb300_probe()
1451 ep->ep.ops = &fusb300_ep_ops; in fusb300_probe()
1452 usb_ep_set_maxpacket_limit(&ep->ep, HS_BULK_MAX_PACKET_SIZE); in fusb300_probe()
1455 ep->ep.caps.type_control = true; in fusb300_probe()
1457 ep->ep.caps.type_iso = true; in fusb300_probe()
1458 ep->ep.caps.type_bulk = true; in fusb300_probe()
1459 ep->ep.caps.type_int = true; in fusb300_probe()
1462 ep->ep.caps.dir_in = true; in fusb300_probe()
1463 ep->ep.caps.dir_out = true; in fusb300_probe()
1465 usb_ep_set_maxpacket_limit(&fusb300->ep[0]->ep, HS_CTL_MAX_PACKET_SIZE); in fusb300_probe()
1466 fusb300->ep[0]->epnum = 0; in fusb300_probe()
1467 fusb300->gadget.ep0 = &fusb300->ep[0]->ep; in fusb300_probe()
1470 fusb300->ep0_req = fusb300_alloc_request(&fusb300->ep[0]->ep, in fusb300_probe()
1487 fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); in fusb300_probe()
1495 fusb300_free_request(&fusb300->ep[0]->ep, in fusb300_probe()