blob: 12543decf9abb3a9401fdbecd7741cd3f2679ce0 [file] [log] [blame]
Greg Kroah-Hartman5fd54ac2017-11-03 11:28:30 +01001// SPDX-License-Identifier: GPL-2.0
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002/*
3 * Driver for the Atmel USBA high speed USB device controller
4 *
5 * Copyright (C) 2005-2007 Atmel Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/clk.h>
Boris Brezillon3280e672015-01-06 14:46:58 +010012#include <linux/clk/at91_pmc.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070013#include <linux/module.h>
14#include <linux/init.h>
15#include <linux/interrupt.h>
16#include <linux/io.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090017#include <linux/slab.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070018#include <linux/device.h>
19#include <linux/dma-mapping.h>
20#include <linux/list.h>
Alexandre Belloni47476392015-09-30 12:57:10 +020021#include <linux/mfd/syscon.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070022#include <linux/platform_device.h>
Alexandre Belloni47476392015-09-30 12:57:10 +020023#include <linux/regmap.h>
Cristian Birsan741d2552017-01-23 16:45:59 +020024#include <linux/ctype.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070025#include <linux/usb/ch9.h>
26#include <linux/usb/gadget.h>
Stelian Pop8d855312008-03-05 00:00:00 +010027#include <linux/usb/atmel_usba_udc.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070028#include <linux/delay.h>
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +080029#include <linux/of.h>
30#include <linux/of_gpio.h>
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070031
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070032#include "atmel_usba_udc.h"
Nicolas Ferre6baeda12017-08-31 14:51:40 +020033#define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \
34 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070035
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070036#ifdef CONFIG_USB_GADGET_DEBUG_FS
37#include <linux/debugfs.h>
38#include <linux/uaccess.h>
39
40static int queue_dbg_open(struct inode *inode, struct file *file)
41{
42 struct usba_ep *ep = inode->i_private;
43 struct usba_request *req, *req_copy;
44 struct list_head *queue_data;
45
46 queue_data = kmalloc(sizeof(*queue_data), GFP_KERNEL);
47 if (!queue_data)
48 return -ENOMEM;
49 INIT_LIST_HEAD(queue_data);
50
51 spin_lock_irq(&ep->udc->lock);
52 list_for_each_entry(req, &ep->queue, queue) {
Julia Lawall4b8e1232010-05-15 23:15:44 +020053 req_copy = kmemdup(req, sizeof(*req_copy), GFP_ATOMIC);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070054 if (!req_copy)
55 goto fail;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070056 list_add_tail(&req_copy->queue, queue_data);
57 }
58 spin_unlock_irq(&ep->udc->lock);
59
60 file->private_data = queue_data;
61 return 0;
62
63fail:
64 spin_unlock_irq(&ep->udc->lock);
65 list_for_each_entry_safe(req, req_copy, queue_data, queue) {
66 list_del(&req->queue);
67 kfree(req);
68 }
69 kfree(queue_data);
70 return -ENOMEM;
71}
72
73/*
74 * bbbbbbbb llllllll IZS sssss nnnn FDL\n\0
75 *
76 * b: buffer address
77 * l: buffer length
78 * I/i: interrupt/no interrupt
79 * Z/z: zero/no zero
80 * S/s: short ok/short not ok
81 * s: status
82 * n: nr_packets
83 * F/f: submitted/not submitted to FIFO
84 * D/d: using/not using DMA
85 * L/l: last transaction/not last transaction
86 */
87static ssize_t queue_dbg_read(struct file *file, char __user *buf,
88 size_t nbytes, loff_t *ppos)
89{
90 struct list_head *queue = file->private_data;
91 struct usba_request *req, *tmp_req;
92 size_t len, remaining, actual = 0;
93 char tmpbuf[38];
94
95 if (!access_ok(VERIFY_WRITE, buf, nbytes))
96 return -EFAULT;
97
Al Viro59551022016-01-22 15:40:57 -050098 inode_lock(file_inode(file));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -070099 list_for_each_entry_safe(req, tmp_req, queue, queue) {
100 len = snprintf(tmpbuf, sizeof(tmpbuf),
101 "%8p %08x %c%c%c %5d %c%c%c\n",
102 req->req.buf, req->req.length,
103 req->req.no_interrupt ? 'i' : 'I',
104 req->req.zero ? 'Z' : 'z',
105 req->req.short_not_ok ? 's' : 'S',
106 req->req.status,
107 req->submitted ? 'F' : 'f',
108 req->using_dma ? 'D' : 'd',
109 req->last_transaction ? 'L' : 'l');
110 len = min(len, sizeof(tmpbuf));
111 if (len > nbytes)
112 break;
113
114 list_del(&req->queue);
115 kfree(req);
116
117 remaining = __copy_to_user(buf, tmpbuf, len);
118 actual += len - remaining;
119 if (remaining)
120 break;
121
122 nbytes -= len;
123 buf += len;
124 }
Al Viro59551022016-01-22 15:40:57 -0500125 inode_unlock(file_inode(file));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700126
127 return actual;
128}
129
130static int queue_dbg_release(struct inode *inode, struct file *file)
131{
132 struct list_head *queue_data = file->private_data;
133 struct usba_request *req, *tmp_req;
134
135 list_for_each_entry_safe(req, tmp_req, queue_data, queue) {
136 list_del(&req->queue);
137 kfree(req);
138 }
139 kfree(queue_data);
140 return 0;
141}
142
143static int regs_dbg_open(struct inode *inode, struct file *file)
144{
145 struct usba_udc *udc;
146 unsigned int i;
147 u32 *data;
148 int ret = -ENOMEM;
149
Al Viro59551022016-01-22 15:40:57 -0500150 inode_lock(inode);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700151 udc = inode->i_private;
152 data = kmalloc(inode->i_size, GFP_KERNEL);
153 if (!data)
154 goto out;
155
156 spin_lock_irq(&udc->lock);
157 for (i = 0; i < inode->i_size / 4; i++)
Alexandre Bellonid423b9652017-06-16 13:30:18 +0200158 data[i] = readl_relaxed(udc->regs + i * 4);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700159 spin_unlock_irq(&udc->lock);
160
161 file->private_data = data;
162 ret = 0;
163
164out:
Al Viro59551022016-01-22 15:40:57 -0500165 inode_unlock(inode);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700166
167 return ret;
168}
169
170static ssize_t regs_dbg_read(struct file *file, char __user *buf,
171 size_t nbytes, loff_t *ppos)
172{
Al Viro496ad9a2013-01-23 17:07:38 -0500173 struct inode *inode = file_inode(file);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700174 int ret;
175
Al Viro59551022016-01-22 15:40:57 -0500176 inode_lock(inode);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700177 ret = simple_read_from_buffer(buf, nbytes, ppos,
178 file->private_data,
Al Viro496ad9a2013-01-23 17:07:38 -0500179 file_inode(file)->i_size);
Al Viro59551022016-01-22 15:40:57 -0500180 inode_unlock(inode);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700181
182 return ret;
183}
184
185static int regs_dbg_release(struct inode *inode, struct file *file)
186{
187 kfree(file->private_data);
188 return 0;
189}
190
191const struct file_operations queue_dbg_fops = {
192 .owner = THIS_MODULE,
193 .open = queue_dbg_open,
194 .llseek = no_llseek,
195 .read = queue_dbg_read,
196 .release = queue_dbg_release,
197};
198
199const struct file_operations regs_dbg_fops = {
200 .owner = THIS_MODULE,
201 .open = regs_dbg_open,
202 .llseek = generic_file_llseek,
203 .read = regs_dbg_read,
204 .release = regs_dbg_release,
205};
206
207static void usba_ep_init_debugfs(struct usba_udc *udc,
208 struct usba_ep *ep)
209{
210 struct dentry *ep_root;
211
212 ep_root = debugfs_create_dir(ep->ep.name, udc->debugfs_root);
213 if (!ep_root)
214 goto err_root;
215 ep->debugfs_dir = ep_root;
216
217 ep->debugfs_queue = debugfs_create_file("queue", 0400, ep_root,
218 ep, &queue_dbg_fops);
219 if (!ep->debugfs_queue)
220 goto err_queue;
221
222 if (ep->can_dma) {
223 ep->debugfs_dma_status
224 = debugfs_create_u32("dma_status", 0400, ep_root,
225 &ep->last_dma_status);
226 if (!ep->debugfs_dma_status)
227 goto err_dma_status;
228 }
229 if (ep_is_control(ep)) {
230 ep->debugfs_state
231 = debugfs_create_u32("state", 0400, ep_root,
232 &ep->state);
233 if (!ep->debugfs_state)
234 goto err_state;
235 }
236
237 return;
238
239err_state:
240 if (ep->can_dma)
241 debugfs_remove(ep->debugfs_dma_status);
242err_dma_status:
243 debugfs_remove(ep->debugfs_queue);
244err_queue:
245 debugfs_remove(ep_root);
246err_root:
247 dev_err(&ep->udc->pdev->dev,
248 "failed to create debugfs directory for %s\n", ep->ep.name);
249}
250
251static void usba_ep_cleanup_debugfs(struct usba_ep *ep)
252{
253 debugfs_remove(ep->debugfs_queue);
254 debugfs_remove(ep->debugfs_dma_status);
255 debugfs_remove(ep->debugfs_state);
256 debugfs_remove(ep->debugfs_dir);
257 ep->debugfs_dma_status = NULL;
258 ep->debugfs_dir = NULL;
259}
260
261static void usba_init_debugfs(struct usba_udc *udc)
262{
263 struct dentry *root, *regs;
264 struct resource *regs_resource;
265
266 root = debugfs_create_dir(udc->gadget.name, NULL);
267 if (IS_ERR(root) || !root)
268 goto err_root;
269 udc->debugfs_root = root;
270
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700271 regs_resource = platform_get_resource(udc->pdev, IORESOURCE_MEM,
272 CTRL_IOMEM_ID);
David Howellse59b4e92015-01-21 20:03:40 +0000273
274 if (regs_resource) {
275 regs = debugfs_create_file_size("regs", 0400, root, udc,
276 &regs_dbg_fops,
277 resource_size(regs_resource));
278 if (!regs)
279 goto err_regs;
280 udc->debugfs_regs = regs;
281 }
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700282
283 usba_ep_init_debugfs(udc, to_usba_ep(udc->gadget.ep0));
284
285 return;
286
287err_regs:
288 debugfs_remove(root);
289err_root:
290 udc->debugfs_root = NULL;
291 dev_err(&udc->pdev->dev, "debugfs is not available\n");
292}
293
294static void usba_cleanup_debugfs(struct usba_udc *udc)
295{
296 usba_ep_cleanup_debugfs(to_usba_ep(udc->gadget.ep0));
297 debugfs_remove(udc->debugfs_regs);
298 debugfs_remove(udc->debugfs_root);
299 udc->debugfs_regs = NULL;
300 udc->debugfs_root = NULL;
301}
302#else
303static inline void usba_ep_init_debugfs(struct usba_udc *udc,
304 struct usba_ep *ep)
305{
306
307}
308
309static inline void usba_ep_cleanup_debugfs(struct usba_ep *ep)
310{
311
312}
313
314static inline void usba_init_debugfs(struct usba_udc *udc)
315{
316
317}
318
319static inline void usba_cleanup_debugfs(struct usba_udc *udc)
320{
321
322}
323#endif
324
Cristian Birsan741d2552017-01-23 16:45:59 +0200325static ushort fifo_mode;
326
Cristian Birsan741d2552017-01-23 16:45:59 +0200327module_param(fifo_mode, ushort, 0x0);
328MODULE_PARM_DESC(fifo_mode, "Endpoint configuration mode");
329
330/* mode 0 - uses autoconfig */
331
332/* mode 1 - fits in 8KB, generic max fifo configuration */
333static struct usba_fifo_cfg mode_1_cfg[] = {
334{ .hw_ep_num = 0, .fifo_size = 64, .nr_banks = 1, },
335{ .hw_ep_num = 1, .fifo_size = 1024, .nr_banks = 2, },
336{ .hw_ep_num = 2, .fifo_size = 1024, .nr_banks = 1, },
337{ .hw_ep_num = 3, .fifo_size = 1024, .nr_banks = 1, },
338{ .hw_ep_num = 4, .fifo_size = 1024, .nr_banks = 1, },
339{ .hw_ep_num = 5, .fifo_size = 1024, .nr_banks = 1, },
340{ .hw_ep_num = 6, .fifo_size = 1024, .nr_banks = 1, },
341};
342
343/* mode 2 - fits in 8KB, performance max fifo configuration */
344static struct usba_fifo_cfg mode_2_cfg[] = {
345{ .hw_ep_num = 0, .fifo_size = 64, .nr_banks = 1, },
346{ .hw_ep_num = 1, .fifo_size = 1024, .nr_banks = 3, },
347{ .hw_ep_num = 2, .fifo_size = 1024, .nr_banks = 2, },
348{ .hw_ep_num = 3, .fifo_size = 1024, .nr_banks = 2, },
349};
350
351/* mode 3 - fits in 8KB, mixed fifo configuration */
352static struct usba_fifo_cfg mode_3_cfg[] = {
353{ .hw_ep_num = 0, .fifo_size = 64, .nr_banks = 1, },
354{ .hw_ep_num = 1, .fifo_size = 1024, .nr_banks = 2, },
355{ .hw_ep_num = 2, .fifo_size = 512, .nr_banks = 2, },
356{ .hw_ep_num = 3, .fifo_size = 512, .nr_banks = 2, },
357{ .hw_ep_num = 4, .fifo_size = 512, .nr_banks = 2, },
358{ .hw_ep_num = 5, .fifo_size = 512, .nr_banks = 2, },
359{ .hw_ep_num = 6, .fifo_size = 512, .nr_banks = 2, },
360};
361
362/* mode 4 - fits in 8KB, custom fifo configuration */
363static struct usba_fifo_cfg mode_4_cfg[] = {
364{ .hw_ep_num = 0, .fifo_size = 64, .nr_banks = 1, },
365{ .hw_ep_num = 1, .fifo_size = 512, .nr_banks = 2, },
366{ .hw_ep_num = 2, .fifo_size = 512, .nr_banks = 2, },
367{ .hw_ep_num = 3, .fifo_size = 8, .nr_banks = 2, },
368{ .hw_ep_num = 4, .fifo_size = 512, .nr_banks = 2, },
369{ .hw_ep_num = 5, .fifo_size = 512, .nr_banks = 2, },
370{ .hw_ep_num = 6, .fifo_size = 16, .nr_banks = 2, },
371{ .hw_ep_num = 7, .fifo_size = 8, .nr_banks = 2, },
372{ .hw_ep_num = 8, .fifo_size = 8, .nr_banks = 2, },
373};
374/* Add additional configurations here */
375
Cristian Birsanfbf49872017-03-28 19:07:37 +0300376static int usba_config_fifo_table(struct usba_udc *udc)
Cristian Birsan741d2552017-01-23 16:45:59 +0200377{
378 int n;
379
380 switch (fifo_mode) {
381 default:
382 fifo_mode = 0;
383 case 0:
384 udc->fifo_cfg = NULL;
385 n = 0;
386 break;
387 case 1:
388 udc->fifo_cfg = mode_1_cfg;
389 n = ARRAY_SIZE(mode_1_cfg);
390 break;
391 case 2:
392 udc->fifo_cfg = mode_2_cfg;
393 n = ARRAY_SIZE(mode_2_cfg);
394 break;
395 case 3:
396 udc->fifo_cfg = mode_3_cfg;
397 n = ARRAY_SIZE(mode_3_cfg);
398 break;
399 case 4:
400 udc->fifo_cfg = mode_4_cfg;
401 n = ARRAY_SIZE(mode_4_cfg);
402 break;
403 }
404 DBG(DBG_HW, "Setup fifo_mode %d\n", fifo_mode);
405
406 return n;
407}
408
Boris Brezillone3a912a2015-01-06 14:47:02 +0100409static inline u32 usba_int_enb_get(struct usba_udc *udc)
410{
411 return udc->int_enb_cache;
412}
413
414static inline void usba_int_enb_set(struct usba_udc *udc, u32 val)
415{
416 usba_writel(udc, INT_ENB, val);
417 udc->int_enb_cache = val;
418}
419
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700420static int vbus_is_present(struct usba_udc *udc)
421{
Hans-Christian Egtvedt472a6782009-03-24 15:45:20 +0100422 if (gpio_is_valid(udc->vbus_pin))
Eirik Aanonsen640e95a2010-02-05 09:49:25 +0100423 return gpio_get_value(udc->vbus_pin) ^ udc->vbus_pin_inverted;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700424
425 /* No Vbus detection: Assume always present */
426 return 1;
427}
428
Boris Brezillon3280e672015-01-06 14:46:58 +0100429static void toggle_bias(struct usba_udc *udc, int is_on)
Stelian Pop16a45bc2008-04-05 22:25:47 +0200430{
Boris Brezillon3280e672015-01-06 14:46:58 +0100431 if (udc->errata && udc->errata->toggle_bias)
432 udc->errata->toggle_bias(udc, is_on);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700433}
434
Boris Brezillon258e2dd2015-01-06 14:46:59 +0100435static void generate_bias_pulse(struct usba_udc *udc)
436{
437 if (!udc->bias_pulse_needed)
438 return;
439
440 if (udc->errata && udc->errata->pulse_bias)
441 udc->errata->pulse_bias(udc);
442
443 udc->bias_pulse_needed = false;
444}
445
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700446static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req)
447{
448 unsigned int transaction_len;
449
450 transaction_len = req->req.length - req->req.actual;
451 req->last_transaction = 1;
452 if (transaction_len > ep->ep.maxpacket) {
453 transaction_len = ep->ep.maxpacket;
454 req->last_transaction = 0;
455 } else if (transaction_len == ep->ep.maxpacket && req->req.zero)
456 req->last_transaction = 0;
457
458 DBG(DBG_QUEUE, "%s: submit_transaction, req %p (length %d)%s\n",
459 ep->ep.name, req, transaction_len,
460 req->last_transaction ? ", done" : "");
461
Haavard Skinnemoen5d4c27072008-03-04 15:48:37 +0100462 memcpy_toio(ep->fifo, req->req.buf + req->req.actual, transaction_len);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700463 usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
464 req->req.actual += transaction_len;
465}
466
467static void submit_request(struct usba_ep *ep, struct usba_request *req)
468{
469 DBG(DBG_QUEUE, "%s: submit_request: req %p (length %d)\n",
470 ep->ep.name, req, req->req.length);
471
472 req->req.actual = 0;
473 req->submitted = 1;
474
475 if (req->using_dma) {
476 if (req->req.length == 0) {
477 usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
478 return;
479 }
480
481 if (req->req.zero)
482 usba_ep_writel(ep, CTL_ENB, USBA_SHORT_PACKET);
483 else
484 usba_ep_writel(ep, CTL_DIS, USBA_SHORT_PACKET);
485
486 usba_dma_writel(ep, ADDRESS, req->req.dma);
487 usba_dma_writel(ep, CONTROL, req->ctrl);
488 } else {
489 next_fifo_transaction(ep, req);
490 if (req->last_transaction) {
491 usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
492 usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
493 } else {
494 usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
495 usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
496 }
497 }
498}
499
500static void submit_next_request(struct usba_ep *ep)
501{
502 struct usba_request *req;
503
504 if (list_empty(&ep->queue)) {
505 usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY | USBA_RX_BK_RDY);
506 return;
507 }
508
509 req = list_entry(ep->queue.next, struct usba_request, queue);
510 if (!req->submitted)
511 submit_request(ep, req);
512}
513
514static void send_status(struct usba_udc *udc, struct usba_ep *ep)
515{
516 ep->state = STATUS_STAGE_IN;
517 usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
518 usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
519}
520
521static void receive_data(struct usba_ep *ep)
522{
523 struct usba_udc *udc = ep->udc;
524 struct usba_request *req;
525 unsigned long status;
526 unsigned int bytecount, nr_busy;
527 int is_complete = 0;
528
529 status = usba_ep_readl(ep, STA);
530 nr_busy = USBA_BFEXT(BUSY_BANKS, status);
531
532 DBG(DBG_QUEUE, "receive data: nr_busy=%u\n", nr_busy);
533
534 while (nr_busy > 0) {
535 if (list_empty(&ep->queue)) {
536 usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
537 break;
538 }
539 req = list_entry(ep->queue.next,
540 struct usba_request, queue);
541
542 bytecount = USBA_BFEXT(BYTE_COUNT, status);
543
544 if (status & (1 << 31))
545 is_complete = 1;
546 if (req->req.actual + bytecount >= req->req.length) {
547 is_complete = 1;
548 bytecount = req->req.length - req->req.actual;
549 }
550
Haavard Skinnemoen5d4c27072008-03-04 15:48:37 +0100551 memcpy_fromio(req->req.buf + req->req.actual,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700552 ep->fifo, bytecount);
553 req->req.actual += bytecount;
554
555 usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
556
557 if (is_complete) {
558 DBG(DBG_QUEUE, "%s: request done\n", ep->ep.name);
559 req->req.status = 0;
560 list_del_init(&req->queue);
561 usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
562 spin_unlock(&udc->lock);
Michal Sojka304f7e52014-09-24 22:43:19 +0200563 usb_gadget_giveback_request(&ep->ep, &req->req);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700564 spin_lock(&udc->lock);
565 }
566
567 status = usba_ep_readl(ep, STA);
568 nr_busy = USBA_BFEXT(BUSY_BANKS, status);
569
570 if (is_complete && ep_is_control(ep)) {
571 send_status(udc, ep);
572 break;
573 }
574 }
575}
576
577static void
578request_complete(struct usba_ep *ep, struct usba_request *req, int status)
579{
580 struct usba_udc *udc = ep->udc;
581
582 WARN_ON(!list_empty(&req->queue));
583
584 if (req->req.status == -EINPROGRESS)
585 req->req.status = status;
586
Felipe Balbi1bda9df2013-01-28 16:57:02 +0200587 if (req->using_dma)
588 usb_gadget_unmap_request(&udc->gadget, &req->req, ep->is_in);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700589
590 DBG(DBG_GADGET | DBG_REQ,
591 "%s: req %p complete: status %d, actual %u\n",
592 ep->ep.name, req, req->req.status, req->req.actual);
593
594 spin_unlock(&udc->lock);
Michal Sojka304f7e52014-09-24 22:43:19 +0200595 usb_gadget_giveback_request(&ep->ep, &req->req);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700596 spin_lock(&udc->lock);
597}
598
599static void
600request_complete_list(struct usba_ep *ep, struct list_head *list, int status)
601{
602 struct usba_request *req, *tmp_req;
603
604 list_for_each_entry_safe(req, tmp_req, list, queue) {
605 list_del_init(&req->queue);
606 request_complete(ep, req, status);
607 }
608}
609
610static int
611usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
612{
613 struct usba_ep *ep = to_usba_ep(_ep);
614 struct usba_udc *udc = ep->udc;
Arnd Bergmann424282022017-02-22 11:33:27 +0100615 unsigned long flags, maxpacket;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700616 unsigned int nr_trans;
617
618 DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc);
619
Felipe Balbi44fbbf12016-09-28 14:17:38 +0300620 maxpacket = usb_endpoint_maxp(desc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700621
622 if (((desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK) != ep->index)
623 || ep->index == 0
624 || desc->bDescriptorType != USB_DT_ENDPOINT
625 || maxpacket == 0
626 || maxpacket > ep->fifo_size) {
627 DBG(DBG_ERR, "ep_enable: Invalid argument");
628 return -EINVAL;
629 }
630
631 ep->is_isoc = 0;
632 ep->is_in = 0;
633
Cristian Birsan741d2552017-01-23 16:45:59 +0200634 DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n",
Arnd Bergmann424282022017-02-22 11:33:27 +0100635 ep->ep.name, ep->ept_cfg, maxpacket);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700636
Matthias Kaehlcke71de6b62009-04-15 22:27:49 +0200637 if (usb_endpoint_dir_in(desc)) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700638 ep->is_in = 1;
Cristian Birsan741d2552017-01-23 16:45:59 +0200639 ep->ept_cfg |= USBA_EPT_DIR_IN;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700640 }
641
Matthias Kaehlcke71de6b62009-04-15 22:27:49 +0200642 switch (usb_endpoint_type(desc)) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700643 case USB_ENDPOINT_XFER_CONTROL:
Cristian Birsan741d2552017-01-23 16:45:59 +0200644 ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_CONTROL);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700645 break;
646 case USB_ENDPOINT_XFER_ISOC:
647 if (!ep->can_isoc) {
648 DBG(DBG_ERR, "ep_enable: %s is not isoc capable\n",
649 ep->ep.name);
650 return -EINVAL;
651 }
652
653 /*
654 * Bits 11:12 specify number of _additional_
655 * transactions per microframe.
656 */
Felipe Balbif0419d92016-09-28 13:28:44 +0300657 nr_trans = usb_endpoint_maxp_mult(desc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700658 if (nr_trans > 3)
659 return -EINVAL;
660
661 ep->is_isoc = 1;
Cristian Birsan741d2552017-01-23 16:45:59 +0200662 ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_ISO);
663 ep->ept_cfg |= USBA_BF(NB_TRANS, nr_trans);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700664
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700665 break;
666 case USB_ENDPOINT_XFER_BULK:
Cristian Birsan741d2552017-01-23 16:45:59 +0200667 ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700668 break;
669 case USB_ENDPOINT_XFER_INT:
Cristian Birsan741d2552017-01-23 16:45:59 +0200670 ep->ept_cfg |= USBA_BF(EPT_TYPE, USBA_EPT_TYPE_INT);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700671 break;
672 }
673
674 spin_lock_irqsave(&ep->udc->lock, flags);
675
Ido Shayevitz978def12012-03-12 20:25:27 +0200676 ep->ep.desc = desc;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700677 ep->ep.maxpacket = maxpacket;
678
Cristian Birsan741d2552017-01-23 16:45:59 +0200679 usba_ep_writel(ep, CFG, ep->ept_cfg);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700680 usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
681
682 if (ep->can_dma) {
683 u32 ctrl;
684
Boris Brezillone3a912a2015-01-06 14:47:02 +0100685 usba_int_enb_set(udc, usba_int_enb_get(udc) |
686 USBA_BF(EPT_INT, 1 << ep->index) |
687 USBA_BF(DMA_INT, 1 << ep->index));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700688 ctrl = USBA_AUTO_VALID | USBA_INTDIS_DMA;
689 usba_ep_writel(ep, CTL_ENB, ctrl);
690 } else {
Boris Brezillone3a912a2015-01-06 14:47:02 +0100691 usba_int_enb_set(udc, usba_int_enb_get(udc) |
692 USBA_BF(EPT_INT, 1 << ep->index));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700693 }
694
695 spin_unlock_irqrestore(&udc->lock, flags);
696
697 DBG(DBG_HW, "EPT_CFG%d after init: %#08lx\n", ep->index,
698 (unsigned long)usba_ep_readl(ep, CFG));
699 DBG(DBG_HW, "INT_ENB after init: %#08lx\n",
Boris Brezillone3a912a2015-01-06 14:47:02 +0100700 (unsigned long)usba_int_enb_get(udc));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700701
702 return 0;
703}
704
705static int usba_ep_disable(struct usb_ep *_ep)
706{
707 struct usba_ep *ep = to_usba_ep(_ep);
708 struct usba_udc *udc = ep->udc;
709 LIST_HEAD(req_list);
710 unsigned long flags;
711
712 DBG(DBG_GADGET, "ep_disable: %s\n", ep->ep.name);
713
714 spin_lock_irqsave(&udc->lock, flags);
715
Ido Shayevitz978def12012-03-12 20:25:27 +0200716 if (!ep->ep.desc) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700717 spin_unlock_irqrestore(&udc->lock, flags);
David Brownell40517702008-05-10 22:46:38 -0700718 /* REVISIT because this driver disables endpoints in
719 * reset_all_endpoints() before calling disconnect(),
720 * most gadget drivers would trigger this non-error ...
721 */
722 if (udc->gadget.speed != USB_SPEED_UNKNOWN)
723 DBG(DBG_ERR, "ep_disable: %s not enabled\n",
724 ep->ep.name);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700725 return -EINVAL;
726 }
Ido Shayevitzf9c56cd2012-02-08 13:56:48 +0200727 ep->ep.desc = NULL;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700728
729 list_splice_init(&ep->queue, &req_list);
730 if (ep->can_dma) {
731 usba_dma_writel(ep, CONTROL, 0);
732 usba_dma_writel(ep, ADDRESS, 0);
733 usba_dma_readl(ep, STATUS);
734 }
735 usba_ep_writel(ep, CTL_DIS, USBA_EPT_ENABLE);
Boris Brezillone3a912a2015-01-06 14:47:02 +0100736 usba_int_enb_set(udc, usba_int_enb_get(udc) &
737 ~USBA_BF(EPT_INT, 1 << ep->index));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700738
739 request_complete_list(ep, &req_list, -ESHUTDOWN);
740
741 spin_unlock_irqrestore(&udc->lock, flags);
742
743 return 0;
744}
745
746static struct usb_request *
747usba_ep_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
748{
749 struct usba_request *req;
750
751 DBG(DBG_GADGET, "ep_alloc_request: %p, 0x%x\n", _ep, gfp_flags);
752
753 req = kzalloc(sizeof(*req), gfp_flags);
754 if (!req)
755 return NULL;
756
757 INIT_LIST_HEAD(&req->queue);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700758
759 return &req->req;
760}
761
762static void
763usba_ep_free_request(struct usb_ep *_ep, struct usb_request *_req)
764{
765 struct usba_request *req = to_usba_req(_req);
766
767 DBG(DBG_GADGET, "ep_free_request: %p, %p\n", _ep, _req);
768
769 kfree(req);
770}
771
772static int queue_dma(struct usba_udc *udc, struct usba_ep *ep,
773 struct usba_request *req, gfp_t gfp_flags)
774{
775 unsigned long flags;
776 int ret;
777
Felipe Balbi7a64c722015-05-26 15:34:45 -0500778 DBG(DBG_DMA, "%s: req l/%u d/%pad %c%c%c\n",
779 ep->ep.name, req->req.length, &req->req.dma,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700780 req->req.zero ? 'Z' : 'z',
781 req->req.short_not_ok ? 'S' : 's',
782 req->req.no_interrupt ? 'I' : 'i');
783
784 if (req->req.length > 0x10000) {
785 /* Lengths from 0 to 65536 (inclusive) are supported */
786 DBG(DBG_ERR, "invalid request length %u\n", req->req.length);
787 return -EINVAL;
788 }
789
Felipe Balbi1bda9df2013-01-28 16:57:02 +0200790 ret = usb_gadget_map_request(&udc->gadget, &req->req, ep->is_in);
791 if (ret)
792 return ret;
793
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700794 req->using_dma = 1;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700795 req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length)
796 | USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE
Bo Shenf40afddd2014-12-17 17:18:48 +0800797 | USBA_DMA_END_BUF_EN;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700798
Bo Shenf40afddd2014-12-17 17:18:48 +0800799 if (!ep->is_in)
800 req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700801
802 /*
803 * Add this request to the queue and submit for DMA if
804 * possible. Check if we're still alive first -- we may have
805 * received a reset since last time we checked.
806 */
807 ret = -ESHUTDOWN;
808 spin_lock_irqsave(&udc->lock, flags);
Ido Shayevitz978def12012-03-12 20:25:27 +0200809 if (ep->ep.desc) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700810 if (list_empty(&ep->queue))
811 submit_request(ep, req);
812
813 list_add_tail(&req->queue, &ep->queue);
814 ret = 0;
815 }
816 spin_unlock_irqrestore(&udc->lock, flags);
817
818 return ret;
819}
820
821static int
822usba_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
823{
824 struct usba_request *req = to_usba_req(_req);
825 struct usba_ep *ep = to_usba_ep(_ep);
826 struct usba_udc *udc = ep->udc;
827 unsigned long flags;
828 int ret;
829
830 DBG(DBG_GADGET | DBG_QUEUE | DBG_REQ, "%s: queue req %p, len %u\n",
831 ep->ep.name, req, _req->length);
832
Ido Shayevitz978def12012-03-12 20:25:27 +0200833 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN ||
834 !ep->ep.desc)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700835 return -ESHUTDOWN;
836
837 req->submitted = 0;
838 req->using_dma = 0;
839 req->last_transaction = 0;
840
841 _req->status = -EINPROGRESS;
842 _req->actual = 0;
843
844 if (ep->can_dma)
845 return queue_dma(udc, ep, req, gfp_flags);
846
847 /* May have received a reset since last time we checked */
848 ret = -ESHUTDOWN;
849 spin_lock_irqsave(&udc->lock, flags);
Ido Shayevitz978def12012-03-12 20:25:27 +0200850 if (ep->ep.desc) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700851 list_add_tail(&req->queue, &ep->queue);
852
Martin Fuzzeyf42706c2009-05-01 17:21:11 +0200853 if ((!ep_is_control(ep) && ep->is_in) ||
854 (ep_is_control(ep)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700855 && (ep->state == DATA_STAGE_IN
856 || ep->state == STATUS_STAGE_IN)))
857 usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY);
858 else
859 usba_ep_writel(ep, CTL_ENB, USBA_RX_BK_RDY);
860 ret = 0;
861 }
862 spin_unlock_irqrestore(&udc->lock, flags);
863
864 return ret;
865}
866
867static void
868usba_update_req(struct usba_ep *ep, struct usba_request *req, u32 status)
869{
870 req->req.actual = req->req.length - USBA_BFEXT(DMA_BUF_LEN, status);
871}
872
873static int stop_dma(struct usba_ep *ep, u32 *pstatus)
874{
875 unsigned int timeout;
876 u32 status;
877
878 /*
879 * Stop the DMA controller. When writing both CH_EN
880 * and LINK to 0, the other bits are not affected.
881 */
882 usba_dma_writel(ep, CONTROL, 0);
883
884 /* Wait for the FIFO to empty */
885 for (timeout = 40; timeout; --timeout) {
886 status = usba_dma_readl(ep, STATUS);
887 if (!(status & USBA_DMA_CH_EN))
888 break;
889 udelay(1);
890 }
891
892 if (pstatus)
893 *pstatus = status;
894
895 if (timeout == 0) {
896 dev_err(&ep->udc->pdev->dev,
897 "%s: timed out waiting for DMA FIFO to empty\n",
898 ep->ep.name);
899 return -ETIMEDOUT;
900 }
901
902 return 0;
903}
904
905static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
906{
907 struct usba_ep *ep = to_usba_ep(_ep);
908 struct usba_udc *udc = ep->udc;
Songjun Wu5fb694f2015-01-09 17:11:24 +0100909 struct usba_request *req;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700910 unsigned long flags;
911 u32 status;
912
913 DBG(DBG_GADGET | DBG_QUEUE, "ep_dequeue: %s, req %p\n",
914 ep->ep.name, req);
915
916 spin_lock_irqsave(&udc->lock, flags);
917
Songjun Wu5fb694f2015-01-09 17:11:24 +0100918 list_for_each_entry(req, &ep->queue, queue) {
919 if (&req->req == _req)
920 break;
921 }
922
923 if (&req->req != _req) {
924 spin_unlock_irqrestore(&udc->lock, flags);
925 return -EINVAL;
926 }
927
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700928 if (req->using_dma) {
929 /*
930 * If this request is currently being transferred,
931 * stop the DMA controller and reset the FIFO.
932 */
933 if (ep->queue.next == &req->queue) {
934 status = usba_dma_readl(ep, STATUS);
935 if (status & USBA_DMA_CH_EN)
936 stop_dma(ep, &status);
937
938#ifdef CONFIG_USB_GADGET_DEBUG_FS
939 ep->last_dma_status = status;
940#endif
941
942 usba_writel(udc, EPT_RST, 1 << ep->index);
943
944 usba_update_req(ep, req, status);
945 }
946 }
947
948 /*
949 * Errors should stop the queue from advancing until the
950 * completion function returns.
951 */
952 list_del_init(&req->queue);
953
954 request_complete(ep, req, -ECONNRESET);
955
956 /* Process the next request if any */
957 submit_next_request(ep);
958 spin_unlock_irqrestore(&udc->lock, flags);
959
960 return 0;
961}
962
963static int usba_ep_set_halt(struct usb_ep *_ep, int value)
964{
965 struct usba_ep *ep = to_usba_ep(_ep);
966 struct usba_udc *udc = ep->udc;
967 unsigned long flags;
968 int ret = 0;
969
970 DBG(DBG_GADGET, "endpoint %s: %s HALT\n", ep->ep.name,
971 value ? "set" : "clear");
972
Ido Shayevitz978def12012-03-12 20:25:27 +0200973 if (!ep->ep.desc) {
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -0700974 DBG(DBG_ERR, "Attempted to halt uninitialized ep %s\n",
975 ep->ep.name);
976 return -ENODEV;
977 }
978 if (ep->is_isoc) {
979 DBG(DBG_ERR, "Attempted to halt isochronous ep %s\n",
980 ep->ep.name);
981 return -ENOTTY;
982 }
983
984 spin_lock_irqsave(&udc->lock, flags);
985
986 /*
987 * We can't halt IN endpoints while there are still data to be
988 * transferred
989 */
990 if (!list_empty(&ep->queue)
991 || ((value && ep->is_in && (usba_ep_readl(ep, STA)
992 & USBA_BF(BUSY_BANKS, -1L))))) {
993 ret = -EAGAIN;
994 } else {
995 if (value)
996 usba_ep_writel(ep, SET_STA, USBA_FORCE_STALL);
997 else
998 usba_ep_writel(ep, CLR_STA,
999 USBA_FORCE_STALL | USBA_TOGGLE_CLR);
1000 usba_ep_readl(ep, STA);
1001 }
1002
1003 spin_unlock_irqrestore(&udc->lock, flags);
1004
1005 return ret;
1006}
1007
1008static int usba_ep_fifo_status(struct usb_ep *_ep)
1009{
1010 struct usba_ep *ep = to_usba_ep(_ep);
1011
1012 return USBA_BFEXT(BYTE_COUNT, usba_ep_readl(ep, STA));
1013}
1014
1015static void usba_ep_fifo_flush(struct usb_ep *_ep)
1016{
1017 struct usba_ep *ep = to_usba_ep(_ep);
1018 struct usba_udc *udc = ep->udc;
1019
1020 usba_writel(udc, EPT_RST, 1 << ep->index);
1021}
1022
1023static const struct usb_ep_ops usba_ep_ops = {
1024 .enable = usba_ep_enable,
1025 .disable = usba_ep_disable,
1026 .alloc_request = usba_ep_alloc_request,
1027 .free_request = usba_ep_free_request,
1028 .queue = usba_ep_queue,
1029 .dequeue = usba_ep_dequeue,
1030 .set_halt = usba_ep_set_halt,
1031 .fifo_status = usba_ep_fifo_status,
1032 .fifo_flush = usba_ep_fifo_flush,
1033};
1034
1035static int usba_udc_get_frame(struct usb_gadget *gadget)
1036{
1037 struct usba_udc *udc = to_usba_udc(gadget);
1038
1039 return USBA_BFEXT(FRAME_NUMBER, usba_readl(udc, FNUM));
1040}
1041
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001042static int usba_udc_wakeup(struct usb_gadget *gadget)
1043{
1044 struct usba_udc *udc = to_usba_udc(gadget);
1045 unsigned long flags;
1046 u32 ctrl;
1047 int ret = -EINVAL;
1048
1049 spin_lock_irqsave(&udc->lock, flags);
1050 if (udc->devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) {
1051 ctrl = usba_readl(udc, CTRL);
1052 usba_writel(udc, CTRL, ctrl | USBA_REMOTE_WAKE_UP);
1053 ret = 0;
1054 }
1055 spin_unlock_irqrestore(&udc->lock, flags);
1056
1057 return ret;
1058}
1059
1060static int
1061usba_udc_set_selfpowered(struct usb_gadget *gadget, int is_selfpowered)
1062{
1063 struct usba_udc *udc = to_usba_udc(gadget);
1064 unsigned long flags;
1065
Peter Chend618c362015-01-28 16:32:38 +08001066 gadget->is_selfpowered = (is_selfpowered != 0);
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001067 spin_lock_irqsave(&udc->lock, flags);
1068 if (is_selfpowered)
1069 udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED;
1070 else
1071 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
1072 spin_unlock_irqrestore(&udc->lock, flags);
1073
1074 return 0;
1075}
1076
Sebastian Andrzej Siewiord809f782012-02-04 18:55:24 +01001077static int atmel_usba_start(struct usb_gadget *gadget,
1078 struct usb_gadget_driver *driver);
Felipe Balbi22835b82014-10-17 12:05:12 -05001079static int atmel_usba_stop(struct usb_gadget *gadget);
1080
Cristian Birsanfbf49872017-03-28 19:07:37 +03001081static struct usb_ep *atmel_usba_match_ep(struct usb_gadget *gadget,
1082 struct usb_endpoint_descriptor *desc,
1083 struct usb_ss_ep_comp_descriptor *ep_comp)
Cristian Birsan741d2552017-01-23 16:45:59 +02001084{
1085 struct usb_ep *_ep;
1086 struct usba_ep *ep;
1087
1088 /* Look at endpoints until an unclaimed one looks usable */
1089 list_for_each_entry(_ep, &gadget->ep_list, ep_list) {
1090 if (usb_gadget_ep_match_desc(gadget, _ep, desc, ep_comp))
1091 goto found_ep;
1092 }
1093 /* Fail */
1094 return NULL;
1095
1096found_ep:
1097
1098 if (fifo_mode == 0) {
1099 /* Optimize hw fifo size based on ep type and other info */
1100 ep = to_usba_ep(_ep);
1101
1102 switch (usb_endpoint_type(desc)) {
Cristian Birsan741d2552017-01-23 16:45:59 +02001103 case USB_ENDPOINT_XFER_CONTROL:
1104 break;
1105
1106 case USB_ENDPOINT_XFER_ISOC:
1107 ep->fifo_size = 1024;
1108 ep->nr_banks = 2;
1109 break;
1110
1111 case USB_ENDPOINT_XFER_BULK:
1112 ep->fifo_size = 512;
1113 ep->nr_banks = 1;
1114 break;
1115
1116 case USB_ENDPOINT_XFER_INT:
1117 if (desc->wMaxPacketSize == 0)
1118 ep->fifo_size =
1119 roundup_pow_of_two(_ep->maxpacket_limit);
1120 else
1121 ep->fifo_size =
1122 roundup_pow_of_two(le16_to_cpu(desc->wMaxPacketSize));
1123 ep->nr_banks = 1;
1124 break;
1125 }
1126
1127 /* It might be a little bit late to set this */
1128 usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
1129
1130 /* Generate ept_cfg basd on FIFO size and number of banks */
1131 if (ep->fifo_size <= 8)
1132 ep->ept_cfg = USBA_BF(EPT_SIZE, USBA_EPT_SIZE_8);
1133 else
1134 /* LSB is bit 1, not 0 */
1135 ep->ept_cfg =
1136 USBA_BF(EPT_SIZE, fls(ep->fifo_size - 1) - 3);
1137
1138 ep->ept_cfg |= USBA_BF(BK_NUMBER, ep->nr_banks);
1139
1140 ep->udc->configured_ep++;
1141 }
1142
Cristian Birsanfbf49872017-03-28 19:07:37 +03001143 return _ep;
Cristian Birsan741d2552017-01-23 16:45:59 +02001144}
1145
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001146static const struct usb_gadget_ops usba_udc_ops = {
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001147 .get_frame = usba_udc_get_frame,
1148 .wakeup = usba_udc_wakeup,
1149 .set_selfpowered = usba_udc_set_selfpowered,
Sebastian Andrzej Siewiord809f782012-02-04 18:55:24 +01001150 .udc_start = atmel_usba_start,
1151 .udc_stop = atmel_usba_stop,
Cristian Birsan741d2552017-01-23 16:45:59 +02001152 .match_ep = atmel_usba_match_ep,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001153};
1154
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001155static struct usb_endpoint_descriptor usba_ep0_desc = {
1156 .bLength = USB_DT_ENDPOINT_SIZE,
1157 .bDescriptorType = USB_DT_ENDPOINT,
1158 .bEndpointAddress = 0,
1159 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
Harvey Harrison551509d2009-02-11 14:11:36 -08001160 .wMaxPacketSize = cpu_to_le16(64),
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001161 /* FIXME: I have no idea what to put here */
1162 .bInterval = 1,
1163};
1164
Jingoo Han5056ee82013-12-16 15:14:23 +09001165static struct usb_gadget usba_gadget_template = {
Jean-Christophe PLAGNIOL-VILLARDe8f2ea32013-05-20 22:46:02 +08001166 .ops = &usba_udc_ops,
1167 .max_speed = USB_SPEED_HIGH,
1168 .name = "atmel_usba_udc",
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001169};
1170
1171/*
1172 * Called with interrupts disabled and udc->lock held.
1173 */
1174static void reset_all_endpoints(struct usba_udc *udc)
1175{
1176 struct usba_ep *ep;
1177 struct usba_request *req, *tmp_req;
1178
1179 usba_writel(udc, EPT_RST, ~0UL);
1180
1181 ep = to_usba_ep(udc->gadget.ep0);
1182 list_for_each_entry_safe(req, tmp_req, &ep->queue, queue) {
1183 list_del_init(&req->queue);
1184 request_complete(ep, req, -ECONNRESET);
1185 }
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001186}
1187
1188static struct usba_ep *get_ep_by_addr(struct usba_udc *udc, u16 wIndex)
1189{
1190 struct usba_ep *ep;
1191
1192 if ((wIndex & USB_ENDPOINT_NUMBER_MASK) == 0)
1193 return to_usba_ep(udc->gadget.ep0);
1194
1195 list_for_each_entry (ep, &udc->gadget.ep_list, ep.ep_list) {
1196 u8 bEndpointAddress;
1197
Ido Shayevitz978def12012-03-12 20:25:27 +02001198 if (!ep->ep.desc)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001199 continue;
Ido Shayevitz978def12012-03-12 20:25:27 +02001200 bEndpointAddress = ep->ep.desc->bEndpointAddress;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001201 if ((wIndex ^ bEndpointAddress) & USB_DIR_IN)
1202 continue;
1203 if ((bEndpointAddress & USB_ENDPOINT_NUMBER_MASK)
1204 == (wIndex & USB_ENDPOINT_NUMBER_MASK))
1205 return ep;
1206 }
1207
1208 return NULL;
1209}
1210
1211/* Called with interrupts disabled and udc->lock held */
1212static inline void set_protocol_stall(struct usba_udc *udc, struct usba_ep *ep)
1213{
1214 usba_ep_writel(ep, SET_STA, USBA_FORCE_STALL);
1215 ep->state = WAIT_FOR_SETUP;
1216}
1217
1218static inline int is_stalled(struct usba_udc *udc, struct usba_ep *ep)
1219{
1220 if (usba_ep_readl(ep, STA) & USBA_FORCE_STALL)
1221 return 1;
1222 return 0;
1223}
1224
1225static inline void set_address(struct usba_udc *udc, unsigned int addr)
1226{
1227 u32 regval;
1228
1229 DBG(DBG_BUS, "setting address %u...\n", addr);
1230 regval = usba_readl(udc, CTRL);
1231 regval = USBA_BFINS(DEV_ADDR, addr, regval);
1232 usba_writel(udc, CTRL, regval);
1233}
1234
1235static int do_test_mode(struct usba_udc *udc)
1236{
1237 static const char test_packet_buffer[] = {
1238 /* JKJKJKJK * 9 */
1239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1240 /* JJKKJJKK * 8 */
1241 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1242 /* JJKKJJKK * 8 */
1243 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
1244 /* JJJJJJJKKKKKKK * 8 */
1245 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1246 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1247 /* JJJJJJJK * 8 */
1248 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD,
1249 /* {JKKKKKKK * 10}, JK */
1250 0xFC, 0x7E, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0x7E
1251 };
1252 struct usba_ep *ep;
1253 struct device *dev = &udc->pdev->dev;
1254 int test_mode;
1255
1256 test_mode = udc->test_mode;
1257
1258 /* Start from a clean slate */
1259 reset_all_endpoints(udc);
1260
1261 switch (test_mode) {
1262 case 0x0100:
1263 /* Test_J */
1264 usba_writel(udc, TST, USBA_TST_J_MODE);
1265 dev_info(dev, "Entering Test_J mode...\n");
1266 break;
1267 case 0x0200:
1268 /* Test_K */
1269 usba_writel(udc, TST, USBA_TST_K_MODE);
1270 dev_info(dev, "Entering Test_K mode...\n");
1271 break;
1272 case 0x0300:
1273 /*
1274 * Test_SE0_NAK: Force high-speed mode and set up ep0
1275 * for Bulk IN transfers
1276 */
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001277 ep = &udc->usba_ep[0];
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001278 usba_writel(udc, TST,
1279 USBA_BF(SPEED_CFG, USBA_SPEED_CFG_FORCE_HIGH));
1280 usba_ep_writel(ep, CFG,
1281 USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64)
1282 | USBA_EPT_DIR_IN
1283 | USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK)
1284 | USBA_BF(BK_NUMBER, 1));
1285 if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED)) {
1286 set_protocol_stall(udc, ep);
1287 dev_err(dev, "Test_SE0_NAK: ep0 not mapped\n");
1288 } else {
1289 usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
1290 dev_info(dev, "Entering Test_SE0_NAK mode...\n");
1291 }
1292 break;
1293 case 0x0400:
1294 /* Test_Packet */
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001295 ep = &udc->usba_ep[0];
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001296 usba_ep_writel(ep, CFG,
1297 USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64)
1298 | USBA_EPT_DIR_IN
1299 | USBA_BF(EPT_TYPE, USBA_EPT_TYPE_BULK)
1300 | USBA_BF(BK_NUMBER, 1));
1301 if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED)) {
1302 set_protocol_stall(udc, ep);
1303 dev_err(dev, "Test_Packet: ep0 not mapped\n");
1304 } else {
1305 usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
1306 usba_writel(udc, TST, USBA_TST_PKT_MODE);
Haavard Skinnemoen5d4c27072008-03-04 15:48:37 +01001307 memcpy_toio(ep->fifo, test_packet_buffer,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001308 sizeof(test_packet_buffer));
1309 usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
1310 dev_info(dev, "Entering Test_Packet mode...\n");
1311 }
1312 break;
1313 default:
1314 dev_err(dev, "Invalid test mode: 0x%04x\n", test_mode);
1315 return -EINVAL;
1316 }
1317
1318 return 0;
1319}
1320
1321/* Avoid overly long expressions */
1322static inline bool feature_is_dev_remote_wakeup(struct usb_ctrlrequest *crq)
1323{
Harvey Harrison551509d2009-02-11 14:11:36 -08001324 if (crq->wValue == cpu_to_le16(USB_DEVICE_REMOTE_WAKEUP))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001325 return true;
1326 return false;
1327}
1328
1329static inline bool feature_is_dev_test_mode(struct usb_ctrlrequest *crq)
1330{
Harvey Harrison551509d2009-02-11 14:11:36 -08001331 if (crq->wValue == cpu_to_le16(USB_DEVICE_TEST_MODE))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001332 return true;
1333 return false;
1334}
1335
1336static inline bool feature_is_ep_halt(struct usb_ctrlrequest *crq)
1337{
Harvey Harrison551509d2009-02-11 14:11:36 -08001338 if (crq->wValue == cpu_to_le16(USB_ENDPOINT_HALT))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001339 return true;
1340 return false;
1341}
1342
1343static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep,
1344 struct usb_ctrlrequest *crq)
1345{
David Brownell40517702008-05-10 22:46:38 -07001346 int retval = 0;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001347
1348 switch (crq->bRequest) {
1349 case USB_REQ_GET_STATUS: {
1350 u16 status;
1351
1352 if (crq->bRequestType == (USB_DIR_IN | USB_RECIP_DEVICE)) {
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001353 status = cpu_to_le16(udc->devstatus);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001354 } else if (crq->bRequestType
1355 == (USB_DIR_IN | USB_RECIP_INTERFACE)) {
Harvey Harrison551509d2009-02-11 14:11:36 -08001356 status = cpu_to_le16(0);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001357 } else if (crq->bRequestType
1358 == (USB_DIR_IN | USB_RECIP_ENDPOINT)) {
1359 struct usba_ep *target;
1360
1361 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1362 if (!target)
1363 goto stall;
1364
1365 status = 0;
1366 if (is_stalled(udc, target))
Harvey Harrison551509d2009-02-11 14:11:36 -08001367 status |= cpu_to_le16(1);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001368 } else
1369 goto delegate;
1370
1371 /* Write directly to the FIFO. No queueing is done. */
Harvey Harrison551509d2009-02-11 14:11:36 -08001372 if (crq->wLength != cpu_to_le16(sizeof(status)))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001373 goto stall;
1374 ep->state = DATA_STAGE_IN;
Alexandre Bellonid423b9652017-06-16 13:30:18 +02001375 writew_relaxed(status, ep->fifo);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001376 usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
1377 break;
1378 }
1379
1380 case USB_REQ_CLEAR_FEATURE: {
1381 if (crq->bRequestType == USB_RECIP_DEVICE) {
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001382 if (feature_is_dev_remote_wakeup(crq))
1383 udc->devstatus
1384 &= ~(1 << USB_DEVICE_REMOTE_WAKEUP);
1385 else
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001386 /* Can't CLEAR_FEATURE TEST_MODE */
1387 goto stall;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001388 } else if (crq->bRequestType == USB_RECIP_ENDPOINT) {
1389 struct usba_ep *target;
1390
Harvey Harrison551509d2009-02-11 14:11:36 -08001391 if (crq->wLength != cpu_to_le16(0)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001392 || !feature_is_ep_halt(crq))
1393 goto stall;
1394 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1395 if (!target)
1396 goto stall;
1397
1398 usba_ep_writel(target, CLR_STA, USBA_FORCE_STALL);
1399 if (target->index != 0)
1400 usba_ep_writel(target, CLR_STA,
1401 USBA_TOGGLE_CLR);
1402 } else {
1403 goto delegate;
1404 }
1405
1406 send_status(udc, ep);
1407 break;
1408 }
1409
1410 case USB_REQ_SET_FEATURE: {
1411 if (crq->bRequestType == USB_RECIP_DEVICE) {
1412 if (feature_is_dev_test_mode(crq)) {
1413 send_status(udc, ep);
1414 ep->state = STATUS_STAGE_TEST;
1415 udc->test_mode = le16_to_cpu(crq->wIndex);
1416 return 0;
1417 } else if (feature_is_dev_remote_wakeup(crq)) {
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001418 udc->devstatus |= 1 << USB_DEVICE_REMOTE_WAKEUP;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001419 } else {
1420 goto stall;
1421 }
1422 } else if (crq->bRequestType == USB_RECIP_ENDPOINT) {
1423 struct usba_ep *target;
1424
Harvey Harrison551509d2009-02-11 14:11:36 -08001425 if (crq->wLength != cpu_to_le16(0)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001426 || !feature_is_ep_halt(crq))
1427 goto stall;
1428
1429 target = get_ep_by_addr(udc, le16_to_cpu(crq->wIndex));
1430 if (!target)
1431 goto stall;
1432
1433 usba_ep_writel(target, SET_STA, USBA_FORCE_STALL);
1434 } else
1435 goto delegate;
1436
1437 send_status(udc, ep);
1438 break;
1439 }
1440
1441 case USB_REQ_SET_ADDRESS:
1442 if (crq->bRequestType != (USB_DIR_OUT | USB_RECIP_DEVICE))
1443 goto delegate;
1444
1445 set_address(udc, le16_to_cpu(crq->wValue));
1446 send_status(udc, ep);
1447 ep->state = STATUS_STAGE_ADDR;
1448 break;
1449
1450 default:
1451delegate:
1452 spin_unlock(&udc->lock);
1453 retval = udc->driver->setup(&udc->gadget, crq);
1454 spin_lock(&udc->lock);
1455 }
1456
1457 return retval;
1458
1459stall:
David Brownell00274922007-11-19 12:58:36 -08001460 pr_err("udc: %s: Invalid setup request: %02x.%02x v%04x i%04x l%d, "
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001461 "halting endpoint...\n",
1462 ep->ep.name, crq->bRequestType, crq->bRequest,
1463 le16_to_cpu(crq->wValue), le16_to_cpu(crq->wIndex),
1464 le16_to_cpu(crq->wLength));
1465 set_protocol_stall(udc, ep);
1466 return -1;
1467}
1468
1469static void usba_control_irq(struct usba_udc *udc, struct usba_ep *ep)
1470{
1471 struct usba_request *req;
1472 u32 epstatus;
1473 u32 epctrl;
1474
1475restart:
1476 epstatus = usba_ep_readl(ep, STA);
1477 epctrl = usba_ep_readl(ep, CTL);
1478
1479 DBG(DBG_INT, "%s [%d]: s/%08x c/%08x\n",
1480 ep->ep.name, ep->state, epstatus, epctrl);
1481
1482 req = NULL;
1483 if (!list_empty(&ep->queue))
1484 req = list_entry(ep->queue.next,
1485 struct usba_request, queue);
1486
1487 if ((epctrl & USBA_TX_PK_RDY) && !(epstatus & USBA_TX_PK_RDY)) {
1488 if (req->submitted)
1489 next_fifo_transaction(ep, req);
1490 else
1491 submit_request(ep, req);
1492
1493 if (req->last_transaction) {
1494 usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
1495 usba_ep_writel(ep, CTL_ENB, USBA_TX_COMPLETE);
1496 }
1497 goto restart;
1498 }
1499 if ((epstatus & epctrl) & USBA_TX_COMPLETE) {
1500 usba_ep_writel(ep, CLR_STA, USBA_TX_COMPLETE);
1501
1502 switch (ep->state) {
1503 case DATA_STAGE_IN:
1504 usba_ep_writel(ep, CTL_ENB, USBA_RX_BK_RDY);
1505 usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1506 ep->state = STATUS_STAGE_OUT;
1507 break;
1508 case STATUS_STAGE_ADDR:
1509 /* Activate our new address */
1510 usba_writel(udc, CTRL, (usba_readl(udc, CTRL)
1511 | USBA_FADDR_EN));
1512 usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1513 ep->state = WAIT_FOR_SETUP;
1514 break;
1515 case STATUS_STAGE_IN:
1516 if (req) {
1517 list_del_init(&req->queue);
1518 request_complete(ep, req, 0);
1519 submit_next_request(ep);
1520 }
1521 usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1522 ep->state = WAIT_FOR_SETUP;
1523 break;
1524 case STATUS_STAGE_TEST:
1525 usba_ep_writel(ep, CTL_DIS, USBA_TX_COMPLETE);
1526 ep->state = WAIT_FOR_SETUP;
1527 if (do_test_mode(udc))
1528 set_protocol_stall(udc, ep);
1529 break;
1530 default:
David Brownell00274922007-11-19 12:58:36 -08001531 pr_err("udc: %s: TXCOMP: Invalid endpoint state %d, "
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001532 "halting endpoint...\n",
1533 ep->ep.name, ep->state);
1534 set_protocol_stall(udc, ep);
1535 break;
1536 }
1537
1538 goto restart;
1539 }
1540 if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
1541 switch (ep->state) {
1542 case STATUS_STAGE_OUT:
1543 usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
1544 usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
1545
1546 if (req) {
1547 list_del_init(&req->queue);
1548 request_complete(ep, req, 0);
1549 }
1550 ep->state = WAIT_FOR_SETUP;
1551 break;
1552
1553 case DATA_STAGE_OUT:
1554 receive_data(ep);
1555 break;
1556
1557 default:
1558 usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
1559 usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
David Brownell00274922007-11-19 12:58:36 -08001560 pr_err("udc: %s: RXRDY: Invalid endpoint state %d, "
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001561 "halting endpoint...\n",
1562 ep->ep.name, ep->state);
1563 set_protocol_stall(udc, ep);
1564 break;
1565 }
1566
1567 goto restart;
1568 }
1569 if (epstatus & USBA_RX_SETUP) {
1570 union {
1571 struct usb_ctrlrequest crq;
1572 unsigned long data[2];
1573 } crq;
1574 unsigned int pkt_len;
1575 int ret;
1576
1577 if (ep->state != WAIT_FOR_SETUP) {
1578 /*
1579 * Didn't expect a SETUP packet at this
1580 * point. Clean up any pending requests (which
1581 * may be successful).
1582 */
1583 int status = -EPROTO;
1584
1585 /*
1586 * RXRDY and TXCOMP are dropped when SETUP
1587 * packets arrive. Just pretend we received
1588 * the status packet.
1589 */
1590 if (ep->state == STATUS_STAGE_OUT
1591 || ep->state == STATUS_STAGE_IN) {
1592 usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
1593 status = 0;
1594 }
1595
1596 if (req) {
1597 list_del_init(&req->queue);
1598 request_complete(ep, req, status);
1599 }
1600 }
1601
1602 pkt_len = USBA_BFEXT(BYTE_COUNT, usba_ep_readl(ep, STA));
1603 DBG(DBG_HW, "Packet length: %u\n", pkt_len);
1604 if (pkt_len != sizeof(crq)) {
Joe Perches3f5ad862016-09-27 09:16:59 -07001605 pr_warn("udc: Invalid packet length %u (expected %zu)\n",
1606 pkt_len, sizeof(crq));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001607 set_protocol_stall(udc, ep);
1608 return;
1609 }
1610
1611 DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo);
Haavard Skinnemoen5d4c27072008-03-04 15:48:37 +01001612 memcpy_fromio(crq.data, ep->fifo, sizeof(crq));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001613
1614 /* Free up one bank in the FIFO so that we can
1615 * generate or receive a reply right away. */
1616 usba_ep_writel(ep, CLR_STA, USBA_RX_SETUP);
1617
1618 /* printk(KERN_DEBUG "setup: %d: %02x.%02x\n",
1619 ep->state, crq.crq.bRequestType,
1620 crq.crq.bRequest); */
1621
1622 if (crq.crq.bRequestType & USB_DIR_IN) {
1623 /*
1624 * The USB 2.0 spec states that "if wLength is
1625 * zero, there is no data transfer phase."
1626 * However, testusb #14 seems to actually
1627 * expect a data phase even if wLength = 0...
1628 */
1629 ep->state = DATA_STAGE_IN;
1630 } else {
Harvey Harrison551509d2009-02-11 14:11:36 -08001631 if (crq.crq.wLength != cpu_to_le16(0))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001632 ep->state = DATA_STAGE_OUT;
1633 else
1634 ep->state = STATUS_STAGE_IN;
1635 }
1636
1637 ret = -1;
1638 if (ep->index == 0)
1639 ret = handle_ep0_setup(udc, ep, &crq.crq);
1640 else {
1641 spin_unlock(&udc->lock);
1642 ret = udc->driver->setup(&udc->gadget, &crq.crq);
1643 spin_lock(&udc->lock);
1644 }
1645
1646 DBG(DBG_BUS, "req %02x.%02x, length %d, state %d, ret %d\n",
1647 crq.crq.bRequestType, crq.crq.bRequest,
1648 le16_to_cpu(crq.crq.wLength), ep->state, ret);
1649
1650 if (ret < 0) {
1651 /* Let the host know that we failed */
1652 set_protocol_stall(udc, ep);
1653 }
1654 }
1655}
1656
1657static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep)
1658{
1659 struct usba_request *req;
1660 u32 epstatus;
1661 u32 epctrl;
1662
1663 epstatus = usba_ep_readl(ep, STA);
1664 epctrl = usba_ep_readl(ep, CTL);
1665
1666 DBG(DBG_INT, "%s: interrupt, status: 0x%08x\n", ep->ep.name, epstatus);
1667
1668 while ((epctrl & USBA_TX_PK_RDY) && !(epstatus & USBA_TX_PK_RDY)) {
1669 DBG(DBG_BUS, "%s: TX PK ready\n", ep->ep.name);
1670
1671 if (list_empty(&ep->queue)) {
1672 dev_warn(&udc->pdev->dev, "ep_irq: queue empty\n");
1673 usba_ep_writel(ep, CTL_DIS, USBA_TX_PK_RDY);
1674 return;
1675 }
1676
1677 req = list_entry(ep->queue.next, struct usba_request, queue);
1678
1679 if (req->using_dma) {
1680 /* Send a zero-length packet */
1681 usba_ep_writel(ep, SET_STA,
1682 USBA_TX_PK_RDY);
1683 usba_ep_writel(ep, CTL_DIS,
1684 USBA_TX_PK_RDY);
1685 list_del_init(&req->queue);
1686 submit_next_request(ep);
1687 request_complete(ep, req, 0);
1688 } else {
1689 if (req->submitted)
1690 next_fifo_transaction(ep, req);
1691 else
1692 submit_request(ep, req);
1693
1694 if (req->last_transaction) {
1695 list_del_init(&req->queue);
1696 submit_next_request(ep);
1697 request_complete(ep, req, 0);
1698 }
1699 }
1700
1701 epstatus = usba_ep_readl(ep, STA);
1702 epctrl = usba_ep_readl(ep, CTL);
1703 }
1704 if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
1705 DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name);
1706 receive_data(ep);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001707 }
1708}
1709
1710static void usba_dma_irq(struct usba_udc *udc, struct usba_ep *ep)
1711{
1712 struct usba_request *req;
1713 u32 status, control, pending;
1714
1715 status = usba_dma_readl(ep, STATUS);
1716 control = usba_dma_readl(ep, CONTROL);
1717#ifdef CONFIG_USB_GADGET_DEBUG_FS
1718 ep->last_dma_status = status;
1719#endif
1720 pending = status & control;
1721 DBG(DBG_INT | DBG_DMA, "dma irq, s/%#08x, c/%#08x\n", status, control);
1722
1723 if (status & USBA_DMA_CH_EN) {
1724 dev_err(&udc->pdev->dev,
1725 "DMA_CH_EN is set after transfer is finished!\n");
1726 dev_err(&udc->pdev->dev,
1727 "status=%#08x, pending=%#08x, control=%#08x\n",
1728 status, pending, control);
1729
1730 /*
1731 * try to pretend nothing happened. We might have to
1732 * do something here...
1733 */
1734 }
1735
1736 if (list_empty(&ep->queue))
1737 /* Might happen if a reset comes along at the right moment */
1738 return;
1739
1740 if (pending & (USBA_DMA_END_TR_ST | USBA_DMA_END_BUF_ST)) {
1741 req = list_entry(ep->queue.next, struct usba_request, queue);
1742 usba_update_req(ep, req, status);
1743
1744 list_del_init(&req->queue);
1745 submit_next_request(ep);
1746 request_complete(ep, req, 0);
1747 }
1748}
1749
1750static irqreturn_t usba_udc_irq(int irq, void *devid)
1751{
1752 struct usba_udc *udc = devid;
Boris Brezillone3a912a2015-01-06 14:47:02 +01001753 u32 status, int_enb;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001754 u32 dma_status;
1755 u32 ep_status;
1756
1757 spin_lock(&udc->lock);
1758
Boris Brezillone3a912a2015-01-06 14:47:02 +01001759 int_enb = usba_int_enb_get(udc);
Douglas Gilbertd134c482015-11-16 19:22:08 +01001760 status = usba_readl(udc, INT_STA) & (int_enb | USBA_HIGH_SPEED);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001761 DBG(DBG_INT, "irq, status=%#08x\n", status);
1762
1763 if (status & USBA_DET_SUSPEND) {
Boris Brezillon3280e672015-01-06 14:46:58 +01001764 toggle_bias(udc, 0);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001765 usba_writel(udc, INT_CLR, USBA_DET_SUSPEND);
Boris Brezillone3a912a2015-01-06 14:47:02 +01001766 usba_int_enb_set(udc, int_enb | USBA_WAKE_UP);
Boris Brezillon258e2dd2015-01-06 14:46:59 +01001767 udc->bias_pulse_needed = true;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001768 DBG(DBG_BUS, "Suspend detected\n");
1769 if (udc->gadget.speed != USB_SPEED_UNKNOWN
1770 && udc->driver && udc->driver->suspend) {
1771 spin_unlock(&udc->lock);
1772 udc->driver->suspend(&udc->gadget);
1773 spin_lock(&udc->lock);
1774 }
1775 }
1776
1777 if (status & USBA_WAKE_UP) {
Boris Brezillon3280e672015-01-06 14:46:58 +01001778 toggle_bias(udc, 1);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001779 usba_writel(udc, INT_CLR, USBA_WAKE_UP);
Boris Brezillone3a912a2015-01-06 14:47:02 +01001780 usba_int_enb_set(udc, int_enb & ~USBA_WAKE_UP);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001781 DBG(DBG_BUS, "Wake Up CPU detected\n");
1782 }
1783
1784 if (status & USBA_END_OF_RESUME) {
1785 usba_writel(udc, INT_CLR, USBA_END_OF_RESUME);
Boris Brezillon258e2dd2015-01-06 14:46:59 +01001786 generate_bias_pulse(udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001787 DBG(DBG_BUS, "Resume detected\n");
1788 if (udc->gadget.speed != USB_SPEED_UNKNOWN
1789 && udc->driver && udc->driver->resume) {
1790 spin_unlock(&udc->lock);
1791 udc->driver->resume(&udc->gadget);
1792 spin_lock(&udc->lock);
1793 }
1794 }
1795
1796 dma_status = USBA_BFEXT(DMA_INT, status);
1797 if (dma_status) {
1798 int i;
1799
Bo Shenbcabdc22014-08-07 11:43:07 +08001800 for (i = 1; i <= USBA_NR_DMAS; i++)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001801 if (dma_status & (1 << i))
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001802 usba_dma_irq(udc, &udc->usba_ep[i]);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001803 }
1804
1805 ep_status = USBA_BFEXT(EPT_INT, status);
1806 if (ep_status) {
1807 int i;
1808
Bo Shenaa7be0f2014-02-19 10:07:43 +08001809 for (i = 0; i < udc->num_ep; i++)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001810 if (ep_status & (1 << i)) {
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001811 if (ep_is_control(&udc->usba_ep[i]))
1812 usba_control_irq(udc, &udc->usba_ep[i]);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001813 else
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001814 usba_ep_irq(udc, &udc->usba_ep[i]);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001815 }
1816 }
1817
1818 if (status & USBA_END_OF_RESET) {
Cristian Birsan741d2552017-01-23 16:45:59 +02001819 struct usba_ep *ep0, *ep;
1820 int i, n;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001821
1822 usba_writel(udc, INT_CLR, USBA_END_OF_RESET);
Boris Brezillon258e2dd2015-01-06 14:46:59 +01001823 generate_bias_pulse(udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001824 reset_all_endpoints(udc);
1825
Peter Chen39dd96d2014-11-06 14:28:09 +08001826 if (udc->gadget.speed != USB_SPEED_UNKNOWN && udc->driver) {
David Brownell40517702008-05-10 22:46:38 -07001827 udc->gadget.speed = USB_SPEED_UNKNOWN;
1828 spin_unlock(&udc->lock);
Peter Chen39dd96d2014-11-06 14:28:09 +08001829 usb_gadget_udc_reset(&udc->gadget, udc->driver);
David Brownell40517702008-05-10 22:46:38 -07001830 spin_lock(&udc->lock);
1831 }
1832
Michal Nazarewicze538dfd2011-08-30 17:11:19 +02001833 if (status & USBA_HIGH_SPEED)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001834 udc->gadget.speed = USB_SPEED_HIGH;
Michal Nazarewicze538dfd2011-08-30 17:11:19 +02001835 else
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001836 udc->gadget.speed = USB_SPEED_FULL;
Michal Nazarewicze538dfd2011-08-30 17:11:19 +02001837 DBG(DBG_BUS, "%s bus reset detected\n",
1838 usb_speed_string(udc->gadget.speed));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001839
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08001840 ep0 = &udc->usba_ep[0];
Ido Shayevitz978def12012-03-12 20:25:27 +02001841 ep0->ep.desc = &usba_ep0_desc;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001842 ep0->state = WAIT_FOR_SETUP;
1843 usba_ep_writel(ep0, CFG,
1844 (USBA_BF(EPT_SIZE, EP0_EPT_SIZE)
1845 | USBA_BF(EPT_TYPE, USBA_EPT_TYPE_CONTROL)
1846 | USBA_BF(BK_NUMBER, USBA_BK_NUMBER_ONE)));
1847 usba_ep_writel(ep0, CTL_ENB,
1848 USBA_EPT_ENABLE | USBA_RX_SETUP);
Boris Brezillone3a912a2015-01-06 14:47:02 +01001849 usba_int_enb_set(udc, int_enb | USBA_BF(EPT_INT, 1) |
1850 USBA_DET_SUSPEND | USBA_END_OF_RESUME);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001851
David Brownell40517702008-05-10 22:46:38 -07001852 /*
1853 * Unclear why we hit this irregularly, e.g. in usbtest,
1854 * but it's clearly harmless...
1855 */
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001856 if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED))
Cristian Birsanfcc9634c2017-04-07 19:07:21 +03001857 dev_err(&udc->pdev->dev,
1858 "ODD: EP0 configuration is invalid!\n");
Cristian Birsan741d2552017-01-23 16:45:59 +02001859
1860 /* Preallocate other endpoints */
1861 n = fifo_mode ? udc->num_ep : udc->configured_ep;
1862 for (i = 1; i < n; i++) {
1863 ep = &udc->usba_ep[i];
1864 usba_ep_writel(ep, CFG, ep->ept_cfg);
1865 if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED))
Cristian Birsanfcc9634c2017-04-07 19:07:21 +03001866 dev_err(&udc->pdev->dev,
1867 "ODD: EP%d configuration is invalid!\n", i);
Cristian Birsan741d2552017-01-23 16:45:59 +02001868 }
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001869 }
1870
1871 spin_unlock(&udc->lock);
1872
1873 return IRQ_HANDLED;
1874}
1875
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001876static int start_clock(struct usba_udc *udc)
1877{
1878 int ret;
1879
1880 if (udc->clocked)
1881 return 0;
1882
1883 ret = clk_prepare_enable(udc->pclk);
1884 if (ret)
1885 return ret;
1886 ret = clk_prepare_enable(udc->hclk);
1887 if (ret) {
1888 clk_disable_unprepare(udc->pclk);
1889 return ret;
1890 }
1891
1892 udc->clocked = true;
1893 return 0;
1894}
1895
1896static void stop_clock(struct usba_udc *udc)
1897{
1898 if (!udc->clocked)
1899 return;
1900
1901 clk_disable_unprepare(udc->hclk);
1902 clk_disable_unprepare(udc->pclk);
1903
1904 udc->clocked = false;
1905}
1906
1907static int usba_start(struct usba_udc *udc)
1908{
1909 unsigned long flags;
1910 int ret;
1911
1912 ret = start_clock(udc);
1913 if (ret)
1914 return ret;
1915
1916 spin_lock_irqsave(&udc->lock, flags);
1917 toggle_bias(udc, 1);
1918 usba_writel(udc, CTRL, USBA_ENABLE_MASK);
1919 usba_int_enb_set(udc, USBA_END_OF_RESET);
1920 spin_unlock_irqrestore(&udc->lock, flags);
1921
1922 return 0;
1923}
1924
1925static void usba_stop(struct usba_udc *udc)
1926{
1927 unsigned long flags;
1928
1929 spin_lock_irqsave(&udc->lock, flags);
1930 udc->gadget.speed = USB_SPEED_UNKNOWN;
1931 reset_all_endpoints(udc);
1932
1933 /* This will also disable the DP pullup */
1934 toggle_bias(udc, 0);
1935 usba_writel(udc, CTRL, USBA_DISABLE_MASK);
1936 spin_unlock_irqrestore(&udc->lock, flags);
1937
1938 stop_clock(udc);
1939}
1940
1941static irqreturn_t usba_vbus_irq_thread(int irq, void *devid)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001942{
1943 struct usba_udc *udc = devid;
1944 int vbus;
1945
1946 /* debounce */
1947 udelay(10);
1948
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001949 mutex_lock(&udc->vbus_mutex);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001950
Eirik Aanonsen640e95a2010-02-05 09:49:25 +01001951 vbus = vbus_is_present(udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001952 if (vbus != udc->vbus_prev) {
1953 if (vbus) {
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001954 usba_start(udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001955 } else {
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001956 usba_stop(udc);
1957
1958 if (udc->driver->disconnect)
David Brownell40517702008-05-10 22:46:38 -07001959 udc->driver->disconnect(&udc->gadget);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001960 }
1961 udc->vbus_prev = vbus;
1962 }
1963
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001964 mutex_unlock(&udc->vbus_mutex);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001965 return IRQ_HANDLED;
1966}
1967
Sebastian Andrzej Siewiord809f782012-02-04 18:55:24 +01001968static int atmel_usba_start(struct usb_gadget *gadget,
1969 struct usb_gadget_driver *driver)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001970{
Dan Carpenterffb62a12013-08-21 11:42:24 +03001971 int ret;
Sebastian Andrzej Siewiord809f782012-02-04 18:55:24 +01001972 struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001973 unsigned long flags;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001974
1975 spin_lock_irqsave(&udc->lock, flags);
Haavard Skinnemoen58ed7b92007-10-11 13:40:30 -07001976 udc->devstatus = 1 << USB_DEVICE_SELF_POWERED;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001977 udc->driver = driver;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001978 spin_unlock_irqrestore(&udc->lock, flags);
1979
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001980 mutex_lock(&udc->vbus_mutex);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001981
Hans-Christian Egtvedt472a6782009-03-24 15:45:20 +01001982 if (gpio_is_valid(udc->vbus_pin))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001983 enable_irq(gpio_to_irq(udc->vbus_pin));
1984
1985 /* If Vbus is present, enable the controller and wait for reset */
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001986 udc->vbus_prev = vbus_is_present(udc);
1987 if (udc->vbus_prev) {
1988 ret = usba_start(udc);
1989 if (ret)
1990 goto err;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001991 }
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07001992
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001993 mutex_unlock(&udc->vbus_mutex);
Dan Carpenterffb62a12013-08-21 11:42:24 +03001994 return 0;
Sylvain Rocheta64ef712015-02-12 18:54:06 +01001995
1996err:
1997 if (gpio_is_valid(udc->vbus_pin))
1998 disable_irq(gpio_to_irq(udc->vbus_pin));
1999
2000 mutex_unlock(&udc->vbus_mutex);
2001
2002 spin_lock_irqsave(&udc->lock, flags);
2003 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
2004 udc->driver = NULL;
2005 spin_unlock_irqrestore(&udc->lock, flags);
2006 return ret;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002007}
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002008
Felipe Balbi22835b82014-10-17 12:05:12 -05002009static int atmel_usba_stop(struct usb_gadget *gadget)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002010{
Sebastian Andrzej Siewiord809f782012-02-04 18:55:24 +01002011 struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002012
Hans-Christian Egtvedt472a6782009-03-24 15:45:20 +01002013 if (gpio_is_valid(udc->vbus_pin))
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002014 disable_irq(gpio_to_irq(udc->vbus_pin));
2015
Cristian Birsan741d2552017-01-23 16:45:59 +02002016 if (fifo_mode == 0)
2017 udc->configured_ep = 1;
2018
Sylvain Rocheta64ef712015-02-12 18:54:06 +01002019 usba_stop(udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002020
Gregory CLEMENTd8eb6c62014-03-03 17:48:34 +01002021 udc->driver = NULL;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002022
2023 return 0;
2024}
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002025
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002026#ifdef CONFIG_OF
Boris Brezillon3280e672015-01-06 14:46:58 +01002027static void at91sam9rl_toggle_bias(struct usba_udc *udc, int is_on)
2028{
Alexandre Belloni47476392015-09-30 12:57:10 +02002029 regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
2030 is_on ? AT91_PMC_BIASEN : 0);
Boris Brezillon3280e672015-01-06 14:46:58 +01002031}
2032
Boris Brezillon258e2dd2015-01-06 14:46:59 +01002033static void at91sam9g45_pulse_bias(struct usba_udc *udc)
2034{
Alexandre Belloni47476392015-09-30 12:57:10 +02002035 regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN, 0);
2036 regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
2037 AT91_PMC_BIASEN);
Boris Brezillon258e2dd2015-01-06 14:46:59 +01002038}
2039
Boris Brezillon3280e672015-01-06 14:46:58 +01002040static const struct usba_udc_errata at91sam9rl_errata = {
2041 .toggle_bias = at91sam9rl_toggle_bias,
2042};
2043
Boris Brezillon258e2dd2015-01-06 14:46:59 +01002044static const struct usba_udc_errata at91sam9g45_errata = {
2045 .pulse_bias = at91sam9g45_pulse_bias,
2046};
2047
Boris Brezillon3280e672015-01-06 14:46:58 +01002048static const struct of_device_id atmel_udc_dt_ids[] = {
2049 { .compatible = "atmel,at91sam9rl-udc", .data = &at91sam9rl_errata },
Boris Brezillon258e2dd2015-01-06 14:46:59 +01002050 { .compatible = "atmel,at91sam9g45-udc", .data = &at91sam9g45_errata },
Boris Brezillon3280e672015-01-06 14:46:58 +01002051 { .compatible = "atmel,sama5d3-udc" },
2052 { /* sentinel */ }
2053};
2054
2055MODULE_DEVICE_TABLE(of, atmel_udc_dt_ids);
2056
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002057static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
2058 struct usba_udc *udc)
2059{
2060 u32 val;
2061 const char *name;
2062 enum of_gpio_flags flags;
2063 struct device_node *np = pdev->dev.of_node;
Boris Brezillon3280e672015-01-06 14:46:58 +01002064 const struct of_device_id *match;
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002065 struct device_node *pp;
2066 int i, ret;
2067 struct usba_ep *eps, *ep;
2068
Boris Brezillon3280e672015-01-06 14:46:58 +01002069 match = of_match_node(atmel_udc_dt_ids, np);
2070 if (!match)
2071 return ERR_PTR(-EINVAL);
2072
2073 udc->errata = match->data;
Alexandre Belloni47476392015-09-30 12:57:10 +02002074 udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9g45-pmc");
Alexandre Belloni882bd9f2016-06-13 10:47:30 +02002075 if (IS_ERR(udc->pmc))
2076 udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9x5-pmc");
Alexandre Belloni47476392015-09-30 12:57:10 +02002077 if (udc->errata && IS_ERR(udc->pmc))
2078 return ERR_CAST(udc->pmc);
Boris Brezillon3280e672015-01-06 14:46:58 +01002079
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002080 udc->num_ep = 0;
2081
2082 udc->vbus_pin = of_get_named_gpio_flags(np, "atmel,vbus-gpio", 0,
2083 &flags);
2084 udc->vbus_pin_inverted = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0;
2085
Cristian Birsan741d2552017-01-23 16:45:59 +02002086 if (fifo_mode == 0) {
2087 pp = NULL;
2088 while ((pp = of_get_next_child(np, pp)))
2089 udc->num_ep++;
2090 udc->configured_ep = 1;
Cristian Birsanfbf49872017-03-28 19:07:37 +03002091 } else {
Cristian Birsan741d2552017-01-23 16:45:59 +02002092 udc->num_ep = usba_config_fifo_table(udc);
Cristian Birsanfbf49872017-03-28 19:07:37 +03002093 }
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002094
2095 eps = devm_kzalloc(&pdev->dev, sizeof(struct usba_ep) * udc->num_ep,
2096 GFP_KERNEL);
2097 if (!eps)
2098 return ERR_PTR(-ENOMEM);
2099
2100 udc->gadget.ep0 = &eps[0].ep;
2101
2102 INIT_LIST_HEAD(&eps[0].ep.ep_list);
2103
2104 pp = NULL;
2105 i = 0;
Cristian Birsan741d2552017-01-23 16:45:59 +02002106 while ((pp = of_get_next_child(np, pp)) && i < udc->num_ep) {
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002107 ep = &eps[i];
2108
2109 ret = of_property_read_u32(pp, "reg", &val);
2110 if (ret) {
2111 dev_err(&pdev->dev, "of_probe: reg error(%d)\n", ret);
2112 goto err;
2113 }
Cristian Birsan741d2552017-01-23 16:45:59 +02002114 ep->index = fifo_mode ? udc->fifo_cfg[i].hw_ep_num : val;
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002115
2116 ret = of_property_read_u32(pp, "atmel,fifo-size", &val);
2117 if (ret) {
2118 dev_err(&pdev->dev, "of_probe: fifo-size error(%d)\n", ret);
2119 goto err;
2120 }
Cristian Birsanb378e3b2017-04-03 10:19:51 +03002121 if (fifo_mode) {
2122 if (val < udc->fifo_cfg[i].fifo_size) {
2123 dev_warn(&pdev->dev,
2124 "Using max fifo-size value from DT\n");
2125 ep->fifo_size = val;
2126 } else {
2127 ep->fifo_size = udc->fifo_cfg[i].fifo_size;
2128 }
2129 } else {
2130 ep->fifo_size = val;
2131 }
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002132
2133 ret = of_property_read_u32(pp, "atmel,nb-banks", &val);
2134 if (ret) {
2135 dev_err(&pdev->dev, "of_probe: nb-banks error(%d)\n", ret);
2136 goto err;
2137 }
Cristian Birsanb378e3b2017-04-03 10:19:51 +03002138 if (fifo_mode) {
2139 if (val < udc->fifo_cfg[i].nr_banks) {
2140 dev_warn(&pdev->dev,
2141 "Using max nb-banks value from DT\n");
2142 ep->nr_banks = val;
2143 } else {
2144 ep->nr_banks = udc->fifo_cfg[i].nr_banks;
2145 }
2146 } else {
2147 ep->nr_banks = val;
2148 }
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002149
2150 ep->can_dma = of_property_read_bool(pp, "atmel,can-dma");
2151 ep->can_isoc = of_property_read_bool(pp, "atmel,can-isoc");
2152
2153 ret = of_property_read_string(pp, "name", &name);
Robert Baldyga7674cba2015-07-13 11:03:54 +02002154 if (ret) {
2155 dev_err(&pdev->dev, "of_probe: name error(%d)\n", ret);
2156 goto err;
2157 }
Alexandre Belloni32856ee2017-01-11 13:11:08 +01002158 sprintf(ep->name, "ep%d", ep->index);
2159 ep->ep.name = ep->name;
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002160
2161 ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
2162 ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
2163 ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
2164 ep->ep.ops = &usba_ep_ops;
Robert Baldygae117e742013-12-13 12:23:38 +01002165 usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002166 ep->udc = udc;
2167 INIT_LIST_HEAD(&ep->queue);
2168
Sylvain Rochetcf261fd2015-09-18 16:58:28 +02002169 if (ep->index == 0) {
2170 ep->ep.caps.type_control = true;
2171 } else {
2172 ep->ep.caps.type_iso = ep->can_isoc;
2173 ep->ep.caps.type_bulk = true;
2174 ep->ep.caps.type_int = true;
2175 }
2176
2177 ep->ep.caps.dir_in = true;
2178 ep->ep.caps.dir_out = true;
2179
Cristian Birsan741d2552017-01-23 16:45:59 +02002180 if (fifo_mode != 0) {
2181 /*
2182 * Generate ept_cfg based on FIFO size and
2183 * banks number
2184 */
2185 if (ep->fifo_size <= 8)
2186 ep->ept_cfg = USBA_BF(EPT_SIZE, USBA_EPT_SIZE_8);
2187 else
2188 /* LSB is bit 1, not 0 */
2189 ep->ept_cfg =
2190 USBA_BF(EPT_SIZE, fls(ep->fifo_size - 1) - 3);
2191
2192 ep->ept_cfg |= USBA_BF(BK_NUMBER, ep->nr_banks);
2193 }
2194
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002195 if (i)
2196 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
2197
2198 i++;
2199 }
2200
Alexandre Bellonifb0e1392014-02-27 16:42:13 +01002201 if (i == 0) {
2202 dev_err(&pdev->dev, "of_probe: no endpoint specified\n");
2203 ret = -EINVAL;
2204 goto err;
2205 }
2206
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002207 return eps;
2208err:
2209 return ERR_PTR(ret);
2210}
2211#else
2212static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
2213 struct usba_udc *udc)
2214{
2215 return ERR_PTR(-ENOSYS);
2216}
2217#endif
2218
2219static struct usba_ep * usba_udc_pdata(struct platform_device *pdev,
2220 struct usba_udc *udc)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002221{
Jingoo Hane01ee9f2013-07-30 17:00:51 +09002222 struct usba_platform_data *pdata = dev_get_platdata(&pdev->dev);
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002223 struct usba_ep *eps;
2224 int i;
2225
2226 if (!pdata)
2227 return ERR_PTR(-ENXIO);
2228
2229 eps = devm_kzalloc(&pdev->dev, sizeof(struct usba_ep) * pdata->num_ep,
2230 GFP_KERNEL);
2231 if (!eps)
2232 return ERR_PTR(-ENOMEM);
2233
2234 udc->gadget.ep0 = &eps[0].ep;
2235
2236 udc->vbus_pin = pdata->vbus_pin;
2237 udc->vbus_pin_inverted = pdata->vbus_pin_inverted;
2238 udc->num_ep = pdata->num_ep;
2239
2240 INIT_LIST_HEAD(&eps[0].ep.ep_list);
2241
2242 for (i = 0; i < pdata->num_ep; i++) {
2243 struct usba_ep *ep = &eps[i];
2244
2245 ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
2246 ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
2247 ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
2248 ep->ep.ops = &usba_ep_ops;
2249 ep->ep.name = pdata->ep[i].name;
Robert Baldygae117e742013-12-13 12:23:38 +01002250 ep->fifo_size = pdata->ep[i].fifo_size;
2251 usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002252 ep->udc = udc;
2253 INIT_LIST_HEAD(&ep->queue);
2254 ep->nr_banks = pdata->ep[i].nr_banks;
2255 ep->index = pdata->ep[i].index;
2256 ep->can_dma = pdata->ep[i].can_dma;
2257 ep->can_isoc = pdata->ep[i].can_isoc;
2258
Robert Baldyga47bef382015-07-31 16:00:48 +02002259 if (i == 0) {
2260 ep->ep.caps.type_control = true;
2261 } else {
2262 ep->ep.caps.type_iso = ep->can_isoc;
2263 ep->ep.caps.type_bulk = true;
2264 ep->ep.caps.type_int = true;
2265 }
2266
2267 ep->ep.caps.dir_in = true;
2268 ep->ep.caps.dir_out = true;
2269
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002270 if (i)
2271 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
2272 }
2273
2274 return eps;
2275}
2276
Peter Chen03d6a9c2014-05-18 15:19:02 +08002277static int usba_udc_probe(struct platform_device *pdev)
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002278{
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002279 struct resource *regs, *fifo;
2280 struct clk *pclk, *hclk;
Jean-Christophe PLAGNIOL-VILLARDe8f2ea32013-05-20 22:46:02 +08002281 struct usba_udc *udc;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002282 int irq, ret, i;
2283
Jean-Christophe PLAGNIOL-VILLARDe8f2ea32013-05-20 22:46:02 +08002284 udc = devm_kzalloc(&pdev->dev, sizeof(*udc), GFP_KERNEL);
2285 if (!udc)
2286 return -ENOMEM;
2287
2288 udc->gadget = usba_gadget_template;
2289 INIT_LIST_HEAD(&udc->gadget.ep_list);
2290
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002291 regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID);
2292 fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID);
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002293 if (!regs || !fifo)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002294 return -ENXIO;
2295
2296 irq = platform_get_irq(pdev, 0);
2297 if (irq < 0)
2298 return irq;
2299
Jingoo Han40a8fb22013-12-16 15:13:31 +09002300 pclk = devm_clk_get(&pdev->dev, "pclk");
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002301 if (IS_ERR(pclk))
2302 return PTR_ERR(pclk);
Jingoo Han40a8fb22013-12-16 15:13:31 +09002303 hclk = devm_clk_get(&pdev->dev, "hclk");
2304 if (IS_ERR(hclk))
2305 return PTR_ERR(hclk);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002306
David Brownell40517702008-05-10 22:46:38 -07002307 spin_lock_init(&udc->lock);
Sylvain Rocheta64ef712015-02-12 18:54:06 +01002308 mutex_init(&udc->vbus_mutex);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002309 udc->pdev = pdev;
2310 udc->pclk = pclk;
2311 udc->hclk = hclk;
Hans-Christian Egtvedt472a6782009-03-24 15:45:20 +01002312 udc->vbus_pin = -ENODEV;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002313
2314 ret = -ENOMEM;
Jingoo Han40a8fb22013-12-16 15:13:31 +09002315 udc->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002316 if (!udc->regs) {
2317 dev_err(&pdev->dev, "Unable to map I/O memory, aborting.\n");
Jingoo Han40a8fb22013-12-16 15:13:31 +09002318 return ret;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002319 }
2320 dev_info(&pdev->dev, "MMIO registers at 0x%08lx mapped at %p\n",
2321 (unsigned long)regs->start, udc->regs);
Jingoo Han40a8fb22013-12-16 15:13:31 +09002322 udc->fifo = devm_ioremap(&pdev->dev, fifo->start, resource_size(fifo));
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002323 if (!udc->fifo) {
2324 dev_err(&pdev->dev, "Unable to map FIFO, aborting.\n");
Jingoo Han40a8fb22013-12-16 15:13:31 +09002325 return ret;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002326 }
2327 dev_info(&pdev->dev, "FIFO at 0x%08lx mapped at %p\n",
2328 (unsigned long)fifo->start, udc->fifo);
2329
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002330 platform_set_drvdata(pdev, udc);
2331
2332 /* Make sure we start from a clean slate */
Boris BREZILLON0d98b9d2013-07-18 09:43:08 +02002333 ret = clk_prepare_enable(pclk);
2334 if (ret) {
2335 dev_err(&pdev->dev, "Unable to enable pclk, aborting.\n");
Jingoo Han40a8fb22013-12-16 15:13:31 +09002336 return ret;
Boris BREZILLON0d98b9d2013-07-18 09:43:08 +02002337 }
Boris Brezillon3280e672015-01-06 14:46:58 +01002338
Stelian Pop16a45bc2008-04-05 22:25:47 +02002339 usba_writel(udc, CTRL, USBA_DISABLE_MASK);
Boris BREZILLON0d98b9d2013-07-18 09:43:08 +02002340 clk_disable_unprepare(pclk);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002341
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002342 if (pdev->dev.of_node)
2343 udc->usba_ep = atmel_udc_of_init(pdev, udc);
2344 else
2345 udc->usba_ep = usba_udc_pdata(pdev, udc);
2346
Boris Brezillon3280e672015-01-06 14:46:58 +01002347 toggle_bias(udc, 0);
2348
Jingoo Han40a8fb22013-12-16 15:13:31 +09002349 if (IS_ERR(udc->usba_ep))
2350 return PTR_ERR(udc->usba_ep);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002351
Jingoo Han40a8fb22013-12-16 15:13:31 +09002352 ret = devm_request_irq(&pdev->dev, irq, usba_udc_irq, 0,
2353 "atmel_usba_udc", udc);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002354 if (ret) {
2355 dev_err(&pdev->dev, "Cannot request irq %d (error %d)\n",
2356 irq, ret);
Jingoo Han40a8fb22013-12-16 15:13:31 +09002357 return ret;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002358 }
2359 udc->irq = irq;
2360
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002361 if (gpio_is_valid(udc->vbus_pin)) {
2362 if (!devm_gpio_request(&pdev->dev, udc->vbus_pin, "atmel_usba_udc")) {
Sylvain Rochetbb0a2032015-02-12 18:54:05 +01002363 irq_set_status_flags(gpio_to_irq(udc->vbus_pin),
2364 IRQ_NOAUTOEN);
Sylvain Rocheta64ef712015-02-12 18:54:06 +01002365 ret = devm_request_threaded_irq(&pdev->dev,
2366 gpio_to_irq(udc->vbus_pin), NULL,
Nicolas Ferre6baeda12017-08-31 14:51:40 +02002367 usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002368 "atmel_usba_udc", udc);
2369 if (ret) {
Hans-Christian Egtvedt472a6782009-03-24 15:45:20 +01002370 udc->vbus_pin = -ENODEV;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002371 dev_warn(&udc->pdev->dev,
2372 "failed to request vbus irq; "
2373 "assuming always on\n");
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002374 }
Jean-Christophe PLAGNIOL-VILLARD969afff2010-09-20 18:31:07 +02002375 } else {
2376 /* gpio_request fail so use -EINVAL for gpio_is_valid */
Josh Wub4880952010-11-16 11:51:32 +01002377 udc->vbus_pin = -EINVAL;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002378 }
2379 }
2380
Sebastian Andrzej Siewior0f913492011-06-28 16:33:47 +03002381 ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
2382 if (ret)
Jingoo Han40a8fb22013-12-16 15:13:31 +09002383 return ret;
Sylvain Rochet112bf242015-02-12 18:54:07 +01002384 device_init_wakeup(&pdev->dev, 1);
Sebastian Andrzej Siewior0f913492011-06-28 16:33:47 +03002385
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002386 usba_init_debugfs(udc);
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002387 for (i = 1; i < udc->num_ep; i++)
2388 usba_ep_init_debugfs(udc, &udc->usba_ep[i]);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002389
2390 return 0;
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002391}
2392
Arnd Bergmannc94e2892015-04-11 00:14:21 +02002393static int usba_udc_remove(struct platform_device *pdev)
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002394{
2395 struct usba_udc *udc;
2396 int i;
2397
2398 udc = platform_get_drvdata(pdev);
2399
Sylvain Rochet112bf242015-02-12 18:54:07 +01002400 device_init_wakeup(&pdev->dev, 0);
Sebastian Andrzej Siewior0f913492011-06-28 16:33:47 +03002401 usb_del_gadget_udc(&udc->gadget);
2402
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002403 for (i = 1; i < udc->num_ep; i++)
Jean-Christophe PLAGNIOL-VILLARD68522de2013-05-20 22:36:23 +08002404 usba_ep_cleanup_debugfs(&udc->usba_ep[i]);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002405 usba_cleanup_debugfs(udc);
2406
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002407 return 0;
2408}
2409
Felipe Balbi94a715e2015-05-27 12:29:18 -05002410#ifdef CONFIG_PM_SLEEP
Sylvain Rochet112bf242015-02-12 18:54:07 +01002411static int usba_udc_suspend(struct device *dev)
2412{
2413 struct usba_udc *udc = dev_get_drvdata(dev);
2414
2415 /* Not started */
2416 if (!udc->driver)
2417 return 0;
2418
2419 mutex_lock(&udc->vbus_mutex);
2420
2421 if (!device_may_wakeup(dev)) {
2422 usba_stop(udc);
2423 goto out;
2424 }
2425
2426 /*
2427 * Device may wake up. We stay clocked if we failed
2428 * to request vbus irq, assuming always on.
2429 */
2430 if (gpio_is_valid(udc->vbus_pin)) {
2431 usba_stop(udc);
2432 enable_irq_wake(gpio_to_irq(udc->vbus_pin));
2433 }
2434
2435out:
2436 mutex_unlock(&udc->vbus_mutex);
2437 return 0;
2438}
2439
2440static int usba_udc_resume(struct device *dev)
2441{
2442 struct usba_udc *udc = dev_get_drvdata(dev);
2443
2444 /* Not started */
2445 if (!udc->driver)
2446 return 0;
2447
2448 if (device_may_wakeup(dev) && gpio_is_valid(udc->vbus_pin))
2449 disable_irq_wake(gpio_to_irq(udc->vbus_pin));
2450
2451 /* If Vbus is present, enable the controller and wait for reset */
2452 mutex_lock(&udc->vbus_mutex);
2453 udc->vbus_prev = vbus_is_present(udc);
2454 if (udc->vbus_prev)
2455 usba_start(udc);
2456 mutex_unlock(&udc->vbus_mutex);
2457
2458 return 0;
2459}
2460#endif
2461
2462static SIMPLE_DEV_PM_OPS(usba_udc_pm_ops, usba_udc_suspend, usba_udc_resume);
2463
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002464static struct platform_driver udc_driver = {
Arnd Bergmannc94e2892015-04-11 00:14:21 +02002465 .remove = usba_udc_remove,
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002466 .driver = {
2467 .name = "atmel_usba_udc",
Sylvain Rochet112bf242015-02-12 18:54:07 +01002468 .pm = &usba_udc_pm_ops,
Jean-Christophe PLAGNIOL-VILLARD4a3ae932013-05-03 20:22:57 +08002469 .of_match_table = of_match_ptr(atmel_udc_dt_ids),
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002470 },
2471};
2472
Fabio Porcedda52f7a822013-01-09 12:15:28 +01002473module_platform_driver_probe(udc_driver, usba_udc_probe);
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002474
2475MODULE_DESCRIPTION("Atmel USBA UDC driver");
Jean Delvaree05503e2011-05-18 16:49:24 +02002476MODULE_AUTHOR("Haavard Skinnemoen (Atmel)");
Haavard Skinnemoen914a3f32007-10-10 02:29:43 -07002477MODULE_LICENSE("GPL");
Kay Sieversf34c32f2008-04-10 21:29:21 -07002478MODULE_ALIAS("platform:atmel_usba_udc");