Lines Matching refs:ep
97 struct goku_ep *ep; in goku_ep_enable() local
102 ep = container_of(_ep, struct goku_ep, ep); in goku_ep_enable()
106 dev = ep->dev; in goku_ep_enable()
107 if (ep == &dev->ep[0]) in goku_ep_enable()
111 if (ep->num != usb_endpoint_num(desc)) in goku_ep_enable()
122 if ((readl(ep->reg_status) & EPxSTATUS_EP_MASK) in goku_ep_enable()
143 ep->is_in = usb_endpoint_dir_in(desc); in goku_ep_enable()
144 if (ep->is_in) { in goku_ep_enable()
146 ep->dma = (use_dma != 0) && (ep->num == UDC_MSTRD_ENDPOINT); in goku_ep_enable()
148 ep->dma = (use_dma == 2) && (ep->num == UDC_MSTWR_ENDPOINT); in goku_ep_enable()
149 if (ep->dma) in goku_ep_enable()
151 ep->ep.name); in goku_ep_enable()
154 spin_lock_irqsave(&ep->dev->lock, flags); in goku_ep_enable()
157 if (ep->num < 3) { in goku_ep_enable()
158 struct goku_udc_regs __iomem *regs = ep->dev->regs; in goku_ep_enable()
162 tmp = ((ep->dma || !ep->is_in) in goku_ep_enable()
165 ) << ep->num; in goku_ep_enable()
169 tmp = (ep->dma ? 0x10/*dma*/ : 0x11/*pio*/) << ep->num; in goku_ep_enable()
173 writel(mode, ep->reg_mode); in goku_ep_enable()
174 command(ep->dev->regs, COMMAND_RESET, ep->num); in goku_ep_enable()
175 ep->ep.maxpacket = max; in goku_ep_enable()
176 ep->stopped = 0; in goku_ep_enable()
177 ep->ep.desc = desc; in goku_ep_enable()
178 spin_unlock_irqrestore(&ep->dev->lock, flags); in goku_ep_enable()
180 DBG(dev, "enable %s %s %s maxpacket %u\n", ep->ep.name, in goku_ep_enable()
181 ep->is_in ? "IN" : "OUT", in goku_ep_enable()
182 ep->dma ? "dma" : "pio", in goku_ep_enable()
188 static void ep_reset(struct goku_udc_regs __iomem *regs, struct goku_ep *ep) in ep_reset() argument
190 struct goku_udc *dev = ep->dev; in ep_reset()
193 command(regs, COMMAND_INVALID, ep->num); in ep_reset()
194 if (ep->num) { in ep_reset()
195 if (ep->num == UDC_MSTWR_ENDPOINT) in ep_reset()
198 else if (ep->num == UDC_MSTRD_ENDPOINT) in ep_reset()
200 dev->int_enable &= ~INT_EPxDATASET (ep->num); in ep_reset()
205 if (ep->num < 3) { in ep_reset()
206 struct goku_udc_regs __iomem *r = ep->dev->regs; in ep_reset()
210 tmp &= ~(0x11 << ep->num); in ep_reset()
214 tmp &= ~(0x11 << ep->num); in ep_reset()
218 if (ep->dma) { in ep_reset()
222 if (ep->num == UDC_MSTWR_ENDPOINT) { in ep_reset()
233 usb_ep_set_maxpacket_limit(&ep->ep, MAX_FIFO_SIZE); in ep_reset()
234 ep->ep.desc = NULL; in ep_reset()
235 ep->stopped = 1; in ep_reset()
236 ep->irqs = 0; in ep_reset()
237 ep->dma = 0; in ep_reset()
242 struct goku_ep *ep; in goku_ep_disable() local
246 ep = container_of(_ep, struct goku_ep, ep); in goku_ep_disable()
247 if (!_ep || !ep->ep.desc) in goku_ep_disable()
249 dev = ep->dev; in goku_ep_disable()
256 nuke(ep, -ESHUTDOWN); in goku_ep_disable()
257 ep_reset(dev->regs, ep); in goku_ep_disable()
296 done(struct goku_ep *ep, struct goku_request *req, int status) in done() argument
299 unsigned stopped = ep->stopped; in done()
308 dev = ep->dev; in done()
310 if (ep->dma) in done()
311 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); in done()
317 ep->ep.name, &req->req, status, in done()
321 ep->stopped = 1; in done()
323 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
325 ep->stopped = stopped; in done()
345 static int write_fifo(struct goku_ep *ep, struct goku_request *req) in write_fifo() argument
347 struct goku_udc *dev = ep->dev; in write_fifo()
357 dev = ep->dev; in write_fifo()
358 if (unlikely(ep->num == 0 && dev->ep0state != EP0_IN)) in write_fifo()
362 if (unlikely((tmp & DATASET_A(ep->num)) != 0)) in write_fifo()
366 if (ep->num != 0) in write_fifo()
367 writel(~INT_EPxDATASET(ep->num), &dev->regs->int_status); in write_fifo()
369 count = write_packet(ep->reg_fifo, buf, req, ep->ep.maxpacket); in write_fifo()
372 if (unlikely(count != ep->ep.maxpacket)) { in write_fifo()
373 writel(~(1<<ep->num), &dev->regs->EOP); in write_fifo()
374 if (ep->num == 0) { in write_fifo()
375 dev->ep[0].stopped = 1; in write_fifo()
389 ep->ep.name, count, is_last ? "/last" : "", in write_fifo()
397 done(ep, req, 0); in write_fifo()
404 static int read_fifo(struct goku_ep *ep, struct goku_request *req) in read_fifo() argument
411 regs = ep->dev->regs; in read_fifo()
416 if (unlikely(ep->num == 0 && ep->dev->ep0state != EP0_OUT)) in read_fifo()
419 dbuff = (ep->num == 1 || ep->num == 2); in read_fifo()
422 if (ep->num != 0) in read_fifo()
423 writel(~INT_EPxDATASET(ep->num), ®s->int_status); in read_fifo()
425 set = readl(®s->DataSet) & DATASET_AB(ep->num); in read_fifo()
426 size = readl(®s->EPxSizeLA[ep->num]); in read_fifo()
430 if (likely(ep->num != 0 || bufferspace != 0)) { in read_fifo()
435 size = readl(®s->EPxSizeLB[ep->num]); in read_fifo()
446 is_short = (size < ep->ep.maxpacket); in read_fifo()
448 VDBG(ep->dev, "read %s %u bytes%s OUT req %p %u/%u\n", in read_fifo()
449 ep->ep.name, size, is_short ? "/S" : "", in read_fifo()
453 u8 byte = (u8) readl(ep->reg_fifo); in read_fifo()
461 DBG(ep->dev, "%s overflow %u\n", in read_fifo()
462 ep->ep.name, size); in read_fifo()
472 if (unlikely(ep->num == 0)) { in read_fifo()
474 if (ep->dev->req_config) in read_fifo()
475 writel(ep->dev->configured in read_fifo()
481 ep->stopped = 1; in read_fifo()
482 ep->dev->ep0state = EP0_STATUS; in read_fifo()
484 done(ep, req, 0); in read_fifo()
487 if (dbuff && !list_empty(&ep->queue)) { in read_fifo()
488 req = list_entry(ep->queue.next, in read_fifo()
517 pio_advance(struct goku_ep *ep) in pio_advance() argument
521 if (unlikely(list_empty (&ep->queue))) in pio_advance()
523 req = list_entry(ep->queue.next, struct goku_request, queue); in pio_advance()
524 (ep->is_in ? write_fifo : read_fifo)(ep, req); in pio_advance()
531 static int start_dma(struct goku_ep *ep, struct goku_request *req) in start_dma() argument
533 struct goku_udc_regs __iomem *regs = ep->dev->regs; in start_dma()
541 if (likely(ep->is_in)) { in start_dma()
543 DBG (ep->dev, "start, IN active dma %03x!!\n", in start_dma()
553 else if ((req->req.length % ep->ep.maxpacket) != 0 in start_dma()
559 ep->dev->int_enable |= INT_MSTRDEND; in start_dma()
568 DBG (ep->dev, "start, OUT active dma %03x!!\n", in start_dma()
578 ep->dev->int_enable |= INT_MSTWREND|INT_MSTWRTMOUT; in start_dma()
582 writel(ep->dev->int_enable, ®s->int_enable); in start_dma()
586 static void dma_advance(struct goku_udc *dev, struct goku_ep *ep) in dma_advance() argument
589 struct goku_udc_regs __iomem *regs = ep->dev->regs; in dma_advance()
594 if (unlikely(list_empty(&ep->queue))) { in dma_advance()
596 if (ep->is_in) in dma_advance()
603 req = list_entry(ep->queue.next, struct goku_request, queue); in dma_advance()
606 if (likely(ep->is_in)) { in dma_advance()
624 ep->ep.name, ep->is_in ? "IN" : "OUT", in dma_advance()
627 done(ep, req, 0); in dma_advance()
628 if (list_empty(&ep->queue)) in dma_advance()
630 req = list_entry(ep->queue.next, struct goku_request, queue); in dma_advance()
631 (void) start_dma(ep, req); in dma_advance()
634 static void abort_dma(struct goku_ep *ep, int status) in abort_dma() argument
636 struct goku_udc_regs __iomem *regs = ep->dev->regs; in abort_dma()
647 command(regs, COMMAND_FIFO_DISABLE, ep->num); in abort_dma()
648 req = list_entry(ep->queue.next, struct goku_request, queue); in abort_dma()
656 if (ep->is_in) { in abort_dma()
669 DBG(ep->dev, "IN dma active after reset!\n"); in abort_dma()
684 DBG(ep->dev, "OUT dma active after reset!\n"); in abort_dma()
689 VDBG(ep->dev, "%s %s %s %d/%d\n", __func__, ep->ep.name, in abort_dma()
690 ep->is_in ? "IN" : "OUT", in abort_dma()
693 command(regs, COMMAND_FIFO_ENABLE, ep->num); in abort_dma()
699 command(regs, COMMAND_FIFO_ENABLE, ep->num); in abort_dma()
710 struct goku_ep *ep; in goku_queue() local
720 ep = container_of(_ep, struct goku_ep, ep); in goku_queue()
721 if (unlikely(!_ep || (!ep->ep.desc && ep->num != 0))) in goku_queue()
723 dev = ep->dev; in goku_queue()
732 if (ep->dma) { in goku_queue()
734 ep->is_in); in goku_queue()
752 if (unlikely(ep->num == 0 && ep->is_in)) in goku_queue()
757 if (list_empty(&ep->queue) && likely(!ep->stopped)) { in goku_queue()
761 if (ep->dma) in goku_queue()
762 status = start_dma(ep, req); in goku_queue()
764 status = (ep->is_in ? write_fifo : read_fifo)(ep, req); in goku_queue()
775 list_add_tail(&req->queue, &ep->queue); in goku_queue()
777 if (likely(!list_empty(&ep->queue)) in goku_queue()
778 && likely(ep->num != 0) in goku_queue()
779 && !ep->dma in goku_queue()
780 && !(dev->int_enable & INT_EPxDATASET (ep->num))) in goku_queue()
781 pio_irq_enable(dev, dev->regs, ep->num); in goku_queue()
790 static void nuke(struct goku_ep *ep, int status) in nuke() argument
794 ep->stopped = 1; in nuke()
795 if (list_empty(&ep->queue)) in nuke()
797 if (ep->dma) in nuke()
798 abort_dma(ep, status); in nuke()
799 while (!list_empty(&ep->queue)) { in nuke()
800 req = list_entry(ep->queue.next, struct goku_request, queue); in nuke()
801 done(ep, req, status); in nuke()
809 struct goku_ep *ep; in goku_dequeue() local
813 ep = container_of(_ep, struct goku_ep, ep); in goku_dequeue()
814 if (!_ep || !_req || (!ep->ep.desc && ep->num != 0)) in goku_dequeue()
816 dev = ep->dev; in goku_dequeue()
825 ep->is_in ? "IN" : "OUT", in goku_dequeue()
826 ep->dma ? "dma" : "pio", in goku_dequeue()
832 list_for_each_entry (req, &ep->queue, queue) { in goku_dequeue()
841 if (ep->dma && ep->queue.next == &req->queue && !ep->stopped) { in goku_dequeue()
842 abort_dma(ep, -ECONNRESET); in goku_dequeue()
843 done(ep, req, -ECONNRESET); in goku_dequeue()
844 dma_advance(dev, ep); in goku_dequeue()
846 done(ep, req, -ECONNRESET); in goku_dequeue()
856 static void goku_clear_halt(struct goku_ep *ep) in goku_clear_halt() argument
859 VDBG(ep->dev, "%s clear halt\n", ep->ep.name); in goku_clear_halt()
860 command(ep->dev->regs, COMMAND_SETDATA0, ep->num); in goku_clear_halt()
861 command(ep->dev->regs, COMMAND_STALL_CLEAR, ep->num); in goku_clear_halt()
862 if (ep->stopped) { in goku_clear_halt()
863 ep->stopped = 0; in goku_clear_halt()
864 if (ep->dma) { in goku_clear_halt()
867 if (list_empty(&ep->queue)) in goku_clear_halt()
869 req = list_entry(ep->queue.next, struct goku_request, in goku_clear_halt()
871 (void) start_dma(ep, req); in goku_clear_halt()
873 pio_advance(ep); in goku_clear_halt()
879 struct goku_ep *ep; in goku_set_halt() local
885 ep = container_of (_ep, struct goku_ep, ep); in goku_set_halt()
887 if (ep->num == 0) { in goku_set_halt()
889 ep->dev->ep0state = EP0_STALL; in goku_set_halt()
890 ep->dev->ep[0].stopped = 1; in goku_set_halt()
895 } else if (!ep->ep.desc) { in goku_set_halt()
896 DBG(ep->dev, "%s %s inactive?\n", __func__, ep->ep.name); in goku_set_halt()
900 spin_lock_irqsave(&ep->dev->lock, flags); in goku_set_halt()
901 if (!list_empty(&ep->queue)) in goku_set_halt()
903 else if (ep->is_in && value in goku_set_halt()
905 && (readl(&ep->dev->regs->DataSet) in goku_set_halt()
906 & DATASET_AB(ep->num))) in goku_set_halt()
909 goku_clear_halt(ep); in goku_set_halt()
911 ep->stopped = 1; in goku_set_halt()
912 VDBG(ep->dev, "%s set halt\n", ep->ep.name); in goku_set_halt()
913 command(ep->dev->regs, COMMAND_STALL, ep->num); in goku_set_halt()
914 readl(ep->reg_status); in goku_set_halt()
916 spin_unlock_irqrestore(&ep->dev->lock, flags); in goku_set_halt()
922 struct goku_ep *ep; in goku_fifo_status() local
928 ep = container_of(_ep, struct goku_ep, ep); in goku_fifo_status()
931 if (ep->is_in) in goku_fifo_status()
935 regs = ep->dev->regs; in goku_fifo_status()
936 size = readl(®s->EPxSizeLA[ep->num]) & DATASIZE; in goku_fifo_status()
937 size += readl(®s->EPxSizeLB[ep->num]) & DATASIZE; in goku_fifo_status()
938 VDBG(ep->dev, "%s %s %u\n", __func__, ep->ep.name, size); in goku_fifo_status()
944 struct goku_ep *ep; in goku_fifo_flush() local
950 ep = container_of(_ep, struct goku_ep, ep); in goku_fifo_flush()
951 VDBG(ep->dev, "%s %s\n", __func__, ep->ep.name); in goku_fifo_flush()
954 if (!ep->ep.desc && ep->num != 0) { in goku_fifo_flush()
955 DBG(ep->dev, "%s %s inactive?\n", __func__, ep->ep.name); in goku_fifo_flush()
959 regs = ep->dev->regs; in goku_fifo_flush()
960 size = readl(®s->EPxSizeLA[ep->num]); in goku_fifo_flush()
968 command(regs, COMMAND_FIFO_CLEAR, ep->num); in goku_fifo_flush()
998 struct usb_ep *ep; in goku_match_ep() local
1003 ep = &dev->ep[3].ep; in goku_match_ep()
1004 if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp)) in goku_match_ep()
1005 return ep; in goku_match_ep()
1010 ep = &dev->ep[2].ep; in goku_match_ep()
1011 if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp)) in goku_match_ep()
1012 return ep; in goku_match_ep()
1193 struct goku_ep *ep = &dev->ep [i]; in udc_proc_read() local
1196 if (i && !ep->ep.desc) in udc_proc_read()
1199 tmp = readl(ep->reg_status); in udc_proc_read()
1201 ep->ep.name, in udc_proc_read()
1202 ep->is_in ? "in" : "out", in udc_proc_read()
1203 ep->ep.maxpacket, in udc_proc_read()
1204 ep->dma ? "dma" : "pio", in udc_proc_read()
1205 ep->irqs, in udc_proc_read()
1214 if (list_empty(&ep->queue)) { in udc_proc_read()
1220 list_for_each_entry(req, &ep->queue, queue) { in udc_proc_read()
1221 if (ep->dma && req->queue.prev == &ep->queue) { in udc_proc_read()
1270 dev->gadget.ep0 = &dev->ep [0].ep; in udc_reinit()
1276 struct goku_ep *ep = &dev->ep[i]; in udc_reinit() local
1278 ep->num = i; in udc_reinit()
1279 ep->ep.name = names[i]; in udc_reinit()
1280 ep->reg_fifo = &dev->regs->ep_fifo [i]; in udc_reinit()
1281 ep->reg_status = &dev->regs->ep_status [i]; in udc_reinit()
1282 ep->reg_mode = &dev->regs->ep_mode[i]; in udc_reinit()
1284 ep->ep.ops = &goku_ep_ops; in udc_reinit()
1285 list_add_tail (&ep->ep.ep_list, &dev->gadget.ep_list); in udc_reinit()
1286 ep->dev = dev; in udc_reinit()
1287 INIT_LIST_HEAD (&ep->queue); in udc_reinit()
1289 ep_reset(NULL, ep); in udc_reinit()
1292 ep->ep.caps.type_control = true; in udc_reinit()
1294 ep->ep.caps.type_bulk = true; in udc_reinit()
1296 ep->ep.caps.dir_in = true; in udc_reinit()
1297 ep->ep.caps.dir_out = true; in udc_reinit()
1300 dev->ep[0].reg_mode = NULL; in udc_reinit()
1301 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, MAX_EP0_SIZE); in udc_reinit()
1302 list_del_init (&dev->ep[0].ep.ep_list); in udc_reinit()
1341 dev->ep[i].irqs = 0; in ep0_start()
1409 nuke(&dev->ep [i], -ESHUTDOWN); in stop_activity()
1447 nuke(&dev->ep[0], 0); in ep0_setup()
1448 dev->ep[0].stopped = 0; in ep0_setup()
1450 dev->ep[0].is_in = 1; in ep0_setup()
1455 dev->ep[0].is_in = 0; in ep0_setup()
1469 (!dev->ep[tmp].ep.desc && tmp != 0)) in ep0_setup()
1473 if (!dev->ep[tmp].is_in) in ep0_setup()
1476 if (dev->ep[tmp].is_in) in ep0_setup()
1483 goku_clear_halt(&dev->ep[tmp]); in ep0_setup()
1487 dev->ep[0].stopped = 1; in ep0_setup()
1533 dev->ep[0].stopped = 1; in ep0_setup()
1550 struct goku_ep *ep; in goku_irq() local
1640 dev->ep[0].irqs++; in goku_irq()
1646 ep = &dev->ep[0]; in goku_irq()
1647 ep->irqs++; in goku_irq()
1648 nuke(ep, 0); in goku_irq()
1655 ep = &dev->ep[0]; in goku_irq()
1656 ep->irqs++; in goku_irq()
1657 pio_advance(ep); in goku_irq()
1663 ep = &dev->ep[UDC_MSTRD_ENDPOINT]; in goku_irq()
1664 ep->irqs++; in goku_irq()
1665 dma_advance(dev, ep); in goku_irq()
1669 ep = &dev->ep[UDC_MSTWR_ENDPOINT]; in goku_irq()
1670 ep->irqs++; in goku_irq()
1671 dma_advance(dev, ep); in goku_irq()
1675 ep = &dev->ep[UDC_MSTWR_ENDPOINT]; in goku_irq()
1676 ep->irqs++; in goku_irq()
1677 ERROR(dev, "%s write timeout ?\n", ep->ep.name); in goku_irq()
1687 ep = &dev->ep[i]; in goku_irq()
1688 pio_advance(ep); in goku_irq()
1689 if (list_empty (&ep->queue)) in goku_irq()
1693 ep->irqs++; in goku_irq()