xref: /rk3399_rockchip-uboot/drivers/usb/gadget/at91_udc.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
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