Lines Matching +full:ixp4xx +full:- +full:timer
2 * Intel PXA25x and IXP4xx on-chip full speed USB device controllers
11 * SPDX-License-Identifier: GPL-2.0+
24 #include <asm/mach-types.h>
33 #include <asm/arch/pxa-regs.h>
54 * not used here. IN-DMA (to host) is simple enough, when the data is
56 * other software can. OUT-DMA is buggy in most chip versions, as well
58 * bother using DMA. (Mostly-working IN-DMA support was available in
62 #define DRIVER_VERSION "18-August-2012"
72 udc->watchdog.base = get_timer(0); in start_watchdog()
73 udc->watchdog.running = 1; in start_watchdog()
78 udc->watchdog.running = 0; in stop_watchdog()
84 if (!udc->watchdog.running) in test_watchdog()
87 debug("watchdog %ld %ld\n", get_timer(udc->watchdog.base), in test_watchdog()
88 udc->watchdog.period); in test_watchdog()
90 if (get_timer(udc->watchdog.base) >= udc->watchdog.period) { in test_watchdog()
92 udc->watchdog.function(udc); in test_watchdog()
98 uint32_t udccs0 = readl(&dev->regs->udccs[0]); in udc_watchdog()
103 if (dev->ep0state == EP0_STALL in udc_watchdog()
106 writel(UDCCS0_FST|UDCCS0_FTF, &dev->regs->udccs[0]); in udc_watchdog()
107 debug("ep0 re-stall\n"); in udc_watchdog()
124 u32 udccr = readl(&UDC_REGS->udccr); in dump_udccr()
140 u32 udccs0 = readl(&UDC_REGS->udccs[0]); in dump_udccs0()
143 label, state_name[the_controller->ep0state], udccs0, in dump_udccs0()
161 state_name[dev->ep0state], in dump_state()
162 readl(&UDC_REGS->uicr1), readl(&UDC_REGS->uicr0), in dump_state()
163 readl(&UDC_REGS->usir1), readl(&UDC_REGS->usir0), in dump_state()
164 readl(&UDC_REGS->ufnrh), readl(&UDC_REGS->ufnrl)); in dump_state()
166 if (dev->has_cfr) { in dump_state()
167 tmp = readl(&UDC_REGS->udccfr); in dump_state()
173 if (!dev->driver) { in dump_state()
181 dev->stats.write.bytes, dev->stats.write.ops, in dump_state()
182 dev->stats.read.bytes, dev->stats.read.ops); in dump_state()
185 if (dev->ep[i].desc == NULL) in dump_state()
187 debug("udccs%d = %02x\n", i, *dev->ep->reg_udccs); in dump_state()
200 * ---------------------------------------------------------------------------
202 * used by gadget driver; and the inner talker-to-hardware core.
203 * ---------------------------------------------------------------------------
212 struct pxa2xx_udc_mach_info *mach = the_controller->mach; in pullup_off()
214 if (mach->udc_command) in pullup_off()
215 mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); in pullup_off()
220 struct pxa2xx_udc_mach_info *mach = the_controller->mach; in pullup_on()
222 if (mach->udc_command) in pullup_on()
223 mach->udc_command(PXA2XX_UDC_CMD_CONNECT); in pullup_on()
230 clrbits_le32(&the_controller->regs->uicr0, in pio_irq_enable()
233 bEndpointAddress -= 8; in pio_irq_enable()
234 clrbits_le32(&the_controller->regs->uicr1, in pio_irq_enable()
243 setbits_le32(&the_controller->regs->uicr0, in pio_irq_disable()
246 bEndpointAddress -= 8; in pio_irq_disable()
247 setbits_le32(&the_controller->regs->uicr1, in pio_irq_disable()
261 clrsetbits_le32(&the_controller->regs->udccr, ~mask_bits, mask); in udc_set_mask_UDCCR()
269 clrbits_le32(&the_controller->regs->udccr, ~mask); in udc_clear_mask_UDCCR()
277 clrsetbits_le32(&the_controller->regs->udccr, ~mask_bits, mask); in udc_ack_int_UDCCR()
292 * iso endpoints must be in non-default altsettings.
301 if (!_ep || !desc || ep->desc || _ep->name == ep0name in pxa25x_ep_enable()
302 || desc->bDescriptorType != USB_DT_ENDPOINT in pxa25x_ep_enable()
303 || ep->bEndpointAddress != desc->bEndpointAddress in pxa25x_ep_enable()
304 || ep->fifo_size < in pxa25x_ep_enable()
305 le16_to_cpu(get_unaligned(&desc->wMaxPacketSize))) { in pxa25x_ep_enable()
307 return -EINVAL; in pxa25x_ep_enable()
311 if (ep->bmAttributes != desc->bmAttributes in pxa25x_ep_enable()
312 && ep->bmAttributes != USB_ENDPOINT_XFER_BULK in pxa25x_ep_enable()
313 && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { in pxa25x_ep_enable()
314 printf("%s, %s type mismatch\n", __func__, _ep->name); in pxa25x_ep_enable()
315 return -EINVAL; in pxa25x_ep_enable()
319 if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK in pxa25x_ep_enable()
320 && le16_to_cpu(get_unaligned(&desc->wMaxPacketSize)) in pxa25x_ep_enable()
322 || !get_unaligned(&desc->wMaxPacketSize)) { in pxa25x_ep_enable()
323 printf("%s, bad %s maxpacket\n", __func__, _ep->name); in pxa25x_ep_enable()
324 return -ERANGE; in pxa25x_ep_enable()
327 dev = ep->dev; in pxa25x_ep_enable()
328 if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) { in pxa25x_ep_enable()
330 return -ESHUTDOWN; in pxa25x_ep_enable()
333 ep->desc = desc; in pxa25x_ep_enable()
334 ep->stopped = 0; in pxa25x_ep_enable()
335 ep->pio_irqs = 0; in pxa25x_ep_enable()
336 ep->ep.maxpacket = le16_to_cpu(get_unaligned(&desc->wMaxPacketSize)); in pxa25x_ep_enable()
343 debug("enabled %s\n", _ep->name); in pxa25x_ep_enable()
353 if (!_ep || !ep->desc) { in pxa25x_ep_disable()
355 _ep ? ep->ep.name : NULL); in pxa25x_ep_disable()
356 return -EINVAL; in pxa25x_ep_disable()
360 nuke(ep, -ESHUTDOWN); in pxa25x_ep_disable()
365 ep->desc = NULL; in pxa25x_ep_disable()
366 ep->stopped = 1; in pxa25x_ep_disable()
369 debug("%s disabled\n", _ep->name); in pxa25x_ep_disable()
373 /*-------------------------------------------------------------------------*/
382 * pxa25x_ep_alloc_request - allocate a request data structure
393 INIT_LIST_HEAD(&req->queue); in pxa25x_ep_alloc_request()
394 return &req->req; in pxa25x_ep_alloc_request()
399 * pxa25x_ep_free_request - deallocate a request data structure
407 WARN_ON(!list_empty(&req->queue)); in pxa25x_ep_free_request()
411 /*-------------------------------------------------------------------------*/
414 * done - retire a request; caller blocked irqs
418 unsigned stopped = ep->stopped; in done()
420 list_del_init(&req->queue); in done()
422 if (likely(req->req.status == -EINPROGRESS)) in done()
423 req->req.status = status; in done()
425 status = req->req.status; in done()
427 if (status && status != -ESHUTDOWN) in done()
429 ep->ep.name, &req->req, status, in done()
430 req->req.actual, req->req.length); in done()
433 ep->stopped = 1; in done()
434 req->req.complete(&ep->ep, &req->req); in done()
435 ep->stopped = stopped; in done()
441 dev->ep0state = EP0_IDLE; in ep0_idle()
452 buf = req->req.buf + req->req.actual; in write_packet()
456 length = min(req->req.length - req->req.actual, max); in write_packet()
457 req->req.actual += length; in write_packet()
460 while (likely(count--)) in write_packet()
476 max = le16_to_cpu(get_unaligned(&ep->desc->wMaxPacketSize)); in write_fifo()
481 count = write_packet(ep->reg_uddr, req, max); in write_fifo()
487 if (likely(req->req.length != req->req.actual) in write_fifo()
488 || req->req.zero) in write_fifo()
493 is_short = unlikely(max < ep->fifo_size); in write_fifo()
497 ep->ep.name, count, in write_fifo()
499 req->req.length - req->req.actual, req); in write_fifo()
506 writel(UDCCS_BI_TPC, ep->reg_udccs); in write_fifo()
508 writel(UDCCS_BI_TSP, ep->reg_udccs); in write_fifo()
513 if (list_empty(&ep->queue)) in write_fifo()
514 pio_irq_disable(ep->bEndpointAddress); in write_fifo()
524 } while (readl(ep->reg_udccs) & UDCCS_BI_TFS); in write_fifo()
529 * caller asserts req->pending (ep0 irq status nyet cleared); starts
535 writel(flags|UDCCS0_SA|UDCCS0_OPR, &dev->regs->udccs[0]); in ep0start()
536 writel(USIR0_IR0, &dev->regs->usir0); in ep0start()
537 dev->req_pending = 0; in ep0start()
539 __func__, tag, readl(&dev->regs->udccs[0]), flags, in ep0start()
540 readl(&dev->regs->usir1), readl(&dev->regs->usir0)); in ep0start()
549 count = write_packet(&ep->dev->regs->uddr0, req, EP0_FIFO_SIZE); in write_ep0_fifo()
550 ep->dev->stats.write.bytes += count; in write_ep0_fifo()
556 req->req.length - req->req.actual, req); in write_ep0_fifo()
559 if (ep->dev->req_pending) in write_ep0_fifo()
560 ep0start(ep->dev, UDCCS0_IPR, "short IN"); in write_ep0_fifo()
562 writel(UDCCS0_IPR, &ep->dev->regs->udccs[0]); in write_ep0_fifo()
564 count = req->req.length; in write_ep0_fifo()
566 ep0_idle(ep->dev); in write_ep0_fifo()
578 if ((readl(&ep->dev->regs->udccs[0]) & in write_ep0_fifo()
582 &ep->dev->regs->udccs[0]); in write_ep0_fifo()
585 count--; in write_ep0_fifo()
589 } else if (ep->dev->req_pending) in write_ep0_fifo()
590 ep0start(ep->dev, 0, "IN"); in write_ep0_fifo()
597 * read_fifo - unload packet(s) from the fifo we use for usb OUT
602 * request buffer having filled (and maybe overran till end-of-packet).
617 udccs = readl(ep->reg_udccs); in read_fifo()
620 buf = req->req.buf + req->req.actual; in read_fifo()
622 bufferspace = req->req.length - req->req.actual; in read_fifo()
626 count = 1 + (0x0ff & readl(ep->reg_ubcr)); in read_fifo()
627 req->req.actual += min(count, bufferspace); in read_fifo()
630 is_short = (count < ep->ep.maxpacket); in read_fifo()
632 ep->ep.name, udccs, count, in read_fifo()
634 req, req->req.actual, req->req.length); in read_fifo()
635 while (likely(count-- != 0)) { in read_fifo()
636 u8 byte = readb(ep->reg_uddr); in read_fifo()
644 if (req->req.status != -EOVERFLOW) in read_fifo()
646 ep->ep.name, count); in read_fifo()
647 req->req.status = -EOVERFLOW; in read_fifo()
650 bufferspace--; in read_fifo()
653 writel(UDCCS_BO_RPC, ep->reg_udccs); in read_fifo()
657 if (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC) { in read_fifo()
659 req->req.status = -EHOSTUNREACH; in read_fifo()
665 if (is_short || req->req.actual == req->req.length) { in read_fifo()
667 if (list_empty(&ep->queue)) in read_fifo()
668 pio_irq_disable(ep->bEndpointAddress); in read_fifo()
679 * handshaking is magic. most device protocols don't need control-OUT.
689 buf = req->req.buf + req->req.actual; in read_ep0_fifo()
690 bufferspace = req->req.length - req->req.actual; in read_ep0_fifo()
692 while (readl(&ep->dev->regs->udccs[0]) & UDCCS0_RNE) { in read_ep0_fifo()
693 byte = (u8)readb(&ep->dev->regs->uddr0); in read_ep0_fifo()
701 if (req->req.status != -EOVERFLOW) in read_ep0_fifo()
702 printf("%s overflow\n", ep->ep.name); in read_ep0_fifo()
703 req->req.status = -EOVERFLOW; in read_ep0_fifo()
706 req->req.actual++; in read_ep0_fifo()
707 bufferspace--; in read_ep0_fifo()
711 writel(UDCCS0_OPR | UDCCS0_IPR, &ep->dev->regs->udccs[0]); in read_ep0_fifo()
714 if (req->req.actual >= req->req.length) in read_ep0_fifo()
721 /*-------------------------------------------------------------------------*/
732 if (unlikely(!_req || !_req->complete || !_req->buf in pxa25x_ep_queue()
733 || !list_empty(&req->queue))) { in pxa25x_ep_queue()
735 return -EINVAL; in pxa25x_ep_queue()
739 if (unlikely(!_ep || (!ep->desc && ep->ep.name != ep0name))) { in pxa25x_ep_queue()
741 return -EINVAL; in pxa25x_ep_queue()
744 dev = ep->dev; in pxa25x_ep_queue()
745 if (unlikely(!dev->driver in pxa25x_ep_queue()
746 || dev->gadget.speed == USB_SPEED_UNKNOWN)) { in pxa25x_ep_queue()
748 return -ESHUTDOWN; in pxa25x_ep_queue()
753 * we can report per-packet status. that also helps with dma. in pxa25x_ep_queue()
755 if (unlikely(ep->bmAttributes == USB_ENDPOINT_XFER_ISOC in pxa25x_ep_queue()
756 && req->req.length > in pxa25x_ep_queue()
757 le16_to_cpu(get_unaligned(&ep->desc->wMaxPacketSize)))) in pxa25x_ep_queue()
758 return -EMSGSIZE; in pxa25x_ep_queue()
761 _ep->name, _req, _req->length, _req->buf); in pxa25x_ep_queue()
765 _req->status = -EINPROGRESS; in pxa25x_ep_queue()
766 _req->actual = 0; in pxa25x_ep_queue()
769 if (list_empty(&ep->queue) && !ep->stopped) { in pxa25x_ep_queue()
770 if (ep->desc == NULL/* ep0 */) { in pxa25x_ep_queue()
771 unsigned length = _req->length; in pxa25x_ep_queue()
773 switch (dev->ep0state) { in pxa25x_ep_queue()
775 dev->stats.write.ops++; in pxa25x_ep_queue()
781 dev->stats.read.ops++; in pxa25x_ep_queue()
783 if (dev->req_config) { in pxa25x_ep_queue()
785 dev->has_cfr ? "" : " raced"); in pxa25x_ep_queue()
786 if (dev->has_cfr) in pxa25x_ep_queue()
789 &ep->dev->regs->udccfr); in pxa25x_ep_queue()
791 dev->ep0state = EP0_END_XFER; in pxa25x_ep_queue()
795 if (dev->req_pending) in pxa25x_ep_queue()
799 &ep->dev->regs->udccs[0]) in pxa25x_ep_queue()
810 dev->ep0state); in pxa25x_ep_queue()
812 return -EL2HLT; in pxa25x_ep_queue()
815 } else if ((ep->bEndpointAddress & USB_DIR_IN) != 0) { in pxa25x_ep_queue()
816 if ((readl(ep->reg_udccs) & UDCCS_BI_TFS) != 0 in pxa25x_ep_queue()
819 } else if ((readl(ep->reg_udccs) & UDCCS_BO_RFS) != 0 in pxa25x_ep_queue()
824 if (likely(req && ep->desc)) in pxa25x_ep_queue()
825 pio_irq_enable(ep->bEndpointAddress); in pxa25x_ep_queue()
830 list_add_tail(&req->queue, &ep->queue); in pxa25x_ep_queue()
838 * nuke - dequeue ALL requests
845 while (!list_empty(&ep->queue)) { in nuke()
846 req = list_entry(ep->queue.next, in nuke()
851 if (ep->desc) in nuke()
852 pio_irq_disable(ep->bEndpointAddress); in nuke()
864 if (!_ep || ep->ep.name == ep0name) in pxa25x_ep_dequeue()
865 return -EINVAL; in pxa25x_ep_dequeue()
870 list_for_each_entry(req, &ep->queue, queue) { in pxa25x_ep_dequeue()
871 if (&req->req == _req) in pxa25x_ep_dequeue()
874 if (&req->req != _req) { in pxa25x_ep_dequeue()
876 return -EINVAL; in pxa25x_ep_dequeue()
879 done(ep, req, -ECONNRESET); in pxa25x_ep_dequeue()
885 /*-------------------------------------------------------------------------*/
894 || (!ep->desc && ep->ep.name != ep0name)) in pxa25x_ep_set_halt()
895 || ep->bmAttributes == USB_ENDPOINT_XFER_ISOC) { in pxa25x_ep_set_halt()
897 return -EINVAL; in pxa25x_ep_set_halt()
906 printf("only host can clear %s halt\n", _ep->name); in pxa25x_ep_set_halt()
907 return -EROFS; in pxa25x_ep_set_halt()
912 if ((ep->bEndpointAddress & USB_DIR_IN) != 0 in pxa25x_ep_set_halt()
913 && ((readl(ep->reg_udccs) & UDCCS_BI_TFS) == 0 in pxa25x_ep_set_halt()
914 || !list_empty(&ep->queue))) { in pxa25x_ep_set_halt()
916 return -EAGAIN; in pxa25x_ep_set_halt()
920 writel(UDCCS_BI_FST|UDCCS_BI_FTF, ep->reg_udccs); in pxa25x_ep_set_halt()
923 if (!ep->desc) { in pxa25x_ep_set_halt()
924 start_watchdog(ep->dev); in pxa25x_ep_set_halt()
925 ep->dev->req_pending = 0; in pxa25x_ep_set_halt()
926 ep->dev->ep0state = EP0_STALL; in pxa25x_ep_set_halt()
932 if (readl(ep->reg_udccs) & UDCCS_BI_SST) in pxa25x_ep_set_halt()
939 debug("%s halt\n", _ep->name); in pxa25x_ep_set_halt()
950 return -ENODEV; in pxa25x_ep_fifo_status()
953 if ((ep->bEndpointAddress & USB_DIR_IN) != 0) in pxa25x_ep_fifo_status()
954 return -EOPNOTSUPP; in pxa25x_ep_fifo_status()
955 if (ep->dev->gadget.speed == USB_SPEED_UNKNOWN in pxa25x_ep_fifo_status()
956 || (readl(ep->reg_udccs) & UDCCS_BO_RFS) == 0) in pxa25x_ep_fifo_status()
959 return (readl(ep->reg_ubcr) & 0xfff) + 1; in pxa25x_ep_fifo_status()
967 if (!_ep || ep->ep.name == ep0name || !list_empty(&ep->queue)) { in pxa25x_ep_fifo_flush()
975 if ((ep->bEndpointAddress & USB_DIR_IN) == 0) { in pxa25x_ep_fifo_flush()
976 while (((readl(ep->reg_udccs)) & UDCCS_BO_RNE) != 0) in pxa25x_ep_fifo_flush()
977 (void)readb(ep->reg_uddr); in pxa25x_ep_fifo_flush()
983 | (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC in pxa25x_ep_fifo_flush()
984 ? 0 : UDCCS_BI_SST), ep->reg_udccs); in pxa25x_ep_fifo_flush()
1004 /* ---------------------------------------------------------------------------
1005 * device-scoped parts of the api to the usb controller hardware
1006 * ---------------------------------------------------------------------------
1011 return ((readl(&the_controller->regs->ufnrh) & 0x07) << 8) | in pxa25x_udc_get_frame()
1012 (readl(&the_controller->regs->ufnrl) & 0xff); in pxa25x_udc_get_frame()
1018 if ((readl(&the_controller->regs->udccs[0]) & UDCCS0_DRWF) == 0) in pxa25x_udc_wakeup()
1019 return -EHOSTUNREACH; in pxa25x_udc_wakeup()
1029 * We disable the UDC -- and its 48 MHz clock -- whenever it's not
1034 if (udc->pullup) in pullup()
1040 int is_active = udc->pullup; in pullup()
1042 if (!udc->active) { in pullup()
1043 udc->active = 1; in pullup()
1047 if (udc->active) { in pullup()
1048 if (udc->gadget.speed != USB_SPEED_UNKNOWN) in pullup()
1049 stop_activity(udc, udc->driver); in pullup()
1051 udc->active = 0; in pullup()
1077 if (!udc->mach->udc_command) in pxa25x_udc_pullup()
1078 return -EOPNOTSUPP; in pxa25x_udc_pullup()
1080 udc->pullup = (is_active != 0); in pxa25x_udc_pullup()
1086 * boards may consume current from VBUS, up to 100-500mA based on config.
1087 * the 500uA suspend ceiling means that exclusively vbus-powered PXA designs
1092 return -EOPNOTSUPP; in pxa25x_udc_vbus_draw()
1103 /*-------------------------------------------------------------------------*/
1106 * udc_disable - disable USB device controller
1112 writel(0xff, &dev->regs->uicr0); in udc_disable()
1113 writel(0xff, &dev->regs->uicr1); in udc_disable()
1114 writel(UFNRH_SIM, &dev->regs->ufnrh); in udc_disable()
1122 dev->gadget.speed = USB_SPEED_UNKNOWN; in udc_disable()
1126 * udc_reinit - initialize software state
1133 INIT_LIST_HEAD(&dev->gadget.ep_list); in udc_reinit()
1134 INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); in udc_reinit()
1135 dev->ep0state = EP0_IDLE; in udc_reinit()
1139 struct pxa25x_ep *ep = &dev->ep[i]; in udc_reinit()
1142 list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); in udc_reinit()
1144 ep->desc = NULL; in udc_reinit()
1145 ep->stopped = 0; in udc_reinit()
1146 INIT_LIST_HEAD(&ep->queue); in udc_reinit()
1147 ep->pio_irqs = 0; in udc_reinit()
1150 /* the rest was statically initialized, and is read-only */ in udc_reinit()
1171 dev->gadget.speed = USB_SPEED_UNKNOWN; in udc_enable()
1172 dev->stats.irqs = 0; in udc_enable()
1176 * - enable UDC in udc_enable()
1177 * - if RESET is already in progress, ack interrupt in udc_enable()
1178 * - unmask reset interrupt in udc_enable()
1181 if (!(readl(&dev->regs->udccr) & UDCCR_UDA)) in udc_enable()
1184 if (dev->has_cfr /* UDC_RES2 is defined */) { in udc_enable()
1189 writel(UDCCFR_ACM | UDCCFR_MB1, &dev->regs->udccfr); in udc_enable()
1196 clrbits_le32(&dev->regs->uicr0, UICR0_IM0); in udc_enable()
1211 nuke(&dev->ep[i], -ECONNABORTED); in clear_ep_state()
1216 u32 udccs0 = readl(&dev->regs->udccs[0]); in handle_ep0()
1217 struct pxa25x_ep *ep = &dev->ep[0]; in handle_ep0()
1225 if (list_empty(&ep->queue)) in handle_ep0()
1228 req = list_entry(ep->queue.next, struct pxa25x_request, queue); in handle_ep0()
1232 nuke(ep, -EPIPE); in handle_ep0()
1233 writel(UDCCS0_SST, &dev->regs->udccs[0]); in handle_ep0()
1238 /* previous request unfinished? non-error iff back-to-back ... */ in handle_ep0()
1239 if ((udccs0 & UDCCS0_SA) != 0 && dev->ep0state != EP0_IDLE) { in handle_ep0()
1245 switch (dev->ep0state) { in handle_ep0()
1247 /* late-breaking status? */ in handle_ep0()
1248 udccs0 = readl(&dev->regs->udccs[0]); in handle_ep0()
1255 nuke(ep, -EPROTO); in handle_ep0()
1259 if (unlikely(!(readl(&dev->regs->udccs[0]) & in handle_ep0()
1265 u.raw[i] = (u8)readb(&dev->regs->uddr0); in handle_ep0()
1267 if (unlikely((readl(&dev->regs->udccs[0]) & in handle_ep0()
1279 dev->req_std = (u.r.bRequestType & USB_TYPE_MASK) in handle_ep0()
1281 dev->req_config = 0; in handle_ep0()
1282 dev->req_pending = 1; in handle_ep0()
1293 dev->req_config = 1; in handle_ep0()
1307 * - altsetting may only be zero; in handle_ep0()
1308 * - hw resets all interfaces' eps; in handle_ep0()
1309 * - ep reset doesn't include halt(?). in handle_ep0()
1328 dev->ep0state = EP0_IN_DATA_PHASE; in handle_ep0()
1330 dev->ep0state = EP0_OUT_DATA_PHASE; in handle_ep0()
1332 i = dev->driver->setup(&dev->gadget, &u.r); in handle_ep0()
1335 if (dev->req_config) { in handle_ep0()
1357 readl(&dev->regs->udccs[0]), i); in handle_ep0()
1360 * the watchdog timer helps deal with cases in handle_ep0()
1366 dev->ep0state = EP0_STALL; in handle_ep0()
1369 } else if (dev->req_pending) { in handle_ep0()
1370 if (likely(dev->ep0state == EP0_IN_DATA_PHASE in handle_ep0()
1371 || dev->req_std || u.r.wLength)) in handle_ep0()
1389 nuke(ep, -EPROTO); in handle_ep0()
1393 u.raw[i] = (u8)readb(&dev->regs->uddr0); in handle_ep0()
1403 * - we acked FST in handle_ep0()
1404 * - IPR cleared in handle_ep0()
1405 * - OPR got set, without SA (likely status stage) in handle_ep0()
1408 readl(&dev->regs->udccs[0])); in handle_ep0()
1410 &dev->regs->udccs[0]); in handle_ep0()
1446 * ack control-IN status (maybe in-zlp was skipped) in handle_ep0()
1450 writel(UDCCS0_OPR, &dev->regs->udccs[0]); in handle_ep0()
1454 writel(UDCCS0_FST, &dev->regs->udccs[0]); in handle_ep0()
1458 writel(USIR0_IR0, &dev->regs->usir0); in handle_ep0()
1464 int is_in = ep->bEndpointAddress & USB_DIR_IN; in handle_ep()
1470 if (likely(!list_empty(&ep->queue))) in handle_ep()
1471 req = list_entry(ep->queue.next, in handle_ep()
1478 udccs = readl(ep->reg_udccs); in handle_ep()
1481 if (likely(ep->bmAttributes == USB_ENDPOINT_XFER_BULK)) in handle_ep()
1485 writel(tmp, ep->reg_udccs); in handle_ep()
1490 if (likely(ep->bmAttributes == USB_ENDPOINT_XFER_BULK)) in handle_ep()
1496 writel(tmp, ep->reg_udccs); in handle_ep()
1502 pio_irq_disable(ep->bEndpointAddress); in handle_ep()
1504 ep->pio_irqs++; in handle_ep()
1509 * pxa25x_udc_irq - interrupt handler
1524 dev->stats.irqs++; in pxa25x_udc_irq()
1526 u32 udccr = readl(&dev->regs->udccr); in pxa25x_udc_irq()
1536 if (dev->gadget.speed != USB_SPEED_UNKNOWN in pxa25x_udc_irq()
1537 && dev->driver in pxa25x_udc_irq()
1538 && dev->driver->suspend) in pxa25x_udc_irq()
1539 dev->driver->suspend(&dev->gadget); in pxa25x_udc_irq()
1549 if (dev->gadget.speed != USB_SPEED_UNKNOWN in pxa25x_udc_irq()
1550 && dev->driver in pxa25x_udc_irq()
1551 && dev->driver->resume) in pxa25x_udc_irq()
1552 dev->driver->resume(&dev->gadget); in pxa25x_udc_irq()
1555 /* ReSeT Interrupt Request - USB reset */ in pxa25x_udc_irq()
1560 if ((readl(&dev->regs->udccr) & UDCCR_UDA) == 0) { in pxa25x_udc_irq()
1567 stop_activity(dev, dev->driver); in pxa25x_udc_irq()
1571 dev->gadget.speed = USB_SPEED_FULL; in pxa25x_udc_irq()
1572 memset(&dev->stats, 0, sizeof dev->stats); in pxa25x_udc_irq()
1577 u32 uicr0 = readl(&dev->regs->uicr0); in pxa25x_udc_irq()
1578 u32 uicr1 = readl(&dev->regs->uicr1); in pxa25x_udc_irq()
1579 u32 usir0 = readl(&dev->regs->usir0); in pxa25x_udc_irq()
1580 u32 usir1 = readl(&dev->regs->usir1); in pxa25x_udc_irq()
1593 dev->ep[0].pio_irqs++; in pxa25x_udc_irq()
1603 handle_ep(&dev->ep[i]); in pxa25x_udc_irq()
1604 setbits_le32(&dev->regs->usir0, tmp); in pxa25x_udc_irq()
1609 handle_ep(&dev->ep[i+8]); in pxa25x_udc_irq()
1610 setbits_le32(&dev->regs->usir1, tmp); in pxa25x_udc_irq()
1623 /*-------------------------------------------------------------------------*/
1626 * this uses load-time allocation and initialization (instead of
1627 * doing it at run-time) to save code, eliminate fault paths, and
1647 .reg_udccs = &UDC_REGS->udccs[0],
1648 .reg_uddr = &UDC_REGS->uddr0,
1654 .name = "ep1in-bulk",
1662 .reg_udccs = &UDC_REGS->udccs[1],
1663 .reg_uddr = &UDC_REGS->uddr1,
1667 .name = "ep2out-bulk",
1675 .reg_udccs = &UDC_REGS->udccs[2],
1676 .reg_ubcr = &UDC_REGS->ubcr2,
1677 .reg_uddr = &UDC_REGS->uddr2,
1682 .name = "ep3in-iso",
1690 .reg_udccs = &UDC_REGS->udccs[3],
1691 .reg_uddr = &UDC_REGS->uddr3,
1695 .name = "ep4out-iso",
1703 .reg_udccs = &UDC_REGS->udccs[4],
1704 .reg_ubcr = &UDC_REGS->ubcr4,
1705 .reg_uddr = &UDC_REGS->uddr4,
1709 .name = "ep5in-int",
1717 .reg_udccs = &UDC_REGS->udccs[5],
1718 .reg_uddr = &UDC_REGS->uddr5,
1724 .name = "ep6in-bulk",
1732 .reg_udccs = &UDC_REGS->udccs[6],
1733 .reg_uddr = &UDC_REGS->uddr6,
1737 .name = "ep7out-bulk",
1745 .reg_udccs = &UDC_REGS->udccs[7],
1746 .reg_ubcr = &UDC_REGS->ubcr7,
1747 .reg_uddr = &UDC_REGS->uddr7,
1751 .name = "ep8in-iso",
1759 .reg_udccs = &UDC_REGS->udccs[8],
1760 .reg_uddr = &UDC_REGS->uddr8,
1764 .name = "ep9out-iso",
1772 .reg_udccs = &UDC_REGS->udccs[9],
1773 .reg_ubcr = &UDC_REGS->ubcr9,
1774 .reg_uddr = &UDC_REGS->uddr9,
1778 .name = "ep10in-int",
1786 .reg_udccs = &UDC_REGS->udccs[10],
1787 .reg_uddr = &UDC_REGS->uddr10,
1793 .name = "ep11in-bulk",
1801 .reg_udccs = &UDC_REGS->udccs[11],
1802 .reg_uddr = &UDC_REGS->uddr11,
1806 .name = "ep12out-bulk",
1814 .reg_udccs = &UDC_REGS->udccs[12],
1815 .reg_ubcr = &UDC_REGS->ubcr12,
1816 .reg_uddr = &UDC_REGS->uddr12,
1820 .name = "ep13in-iso",
1828 .reg_udccs = &UDC_REGS->udccs[13],
1829 .reg_uddr = &UDC_REGS->uddr13,
1833 .name = "ep14out-iso",
1841 .reg_udccs = &UDC_REGS->udccs[14],
1842 .reg_ubcr = &UDC_REGS->ubcr14,
1843 .reg_uddr = &UDC_REGS->uddr14,
1847 .name = "ep15in-int",
1855 .reg_udccs = &UDC_REGS->udccs[15],
1856 .reg_uddr = &UDC_REGS->uddr15,
1896 * non-control requests. then usb traffic follows until a
1907 || driver->speed < USB_SPEED_FULL in usb_gadget_register_driver()
1908 || !driver->disconnect in usb_gadget_register_driver()
1909 || !driver->setup) in usb_gadget_register_driver()
1910 return -EINVAL; in usb_gadget_register_driver()
1912 return -ENODEV; in usb_gadget_register_driver()
1913 if (dev->driver) in usb_gadget_register_driver()
1914 return -EBUSY; in usb_gadget_register_driver()
1920 dev->driver = driver; in usb_gadget_register_driver()
1921 dev->pullup = 1; in usb_gadget_register_driver()
1923 /* trigger chiprev-specific logic */ in usb_gadget_register_driver()
1926 dev->has_cfr = 1; in usb_gadget_register_driver()
1935 /* OUT-DMA is broken ... */ in usb_gadget_register_driver()
1942 return -ENODEV; in usb_gadget_register_driver()
1947 /* prepare watchdog timer */ in usb_gadget_register_driver()
1948 dev->watchdog.running = 0; in usb_gadget_register_driver()
1949 dev->watchdog.period = 5000 * CONFIG_SYS_HZ / 1000000; /* 5 ms */ in usb_gadget_register_driver()
1950 dev->watchdog.function = udc_watchdog; in usb_gadget_register_driver()
1952 dev->mach = &mach_info; in usb_gadget_register_driver()
1957 dev->gadget.name = "pxa2xx_udc"; in usb_gadget_register_driver()
1958 retval = driver->bind(&dev->gadget); in usb_gadget_register_driver()
1960 printf("bind to driver %s --> error %d\n", in usb_gadget_register_driver()
1962 dev->driver = NULL; in usb_gadget_register_driver()
1983 if (dev->gadget.speed == USB_SPEED_UNKNOWN) in stop_activity()
1985 dev->gadget.speed = USB_SPEED_UNKNOWN; in stop_activity()
1989 struct pxa25x_ep *ep = &dev->ep[i]; in stop_activity()
1991 ep->stopped = 1; in stop_activity()
1992 nuke(ep, -ESHUTDOWN); in stop_activity()
1998 driver->disconnect(&dev->gadget); in stop_activity()
2000 /* re-init driver-visible data structures */ in stop_activity()
2009 return -ENODEV; in usb_gadget_unregister_driver()
2010 if (!driver || driver != dev->driver || !driver->unbind) in usb_gadget_unregister_driver()
2011 return -EINVAL; in usb_gadget_unregister_driver()
2014 dev->pullup = 0; in usb_gadget_unregister_driver()
2019 driver->unbind(&dev->gadget); in usb_gadget_unregister_driver()
2020 dev->driver = NULL; in usb_gadget_unregister_driver()
2040 /*-------------------------------------------------------------------------*/