Lines Matching full:ep

14  *  - Endpoint numbering is fixed: ep{1,2,3}-bulk
15 * - Gadget drivers can choose ep maxpacket (8/16/32/64)
94 struct goku_ep *ep; in goku_ep_enable() local
99 ep = container_of(_ep, struct goku_ep, ep); in goku_ep_enable()
103 dev = ep->dev; in goku_ep_enable()
104 if (ep == &dev->ep[0]) in goku_ep_enable()
108 if (ep->num != usb_endpoint_num(desc)) in goku_ep_enable()
119 if ((readl(ep->reg_status) & EPxSTATUS_EP_MASK) in goku_ep_enable()
147 ep->is_in = usb_endpoint_dir_in(desc); in goku_ep_enable()
148 if (ep->is_in) { in goku_ep_enable()
150 ep->dma = (use_dma != 0) && (ep->num == UDC_MSTRD_ENDPOINT); in goku_ep_enable()
152 ep->dma = (use_dma == 2) && (ep->num == UDC_MSTWR_ENDPOINT); in goku_ep_enable()
153 if (ep->dma) in goku_ep_enable()
155 ep->ep.name); in goku_ep_enable()
158 spin_lock_irqsave(&ep->dev->lock, flags); in goku_ep_enable()
161 if (ep->num < 3) { in goku_ep_enable()
162 struct goku_udc_regs __iomem *regs = ep->dev->regs; in goku_ep_enable()
166 tmp = ((ep->dma || !ep->is_in) in goku_ep_enable()
169 ) << ep->num; in goku_ep_enable()
173 tmp = (ep->dma ? 0x10/*dma*/ : 0x11/*pio*/) << ep->num; in goku_ep_enable()
177 writel(mode, ep->reg_mode); in goku_ep_enable()
178 command(ep->dev->regs, COMMAND_RESET, ep->num); in goku_ep_enable()
179 ep->ep.maxpacket = max; in goku_ep_enable()
180 ep->stopped = 0; in goku_ep_enable()
181 ep->ep.desc = desc; in goku_ep_enable()
182 spin_unlock_irqrestore(&ep->dev->lock, flags); in goku_ep_enable()
184 DBG(dev, "enable %s %s %s maxpacket %u\n", ep->ep.name, in goku_ep_enable()
185 ep->is_in ? "IN" : "OUT", in goku_ep_enable()
186 ep->dma ? "dma" : "pio", in goku_ep_enable()
192 static void ep_reset(struct goku_udc_regs __iomem *regs, struct goku_ep *ep) in ep_reset() argument
194 struct goku_udc *dev = ep->dev; in ep_reset()
197 command(regs, COMMAND_INVALID, ep->num); in ep_reset()
198 if (ep->num) { in ep_reset()
199 if (ep->num == UDC_MSTWR_ENDPOINT) in ep_reset()
202 else if (ep->num == UDC_MSTRD_ENDPOINT) in ep_reset()
204 dev->int_enable &= ~INT_EPxDATASET (ep->num); in ep_reset()
209 if (ep->num < 3) { in ep_reset()
210 struct goku_udc_regs __iomem *r = ep->dev->regs; in ep_reset()
214 tmp &= ~(0x11 << ep->num); in ep_reset()
218 tmp &= ~(0x11 << ep->num); in ep_reset()
222 if (ep->dma) { in ep_reset()
226 if (ep->num == UDC_MSTWR_ENDPOINT) { in ep_reset()
237 usb_ep_set_maxpacket_limit(&ep->ep, MAX_FIFO_SIZE); in ep_reset()
238 ep->ep.desc = NULL; in ep_reset()
239 ep->stopped = 1; in ep_reset()
240 ep->irqs = 0; in ep_reset()
241 ep->dma = 0; in ep_reset()
246 struct goku_ep *ep; in goku_ep_disable() local
250 ep = container_of(_ep, struct goku_ep, ep); in goku_ep_disable()
251 if (!_ep || !ep->ep.desc) in goku_ep_disable()
253 dev = ep->dev; in goku_ep_disable()
260 nuke(ep, -ESHUTDOWN); in goku_ep_disable()
261 ep_reset(dev->regs, ep); in goku_ep_disable()
300 done(struct goku_ep *ep, struct goku_request *req, int status) in done() argument
303 unsigned stopped = ep->stopped; in done()
312 dev = ep->dev; in done()
314 if (ep->dma) in done()
315 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); in done()
321 ep->ep.name, &req->req, status, in done()
325 ep->stopped = 1; in done()
327 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
329 ep->stopped = stopped; in done()
349 static int write_fifo(struct goku_ep *ep, struct goku_request *req) in write_fifo() argument
351 struct goku_udc *dev = ep->dev; in write_fifo()
361 dev = ep->dev; in write_fifo()
362 if (unlikely(ep->num == 0 && dev->ep0state != EP0_IN)) in write_fifo()
366 if (unlikely((tmp & DATASET_A(ep->num)) != 0)) in write_fifo()
370 if (ep->num != 0) in write_fifo()
371 writel(~INT_EPxDATASET(ep->num), &dev->regs->int_status); in write_fifo()
373 count = write_packet(ep->reg_fifo, buf, req, ep->ep.maxpacket); in write_fifo()
376 if (unlikely(count != ep->ep.maxpacket)) { in write_fifo()
377 writel(~(1<<ep->num), &dev->regs->EOP); in write_fifo()
378 if (ep->num == 0) { in write_fifo()
379 dev->ep[0].stopped = 1; in write_fifo()
393 ep->ep.name, count, is_last ? "/last" : "", in write_fifo()
401 done(ep, req, 0); in write_fifo()
408 static int read_fifo(struct goku_ep *ep, struct goku_request *req) in read_fifo() argument
415 regs = ep->dev->regs; in read_fifo()
420 if (unlikely(ep->num == 0 && ep->dev->ep0state != EP0_OUT)) in read_fifo()
423 dbuff = (ep->num == 1 || ep->num == 2); in read_fifo()
426 if (ep->num != 0) in read_fifo()
427 writel(~INT_EPxDATASET(ep->num), &regs->int_status); in read_fifo()
429 set = readl(&regs->DataSet) & DATASET_AB(ep->num); in read_fifo()
430 size = readl(&regs->EPxSizeLA[ep->num]); in read_fifo()
434 if (likely(ep->num != 0 || bufferspace != 0)) { in read_fifo()
439 size = readl(&regs->EPxSizeLB[ep->num]); in read_fifo()
450 is_short = (size < ep->ep.maxpacket); in read_fifo()
452 VDBG(ep->dev, "read %s %u bytes%s OUT req %p %u/%u\n", in read_fifo()
453 ep->ep.name, size, is_short ? "/S" : "", in read_fifo()
457 u8 byte = (u8) readl(ep->reg_fifo); in read_fifo()
465 DBG(ep->dev, "%s overflow %u\n", in read_fifo()
466 ep->ep.name, size); in read_fifo()
476 if (unlikely(ep->num == 0)) { in read_fifo()
478 if (ep->dev->req_config) in read_fifo()
479 writel(ep->dev->configured in read_fifo()
485 ep->stopped = 1; in read_fifo()
486 ep->dev->ep0state = EP0_STATUS; in read_fifo()
488 done(ep, req, 0); in read_fifo()
491 if (dbuff && !list_empty(&ep->queue)) { in read_fifo()
492 req = list_entry(ep->queue.next, in read_fifo()
521 pio_advance(struct goku_ep *ep) in pio_advance() argument
525 if (unlikely(list_empty (&ep->queue))) in pio_advance()
527 req = list_entry(ep->queue.next, struct goku_request, queue); in pio_advance()
528 (ep->is_in ? write_fifo : read_fifo)(ep, req); in pio_advance()
535 static int start_dma(struct goku_ep *ep, struct goku_request *req) in start_dma() argument
537 struct goku_udc_regs __iomem *regs = ep->dev->regs; in start_dma()
545 if (likely(ep->is_in)) { in start_dma()
547 DBG (ep->dev, "start, IN active dma %03x!!\n", in start_dma()
557 else if ((req->req.length % ep->ep.maxpacket) != 0 in start_dma()
563 ep->dev->int_enable |= INT_MSTRDEND; in start_dma()
572 DBG (ep->dev, "start, OUT active dma %03x!!\n", in start_dma()
582 ep->dev->int_enable |= INT_MSTWREND|INT_MSTWRTMOUT; in start_dma()
586 writel(ep->dev->int_enable, &regs->int_enable); in start_dma()
590 static void dma_advance(struct goku_udc *dev, struct goku_ep *ep) in dma_advance() argument
593 struct goku_udc_regs __iomem *regs = ep->dev->regs; in dma_advance()
598 if (unlikely(list_empty(&ep->queue))) { in dma_advance()
600 if (ep->is_in) in dma_advance()
607 req = list_entry(ep->queue.next, struct goku_request, queue); in dma_advance()
610 if (likely(ep->is_in)) { in dma_advance()
628 ep->ep.name, ep->is_in ? "IN" : "OUT", in dma_advance()
631 done(ep, req, 0); in dma_advance()
632 if (list_empty(&ep->queue)) in dma_advance()
634 req = list_entry(ep->queue.next, struct goku_request, queue); in dma_advance()
635 (void) start_dma(ep, req); in dma_advance()
638 static void abort_dma(struct goku_ep *ep, int status) in abort_dma() argument
640 struct goku_udc_regs __iomem *regs = ep->dev->regs; in abort_dma()
651 command(regs, COMMAND_FIFO_DISABLE, ep->num); in abort_dma()
652 req = list_entry(ep->queue.next, struct goku_request, queue); in abort_dma()
660 if (ep->is_in) { in abort_dma()
673 DBG(ep->dev, "IN dma active after reset!\n"); in abort_dma()
688 DBG(ep->dev, "OUT dma active after reset!\n"); in abort_dma()
693 VDBG(ep->dev, "%s %s %s %d/%d\n", __func__, ep->ep.name, in abort_dma()
694 ep->is_in ? "IN" : "OUT", in abort_dma()
697 command(regs, COMMAND_FIFO_ENABLE, ep->num); in abort_dma()
703 command(regs, COMMAND_FIFO_ENABLE, ep->num); in abort_dma()
714 struct goku_ep *ep; in goku_queue() local
724 ep = container_of(_ep, struct goku_ep, ep); in goku_queue()
725 if (unlikely(!_ep || (!ep->ep.desc && ep->num != 0))) in goku_queue()
727 dev = ep->dev; in goku_queue()
736 if (ep->dma) { in goku_queue()
738 ep->is_in); in goku_queue()
756 if (unlikely(ep->num == 0 && ep->is_in)) in goku_queue()
761 if (list_empty(&ep->queue) && likely(!ep->stopped)) { in goku_queue()
765 if (ep->dma) in goku_queue()
766 status = start_dma(ep, req); in goku_queue()
768 status = (ep->is_in ? write_fifo : read_fifo)(ep, req); in goku_queue()
779 list_add_tail(&req->queue, &ep->queue); in goku_queue()
781 if (likely(!list_empty(&ep->queue)) in goku_queue()
782 && likely(ep->num != 0) in goku_queue()
783 && !ep->dma in goku_queue()
784 && !(dev->int_enable & INT_EPxDATASET (ep->num))) in goku_queue()
785 pio_irq_enable(dev, dev->regs, ep->num); in goku_queue()
794 static void nuke(struct goku_ep *ep, int status) in nuke() argument
798 ep->stopped = 1; in nuke()
799 if (list_empty(&ep->queue)) in nuke()
801 if (ep->dma) in nuke()
802 abort_dma(ep, status); in nuke()
803 while (!list_empty(&ep->queue)) { in nuke()
804 req = list_entry(ep->queue.next, struct goku_request, queue); in nuke()
805 done(ep, req, status); in nuke()
813 struct goku_ep *ep; in goku_dequeue() local
817 ep = container_of(_ep, struct goku_ep, ep); in goku_dequeue()
818 if (!_ep || !_req || (!ep->ep.desc && ep->num != 0)) in goku_dequeue()
820 dev = ep->dev; in goku_dequeue()
829 ep->is_in ? "IN" : "OUT", in goku_dequeue()
830 ep->dma ? "dma" : "pio", in goku_dequeue()
836 list_for_each_entry(iter, &ep->queue, queue) { in goku_dequeue()
847 if (ep->dma && ep->queue.next == &req->queue && !ep->stopped) { in goku_dequeue()
848 abort_dma(ep, -ECONNRESET); in goku_dequeue()
849 done(ep, req, -ECONNRESET); in goku_dequeue()
850 dma_advance(dev, ep); in goku_dequeue()
852 done(ep, req, -ECONNRESET); in goku_dequeue()
862 static void goku_clear_halt(struct goku_ep *ep) in goku_clear_halt() argument
864 // assert (ep->num !=0) in goku_clear_halt()
865 VDBG(ep->dev, "%s clear halt\n", ep->ep.name); in goku_clear_halt()
866 command(ep->dev->regs, COMMAND_SETDATA0, ep->num); in goku_clear_halt()
867 command(ep->dev->regs, COMMAND_STALL_CLEAR, ep->num); in goku_clear_halt()
868 if (ep->stopped) { in goku_clear_halt()
869 ep->stopped = 0; in goku_clear_halt()
870 if (ep->dma) { in goku_clear_halt()
873 if (list_empty(&ep->queue)) in goku_clear_halt()
875 req = list_entry(ep->queue.next, struct goku_request, in goku_clear_halt()
877 (void) start_dma(ep, req); in goku_clear_halt()
879 pio_advance(ep); in goku_clear_halt()
885 struct goku_ep *ep; in goku_set_halt() local
891 ep = container_of (_ep, struct goku_ep, ep); in goku_set_halt()
893 if (ep->num == 0) { in goku_set_halt()
895 ep->dev->ep0state = EP0_STALL; in goku_set_halt()
896 ep->dev->ep[0].stopped = 1; in goku_set_halt()
901 } else if (!ep->ep.desc) { in goku_set_halt()
902 DBG(ep->dev, "%s %s inactive?\n", __func__, ep->ep.name); in goku_set_halt()
906 spin_lock_irqsave(&ep->dev->lock, flags); in goku_set_halt()
907 if (!list_empty(&ep->queue)) in goku_set_halt()
909 else if (ep->is_in && value in goku_set_halt()
911 && (readl(&ep->dev->regs->DataSet) in goku_set_halt()
912 & DATASET_AB(ep->num))) in goku_set_halt()
915 goku_clear_halt(ep); in goku_set_halt()
917 ep->stopped = 1; in goku_set_halt()
918 VDBG(ep->dev, "%s set halt\n", ep->ep.name); in goku_set_halt()
919 command(ep->dev->regs, COMMAND_STALL, ep->num); in goku_set_halt()
920 readl(ep->reg_status); in goku_set_halt()
922 spin_unlock_irqrestore(&ep->dev->lock, flags); in goku_set_halt()
928 struct goku_ep *ep; in goku_fifo_status() local
934 ep = container_of(_ep, struct goku_ep, ep); in goku_fifo_status()
937 if (ep->is_in) in goku_fifo_status()
941 regs = ep->dev->regs; in goku_fifo_status()
942 size = readl(&regs->EPxSizeLA[ep->num]) & DATASIZE; in goku_fifo_status()
943 size += readl(&regs->EPxSizeLB[ep->num]) & DATASIZE; in goku_fifo_status()
944 VDBG(ep->dev, "%s %s %u\n", __func__, ep->ep.name, size); in goku_fifo_status()
950 struct goku_ep *ep; in goku_fifo_flush() local
956 ep = container_of(_ep, struct goku_ep, ep); in goku_fifo_flush()
957 VDBG(ep->dev, "%s %s\n", __func__, ep->ep.name); in goku_fifo_flush()
960 if (!ep->ep.desc && ep->num != 0) { in goku_fifo_flush()
961 DBG(ep->dev, "%s %s inactive?\n", __func__, ep->ep.name); in goku_fifo_flush()
965 regs = ep->dev->regs; in goku_fifo_flush()
966 size = readl(&regs->EPxSizeLA[ep->num]); in goku_fifo_flush()
971 * the bytes out (PIO, if !ep->dma); for in, no choice. in goku_fifo_flush()
974 command(regs, COMMAND_FIFO_CLEAR, ep->num); in goku_fifo_flush()
1004 struct usb_ep *ep; in goku_match_ep() local
1009 ep = &dev->ep[3].ep; in goku_match_ep()
1010 if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp)) in goku_match_ep()
1011 return ep; in goku_match_ep()
1016 ep = &dev->ep[2].ep; in goku_match_ep()
1017 if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp)) in goku_match_ep()
1018 return ep; in goku_match_ep()
1199 struct goku_ep *ep = &dev->ep [i]; in udc_proc_read() local
1202 if (i && !ep->ep.desc) in udc_proc_read()
1205 tmp = readl(ep->reg_status); in udc_proc_read()
1207 ep->ep.name, in udc_proc_read()
1208 ep->is_in ? "in" : "out", in udc_proc_read()
1209 ep->ep.maxpacket, in udc_proc_read()
1210 ep->dma ? "dma" : "pio", in udc_proc_read()
1211 ep->irqs, in udc_proc_read()
1220 if (list_empty(&ep->queue)) { in udc_proc_read()
1226 list_for_each_entry(req, &ep->queue, queue) { in udc_proc_read()
1227 if (ep->dma && req->queue.prev == &ep->queue) { in udc_proc_read()
1260 dev->gadget.ep0 = &dev->ep [0].ep; in udc_reinit()
1266 struct goku_ep *ep = &dev->ep[i]; in udc_reinit() local
1268 ep->num = i; in udc_reinit()
1269 ep->ep.name = names[i]; in udc_reinit()
1270 ep->reg_fifo = &dev->regs->ep_fifo [i]; in udc_reinit()
1271 ep->reg_status = &dev->regs->ep_status [i]; in udc_reinit()
1272 ep->reg_mode = &dev->regs->ep_mode[i]; in udc_reinit()
1274 ep->ep.ops = &goku_ep_ops; in udc_reinit()
1275 list_add_tail (&ep->ep.ep_list, &dev->gadget.ep_list); in udc_reinit()
1276 ep->dev = dev; in udc_reinit()
1277 INIT_LIST_HEAD (&ep->queue); in udc_reinit()
1279 ep_reset(NULL, ep); in udc_reinit()
1282 ep->ep.caps.type_control = true; in udc_reinit()
1284 ep->ep.caps.type_bulk = true; in udc_reinit()
1286 ep->ep.caps.dir_in = true; in udc_reinit()
1287 ep->ep.caps.dir_out = true; in udc_reinit()
1290 dev->ep[0].reg_mode = NULL; in udc_reinit()
1291 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, MAX_EP0_SIZE); in udc_reinit()
1292 list_del_init (&dev->ep[0].ep.ep_list); in udc_reinit()
1331 dev->ep[i].irqs = 0; in ep0_start()
1398 nuke(&dev->ep [i], -ESHUTDOWN); in stop_activity()
1436 nuke(&dev->ep[0], 0); in ep0_setup()
1437 dev->ep[0].stopped = 0; in ep0_setup()
1439 dev->ep[0].is_in = 1; in ep0_setup()
1444 dev->ep[0].is_in = 0; in ep0_setup()
1458 (!dev->ep[tmp].ep.desc && tmp != 0)) in ep0_setup()
1462 if (!dev->ep[tmp].is_in) in ep0_setup()
1465 if (dev->ep[tmp].is_in) in ep0_setup()
1472 goku_clear_halt(&dev->ep[tmp]); in ep0_setup()
1476 dev->ep[0].stopped = 1; in ep0_setup()
1522 dev->ep[0].stopped = 1; in ep0_setup()
1539 struct goku_ep *ep; in goku_irq() local
1629 dev->ep[0].irqs++; in goku_irq()
1635 ep = &dev->ep[0]; in goku_irq()
1636 ep->irqs++; in goku_irq()
1637 nuke(ep, 0); in goku_irq()
1644 ep = &dev->ep[0]; in goku_irq()
1645 ep->irqs++; in goku_irq()
1646 pio_advance(ep); in goku_irq()
1652 ep = &dev->ep[UDC_MSTRD_ENDPOINT]; in goku_irq()
1653 ep->irqs++; in goku_irq()
1654 dma_advance(dev, ep); in goku_irq()
1658 ep = &dev->ep[UDC_MSTWR_ENDPOINT]; in goku_irq()
1659 ep->irqs++; in goku_irq()
1660 dma_advance(dev, ep); in goku_irq()
1664 ep = &dev->ep[UDC_MSTWR_ENDPOINT]; in goku_irq()
1665 ep->irqs++; in goku_irq()
1666 ERROR(dev, "%s write timeout ?\n", ep->ep.name); in goku_irq()
1676 ep = &dev->ep[i]; in goku_irq()
1677 pio_advance(ep); in goku_irq()
1678 if (list_empty (&ep->queue)) in goku_irq()
1682 ep->irqs++; in goku_irq()