Lines Matching refs:ep
28 static void fotg210_disable_fifo_int(struct fotg210_ep *ep) in fotg210_disable_fifo_int() argument
30 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1); in fotg210_disable_fifo_int()
32 if (ep->dir_in) in fotg210_disable_fifo_int()
33 value |= DMISGR1_MF_IN_INT(ep->epnum - 1); in fotg210_disable_fifo_int()
35 value |= DMISGR1_MF_OUTSPK_INT(ep->epnum - 1); in fotg210_disable_fifo_int()
36 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1); in fotg210_disable_fifo_int()
39 static void fotg210_enable_fifo_int(struct fotg210_ep *ep) in fotg210_enable_fifo_int() argument
41 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1); in fotg210_enable_fifo_int()
43 if (ep->dir_in) in fotg210_enable_fifo_int()
44 value &= ~DMISGR1_MF_IN_INT(ep->epnum - 1); in fotg210_enable_fifo_int()
46 value &= ~DMISGR1_MF_OUTSPK_INT(ep->epnum - 1); in fotg210_enable_fifo_int()
47 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1); in fotg210_enable_fifo_int()
58 static void fotg210_done(struct fotg210_ep *ep, struct fotg210_request *req, in fotg210_done() argument
64 if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN) in fotg210_done()
69 spin_unlock(&ep->fotg210->lock); in fotg210_done()
70 usb_gadget_giveback_request(&ep->ep, &req->req); in fotg210_done()
71 spin_lock(&ep->fotg210->lock); in fotg210_done()
73 if (ep->epnum) { in fotg210_done()
74 if (list_empty(&ep->queue)) in fotg210_done()
75 fotg210_disable_fifo_int(ep); in fotg210_done()
77 fotg210_set_cxdone(ep->fotg210); in fotg210_done()
81 static void fotg210_fifo_ep_mapping(struct fotg210_ep *ep, u32 epnum, in fotg210_fifo_ep_mapping() argument
84 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_fifo_ep_mapping()
109 static void fotg210_set_fifo_dir(struct fotg210_ep *ep, u32 epnum, u32 dir_in) in fotg210_set_fifo_dir() argument
111 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_set_fifo_dir()
119 static void fotg210_set_tfrtype(struct fotg210_ep *ep, u32 epnum, u32 type) in fotg210_set_tfrtype() argument
121 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_set_tfrtype()
129 static void fotg210_set_mps(struct fotg210_ep *ep, u32 epnum, u32 mps, in fotg210_set_mps() argument
132 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_set_mps()
142 static int fotg210_config_ep(struct fotg210_ep *ep, in fotg210_config_ep() argument
145 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_config_ep()
147 fotg210_set_fifo_dir(ep, ep->epnum, ep->dir_in); in fotg210_config_ep()
148 fotg210_set_tfrtype(ep, ep->epnum, ep->type); in fotg210_config_ep()
149 fotg210_set_mps(ep, ep->epnum, ep->ep.maxpacket, ep->dir_in); in fotg210_config_ep()
150 fotg210_fifo_ep_mapping(ep, ep->epnum, ep->dir_in); in fotg210_config_ep()
152 fotg210->ep[ep->epnum] = ep; in fotg210_config_ep()
160 struct fotg210_ep *ep; in fotg210_ep_enable() local
162 ep = container_of(_ep, struct fotg210_ep, ep); in fotg210_ep_enable()
164 ep->desc = desc; in fotg210_ep_enable()
165 ep->epnum = usb_endpoint_num(desc); in fotg210_ep_enable()
166 ep->type = usb_endpoint_type(desc); in fotg210_ep_enable()
167 ep->dir_in = usb_endpoint_dir_in(desc); in fotg210_ep_enable()
168 ep->ep.maxpacket = usb_endpoint_maxp(desc); in fotg210_ep_enable()
170 return fotg210_config_ep(ep, desc); in fotg210_ep_enable()
175 struct fotg210_ep *ep = fotg210->ep[epnum]; in fotg210_reset_tseq() local
179 reg = (ep->dir_in) ? in fotg210_reset_tseq()
196 static int fotg210_ep_release(struct fotg210_ep *ep) in fotg210_ep_release() argument
198 if (!ep->epnum) in fotg210_ep_release()
200 ep->epnum = 0; in fotg210_ep_release()
201 ep->stall = 0; in fotg210_ep_release()
202 ep->wedged = 0; in fotg210_ep_release()
204 fotg210_reset_tseq(ep->fotg210, ep->epnum); in fotg210_ep_release()
211 struct fotg210_ep *ep; in fotg210_ep_disable() local
217 ep = container_of(_ep, struct fotg210_ep, ep); in fotg210_ep_disable()
219 while (!list_empty(&ep->queue)) { in fotg210_ep_disable()
220 req = list_entry(ep->queue.next, in fotg210_ep_disable()
222 spin_lock_irqsave(&ep->fotg210->lock, flags); in fotg210_ep_disable()
223 fotg210_done(ep, req, -ECONNRESET); in fotg210_ep_disable()
224 spin_unlock_irqrestore(&ep->fotg210->lock, flags); in fotg210_ep_disable()
227 return fotg210_ep_release(ep); in fotg210_ep_disable()
253 static void fotg210_enable_dma(struct fotg210_ep *ep, in fotg210_enable_dma() argument
257 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_enable_dma()
262 value |= DMACPSR1_DMA_LEN(len) | DMACPSR1_DMA_TYPE(ep->dir_in); in fotg210_enable_dma()
267 if (ep->epnum) in fotg210_enable_dma()
268 value |= DMATFNR_ACC_FN(ep->epnum - 1); in fotg210_enable_dma()
287 static void fotg210_disable_dma(struct fotg210_ep *ep) in fotg210_disable_dma() argument
289 iowrite32(DMATFNR_DISDMA, ep->fotg210->reg + FOTG210_DMATFNR); in fotg210_disable_dma()
292 static void fotg210_wait_dma_done(struct fotg210_ep *ep) in fotg210_wait_dma_done() argument
297 value = ioread32(ep->fotg210->reg + FOTG210_DISGR2); in fotg210_wait_dma_done()
304 iowrite32(value, ep->fotg210->reg + FOTG210_DISGR2); in fotg210_wait_dma_done()
308 value = ioread32(ep->fotg210->reg + FOTG210_DMACPSR1); in fotg210_wait_dma_done()
310 iowrite32(value, ep->fotg210->reg + FOTG210_DMACPSR1); in fotg210_wait_dma_done()
313 if (ep->epnum) { in fotg210_wait_dma_done()
314 value = ioread32(ep->fotg210->reg + in fotg210_wait_dma_done()
315 FOTG210_FIBCR(ep->epnum - 1)); in fotg210_wait_dma_done()
317 iowrite32(value, ep->fotg210->reg + in fotg210_wait_dma_done()
318 FOTG210_FIBCR(ep->epnum - 1)); in fotg210_wait_dma_done()
320 value = ioread32(ep->fotg210->reg + FOTG210_DCFESR); in fotg210_wait_dma_done()
322 iowrite32(value, ep->fotg210->reg + FOTG210_DCFESR); in fotg210_wait_dma_done()
326 static void fotg210_start_dma(struct fotg210_ep *ep, in fotg210_start_dma() argument
329 struct device *dev = &ep->fotg210->gadget.dev; in fotg210_start_dma()
334 if (ep->epnum) { in fotg210_start_dma()
335 if (ep->dir_in) { in fotg210_start_dma()
340 length = ioread32(ep->fotg210->reg + in fotg210_start_dma()
341 FOTG210_FIBCR(ep->epnum - 1)) & FIBCR_BCFX; in fotg210_start_dma()
347 if (req->req.length - req->req.actual > ep->ep.maxpacket) in fotg210_start_dma()
348 length = ep->ep.maxpacket; in fotg210_start_dma()
354 ep->dir_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); in fotg210_start_dma()
361 fotg210_enable_dma(ep, d, length); in fotg210_start_dma()
364 fotg210_wait_dma_done(ep); in fotg210_start_dma()
366 fotg210_disable_dma(ep); in fotg210_start_dma()
374 static void fotg210_ep0_queue(struct fotg210_ep *ep, in fotg210_ep0_queue() argument
378 fotg210_done(ep, req, 0); in fotg210_ep0_queue()
381 if (ep->dir_in) { /* if IN */ in fotg210_ep0_queue()
382 fotg210_start_dma(ep, req); in fotg210_ep0_queue()
384 fotg210_done(ep, req, 0); in fotg210_ep0_queue()
386 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR0); in fotg210_ep0_queue()
389 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR0); in fotg210_ep0_queue()
396 struct fotg210_ep *ep; in fotg210_ep_queue() local
401 ep = container_of(_ep, struct fotg210_ep, ep); in fotg210_ep_queue()
404 if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN) in fotg210_ep_queue()
407 spin_lock_irqsave(&ep->fotg210->lock, flags); in fotg210_ep_queue()
409 if (list_empty(&ep->queue)) in fotg210_ep_queue()
412 list_add_tail(&req->queue, &ep->queue); in fotg210_ep_queue()
417 if (!ep->epnum) /* ep0 */ in fotg210_ep_queue()
418 fotg210_ep0_queue(ep, req); in fotg210_ep_queue()
419 else if (request && !ep->stall) in fotg210_ep_queue()
420 fotg210_enable_fifo_int(ep); in fotg210_ep_queue()
422 spin_unlock_irqrestore(&ep->fotg210->lock, flags); in fotg210_ep_queue()
429 struct fotg210_ep *ep; in fotg210_ep_dequeue() local
433 ep = container_of(_ep, struct fotg210_ep, ep); in fotg210_ep_dequeue()
436 spin_lock_irqsave(&ep->fotg210->lock, flags); in fotg210_ep_dequeue()
437 if (!list_empty(&ep->queue)) in fotg210_ep_dequeue()
438 fotg210_done(ep, req, -ECONNRESET); in fotg210_ep_dequeue()
439 spin_unlock_irqrestore(&ep->fotg210->lock, flags); in fotg210_ep_dequeue()
444 static void fotg210_set_epnstall(struct fotg210_ep *ep) in fotg210_set_epnstall() argument
446 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_set_epnstall()
451 if (ep->dir_in) { in fotg210_set_epnstall()
454 } while (!(value & DCFESR_FIFO_EMPTY(ep->epnum - 1))); in fotg210_set_epnstall()
457 reg = (ep->dir_in) ? in fotg210_set_epnstall()
458 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : in fotg210_set_epnstall()
459 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); in fotg210_set_epnstall()
465 static void fotg210_clear_epnstall(struct fotg210_ep *ep) in fotg210_clear_epnstall() argument
467 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_clear_epnstall()
471 reg = (ep->dir_in) ? in fotg210_clear_epnstall()
472 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : in fotg210_clear_epnstall()
473 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); in fotg210_clear_epnstall()
481 struct fotg210_ep *ep; in fotg210_set_halt_and_wedge() local
485 ep = container_of(_ep, struct fotg210_ep, ep); in fotg210_set_halt_and_wedge()
487 fotg210 = ep->fotg210; in fotg210_set_halt_and_wedge()
489 spin_lock_irqsave(&ep->fotg210->lock, flags); in fotg210_set_halt_and_wedge()
492 fotg210_set_epnstall(ep); in fotg210_set_halt_and_wedge()
493 ep->stall = 1; in fotg210_set_halt_and_wedge()
495 ep->wedged = 1; in fotg210_set_halt_and_wedge()
497 fotg210_reset_tseq(fotg210, ep->epnum); in fotg210_set_halt_and_wedge()
498 fotg210_clear_epnstall(ep); in fotg210_set_halt_and_wedge()
499 ep->stall = 0; in fotg210_set_halt_and_wedge()
500 ep->wedged = 0; in fotg210_set_halt_and_wedge()
501 if (!list_empty(&ep->queue)) in fotg210_set_halt_and_wedge()
502 fotg210_enable_fifo_int(ep); in fotg210_set_halt_and_wedge()
505 spin_unlock_irqrestore(&ep->fotg210->lock, flags); in fotg210_set_halt_and_wedge()
654 fotg210_set_epnstall(fotg210->ep[epnum]); in fotg210_set_feature()
669 struct fotg210_ep *ep = in fotg210_clear_feature() local
670 fotg210->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK]; in fotg210_clear_feature()
681 if (ep->wedged) { in fotg210_clear_feature()
685 if (ep->stall) in fotg210_clear_feature()
686 fotg210_set_halt_and_wedge(&ep->ep, 0, 0); in fotg210_clear_feature()
696 static int fotg210_is_epnstall(struct fotg210_ep *ep) in fotg210_is_epnstall() argument
698 struct fotg210_udc *fotg210 = ep->fotg210; in fotg210_is_epnstall()
702 reg = (ep->dir_in) ? in fotg210_is_epnstall()
703 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : in fotg210_is_epnstall()
704 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); in fotg210_is_epnstall()
725 fotg210_is_epnstall(fotg210->ep[epnum]) in fotg210_get_status()
752 fotg210->ep[0]->dir_in = ctrl->bRequestType & USB_DIR_IN; in fotg210_setup_packet()
792 struct fotg210_ep *ep = fotg210->ep[0]; in fotg210_ep0out() local
794 if (!list_empty(&ep->queue) && !ep->dir_in) { in fotg210_ep0out()
797 req = list_first_entry(&ep->queue, in fotg210_ep0out()
801 fotg210_start_dma(ep, req); in fotg210_ep0out()
803 if ((req->req.length - req->req.actual) < ep->ep.maxpacket) in fotg210_ep0out()
804 fotg210_done(ep, req, 0); in fotg210_ep0out()
812 struct fotg210_ep *ep = fotg210->ep[0]; in fotg210_ep0in() local
814 if ((!list_empty(&ep->queue)) && (ep->dir_in)) { in fotg210_ep0in()
817 req = list_entry(ep->queue.next, in fotg210_ep0in()
821 fotg210_start_dma(ep, req); in fotg210_ep0in()
824 fotg210_done(ep, req, 0); in fotg210_ep0in()
838 static void fotg210_in_fifo_handler(struct fotg210_ep *ep) in fotg210_in_fifo_handler() argument
840 struct fotg210_request *req = list_entry(ep->queue.next, in fotg210_in_fifo_handler()
844 fotg210_start_dma(ep, req); in fotg210_in_fifo_handler()
845 fotg210_done(ep, req, 0); in fotg210_in_fifo_handler()
848 static void fotg210_out_fifo_handler(struct fotg210_ep *ep) in fotg210_out_fifo_handler() argument
850 struct fotg210_request *req = list_entry(ep->queue.next, in fotg210_out_fifo_handler()
852 int disgr1 = ioread32(ep->fotg210->reg + FOTG210_DISGR1); in fotg210_out_fifo_handler()
854 fotg210_start_dma(ep, req); in fotg210_out_fifo_handler()
861 (disgr1 & DISGR1_SPK_INT(ep->epnum - 1))) in fotg210_out_fifo_handler()
862 fotg210_done(ep, req, 0); in fotg210_out_fifo_handler()
982 fotg210_in_fifo_handler(fotg210->ep[fifo + 1]); in fotg210_irq()
986 fotg210_out_fifo_handler(fotg210->ep[fifo + 1]); in fotg210_irq()
1078 fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); in fotg210_udc_remove()
1080 kfree(fotg210->ep[i]); in fotg210_udc_remove()
1117 fotg210->ep[i] = _ep[i]; in fotg210_udc_probe()
1140 struct fotg210_ep *ep = fotg210->ep[i]; in fotg210_udc_probe() local
1143 INIT_LIST_HEAD(&fotg210->ep[i]->ep.ep_list); in fotg210_udc_probe()
1144 list_add_tail(&fotg210->ep[i]->ep.ep_list, in fotg210_udc_probe()
1147 ep->fotg210 = fotg210; in fotg210_udc_probe()
1148 INIT_LIST_HEAD(&ep->queue); in fotg210_udc_probe()
1149 ep->ep.name = fotg210_ep_name[i]; in fotg210_udc_probe()
1150 ep->ep.ops = &fotg210_ep_ops; in fotg210_udc_probe()
1151 usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); in fotg210_udc_probe()
1154 ep->ep.caps.type_control = true; in fotg210_udc_probe()
1156 ep->ep.caps.type_iso = true; in fotg210_udc_probe()
1157 ep->ep.caps.type_bulk = true; in fotg210_udc_probe()
1158 ep->ep.caps.type_int = true; in fotg210_udc_probe()
1161 ep->ep.caps.dir_in = true; in fotg210_udc_probe()
1162 ep->ep.caps.dir_out = true; in fotg210_udc_probe()
1164 usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40); in fotg210_udc_probe()
1165 fotg210->gadget.ep0 = &fotg210->ep[0]->ep; in fotg210_udc_probe()
1168 fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep, in fotg210_udc_probe()
1196 fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); in fotg210_udc_probe()
1203 kfree(fotg210->ep[i]); in fotg210_udc_probe()