xref: /OK3568_Linux_fs/kernel/drivers/usb/gadget/udc/atmel_usba_udc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Driver for the Atmel USBA high speed USB device controller
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2005-2007 Atmel Corporation
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #include <linux/clk.h>
8*4882a593Smuzhiyun #include <linux/clk/at91_pmc.h>
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/init.h>
11*4882a593Smuzhiyun #include <linux/interrupt.h>
12*4882a593Smuzhiyun #include <linux/io.h>
13*4882a593Smuzhiyun #include <linux/slab.h>
14*4882a593Smuzhiyun #include <linux/device.h>
15*4882a593Smuzhiyun #include <linux/dma-mapping.h>
16*4882a593Smuzhiyun #include <linux/list.h>
17*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
18*4882a593Smuzhiyun #include <linux/platform_device.h>
19*4882a593Smuzhiyun #include <linux/regmap.h>
20*4882a593Smuzhiyun #include <linux/ctype.h>
21*4882a593Smuzhiyun #include <linux/usb.h>
22*4882a593Smuzhiyun #include <linux/usb/ch9.h>
23*4882a593Smuzhiyun #include <linux/usb/gadget.h>
24*4882a593Smuzhiyun #include <linux/delay.h>
25*4882a593Smuzhiyun #include <linux/of.h>
26*4882a593Smuzhiyun #include <linux/irq.h>
27*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include "atmel_usba_udc.h"
30*4882a593Smuzhiyun #define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \
31*4882a593Smuzhiyun 			   | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #ifdef CONFIG_USB_GADGET_DEBUG_FS
34*4882a593Smuzhiyun #include <linux/debugfs.h>
35*4882a593Smuzhiyun #include <linux/uaccess.h>
36*4882a593Smuzhiyun 
queue_dbg_open(struct inode * inode,struct file * file)37*4882a593Smuzhiyun static int queue_dbg_open(struct inode *inode, struct file *file)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	struct usba_ep *ep = inode->i_private;
40*4882a593Smuzhiyun 	struct usba_request *req, *req_copy;
41*4882a593Smuzhiyun 	struct list_head *queue_data;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	queue_data = kmalloc(sizeof(*queue_data), GFP_KERNEL);
44*4882a593Smuzhiyun 	if (!queue_data)
45*4882a593Smuzhiyun 		return -ENOMEM;
46*4882a593Smuzhiyun 	INIT_LIST_HEAD(queue_data);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	spin_lock_irq(&ep->udc->lock);
49*4882a593Smuzhiyun 	list_for_each_entry(req, &ep->queue, queue) {
50*4882a593Smuzhiyun 		req_copy = kmemdup(req, sizeof(*req_copy), GFP_ATOMIC);
51*4882a593Smuzhiyun 		if (!req_copy)
52*4882a593Smuzhiyun 			goto fail;
53*4882a593Smuzhiyun 		list_add_tail(&req_copy->queue, queue_data);
54*4882a593Smuzhiyun 	}
55*4882a593Smuzhiyun 	spin_unlock_irq(&ep->udc->lock);
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	file->private_data = queue_data;
58*4882a593Smuzhiyun 	return 0;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun fail:
61*4882a593Smuzhiyun 	spin_unlock_irq(&ep->udc->lock);
62*4882a593Smuzhiyun 	list_for_each_entry_safe(req, req_copy, queue_data, queue) {
63*4882a593Smuzhiyun 		list_del(&req->queue);
64*4882a593Smuzhiyun 		kfree(req);
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 	kfree(queue_data);
67*4882a593Smuzhiyun 	return -ENOMEM;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /*
71*4882a593Smuzhiyun  * bbbbbbbb llllllll IZS sssss nnnn FDL\n\0
72*4882a593Smuzhiyun  *
73*4882a593Smuzhiyun  * b: buffer address
74*4882a593Smuzhiyun  * l: buffer length
75*4882a593Smuzhiyun  * I/i: interrupt/no interrupt
76*4882a593Smuzhiyun  * Z/z: zero/no zero
77*4882a593Smuzhiyun  * S/s: short ok/short not ok
78*4882a593Smuzhiyun  * s: status
79*4882a593Smuzhiyun  * n: nr_packets
80*4882a593Smuzhiyun  * F/f: submitted/not submitted to FIFO
81*4882a593Smuzhiyun  * D/d: using/not using DMA
82*4882a593Smuzhiyun  * L/l: last transaction/not last transaction
83*4882a593Smuzhiyun  */
queue_dbg_read(struct file * file,char __user * buf,size_t nbytes,loff_t * ppos)84*4882a593Smuzhiyun static ssize_t queue_dbg_read(struct file *file, char __user *buf,
85*4882a593Smuzhiyun 		size_t nbytes, loff_t *ppos)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	struct list_head *queue = file->private_data;
88*4882a593Smuzhiyun 	struct usba_request *req, *tmp_req;
89*4882a593Smuzhiyun 	size_t len, remaining, actual = 0;
90*4882a593Smuzhiyun 	char tmpbuf[38];
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	if (!access_ok(buf, nbytes))
93*4882a593Smuzhiyun 		return -EFAULT;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	inode_lock(file_inode(file));
96*4882a593Smuzhiyun 	list_for_each_entry_safe(req, tmp_req, queue, queue) {
97*4882a593Smuzhiyun 		len = snprintf(tmpbuf, sizeof(tmpbuf),
98*4882a593Smuzhiyun 				"%8p %08x %c%c%c %5d %c%c%c\n",
99*4882a593Smuzhiyun 				req->req.buf, req->req.length,
100*4882a593Smuzhiyun 				req->req.no_interrupt ? 'i' : 'I',
101*4882a593Smuzhiyun 				req->req.zero ? 'Z' : 'z',
102*4882a593Smuzhiyun 				req->req.short_not_ok ? 's' : 'S',
103*4882a593Smuzhiyun 				req->req.status,
104*4882a593Smuzhiyun 				req->submitted ? 'F' : 'f',
105*4882a593Smuzhiyun 				req->using_dma ? 'D' : 'd',
106*4882a593Smuzhiyun 				req->last_transaction ? 'L' : 'l');
107*4882a593Smuzhiyun 		len = min(len, sizeof(tmpbuf));
108*4882a593Smuzhiyun 		if (len > nbytes)
109*4882a593Smuzhiyun 			break;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 		list_del(&req->queue);
112*4882a593Smuzhiyun 		kfree(req);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 		remaining = __copy_to_user(buf, tmpbuf, len);
115*4882a593Smuzhiyun 		actual += len - remaining;
116*4882a593Smuzhiyun 		if (remaining)
117*4882a593Smuzhiyun 			break;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 		nbytes -= len;
120*4882a593Smuzhiyun 		buf += len;
121*4882a593Smuzhiyun 	}
122*4882a593Smuzhiyun 	inode_unlock(file_inode(file));
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	return actual;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
queue_dbg_release(struct inode * inode,struct file * file)127*4882a593Smuzhiyun static int queue_dbg_release(struct inode *inode, struct file *file)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	struct list_head *queue_data = file->private_data;
130*4882a593Smuzhiyun 	struct usba_request *req, *tmp_req;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	list_for_each_entry_safe(req, tmp_req, queue_data, queue) {
133*4882a593Smuzhiyun 		list_del(&req->queue);
134*4882a593Smuzhiyun 		kfree(req);
135*4882a593Smuzhiyun 	}
136*4882a593Smuzhiyun 	kfree(queue_data);
137*4882a593Smuzhiyun 	return 0;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
regs_dbg_open(struct inode * inode,struct file * file)140*4882a593Smuzhiyun static int regs_dbg_open(struct inode *inode, struct file *file)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun 	struct usba_udc *udc;
143*4882a593Smuzhiyun 	unsigned int i;
144*4882a593Smuzhiyun 	u32 *data;
145*4882a593Smuzhiyun 	int ret = -ENOMEM;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	inode_lock(inode);
148*4882a593Smuzhiyun 	udc = inode->i_private;
149*4882a593Smuzhiyun 	data = kmalloc(inode->i_size, GFP_KERNEL);
150*4882a593Smuzhiyun 	if (!data)
151*4882a593Smuzhiyun 		goto out;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	spin_lock_irq(&udc->lock);
154*4882a593Smuzhiyun 	for (i = 0; i < inode->i_size / 4; i++)
155*4882a593Smuzhiyun 		data[i] = readl_relaxed(udc->regs + i * 4);
156*4882a593Smuzhiyun 	spin_unlock_irq(&udc->lock);
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	file->private_data = data;
159*4882a593Smuzhiyun 	ret = 0;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun out:
162*4882a593Smuzhiyun 	inode_unlock(inode);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	return ret;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
regs_dbg_read(struct file * file,char __user * buf,size_t nbytes,loff_t * ppos)167*4882a593Smuzhiyun static ssize_t regs_dbg_read(struct file *file, char __user *buf,
168*4882a593Smuzhiyun 		size_t nbytes, loff_t *ppos)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	struct inode *inode = file_inode(file);
171*4882a593Smuzhiyun 	int ret;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	inode_lock(inode);
174*4882a593Smuzhiyun 	ret = simple_read_from_buffer(buf, nbytes, ppos,
175*4882a593Smuzhiyun 			file->private_data,
176*4882a593Smuzhiyun 			file_inode(file)->i_size);
177*4882a593Smuzhiyun 	inode_unlock(inode);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	return ret;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
regs_dbg_release(struct inode * inode,struct file * file)182*4882a593Smuzhiyun static int regs_dbg_release(struct inode *inode, struct file *file)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	kfree(file->private_data);
185*4882a593Smuzhiyun 	return 0;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun static const struct file_operations queue_dbg_fops = {
189*4882a593Smuzhiyun 	.owner		= THIS_MODULE,
190*4882a593Smuzhiyun 	.open		= queue_dbg_open,
191*4882a593Smuzhiyun 	.llseek		= no_llseek,
192*4882a593Smuzhiyun 	.read		= queue_dbg_read,
193*4882a593Smuzhiyun 	.release	= queue_dbg_release,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun static const struct file_operations regs_dbg_fops = {
197*4882a593Smuzhiyun 	.owner		= THIS_MODULE,
198*4882a593Smuzhiyun 	.open		= regs_dbg_open,
199*4882a593Smuzhiyun 	.llseek		= generic_file_llseek,
200*4882a593Smuzhiyun 	.read		= regs_dbg_read,
201*4882a593Smuzhiyun 	.release	= regs_dbg_release,
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
usba_ep_init_debugfs(struct usba_udc * udc,struct usba_ep * ep)204*4882a593Smuzhiyun static void usba_ep_init_debugfs(struct usba_udc *udc,
205*4882a593Smuzhiyun 		struct usba_ep *ep)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	struct dentry *ep_root;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	ep_root = debugfs_create_dir(ep->ep.name, udc->debugfs_root);
210*4882a593Smuzhiyun 	ep->debugfs_dir = ep_root;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	debugfs_create_file("queue", 0400, ep_root, ep, &queue_dbg_fops);
213*4882a593Smuzhiyun 	if (ep->can_dma)
214*4882a593Smuzhiyun 		debugfs_create_u32("dma_status", 0400, ep_root,
215*4882a593Smuzhiyun 				   &ep->last_dma_status);
216*4882a593Smuzhiyun 	if (ep_is_control(ep))
217*4882a593Smuzhiyun 		debugfs_create_u32("state", 0400, ep_root, &ep->state);
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
usba_ep_cleanup_debugfs(struct usba_ep * ep)220*4882a593Smuzhiyun static void usba_ep_cleanup_debugfs(struct usba_ep *ep)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun 	debugfs_remove_recursive(ep->debugfs_dir);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
usba_init_debugfs(struct usba_udc * udc)225*4882a593Smuzhiyun static void usba_init_debugfs(struct usba_udc *udc)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun 	struct dentry *root;
228*4882a593Smuzhiyun 	struct resource *regs_resource;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	root = debugfs_create_dir(udc->gadget.name, usb_debug_root);
231*4882a593Smuzhiyun 	udc->debugfs_root = root;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	regs_resource = platform_get_resource(udc->pdev, IORESOURCE_MEM,
234*4882a593Smuzhiyun 				CTRL_IOMEM_ID);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	if (regs_resource) {
237*4882a593Smuzhiyun 		debugfs_create_file_size("regs", 0400, root, udc,
238*4882a593Smuzhiyun 					 &regs_dbg_fops,
239*4882a593Smuzhiyun 					 resource_size(regs_resource));
240*4882a593Smuzhiyun 	}
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	usba_ep_init_debugfs(udc, to_usba_ep(udc->gadget.ep0));
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
usba_cleanup_debugfs(struct usba_udc * udc)245*4882a593Smuzhiyun static void usba_cleanup_debugfs(struct usba_udc *udc)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	usba_ep_cleanup_debugfs(to_usba_ep(udc->gadget.ep0));
248*4882a593Smuzhiyun 	debugfs_remove_recursive(udc->debugfs_root);
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun #else
usba_ep_init_debugfs(struct usba_udc * udc,struct usba_ep * ep)251*4882a593Smuzhiyun static inline void usba_ep_init_debugfs(struct usba_udc *udc,
252*4882a593Smuzhiyun 					 struct usba_ep *ep)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun 
usba_ep_cleanup_debugfs(struct usba_ep * ep)257*4882a593Smuzhiyun static inline void usba_ep_cleanup_debugfs(struct usba_ep *ep)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun 
usba_init_debugfs(struct usba_udc * udc)262*4882a593Smuzhiyun static inline void usba_init_debugfs(struct usba_udc *udc)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
usba_cleanup_debugfs(struct usba_udc * udc)267*4882a593Smuzhiyun static inline void usba_cleanup_debugfs(struct usba_udc *udc)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun static ushort fifo_mode;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun module_param(fifo_mode, ushort, 0x0);
276*4882a593Smuzhiyun MODULE_PARM_DESC(fifo_mode, "Endpoint configuration mode");
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* mode 0 - uses autoconfig */
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* mode 1 - fits in 8KB, generic max fifo configuration */
281*4882a593Smuzhiyun static struct usba_fifo_cfg mode_1_cfg[] = {
282*4882a593Smuzhiyun { .hw_ep_num = 0, .fifo_size = 64,	.nr_banks = 1, },
283*4882a593Smuzhiyun { .hw_ep_num = 1, .fifo_size = 1024,	.nr_banks = 2, },
284*4882a593Smuzhiyun { .hw_ep_num = 2, .fifo_size = 1024,	.nr_banks = 1, },
285*4882a593Smuzhiyun { .hw_ep_num = 3, .fifo_size = 1024,	.nr_banks = 1, },
286*4882a593Smuzhiyun { .hw_ep_num = 4, .fifo_size = 1024,	.nr_banks = 1, },
287*4882a593Smuzhiyun { .hw_ep_num = 5, .fifo_size = 1024,	.nr_banks = 1, },
288*4882a593Smuzhiyun { .hw_ep_num = 6, .fifo_size = 1024,	.nr_banks = 1, },
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun /* mode 2 - fits in 8KB, performance max fifo configuration */
292*4882a593Smuzhiyun static struct usba_fifo_cfg mode_2_cfg[] = {
293*4882a593Smuzhiyun { .hw_ep_num = 0, .fifo_size = 64,	.nr_banks = 1, },
294*4882a593Smuzhiyun { .hw_ep_num = 1, .fifo_size = 1024,	.nr_banks = 3, },
295*4882a593Smuzhiyun { .hw_ep_num = 2, .fifo_size = 1024,	.nr_banks = 2, },
296*4882a593Smuzhiyun { .hw_ep_num = 3, .fifo_size = 1024,	.nr_banks = 2, },
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun /* mode 3 - fits in 8KB, mixed fifo configuration */
300*4882a593Smuzhiyun static struct usba_fifo_cfg mode_3_cfg[] = {
301*4882a593Smuzhiyun { .hw_ep_num = 0, .fifo_size = 64,	.nr_banks = 1, },
302*4882a593Smuzhiyun { .hw_ep_num = 1, .fifo_size = 1024,	.nr_banks = 2, },
303*4882a593Smuzhiyun { .hw_ep_num = 2, .fifo_size = 512,	.nr_banks = 2, },
304*4882a593Smuzhiyun { .hw_ep_num = 3, .fifo_size = 512,	.nr_banks = 2, },
305*4882a593Smuzhiyun { .hw_ep_num = 4, .fifo_size = 512,	.nr_banks = 2, },
306*4882a593Smuzhiyun { .hw_ep_num = 5, .fifo_size = 512,	.nr_banks = 2, },
307*4882a593Smuzhiyun { .hw_ep_num = 6, .fifo_size = 512,	.nr_banks = 2, },
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun /* mode 4 - fits in 8KB, custom fifo configuration */
311*4882a593Smuzhiyun static struct usba_fifo_cfg mode_4_cfg[] = {
312*4882a593Smuzhiyun { .hw_ep_num = 0, .fifo_size = 64,	.nr_banks = 1, },
313*4882a593Smuzhiyun { .hw_ep_num = 1, .fifo_size = 512,	.nr_banks = 2, },
314*4882a593Smuzhiyun { .hw_ep_num = 2, .fifo_size = 512,	.nr_banks = 2, },
315*4882a593Smuzhiyun { .hw_ep_num = 3, .fifo_size = 8,	.nr_banks = 2, },
316*4882a593Smuzhiyun { .hw_ep_num = 4, .fifo_size = 512,	.nr_banks = 2, },
317*4882a593Smuzhiyun { .hw_ep_num = 5, .fifo_size = 512,	.nr_banks = 2, },
318*4882a593Smuzhiyun { .hw_ep_num = 6, .fifo_size = 16,	.nr_banks = 2, },
319*4882a593Smuzhiyun { .hw_ep_num = 7, .fifo_size = 8,	.nr_banks = 2, },
320*4882a593Smuzhiyun { .hw_ep_num = 8, .fifo_size = 8,	.nr_banks = 2, },
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun /* Add additional configurations here */
323*4882a593Smuzhiyun 
usba_config_fifo_table(struct usba_udc * udc)324*4882a593Smuzhiyun static int usba_config_fifo_table(struct usba_udc *udc)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun 	int n;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	switch (fifo_mode) {
329*4882a593Smuzhiyun 	default:
330*4882a593Smuzhiyun 		fifo_mode = 0;
331*4882a593Smuzhiyun 		fallthrough;
332*4882a593Smuzhiyun 	case 0:
333*4882a593Smuzhiyun 		udc->fifo_cfg = NULL;
334*4882a593Smuzhiyun 		n = 0;
335*4882a593Smuzhiyun 		break;
336*4882a593Smuzhiyun 	case 1:
337*4882a593Smuzhiyun 		udc->fifo_cfg = mode_1_cfg;
338*4882a593Smuzhiyun 		n = ARRAY_SIZE(mode_1_cfg);
339*4882a593Smuzhiyun 		break;
340*4882a593Smuzhiyun 	case 2:
341*4882a593Smuzhiyun 		udc->fifo_cfg = mode_2_cfg;
342*4882a593Smuzhiyun 		n = ARRAY_SIZE(mode_2_cfg);
343*4882a593Smuzhiyun 		break;
344*4882a593Smuzhiyun 	case 3:
345*4882a593Smuzhiyun 		udc->fifo_cfg = mode_3_cfg;
346*4882a593Smuzhiyun 		n = ARRAY_SIZE(mode_3_cfg);
347*4882a593Smuzhiyun 		break;
348*4882a593Smuzhiyun 	case 4:
349*4882a593Smuzhiyun 		udc->fifo_cfg = mode_4_cfg;
350*4882a593Smuzhiyun 		n = ARRAY_SIZE(mode_4_cfg);
351*4882a593Smuzhiyun 		break;
352*4882a593Smuzhiyun 	}
353*4882a593Smuzhiyun 	DBG(DBG_HW, "Setup fifo_mode %d\n", fifo_mode);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	return n;
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun 
usba_int_enb_get(struct usba_udc * udc)358*4882a593Smuzhiyun static inline u32 usba_int_enb_get(struct usba_udc *udc)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun 	return udc->int_enb_cache;
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun 
usba_int_enb_set(struct usba_udc * udc,u32 mask)363*4882a593Smuzhiyun static inline void usba_int_enb_set(struct usba_udc *udc, u32 mask)
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun 	u32 val;
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	val = udc->int_enb_cache | mask;
368*4882a593Smuzhiyun 	usba_writel(udc, INT_ENB, val);
369*4882a593Smuzhiyun 	udc->int_enb_cache = val;
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun 
usba_int_enb_clear(struct usba_udc * udc,u32 mask)372*4882a593Smuzhiyun static inline void usba_int_enb_clear(struct usba_udc *udc, u32 mask)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun 	u32 val;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	val = udc->int_enb_cache & ~mask;
377*4882a593Smuzhiyun 	usba_writel(udc, INT_ENB, val);
378*4882a593Smuzhiyun 	udc->int_enb_cache = val;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
vbus_is_present(struct usba_udc * udc)381*4882a593Smuzhiyun static int vbus_is_present(struct usba_udc *udc)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun 	if (udc->vbus_pin)
384*4882a593Smuzhiyun 		return gpiod_get_value(udc->vbus_pin);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	/* No Vbus detection: Assume always present */
387*4882a593Smuzhiyun 	return 1;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
toggle_bias(struct usba_udc * udc,int is_on)390*4882a593Smuzhiyun static void toggle_bias(struct usba_udc *udc, int is_on)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	if (udc->errata && udc->errata->toggle_bias)
393*4882a593Smuzhiyun 		udc->errata->toggle_bias(udc, is_on);
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun 
generate_bias_pulse(struct usba_udc * udc)396*4882a593Smuzhiyun static void generate_bias_pulse(struct usba_udc *udc)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun 	if (!udc->bias_pulse_needed)
399*4882a593Smuzhiyun 		return;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	if (udc->errata && udc->errata->pulse_bias)
402*4882a593Smuzhiyun 		udc->errata->pulse_bias(udc);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	udc->bias_pulse_needed = false;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun 
next_fifo_transaction(struct usba_ep * ep,struct usba_request * req)407*4882a593Smuzhiyun static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun 	unsigned int transaction_len;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	transaction_len = req->req.length - req->req.actual;
412*4882a593Smuzhiyun 	req->last_transaction = 1;
413*4882a593Smuzhiyun 	if (transaction_len > ep->ep.maxpacket) {
414*4882a593Smuzhiyun 		transaction_len = ep->ep.maxpacket;
415*4882a593Smuzhiyun 		req->last_transaction = 0;
416*4882a593Smuzhiyun 	} else if (transaction_len == ep->ep.maxpacket && req->req.zero)
417*4882a593Smuzhiyun 		req->last_transaction = 0;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	DBG(DBG_QUEUE, "%s: submit_transaction, req %p (length %d)%s\n",
420*4882a593Smuzhiyun 		ep->ep.name, req, transaction_len,
421*4882a593Smuzhiyun 		req->last_transaction ? ", done" : "");
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	memcpy_toio(ep->fifo, req->req.buf + req->req.actual, transaction_len);
424*4882a593Smuzhiyun 	usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
425*4882a593Smuzhiyun 	req->req.actual += transaction_len;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun 
submit_request(struct usba_ep * ep,struct usba_request * req)428*4882a593Smuzhiyun static void submit_request(struct usba_ep *ep, struct usba_request *req)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun 	DBG(DBG_QUEUE, "%s: submit_request: req %p (length %d)\n",
431*4882a593Smuzhiyun 		ep->ep.name, req, req->req.length);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	req->req.actual = 0;
434*4882a593Smuzhiyun 	req->submitted = 1;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	if (req->using_dma) {
437*4882a593Smuzhiyun 		if (req->req.length == 0) {
438*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
439*4882a593Smuzhiyun 			return;
440*4882a593Smuzhiyun 		}
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 		if (req->req.zero)
443*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_SHORT_PACKET);
444*4882a593Smuzhiyun 		else
445*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_SHORT_PACKET);
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 		usba_dma_writel(ep, ADDRESS, req->req.dma);
448*4882a593Smuzhiyun 		usba_dma_writel(ep, CONTROL, req->ctrl);
449*4882a593Smuzhiyun 	} else {
450*4882a593Smuzhiyun 		next_fifo_transaction(ep, req);
451*4882a593Smuzhiyun 		if (req->last_transaction) {
452*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
453*4882a593Smuzhiyun 			if (ep_is_control(ep))
454*4882a593Smuzhiyun 				usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
455*4882a593Smuzhiyun 		} else {
456*4882a593Smuzhiyun 			if (ep_is_control(ep))
457*4882a593Smuzhiyun 				usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
458*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
459*4882a593Smuzhiyun 		}
460*4882a593Smuzhiyun 	}
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun 
submit_next_request(struct usba_ep * ep)463*4882a593Smuzhiyun static void submit_next_request(struct usba_ep *ep)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	struct usba_request *req;
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	if (list_empty(&ep->queue)) {
468*4882a593Smuzhiyun 		usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY | USBA_RX_BK_RDY);
469*4882a593Smuzhiyun 		return;
470*4882a593Smuzhiyun 	}
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	req = list_entry(ep->queue.next, struct usba_request, queue);
473*4882a593Smuzhiyun 	if (!req->submitted)
474*4882a593Smuzhiyun 		submit_request(ep, req);
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun 
send_status(struct usba_udc * udc,struct usba_ep * ep)477*4882a593Smuzhiyun static void send_status(struct usba_udc *udc, struct usba_ep *ep)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun 	ep->state = STATUS_STAGE_IN;
480*4882a593Smuzhiyun 	usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
481*4882a593Smuzhiyun 	usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun 
receive_data(struct usba_ep * ep)484*4882a593Smuzhiyun static void receive_data(struct usba_ep *ep)
485*4882a593Smuzhiyun {
486*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
487*4882a593Smuzhiyun 	struct usba_request *req;
488*4882a593Smuzhiyun 	unsigned long status;
489*4882a593Smuzhiyun 	unsigned int bytecount, nr_busy;
490*4882a593Smuzhiyun 	int is_complete = 0;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	status = usba_ep_readl(ep, STA);
493*4882a593Smuzhiyun 	nr_busy = USBA_BFEXT(BUSY_BANKS, status);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	DBG(DBG_QUEUE, "receive data: nr_busy=%u\n", nr_busy);
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	while (nr_busy > 0) {
498*4882a593Smuzhiyun 		if (list_empty(&ep->queue)) {
499*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
500*4882a593Smuzhiyun 			break;
501*4882a593Smuzhiyun 		}
502*4882a593Smuzhiyun 		req = list_entry(ep->queue.next,
503*4882a593Smuzhiyun 				 struct usba_request, queue);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 		bytecount = USBA_BFEXT(BYTE_COUNT, status);
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 		if (status & (1 << 31))
508*4882a593Smuzhiyun 			is_complete = 1;
509*4882a593Smuzhiyun 		if (req->req.actual + bytecount >= req->req.length) {
510*4882a593Smuzhiyun 			is_complete = 1;
511*4882a593Smuzhiyun 			bytecount = req->req.length - req->req.actual;
512*4882a593Smuzhiyun 		}
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 		memcpy_fromio(req->req.buf + req->req.actual,
515*4882a593Smuzhiyun 				ep->fifo, bytecount);
516*4882a593Smuzhiyun 		req->req.actual += bytecount;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 		usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 		if (is_complete) {
521*4882a593Smuzhiyun 			DBG(DBG_QUEUE, "%s: request done\n", ep->ep.name);
522*4882a593Smuzhiyun 			req->req.status = 0;
523*4882a593Smuzhiyun 			list_del_init(&req->queue);
524*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
525*4882a593Smuzhiyun 			spin_unlock(&udc->lock);
526*4882a593Smuzhiyun 			usb_gadget_giveback_request(&ep->ep, &req->req);
527*4882a593Smuzhiyun 			spin_lock(&udc->lock);
528*4882a593Smuzhiyun 		}
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 		status = usba_ep_readl(ep, STA);
531*4882a593Smuzhiyun 		nr_busy = USBA_BFEXT(BUSY_BANKS, status);
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 		if (is_complete && ep_is_control(ep)) {
534*4882a593Smuzhiyun 			send_status(udc, ep);
535*4882a593Smuzhiyun 			break;
536*4882a593Smuzhiyun 		}
537*4882a593Smuzhiyun 	}
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun static void
request_complete(struct usba_ep * ep,struct usba_request * req,int status)541*4882a593Smuzhiyun request_complete(struct usba_ep *ep, struct usba_request *req, int status)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 	WARN_ON(!list_empty(&req->queue));
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	if (req->req.status == -EINPROGRESS)
548*4882a593Smuzhiyun 		req->req.status = status;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	if (req->using_dma)
551*4882a593Smuzhiyun 		usb_gadget_unmap_request(&udc->gadget, &req->req, ep->is_in);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	DBG(DBG_GADGET | DBG_REQ,
554*4882a593Smuzhiyun 		"%s: req %p complete: status %d, actual %u\n",
555*4882a593Smuzhiyun 		ep->ep.name, req, req->req.status, req->req.actual);
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	spin_unlock(&udc->lock);
558*4882a593Smuzhiyun 	usb_gadget_giveback_request(&ep->ep, &req->req);
559*4882a593Smuzhiyun 	spin_lock(&udc->lock);
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun static void
request_complete_list(struct usba_ep * ep,struct list_head * list,int status)563*4882a593Smuzhiyun request_complete_list(struct usba_ep *ep, struct list_head *list, int status)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun 	struct usba_request *req, *tmp_req;
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	list_for_each_entry_safe(req, tmp_req, list, queue) {
568*4882a593Smuzhiyun 		list_del_init(&req->queue);
569*4882a593Smuzhiyun 		request_complete(ep, req, status);
570*4882a593Smuzhiyun 	}
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun static int
usba_ep_enable(struct usb_ep * _ep,const struct usb_endpoint_descriptor * desc)574*4882a593Smuzhiyun usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
575*4882a593Smuzhiyun {
576*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
577*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
578*4882a593Smuzhiyun 	unsigned long flags, maxpacket;
579*4882a593Smuzhiyun 	unsigned int nr_trans;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	maxpacket = usb_endpoint_maxp(desc);
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	if (((desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK) != ep->index)
586*4882a593Smuzhiyun 			|| ep->index == 0
587*4882a593Smuzhiyun 			|| desc->bDescriptorType != USB_DT_ENDPOINT
588*4882a593Smuzhiyun 			|| maxpacket == 0
589*4882a593Smuzhiyun 			|| maxpacket > ep->fifo_size) {
590*4882a593Smuzhiyun 		DBG(DBG_ERR, "ep_enable: Invalid argument");
591*4882a593Smuzhiyun 		return -EINVAL;
592*4882a593Smuzhiyun 	}
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	ep->is_isoc = 0;
595*4882a593Smuzhiyun 	ep->is_in = 0;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n",
598*4882a593Smuzhiyun 			ep->ep.name, ep->ept_cfg, maxpacket);
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	if (usb_endpoint_dir_in(desc)) {
601*4882a593Smuzhiyun 		ep->is_in = 1;
602*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_EPT_DIR_IN;
603*4882a593Smuzhiyun 	}
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	switch (usb_endpoint_type(desc)) {
606*4882a593Smuzhiyun 	case USB_ENDPOINT_XFER_CONTROL:
607*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_CONTROL);
608*4882a593Smuzhiyun 		break;
609*4882a593Smuzhiyun 	case USB_ENDPOINT_XFER_ISOC:
610*4882a593Smuzhiyun 		if (!ep->can_isoc) {
611*4882a593Smuzhiyun 			DBG(DBG_ERR, "ep_enable: %s is not isoc capable\n",
612*4882a593Smuzhiyun 					ep->ep.name);
613*4882a593Smuzhiyun 			return -EINVAL;
614*4882a593Smuzhiyun 		}
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 		/*
617*4882a593Smuzhiyun 		 * Bits 11:12 specify number of _additional_
618*4882a593Smuzhiyun 		 * transactions per microframe.
619*4882a593Smuzhiyun 		 */
620*4882a593Smuzhiyun 		nr_trans = usb_endpoint_maxp_mult(desc);
621*4882a593Smuzhiyun 		if (nr_trans > 3)
622*4882a593Smuzhiyun 			return -EINVAL;
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun 		ep->is_isoc = 1;
625*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_ISO);
626*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(NB_TRANS, nr_trans);
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun 		break;
629*4882a593Smuzhiyun 	case USB_ENDPOINT_XFER_BULK:
630*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK);
631*4882a593Smuzhiyun 		break;
632*4882a593Smuzhiyun 	case USB_ENDPOINT_XFER_INT:
633*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_INT);
634*4882a593Smuzhiyun 		break;
635*4882a593Smuzhiyun 	}
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	spin_lock_irqsave(&ep->udc->lock, flags);
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	ep->ep.desc = desc;
640*4882a593Smuzhiyun 	ep->ep.maxpacket = maxpacket;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun 	usba_ep_writel(ep, CFG, ep->ept_cfg);
643*4882a593Smuzhiyun 	usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	if (ep->can_dma) {
646*4882a593Smuzhiyun 		u32 ctrl;
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_BF(EPT_INT, 1 << ep->index) |
649*4882a593Smuzhiyun 				      USBA_BF(DMA_INT, 1 << ep->index));
650*4882a593Smuzhiyun 		ctrl = USBA_AUTO_VALID | USBA_INTDIS_DMA;
651*4882a593Smuzhiyun 		usba_ep_writel(ep, CTL_ENB, ctrl);
652*4882a593Smuzhiyun 	} else {
653*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_BF(EPT_INT, 1 << ep->index));
654*4882a593Smuzhiyun 	}
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	DBG(DBG_HW, "EPT_CFG%d after init: %#08lx\n", ep->index,
659*4882a593Smuzhiyun 			(unsigned long)usba_ep_readl(ep, CFG));
660*4882a593Smuzhiyun 	DBG(DBG_HW, "INT_ENB after init: %#08lx\n",
661*4882a593Smuzhiyun 			(unsigned long)usba_int_enb_get(udc));
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun 	return 0;
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun 
usba_ep_disable(struct usb_ep * _ep)666*4882a593Smuzhiyun static int usba_ep_disable(struct usb_ep *_ep)
667*4882a593Smuzhiyun {
668*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
669*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
670*4882a593Smuzhiyun 	LIST_HEAD(req_list);
671*4882a593Smuzhiyun 	unsigned long flags;
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	DBG(DBG_GADGET, "ep_disable: %s\n", ep->ep.name);
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	if (!ep->ep.desc) {
678*4882a593Smuzhiyun 		spin_unlock_irqrestore(&udc->lock, flags);
679*4882a593Smuzhiyun 		DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name);
680*4882a593Smuzhiyun 		return -EINVAL;
681*4882a593Smuzhiyun 	}
682*4882a593Smuzhiyun 	ep->ep.desc = NULL;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	list_splice_init(&ep->queue, &req_list);
685*4882a593Smuzhiyun 	if (ep->can_dma) {
686*4882a593Smuzhiyun 		usba_dma_writel(ep, CONTROL, 0);
687*4882a593Smuzhiyun 		usba_dma_writel(ep, ADDRESS, 0);
688*4882a593Smuzhiyun 		usba_dma_readl(ep, STATUS);
689*4882a593Smuzhiyun 	}
690*4882a593Smuzhiyun 	usba_ep_writel(ep, CTL_DIS, USBA_EPT_ENABLE);
691*4882a593Smuzhiyun 	usba_int_enb_clear(udc, USBA_BF(EPT_INT, 1 << ep->index));
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	request_complete_list(ep, &req_list, -ESHUTDOWN);
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	return 0;
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun static struct usb_request *
usba_ep_alloc_request(struct usb_ep * _ep,gfp_t gfp_flags)701*4882a593Smuzhiyun usba_ep_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
702*4882a593Smuzhiyun {
703*4882a593Smuzhiyun 	struct usba_request *req;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	DBG(DBG_GADGET, "ep_alloc_request: %p, 0x%x\n", _ep, gfp_flags);
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	req = kzalloc(sizeof(*req), gfp_flags);
708*4882a593Smuzhiyun 	if (!req)
709*4882a593Smuzhiyun 		return NULL;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	INIT_LIST_HEAD(&req->queue);
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	return &req->req;
714*4882a593Smuzhiyun }
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun static void
usba_ep_free_request(struct usb_ep * _ep,struct usb_request * _req)717*4882a593Smuzhiyun usba_ep_free_request(struct usb_ep *_ep, struct usb_request *_req)
718*4882a593Smuzhiyun {
719*4882a593Smuzhiyun 	struct usba_request *req = to_usba_req(_req);
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	DBG(DBG_GADGET, "ep_free_request: %p, %p\n", _ep, _req);
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	kfree(req);
724*4882a593Smuzhiyun }
725*4882a593Smuzhiyun 
queue_dma(struct usba_udc * udc,struct usba_ep * ep,struct usba_request * req,gfp_t gfp_flags)726*4882a593Smuzhiyun static int queue_dma(struct usba_udc *udc, struct usba_ep *ep,
727*4882a593Smuzhiyun 		struct usba_request *req, gfp_t gfp_flags)
728*4882a593Smuzhiyun {
729*4882a593Smuzhiyun 	unsigned long flags;
730*4882a593Smuzhiyun 	int ret;
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	DBG(DBG_DMA, "%s: req l/%u d/%pad %c%c%c\n",
733*4882a593Smuzhiyun 		ep->ep.name, req->req.length, &req->req.dma,
734*4882a593Smuzhiyun 		req->req.zero ? 'Z' : 'z',
735*4882a593Smuzhiyun 		req->req.short_not_ok ? 'S' : 's',
736*4882a593Smuzhiyun 		req->req.no_interrupt ? 'I' : 'i');
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 	if (req->req.length > 0x10000) {
739*4882a593Smuzhiyun 		/* Lengths from 0 to 65536 (inclusive) are supported */
740*4882a593Smuzhiyun 		DBG(DBG_ERR, "invalid request length %u\n", req->req.length);
741*4882a593Smuzhiyun 		return -EINVAL;
742*4882a593Smuzhiyun 	}
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 	ret = usb_gadget_map_request(&udc->gadget, &req->req, ep->is_in);
745*4882a593Smuzhiyun 	if (ret)
746*4882a593Smuzhiyun 		return ret;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	req->using_dma = 1;
749*4882a593Smuzhiyun 	req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length)
750*4882a593Smuzhiyun 			| USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE
751*4882a593Smuzhiyun 			| USBA_DMA_END_BUF_EN;
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	if (!ep->is_in)
754*4882a593Smuzhiyun 		req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE;
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 	/*
757*4882a593Smuzhiyun 	 * Add this request to the queue and submit for DMA if
758*4882a593Smuzhiyun 	 * possible. Check if we're still alive first -- we may have
759*4882a593Smuzhiyun 	 * received a reset since last time we checked.
760*4882a593Smuzhiyun 	 */
761*4882a593Smuzhiyun 	ret = -ESHUTDOWN;
762*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
763*4882a593Smuzhiyun 	if (ep->ep.desc) {
764*4882a593Smuzhiyun 		if (list_empty(&ep->queue))
765*4882a593Smuzhiyun 			submit_request(ep, req);
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 		list_add_tail(&req->queue, &ep->queue);
768*4882a593Smuzhiyun 		ret = 0;
769*4882a593Smuzhiyun 	}
770*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	return ret;
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun static int
usba_ep_queue(struct usb_ep * _ep,struct usb_request * _req,gfp_t gfp_flags)776*4882a593Smuzhiyun usba_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
777*4882a593Smuzhiyun {
778*4882a593Smuzhiyun 	struct usba_request *req = to_usba_req(_req);
779*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
780*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
781*4882a593Smuzhiyun 	unsigned long flags;
782*4882a593Smuzhiyun 	int ret;
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	DBG(DBG_GADGET | DBG_QUEUE | DBG_REQ, "%s: queue req %p, len %u\n",
785*4882a593Smuzhiyun 			ep->ep.name, req, _req->length);
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN ||
788*4882a593Smuzhiyun 	    !ep->ep.desc)
789*4882a593Smuzhiyun 		return -ESHUTDOWN;
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	req->submitted = 0;
792*4882a593Smuzhiyun 	req->using_dma = 0;
793*4882a593Smuzhiyun 	req->last_transaction = 0;
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 	_req->status = -EINPROGRESS;
796*4882a593Smuzhiyun 	_req->actual = 0;
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	if (ep->can_dma)
799*4882a593Smuzhiyun 		return queue_dma(udc, ep, req, gfp_flags);
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	/* May have received a reset since last time we checked */
802*4882a593Smuzhiyun 	ret = -ESHUTDOWN;
803*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
804*4882a593Smuzhiyun 	if (ep->ep.desc) {
805*4882a593Smuzhiyun 		list_add_tail(&req->queue, &ep->queue);
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 		if ((!ep_is_control(ep) && ep->is_in) ||
808*4882a593Smuzhiyun 			(ep_is_control(ep)
809*4882a593Smuzhiyun 				&& (ep->state == DATA_STAGE_IN
810*4882a593Smuzhiyun 					|| ep->state == STATUS_STAGE_IN)))
811*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
812*4882a593Smuzhiyun 		else
813*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_RX_BK_RDY);
814*4882a593Smuzhiyun 		ret = 0;
815*4882a593Smuzhiyun 	}
816*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	return ret;
819*4882a593Smuzhiyun }
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun static void
usba_update_req(struct usba_ep * ep,struct usba_request * req,u32 status)822*4882a593Smuzhiyun usba_update_req(struct usba_ep *ep, struct usba_request *req, u32 status)
823*4882a593Smuzhiyun {
824*4882a593Smuzhiyun 	req->req.actual = req->req.length - USBA_BFEXT(DMA_BUF_LEN, status);
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun 
stop_dma(struct usba_ep * ep,u32 * pstatus)827*4882a593Smuzhiyun static int stop_dma(struct usba_ep *ep, u32 *pstatus)
828*4882a593Smuzhiyun {
829*4882a593Smuzhiyun 	unsigned int timeout;
830*4882a593Smuzhiyun 	u32 status;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	/*
833*4882a593Smuzhiyun 	 * Stop the DMA controller. When writing both CH_EN
834*4882a593Smuzhiyun 	 * and LINK to 0, the other bits are not affected.
835*4882a593Smuzhiyun 	 */
836*4882a593Smuzhiyun 	usba_dma_writel(ep, CONTROL, 0);
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun 	/* Wait for the FIFO to empty */
839*4882a593Smuzhiyun 	for (timeout = 40; timeout; --timeout) {
840*4882a593Smuzhiyun 		status = usba_dma_readl(ep, STATUS);
841*4882a593Smuzhiyun 		if (!(status & USBA_DMA_CH_EN))
842*4882a593Smuzhiyun 			break;
843*4882a593Smuzhiyun 		udelay(1);
844*4882a593Smuzhiyun 	}
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun 	if (pstatus)
847*4882a593Smuzhiyun 		*pstatus = status;
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun 	if (timeout == 0) {
850*4882a593Smuzhiyun 		dev_err(&ep->udc->pdev->dev,
851*4882a593Smuzhiyun 			"%s: timed out waiting for DMA FIFO to empty\n",
852*4882a593Smuzhiyun 			ep->ep.name);
853*4882a593Smuzhiyun 		return -ETIMEDOUT;
854*4882a593Smuzhiyun 	}
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	return 0;
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun 
usba_ep_dequeue(struct usb_ep * _ep,struct usb_request * _req)859*4882a593Smuzhiyun static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
860*4882a593Smuzhiyun {
861*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
862*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
863*4882a593Smuzhiyun 	struct usba_request *req;
864*4882a593Smuzhiyun 	unsigned long flags;
865*4882a593Smuzhiyun 	u32 status;
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	DBG(DBG_GADGET | DBG_QUEUE, "ep_dequeue: %s, req %p\n",
868*4882a593Smuzhiyun 			ep->ep.name, _req);
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	list_for_each_entry(req, &ep->queue, queue) {
873*4882a593Smuzhiyun 		if (&req->req == _req)
874*4882a593Smuzhiyun 			break;
875*4882a593Smuzhiyun 	}
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	if (&req->req != _req) {
878*4882a593Smuzhiyun 		spin_unlock_irqrestore(&udc->lock, flags);
879*4882a593Smuzhiyun 		return -EINVAL;
880*4882a593Smuzhiyun 	}
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	if (req->using_dma) {
883*4882a593Smuzhiyun 		/*
884*4882a593Smuzhiyun 		 * If this request is currently being transferred,
885*4882a593Smuzhiyun 		 * stop the DMA controller and reset the FIFO.
886*4882a593Smuzhiyun 		 */
887*4882a593Smuzhiyun 		if (ep->queue.next == &req->queue) {
888*4882a593Smuzhiyun 			status = usba_dma_readl(ep, STATUS);
889*4882a593Smuzhiyun 			if (status & USBA_DMA_CH_EN)
890*4882a593Smuzhiyun 				stop_dma(ep, &status);
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun #ifdef CONFIG_USB_GADGET_DEBUG_FS
893*4882a593Smuzhiyun 			ep->last_dma_status = status;
894*4882a593Smuzhiyun #endif
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 			usba_writel(udc, EPT_RST, 1 << ep->index);
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 			usba_update_req(ep, req, status);
899*4882a593Smuzhiyun 		}
900*4882a593Smuzhiyun 	}
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	/*
903*4882a593Smuzhiyun 	 * Errors should stop the queue from advancing until the
904*4882a593Smuzhiyun 	 * completion function returns.
905*4882a593Smuzhiyun 	 */
906*4882a593Smuzhiyun 	list_del_init(&req->queue);
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	request_complete(ep, req, -ECONNRESET);
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	/* Process the next request if any */
911*4882a593Smuzhiyun 	submit_next_request(ep);
912*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	return 0;
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun 
usba_ep_set_halt(struct usb_ep * _ep,int value)917*4882a593Smuzhiyun static int usba_ep_set_halt(struct usb_ep *_ep, int value)
918*4882a593Smuzhiyun {
919*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
920*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
921*4882a593Smuzhiyun 	unsigned long flags;
922*4882a593Smuzhiyun 	int ret = 0;
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	DBG(DBG_GADGET, "endpoint %s: %s HALT\n", ep->ep.name,
925*4882a593Smuzhiyun 			value ? "set" : "clear");
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	if (!ep->ep.desc) {
928*4882a593Smuzhiyun 		DBG(DBG_ERR, "Attempted to halt uninitialized ep %s\n",
929*4882a593Smuzhiyun 				ep->ep.name);
930*4882a593Smuzhiyun 		return -ENODEV;
931*4882a593Smuzhiyun 	}
932*4882a593Smuzhiyun 	if (ep->is_isoc) {
933*4882a593Smuzhiyun 		DBG(DBG_ERR, "Attempted to halt isochronous ep %s\n",
934*4882a593Smuzhiyun 				ep->ep.name);
935*4882a593Smuzhiyun 		return -ENOTTY;
936*4882a593Smuzhiyun 	}
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	/*
941*4882a593Smuzhiyun 	 * We can't halt IN endpoints while there are still data to be
942*4882a593Smuzhiyun 	 * transferred
943*4882a593Smuzhiyun 	 */
944*4882a593Smuzhiyun 	if (!list_empty(&ep->queue)
945*4882a593Smuzhiyun 			|| ((value && ep->is_in && (usba_ep_readl(ep, STA)
946*4882a593Smuzhiyun 					& USBA_BF(BUSY_BANKS, -1L))))) {
947*4882a593Smuzhiyun 		ret = -EAGAIN;
948*4882a593Smuzhiyun 	} else {
949*4882a593Smuzhiyun 		if (value)
950*4882a593Smuzhiyun 			usba_ep_writel(ep, SET_STA, USBA_FORCE_STALL);
951*4882a593Smuzhiyun 		else
952*4882a593Smuzhiyun 			usba_ep_writel(ep, CLR_STA,
953*4882a593Smuzhiyun 					USBA_FORCE_STALL | USBA_TOGGLE_CLR);
954*4882a593Smuzhiyun 		usba_ep_readl(ep, STA);
955*4882a593Smuzhiyun 	}
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun 	return ret;
960*4882a593Smuzhiyun }
961*4882a593Smuzhiyun 
usba_ep_fifo_status(struct usb_ep * _ep)962*4882a593Smuzhiyun static int usba_ep_fifo_status(struct usb_ep *_ep)
963*4882a593Smuzhiyun {
964*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	return USBA_BFEXT(BYTE_COUNT, usba_ep_readl(ep, STA));
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun 
usba_ep_fifo_flush(struct usb_ep * _ep)969*4882a593Smuzhiyun static void usba_ep_fifo_flush(struct usb_ep *_ep)
970*4882a593Smuzhiyun {
971*4882a593Smuzhiyun 	struct usba_ep *ep = to_usba_ep(_ep);
972*4882a593Smuzhiyun 	struct usba_udc *udc = ep->udc;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	usba_writel(udc, EPT_RST, 1 << ep->index);
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun static const struct usb_ep_ops usba_ep_ops = {
978*4882a593Smuzhiyun 	.enable		= usba_ep_enable,
979*4882a593Smuzhiyun 	.disable	= usba_ep_disable,
980*4882a593Smuzhiyun 	.alloc_request	= usba_ep_alloc_request,
981*4882a593Smuzhiyun 	.free_request	= usba_ep_free_request,
982*4882a593Smuzhiyun 	.queue		= usba_ep_queue,
983*4882a593Smuzhiyun 	.dequeue	= usba_ep_dequeue,
984*4882a593Smuzhiyun 	.set_halt	= usba_ep_set_halt,
985*4882a593Smuzhiyun 	.fifo_status	= usba_ep_fifo_status,
986*4882a593Smuzhiyun 	.fifo_flush	= usba_ep_fifo_flush,
987*4882a593Smuzhiyun };
988*4882a593Smuzhiyun 
usba_udc_get_frame(struct usb_gadget * gadget)989*4882a593Smuzhiyun static int usba_udc_get_frame(struct usb_gadget *gadget)
990*4882a593Smuzhiyun {
991*4882a593Smuzhiyun 	struct usba_udc *udc = to_usba_udc(gadget);
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	return USBA_BFEXT(FRAME_NUMBER, usba_readl(udc, FNUM));
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun 
usba_udc_wakeup(struct usb_gadget * gadget)996*4882a593Smuzhiyun static int usba_udc_wakeup(struct usb_gadget *gadget)
997*4882a593Smuzhiyun {
998*4882a593Smuzhiyun 	struct usba_udc *udc = to_usba_udc(gadget);
999*4882a593Smuzhiyun 	unsigned long flags;
1000*4882a593Smuzhiyun 	u32 ctrl;
1001*4882a593Smuzhiyun 	int ret = -EINVAL;
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1004*4882a593Smuzhiyun 	if (udc->devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) {
1005*4882a593Smuzhiyun 		ctrl = usba_readl(udc, CTRL);
1006*4882a593Smuzhiyun 		usba_writel(udc, CTRL, ctrl | USBA_REMOTE_WAKE_UP);
1007*4882a593Smuzhiyun 		ret = 0;
1008*4882a593Smuzhiyun 	}
1009*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 	return ret;
1012*4882a593Smuzhiyun }
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun static int
usba_udc_set_selfpowered(struct usb_gadget * gadget,int is_selfpowered)1015*4882a593Smuzhiyun usba_udc_set_selfpowered(struct usb_gadget *gadget, int is_selfpowered)
1016*4882a593Smuzhiyun {
1017*4882a593Smuzhiyun 	struct usba_udc *udc = to_usba_udc(gadget);
1018*4882a593Smuzhiyun 	unsigned long flags;
1019*4882a593Smuzhiyun 
1020*4882a593Smuzhiyun 	gadget->is_selfpowered = (is_selfpowered != 0);
1021*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1022*4882a593Smuzhiyun 	if (is_selfpowered)
1023*4882a593Smuzhiyun 		udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED;
1024*4882a593Smuzhiyun 	else
1025*4882a593Smuzhiyun 		udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
1026*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 	return 0;
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun static int atmel_usba_pullup(struct usb_gadget *gadget, int is_on);
1032*4882a593Smuzhiyun static int atmel_usba_start(struct usb_gadget *gadget,
1033*4882a593Smuzhiyun 		struct usb_gadget_driver *driver);
1034*4882a593Smuzhiyun static int atmel_usba_stop(struct usb_gadget *gadget);
1035*4882a593Smuzhiyun 
atmel_usba_match_ep(struct usb_gadget * gadget,struct usb_endpoint_descriptor * desc,struct usb_ss_ep_comp_descriptor * ep_comp)1036*4882a593Smuzhiyun static struct usb_ep *atmel_usba_match_ep(struct usb_gadget *gadget,
1037*4882a593Smuzhiyun 				struct usb_endpoint_descriptor	*desc,
1038*4882a593Smuzhiyun 				struct usb_ss_ep_comp_descriptor *ep_comp)
1039*4882a593Smuzhiyun {
1040*4882a593Smuzhiyun 	struct usb_ep	*_ep;
1041*4882a593Smuzhiyun 	struct usba_ep *ep;
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun 	/* Look at endpoints until an unclaimed one looks usable */
1044*4882a593Smuzhiyun 	list_for_each_entry(_ep, &gadget->ep_list, ep_list) {
1045*4882a593Smuzhiyun 		if (usb_gadget_ep_match_desc(gadget, _ep, desc, ep_comp))
1046*4882a593Smuzhiyun 			goto found_ep;
1047*4882a593Smuzhiyun 	}
1048*4882a593Smuzhiyun 	/* Fail */
1049*4882a593Smuzhiyun 	return NULL;
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun found_ep:
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun 	if (fifo_mode == 0) {
1054*4882a593Smuzhiyun 		/* Optimize hw fifo size based on ep type and other info */
1055*4882a593Smuzhiyun 		ep = to_usba_ep(_ep);
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun 		switch (usb_endpoint_type(desc)) {
1058*4882a593Smuzhiyun 		case USB_ENDPOINT_XFER_CONTROL:
1059*4882a593Smuzhiyun 			ep->nr_banks = 1;
1060*4882a593Smuzhiyun 			break;
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun 		case USB_ENDPOINT_XFER_ISOC:
1063*4882a593Smuzhiyun 			ep->fifo_size = 1024;
1064*4882a593Smuzhiyun 			if (ep->udc->ep_prealloc)
1065*4882a593Smuzhiyun 				ep->nr_banks = 2;
1066*4882a593Smuzhiyun 			break;
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun 		case USB_ENDPOINT_XFER_BULK:
1069*4882a593Smuzhiyun 			ep->fifo_size = 512;
1070*4882a593Smuzhiyun 			if (ep->udc->ep_prealloc)
1071*4882a593Smuzhiyun 				ep->nr_banks = 1;
1072*4882a593Smuzhiyun 			break;
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun 		case USB_ENDPOINT_XFER_INT:
1075*4882a593Smuzhiyun 			if (desc->wMaxPacketSize == 0)
1076*4882a593Smuzhiyun 				ep->fifo_size =
1077*4882a593Smuzhiyun 				    roundup_pow_of_two(_ep->maxpacket_limit);
1078*4882a593Smuzhiyun 			else
1079*4882a593Smuzhiyun 				ep->fifo_size =
1080*4882a593Smuzhiyun 				    roundup_pow_of_two(le16_to_cpu(desc->wMaxPacketSize));
1081*4882a593Smuzhiyun 			if (ep->udc->ep_prealloc)
1082*4882a593Smuzhiyun 				ep->nr_banks = 1;
1083*4882a593Smuzhiyun 			break;
1084*4882a593Smuzhiyun 		}
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun 		/* It might be a little bit late to set this */
1087*4882a593Smuzhiyun 		usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 		/* Generate ept_cfg basd on FIFO size and number of banks */
1090*4882a593Smuzhiyun 		if (ep->fifo_size  <= 8)
1091*4882a593Smuzhiyun 			ep->ept_cfg = USBA_BF(EPT_SIZE, USBA_EPT_SIZE_8);
1092*4882a593Smuzhiyun 		else
1093*4882a593Smuzhiyun 			/* LSB is bit 1, not 0 */
1094*4882a593Smuzhiyun 			ep->ept_cfg =
1095*4882a593Smuzhiyun 				USBA_BF(EPT_SIZE, fls(ep->fifo_size - 1) - 3);
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun 		ep->ept_cfg |= USBA_BF(BK_NUMBER, ep->nr_banks);
1098*4882a593Smuzhiyun 	}
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 	return _ep;
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun static const struct usb_gadget_ops usba_udc_ops = {
1104*4882a593Smuzhiyun 	.get_frame		= usba_udc_get_frame,
1105*4882a593Smuzhiyun 	.wakeup			= usba_udc_wakeup,
1106*4882a593Smuzhiyun 	.set_selfpowered	= usba_udc_set_selfpowered,
1107*4882a593Smuzhiyun 	.pullup			= atmel_usba_pullup,
1108*4882a593Smuzhiyun 	.udc_start		= atmel_usba_start,
1109*4882a593Smuzhiyun 	.udc_stop		= atmel_usba_stop,
1110*4882a593Smuzhiyun 	.match_ep		= atmel_usba_match_ep,
1111*4882a593Smuzhiyun };
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun static struct usb_endpoint_descriptor usba_ep0_desc = {
1114*4882a593Smuzhiyun 	.bLength = USB_DT_ENDPOINT_SIZE,
1115*4882a593Smuzhiyun 	.bDescriptorType = USB_DT_ENDPOINT,
1116*4882a593Smuzhiyun 	.bEndpointAddress = 0,
1117*4882a593Smuzhiyun 	.bmAttributes = USB_ENDPOINT_XFER_CONTROL,
1118*4882a593Smuzhiyun 	.wMaxPacketSize = cpu_to_le16(64),
1119*4882a593Smuzhiyun 	/* FIXME: I have no idea what to put here */
1120*4882a593Smuzhiyun 	.bInterval = 1,
1121*4882a593Smuzhiyun };
1122*4882a593Smuzhiyun 
1123*4882a593Smuzhiyun static const struct usb_gadget usba_gadget_template = {
1124*4882a593Smuzhiyun 	.ops		= &usba_udc_ops,
1125*4882a593Smuzhiyun 	.max_speed	= USB_SPEED_HIGH,
1126*4882a593Smuzhiyun 	.name		= "atmel_usba_udc",
1127*4882a593Smuzhiyun };
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun /*
1130*4882a593Smuzhiyun  * Called with interrupts disabled and udc->lock held.
1131*4882a593Smuzhiyun  */
reset_all_endpoints(struct usba_udc * udc)1132*4882a593Smuzhiyun static void reset_all_endpoints(struct usba_udc *udc)
1133*4882a593Smuzhiyun {
1134*4882a593Smuzhiyun 	struct usba_ep *ep;
1135*4882a593Smuzhiyun 	struct usba_request *req, *tmp_req;
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun 	usba_writel(udc, EPT_RST, ~0UL);
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 	ep = to_usba_ep(udc->gadget.ep0);
1140*4882a593Smuzhiyun 	list_for_each_entry_safe(req, tmp_req, &ep->queue, queue) {
1141*4882a593Smuzhiyun 		list_del_init(&req->queue);
1142*4882a593Smuzhiyun 		request_complete(ep, req, -ECONNRESET);
1143*4882a593Smuzhiyun 	}
1144*4882a593Smuzhiyun }
1145*4882a593Smuzhiyun 
get_ep_by_addr(struct usba_udc * udc,u16 wIndex)1146*4882a593Smuzhiyun static struct usba_ep *get_ep_by_addr(struct usba_udc *udc, u16 wIndex)
1147*4882a593Smuzhiyun {
1148*4882a593Smuzhiyun 	struct usba_ep *ep;
1149*4882a593Smuzhiyun 
1150*4882a593Smuzhiyun 	if ((wIndex & USB_ENDPOINT_NUMBER_MASK) == 0)
1151*4882a593Smuzhiyun 		return to_usba_ep(udc->gadget.ep0);
1152*4882a593Smuzhiyun 
1153*4882a593Smuzhiyun 	list_for_each_entry (ep, &udc->gadget.ep_list, ep.ep_list) {
1154*4882a593Smuzhiyun 		u8 bEndpointAddress;
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun 		if (!ep->ep.desc)
1157*4882a593Smuzhiyun 			continue;
1158*4882a593Smuzhiyun 		bEndpointAddress = ep->ep.desc->bEndpointAddress;
1159*4882a593Smuzhiyun 		if ((wIndex ^ bEndpointAddress) & USB_DIR_IN)
1160*4882a593Smuzhiyun 			continue;
1161*4882a593Smuzhiyun 		if ((bEndpointAddress & USB_ENDPOINT_NUMBER_MASK)
1162*4882a593Smuzhiyun 				== (wIndex & USB_ENDPOINT_NUMBER_MASK))
1163*4882a593Smuzhiyun 			return ep;
1164*4882a593Smuzhiyun 	}
1165*4882a593Smuzhiyun 
1166*4882a593Smuzhiyun 	return NULL;
1167*4882a593Smuzhiyun }
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun /* Called with interrupts disabled and udc->lock held */
set_protocol_stall(struct usba_udc * udc,struct usba_ep * ep)1170*4882a593Smuzhiyun static inline void set_protocol_stall(struct usba_udc *udc, struct usba_ep *ep)
1171*4882a593Smuzhiyun {
1172*4882a593Smuzhiyun 	usba_ep_writel(ep, SET_STA, USBA_FORCE_STALL);
1173*4882a593Smuzhiyun 	ep->state = WAIT_FOR_SETUP;
1174*4882a593Smuzhiyun }
1175*4882a593Smuzhiyun 
is_stalled(struct usba_udc * udc,struct usba_ep * ep)1176*4882a593Smuzhiyun static inline int is_stalled(struct usba_udc *udc, struct usba_ep *ep)
1177*4882a593Smuzhiyun {
1178*4882a593Smuzhiyun 	if (usba_ep_readl(ep, STA) & USBA_FORCE_STALL)
1179*4882a593Smuzhiyun 		return 1;
1180*4882a593Smuzhiyun 	return 0;
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun 
set_address(struct usba_udc * udc,unsigned int addr)1183*4882a593Smuzhiyun static inline void set_address(struct usba_udc *udc, unsigned int addr)
1184*4882a593Smuzhiyun {
1185*4882a593Smuzhiyun 	u32 regval;
1186*4882a593Smuzhiyun 
1187*4882a593Smuzhiyun 	DBG(DBG_BUS, "setting address %u...\n", addr);
1188*4882a593Smuzhiyun 	regval = usba_readl(udc, CTRL);
1189*4882a593Smuzhiyun 	regval = USBA_BFINS(DEV_ADDR, addr, regval);
1190*4882a593Smuzhiyun 	usba_writel(udc, CTRL, regval);
1191*4882a593Smuzhiyun }
1192*4882a593Smuzhiyun 
do_test_mode(struct usba_udc * udc)1193*4882a593Smuzhiyun static int do_test_mode(struct usba_udc *udc)
1194*4882a593Smuzhiyun {
1195*4882a593Smuzhiyun 	static const char test_packet_buffer[] = {
1196*4882a593Smuzhiyun 		/* JKJKJKJK * 9 */
1197*4882a593Smuzhiyun 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198*4882a593Smuzhiyun 		/* JJKKJJKK * 8 */
1199*4882a593Smuzhiyun 		0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1200*4882a593Smuzhiyun 		/* JJKKJJKK * 8 */
1201*4882a593Smuzhiyun 		0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
1202*4882a593Smuzhiyun 		/* JJJJJJJKKKKKKK * 8 */
1203*4882a593Smuzhiyun 		0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1204*4882a593Smuzhiyun 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1205*4882a593Smuzhiyun 		/* JJJJJJJK * 8 */
1206*4882a593Smuzhiyun 		0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD,
1207*4882a593Smuzhiyun 		/* {JKKKKKKK * 10}, JK */
1208*4882a593Smuzhiyun 		0xFC, 0x7E, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0x7E
1209*4882a593Smuzhiyun 	};
1210*4882a593Smuzhiyun 	struct usba_ep *ep;
1211*4882a593Smuzhiyun 	struct device *dev = &udc->pdev->dev;
1212*4882a593Smuzhiyun 	int test_mode;
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun 	test_mode = udc->test_mode;
1215*4882a593Smuzhiyun 
1216*4882a593Smuzhiyun 	/* Start from a clean slate */
1217*4882a593Smuzhiyun 	reset_all_endpoints(udc);
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	switch (test_mode) {
1220*4882a593Smuzhiyun 	case 0x0100:
1221*4882a593Smuzhiyun 		/* Test_J */
1222*4882a593Smuzhiyun 		usba_writel(udc, TST, USBA_TST_J_MODE);
1223*4882a593Smuzhiyun 		dev_info(dev, "Entering Test_J mode...\n");
1224*4882a593Smuzhiyun 		break;
1225*4882a593Smuzhiyun 	case 0x0200:
1226*4882a593Smuzhiyun 		/* Test_K */
1227*4882a593Smuzhiyun 		usba_writel(udc, TST, USBA_TST_K_MODE);
1228*4882a593Smuzhiyun 		dev_info(dev, "Entering Test_K mode...\n");
1229*4882a593Smuzhiyun 		break;
1230*4882a593Smuzhiyun 	case 0x0300:
1231*4882a593Smuzhiyun 		/*
1232*4882a593Smuzhiyun 		 * Test_SE0_NAK: Force high-speed mode and set up ep0
1233*4882a593Smuzhiyun 		 * for Bulk IN transfers
1234*4882a593Smuzhiyun 		 */
1235*4882a593Smuzhiyun 		ep = &udc->usba_ep[0];
1236*4882a593Smuzhiyun 		usba_writel(udc, TST,
1237*4882a593Smuzhiyun 				USBA_BF(SPEED_CFG, USBA_SPEED_CFG_FORCE_HIGH));
1238*4882a593Smuzhiyun 		usba_ep_writel(ep, CFG,
1239*4882a593Smuzhiyun 				USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64)
1240*4882a593Smuzhiyun 				| USBA_EPT_DIR_IN
1241*4882a593Smuzhiyun 				| USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK)
1242*4882a593Smuzhiyun 				| USBA_BF(BK_NUMBER, 1));
1243*4882a593Smuzhiyun 		if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED)) {
1244*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1245*4882a593Smuzhiyun 			dev_err(dev, "Test_SE0_NAK: ep0 not mapped\n");
1246*4882a593Smuzhiyun 		} else {
1247*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
1248*4882a593Smuzhiyun 			dev_info(dev, "Entering Test_SE0_NAK mode...\n");
1249*4882a593Smuzhiyun 		}
1250*4882a593Smuzhiyun 		break;
1251*4882a593Smuzhiyun 	case 0x0400:
1252*4882a593Smuzhiyun 		/* Test_Packet */
1253*4882a593Smuzhiyun 		ep = &udc->usba_ep[0];
1254*4882a593Smuzhiyun 		usba_ep_writel(ep, CFG,
1255*4882a593Smuzhiyun 				USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64)
1256*4882a593Smuzhiyun 				| USBA_EPT_DIR_IN
1257*4882a593Smuzhiyun 				| USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK)
1258*4882a593Smuzhiyun 				| USBA_BF(BK_NUMBER, 1));
1259*4882a593Smuzhiyun 		if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED)) {
1260*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1261*4882a593Smuzhiyun 			dev_err(dev, "Test_Packet: ep0 not mapped\n");
1262*4882a593Smuzhiyun 		} else {
1263*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
1264*4882a593Smuzhiyun 			usba_writel(udc, TST, USBA_TST_PKT_MODE);
1265*4882a593Smuzhiyun 			memcpy_toio(ep->fifo, test_packet_buffer,
1266*4882a593Smuzhiyun 					sizeof(test_packet_buffer));
1267*4882a593Smuzhiyun 			usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
1268*4882a593Smuzhiyun 			dev_info(dev, "Entering Test_Packet mode...\n");
1269*4882a593Smuzhiyun 		}
1270*4882a593Smuzhiyun 		break;
1271*4882a593Smuzhiyun 	default:
1272*4882a593Smuzhiyun 		dev_err(dev, "Invalid test mode: 0x%04x\n", test_mode);
1273*4882a593Smuzhiyun 		return -EINVAL;
1274*4882a593Smuzhiyun 	}
1275*4882a593Smuzhiyun 
1276*4882a593Smuzhiyun 	return 0;
1277*4882a593Smuzhiyun }
1278*4882a593Smuzhiyun 
1279*4882a593Smuzhiyun /* Avoid overly long expressions */
feature_is_dev_remote_wakeup(struct usb_ctrlrequest * crq)1280*4882a593Smuzhiyun static inline bool feature_is_dev_remote_wakeup(struct usb_ctrlrequest *crq)
1281*4882a593Smuzhiyun {
1282*4882a593Smuzhiyun 	if (crq->wValue == cpu_to_le16(USB_DEVICE_REMOTE_WAKEUP))
1283*4882a593Smuzhiyun 		return true;
1284*4882a593Smuzhiyun 	return false;
1285*4882a593Smuzhiyun }
1286*4882a593Smuzhiyun 
feature_is_dev_test_mode(struct usb_ctrlrequest * crq)1287*4882a593Smuzhiyun static inline bool feature_is_dev_test_mode(struct usb_ctrlrequest *crq)
1288*4882a593Smuzhiyun {
1289*4882a593Smuzhiyun 	if (crq->wValue == cpu_to_le16(USB_DEVICE_TEST_MODE))
1290*4882a593Smuzhiyun 		return true;
1291*4882a593Smuzhiyun 	return false;
1292*4882a593Smuzhiyun }
1293*4882a593Smuzhiyun 
feature_is_ep_halt(struct usb_ctrlrequest * crq)1294*4882a593Smuzhiyun static inline bool feature_is_ep_halt(struct usb_ctrlrequest *crq)
1295*4882a593Smuzhiyun {
1296*4882a593Smuzhiyun 	if (crq->wValue == cpu_to_le16(USB_ENDPOINT_HALT))
1297*4882a593Smuzhiyun 		return true;
1298*4882a593Smuzhiyun 	return false;
1299*4882a593Smuzhiyun }
1300*4882a593Smuzhiyun 
handle_ep0_setup(struct usba_udc * udc,struct usba_ep * ep,struct usb_ctrlrequest * crq)1301*4882a593Smuzhiyun static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep,
1302*4882a593Smuzhiyun 		struct usb_ctrlrequest *crq)
1303*4882a593Smuzhiyun {
1304*4882a593Smuzhiyun 	int retval = 0;
1305*4882a593Smuzhiyun 
1306*4882a593Smuzhiyun 	switch (crq->bRequest) {
1307*4882a593Smuzhiyun 	case USB_REQ_GET_STATUS: {
1308*4882a593Smuzhiyun 		u16 status;
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun 		if (crq->bRequestType == (USB_DIR_IN | USB_RECIP_DEVICE)) {
1311*4882a593Smuzhiyun 			status = cpu_to_le16(udc->devstatus);
1312*4882a593Smuzhiyun 		} else if (crq->bRequestType
1313*4882a593Smuzhiyun 				== (USB_DIR_IN | USB_RECIP_INTERFACE)) {
1314*4882a593Smuzhiyun 			status = cpu_to_le16(0);
1315*4882a593Smuzhiyun 		} else if (crq->bRequestType
1316*4882a593Smuzhiyun 				== (USB_DIR_IN | USB_RECIP_ENDPOINT)) {
1317*4882a593Smuzhiyun 			struct usba_ep *target;
1318*4882a593Smuzhiyun 
1319*4882a593Smuzhiyun 			target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1320*4882a593Smuzhiyun 			if (!target)
1321*4882a593Smuzhiyun 				goto stall;
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun 			status = 0;
1324*4882a593Smuzhiyun 			if (is_stalled(udc, target))
1325*4882a593Smuzhiyun 				status |= cpu_to_le16(1);
1326*4882a593Smuzhiyun 		} else
1327*4882a593Smuzhiyun 			goto delegate;
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 		/* Write directly to the FIFO. No queueing is done. */
1330*4882a593Smuzhiyun 		if (crq->wLength != cpu_to_le16(sizeof(status)))
1331*4882a593Smuzhiyun 			goto stall;
1332*4882a593Smuzhiyun 		ep->state = DATA_STAGE_IN;
1333*4882a593Smuzhiyun 		writew_relaxed(status, ep->fifo);
1334*4882a593Smuzhiyun 		usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
1335*4882a593Smuzhiyun 		break;
1336*4882a593Smuzhiyun 	}
1337*4882a593Smuzhiyun 
1338*4882a593Smuzhiyun 	case USB_REQ_CLEAR_FEATURE: {
1339*4882a593Smuzhiyun 		if (crq->bRequestType == USB_RECIP_DEVICE) {
1340*4882a593Smuzhiyun 			if (feature_is_dev_remote_wakeup(crq))
1341*4882a593Smuzhiyun 				udc->devstatus
1342*4882a593Smuzhiyun 					&= ~(1 << USB_DEVICE_REMOTE_WAKEUP);
1343*4882a593Smuzhiyun 			else
1344*4882a593Smuzhiyun 				/* Can't CLEAR_FEATURE TEST_MODE */
1345*4882a593Smuzhiyun 				goto stall;
1346*4882a593Smuzhiyun 		} else if (crq->bRequestType == USB_RECIP_ENDPOINT) {
1347*4882a593Smuzhiyun 			struct usba_ep *target;
1348*4882a593Smuzhiyun 
1349*4882a593Smuzhiyun 			if (crq->wLength != cpu_to_le16(0)
1350*4882a593Smuzhiyun 					|| !feature_is_ep_halt(crq))
1351*4882a593Smuzhiyun 				goto stall;
1352*4882a593Smuzhiyun 			target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1353*4882a593Smuzhiyun 			if (!target)
1354*4882a593Smuzhiyun 				goto stall;
1355*4882a593Smuzhiyun 
1356*4882a593Smuzhiyun 			usba_ep_writel(target, CLR_STA, USBA_FORCE_STALL);
1357*4882a593Smuzhiyun 			if (target->index != 0)
1358*4882a593Smuzhiyun 				usba_ep_writel(target, CLR_STA,
1359*4882a593Smuzhiyun 						USBA_TOGGLE_CLR);
1360*4882a593Smuzhiyun 		} else {
1361*4882a593Smuzhiyun 			goto delegate;
1362*4882a593Smuzhiyun 		}
1363*4882a593Smuzhiyun 
1364*4882a593Smuzhiyun 		send_status(udc, ep);
1365*4882a593Smuzhiyun 		break;
1366*4882a593Smuzhiyun 	}
1367*4882a593Smuzhiyun 
1368*4882a593Smuzhiyun 	case USB_REQ_SET_FEATURE: {
1369*4882a593Smuzhiyun 		if (crq->bRequestType == USB_RECIP_DEVICE) {
1370*4882a593Smuzhiyun 			if (feature_is_dev_test_mode(crq)) {
1371*4882a593Smuzhiyun 				send_status(udc, ep);
1372*4882a593Smuzhiyun 				ep->state = STATUS_STAGE_TEST;
1373*4882a593Smuzhiyun 				udc->test_mode = le16_to_cpu(crq->wIndex);
1374*4882a593Smuzhiyun 				return 0;
1375*4882a593Smuzhiyun 			} else if (feature_is_dev_remote_wakeup(crq)) {
1376*4882a593Smuzhiyun 				udc->devstatus |= 1 << USB_DEVICE_REMOTE_WAKEUP;
1377*4882a593Smuzhiyun 			} else {
1378*4882a593Smuzhiyun 				goto stall;
1379*4882a593Smuzhiyun 			}
1380*4882a593Smuzhiyun 		} else if (crq->bRequestType == USB_RECIP_ENDPOINT) {
1381*4882a593Smuzhiyun 			struct usba_ep *target;
1382*4882a593Smuzhiyun 
1383*4882a593Smuzhiyun 			if (crq->wLength != cpu_to_le16(0)
1384*4882a593Smuzhiyun 					|| !feature_is_ep_halt(crq))
1385*4882a593Smuzhiyun 				goto stall;
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun 			target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1388*4882a593Smuzhiyun 			if (!target)
1389*4882a593Smuzhiyun 				goto stall;
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun 			usba_ep_writel(target, SET_STA, USBA_FORCE_STALL);
1392*4882a593Smuzhiyun 		} else
1393*4882a593Smuzhiyun 			goto delegate;
1394*4882a593Smuzhiyun 
1395*4882a593Smuzhiyun 		send_status(udc, ep);
1396*4882a593Smuzhiyun 		break;
1397*4882a593Smuzhiyun 	}
1398*4882a593Smuzhiyun 
1399*4882a593Smuzhiyun 	case USB_REQ_SET_ADDRESS:
1400*4882a593Smuzhiyun 		if (crq->bRequestType != (USB_DIR_OUT | USB_RECIP_DEVICE))
1401*4882a593Smuzhiyun 			goto delegate;
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 		set_address(udc, le16_to_cpu(crq->wValue));
1404*4882a593Smuzhiyun 		send_status(udc, ep);
1405*4882a593Smuzhiyun 		ep->state = STATUS_STAGE_ADDR;
1406*4882a593Smuzhiyun 		break;
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun 	default:
1409*4882a593Smuzhiyun delegate:
1410*4882a593Smuzhiyun 		spin_unlock(&udc->lock);
1411*4882a593Smuzhiyun 		retval = udc->driver->setup(&udc->gadget, crq);
1412*4882a593Smuzhiyun 		spin_lock(&udc->lock);
1413*4882a593Smuzhiyun 	}
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun 	return retval;
1416*4882a593Smuzhiyun 
1417*4882a593Smuzhiyun stall:
1418*4882a593Smuzhiyun 	pr_err("udc: %s: Invalid setup request: %02x.%02x v%04x i%04x l%d, "
1419*4882a593Smuzhiyun 		"halting endpoint...\n",
1420*4882a593Smuzhiyun 		ep->ep.name, crq->bRequestType, crq->bRequest,
1421*4882a593Smuzhiyun 		le16_to_cpu(crq->wValue), le16_to_cpu(crq->wIndex),
1422*4882a593Smuzhiyun 		le16_to_cpu(crq->wLength));
1423*4882a593Smuzhiyun 	set_protocol_stall(udc, ep);
1424*4882a593Smuzhiyun 	return -1;
1425*4882a593Smuzhiyun }
1426*4882a593Smuzhiyun 
usba_control_irq(struct usba_udc * udc,struct usba_ep * ep)1427*4882a593Smuzhiyun static void usba_control_irq(struct usba_udc *udc, struct usba_ep *ep)
1428*4882a593Smuzhiyun {
1429*4882a593Smuzhiyun 	struct usba_request *req;
1430*4882a593Smuzhiyun 	u32 epstatus;
1431*4882a593Smuzhiyun 	u32 epctrl;
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun restart:
1434*4882a593Smuzhiyun 	epstatus = usba_ep_readl(ep, STA);
1435*4882a593Smuzhiyun 	epctrl = usba_ep_readl(ep, CTL);
1436*4882a593Smuzhiyun 
1437*4882a593Smuzhiyun 	DBG(DBG_INT, "%s [%d]: s/%08x c/%08x\n",
1438*4882a593Smuzhiyun 			ep->ep.name, ep->state, epstatus, epctrl);
1439*4882a593Smuzhiyun 
1440*4882a593Smuzhiyun 	req = NULL;
1441*4882a593Smuzhiyun 	if (!list_empty(&ep->queue))
1442*4882a593Smuzhiyun 		req = list_entry(ep->queue.next,
1443*4882a593Smuzhiyun 				 struct usba_request, queue);
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun 	if ((epctrl & USBA_TX_PK_RDY) && !(epstatus & USBA_TX_PK_RDY)) {
1446*4882a593Smuzhiyun 		if (req->submitted)
1447*4882a593Smuzhiyun 			next_fifo_transaction(ep, req);
1448*4882a593Smuzhiyun 		else
1449*4882a593Smuzhiyun 			submit_request(ep, req);
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun 		if (req->last_transaction) {
1452*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
1453*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
1454*4882a593Smuzhiyun 		}
1455*4882a593Smuzhiyun 		goto restart;
1456*4882a593Smuzhiyun 	}
1457*4882a593Smuzhiyun 	if ((epstatus & epctrl) & USBA_TX_COMPLETE) {
1458*4882a593Smuzhiyun 		usba_ep_writel(ep, CLR_STA, USBA_TX_COMPLETE);
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun 		switch (ep->state) {
1461*4882a593Smuzhiyun 		case DATA_STAGE_IN:
1462*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_ENB, USBA_RX_BK_RDY);
1463*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1464*4882a593Smuzhiyun 			ep->state = STATUS_STAGE_OUT;
1465*4882a593Smuzhiyun 			break;
1466*4882a593Smuzhiyun 		case STATUS_STAGE_ADDR:
1467*4882a593Smuzhiyun 			/* Activate our new address */
1468*4882a593Smuzhiyun 			usba_writel(udc, CTRL, (usba_readl(udc, CTRL)
1469*4882a593Smuzhiyun 						| USBA_FADDR_EN));
1470*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1471*4882a593Smuzhiyun 			ep->state = WAIT_FOR_SETUP;
1472*4882a593Smuzhiyun 			break;
1473*4882a593Smuzhiyun 		case STATUS_STAGE_IN:
1474*4882a593Smuzhiyun 			if (req) {
1475*4882a593Smuzhiyun 				list_del_init(&req->queue);
1476*4882a593Smuzhiyun 				request_complete(ep, req, 0);
1477*4882a593Smuzhiyun 				submit_next_request(ep);
1478*4882a593Smuzhiyun 			}
1479*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1480*4882a593Smuzhiyun 			ep->state = WAIT_FOR_SETUP;
1481*4882a593Smuzhiyun 			break;
1482*4882a593Smuzhiyun 		case STATUS_STAGE_TEST:
1483*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1484*4882a593Smuzhiyun 			ep->state = WAIT_FOR_SETUP;
1485*4882a593Smuzhiyun 			if (do_test_mode(udc))
1486*4882a593Smuzhiyun 				set_protocol_stall(udc, ep);
1487*4882a593Smuzhiyun 			break;
1488*4882a593Smuzhiyun 		default:
1489*4882a593Smuzhiyun 			pr_err("udc: %s: TXCOMP: Invalid endpoint state %d, "
1490*4882a593Smuzhiyun 				"halting endpoint...\n",
1491*4882a593Smuzhiyun 				ep->ep.name, ep->state);
1492*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1493*4882a593Smuzhiyun 			break;
1494*4882a593Smuzhiyun 		}
1495*4882a593Smuzhiyun 
1496*4882a593Smuzhiyun 		goto restart;
1497*4882a593Smuzhiyun 	}
1498*4882a593Smuzhiyun 	if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
1499*4882a593Smuzhiyun 		switch (ep->state) {
1500*4882a593Smuzhiyun 		case STATUS_STAGE_OUT:
1501*4882a593Smuzhiyun 			usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
1502*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
1503*4882a593Smuzhiyun 
1504*4882a593Smuzhiyun 			if (req) {
1505*4882a593Smuzhiyun 				list_del_init(&req->queue);
1506*4882a593Smuzhiyun 				request_complete(ep, req, 0);
1507*4882a593Smuzhiyun 			}
1508*4882a593Smuzhiyun 			ep->state = WAIT_FOR_SETUP;
1509*4882a593Smuzhiyun 			break;
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun 		case DATA_STAGE_OUT:
1512*4882a593Smuzhiyun 			receive_data(ep);
1513*4882a593Smuzhiyun 			break;
1514*4882a593Smuzhiyun 
1515*4882a593Smuzhiyun 		default:
1516*4882a593Smuzhiyun 			usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
1517*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
1518*4882a593Smuzhiyun 			pr_err("udc: %s: RXRDY: Invalid endpoint state %d, "
1519*4882a593Smuzhiyun 				"halting endpoint...\n",
1520*4882a593Smuzhiyun 				ep->ep.name, ep->state);
1521*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1522*4882a593Smuzhiyun 			break;
1523*4882a593Smuzhiyun 		}
1524*4882a593Smuzhiyun 
1525*4882a593Smuzhiyun 		goto restart;
1526*4882a593Smuzhiyun 	}
1527*4882a593Smuzhiyun 	if (epstatus & USBA_RX_SETUP) {
1528*4882a593Smuzhiyun 		union {
1529*4882a593Smuzhiyun 			struct usb_ctrlrequest crq;
1530*4882a593Smuzhiyun 			unsigned long data[2];
1531*4882a593Smuzhiyun 		} crq;
1532*4882a593Smuzhiyun 		unsigned int pkt_len;
1533*4882a593Smuzhiyun 		int ret;
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun 		if (ep->state != WAIT_FOR_SETUP) {
1536*4882a593Smuzhiyun 			/*
1537*4882a593Smuzhiyun 			 * Didn't expect a SETUP packet at this
1538*4882a593Smuzhiyun 			 * point. Clean up any pending requests (which
1539*4882a593Smuzhiyun 			 * may be successful).
1540*4882a593Smuzhiyun 			 */
1541*4882a593Smuzhiyun 			int status = -EPROTO;
1542*4882a593Smuzhiyun 
1543*4882a593Smuzhiyun 			/*
1544*4882a593Smuzhiyun 			 * RXRDY and TXCOMP are dropped when SETUP
1545*4882a593Smuzhiyun 			 * packets arrive.  Just pretend we received
1546*4882a593Smuzhiyun 			 * the status packet.
1547*4882a593Smuzhiyun 			 */
1548*4882a593Smuzhiyun 			if (ep->state == STATUS_STAGE_OUT
1549*4882a593Smuzhiyun 					|| ep->state == STATUS_STAGE_IN) {
1550*4882a593Smuzhiyun 				usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
1551*4882a593Smuzhiyun 				status = 0;
1552*4882a593Smuzhiyun 			}
1553*4882a593Smuzhiyun 
1554*4882a593Smuzhiyun 			if (req) {
1555*4882a593Smuzhiyun 				list_del_init(&req->queue);
1556*4882a593Smuzhiyun 				request_complete(ep, req, status);
1557*4882a593Smuzhiyun 			}
1558*4882a593Smuzhiyun 		}
1559*4882a593Smuzhiyun 
1560*4882a593Smuzhiyun 		pkt_len = USBA_BFEXT(BYTE_COUNT, usba_ep_readl(ep, STA));
1561*4882a593Smuzhiyun 		DBG(DBG_HW, "Packet length: %u\n", pkt_len);
1562*4882a593Smuzhiyun 		if (pkt_len != sizeof(crq)) {
1563*4882a593Smuzhiyun 			pr_warn("udc: Invalid packet length %u (expected %zu)\n",
1564*4882a593Smuzhiyun 				pkt_len, sizeof(crq));
1565*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1566*4882a593Smuzhiyun 			return;
1567*4882a593Smuzhiyun 		}
1568*4882a593Smuzhiyun 
1569*4882a593Smuzhiyun 		DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo);
1570*4882a593Smuzhiyun 		memcpy_fromio(crq.data, ep->fifo, sizeof(crq));
1571*4882a593Smuzhiyun 
1572*4882a593Smuzhiyun 		/* Free up one bank in the FIFO so that we can
1573*4882a593Smuzhiyun 		 * generate or receive a reply right away. */
1574*4882a593Smuzhiyun 		usba_ep_writel(ep, CLR_STA, USBA_RX_SETUP);
1575*4882a593Smuzhiyun 
1576*4882a593Smuzhiyun 		/* printk(KERN_DEBUG "setup: %d: %02x.%02x\n",
1577*4882a593Smuzhiyun 			ep->state, crq.crq.bRequestType,
1578*4882a593Smuzhiyun 			crq.crq.bRequest); */
1579*4882a593Smuzhiyun 
1580*4882a593Smuzhiyun 		if (crq.crq.bRequestType & USB_DIR_IN) {
1581*4882a593Smuzhiyun 			/*
1582*4882a593Smuzhiyun 			 * The USB 2.0 spec states that "if wLength is
1583*4882a593Smuzhiyun 			 * zero, there is no data transfer phase."
1584*4882a593Smuzhiyun 			 * However, testusb #14 seems to actually
1585*4882a593Smuzhiyun 			 * expect a data phase even if wLength = 0...
1586*4882a593Smuzhiyun 			 */
1587*4882a593Smuzhiyun 			ep->state = DATA_STAGE_IN;
1588*4882a593Smuzhiyun 		} else {
1589*4882a593Smuzhiyun 			if (crq.crq.wLength != cpu_to_le16(0))
1590*4882a593Smuzhiyun 				ep->state = DATA_STAGE_OUT;
1591*4882a593Smuzhiyun 			else
1592*4882a593Smuzhiyun 				ep->state = STATUS_STAGE_IN;
1593*4882a593Smuzhiyun 		}
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun 		ret = -1;
1596*4882a593Smuzhiyun 		if (ep->index == 0)
1597*4882a593Smuzhiyun 			ret = handle_ep0_setup(udc, ep, &crq.crq);
1598*4882a593Smuzhiyun 		else {
1599*4882a593Smuzhiyun 			spin_unlock(&udc->lock);
1600*4882a593Smuzhiyun 			ret = udc->driver->setup(&udc->gadget, &crq.crq);
1601*4882a593Smuzhiyun 			spin_lock(&udc->lock);
1602*4882a593Smuzhiyun 		}
1603*4882a593Smuzhiyun 
1604*4882a593Smuzhiyun 		DBG(DBG_BUS, "req %02x.%02x, length %d, state %d, ret %d\n",
1605*4882a593Smuzhiyun 			crq.crq.bRequestType, crq.crq.bRequest,
1606*4882a593Smuzhiyun 			le16_to_cpu(crq.crq.wLength), ep->state, ret);
1607*4882a593Smuzhiyun 
1608*4882a593Smuzhiyun 		if (ret < 0) {
1609*4882a593Smuzhiyun 			/* Let the host know that we failed */
1610*4882a593Smuzhiyun 			set_protocol_stall(udc, ep);
1611*4882a593Smuzhiyun 		}
1612*4882a593Smuzhiyun 	}
1613*4882a593Smuzhiyun }
1614*4882a593Smuzhiyun 
usba_ep_irq(struct usba_udc * udc,struct usba_ep * ep)1615*4882a593Smuzhiyun static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep)
1616*4882a593Smuzhiyun {
1617*4882a593Smuzhiyun 	struct usba_request *req;
1618*4882a593Smuzhiyun 	u32 epstatus;
1619*4882a593Smuzhiyun 	u32 epctrl;
1620*4882a593Smuzhiyun 
1621*4882a593Smuzhiyun 	epstatus = usba_ep_readl(ep, STA);
1622*4882a593Smuzhiyun 	epctrl = usba_ep_readl(ep, CTL);
1623*4882a593Smuzhiyun 
1624*4882a593Smuzhiyun 	DBG(DBG_INT, "%s: interrupt, status: 0x%08x\n", ep->ep.name, epstatus);
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun 	while ((epctrl & USBA_TX_PK_RDY) && !(epstatus & USBA_TX_PK_RDY)) {
1627*4882a593Smuzhiyun 		DBG(DBG_BUS, "%s: TX PK ready\n", ep->ep.name);
1628*4882a593Smuzhiyun 
1629*4882a593Smuzhiyun 		if (list_empty(&ep->queue)) {
1630*4882a593Smuzhiyun 			dev_warn(&udc->pdev->dev, "ep_irq: queue empty\n");
1631*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
1632*4882a593Smuzhiyun 			return;
1633*4882a593Smuzhiyun 		}
1634*4882a593Smuzhiyun 
1635*4882a593Smuzhiyun 		req = list_entry(ep->queue.next, struct usba_request, queue);
1636*4882a593Smuzhiyun 
1637*4882a593Smuzhiyun 		if (req->using_dma) {
1638*4882a593Smuzhiyun 			/* Send a zero-length packet */
1639*4882a593Smuzhiyun 			usba_ep_writel(ep, SET_STA,
1640*4882a593Smuzhiyun 					USBA_TX_PK_RDY);
1641*4882a593Smuzhiyun 			usba_ep_writel(ep, CTL_DIS,
1642*4882a593Smuzhiyun 					USBA_TX_PK_RDY);
1643*4882a593Smuzhiyun 			list_del_init(&req->queue);
1644*4882a593Smuzhiyun 			submit_next_request(ep);
1645*4882a593Smuzhiyun 			request_complete(ep, req, 0);
1646*4882a593Smuzhiyun 		} else {
1647*4882a593Smuzhiyun 			if (req->submitted)
1648*4882a593Smuzhiyun 				next_fifo_transaction(ep, req);
1649*4882a593Smuzhiyun 			else
1650*4882a593Smuzhiyun 				submit_request(ep, req);
1651*4882a593Smuzhiyun 
1652*4882a593Smuzhiyun 			if (req->last_transaction) {
1653*4882a593Smuzhiyun 				list_del_init(&req->queue);
1654*4882a593Smuzhiyun 				submit_next_request(ep);
1655*4882a593Smuzhiyun 				request_complete(ep, req, 0);
1656*4882a593Smuzhiyun 			}
1657*4882a593Smuzhiyun 		}
1658*4882a593Smuzhiyun 
1659*4882a593Smuzhiyun 		epstatus = usba_ep_readl(ep, STA);
1660*4882a593Smuzhiyun 		epctrl = usba_ep_readl(ep, CTL);
1661*4882a593Smuzhiyun 	}
1662*4882a593Smuzhiyun 	if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
1663*4882a593Smuzhiyun 		DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name);
1664*4882a593Smuzhiyun 		receive_data(ep);
1665*4882a593Smuzhiyun 	}
1666*4882a593Smuzhiyun }
1667*4882a593Smuzhiyun 
usba_dma_irq(struct usba_udc * udc,struct usba_ep * ep)1668*4882a593Smuzhiyun static void usba_dma_irq(struct usba_udc *udc, struct usba_ep *ep)
1669*4882a593Smuzhiyun {
1670*4882a593Smuzhiyun 	struct usba_request *req;
1671*4882a593Smuzhiyun 	u32 status, control, pending;
1672*4882a593Smuzhiyun 
1673*4882a593Smuzhiyun 	status = usba_dma_readl(ep, STATUS);
1674*4882a593Smuzhiyun 	control = usba_dma_readl(ep, CONTROL);
1675*4882a593Smuzhiyun #ifdef CONFIG_USB_GADGET_DEBUG_FS
1676*4882a593Smuzhiyun 	ep->last_dma_status = status;
1677*4882a593Smuzhiyun #endif
1678*4882a593Smuzhiyun 	pending = status & control;
1679*4882a593Smuzhiyun 	DBG(DBG_INT | DBG_DMA, "dma irq, s/%#08x, c/%#08x\n", status, control);
1680*4882a593Smuzhiyun 
1681*4882a593Smuzhiyun 	if (status & USBA_DMA_CH_EN) {
1682*4882a593Smuzhiyun 		dev_err(&udc->pdev->dev,
1683*4882a593Smuzhiyun 			"DMA_CH_EN is set after transfer is finished!\n");
1684*4882a593Smuzhiyun 		dev_err(&udc->pdev->dev,
1685*4882a593Smuzhiyun 			"status=%#08x, pending=%#08x, control=%#08x\n",
1686*4882a593Smuzhiyun 			status, pending, control);
1687*4882a593Smuzhiyun 
1688*4882a593Smuzhiyun 		/*
1689*4882a593Smuzhiyun 		 * try to pretend nothing happened. We might have to
1690*4882a593Smuzhiyun 		 * do something here...
1691*4882a593Smuzhiyun 		 */
1692*4882a593Smuzhiyun 	}
1693*4882a593Smuzhiyun 
1694*4882a593Smuzhiyun 	if (list_empty(&ep->queue))
1695*4882a593Smuzhiyun 		/* Might happen if a reset comes along at the right moment */
1696*4882a593Smuzhiyun 		return;
1697*4882a593Smuzhiyun 
1698*4882a593Smuzhiyun 	if (pending & (USBA_DMA_END_TR_ST | USBA_DMA_END_BUF_ST)) {
1699*4882a593Smuzhiyun 		req = list_entry(ep->queue.next, struct usba_request, queue);
1700*4882a593Smuzhiyun 		usba_update_req(ep, req, status);
1701*4882a593Smuzhiyun 
1702*4882a593Smuzhiyun 		list_del_init(&req->queue);
1703*4882a593Smuzhiyun 		submit_next_request(ep);
1704*4882a593Smuzhiyun 		request_complete(ep, req, 0);
1705*4882a593Smuzhiyun 	}
1706*4882a593Smuzhiyun }
1707*4882a593Smuzhiyun 
1708*4882a593Smuzhiyun static int start_clock(struct usba_udc *udc);
1709*4882a593Smuzhiyun static void stop_clock(struct usba_udc *udc);
1710*4882a593Smuzhiyun 
usba_udc_irq(int irq,void * devid)1711*4882a593Smuzhiyun static irqreturn_t usba_udc_irq(int irq, void *devid)
1712*4882a593Smuzhiyun {
1713*4882a593Smuzhiyun 	struct usba_udc *udc = devid;
1714*4882a593Smuzhiyun 	u32 status, int_enb;
1715*4882a593Smuzhiyun 	u32 dma_status;
1716*4882a593Smuzhiyun 	u32 ep_status;
1717*4882a593Smuzhiyun 
1718*4882a593Smuzhiyun 	spin_lock(&udc->lock);
1719*4882a593Smuzhiyun 
1720*4882a593Smuzhiyun 	int_enb = usba_int_enb_get(udc);
1721*4882a593Smuzhiyun 	status = usba_readl(udc, INT_STA) & (int_enb | USBA_HIGH_SPEED);
1722*4882a593Smuzhiyun 	DBG(DBG_INT, "irq, status=%#08x\n", status);
1723*4882a593Smuzhiyun 
1724*4882a593Smuzhiyun 	if (status & USBA_DET_SUSPEND) {
1725*4882a593Smuzhiyun 		usba_writel(udc, INT_CLR, USBA_DET_SUSPEND|USBA_WAKE_UP);
1726*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_WAKE_UP);
1727*4882a593Smuzhiyun 		usba_int_enb_clear(udc, USBA_DET_SUSPEND);
1728*4882a593Smuzhiyun 		udc->suspended = true;
1729*4882a593Smuzhiyun 		toggle_bias(udc, 0);
1730*4882a593Smuzhiyun 		udc->bias_pulse_needed = true;
1731*4882a593Smuzhiyun 		stop_clock(udc);
1732*4882a593Smuzhiyun 		DBG(DBG_BUS, "Suspend detected\n");
1733*4882a593Smuzhiyun 		if (udc->gadget.speed != USB_SPEED_UNKNOWN
1734*4882a593Smuzhiyun 				&& udc->driver && udc->driver->suspend) {
1735*4882a593Smuzhiyun 			spin_unlock(&udc->lock);
1736*4882a593Smuzhiyun 			udc->driver->suspend(&udc->gadget);
1737*4882a593Smuzhiyun 			spin_lock(&udc->lock);
1738*4882a593Smuzhiyun 		}
1739*4882a593Smuzhiyun 	}
1740*4882a593Smuzhiyun 
1741*4882a593Smuzhiyun 	if (status & USBA_WAKE_UP) {
1742*4882a593Smuzhiyun 		start_clock(udc);
1743*4882a593Smuzhiyun 		toggle_bias(udc, 1);
1744*4882a593Smuzhiyun 		usba_writel(udc, INT_CLR, USBA_WAKE_UP);
1745*4882a593Smuzhiyun 		DBG(DBG_BUS, "Wake Up CPU detected\n");
1746*4882a593Smuzhiyun 	}
1747*4882a593Smuzhiyun 
1748*4882a593Smuzhiyun 	if (status & USBA_END_OF_RESUME) {
1749*4882a593Smuzhiyun 		udc->suspended = false;
1750*4882a593Smuzhiyun 		usba_writel(udc, INT_CLR, USBA_END_OF_RESUME);
1751*4882a593Smuzhiyun 		usba_int_enb_clear(udc, USBA_WAKE_UP);
1752*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_DET_SUSPEND);
1753*4882a593Smuzhiyun 		generate_bias_pulse(udc);
1754*4882a593Smuzhiyun 		DBG(DBG_BUS, "Resume detected\n");
1755*4882a593Smuzhiyun 		if (udc->gadget.speed != USB_SPEED_UNKNOWN
1756*4882a593Smuzhiyun 				&& udc->driver && udc->driver->resume) {
1757*4882a593Smuzhiyun 			spin_unlock(&udc->lock);
1758*4882a593Smuzhiyun 			udc->driver->resume(&udc->gadget);
1759*4882a593Smuzhiyun 			spin_lock(&udc->lock);
1760*4882a593Smuzhiyun 		}
1761*4882a593Smuzhiyun 	}
1762*4882a593Smuzhiyun 
1763*4882a593Smuzhiyun 	dma_status = USBA_BFEXT(DMA_INT, status);
1764*4882a593Smuzhiyun 	if (dma_status) {
1765*4882a593Smuzhiyun 		int i;
1766*4882a593Smuzhiyun 
1767*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_DET_SUSPEND);
1768*4882a593Smuzhiyun 
1769*4882a593Smuzhiyun 		for (i = 1; i <= USBA_NR_DMAS; i++)
1770*4882a593Smuzhiyun 			if (dma_status & (1 << i))
1771*4882a593Smuzhiyun 				usba_dma_irq(udc, &udc->usba_ep[i]);
1772*4882a593Smuzhiyun 	}
1773*4882a593Smuzhiyun 
1774*4882a593Smuzhiyun 	ep_status = USBA_BFEXT(EPT_INT, status);
1775*4882a593Smuzhiyun 	if (ep_status) {
1776*4882a593Smuzhiyun 		int i;
1777*4882a593Smuzhiyun 
1778*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_DET_SUSPEND);
1779*4882a593Smuzhiyun 
1780*4882a593Smuzhiyun 		for (i = 0; i < udc->num_ep; i++)
1781*4882a593Smuzhiyun 			if (ep_status & (1 << i)) {
1782*4882a593Smuzhiyun 				if (ep_is_control(&udc->usba_ep[i]))
1783*4882a593Smuzhiyun 					usba_control_irq(udc, &udc->usba_ep[i]);
1784*4882a593Smuzhiyun 				else
1785*4882a593Smuzhiyun 					usba_ep_irq(udc, &udc->usba_ep[i]);
1786*4882a593Smuzhiyun 			}
1787*4882a593Smuzhiyun 	}
1788*4882a593Smuzhiyun 
1789*4882a593Smuzhiyun 	if (status & USBA_END_OF_RESET) {
1790*4882a593Smuzhiyun 		struct usba_ep *ep0, *ep;
1791*4882a593Smuzhiyun 		int i;
1792*4882a593Smuzhiyun 
1793*4882a593Smuzhiyun 		usba_writel(udc, INT_CLR,
1794*4882a593Smuzhiyun 			USBA_END_OF_RESET|USBA_END_OF_RESUME
1795*4882a593Smuzhiyun 			|USBA_DET_SUSPEND|USBA_WAKE_UP);
1796*4882a593Smuzhiyun 		generate_bias_pulse(udc);
1797*4882a593Smuzhiyun 		reset_all_endpoints(udc);
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun 		if (udc->gadget.speed != USB_SPEED_UNKNOWN && udc->driver) {
1800*4882a593Smuzhiyun 			udc->gadget.speed = USB_SPEED_UNKNOWN;
1801*4882a593Smuzhiyun 			spin_unlock(&udc->lock);
1802*4882a593Smuzhiyun 			usb_gadget_udc_reset(&udc->gadget, udc->driver);
1803*4882a593Smuzhiyun 			spin_lock(&udc->lock);
1804*4882a593Smuzhiyun 		}
1805*4882a593Smuzhiyun 
1806*4882a593Smuzhiyun 		if (status & USBA_HIGH_SPEED)
1807*4882a593Smuzhiyun 			udc->gadget.speed = USB_SPEED_HIGH;
1808*4882a593Smuzhiyun 		else
1809*4882a593Smuzhiyun 			udc->gadget.speed = USB_SPEED_FULL;
1810*4882a593Smuzhiyun 		DBG(DBG_BUS, "%s bus reset detected\n",
1811*4882a593Smuzhiyun 		    usb_speed_string(udc->gadget.speed));
1812*4882a593Smuzhiyun 
1813*4882a593Smuzhiyun 		ep0 = &udc->usba_ep[0];
1814*4882a593Smuzhiyun 		ep0->ep.desc = &usba_ep0_desc;
1815*4882a593Smuzhiyun 		ep0->state = WAIT_FOR_SETUP;
1816*4882a593Smuzhiyun 		usba_ep_writel(ep0, CFG,
1817*4882a593Smuzhiyun 				(USBA_BF(EPT_SIZE, EP0_EPT_SIZE)
1818*4882a593Smuzhiyun 				| USBA_BF(EPT_TYPE, USBA_EPT_TYPE_CONTROL)
1819*4882a593Smuzhiyun 				| USBA_BF(BK_NUMBER, USBA_BK_NUMBER_ONE)));
1820*4882a593Smuzhiyun 		usba_ep_writel(ep0, CTL_ENB,
1821*4882a593Smuzhiyun 				USBA_EPT_ENABLE | USBA_RX_SETUP);
1822*4882a593Smuzhiyun 
1823*4882a593Smuzhiyun 		/* If we get reset while suspended... */
1824*4882a593Smuzhiyun 		udc->suspended = false;
1825*4882a593Smuzhiyun 		usba_int_enb_clear(udc, USBA_WAKE_UP);
1826*4882a593Smuzhiyun 
1827*4882a593Smuzhiyun 		usba_int_enb_set(udc, USBA_BF(EPT_INT, 1) |
1828*4882a593Smuzhiyun 				      USBA_DET_SUSPEND | USBA_END_OF_RESUME);
1829*4882a593Smuzhiyun 
1830*4882a593Smuzhiyun 		/*
1831*4882a593Smuzhiyun 		 * Unclear why we hit this irregularly, e.g. in usbtest,
1832*4882a593Smuzhiyun 		 * but it's clearly harmless...
1833*4882a593Smuzhiyun 		 */
1834*4882a593Smuzhiyun 		if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED))
1835*4882a593Smuzhiyun 			dev_err(&udc->pdev->dev,
1836*4882a593Smuzhiyun 				"ODD: EP0 configuration is invalid!\n");
1837*4882a593Smuzhiyun 
1838*4882a593Smuzhiyun 		/* Preallocate other endpoints */
1839*4882a593Smuzhiyun 		for (i = 1; i < udc->num_ep; i++) {
1840*4882a593Smuzhiyun 			ep = &udc->usba_ep[i];
1841*4882a593Smuzhiyun 			if (ep->ep.claimed) {
1842*4882a593Smuzhiyun 				usba_ep_writel(ep, CFG, ep->ept_cfg);
1843*4882a593Smuzhiyun 				if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED))
1844*4882a593Smuzhiyun 					dev_err(&udc->pdev->dev,
1845*4882a593Smuzhiyun 						"ODD: EP%d configuration is invalid!\n", i);
1846*4882a593Smuzhiyun 			}
1847*4882a593Smuzhiyun 		}
1848*4882a593Smuzhiyun 	}
1849*4882a593Smuzhiyun 
1850*4882a593Smuzhiyun 	spin_unlock(&udc->lock);
1851*4882a593Smuzhiyun 
1852*4882a593Smuzhiyun 	return IRQ_HANDLED;
1853*4882a593Smuzhiyun }
1854*4882a593Smuzhiyun 
start_clock(struct usba_udc * udc)1855*4882a593Smuzhiyun static int start_clock(struct usba_udc *udc)
1856*4882a593Smuzhiyun {
1857*4882a593Smuzhiyun 	int ret;
1858*4882a593Smuzhiyun 
1859*4882a593Smuzhiyun 	if (udc->clocked)
1860*4882a593Smuzhiyun 		return 0;
1861*4882a593Smuzhiyun 
1862*4882a593Smuzhiyun 	pm_stay_awake(&udc->pdev->dev);
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	ret = clk_prepare_enable(udc->pclk);
1865*4882a593Smuzhiyun 	if (ret)
1866*4882a593Smuzhiyun 		return ret;
1867*4882a593Smuzhiyun 	ret = clk_prepare_enable(udc->hclk);
1868*4882a593Smuzhiyun 	if (ret) {
1869*4882a593Smuzhiyun 		clk_disable_unprepare(udc->pclk);
1870*4882a593Smuzhiyun 		return ret;
1871*4882a593Smuzhiyun 	}
1872*4882a593Smuzhiyun 
1873*4882a593Smuzhiyun 	udc->clocked = true;
1874*4882a593Smuzhiyun 	return 0;
1875*4882a593Smuzhiyun }
1876*4882a593Smuzhiyun 
stop_clock(struct usba_udc * udc)1877*4882a593Smuzhiyun static void stop_clock(struct usba_udc *udc)
1878*4882a593Smuzhiyun {
1879*4882a593Smuzhiyun 	if (!udc->clocked)
1880*4882a593Smuzhiyun 		return;
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun 	clk_disable_unprepare(udc->hclk);
1883*4882a593Smuzhiyun 	clk_disable_unprepare(udc->pclk);
1884*4882a593Smuzhiyun 
1885*4882a593Smuzhiyun 	udc->clocked = false;
1886*4882a593Smuzhiyun 
1887*4882a593Smuzhiyun 	pm_relax(&udc->pdev->dev);
1888*4882a593Smuzhiyun }
1889*4882a593Smuzhiyun 
usba_start(struct usba_udc * udc)1890*4882a593Smuzhiyun static int usba_start(struct usba_udc *udc)
1891*4882a593Smuzhiyun {
1892*4882a593Smuzhiyun 	unsigned long flags;
1893*4882a593Smuzhiyun 	int ret;
1894*4882a593Smuzhiyun 
1895*4882a593Smuzhiyun 	ret = start_clock(udc);
1896*4882a593Smuzhiyun 	if (ret)
1897*4882a593Smuzhiyun 		return ret;
1898*4882a593Smuzhiyun 
1899*4882a593Smuzhiyun 	if (udc->suspended)
1900*4882a593Smuzhiyun 		return 0;
1901*4882a593Smuzhiyun 
1902*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1903*4882a593Smuzhiyun 	toggle_bias(udc, 1);
1904*4882a593Smuzhiyun 	usba_writel(udc, CTRL, USBA_ENABLE_MASK);
1905*4882a593Smuzhiyun 	/* Clear all requested and pending interrupts... */
1906*4882a593Smuzhiyun 	usba_writel(udc, INT_ENB, 0);
1907*4882a593Smuzhiyun 	udc->int_enb_cache = 0;
1908*4882a593Smuzhiyun 	usba_writel(udc, INT_CLR,
1909*4882a593Smuzhiyun 		USBA_END_OF_RESET|USBA_END_OF_RESUME
1910*4882a593Smuzhiyun 		|USBA_DET_SUSPEND|USBA_WAKE_UP);
1911*4882a593Smuzhiyun 	/* ...and enable just 'reset' IRQ to get us started */
1912*4882a593Smuzhiyun 	usba_int_enb_set(udc, USBA_END_OF_RESET);
1913*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1914*4882a593Smuzhiyun 
1915*4882a593Smuzhiyun 	return 0;
1916*4882a593Smuzhiyun }
1917*4882a593Smuzhiyun 
usba_stop(struct usba_udc * udc)1918*4882a593Smuzhiyun static void usba_stop(struct usba_udc *udc)
1919*4882a593Smuzhiyun {
1920*4882a593Smuzhiyun 	unsigned long flags;
1921*4882a593Smuzhiyun 
1922*4882a593Smuzhiyun 	if (udc->suspended)
1923*4882a593Smuzhiyun 		return;
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1926*4882a593Smuzhiyun 	udc->gadget.speed = USB_SPEED_UNKNOWN;
1927*4882a593Smuzhiyun 	reset_all_endpoints(udc);
1928*4882a593Smuzhiyun 
1929*4882a593Smuzhiyun 	/* This will also disable the DP pullup */
1930*4882a593Smuzhiyun 	toggle_bias(udc, 0);
1931*4882a593Smuzhiyun 	usba_writel(udc, CTRL, USBA_DISABLE_MASK);
1932*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun 	stop_clock(udc);
1935*4882a593Smuzhiyun }
1936*4882a593Smuzhiyun 
usba_vbus_irq_thread(int irq,void * devid)1937*4882a593Smuzhiyun static irqreturn_t usba_vbus_irq_thread(int irq, void *devid)
1938*4882a593Smuzhiyun {
1939*4882a593Smuzhiyun 	struct usba_udc *udc = devid;
1940*4882a593Smuzhiyun 	int vbus;
1941*4882a593Smuzhiyun 
1942*4882a593Smuzhiyun 	/* debounce */
1943*4882a593Smuzhiyun 	udelay(10);
1944*4882a593Smuzhiyun 
1945*4882a593Smuzhiyun 	mutex_lock(&udc->vbus_mutex);
1946*4882a593Smuzhiyun 
1947*4882a593Smuzhiyun 	vbus = vbus_is_present(udc);
1948*4882a593Smuzhiyun 	if (vbus != udc->vbus_prev) {
1949*4882a593Smuzhiyun 		if (vbus) {
1950*4882a593Smuzhiyun 			usba_start(udc);
1951*4882a593Smuzhiyun 		} else {
1952*4882a593Smuzhiyun 			udc->suspended = false;
1953*4882a593Smuzhiyun 			if (udc->driver->disconnect)
1954*4882a593Smuzhiyun 				udc->driver->disconnect(&udc->gadget);
1955*4882a593Smuzhiyun 
1956*4882a593Smuzhiyun 			usba_stop(udc);
1957*4882a593Smuzhiyun 		}
1958*4882a593Smuzhiyun 		udc->vbus_prev = vbus;
1959*4882a593Smuzhiyun 	}
1960*4882a593Smuzhiyun 
1961*4882a593Smuzhiyun 	mutex_unlock(&udc->vbus_mutex);
1962*4882a593Smuzhiyun 	return IRQ_HANDLED;
1963*4882a593Smuzhiyun }
1964*4882a593Smuzhiyun 
atmel_usba_pullup(struct usb_gadget * gadget,int is_on)1965*4882a593Smuzhiyun static int atmel_usba_pullup(struct usb_gadget *gadget, int is_on)
1966*4882a593Smuzhiyun {
1967*4882a593Smuzhiyun 	struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
1968*4882a593Smuzhiyun 	unsigned long flags;
1969*4882a593Smuzhiyun 	u32 ctrl;
1970*4882a593Smuzhiyun 
1971*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1972*4882a593Smuzhiyun 	ctrl = usba_readl(udc, CTRL);
1973*4882a593Smuzhiyun 	if (is_on)
1974*4882a593Smuzhiyun 		ctrl &= ~USBA_DETACH;
1975*4882a593Smuzhiyun 	else
1976*4882a593Smuzhiyun 		ctrl |= USBA_DETACH;
1977*4882a593Smuzhiyun 	usba_writel(udc, CTRL, ctrl);
1978*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1979*4882a593Smuzhiyun 
1980*4882a593Smuzhiyun 	return 0;
1981*4882a593Smuzhiyun }
1982*4882a593Smuzhiyun 
atmel_usba_start(struct usb_gadget * gadget,struct usb_gadget_driver * driver)1983*4882a593Smuzhiyun static int atmel_usba_start(struct usb_gadget *gadget,
1984*4882a593Smuzhiyun 		struct usb_gadget_driver *driver)
1985*4882a593Smuzhiyun {
1986*4882a593Smuzhiyun 	int ret;
1987*4882a593Smuzhiyun 	struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
1988*4882a593Smuzhiyun 	unsigned long flags;
1989*4882a593Smuzhiyun 
1990*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
1991*4882a593Smuzhiyun 	udc->devstatus = 1 << USB_DEVICE_SELF_POWERED;
1992*4882a593Smuzhiyun 	udc->driver = driver;
1993*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
1994*4882a593Smuzhiyun 
1995*4882a593Smuzhiyun 	mutex_lock(&udc->vbus_mutex);
1996*4882a593Smuzhiyun 
1997*4882a593Smuzhiyun 	if (udc->vbus_pin)
1998*4882a593Smuzhiyun 		enable_irq(gpiod_to_irq(udc->vbus_pin));
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun 	/* If Vbus is present, enable the controller and wait for reset */
2001*4882a593Smuzhiyun 	udc->vbus_prev = vbus_is_present(udc);
2002*4882a593Smuzhiyun 	if (udc->vbus_prev) {
2003*4882a593Smuzhiyun 		ret = usba_start(udc);
2004*4882a593Smuzhiyun 		if (ret)
2005*4882a593Smuzhiyun 			goto err;
2006*4882a593Smuzhiyun 	}
2007*4882a593Smuzhiyun 
2008*4882a593Smuzhiyun 	mutex_unlock(&udc->vbus_mutex);
2009*4882a593Smuzhiyun 	return 0;
2010*4882a593Smuzhiyun 
2011*4882a593Smuzhiyun err:
2012*4882a593Smuzhiyun 	if (udc->vbus_pin)
2013*4882a593Smuzhiyun 		disable_irq(gpiod_to_irq(udc->vbus_pin));
2014*4882a593Smuzhiyun 
2015*4882a593Smuzhiyun 	mutex_unlock(&udc->vbus_mutex);
2016*4882a593Smuzhiyun 
2017*4882a593Smuzhiyun 	spin_lock_irqsave(&udc->lock, flags);
2018*4882a593Smuzhiyun 	udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
2019*4882a593Smuzhiyun 	udc->driver = NULL;
2020*4882a593Smuzhiyun 	spin_unlock_irqrestore(&udc->lock, flags);
2021*4882a593Smuzhiyun 	return ret;
2022*4882a593Smuzhiyun }
2023*4882a593Smuzhiyun 
atmel_usba_stop(struct usb_gadget * gadget)2024*4882a593Smuzhiyun static int atmel_usba_stop(struct usb_gadget *gadget)
2025*4882a593Smuzhiyun {
2026*4882a593Smuzhiyun 	struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
2027*4882a593Smuzhiyun 
2028*4882a593Smuzhiyun 	if (udc->vbus_pin)
2029*4882a593Smuzhiyun 		disable_irq(gpiod_to_irq(udc->vbus_pin));
2030*4882a593Smuzhiyun 
2031*4882a593Smuzhiyun 	udc->suspended = false;
2032*4882a593Smuzhiyun 	usba_stop(udc);
2033*4882a593Smuzhiyun 
2034*4882a593Smuzhiyun 	udc->driver = NULL;
2035*4882a593Smuzhiyun 
2036*4882a593Smuzhiyun 	return 0;
2037*4882a593Smuzhiyun }
2038*4882a593Smuzhiyun 
at91sam9rl_toggle_bias(struct usba_udc * udc,int is_on)2039*4882a593Smuzhiyun static void at91sam9rl_toggle_bias(struct usba_udc *udc, int is_on)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun 	regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
2042*4882a593Smuzhiyun 			   is_on ? AT91_PMC_BIASEN : 0);
2043*4882a593Smuzhiyun }
2044*4882a593Smuzhiyun 
at91sam9g45_pulse_bias(struct usba_udc * udc)2045*4882a593Smuzhiyun static void at91sam9g45_pulse_bias(struct usba_udc *udc)
2046*4882a593Smuzhiyun {
2047*4882a593Smuzhiyun 	regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN, 0);
2048*4882a593Smuzhiyun 	regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
2049*4882a593Smuzhiyun 			   AT91_PMC_BIASEN);
2050*4882a593Smuzhiyun }
2051*4882a593Smuzhiyun 
2052*4882a593Smuzhiyun static const struct usba_udc_errata at91sam9rl_errata = {
2053*4882a593Smuzhiyun 	.toggle_bias = at91sam9rl_toggle_bias,
2054*4882a593Smuzhiyun };
2055*4882a593Smuzhiyun 
2056*4882a593Smuzhiyun static const struct usba_udc_errata at91sam9g45_errata = {
2057*4882a593Smuzhiyun 	.pulse_bias = at91sam9g45_pulse_bias,
2058*4882a593Smuzhiyun };
2059*4882a593Smuzhiyun 
2060*4882a593Smuzhiyun static const struct usba_ep_config ep_config_sam9[] __initconst = {
2061*4882a593Smuzhiyun 	{ .nr_banks = 1 },				/* ep 0 */
2062*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 1 */
2063*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 2 */
2064*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1 },		/* ep 3 */
2065*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1 },		/* ep 4 */
2066*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1, .can_isoc = 1 },	/* ep 5 */
2067*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1, .can_isoc = 1 },	/* ep 6 */
2068*4882a593Smuzhiyun };
2069*4882a593Smuzhiyun 
2070*4882a593Smuzhiyun static const struct usba_ep_config ep_config_sama5[] __initconst = {
2071*4882a593Smuzhiyun 	{ .nr_banks = 1 },				/* ep 0 */
2072*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1, .can_isoc = 1 },	/* ep 1 */
2073*4882a593Smuzhiyun 	{ .nr_banks = 3, .can_dma = 1, .can_isoc = 1 },	/* ep 2 */
2074*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 3 */
2075*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 4 */
2076*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 5 */
2077*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 6 */
2078*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_dma = 1, .can_isoc = 1 },	/* ep 7 */
2079*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 8 */
2080*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 9 */
2081*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 10 */
2082*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 11 */
2083*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 12 */
2084*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 13 */
2085*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 14 */
2086*4882a593Smuzhiyun 	{ .nr_banks = 2, .can_isoc = 1 },		/* ep 15 */
2087*4882a593Smuzhiyun };
2088*4882a593Smuzhiyun 
2089*4882a593Smuzhiyun static const struct usba_udc_config udc_at91sam9rl_cfg = {
2090*4882a593Smuzhiyun 	.errata = &at91sam9rl_errata,
2091*4882a593Smuzhiyun 	.config = ep_config_sam9,
2092*4882a593Smuzhiyun 	.num_ep = ARRAY_SIZE(ep_config_sam9),
2093*4882a593Smuzhiyun 	.ep_prealloc = true,
2094*4882a593Smuzhiyun };
2095*4882a593Smuzhiyun 
2096*4882a593Smuzhiyun static const struct usba_udc_config udc_at91sam9g45_cfg = {
2097*4882a593Smuzhiyun 	.errata = &at91sam9g45_errata,
2098*4882a593Smuzhiyun 	.config = ep_config_sam9,
2099*4882a593Smuzhiyun 	.num_ep = ARRAY_SIZE(ep_config_sam9),
2100*4882a593Smuzhiyun 	.ep_prealloc = true,
2101*4882a593Smuzhiyun };
2102*4882a593Smuzhiyun 
2103*4882a593Smuzhiyun static const struct usba_udc_config udc_sama5d3_cfg = {
2104*4882a593Smuzhiyun 	.config = ep_config_sama5,
2105*4882a593Smuzhiyun 	.num_ep = ARRAY_SIZE(ep_config_sama5),
2106*4882a593Smuzhiyun 	.ep_prealloc = true,
2107*4882a593Smuzhiyun };
2108*4882a593Smuzhiyun 
2109*4882a593Smuzhiyun static const struct usba_udc_config udc_sam9x60_cfg = {
2110*4882a593Smuzhiyun 	.num_ep = ARRAY_SIZE(ep_config_sam9),
2111*4882a593Smuzhiyun 	.config = ep_config_sam9,
2112*4882a593Smuzhiyun 	.ep_prealloc = false,
2113*4882a593Smuzhiyun };
2114*4882a593Smuzhiyun 
2115*4882a593Smuzhiyun static const struct of_device_id atmel_udc_dt_ids[] = {
2116*4882a593Smuzhiyun 	{ .compatible = "atmel,at91sam9rl-udc", .data = &udc_at91sam9rl_cfg },
2117*4882a593Smuzhiyun 	{ .compatible = "atmel,at91sam9g45-udc", .data = &udc_at91sam9g45_cfg },
2118*4882a593Smuzhiyun 	{ .compatible = "atmel,sama5d3-udc", .data = &udc_sama5d3_cfg },
2119*4882a593Smuzhiyun 	{ .compatible = "microchip,sam9x60-udc", .data = &udc_sam9x60_cfg },
2120*4882a593Smuzhiyun 	{ /* sentinel */ }
2121*4882a593Smuzhiyun };
2122*4882a593Smuzhiyun 
2123*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, atmel_udc_dt_ids);
2124*4882a593Smuzhiyun 
2125*4882a593Smuzhiyun static const struct of_device_id atmel_pmc_dt_ids[] = {
2126*4882a593Smuzhiyun 	{ .compatible = "atmel,at91sam9g45-pmc" },
2127*4882a593Smuzhiyun 	{ .compatible = "atmel,at91sam9rl-pmc" },
2128*4882a593Smuzhiyun 	{ .compatible = "atmel,at91sam9x5-pmc" },
2129*4882a593Smuzhiyun 	{ /* sentinel */ }
2130*4882a593Smuzhiyun };
2131*4882a593Smuzhiyun 
atmel_udc_of_init(struct platform_device * pdev,struct usba_udc * udc)2132*4882a593Smuzhiyun static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
2133*4882a593Smuzhiyun 						    struct usba_udc *udc)
2134*4882a593Smuzhiyun {
2135*4882a593Smuzhiyun 	struct device_node *np = pdev->dev.of_node;
2136*4882a593Smuzhiyun 	const struct of_device_id *match;
2137*4882a593Smuzhiyun 	struct device_node *pp;
2138*4882a593Smuzhiyun 	int i, ret;
2139*4882a593Smuzhiyun 	struct usba_ep *eps, *ep;
2140*4882a593Smuzhiyun 	const struct usba_udc_config *udc_config;
2141*4882a593Smuzhiyun 
2142*4882a593Smuzhiyun 	match = of_match_node(atmel_udc_dt_ids, np);
2143*4882a593Smuzhiyun 	if (!match)
2144*4882a593Smuzhiyun 		return ERR_PTR(-EINVAL);
2145*4882a593Smuzhiyun 
2146*4882a593Smuzhiyun 	udc_config = match->data;
2147*4882a593Smuzhiyun 	udc->ep_prealloc = udc_config->ep_prealloc;
2148*4882a593Smuzhiyun 	udc->errata = udc_config->errata;
2149*4882a593Smuzhiyun 	if (udc->errata) {
2150*4882a593Smuzhiyun 		pp = of_find_matching_node_and_match(NULL, atmel_pmc_dt_ids,
2151*4882a593Smuzhiyun 						     NULL);
2152*4882a593Smuzhiyun 		if (!pp)
2153*4882a593Smuzhiyun 			return ERR_PTR(-ENODEV);
2154*4882a593Smuzhiyun 
2155*4882a593Smuzhiyun 		udc->pmc = syscon_node_to_regmap(pp);
2156*4882a593Smuzhiyun 		of_node_put(pp);
2157*4882a593Smuzhiyun 		if (IS_ERR(udc->pmc))
2158*4882a593Smuzhiyun 			return ERR_CAST(udc->pmc);
2159*4882a593Smuzhiyun 	}
2160*4882a593Smuzhiyun 
2161*4882a593Smuzhiyun 	udc->num_ep = 0;
2162*4882a593Smuzhiyun 
2163*4882a593Smuzhiyun 	udc->vbus_pin = devm_gpiod_get_optional(&pdev->dev, "atmel,vbus",
2164*4882a593Smuzhiyun 						GPIOD_IN);
2165*4882a593Smuzhiyun 
2166*4882a593Smuzhiyun 	if (fifo_mode == 0) {
2167*4882a593Smuzhiyun 		udc->num_ep = udc_config->num_ep;
2168*4882a593Smuzhiyun 	} else {
2169*4882a593Smuzhiyun 		udc->num_ep = usba_config_fifo_table(udc);
2170*4882a593Smuzhiyun 	}
2171*4882a593Smuzhiyun 
2172*4882a593Smuzhiyun 	eps = devm_kcalloc(&pdev->dev, udc->num_ep, sizeof(struct usba_ep),
2173*4882a593Smuzhiyun 			   GFP_KERNEL);
2174*4882a593Smuzhiyun 	if (!eps)
2175*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
2176*4882a593Smuzhiyun 
2177*4882a593Smuzhiyun 	udc->gadget.ep0 = &eps[0].ep;
2178*4882a593Smuzhiyun 
2179*4882a593Smuzhiyun 	INIT_LIST_HEAD(&eps[0].ep.ep_list);
2180*4882a593Smuzhiyun 
2181*4882a593Smuzhiyun 	i = 0;
2182*4882a593Smuzhiyun 	while (i < udc->num_ep) {
2183*4882a593Smuzhiyun 		const struct usba_ep_config *ep_cfg = &udc_config->config[i];
2184*4882a593Smuzhiyun 
2185*4882a593Smuzhiyun 		ep = &eps[i];
2186*4882a593Smuzhiyun 
2187*4882a593Smuzhiyun 		ep->index = fifo_mode ? udc->fifo_cfg[i].hw_ep_num : i;
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun 		/* Only the first EP is 64 bytes */
2190*4882a593Smuzhiyun 		if (ep->index == 0)
2191*4882a593Smuzhiyun 			ep->fifo_size = 64;
2192*4882a593Smuzhiyun 		else
2193*4882a593Smuzhiyun 			ep->fifo_size = 1024;
2194*4882a593Smuzhiyun 
2195*4882a593Smuzhiyun 		if (fifo_mode) {
2196*4882a593Smuzhiyun 			if (ep->fifo_size < udc->fifo_cfg[i].fifo_size)
2197*4882a593Smuzhiyun 				dev_warn(&pdev->dev,
2198*4882a593Smuzhiyun 					 "Using default max fifo-size value\n");
2199*4882a593Smuzhiyun 			else
2200*4882a593Smuzhiyun 				ep->fifo_size = udc->fifo_cfg[i].fifo_size;
2201*4882a593Smuzhiyun 		}
2202*4882a593Smuzhiyun 
2203*4882a593Smuzhiyun 		ep->nr_banks = ep_cfg->nr_banks;
2204*4882a593Smuzhiyun 		if (fifo_mode) {
2205*4882a593Smuzhiyun 			if (ep->nr_banks < udc->fifo_cfg[i].nr_banks)
2206*4882a593Smuzhiyun 				dev_warn(&pdev->dev,
2207*4882a593Smuzhiyun 					 "Using default max nb-banks value\n");
2208*4882a593Smuzhiyun 			else
2209*4882a593Smuzhiyun 				ep->nr_banks = udc->fifo_cfg[i].nr_banks;
2210*4882a593Smuzhiyun 		}
2211*4882a593Smuzhiyun 
2212*4882a593Smuzhiyun 		ep->can_dma = ep_cfg->can_dma;
2213*4882a593Smuzhiyun 		ep->can_isoc = ep_cfg->can_isoc;
2214*4882a593Smuzhiyun 
2215*4882a593Smuzhiyun 		sprintf(ep->name, "ep%d", ep->index);
2216*4882a593Smuzhiyun 		ep->ep.name = ep->name;
2217*4882a593Smuzhiyun 
2218*4882a593Smuzhiyun 		ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
2219*4882a593Smuzhiyun 		ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
2220*4882a593Smuzhiyun 		ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
2221*4882a593Smuzhiyun 		ep->ep.ops = &usba_ep_ops;
2222*4882a593Smuzhiyun 		usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
2223*4882a593Smuzhiyun 		ep->udc = udc;
2224*4882a593Smuzhiyun 		INIT_LIST_HEAD(&ep->queue);
2225*4882a593Smuzhiyun 
2226*4882a593Smuzhiyun 		if (ep->index == 0) {
2227*4882a593Smuzhiyun 			ep->ep.caps.type_control = true;
2228*4882a593Smuzhiyun 		} else {
2229*4882a593Smuzhiyun 			ep->ep.caps.type_iso = ep->can_isoc;
2230*4882a593Smuzhiyun 			ep->ep.caps.type_bulk = true;
2231*4882a593Smuzhiyun 			ep->ep.caps.type_int = true;
2232*4882a593Smuzhiyun 		}
2233*4882a593Smuzhiyun 
2234*4882a593Smuzhiyun 		ep->ep.caps.dir_in = true;
2235*4882a593Smuzhiyun 		ep->ep.caps.dir_out = true;
2236*4882a593Smuzhiyun 
2237*4882a593Smuzhiyun 		if (fifo_mode != 0) {
2238*4882a593Smuzhiyun 			/*
2239*4882a593Smuzhiyun 			 * Generate ept_cfg based on FIFO size and
2240*4882a593Smuzhiyun 			 * banks number
2241*4882a593Smuzhiyun 			 */
2242*4882a593Smuzhiyun 			if (ep->fifo_size  <= 8)
2243*4882a593Smuzhiyun 				ep->ept_cfg = USBA_BF(EPT_SIZE, USBA_EPT_SIZE_8);
2244*4882a593Smuzhiyun 			else
2245*4882a593Smuzhiyun 				/* LSB is bit 1, not 0 */
2246*4882a593Smuzhiyun 				ep->ept_cfg =
2247*4882a593Smuzhiyun 				  USBA_BF(EPT_SIZE, fls(ep->fifo_size - 1) - 3);
2248*4882a593Smuzhiyun 
2249*4882a593Smuzhiyun 			ep->ept_cfg |= USBA_BF(BK_NUMBER, ep->nr_banks);
2250*4882a593Smuzhiyun 		}
2251*4882a593Smuzhiyun 
2252*4882a593Smuzhiyun 		if (i)
2253*4882a593Smuzhiyun 			list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
2254*4882a593Smuzhiyun 
2255*4882a593Smuzhiyun 		i++;
2256*4882a593Smuzhiyun 	}
2257*4882a593Smuzhiyun 
2258*4882a593Smuzhiyun 	if (i == 0) {
2259*4882a593Smuzhiyun 		dev_err(&pdev->dev, "of_probe: no endpoint specified\n");
2260*4882a593Smuzhiyun 		ret = -EINVAL;
2261*4882a593Smuzhiyun 		goto err;
2262*4882a593Smuzhiyun 	}
2263*4882a593Smuzhiyun 
2264*4882a593Smuzhiyun 	return eps;
2265*4882a593Smuzhiyun err:
2266*4882a593Smuzhiyun 	return ERR_PTR(ret);
2267*4882a593Smuzhiyun }
2268*4882a593Smuzhiyun 
usba_udc_probe(struct platform_device * pdev)2269*4882a593Smuzhiyun static int usba_udc_probe(struct platform_device *pdev)
2270*4882a593Smuzhiyun {
2271*4882a593Smuzhiyun 	struct resource *res;
2272*4882a593Smuzhiyun 	struct clk *pclk, *hclk;
2273*4882a593Smuzhiyun 	struct usba_udc *udc;
2274*4882a593Smuzhiyun 	int irq, ret, i;
2275*4882a593Smuzhiyun 
2276*4882a593Smuzhiyun 	udc = devm_kzalloc(&pdev->dev, sizeof(*udc), GFP_KERNEL);
2277*4882a593Smuzhiyun 	if (!udc)
2278*4882a593Smuzhiyun 		return -ENOMEM;
2279*4882a593Smuzhiyun 
2280*4882a593Smuzhiyun 	udc->gadget = usba_gadget_template;
2281*4882a593Smuzhiyun 	INIT_LIST_HEAD(&udc->gadget.ep_list);
2282*4882a593Smuzhiyun 
2283*4882a593Smuzhiyun 	res = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID);
2284*4882a593Smuzhiyun 	udc->regs = devm_ioremap_resource(&pdev->dev, res);
2285*4882a593Smuzhiyun 	if (IS_ERR(udc->regs))
2286*4882a593Smuzhiyun 		return PTR_ERR(udc->regs);
2287*4882a593Smuzhiyun 	dev_info(&pdev->dev, "MMIO registers at %pR mapped at %p\n",
2288*4882a593Smuzhiyun 		 res, udc->regs);
2289*4882a593Smuzhiyun 
2290*4882a593Smuzhiyun 	res = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID);
2291*4882a593Smuzhiyun 	udc->fifo = devm_ioremap_resource(&pdev->dev, res);
2292*4882a593Smuzhiyun 	if (IS_ERR(udc->fifo))
2293*4882a593Smuzhiyun 		return PTR_ERR(udc->fifo);
2294*4882a593Smuzhiyun 	dev_info(&pdev->dev, "FIFO at %pR mapped at %p\n", res, udc->fifo);
2295*4882a593Smuzhiyun 
2296*4882a593Smuzhiyun 	irq = platform_get_irq(pdev, 0);
2297*4882a593Smuzhiyun 	if (irq < 0)
2298*4882a593Smuzhiyun 		return irq;
2299*4882a593Smuzhiyun 
2300*4882a593Smuzhiyun 	pclk = devm_clk_get(&pdev->dev, "pclk");
2301*4882a593Smuzhiyun 	if (IS_ERR(pclk))
2302*4882a593Smuzhiyun 		return PTR_ERR(pclk);
2303*4882a593Smuzhiyun 	hclk = devm_clk_get(&pdev->dev, "hclk");
2304*4882a593Smuzhiyun 	if (IS_ERR(hclk))
2305*4882a593Smuzhiyun 		return PTR_ERR(hclk);
2306*4882a593Smuzhiyun 
2307*4882a593Smuzhiyun 	spin_lock_init(&udc->lock);
2308*4882a593Smuzhiyun 	mutex_init(&udc->vbus_mutex);
2309*4882a593Smuzhiyun 	udc->pdev = pdev;
2310*4882a593Smuzhiyun 	udc->pclk = pclk;
2311*4882a593Smuzhiyun 	udc->hclk = hclk;
2312*4882a593Smuzhiyun 
2313*4882a593Smuzhiyun 	platform_set_drvdata(pdev, udc);
2314*4882a593Smuzhiyun 
2315*4882a593Smuzhiyun 	/* Make sure we start from a clean slate */
2316*4882a593Smuzhiyun 	ret = clk_prepare_enable(pclk);
2317*4882a593Smuzhiyun 	if (ret) {
2318*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Unable to enable pclk, aborting.\n");
2319*4882a593Smuzhiyun 		return ret;
2320*4882a593Smuzhiyun 	}
2321*4882a593Smuzhiyun 
2322*4882a593Smuzhiyun 	usba_writel(udc, CTRL, USBA_DISABLE_MASK);
2323*4882a593Smuzhiyun 	clk_disable_unprepare(pclk);
2324*4882a593Smuzhiyun 
2325*4882a593Smuzhiyun 	udc->usba_ep = atmel_udc_of_init(pdev, udc);
2326*4882a593Smuzhiyun 
2327*4882a593Smuzhiyun 	toggle_bias(udc, 0);
2328*4882a593Smuzhiyun 
2329*4882a593Smuzhiyun 	if (IS_ERR(udc->usba_ep))
2330*4882a593Smuzhiyun 		return PTR_ERR(udc->usba_ep);
2331*4882a593Smuzhiyun 
2332*4882a593Smuzhiyun 	ret = devm_request_irq(&pdev->dev, irq, usba_udc_irq, 0,
2333*4882a593Smuzhiyun 				"atmel_usba_udc", udc);
2334*4882a593Smuzhiyun 	if (ret) {
2335*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Cannot request irq %d (error %d)\n",
2336*4882a593Smuzhiyun 			irq, ret);
2337*4882a593Smuzhiyun 		return ret;
2338*4882a593Smuzhiyun 	}
2339*4882a593Smuzhiyun 	udc->irq = irq;
2340*4882a593Smuzhiyun 
2341*4882a593Smuzhiyun 	if (udc->vbus_pin) {
2342*4882a593Smuzhiyun 		irq_set_status_flags(gpiod_to_irq(udc->vbus_pin), IRQ_NOAUTOEN);
2343*4882a593Smuzhiyun 		ret = devm_request_threaded_irq(&pdev->dev,
2344*4882a593Smuzhiyun 				gpiod_to_irq(udc->vbus_pin), NULL,
2345*4882a593Smuzhiyun 				usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS,
2346*4882a593Smuzhiyun 				"atmel_usba_udc", udc);
2347*4882a593Smuzhiyun 		if (ret) {
2348*4882a593Smuzhiyun 			udc->vbus_pin = NULL;
2349*4882a593Smuzhiyun 			dev_warn(&udc->pdev->dev,
2350*4882a593Smuzhiyun 				 "failed to request vbus irq; "
2351*4882a593Smuzhiyun 				 "assuming always on\n");
2352*4882a593Smuzhiyun 		}
2353*4882a593Smuzhiyun 	}
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun 	ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
2356*4882a593Smuzhiyun 	if (ret)
2357*4882a593Smuzhiyun 		return ret;
2358*4882a593Smuzhiyun 	device_init_wakeup(&pdev->dev, 1);
2359*4882a593Smuzhiyun 
2360*4882a593Smuzhiyun 	usba_init_debugfs(udc);
2361*4882a593Smuzhiyun 	for (i = 1; i < udc->num_ep; i++)
2362*4882a593Smuzhiyun 		usba_ep_init_debugfs(udc, &udc->usba_ep[i]);
2363*4882a593Smuzhiyun 
2364*4882a593Smuzhiyun 	return 0;
2365*4882a593Smuzhiyun }
2366*4882a593Smuzhiyun 
usba_udc_remove(struct platform_device * pdev)2367*4882a593Smuzhiyun static int usba_udc_remove(struct platform_device *pdev)
2368*4882a593Smuzhiyun {
2369*4882a593Smuzhiyun 	struct usba_udc *udc;
2370*4882a593Smuzhiyun 	int i;
2371*4882a593Smuzhiyun 
2372*4882a593Smuzhiyun 	udc = platform_get_drvdata(pdev);
2373*4882a593Smuzhiyun 
2374*4882a593Smuzhiyun 	device_init_wakeup(&pdev->dev, 0);
2375*4882a593Smuzhiyun 	usb_del_gadget_udc(&udc->gadget);
2376*4882a593Smuzhiyun 
2377*4882a593Smuzhiyun 	for (i = 1; i < udc->num_ep; i++)
2378*4882a593Smuzhiyun 		usba_ep_cleanup_debugfs(&udc->usba_ep[i]);
2379*4882a593Smuzhiyun 	usba_cleanup_debugfs(udc);
2380*4882a593Smuzhiyun 
2381*4882a593Smuzhiyun 	return 0;
2382*4882a593Smuzhiyun }
2383*4882a593Smuzhiyun 
2384*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
usba_udc_suspend(struct device * dev)2385*4882a593Smuzhiyun static int usba_udc_suspend(struct device *dev)
2386*4882a593Smuzhiyun {
2387*4882a593Smuzhiyun 	struct usba_udc *udc = dev_get_drvdata(dev);
2388*4882a593Smuzhiyun 
2389*4882a593Smuzhiyun 	/* Not started */
2390*4882a593Smuzhiyun 	if (!udc->driver)
2391*4882a593Smuzhiyun 		return 0;
2392*4882a593Smuzhiyun 
2393*4882a593Smuzhiyun 	mutex_lock(&udc->vbus_mutex);
2394*4882a593Smuzhiyun 
2395*4882a593Smuzhiyun 	if (!device_may_wakeup(dev)) {
2396*4882a593Smuzhiyun 		udc->suspended = false;
2397*4882a593Smuzhiyun 		usba_stop(udc);
2398*4882a593Smuzhiyun 		goto out;
2399*4882a593Smuzhiyun 	}
2400*4882a593Smuzhiyun 
2401*4882a593Smuzhiyun 	/*
2402*4882a593Smuzhiyun 	 * Device may wake up. We stay clocked if we failed
2403*4882a593Smuzhiyun 	 * to request vbus irq, assuming always on.
2404*4882a593Smuzhiyun 	 */
2405*4882a593Smuzhiyun 	if (udc->vbus_pin) {
2406*4882a593Smuzhiyun 		/* FIXME: right to stop here...??? */
2407*4882a593Smuzhiyun 		usba_stop(udc);
2408*4882a593Smuzhiyun 		enable_irq_wake(gpiod_to_irq(udc->vbus_pin));
2409*4882a593Smuzhiyun 	}
2410*4882a593Smuzhiyun 
2411*4882a593Smuzhiyun 	enable_irq_wake(udc->irq);
2412*4882a593Smuzhiyun 
2413*4882a593Smuzhiyun out:
2414*4882a593Smuzhiyun 	mutex_unlock(&udc->vbus_mutex);
2415*4882a593Smuzhiyun 	return 0;
2416*4882a593Smuzhiyun }
2417*4882a593Smuzhiyun 
usba_udc_resume(struct device * dev)2418*4882a593Smuzhiyun static int usba_udc_resume(struct device *dev)
2419*4882a593Smuzhiyun {
2420*4882a593Smuzhiyun 	struct usba_udc *udc = dev_get_drvdata(dev);
2421*4882a593Smuzhiyun 
2422*4882a593Smuzhiyun 	/* Not started */
2423*4882a593Smuzhiyun 	if (!udc->driver)
2424*4882a593Smuzhiyun 		return 0;
2425*4882a593Smuzhiyun 
2426*4882a593Smuzhiyun 	if (device_may_wakeup(dev)) {
2427*4882a593Smuzhiyun 		if (udc->vbus_pin)
2428*4882a593Smuzhiyun 			disable_irq_wake(gpiod_to_irq(udc->vbus_pin));
2429*4882a593Smuzhiyun 
2430*4882a593Smuzhiyun 		disable_irq_wake(udc->irq);
2431*4882a593Smuzhiyun 	}
2432*4882a593Smuzhiyun 
2433*4882a593Smuzhiyun 	/* If Vbus is present, enable the controller and wait for reset */
2434*4882a593Smuzhiyun 	mutex_lock(&udc->vbus_mutex);
2435*4882a593Smuzhiyun 	udc->vbus_prev = vbus_is_present(udc);
2436*4882a593Smuzhiyun 	if (udc->vbus_prev)
2437*4882a593Smuzhiyun 		usba_start(udc);
2438*4882a593Smuzhiyun 	mutex_unlock(&udc->vbus_mutex);
2439*4882a593Smuzhiyun 
2440*4882a593Smuzhiyun 	return 0;
2441*4882a593Smuzhiyun }
2442*4882a593Smuzhiyun #endif
2443*4882a593Smuzhiyun 
2444*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(usba_udc_pm_ops, usba_udc_suspend, usba_udc_resume);
2445*4882a593Smuzhiyun 
2446*4882a593Smuzhiyun static struct platform_driver udc_driver = {
2447*4882a593Smuzhiyun 	.remove		= usba_udc_remove,
2448*4882a593Smuzhiyun 	.driver		= {
2449*4882a593Smuzhiyun 		.name		= "atmel_usba_udc",
2450*4882a593Smuzhiyun 		.pm		= &usba_udc_pm_ops,
2451*4882a593Smuzhiyun 		.of_match_table	= atmel_udc_dt_ids,
2452*4882a593Smuzhiyun 	},
2453*4882a593Smuzhiyun };
2454*4882a593Smuzhiyun 
2455*4882a593Smuzhiyun module_platform_driver_probe(udc_driver, usba_udc_probe);
2456*4882a593Smuzhiyun 
2457*4882a593Smuzhiyun MODULE_DESCRIPTION("Atmel USBA UDC driver");
2458*4882a593Smuzhiyun MODULE_AUTHOR("Haavard Skinnemoen (Atmel)");
2459*4882a593Smuzhiyun MODULE_LICENSE("GPL");
2460*4882a593Smuzhiyun MODULE_ALIAS("platform:atmel_usba_udc");
2461