18ea1fbf7SHeiko Schocher /*
262019767SHeiko Schocher * from linux:
362019767SHeiko Schocher * c94e289f195e: usb: gadget: remove incorrect __init/__exit annotations
462019767SHeiko Schocher *
58ea1fbf7SHeiko Schocher * at91_udc -- driver for at91-series USB peripheral controller
68ea1fbf7SHeiko Schocher *
78ea1fbf7SHeiko Schocher * Copyright (C) 2004 by Thomas Rathbone
88ea1fbf7SHeiko Schocher * Copyright (C) 2005 by HP Labs
98ea1fbf7SHeiko Schocher * Copyright (C) 2005 by David Brownell
108ea1fbf7SHeiko Schocher *
1162019767SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+
128ea1fbf7SHeiko Schocher */
138ea1fbf7SHeiko Schocher
148ea1fbf7SHeiko Schocher #undef VERBOSE_DEBUG
158ea1fbf7SHeiko Schocher #undef PACKET_TRACE
168ea1fbf7SHeiko Schocher
1762019767SHeiko Schocher #include <common.h>
181221ce45SMasahiro Yamada #include <linux/errno.h>
1962019767SHeiko Schocher #include <asm/io.h>
2062019767SHeiko Schocher #include <asm/gpio.h>
2162019767SHeiko Schocher #include <asm/hardware.h>
2262019767SHeiko Schocher #include <mach/at91_matrix.h>
238ea1fbf7SHeiko Schocher #include <linux/list.h>
248ea1fbf7SHeiko Schocher #include <linux/usb/ch9.h>
258ea1fbf7SHeiko Schocher #include <linux/usb/gadget.h>
2662019767SHeiko Schocher #include <linux/usb/at91_udc.h>
2762019767SHeiko Schocher #include <malloc.h>
288ea1fbf7SHeiko Schocher
298ea1fbf7SHeiko Schocher #include "at91_udc.h"
308ea1fbf7SHeiko Schocher
318ea1fbf7SHeiko Schocher /*
328ea1fbf7SHeiko Schocher * This controller is simple and PIO-only. It's used in many AT91-series
338ea1fbf7SHeiko Schocher * full speed USB controllers, including the at91rm9200 (arm920T, with MMU),
348ea1fbf7SHeiko Schocher * at91sam926x (arm926ejs, with MMU), and several no-mmu versions.
358ea1fbf7SHeiko Schocher *
368ea1fbf7SHeiko Schocher * This driver expects the board has been wired with two GPIOs supporting
378ea1fbf7SHeiko Schocher * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the
388ea1fbf7SHeiko Schocher * testing hasn't covered such cases.)
398ea1fbf7SHeiko Schocher *
408ea1fbf7SHeiko Schocher * The pullup is most important (so it's integrated on sam926x parts). It
418ea1fbf7SHeiko Schocher * provides software control over whether the host enumerates the device.
428ea1fbf7SHeiko Schocher *
438ea1fbf7SHeiko Schocher * The VBUS sensing helps during enumeration, and allows both USB clocks
448ea1fbf7SHeiko Schocher * (and the transceiver) to stay gated off until they're necessary, saving
458ea1fbf7SHeiko Schocher * power. During USB suspend, the 48 MHz clock is gated off in hardware;
468ea1fbf7SHeiko Schocher * it may also be gated off by software during some Linux sleep states.
478ea1fbf7SHeiko Schocher */
488ea1fbf7SHeiko Schocher
498ea1fbf7SHeiko Schocher #define DRIVER_VERSION "3 May 2006"
508ea1fbf7SHeiko Schocher
518ea1fbf7SHeiko Schocher static const char driver_name [] = "at91_udc";
528ea1fbf7SHeiko Schocher static const char * const ep_names[] = {
538ea1fbf7SHeiko Schocher "ep0",
548ea1fbf7SHeiko Schocher "ep1",
558ea1fbf7SHeiko Schocher "ep2",
568ea1fbf7SHeiko Schocher "ep3-int",
578ea1fbf7SHeiko Schocher "ep4",
588ea1fbf7SHeiko Schocher "ep5",
598ea1fbf7SHeiko Schocher };
608ea1fbf7SHeiko Schocher #define ep0name ep_names[0]
618ea1fbf7SHeiko Schocher
628ea1fbf7SHeiko Schocher #define at91_udp_read(udc, reg) \
638ea1fbf7SHeiko Schocher __raw_readl((udc)->udp_baseaddr + (reg))
648ea1fbf7SHeiko Schocher #define at91_udp_write(udc, reg, val) \
658ea1fbf7SHeiko Schocher __raw_writel((val), (udc)->udp_baseaddr + (reg))
668ea1fbf7SHeiko Schocher
6762019767SHeiko Schocher static struct at91_udc *controller;
688ea1fbf7SHeiko Schocher
698ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
708ea1fbf7SHeiko Schocher
done(struct at91_ep * ep,struct at91_request * req,int status)718ea1fbf7SHeiko Schocher static void done(struct at91_ep *ep, struct at91_request *req, int status)
728ea1fbf7SHeiko Schocher {
738ea1fbf7SHeiko Schocher unsigned stopped = ep->stopped;
748ea1fbf7SHeiko Schocher struct at91_udc *udc = ep->udc;
758ea1fbf7SHeiko Schocher
768ea1fbf7SHeiko Schocher list_del_init(&req->queue);
778ea1fbf7SHeiko Schocher if (req->req.status == -EINPROGRESS)
788ea1fbf7SHeiko Schocher req->req.status = status;
798ea1fbf7SHeiko Schocher else
808ea1fbf7SHeiko Schocher status = req->req.status;
818ea1fbf7SHeiko Schocher if (status && status != -ESHUTDOWN)
828ea1fbf7SHeiko Schocher VDBG("%s done %p, status %d\n", ep->ep.name, req, status);
838ea1fbf7SHeiko Schocher
848ea1fbf7SHeiko Schocher ep->stopped = 1;
858ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
8662019767SHeiko Schocher req->req.complete(&ep->ep, &req->req);
878ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
888ea1fbf7SHeiko Schocher ep->stopped = stopped;
898ea1fbf7SHeiko Schocher
908ea1fbf7SHeiko Schocher /* ep0 is always ready; other endpoints need a non-empty queue */
918ea1fbf7SHeiko Schocher if (list_empty(&ep->queue) && ep->int_mask != (1 << 0))
928ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, ep->int_mask);
938ea1fbf7SHeiko Schocher }
948ea1fbf7SHeiko Schocher
958ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
968ea1fbf7SHeiko Schocher
978ea1fbf7SHeiko Schocher /* bits indicating OUT fifo has data ready */
988ea1fbf7SHeiko Schocher #define RX_DATA_READY (AT91_UDP_RX_DATA_BK0 | AT91_UDP_RX_DATA_BK1)
998ea1fbf7SHeiko Schocher
1008ea1fbf7SHeiko Schocher /*
1018ea1fbf7SHeiko Schocher * Endpoint FIFO CSR bits have a mix of bits, making it unsafe to just write
1028ea1fbf7SHeiko Schocher * back most of the value you just read (because of side effects, including
1038ea1fbf7SHeiko Schocher * bits that may change after reading and before writing).
1048ea1fbf7SHeiko Schocher *
1058ea1fbf7SHeiko Schocher * Except when changing a specific bit, always write values which:
1068ea1fbf7SHeiko Schocher * - clear SET_FX bits (setting them could change something)
1078ea1fbf7SHeiko Schocher * - set CLR_FX bits (clearing them could change something)
1088ea1fbf7SHeiko Schocher *
1098ea1fbf7SHeiko Schocher * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE
1108ea1fbf7SHeiko Schocher * that shouldn't normally be changed.
1118ea1fbf7SHeiko Schocher *
1128ea1fbf7SHeiko Schocher * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains,
1138ea1fbf7SHeiko Schocher * implying a need to wait for one write to complete (test relevant bits)
1148ea1fbf7SHeiko Schocher * before starting the next write. This shouldn't be an issue given how
1158ea1fbf7SHeiko Schocher * infrequently we write, except maybe for write-then-read idioms.
1168ea1fbf7SHeiko Schocher */
1178ea1fbf7SHeiko Schocher #define SET_FX (AT91_UDP_TXPKTRDY)
1188ea1fbf7SHeiko Schocher #define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP \
1198ea1fbf7SHeiko Schocher | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)
1208ea1fbf7SHeiko Schocher
1218ea1fbf7SHeiko Schocher /* pull OUT packet data from the endpoint's fifo */
read_fifo(struct at91_ep * ep,struct at91_request * req)1228ea1fbf7SHeiko Schocher static int read_fifo (struct at91_ep *ep, struct at91_request *req)
1238ea1fbf7SHeiko Schocher {
1248ea1fbf7SHeiko Schocher u32 __iomem *creg = ep->creg;
1258ea1fbf7SHeiko Schocher u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0));
1268ea1fbf7SHeiko Schocher u32 csr;
1278ea1fbf7SHeiko Schocher u8 *buf;
1288ea1fbf7SHeiko Schocher unsigned int count, bufferspace, is_done;
1298ea1fbf7SHeiko Schocher
1308ea1fbf7SHeiko Schocher buf = req->req.buf + req->req.actual;
1318ea1fbf7SHeiko Schocher bufferspace = req->req.length - req->req.actual;
1328ea1fbf7SHeiko Schocher
1338ea1fbf7SHeiko Schocher /*
1348ea1fbf7SHeiko Schocher * there might be nothing to read if ep_queue() calls us,
1358ea1fbf7SHeiko Schocher * or if we already emptied both pingpong buffers
1368ea1fbf7SHeiko Schocher */
1378ea1fbf7SHeiko Schocher rescan:
1388ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
1398ea1fbf7SHeiko Schocher if ((csr & RX_DATA_READY) == 0)
1408ea1fbf7SHeiko Schocher return 0;
1418ea1fbf7SHeiko Schocher
1428ea1fbf7SHeiko Schocher count = (csr & AT91_UDP_RXBYTECNT) >> 16;
1438ea1fbf7SHeiko Schocher if (count > ep->ep.maxpacket)
1448ea1fbf7SHeiko Schocher count = ep->ep.maxpacket;
1458ea1fbf7SHeiko Schocher if (count > bufferspace) {
1468ea1fbf7SHeiko Schocher DBG("%s buffer overflow\n", ep->ep.name);
1478ea1fbf7SHeiko Schocher req->req.status = -EOVERFLOW;
1488ea1fbf7SHeiko Schocher count = bufferspace;
1498ea1fbf7SHeiko Schocher }
15062019767SHeiko Schocher __raw_readsb((unsigned long)dreg, buf, count);
1518ea1fbf7SHeiko Schocher
1528ea1fbf7SHeiko Schocher /* release and swap pingpong mem bank */
1538ea1fbf7SHeiko Schocher csr |= CLR_FX;
1548ea1fbf7SHeiko Schocher if (ep->is_pingpong) {
1558ea1fbf7SHeiko Schocher if (ep->fifo_bank == 0) {
1568ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_RX_DATA_BK0);
1578ea1fbf7SHeiko Schocher ep->fifo_bank = 1;
1588ea1fbf7SHeiko Schocher } else {
1598ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_RX_DATA_BK1);
1608ea1fbf7SHeiko Schocher ep->fifo_bank = 0;
1618ea1fbf7SHeiko Schocher }
1628ea1fbf7SHeiko Schocher } else
1638ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_RX_DATA_BK0);
1648ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
1658ea1fbf7SHeiko Schocher
1668ea1fbf7SHeiko Schocher req->req.actual += count;
1678ea1fbf7SHeiko Schocher is_done = (count < ep->ep.maxpacket);
1688ea1fbf7SHeiko Schocher if (count == bufferspace)
1698ea1fbf7SHeiko Schocher is_done = 1;
1708ea1fbf7SHeiko Schocher
1718ea1fbf7SHeiko Schocher PACKET("%s %p out/%d%s\n", ep->ep.name, &req->req, count,
1728ea1fbf7SHeiko Schocher is_done ? " (done)" : "");
1738ea1fbf7SHeiko Schocher
1748ea1fbf7SHeiko Schocher /*
1758ea1fbf7SHeiko Schocher * avoid extra trips through IRQ logic for packets already in
1768ea1fbf7SHeiko Schocher * the fifo ... maybe preventing an extra (expensive) OUT-NAK
1778ea1fbf7SHeiko Schocher */
1788ea1fbf7SHeiko Schocher if (is_done)
1798ea1fbf7SHeiko Schocher done(ep, req, 0);
1808ea1fbf7SHeiko Schocher else if (ep->is_pingpong) {
1818ea1fbf7SHeiko Schocher /*
1828ea1fbf7SHeiko Schocher * One dummy read to delay the code because of a HW glitch:
1838ea1fbf7SHeiko Schocher * CSR returns bad RXCOUNT when read too soon after updating
1848ea1fbf7SHeiko Schocher * RX_DATA_BK flags.
1858ea1fbf7SHeiko Schocher */
1868ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
1878ea1fbf7SHeiko Schocher
1888ea1fbf7SHeiko Schocher bufferspace -= count;
1898ea1fbf7SHeiko Schocher buf += count;
1908ea1fbf7SHeiko Schocher goto rescan;
1918ea1fbf7SHeiko Schocher }
1928ea1fbf7SHeiko Schocher
1938ea1fbf7SHeiko Schocher return is_done;
1948ea1fbf7SHeiko Schocher }
1958ea1fbf7SHeiko Schocher
1968ea1fbf7SHeiko Schocher /* load fifo for an IN packet */
write_fifo(struct at91_ep * ep,struct at91_request * req)1978ea1fbf7SHeiko Schocher static int write_fifo(struct at91_ep *ep, struct at91_request *req)
1988ea1fbf7SHeiko Schocher {
1998ea1fbf7SHeiko Schocher u32 __iomem *creg = ep->creg;
2008ea1fbf7SHeiko Schocher u32 csr = __raw_readl(creg);
2018ea1fbf7SHeiko Schocher u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0));
2028ea1fbf7SHeiko Schocher unsigned total, count, is_last;
2038ea1fbf7SHeiko Schocher u8 *buf;
2048ea1fbf7SHeiko Schocher
2058ea1fbf7SHeiko Schocher /*
2068ea1fbf7SHeiko Schocher * TODO: allow for writing two packets to the fifo ... that'll
2078ea1fbf7SHeiko Schocher * reduce the amount of IN-NAKing, but probably won't affect
2088ea1fbf7SHeiko Schocher * throughput much. (Unlike preventing OUT-NAKing!)
2098ea1fbf7SHeiko Schocher */
2108ea1fbf7SHeiko Schocher
2118ea1fbf7SHeiko Schocher /*
2128ea1fbf7SHeiko Schocher * If ep_queue() calls us, the queue is empty and possibly in
2138ea1fbf7SHeiko Schocher * odd states like TXCOMP not yet cleared (we do it, saving at
2148ea1fbf7SHeiko Schocher * least one IRQ) or the fifo not yet being free. Those aren't
2158ea1fbf7SHeiko Schocher * issues normally (IRQ handler fast path).
2168ea1fbf7SHeiko Schocher */
2178ea1fbf7SHeiko Schocher if (unlikely(csr & (AT91_UDP_TXCOMP | AT91_UDP_TXPKTRDY))) {
2188ea1fbf7SHeiko Schocher if (csr & AT91_UDP_TXCOMP) {
2198ea1fbf7SHeiko Schocher csr |= CLR_FX;
2208ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_TXCOMP);
2218ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
2228ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
2238ea1fbf7SHeiko Schocher }
2248ea1fbf7SHeiko Schocher if (csr & AT91_UDP_TXPKTRDY)
2258ea1fbf7SHeiko Schocher return 0;
2268ea1fbf7SHeiko Schocher }
2278ea1fbf7SHeiko Schocher
2288ea1fbf7SHeiko Schocher buf = req->req.buf + req->req.actual;
2298ea1fbf7SHeiko Schocher prefetch(buf);
2308ea1fbf7SHeiko Schocher total = req->req.length - req->req.actual;
2318ea1fbf7SHeiko Schocher if (ep->ep.maxpacket < total) {
2328ea1fbf7SHeiko Schocher count = ep->ep.maxpacket;
2338ea1fbf7SHeiko Schocher is_last = 0;
2348ea1fbf7SHeiko Schocher } else {
2358ea1fbf7SHeiko Schocher count = total;
2368ea1fbf7SHeiko Schocher is_last = (count < ep->ep.maxpacket) || !req->req.zero;
2378ea1fbf7SHeiko Schocher }
2388ea1fbf7SHeiko Schocher
2398ea1fbf7SHeiko Schocher /*
2408ea1fbf7SHeiko Schocher * Write the packet, maybe it's a ZLP.
2418ea1fbf7SHeiko Schocher *
2428ea1fbf7SHeiko Schocher * NOTE: incrementing req->actual before we receive the ACK means
2438ea1fbf7SHeiko Schocher * gadget driver IN bytecounts can be wrong in fault cases. That's
2448ea1fbf7SHeiko Schocher * fixable with PIO drivers like this one (save "count" here, and
2458ea1fbf7SHeiko Schocher * do the increment later on TX irq), but not for most DMA hardware.
2468ea1fbf7SHeiko Schocher *
2478ea1fbf7SHeiko Schocher * So all gadget drivers must accept that potential error. Some
2488ea1fbf7SHeiko Schocher * hardware supports precise fifo status reporting, letting them
2498ea1fbf7SHeiko Schocher * recover when the actual bytecount matters (e.g. for USB Test
2508ea1fbf7SHeiko Schocher * and Measurement Class devices).
2518ea1fbf7SHeiko Schocher */
25262019767SHeiko Schocher __raw_writesb((unsigned long)dreg, buf, count);
2538ea1fbf7SHeiko Schocher csr &= ~SET_FX;
2548ea1fbf7SHeiko Schocher csr |= CLR_FX | AT91_UDP_TXPKTRDY;
2558ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
2568ea1fbf7SHeiko Schocher req->req.actual += count;
2578ea1fbf7SHeiko Schocher
2588ea1fbf7SHeiko Schocher PACKET("%s %p in/%d%s\n", ep->ep.name, &req->req, count,
2598ea1fbf7SHeiko Schocher is_last ? " (done)" : "");
2608ea1fbf7SHeiko Schocher if (is_last)
2618ea1fbf7SHeiko Schocher done(ep, req, 0);
2628ea1fbf7SHeiko Schocher return is_last;
2638ea1fbf7SHeiko Schocher }
2648ea1fbf7SHeiko Schocher
nuke(struct at91_ep * ep,int status)2658ea1fbf7SHeiko Schocher static void nuke(struct at91_ep *ep, int status)
2668ea1fbf7SHeiko Schocher {
2678ea1fbf7SHeiko Schocher struct at91_request *req;
2688ea1fbf7SHeiko Schocher
2698ea1fbf7SHeiko Schocher /* terminate any request in the queue */
2708ea1fbf7SHeiko Schocher ep->stopped = 1;
2718ea1fbf7SHeiko Schocher if (list_empty(&ep->queue))
2728ea1fbf7SHeiko Schocher return;
2738ea1fbf7SHeiko Schocher
2748ea1fbf7SHeiko Schocher VDBG("%s %s\n", __func__, ep->ep.name);
2758ea1fbf7SHeiko Schocher while (!list_empty(&ep->queue)) {
2768ea1fbf7SHeiko Schocher req = list_entry(ep->queue.next, struct at91_request, queue);
2778ea1fbf7SHeiko Schocher done(ep, req, status);
2788ea1fbf7SHeiko Schocher }
2798ea1fbf7SHeiko Schocher }
2808ea1fbf7SHeiko Schocher
2818ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
2828ea1fbf7SHeiko Schocher
at91_ep_enable(struct usb_ep * _ep,const struct usb_endpoint_descriptor * desc)2838ea1fbf7SHeiko Schocher static int at91_ep_enable(struct usb_ep *_ep,
2848ea1fbf7SHeiko Schocher const struct usb_endpoint_descriptor *desc)
2858ea1fbf7SHeiko Schocher {
2868ea1fbf7SHeiko Schocher struct at91_ep *ep = container_of(_ep, struct at91_ep, ep);
2878ea1fbf7SHeiko Schocher struct at91_udc *udc;
2888ea1fbf7SHeiko Schocher u16 maxpacket;
2898ea1fbf7SHeiko Schocher u32 tmp;
2908ea1fbf7SHeiko Schocher unsigned long flags;
2918ea1fbf7SHeiko Schocher
2928ea1fbf7SHeiko Schocher if (!_ep || !ep
2938ea1fbf7SHeiko Schocher || !desc || _ep->name == ep0name
2948ea1fbf7SHeiko Schocher || desc->bDescriptorType != USB_DT_ENDPOINT
2958ea1fbf7SHeiko Schocher || (maxpacket = usb_endpoint_maxp(desc)) == 0
2968ea1fbf7SHeiko Schocher || maxpacket > ep->maxpacket) {
2978ea1fbf7SHeiko Schocher DBG("bad ep or descriptor\n");
2988ea1fbf7SHeiko Schocher return -EINVAL;
2998ea1fbf7SHeiko Schocher }
3008ea1fbf7SHeiko Schocher
3018ea1fbf7SHeiko Schocher udc = ep->udc;
3028ea1fbf7SHeiko Schocher if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) {
3038ea1fbf7SHeiko Schocher DBG("bogus device state\n");
3048ea1fbf7SHeiko Schocher return -ESHUTDOWN;
3058ea1fbf7SHeiko Schocher }
3068ea1fbf7SHeiko Schocher
3078ea1fbf7SHeiko Schocher tmp = usb_endpoint_type(desc);
3088ea1fbf7SHeiko Schocher switch (tmp) {
3098ea1fbf7SHeiko Schocher case USB_ENDPOINT_XFER_CONTROL:
3108ea1fbf7SHeiko Schocher DBG("only one control endpoint\n");
3118ea1fbf7SHeiko Schocher return -EINVAL;
3128ea1fbf7SHeiko Schocher case USB_ENDPOINT_XFER_INT:
3138ea1fbf7SHeiko Schocher if (maxpacket > 64)
3148ea1fbf7SHeiko Schocher goto bogus_max;
3158ea1fbf7SHeiko Schocher break;
3168ea1fbf7SHeiko Schocher case USB_ENDPOINT_XFER_BULK:
3178ea1fbf7SHeiko Schocher switch (maxpacket) {
3188ea1fbf7SHeiko Schocher case 8:
3198ea1fbf7SHeiko Schocher case 16:
3208ea1fbf7SHeiko Schocher case 32:
3218ea1fbf7SHeiko Schocher case 64:
3228ea1fbf7SHeiko Schocher goto ok;
3238ea1fbf7SHeiko Schocher }
3248ea1fbf7SHeiko Schocher bogus_max:
3258ea1fbf7SHeiko Schocher DBG("bogus maxpacket %d\n", maxpacket);
3268ea1fbf7SHeiko Schocher return -EINVAL;
3278ea1fbf7SHeiko Schocher case USB_ENDPOINT_XFER_ISOC:
3288ea1fbf7SHeiko Schocher if (!ep->is_pingpong) {
3298ea1fbf7SHeiko Schocher DBG("iso requires double buffering\n");
3308ea1fbf7SHeiko Schocher return -EINVAL;
3318ea1fbf7SHeiko Schocher }
3328ea1fbf7SHeiko Schocher break;
3338ea1fbf7SHeiko Schocher }
3348ea1fbf7SHeiko Schocher
3358ea1fbf7SHeiko Schocher ok:
3368ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
3378ea1fbf7SHeiko Schocher
3388ea1fbf7SHeiko Schocher /* initialize endpoint to match this descriptor */
3398ea1fbf7SHeiko Schocher ep->is_in = usb_endpoint_dir_in(desc);
3408ea1fbf7SHeiko Schocher ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC);
3418ea1fbf7SHeiko Schocher ep->stopped = 0;
3428ea1fbf7SHeiko Schocher if (ep->is_in)
3438ea1fbf7SHeiko Schocher tmp |= 0x04;
3448ea1fbf7SHeiko Schocher tmp <<= 8;
3458ea1fbf7SHeiko Schocher tmp |= AT91_UDP_EPEDS;
3468ea1fbf7SHeiko Schocher __raw_writel(tmp, ep->creg);
3478ea1fbf7SHeiko Schocher
3488ea1fbf7SHeiko Schocher ep->ep.maxpacket = maxpacket;
3498ea1fbf7SHeiko Schocher
3508ea1fbf7SHeiko Schocher /*
3518ea1fbf7SHeiko Schocher * reset/init endpoint fifo. NOTE: leaves fifo_bank alone,
3528ea1fbf7SHeiko Schocher * since endpoint resets don't reset hw pingpong state.
3538ea1fbf7SHeiko Schocher */
3548ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask);
3558ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, 0);
3568ea1fbf7SHeiko Schocher
3578ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
3588ea1fbf7SHeiko Schocher return 0;
3598ea1fbf7SHeiko Schocher }
3608ea1fbf7SHeiko Schocher
at91_ep_disable(struct usb_ep * _ep)3618ea1fbf7SHeiko Schocher static int at91_ep_disable (struct usb_ep * _ep)
3628ea1fbf7SHeiko Schocher {
3638ea1fbf7SHeiko Schocher struct at91_ep *ep = container_of(_ep, struct at91_ep, ep);
3648ea1fbf7SHeiko Schocher struct at91_udc *udc = ep->udc;
3658ea1fbf7SHeiko Schocher unsigned long flags;
3668ea1fbf7SHeiko Schocher
3678ea1fbf7SHeiko Schocher if (ep == &ep->udc->ep[0])
3688ea1fbf7SHeiko Schocher return -EINVAL;
3698ea1fbf7SHeiko Schocher
3708ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
3718ea1fbf7SHeiko Schocher
3728ea1fbf7SHeiko Schocher nuke(ep, -ESHUTDOWN);
3738ea1fbf7SHeiko Schocher
3748ea1fbf7SHeiko Schocher /* restore the endpoint's pristine config */
3758ea1fbf7SHeiko Schocher ep->ep.desc = NULL;
3768ea1fbf7SHeiko Schocher ep->ep.maxpacket = ep->maxpacket;
3778ea1fbf7SHeiko Schocher
3788ea1fbf7SHeiko Schocher /* reset fifos and endpoint */
3798ea1fbf7SHeiko Schocher if (ep->udc->clocked) {
3808ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask);
3818ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, 0);
3828ea1fbf7SHeiko Schocher __raw_writel(0, ep->creg);
3838ea1fbf7SHeiko Schocher }
3848ea1fbf7SHeiko Schocher
3858ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
3868ea1fbf7SHeiko Schocher return 0;
3878ea1fbf7SHeiko Schocher }
3888ea1fbf7SHeiko Schocher
3898ea1fbf7SHeiko Schocher /*
3908ea1fbf7SHeiko Schocher * this is a PIO-only driver, so there's nothing
3918ea1fbf7SHeiko Schocher * interesting for request or buffer allocation.
3928ea1fbf7SHeiko Schocher */
3938ea1fbf7SHeiko Schocher
3948ea1fbf7SHeiko Schocher static struct usb_request *
at91_ep_alloc_request(struct usb_ep * _ep,gfp_t gfp_flags)3958ea1fbf7SHeiko Schocher at91_ep_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
3968ea1fbf7SHeiko Schocher {
3978ea1fbf7SHeiko Schocher struct at91_request *req;
3988ea1fbf7SHeiko Schocher
3998ea1fbf7SHeiko Schocher req = kzalloc(sizeof (struct at91_request), gfp_flags);
4008ea1fbf7SHeiko Schocher if (!req)
4018ea1fbf7SHeiko Schocher return NULL;
4028ea1fbf7SHeiko Schocher
4038ea1fbf7SHeiko Schocher INIT_LIST_HEAD(&req->queue);
4048ea1fbf7SHeiko Schocher return &req->req;
4058ea1fbf7SHeiko Schocher }
4068ea1fbf7SHeiko Schocher
at91_ep_free_request(struct usb_ep * _ep,struct usb_request * _req)4078ea1fbf7SHeiko Schocher static void at91_ep_free_request(struct usb_ep *_ep, struct usb_request *_req)
4088ea1fbf7SHeiko Schocher {
4098ea1fbf7SHeiko Schocher struct at91_request *req;
4108ea1fbf7SHeiko Schocher
4118ea1fbf7SHeiko Schocher req = container_of(_req, struct at91_request, req);
4128ea1fbf7SHeiko Schocher BUG_ON(!list_empty(&req->queue));
4138ea1fbf7SHeiko Schocher kfree(req);
4148ea1fbf7SHeiko Schocher }
4158ea1fbf7SHeiko Schocher
at91_ep_queue(struct usb_ep * _ep,struct usb_request * _req,gfp_t gfp_flags)4168ea1fbf7SHeiko Schocher static int at91_ep_queue(struct usb_ep *_ep,
4178ea1fbf7SHeiko Schocher struct usb_request *_req, gfp_t gfp_flags)
4188ea1fbf7SHeiko Schocher {
4198ea1fbf7SHeiko Schocher struct at91_request *req;
4208ea1fbf7SHeiko Schocher struct at91_ep *ep;
4218ea1fbf7SHeiko Schocher struct at91_udc *udc;
4228ea1fbf7SHeiko Schocher int status;
4238ea1fbf7SHeiko Schocher unsigned long flags;
4248ea1fbf7SHeiko Schocher
4258ea1fbf7SHeiko Schocher req = container_of(_req, struct at91_request, req);
4268ea1fbf7SHeiko Schocher ep = container_of(_ep, struct at91_ep, ep);
4278ea1fbf7SHeiko Schocher
4288ea1fbf7SHeiko Schocher if (!_req || !_req->complete
4298ea1fbf7SHeiko Schocher || !_req->buf || !list_empty(&req->queue)) {
4308ea1fbf7SHeiko Schocher DBG("invalid request\n");
4318ea1fbf7SHeiko Schocher return -EINVAL;
4328ea1fbf7SHeiko Schocher }
4338ea1fbf7SHeiko Schocher
4348ea1fbf7SHeiko Schocher if (!_ep || (!ep->ep.desc && ep->ep.name != ep0name)) {
4358ea1fbf7SHeiko Schocher DBG("invalid ep\n");
4368ea1fbf7SHeiko Schocher return -EINVAL;
4378ea1fbf7SHeiko Schocher }
4388ea1fbf7SHeiko Schocher
4398ea1fbf7SHeiko Schocher udc = ep->udc;
4408ea1fbf7SHeiko Schocher
4418ea1fbf7SHeiko Schocher if (!udc || !udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) {
4428ea1fbf7SHeiko Schocher DBG("invalid device\n");
4438ea1fbf7SHeiko Schocher return -EINVAL;
4448ea1fbf7SHeiko Schocher }
4458ea1fbf7SHeiko Schocher
4468ea1fbf7SHeiko Schocher _req->status = -EINPROGRESS;
4478ea1fbf7SHeiko Schocher _req->actual = 0;
4488ea1fbf7SHeiko Schocher
4498ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
4508ea1fbf7SHeiko Schocher
4518ea1fbf7SHeiko Schocher /* try to kickstart any empty and idle queue */
4528ea1fbf7SHeiko Schocher if (list_empty(&ep->queue) && !ep->stopped) {
4538ea1fbf7SHeiko Schocher int is_ep0;
4548ea1fbf7SHeiko Schocher
4558ea1fbf7SHeiko Schocher /*
4568ea1fbf7SHeiko Schocher * If this control request has a non-empty DATA stage, this
4578ea1fbf7SHeiko Schocher * will start that stage. It works just like a non-control
4588ea1fbf7SHeiko Schocher * request (until the status stage starts, maybe early).
4598ea1fbf7SHeiko Schocher *
4608ea1fbf7SHeiko Schocher * If the data stage is empty, then this starts a successful
4618ea1fbf7SHeiko Schocher * IN/STATUS stage. (Unsuccessful ones use set_halt.)
4628ea1fbf7SHeiko Schocher */
4638ea1fbf7SHeiko Schocher is_ep0 = (ep->ep.name == ep0name);
4648ea1fbf7SHeiko Schocher if (is_ep0) {
4658ea1fbf7SHeiko Schocher u32 tmp;
4668ea1fbf7SHeiko Schocher
4678ea1fbf7SHeiko Schocher if (!udc->req_pending) {
4688ea1fbf7SHeiko Schocher status = -EINVAL;
4698ea1fbf7SHeiko Schocher goto done;
4708ea1fbf7SHeiko Schocher }
4718ea1fbf7SHeiko Schocher
4728ea1fbf7SHeiko Schocher /*
4738ea1fbf7SHeiko Schocher * defer changing CONFG until after the gadget driver
4748ea1fbf7SHeiko Schocher * reconfigures the endpoints.
4758ea1fbf7SHeiko Schocher */
4768ea1fbf7SHeiko Schocher if (udc->wait_for_config_ack) {
4778ea1fbf7SHeiko Schocher tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT);
4788ea1fbf7SHeiko Schocher tmp ^= AT91_UDP_CONFG;
4798ea1fbf7SHeiko Schocher VDBG("toggle config\n");
4808ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp);
4818ea1fbf7SHeiko Schocher }
4828ea1fbf7SHeiko Schocher if (req->req.length == 0) {
4838ea1fbf7SHeiko Schocher ep0_in_status:
4848ea1fbf7SHeiko Schocher PACKET("ep0 in/status\n");
4858ea1fbf7SHeiko Schocher status = 0;
4868ea1fbf7SHeiko Schocher tmp = __raw_readl(ep->creg);
4878ea1fbf7SHeiko Schocher tmp &= ~SET_FX;
4888ea1fbf7SHeiko Schocher tmp |= CLR_FX | AT91_UDP_TXPKTRDY;
4898ea1fbf7SHeiko Schocher __raw_writel(tmp, ep->creg);
4908ea1fbf7SHeiko Schocher udc->req_pending = 0;
4918ea1fbf7SHeiko Schocher goto done;
4928ea1fbf7SHeiko Schocher }
4938ea1fbf7SHeiko Schocher }
4948ea1fbf7SHeiko Schocher
4958ea1fbf7SHeiko Schocher if (ep->is_in)
4968ea1fbf7SHeiko Schocher status = write_fifo(ep, req);
4978ea1fbf7SHeiko Schocher else {
4988ea1fbf7SHeiko Schocher status = read_fifo(ep, req);
4998ea1fbf7SHeiko Schocher
5008ea1fbf7SHeiko Schocher /* IN/STATUS stage is otherwise triggered by irq */
5018ea1fbf7SHeiko Schocher if (status && is_ep0)
5028ea1fbf7SHeiko Schocher goto ep0_in_status;
5038ea1fbf7SHeiko Schocher }
5048ea1fbf7SHeiko Schocher } else
5058ea1fbf7SHeiko Schocher status = 0;
5068ea1fbf7SHeiko Schocher
5078ea1fbf7SHeiko Schocher if (req && !status) {
5088ea1fbf7SHeiko Schocher list_add_tail (&req->queue, &ep->queue);
5098ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IER, ep->int_mask);
5108ea1fbf7SHeiko Schocher }
5118ea1fbf7SHeiko Schocher done:
5128ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
5138ea1fbf7SHeiko Schocher return (status < 0) ? status : 0;
5148ea1fbf7SHeiko Schocher }
5158ea1fbf7SHeiko Schocher
at91_ep_dequeue(struct usb_ep * _ep,struct usb_request * _req)5168ea1fbf7SHeiko Schocher static int at91_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
5178ea1fbf7SHeiko Schocher {
5188ea1fbf7SHeiko Schocher struct at91_ep *ep;
5198ea1fbf7SHeiko Schocher struct at91_request *req;
5208ea1fbf7SHeiko Schocher unsigned long flags;
5218ea1fbf7SHeiko Schocher
5228ea1fbf7SHeiko Schocher ep = container_of(_ep, struct at91_ep, ep);
5238ea1fbf7SHeiko Schocher if (!_ep || ep->ep.name == ep0name)
5248ea1fbf7SHeiko Schocher return -EINVAL;
5258ea1fbf7SHeiko Schocher
5268ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
5278ea1fbf7SHeiko Schocher
5288ea1fbf7SHeiko Schocher /* make sure it's actually queued on this endpoint */
5298ea1fbf7SHeiko Schocher list_for_each_entry (req, &ep->queue, queue) {
5308ea1fbf7SHeiko Schocher if (&req->req == _req)
5318ea1fbf7SHeiko Schocher break;
5328ea1fbf7SHeiko Schocher }
5338ea1fbf7SHeiko Schocher if (&req->req != _req) {
5348ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
5358ea1fbf7SHeiko Schocher return -EINVAL;
5368ea1fbf7SHeiko Schocher }
5378ea1fbf7SHeiko Schocher
5388ea1fbf7SHeiko Schocher done(ep, req, -ECONNRESET);
5398ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
5408ea1fbf7SHeiko Schocher return 0;
5418ea1fbf7SHeiko Schocher }
5428ea1fbf7SHeiko Schocher
at91_ep_set_halt(struct usb_ep * _ep,int value)5438ea1fbf7SHeiko Schocher static int at91_ep_set_halt(struct usb_ep *_ep, int value)
5448ea1fbf7SHeiko Schocher {
5458ea1fbf7SHeiko Schocher struct at91_ep *ep = container_of(_ep, struct at91_ep, ep);
5468ea1fbf7SHeiko Schocher struct at91_udc *udc = ep->udc;
5478ea1fbf7SHeiko Schocher u32 __iomem *creg;
5488ea1fbf7SHeiko Schocher u32 csr;
5498ea1fbf7SHeiko Schocher unsigned long flags;
5508ea1fbf7SHeiko Schocher int status = 0;
5518ea1fbf7SHeiko Schocher
5528ea1fbf7SHeiko Schocher if (!_ep || ep->is_iso || !ep->udc->clocked)
5538ea1fbf7SHeiko Schocher return -EINVAL;
5548ea1fbf7SHeiko Schocher
5558ea1fbf7SHeiko Schocher creg = ep->creg;
5568ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
5578ea1fbf7SHeiko Schocher
5588ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
5598ea1fbf7SHeiko Schocher
5608ea1fbf7SHeiko Schocher /*
5618ea1fbf7SHeiko Schocher * fail with still-busy IN endpoints, ensuring correct sequencing
5628ea1fbf7SHeiko Schocher * of data tx then stall. note that the fifo rx bytecount isn't
5638ea1fbf7SHeiko Schocher * completely accurate as a tx bytecount.
5648ea1fbf7SHeiko Schocher */
5658ea1fbf7SHeiko Schocher if (ep->is_in && (!list_empty(&ep->queue) || (csr >> 16) != 0))
5668ea1fbf7SHeiko Schocher status = -EAGAIN;
5678ea1fbf7SHeiko Schocher else {
5688ea1fbf7SHeiko Schocher csr |= CLR_FX;
5698ea1fbf7SHeiko Schocher csr &= ~SET_FX;
5708ea1fbf7SHeiko Schocher if (value) {
5718ea1fbf7SHeiko Schocher csr |= AT91_UDP_FORCESTALL;
5728ea1fbf7SHeiko Schocher VDBG("halt %s\n", ep->ep.name);
5738ea1fbf7SHeiko Schocher } else {
5748ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask);
5758ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, 0);
5768ea1fbf7SHeiko Schocher csr &= ~AT91_UDP_FORCESTALL;
5778ea1fbf7SHeiko Schocher }
5788ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
5798ea1fbf7SHeiko Schocher }
5808ea1fbf7SHeiko Schocher
5818ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
5828ea1fbf7SHeiko Schocher return status;
5838ea1fbf7SHeiko Schocher }
5848ea1fbf7SHeiko Schocher
5858ea1fbf7SHeiko Schocher static const struct usb_ep_ops at91_ep_ops = {
5868ea1fbf7SHeiko Schocher .enable = at91_ep_enable,
5878ea1fbf7SHeiko Schocher .disable = at91_ep_disable,
5888ea1fbf7SHeiko Schocher .alloc_request = at91_ep_alloc_request,
5898ea1fbf7SHeiko Schocher .free_request = at91_ep_free_request,
5908ea1fbf7SHeiko Schocher .queue = at91_ep_queue,
5918ea1fbf7SHeiko Schocher .dequeue = at91_ep_dequeue,
5928ea1fbf7SHeiko Schocher .set_halt = at91_ep_set_halt,
5938ea1fbf7SHeiko Schocher /* there's only imprecise fifo status reporting */
5948ea1fbf7SHeiko Schocher };
5958ea1fbf7SHeiko Schocher
5968ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
5978ea1fbf7SHeiko Schocher
at91_get_frame(struct usb_gadget * gadget)5988ea1fbf7SHeiko Schocher static int at91_get_frame(struct usb_gadget *gadget)
5998ea1fbf7SHeiko Schocher {
6008ea1fbf7SHeiko Schocher struct at91_udc *udc = to_udc(gadget);
6018ea1fbf7SHeiko Schocher
6028ea1fbf7SHeiko Schocher if (!to_udc(gadget)->clocked)
6038ea1fbf7SHeiko Schocher return -EINVAL;
6048ea1fbf7SHeiko Schocher return at91_udp_read(udc, AT91_UDP_FRM_NUM) & AT91_UDP_NUM;
6058ea1fbf7SHeiko Schocher }
6068ea1fbf7SHeiko Schocher
at91_wakeup(struct usb_gadget * gadget)6078ea1fbf7SHeiko Schocher static int at91_wakeup(struct usb_gadget *gadget)
6088ea1fbf7SHeiko Schocher {
6098ea1fbf7SHeiko Schocher struct at91_udc *udc = to_udc(gadget);
6108ea1fbf7SHeiko Schocher u32 glbstate;
6118ea1fbf7SHeiko Schocher int status = -EINVAL;
6128ea1fbf7SHeiko Schocher unsigned long flags;
6138ea1fbf7SHeiko Schocher
6148ea1fbf7SHeiko Schocher DBG("%s\n", __func__ );
6158ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
6168ea1fbf7SHeiko Schocher
6178ea1fbf7SHeiko Schocher if (!udc->clocked || !udc->suspended)
6188ea1fbf7SHeiko Schocher goto done;
6198ea1fbf7SHeiko Schocher
6208ea1fbf7SHeiko Schocher /* NOTE: some "early versions" handle ESR differently ... */
6218ea1fbf7SHeiko Schocher
6228ea1fbf7SHeiko Schocher glbstate = at91_udp_read(udc, AT91_UDP_GLB_STAT);
6238ea1fbf7SHeiko Schocher if (!(glbstate & AT91_UDP_ESR))
6248ea1fbf7SHeiko Schocher goto done;
6258ea1fbf7SHeiko Schocher glbstate |= AT91_UDP_ESR;
6268ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_GLB_STAT, glbstate);
6278ea1fbf7SHeiko Schocher
6288ea1fbf7SHeiko Schocher done:
6298ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
6308ea1fbf7SHeiko Schocher return status;
6318ea1fbf7SHeiko Schocher }
6328ea1fbf7SHeiko Schocher
6338ea1fbf7SHeiko Schocher /* reinit == restore initial software state */
udc_reinit(struct at91_udc * udc)6348ea1fbf7SHeiko Schocher static void udc_reinit(struct at91_udc *udc)
6358ea1fbf7SHeiko Schocher {
6368ea1fbf7SHeiko Schocher u32 i;
6378ea1fbf7SHeiko Schocher
6388ea1fbf7SHeiko Schocher INIT_LIST_HEAD(&udc->gadget.ep_list);
6398ea1fbf7SHeiko Schocher INIT_LIST_HEAD(&udc->gadget.ep0->ep_list);
6408ea1fbf7SHeiko Schocher
6418ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
6428ea1fbf7SHeiko Schocher struct at91_ep *ep = &udc->ep[i];
6438ea1fbf7SHeiko Schocher
6448ea1fbf7SHeiko Schocher if (i != 0)
6458ea1fbf7SHeiko Schocher list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
6468ea1fbf7SHeiko Schocher ep->ep.desc = NULL;
6478ea1fbf7SHeiko Schocher ep->stopped = 0;
6488ea1fbf7SHeiko Schocher ep->fifo_bank = 0;
6498ea1fbf7SHeiko Schocher usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket);
6508ea1fbf7SHeiko Schocher ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i);
6518ea1fbf7SHeiko Schocher /* initialize one queue per endpoint */
6528ea1fbf7SHeiko Schocher INIT_LIST_HEAD(&ep->queue);
6538ea1fbf7SHeiko Schocher }
6548ea1fbf7SHeiko Schocher }
6558ea1fbf7SHeiko Schocher
reset_gadget(struct at91_udc * udc)6568ea1fbf7SHeiko Schocher static void reset_gadget(struct at91_udc *udc)
6578ea1fbf7SHeiko Schocher {
6588ea1fbf7SHeiko Schocher struct usb_gadget_driver *driver = udc->driver;
6598ea1fbf7SHeiko Schocher int i;
6608ea1fbf7SHeiko Schocher
6618ea1fbf7SHeiko Schocher if (udc->gadget.speed == USB_SPEED_UNKNOWN)
6628ea1fbf7SHeiko Schocher driver = NULL;
6638ea1fbf7SHeiko Schocher udc->gadget.speed = USB_SPEED_UNKNOWN;
6648ea1fbf7SHeiko Schocher udc->suspended = 0;
6658ea1fbf7SHeiko Schocher
6668ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
6678ea1fbf7SHeiko Schocher struct at91_ep *ep = &udc->ep[i];
6688ea1fbf7SHeiko Schocher
6698ea1fbf7SHeiko Schocher ep->stopped = 1;
6708ea1fbf7SHeiko Schocher nuke(ep, -ESHUTDOWN);
6718ea1fbf7SHeiko Schocher }
6728ea1fbf7SHeiko Schocher if (driver) {
6738ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
67462019767SHeiko Schocher udc->driver->disconnect(&udc->gadget);
6758ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
6768ea1fbf7SHeiko Schocher }
6778ea1fbf7SHeiko Schocher
6788ea1fbf7SHeiko Schocher udc_reinit(udc);
6798ea1fbf7SHeiko Schocher }
6808ea1fbf7SHeiko Schocher
stop_activity(struct at91_udc * udc)6818ea1fbf7SHeiko Schocher static void stop_activity(struct at91_udc *udc)
6828ea1fbf7SHeiko Schocher {
6838ea1fbf7SHeiko Schocher struct usb_gadget_driver *driver = udc->driver;
6848ea1fbf7SHeiko Schocher int i;
6858ea1fbf7SHeiko Schocher
6868ea1fbf7SHeiko Schocher if (udc->gadget.speed == USB_SPEED_UNKNOWN)
6878ea1fbf7SHeiko Schocher driver = NULL;
6888ea1fbf7SHeiko Schocher udc->gadget.speed = USB_SPEED_UNKNOWN;
6898ea1fbf7SHeiko Schocher udc->suspended = 0;
6908ea1fbf7SHeiko Schocher
6918ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
6928ea1fbf7SHeiko Schocher struct at91_ep *ep = &udc->ep[i];
6938ea1fbf7SHeiko Schocher ep->stopped = 1;
6948ea1fbf7SHeiko Schocher nuke(ep, -ESHUTDOWN);
6958ea1fbf7SHeiko Schocher }
6968ea1fbf7SHeiko Schocher if (driver) {
6978ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
6988ea1fbf7SHeiko Schocher driver->disconnect(&udc->gadget);
6998ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
7008ea1fbf7SHeiko Schocher }
7018ea1fbf7SHeiko Schocher
7028ea1fbf7SHeiko Schocher udc_reinit(udc);
7038ea1fbf7SHeiko Schocher }
7048ea1fbf7SHeiko Schocher
clk_on(struct at91_udc * udc)7058ea1fbf7SHeiko Schocher static void clk_on(struct at91_udc *udc)
7068ea1fbf7SHeiko Schocher {
7078ea1fbf7SHeiko Schocher if (udc->clocked)
7088ea1fbf7SHeiko Schocher return;
7098ea1fbf7SHeiko Schocher udc->clocked = 1;
7108ea1fbf7SHeiko Schocher }
7118ea1fbf7SHeiko Schocher
clk_off(struct at91_udc * udc)7128ea1fbf7SHeiko Schocher static void clk_off(struct at91_udc *udc)
7138ea1fbf7SHeiko Schocher {
7148ea1fbf7SHeiko Schocher if (!udc->clocked)
7158ea1fbf7SHeiko Schocher return;
7168ea1fbf7SHeiko Schocher udc->clocked = 0;
7178ea1fbf7SHeiko Schocher udc->gadget.speed = USB_SPEED_UNKNOWN;
7188ea1fbf7SHeiko Schocher }
7198ea1fbf7SHeiko Schocher
7208ea1fbf7SHeiko Schocher /*
7218ea1fbf7SHeiko Schocher * activate/deactivate link with host; minimize power usage for
7228ea1fbf7SHeiko Schocher * inactive links by cutting clocks and transceiver power.
7238ea1fbf7SHeiko Schocher */
pullup(struct at91_udc * udc,int is_on)7248ea1fbf7SHeiko Schocher static void pullup(struct at91_udc *udc, int is_on)
7258ea1fbf7SHeiko Schocher {
7268ea1fbf7SHeiko Schocher if (!udc->enabled || !udc->vbus)
7278ea1fbf7SHeiko Schocher is_on = 0;
7288ea1fbf7SHeiko Schocher DBG("%sactive\n", is_on ? "" : "in");
7298ea1fbf7SHeiko Schocher
7308ea1fbf7SHeiko Schocher if (is_on) {
7318ea1fbf7SHeiko Schocher clk_on(udc);
7328ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM);
7338ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_TXVC, 0);
7348ea1fbf7SHeiko Schocher } else {
7358ea1fbf7SHeiko Schocher stop_activity(udc);
7368ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM);
7378ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
7388ea1fbf7SHeiko Schocher clk_off(udc);
7398ea1fbf7SHeiko Schocher }
7408ea1fbf7SHeiko Schocher
7418ea1fbf7SHeiko Schocher if (udc->caps && udc->caps->pullup)
7428ea1fbf7SHeiko Schocher udc->caps->pullup(udc, is_on);
7438ea1fbf7SHeiko Schocher }
7448ea1fbf7SHeiko Schocher
7458ea1fbf7SHeiko Schocher /* vbus is here! turn everything on that's ready */
at91_vbus_session(struct usb_gadget * gadget,int is_active)7468ea1fbf7SHeiko Schocher static int at91_vbus_session(struct usb_gadget *gadget, int is_active)
7478ea1fbf7SHeiko Schocher {
7488ea1fbf7SHeiko Schocher struct at91_udc *udc = to_udc(gadget);
7498ea1fbf7SHeiko Schocher unsigned long flags;
7508ea1fbf7SHeiko Schocher
7518ea1fbf7SHeiko Schocher /* VDBG("vbus %s\n", is_active ? "on" : "off"); */
7528ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
7538ea1fbf7SHeiko Schocher udc->vbus = (is_active != 0);
7548ea1fbf7SHeiko Schocher if (udc->driver)
7558ea1fbf7SHeiko Schocher pullup(udc, is_active);
7568ea1fbf7SHeiko Schocher else
7578ea1fbf7SHeiko Schocher pullup(udc, 0);
7588ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
7598ea1fbf7SHeiko Schocher return 0;
7608ea1fbf7SHeiko Schocher }
7618ea1fbf7SHeiko Schocher
at91_pullup(struct usb_gadget * gadget,int is_on)7628ea1fbf7SHeiko Schocher static int at91_pullup(struct usb_gadget *gadget, int is_on)
7638ea1fbf7SHeiko Schocher {
7648ea1fbf7SHeiko Schocher struct at91_udc *udc = to_udc(gadget);
7658ea1fbf7SHeiko Schocher unsigned long flags;
7668ea1fbf7SHeiko Schocher
7678ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
7688ea1fbf7SHeiko Schocher udc->enabled = is_on = !!is_on;
7698ea1fbf7SHeiko Schocher pullup(udc, is_on);
7708ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
7718ea1fbf7SHeiko Schocher return 0;
7728ea1fbf7SHeiko Schocher }
7738ea1fbf7SHeiko Schocher
at91_set_selfpowered(struct usb_gadget * gadget,int is_on)7748ea1fbf7SHeiko Schocher static int at91_set_selfpowered(struct usb_gadget *gadget, int is_on)
7758ea1fbf7SHeiko Schocher {
7768ea1fbf7SHeiko Schocher struct at91_udc *udc = to_udc(gadget);
7778ea1fbf7SHeiko Schocher unsigned long flags;
7788ea1fbf7SHeiko Schocher
7798ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
78062019767SHeiko Schocher udc->selfpowered = (is_on != 0);
7818ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
7828ea1fbf7SHeiko Schocher return 0;
7838ea1fbf7SHeiko Schocher }
7848ea1fbf7SHeiko Schocher
7858ea1fbf7SHeiko Schocher static int at91_start(struct usb_gadget *gadget,
7868ea1fbf7SHeiko Schocher struct usb_gadget_driver *driver);
7878ea1fbf7SHeiko Schocher static int at91_stop(struct usb_gadget *gadget);
7888ea1fbf7SHeiko Schocher
7898ea1fbf7SHeiko Schocher static const struct usb_gadget_ops at91_udc_ops = {
7908ea1fbf7SHeiko Schocher .get_frame = at91_get_frame,
7918ea1fbf7SHeiko Schocher .wakeup = at91_wakeup,
7928ea1fbf7SHeiko Schocher .set_selfpowered = at91_set_selfpowered,
7938ea1fbf7SHeiko Schocher .vbus_session = at91_vbus_session,
7948ea1fbf7SHeiko Schocher .pullup = at91_pullup,
7958ea1fbf7SHeiko Schocher .udc_start = at91_start,
7968ea1fbf7SHeiko Schocher .udc_stop = at91_stop,
7978ea1fbf7SHeiko Schocher
7988ea1fbf7SHeiko Schocher /*
7998ea1fbf7SHeiko Schocher * VBUS-powered devices may also also want to support bigger
8008ea1fbf7SHeiko Schocher * power budgets after an appropriate SET_CONFIGURATION.
8018ea1fbf7SHeiko Schocher */
8028ea1fbf7SHeiko Schocher /* .vbus_power = at91_vbus_power, */
8038ea1fbf7SHeiko Schocher };
8048ea1fbf7SHeiko Schocher
8058ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
8068ea1fbf7SHeiko Schocher
handle_ep(struct at91_ep * ep)8078ea1fbf7SHeiko Schocher static int handle_ep(struct at91_ep *ep)
8088ea1fbf7SHeiko Schocher {
8098ea1fbf7SHeiko Schocher struct at91_request *req;
8108ea1fbf7SHeiko Schocher u32 __iomem *creg = ep->creg;
8118ea1fbf7SHeiko Schocher u32 csr = __raw_readl(creg);
8128ea1fbf7SHeiko Schocher
8138ea1fbf7SHeiko Schocher if (!list_empty(&ep->queue))
8148ea1fbf7SHeiko Schocher req = list_entry(ep->queue.next,
8158ea1fbf7SHeiko Schocher struct at91_request, queue);
8168ea1fbf7SHeiko Schocher else
8178ea1fbf7SHeiko Schocher req = NULL;
8188ea1fbf7SHeiko Schocher
8198ea1fbf7SHeiko Schocher if (ep->is_in) {
8208ea1fbf7SHeiko Schocher if (csr & (AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)) {
8218ea1fbf7SHeiko Schocher csr |= CLR_FX;
8228ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP);
8238ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
8248ea1fbf7SHeiko Schocher }
8258ea1fbf7SHeiko Schocher if (req)
8268ea1fbf7SHeiko Schocher return write_fifo(ep, req);
8278ea1fbf7SHeiko Schocher
8288ea1fbf7SHeiko Schocher } else {
8298ea1fbf7SHeiko Schocher if (csr & AT91_UDP_STALLSENT) {
8308ea1fbf7SHeiko Schocher /* STALLSENT bit == ISOERR */
8318ea1fbf7SHeiko Schocher if (ep->is_iso && req)
8328ea1fbf7SHeiko Schocher req->req.status = -EILSEQ;
8338ea1fbf7SHeiko Schocher csr |= CLR_FX;
8348ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_STALLSENT);
8358ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
8368ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
8378ea1fbf7SHeiko Schocher }
8388ea1fbf7SHeiko Schocher if (req && (csr & RX_DATA_READY))
8398ea1fbf7SHeiko Schocher return read_fifo(ep, req);
8408ea1fbf7SHeiko Schocher }
8418ea1fbf7SHeiko Schocher return 0;
8428ea1fbf7SHeiko Schocher }
8438ea1fbf7SHeiko Schocher
8448ea1fbf7SHeiko Schocher union setup {
8458ea1fbf7SHeiko Schocher u8 raw[8];
8468ea1fbf7SHeiko Schocher struct usb_ctrlrequest r;
8478ea1fbf7SHeiko Schocher };
8488ea1fbf7SHeiko Schocher
handle_setup(struct at91_udc * udc,struct at91_ep * ep,u32 csr)8498ea1fbf7SHeiko Schocher static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr)
8508ea1fbf7SHeiko Schocher {
8518ea1fbf7SHeiko Schocher u32 __iomem *creg = ep->creg;
8528ea1fbf7SHeiko Schocher u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0));
8538ea1fbf7SHeiko Schocher unsigned rxcount, i = 0;
8548ea1fbf7SHeiko Schocher u32 tmp;
8558ea1fbf7SHeiko Schocher union setup pkt;
8568ea1fbf7SHeiko Schocher int status = 0;
8578ea1fbf7SHeiko Schocher
8588ea1fbf7SHeiko Schocher /* read and ack SETUP; hard-fail for bogus packets */
8598ea1fbf7SHeiko Schocher rxcount = (csr & AT91_UDP_RXBYTECNT) >> 16;
8608ea1fbf7SHeiko Schocher if (likely(rxcount == 8)) {
8618ea1fbf7SHeiko Schocher while (rxcount--)
8628ea1fbf7SHeiko Schocher pkt.raw[i++] = __raw_readb(dreg);
8638ea1fbf7SHeiko Schocher if (pkt.r.bRequestType & USB_DIR_IN) {
8648ea1fbf7SHeiko Schocher csr |= AT91_UDP_DIR;
8658ea1fbf7SHeiko Schocher ep->is_in = 1;
8668ea1fbf7SHeiko Schocher } else {
8678ea1fbf7SHeiko Schocher csr &= ~AT91_UDP_DIR;
8688ea1fbf7SHeiko Schocher ep->is_in = 0;
8698ea1fbf7SHeiko Schocher }
8708ea1fbf7SHeiko Schocher } else {
8718ea1fbf7SHeiko Schocher /* REVISIT this happens sometimes under load; why?? */
8728ea1fbf7SHeiko Schocher ERR("SETUP len %d, csr %08x\n", rxcount, csr);
8738ea1fbf7SHeiko Schocher status = -EINVAL;
8748ea1fbf7SHeiko Schocher }
8758ea1fbf7SHeiko Schocher csr |= CLR_FX;
8768ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_RXSETUP);
8778ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
8788ea1fbf7SHeiko Schocher udc->wait_for_addr_ack = 0;
8798ea1fbf7SHeiko Schocher udc->wait_for_config_ack = 0;
8808ea1fbf7SHeiko Schocher ep->stopped = 0;
8818ea1fbf7SHeiko Schocher if (unlikely(status != 0))
8828ea1fbf7SHeiko Schocher goto stall;
8838ea1fbf7SHeiko Schocher
8848ea1fbf7SHeiko Schocher #define w_index le16_to_cpu(pkt.r.wIndex)
8858ea1fbf7SHeiko Schocher #define w_value le16_to_cpu(pkt.r.wValue)
8868ea1fbf7SHeiko Schocher #define w_length le16_to_cpu(pkt.r.wLength)
8878ea1fbf7SHeiko Schocher
8888ea1fbf7SHeiko Schocher VDBG("SETUP %02x.%02x v%04x i%04x l%04x\n",
8898ea1fbf7SHeiko Schocher pkt.r.bRequestType, pkt.r.bRequest,
8908ea1fbf7SHeiko Schocher w_value, w_index, w_length);
8918ea1fbf7SHeiko Schocher
8928ea1fbf7SHeiko Schocher /*
8938ea1fbf7SHeiko Schocher * A few standard requests get handled here, ones that touch
8948ea1fbf7SHeiko Schocher * hardware ... notably for device and endpoint features.
8958ea1fbf7SHeiko Schocher */
8968ea1fbf7SHeiko Schocher udc->req_pending = 1;
8978ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
8988ea1fbf7SHeiko Schocher csr |= CLR_FX;
8998ea1fbf7SHeiko Schocher csr &= ~SET_FX;
9008ea1fbf7SHeiko Schocher switch ((pkt.r.bRequestType << 8) | pkt.r.bRequest) {
9018ea1fbf7SHeiko Schocher
9028ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8)
9038ea1fbf7SHeiko Schocher | USB_REQ_SET_ADDRESS:
9048ea1fbf7SHeiko Schocher __raw_writel(csr | AT91_UDP_TXPKTRDY, creg);
9058ea1fbf7SHeiko Schocher udc->addr = w_value;
9068ea1fbf7SHeiko Schocher udc->wait_for_addr_ack = 1;
9078ea1fbf7SHeiko Schocher udc->req_pending = 0;
9088ea1fbf7SHeiko Schocher /* FADDR is set later, when we ack host STATUS */
9098ea1fbf7SHeiko Schocher return;
9108ea1fbf7SHeiko Schocher
9118ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8)
9128ea1fbf7SHeiko Schocher | USB_REQ_SET_CONFIGURATION:
9138ea1fbf7SHeiko Schocher tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_CONFG;
9148ea1fbf7SHeiko Schocher if (pkt.r.wValue)
9158ea1fbf7SHeiko Schocher udc->wait_for_config_ack = (tmp == 0);
9168ea1fbf7SHeiko Schocher else
9178ea1fbf7SHeiko Schocher udc->wait_for_config_ack = (tmp != 0);
9188ea1fbf7SHeiko Schocher if (udc->wait_for_config_ack)
9198ea1fbf7SHeiko Schocher VDBG("wait for config\n");
9208ea1fbf7SHeiko Schocher /* CONFG is toggled later, if gadget driver succeeds */
9218ea1fbf7SHeiko Schocher break;
9228ea1fbf7SHeiko Schocher
9238ea1fbf7SHeiko Schocher /*
9248ea1fbf7SHeiko Schocher * Hosts may set or clear remote wakeup status, and
9258ea1fbf7SHeiko Schocher * devices may report they're VBUS powered.
9268ea1fbf7SHeiko Schocher */
9278ea1fbf7SHeiko Schocher case ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8)
9288ea1fbf7SHeiko Schocher | USB_REQ_GET_STATUS:
92962019767SHeiko Schocher tmp = (udc->selfpowered << USB_DEVICE_SELF_POWERED);
9308ea1fbf7SHeiko Schocher if (at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_ESR)
9318ea1fbf7SHeiko Schocher tmp |= (1 << USB_DEVICE_REMOTE_WAKEUP);
9328ea1fbf7SHeiko Schocher PACKET("get device status\n");
9338ea1fbf7SHeiko Schocher __raw_writeb(tmp, dreg);
9348ea1fbf7SHeiko Schocher __raw_writeb(0, dreg);
9358ea1fbf7SHeiko Schocher goto write_in;
9368ea1fbf7SHeiko Schocher /* then STATUS starts later, automatically */
9378ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8)
9388ea1fbf7SHeiko Schocher | USB_REQ_SET_FEATURE:
9398ea1fbf7SHeiko Schocher if (w_value != USB_DEVICE_REMOTE_WAKEUP)
9408ea1fbf7SHeiko Schocher goto stall;
9418ea1fbf7SHeiko Schocher tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT);
9428ea1fbf7SHeiko Schocher tmp |= AT91_UDP_ESR;
9438ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp);
9448ea1fbf7SHeiko Schocher goto succeed;
9458ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8)
9468ea1fbf7SHeiko Schocher | USB_REQ_CLEAR_FEATURE:
9478ea1fbf7SHeiko Schocher if (w_value != USB_DEVICE_REMOTE_WAKEUP)
9488ea1fbf7SHeiko Schocher goto stall;
9498ea1fbf7SHeiko Schocher tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT);
9508ea1fbf7SHeiko Schocher tmp &= ~AT91_UDP_ESR;
9518ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp);
9528ea1fbf7SHeiko Schocher goto succeed;
9538ea1fbf7SHeiko Schocher
9548ea1fbf7SHeiko Schocher /*
9558ea1fbf7SHeiko Schocher * Interfaces have no feature settings; this is pretty useless.
9568ea1fbf7SHeiko Schocher * we won't even insist the interface exists...
9578ea1fbf7SHeiko Schocher */
9588ea1fbf7SHeiko Schocher case ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE) << 8)
9598ea1fbf7SHeiko Schocher | USB_REQ_GET_STATUS:
9608ea1fbf7SHeiko Schocher PACKET("get interface status\n");
9618ea1fbf7SHeiko Schocher __raw_writeb(0, dreg);
9628ea1fbf7SHeiko Schocher __raw_writeb(0, dreg);
9638ea1fbf7SHeiko Schocher goto write_in;
9648ea1fbf7SHeiko Schocher /* then STATUS starts later, automatically */
9658ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_INTERFACE) << 8)
9668ea1fbf7SHeiko Schocher | USB_REQ_SET_FEATURE:
9678ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_INTERFACE) << 8)
9688ea1fbf7SHeiko Schocher | USB_REQ_CLEAR_FEATURE:
9698ea1fbf7SHeiko Schocher goto stall;
9708ea1fbf7SHeiko Schocher
9718ea1fbf7SHeiko Schocher /*
9728ea1fbf7SHeiko Schocher * Hosts may clear bulk/intr endpoint halt after the gadget
9738ea1fbf7SHeiko Schocher * driver sets it (not widely used); or set it (for testing)
9748ea1fbf7SHeiko Schocher */
9758ea1fbf7SHeiko Schocher case ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT) << 8)
9768ea1fbf7SHeiko Schocher | USB_REQ_GET_STATUS:
9778ea1fbf7SHeiko Schocher tmp = w_index & USB_ENDPOINT_NUMBER_MASK;
9788ea1fbf7SHeiko Schocher ep = &udc->ep[tmp];
9798ea1fbf7SHeiko Schocher if (tmp >= NUM_ENDPOINTS || (tmp && !ep->ep.desc))
9808ea1fbf7SHeiko Schocher goto stall;
9818ea1fbf7SHeiko Schocher
9828ea1fbf7SHeiko Schocher if (tmp) {
9838ea1fbf7SHeiko Schocher if ((w_index & USB_DIR_IN)) {
9848ea1fbf7SHeiko Schocher if (!ep->is_in)
9858ea1fbf7SHeiko Schocher goto stall;
9868ea1fbf7SHeiko Schocher } else if (ep->is_in)
9878ea1fbf7SHeiko Schocher goto stall;
9888ea1fbf7SHeiko Schocher }
9898ea1fbf7SHeiko Schocher PACKET("get %s status\n", ep->ep.name);
9908ea1fbf7SHeiko Schocher if (__raw_readl(ep->creg) & AT91_UDP_FORCESTALL)
9918ea1fbf7SHeiko Schocher tmp = (1 << USB_ENDPOINT_HALT);
9928ea1fbf7SHeiko Schocher else
9938ea1fbf7SHeiko Schocher tmp = 0;
9948ea1fbf7SHeiko Schocher __raw_writeb(tmp, dreg);
9958ea1fbf7SHeiko Schocher __raw_writeb(0, dreg);
9968ea1fbf7SHeiko Schocher goto write_in;
9978ea1fbf7SHeiko Schocher /* then STATUS starts later, automatically */
9988ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_ENDPOINT) << 8)
9998ea1fbf7SHeiko Schocher | USB_REQ_SET_FEATURE:
10008ea1fbf7SHeiko Schocher tmp = w_index & USB_ENDPOINT_NUMBER_MASK;
10018ea1fbf7SHeiko Schocher ep = &udc->ep[tmp];
10028ea1fbf7SHeiko Schocher if (w_value != USB_ENDPOINT_HALT || tmp >= NUM_ENDPOINTS)
10038ea1fbf7SHeiko Schocher goto stall;
10048ea1fbf7SHeiko Schocher if (!ep->ep.desc || ep->is_iso)
10058ea1fbf7SHeiko Schocher goto stall;
10068ea1fbf7SHeiko Schocher if ((w_index & USB_DIR_IN)) {
10078ea1fbf7SHeiko Schocher if (!ep->is_in)
10088ea1fbf7SHeiko Schocher goto stall;
10098ea1fbf7SHeiko Schocher } else if (ep->is_in)
10108ea1fbf7SHeiko Schocher goto stall;
10118ea1fbf7SHeiko Schocher
10128ea1fbf7SHeiko Schocher tmp = __raw_readl(ep->creg);
10138ea1fbf7SHeiko Schocher tmp &= ~SET_FX;
10148ea1fbf7SHeiko Schocher tmp |= CLR_FX | AT91_UDP_FORCESTALL;
10158ea1fbf7SHeiko Schocher __raw_writel(tmp, ep->creg);
10168ea1fbf7SHeiko Schocher goto succeed;
10178ea1fbf7SHeiko Schocher case ((USB_TYPE_STANDARD|USB_RECIP_ENDPOINT) << 8)
10188ea1fbf7SHeiko Schocher | USB_REQ_CLEAR_FEATURE:
10198ea1fbf7SHeiko Schocher tmp = w_index & USB_ENDPOINT_NUMBER_MASK;
10208ea1fbf7SHeiko Schocher ep = &udc->ep[tmp];
10218ea1fbf7SHeiko Schocher if (w_value != USB_ENDPOINT_HALT || tmp >= NUM_ENDPOINTS)
10228ea1fbf7SHeiko Schocher goto stall;
10238ea1fbf7SHeiko Schocher if (tmp == 0)
10248ea1fbf7SHeiko Schocher goto succeed;
10258ea1fbf7SHeiko Schocher if (!ep->ep.desc || ep->is_iso)
10268ea1fbf7SHeiko Schocher goto stall;
10278ea1fbf7SHeiko Schocher if ((w_index & USB_DIR_IN)) {
10288ea1fbf7SHeiko Schocher if (!ep->is_in)
10298ea1fbf7SHeiko Schocher goto stall;
10308ea1fbf7SHeiko Schocher } else if (ep->is_in)
10318ea1fbf7SHeiko Schocher goto stall;
10328ea1fbf7SHeiko Schocher
10338ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask);
10348ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_RST_EP, 0);
10358ea1fbf7SHeiko Schocher tmp = __raw_readl(ep->creg);
10368ea1fbf7SHeiko Schocher tmp |= CLR_FX;
10378ea1fbf7SHeiko Schocher tmp &= ~(SET_FX | AT91_UDP_FORCESTALL);
10388ea1fbf7SHeiko Schocher __raw_writel(tmp, ep->creg);
10398ea1fbf7SHeiko Schocher if (!list_empty(&ep->queue))
10408ea1fbf7SHeiko Schocher handle_ep(ep);
10418ea1fbf7SHeiko Schocher goto succeed;
10428ea1fbf7SHeiko Schocher }
10438ea1fbf7SHeiko Schocher
10448ea1fbf7SHeiko Schocher #undef w_value
10458ea1fbf7SHeiko Schocher #undef w_index
10468ea1fbf7SHeiko Schocher #undef w_length
10478ea1fbf7SHeiko Schocher
10488ea1fbf7SHeiko Schocher /* pass request up to the gadget driver */
10498ea1fbf7SHeiko Schocher if (udc->driver) {
10508ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
10518ea1fbf7SHeiko Schocher status = udc->driver->setup(&udc->gadget, &pkt.r);
10528ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
10538ea1fbf7SHeiko Schocher }
10548ea1fbf7SHeiko Schocher else
10558ea1fbf7SHeiko Schocher status = -ENODEV;
10568ea1fbf7SHeiko Schocher if (status < 0) {
10578ea1fbf7SHeiko Schocher stall:
10588ea1fbf7SHeiko Schocher VDBG("req %02x.%02x protocol STALL; stat %d\n",
10598ea1fbf7SHeiko Schocher pkt.r.bRequestType, pkt.r.bRequest, status);
10608ea1fbf7SHeiko Schocher csr |= AT91_UDP_FORCESTALL;
10618ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
10628ea1fbf7SHeiko Schocher udc->req_pending = 0;
10638ea1fbf7SHeiko Schocher }
10648ea1fbf7SHeiko Schocher return;
10658ea1fbf7SHeiko Schocher
10668ea1fbf7SHeiko Schocher succeed:
10678ea1fbf7SHeiko Schocher /* immediate successful (IN) STATUS after zero length DATA */
10688ea1fbf7SHeiko Schocher PACKET("ep0 in/status\n");
10698ea1fbf7SHeiko Schocher write_in:
10708ea1fbf7SHeiko Schocher csr |= AT91_UDP_TXPKTRDY;
10718ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
10728ea1fbf7SHeiko Schocher udc->req_pending = 0;
10738ea1fbf7SHeiko Schocher }
10748ea1fbf7SHeiko Schocher
handle_ep0(struct at91_udc * udc)10758ea1fbf7SHeiko Schocher static void handle_ep0(struct at91_udc *udc)
10768ea1fbf7SHeiko Schocher {
10778ea1fbf7SHeiko Schocher struct at91_ep *ep0 = &udc->ep[0];
10788ea1fbf7SHeiko Schocher u32 __iomem *creg = ep0->creg;
10798ea1fbf7SHeiko Schocher u32 csr = __raw_readl(creg);
10808ea1fbf7SHeiko Schocher struct at91_request *req;
10818ea1fbf7SHeiko Schocher
10828ea1fbf7SHeiko Schocher if (unlikely(csr & AT91_UDP_STALLSENT)) {
10838ea1fbf7SHeiko Schocher nuke(ep0, -EPROTO);
10848ea1fbf7SHeiko Schocher udc->req_pending = 0;
10858ea1fbf7SHeiko Schocher csr |= CLR_FX;
10868ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_STALLSENT | AT91_UDP_FORCESTALL);
10878ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
10888ea1fbf7SHeiko Schocher VDBG("ep0 stalled\n");
10898ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
10908ea1fbf7SHeiko Schocher }
10918ea1fbf7SHeiko Schocher if (csr & AT91_UDP_RXSETUP) {
10928ea1fbf7SHeiko Schocher nuke(ep0, 0);
10938ea1fbf7SHeiko Schocher udc->req_pending = 0;
10948ea1fbf7SHeiko Schocher handle_setup(udc, ep0, csr);
10958ea1fbf7SHeiko Schocher return;
10968ea1fbf7SHeiko Schocher }
10978ea1fbf7SHeiko Schocher
10988ea1fbf7SHeiko Schocher if (list_empty(&ep0->queue))
10998ea1fbf7SHeiko Schocher req = NULL;
11008ea1fbf7SHeiko Schocher else
11018ea1fbf7SHeiko Schocher req = list_entry(ep0->queue.next, struct at91_request, queue);
11028ea1fbf7SHeiko Schocher
11038ea1fbf7SHeiko Schocher /* host ACKed an IN packet that we sent */
11048ea1fbf7SHeiko Schocher if (csr & AT91_UDP_TXCOMP) {
11058ea1fbf7SHeiko Schocher csr |= CLR_FX;
11068ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_TXCOMP);
11078ea1fbf7SHeiko Schocher
11088ea1fbf7SHeiko Schocher /* write more IN DATA? */
11098ea1fbf7SHeiko Schocher if (req && ep0->is_in) {
11108ea1fbf7SHeiko Schocher if (handle_ep(ep0))
11118ea1fbf7SHeiko Schocher udc->req_pending = 0;
11128ea1fbf7SHeiko Schocher
11138ea1fbf7SHeiko Schocher /*
11148ea1fbf7SHeiko Schocher * Ack after:
11158ea1fbf7SHeiko Schocher * - last IN DATA packet (including GET_STATUS)
11168ea1fbf7SHeiko Schocher * - IN/STATUS for OUT DATA
11178ea1fbf7SHeiko Schocher * - IN/STATUS for any zero-length DATA stage
11188ea1fbf7SHeiko Schocher * except for the IN DATA case, the host should send
11198ea1fbf7SHeiko Schocher * an OUT status later, which we'll ack.
11208ea1fbf7SHeiko Schocher */
11218ea1fbf7SHeiko Schocher } else {
11228ea1fbf7SHeiko Schocher udc->req_pending = 0;
11238ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
11248ea1fbf7SHeiko Schocher
11258ea1fbf7SHeiko Schocher /*
11268ea1fbf7SHeiko Schocher * SET_ADDRESS takes effect only after the STATUS
11278ea1fbf7SHeiko Schocher * (to the original address) gets acked.
11288ea1fbf7SHeiko Schocher */
11298ea1fbf7SHeiko Schocher if (udc->wait_for_addr_ack) {
11308ea1fbf7SHeiko Schocher u32 tmp;
11318ea1fbf7SHeiko Schocher
11328ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_FADDR,
11338ea1fbf7SHeiko Schocher AT91_UDP_FEN | udc->addr);
11348ea1fbf7SHeiko Schocher tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT);
11358ea1fbf7SHeiko Schocher tmp &= ~AT91_UDP_FADDEN;
11368ea1fbf7SHeiko Schocher if (udc->addr)
11378ea1fbf7SHeiko Schocher tmp |= AT91_UDP_FADDEN;
11388ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp);
11398ea1fbf7SHeiko Schocher
11408ea1fbf7SHeiko Schocher udc->wait_for_addr_ack = 0;
11418ea1fbf7SHeiko Schocher VDBG("address %d\n", udc->addr);
11428ea1fbf7SHeiko Schocher }
11438ea1fbf7SHeiko Schocher }
11448ea1fbf7SHeiko Schocher }
11458ea1fbf7SHeiko Schocher
11468ea1fbf7SHeiko Schocher /* OUT packet arrived ... */
11478ea1fbf7SHeiko Schocher else if (csr & AT91_UDP_RX_DATA_BK0) {
11488ea1fbf7SHeiko Schocher csr |= CLR_FX;
11498ea1fbf7SHeiko Schocher csr &= ~(SET_FX | AT91_UDP_RX_DATA_BK0);
11508ea1fbf7SHeiko Schocher
11518ea1fbf7SHeiko Schocher /* OUT DATA stage */
11528ea1fbf7SHeiko Schocher if (!ep0->is_in) {
11538ea1fbf7SHeiko Schocher if (req) {
11548ea1fbf7SHeiko Schocher if (handle_ep(ep0)) {
11558ea1fbf7SHeiko Schocher /* send IN/STATUS */
11568ea1fbf7SHeiko Schocher PACKET("ep0 in/status\n");
11578ea1fbf7SHeiko Schocher csr = __raw_readl(creg);
11588ea1fbf7SHeiko Schocher csr &= ~SET_FX;
11598ea1fbf7SHeiko Schocher csr |= CLR_FX | AT91_UDP_TXPKTRDY;
11608ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
11618ea1fbf7SHeiko Schocher udc->req_pending = 0;
11628ea1fbf7SHeiko Schocher }
11638ea1fbf7SHeiko Schocher } else if (udc->req_pending) {
11648ea1fbf7SHeiko Schocher /*
11658ea1fbf7SHeiko Schocher * AT91 hardware has a hard time with this
11668ea1fbf7SHeiko Schocher * "deferred response" mode for control-OUT
11678ea1fbf7SHeiko Schocher * transfers. (For control-IN it's fine.)
11688ea1fbf7SHeiko Schocher *
11698ea1fbf7SHeiko Schocher * The normal solution leaves OUT data in the
11708ea1fbf7SHeiko Schocher * fifo until the gadget driver is ready.
11718ea1fbf7SHeiko Schocher * We couldn't do that here without disabling
11728ea1fbf7SHeiko Schocher * the IRQ that tells about SETUP packets,
11738ea1fbf7SHeiko Schocher * e.g. when the host gets impatient...
11748ea1fbf7SHeiko Schocher *
11758ea1fbf7SHeiko Schocher * Working around it by copying into a buffer
11768ea1fbf7SHeiko Schocher * would almost be a non-deferred response,
11778ea1fbf7SHeiko Schocher * except that it wouldn't permit reliable
11788ea1fbf7SHeiko Schocher * stalling of the request. Instead, demand
11798ea1fbf7SHeiko Schocher * that gadget drivers not use this mode.
11808ea1fbf7SHeiko Schocher */
11818ea1fbf7SHeiko Schocher DBG("no control-OUT deferred responses!\n");
11828ea1fbf7SHeiko Schocher __raw_writel(csr | AT91_UDP_FORCESTALL, creg);
11838ea1fbf7SHeiko Schocher udc->req_pending = 0;
11848ea1fbf7SHeiko Schocher }
11858ea1fbf7SHeiko Schocher
11868ea1fbf7SHeiko Schocher /* STATUS stage for control-IN; ack. */
11878ea1fbf7SHeiko Schocher } else {
11888ea1fbf7SHeiko Schocher PACKET("ep0 out/status ACK\n");
11898ea1fbf7SHeiko Schocher __raw_writel(csr, creg);
11908ea1fbf7SHeiko Schocher
11918ea1fbf7SHeiko Schocher /* "early" status stage */
11928ea1fbf7SHeiko Schocher if (req)
11938ea1fbf7SHeiko Schocher done(ep0, req, 0);
11948ea1fbf7SHeiko Schocher }
11958ea1fbf7SHeiko Schocher }
11968ea1fbf7SHeiko Schocher }
11978ea1fbf7SHeiko Schocher
at91_udc_irq(struct at91_udc * udc)119862019767SHeiko Schocher static irqreturn_t at91_udc_irq(struct at91_udc *udc)
11998ea1fbf7SHeiko Schocher {
12008ea1fbf7SHeiko Schocher u32 rescans = 5;
12018ea1fbf7SHeiko Schocher int disable_clock = 0;
12028ea1fbf7SHeiko Schocher unsigned long flags;
12038ea1fbf7SHeiko Schocher
12048ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
12058ea1fbf7SHeiko Schocher
12068ea1fbf7SHeiko Schocher if (!udc->clocked) {
12078ea1fbf7SHeiko Schocher clk_on(udc);
12088ea1fbf7SHeiko Schocher disable_clock = 1;
12098ea1fbf7SHeiko Schocher }
12108ea1fbf7SHeiko Schocher
12118ea1fbf7SHeiko Schocher while (rescans--) {
12128ea1fbf7SHeiko Schocher u32 status;
12138ea1fbf7SHeiko Schocher
12148ea1fbf7SHeiko Schocher status = at91_udp_read(udc, AT91_UDP_ISR)
12158ea1fbf7SHeiko Schocher & at91_udp_read(udc, AT91_UDP_IMR);
12168ea1fbf7SHeiko Schocher if (!status)
12178ea1fbf7SHeiko Schocher break;
12188ea1fbf7SHeiko Schocher
12198ea1fbf7SHeiko Schocher /* USB reset irq: not maskable */
12208ea1fbf7SHeiko Schocher if (status & AT91_UDP_ENDBUSRES) {
12218ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, ~MINIMUS_INTERRUPTUS);
12228ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IER, MINIMUS_INTERRUPTUS);
12238ea1fbf7SHeiko Schocher /* Atmel code clears this irq twice */
12248ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES);
12258ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES);
12268ea1fbf7SHeiko Schocher VDBG("end bus reset\n");
12278ea1fbf7SHeiko Schocher udc->addr = 0;
12288ea1fbf7SHeiko Schocher reset_gadget(udc);
12298ea1fbf7SHeiko Schocher
12308ea1fbf7SHeiko Schocher /* enable ep0 */
12318ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_CSR(0),
12328ea1fbf7SHeiko Schocher AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL);
12338ea1fbf7SHeiko Schocher udc->gadget.speed = USB_SPEED_FULL;
12348ea1fbf7SHeiko Schocher udc->suspended = 0;
12358ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_EP(0));
12368ea1fbf7SHeiko Schocher
12378ea1fbf7SHeiko Schocher /*
12388ea1fbf7SHeiko Schocher * NOTE: this driver keeps clocks off unless the
12398ea1fbf7SHeiko Schocher * USB host is present. That saves power, but for
12408ea1fbf7SHeiko Schocher * boards that don't support VBUS detection, both
12418ea1fbf7SHeiko Schocher * clocks need to be active most of the time.
12428ea1fbf7SHeiko Schocher */
12438ea1fbf7SHeiko Schocher
12448ea1fbf7SHeiko Schocher /* host initiated suspend (3+ms bus idle) */
12458ea1fbf7SHeiko Schocher } else if (status & AT91_UDP_RXSUSP) {
12468ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXSUSP);
12478ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXRSM);
12488ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXSUSP);
12498ea1fbf7SHeiko Schocher /* VDBG("bus suspend\n"); */
12508ea1fbf7SHeiko Schocher if (udc->suspended)
12518ea1fbf7SHeiko Schocher continue;
12528ea1fbf7SHeiko Schocher udc->suspended = 1;
12538ea1fbf7SHeiko Schocher
12548ea1fbf7SHeiko Schocher /*
12558ea1fbf7SHeiko Schocher * NOTE: when suspending a VBUS-powered device, the
12568ea1fbf7SHeiko Schocher * gadget driver should switch into slow clock mode
12578ea1fbf7SHeiko Schocher * and then into standby to avoid drawing more than
12588ea1fbf7SHeiko Schocher * 500uA power (2500uA for some high-power configs).
12598ea1fbf7SHeiko Schocher */
12608ea1fbf7SHeiko Schocher if (udc->driver && udc->driver->suspend) {
12618ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
12628ea1fbf7SHeiko Schocher udc->driver->suspend(&udc->gadget);
12638ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
12648ea1fbf7SHeiko Schocher }
12658ea1fbf7SHeiko Schocher
12668ea1fbf7SHeiko Schocher /* host initiated resume */
12678ea1fbf7SHeiko Schocher } else if (status & AT91_UDP_RXRSM) {
12688ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM);
12698ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXSUSP);
12708ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM);
12718ea1fbf7SHeiko Schocher /* VDBG("bus resume\n"); */
12728ea1fbf7SHeiko Schocher if (!udc->suspended)
12738ea1fbf7SHeiko Schocher continue;
12748ea1fbf7SHeiko Schocher udc->suspended = 0;
12758ea1fbf7SHeiko Schocher
12768ea1fbf7SHeiko Schocher /*
12778ea1fbf7SHeiko Schocher * NOTE: for a VBUS-powered device, the gadget driver
12788ea1fbf7SHeiko Schocher * would normally want to switch out of slow clock
12798ea1fbf7SHeiko Schocher * mode into normal mode.
12808ea1fbf7SHeiko Schocher */
12818ea1fbf7SHeiko Schocher if (udc->driver && udc->driver->resume) {
12828ea1fbf7SHeiko Schocher spin_unlock(&udc->lock);
12838ea1fbf7SHeiko Schocher udc->driver->resume(&udc->gadget);
12848ea1fbf7SHeiko Schocher spin_lock(&udc->lock);
12858ea1fbf7SHeiko Schocher }
12868ea1fbf7SHeiko Schocher
12878ea1fbf7SHeiko Schocher /* endpoint IRQs are cleared by handling them */
12888ea1fbf7SHeiko Schocher } else {
12898ea1fbf7SHeiko Schocher int i;
12908ea1fbf7SHeiko Schocher unsigned mask = 1;
12918ea1fbf7SHeiko Schocher struct at91_ep *ep = &udc->ep[1];
12928ea1fbf7SHeiko Schocher
12938ea1fbf7SHeiko Schocher if (status & mask)
12948ea1fbf7SHeiko Schocher handle_ep0(udc);
12958ea1fbf7SHeiko Schocher for (i = 1; i < NUM_ENDPOINTS; i++) {
12968ea1fbf7SHeiko Schocher mask <<= 1;
12978ea1fbf7SHeiko Schocher if (status & mask)
12988ea1fbf7SHeiko Schocher handle_ep(ep);
12998ea1fbf7SHeiko Schocher ep++;
13008ea1fbf7SHeiko Schocher }
13018ea1fbf7SHeiko Schocher }
13028ea1fbf7SHeiko Schocher }
13038ea1fbf7SHeiko Schocher
13048ea1fbf7SHeiko Schocher if (disable_clock)
13058ea1fbf7SHeiko Schocher clk_off(udc);
13068ea1fbf7SHeiko Schocher
13078ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
13088ea1fbf7SHeiko Schocher
13098ea1fbf7SHeiko Schocher return IRQ_HANDLED;
13108ea1fbf7SHeiko Schocher }
13118ea1fbf7SHeiko Schocher
13128ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
13138ea1fbf7SHeiko Schocher
at91_start(struct usb_gadget * gadget,struct usb_gadget_driver * driver)13148ea1fbf7SHeiko Schocher static int at91_start(struct usb_gadget *gadget,
13158ea1fbf7SHeiko Schocher struct usb_gadget_driver *driver)
13168ea1fbf7SHeiko Schocher {
131762019767SHeiko Schocher struct at91_udc *udc = controller;
13188ea1fbf7SHeiko Schocher
13198ea1fbf7SHeiko Schocher udc->driver = driver;
13208ea1fbf7SHeiko Schocher udc->enabled = 1;
132162019767SHeiko Schocher udc->selfpowered = 1;
13228ea1fbf7SHeiko Schocher
13238ea1fbf7SHeiko Schocher return 0;
13248ea1fbf7SHeiko Schocher }
13258ea1fbf7SHeiko Schocher
at91_stop(struct usb_gadget * gadget)13268ea1fbf7SHeiko Schocher static int at91_stop(struct usb_gadget *gadget)
13278ea1fbf7SHeiko Schocher {
132862019767SHeiko Schocher struct at91_udc *udc = controller;
13298ea1fbf7SHeiko Schocher unsigned long flags;
13308ea1fbf7SHeiko Schocher
13318ea1fbf7SHeiko Schocher spin_lock_irqsave(&udc->lock, flags);
13328ea1fbf7SHeiko Schocher udc->enabled = 0;
13338ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, ~0);
13348ea1fbf7SHeiko Schocher spin_unlock_irqrestore(&udc->lock, flags);
13358ea1fbf7SHeiko Schocher
13368ea1fbf7SHeiko Schocher udc->driver = NULL;
13378ea1fbf7SHeiko Schocher
13388ea1fbf7SHeiko Schocher return 0;
13398ea1fbf7SHeiko Schocher }
13408ea1fbf7SHeiko Schocher
13418ea1fbf7SHeiko Schocher /*-------------------------------------------------------------------------*/
13428ea1fbf7SHeiko Schocher
13432fa5130dSHeiko Schocher #if defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9G20)
at91sam9260_udc_init(struct at91_udc * udc)13448ea1fbf7SHeiko Schocher static int at91sam9260_udc_init(struct at91_udc *udc)
13458ea1fbf7SHeiko Schocher {
13468ea1fbf7SHeiko Schocher struct at91_ep *ep;
13478ea1fbf7SHeiko Schocher int i;
13488ea1fbf7SHeiko Schocher
13498ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
13508ea1fbf7SHeiko Schocher ep = &udc->ep[i];
13518ea1fbf7SHeiko Schocher
13528ea1fbf7SHeiko Schocher switch (i) {
13538ea1fbf7SHeiko Schocher case 0 ... 3:
13548ea1fbf7SHeiko Schocher ep->maxpacket = 64;
13558ea1fbf7SHeiko Schocher break;
13568ea1fbf7SHeiko Schocher case 4 ... 5:
13578ea1fbf7SHeiko Schocher ep->maxpacket = 512;
13588ea1fbf7SHeiko Schocher break;
13598ea1fbf7SHeiko Schocher }
13608ea1fbf7SHeiko Schocher }
13618ea1fbf7SHeiko Schocher
13628ea1fbf7SHeiko Schocher return 0;
13638ea1fbf7SHeiko Schocher }
13648ea1fbf7SHeiko Schocher
at91sam9260_udc_pullup(struct at91_udc * udc,int is_on)13658ea1fbf7SHeiko Schocher static void at91sam9260_udc_pullup(struct at91_udc *udc, int is_on)
13668ea1fbf7SHeiko Schocher {
13678ea1fbf7SHeiko Schocher u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC);
13688ea1fbf7SHeiko Schocher
13698ea1fbf7SHeiko Schocher if (is_on)
13708ea1fbf7SHeiko Schocher txvc |= AT91_UDP_TXVC_PUON;
13718ea1fbf7SHeiko Schocher else
13728ea1fbf7SHeiko Schocher txvc &= ~AT91_UDP_TXVC_PUON;
13738ea1fbf7SHeiko Schocher
13748ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_TXVC, txvc);
13758ea1fbf7SHeiko Schocher }
13768ea1fbf7SHeiko Schocher
13778ea1fbf7SHeiko Schocher static const struct at91_udc_caps at91sam9260_udc_caps = {
13788ea1fbf7SHeiko Schocher .init = at91sam9260_udc_init,
13798ea1fbf7SHeiko Schocher .pullup = at91sam9260_udc_pullup,
13808ea1fbf7SHeiko Schocher };
138162019767SHeiko Schocher #endif
13828ea1fbf7SHeiko Schocher
138362019767SHeiko Schocher #if defined(CONFIG_AT91SAM9261)
at91sam9261_udc_init(struct at91_udc * udc)13848ea1fbf7SHeiko Schocher static int at91sam9261_udc_init(struct at91_udc *udc)
13858ea1fbf7SHeiko Schocher {
13868ea1fbf7SHeiko Schocher struct at91_ep *ep;
13878ea1fbf7SHeiko Schocher int i;
13888ea1fbf7SHeiko Schocher
13898ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
13908ea1fbf7SHeiko Schocher ep = &udc->ep[i];
13918ea1fbf7SHeiko Schocher
13928ea1fbf7SHeiko Schocher switch (i) {
13938ea1fbf7SHeiko Schocher case 0:
13948ea1fbf7SHeiko Schocher ep->maxpacket = 8;
13958ea1fbf7SHeiko Schocher break;
13968ea1fbf7SHeiko Schocher case 1 ... 3:
13978ea1fbf7SHeiko Schocher ep->maxpacket = 64;
13988ea1fbf7SHeiko Schocher break;
13998ea1fbf7SHeiko Schocher case 4 ... 5:
14008ea1fbf7SHeiko Schocher ep->maxpacket = 256;
14018ea1fbf7SHeiko Schocher break;
14028ea1fbf7SHeiko Schocher }
14038ea1fbf7SHeiko Schocher }
14048ea1fbf7SHeiko Schocher
140562019767SHeiko Schocher udc->matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
140662019767SHeiko Schocher
14078ea1fbf7SHeiko Schocher if (IS_ERR(udc->matrix))
14088ea1fbf7SHeiko Schocher return PTR_ERR(udc->matrix);
14098ea1fbf7SHeiko Schocher
14108ea1fbf7SHeiko Schocher return 0;
14118ea1fbf7SHeiko Schocher }
14128ea1fbf7SHeiko Schocher
at91sam9261_udc_pullup(struct at91_udc * udc,int is_on)14138ea1fbf7SHeiko Schocher static void at91sam9261_udc_pullup(struct at91_udc *udc, int is_on)
14148ea1fbf7SHeiko Schocher {
14158ea1fbf7SHeiko Schocher u32 usbpucr = 0;
14168ea1fbf7SHeiko Schocher
141762019767SHeiko Schocher usbpucr = readl(&udc->matrix->pucr);
14188ea1fbf7SHeiko Schocher if (is_on)
141962019767SHeiko Schocher usbpucr |= AT91_MATRIX_USBPUCR_PUON;
14208ea1fbf7SHeiko Schocher
142162019767SHeiko Schocher writel(usbpucr, &udc->matrix->pucr);
14228ea1fbf7SHeiko Schocher }
14238ea1fbf7SHeiko Schocher
14248ea1fbf7SHeiko Schocher static const struct at91_udc_caps at91sam9261_udc_caps = {
14258ea1fbf7SHeiko Schocher .init = at91sam9261_udc_init,
14268ea1fbf7SHeiko Schocher .pullup = at91sam9261_udc_pullup,
14278ea1fbf7SHeiko Schocher };
142862019767SHeiko Schocher #endif
14298ea1fbf7SHeiko Schocher
usb_gadget_handle_interrupts(int index)143062019767SHeiko Schocher int usb_gadget_handle_interrupts(int index)
14318ea1fbf7SHeiko Schocher {
143262019767SHeiko Schocher struct at91_udc *udc = controller;
14338ea1fbf7SHeiko Schocher
143462019767SHeiko Schocher return at91_udc_irq(udc);
14358ea1fbf7SHeiko Schocher }
14368ea1fbf7SHeiko Schocher
usb_gadget_register_driver(struct usb_gadget_driver * driver)143762019767SHeiko Schocher int usb_gadget_register_driver(struct usb_gadget_driver *driver)
14388ea1fbf7SHeiko Schocher {
143962019767SHeiko Schocher struct at91_udc *udc = controller;
144062019767SHeiko Schocher int ret;
144162019767SHeiko Schocher
144262019767SHeiko Schocher if (!driver || !driver->bind || !driver->setup) {
144362019767SHeiko Schocher printf("bad paramter\n");
144462019767SHeiko Schocher return -EINVAL;
144562019767SHeiko Schocher }
144662019767SHeiko Schocher
144762019767SHeiko Schocher if (udc->driver) {
144862019767SHeiko Schocher printf("UDC already has a gadget driver\n");
144962019767SHeiko Schocher return -EBUSY;
145062019767SHeiko Schocher }
145162019767SHeiko Schocher
145262019767SHeiko Schocher at91_start(&udc->gadget, driver);
145362019767SHeiko Schocher
145462019767SHeiko Schocher udc->driver = driver;
145562019767SHeiko Schocher
145662019767SHeiko Schocher ret = driver->bind(&udc->gadget);
145762019767SHeiko Schocher if (ret) {
1458*90aa625cSMasahiro Yamada pr_err("driver->bind() returned %d\n", ret);
145962019767SHeiko Schocher udc->driver = NULL;
146062019767SHeiko Schocher }
146162019767SHeiko Schocher
146262019767SHeiko Schocher return ret;
146362019767SHeiko Schocher }
146462019767SHeiko Schocher
usb_gadget_unregister_driver(struct usb_gadget_driver * driver)146562019767SHeiko Schocher int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
146662019767SHeiko Schocher {
146762019767SHeiko Schocher struct at91_udc *udc = controller;
146862019767SHeiko Schocher
146962019767SHeiko Schocher if (!driver || !driver->unbind || !driver->disconnect) {
1470*90aa625cSMasahiro Yamada pr_err("bad paramter\n");
147162019767SHeiko Schocher return -EINVAL;
147262019767SHeiko Schocher }
147362019767SHeiko Schocher
147462019767SHeiko Schocher driver->disconnect(&udc->gadget);
147562019767SHeiko Schocher driver->unbind(&udc->gadget);
147662019767SHeiko Schocher udc->driver = NULL;
147762019767SHeiko Schocher
147862019767SHeiko Schocher at91_stop(&udc->gadget);
147962019767SHeiko Schocher
148062019767SHeiko Schocher return 0;
148162019767SHeiko Schocher }
148262019767SHeiko Schocher
at91_udc_probe(struct at91_udc_data * pdata)148362019767SHeiko Schocher int at91_udc_probe(struct at91_udc_data *pdata)
148462019767SHeiko Schocher {
14858ea1fbf7SHeiko Schocher struct at91_udc *udc;
14868ea1fbf7SHeiko Schocher int retval;
14878ea1fbf7SHeiko Schocher struct at91_ep *ep;
14888ea1fbf7SHeiko Schocher int i;
14898ea1fbf7SHeiko Schocher
149062019767SHeiko Schocher udc = kzalloc(sizeof(*udc), GFP_KERNEL);
14918ea1fbf7SHeiko Schocher if (!udc)
14928ea1fbf7SHeiko Schocher return -ENOMEM;
14938ea1fbf7SHeiko Schocher
149462019767SHeiko Schocher controller = udc;
149562019767SHeiko Schocher memcpy(&udc->board, pdata, sizeof(struct at91_udc_data));
149662019767SHeiko Schocher if (udc->board.vbus_pin) {
149762019767SHeiko Schocher printf("%s: gpio vbus pin not supported yet.\n", __func__);
149862019767SHeiko Schocher return -ENXIO;
149962019767SHeiko Schocher } else {
150062019767SHeiko Schocher DBG("no VBUS detection, assuming always-on\n");
150162019767SHeiko Schocher udc->vbus = 1;
150262019767SHeiko Schocher }
150362019767SHeiko Schocher
150462019767SHeiko Schocher #if defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9G20)
150562019767SHeiko Schocher udc->caps = &at91sam9260_udc_caps;
150662019767SHeiko Schocher #endif
150762019767SHeiko Schocher
15088ea1fbf7SHeiko Schocher udc->enabled = 0;
15098ea1fbf7SHeiko Schocher spin_lock_init(&udc->lock);
15108ea1fbf7SHeiko Schocher
15118ea1fbf7SHeiko Schocher udc->gadget.ops = &at91_udc_ops;
15128ea1fbf7SHeiko Schocher udc->gadget.ep0 = &udc->ep[0].ep;
15138ea1fbf7SHeiko Schocher udc->gadget.name = driver_name;
15148ea1fbf7SHeiko Schocher
15158ea1fbf7SHeiko Schocher for (i = 0; i < NUM_ENDPOINTS; i++) {
15168ea1fbf7SHeiko Schocher ep = &udc->ep[i];
15178ea1fbf7SHeiko Schocher ep->ep.name = ep_names[i];
15188ea1fbf7SHeiko Schocher ep->ep.ops = &at91_ep_ops;
15198ea1fbf7SHeiko Schocher ep->udc = udc;
152062019767SHeiko Schocher ep->int_mask = (1 << i);
15218ea1fbf7SHeiko Schocher if (i != 0 && i != 3)
15228ea1fbf7SHeiko Schocher ep->is_pingpong = 1;
15238ea1fbf7SHeiko Schocher }
15248ea1fbf7SHeiko Schocher
152562019767SHeiko Schocher udc->udp_baseaddr = (void *)udc->board.baseaddr;
15268ea1fbf7SHeiko Schocher if (IS_ERR(udc->udp_baseaddr))
15278ea1fbf7SHeiko Schocher return PTR_ERR(udc->udp_baseaddr);
15288ea1fbf7SHeiko Schocher
15298ea1fbf7SHeiko Schocher if (udc->caps && udc->caps->init) {
15308ea1fbf7SHeiko Schocher retval = udc->caps->init(udc);
15318ea1fbf7SHeiko Schocher if (retval)
15328ea1fbf7SHeiko Schocher return retval;
15338ea1fbf7SHeiko Schocher }
15348ea1fbf7SHeiko Schocher
15358ea1fbf7SHeiko Schocher udc_reinit(udc);
15368ea1fbf7SHeiko Schocher
15378ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
15388ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff);
15398ea1fbf7SHeiko Schocher /* Clear all pending interrupts - UDP may be used by bootloader. */
15408ea1fbf7SHeiko Schocher at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff);
15418ea1fbf7SHeiko Schocher
15428ea1fbf7SHeiko Schocher INFO("%s version %s\n", driver_name, DRIVER_VERSION);
15438ea1fbf7SHeiko Schocher return 0;
15448ea1fbf7SHeiko Schocher }
1545