blob: 5408186afc35c41dee81ff8afb7bcc55163a68a4 [file] [log] [blame]
Darius Augulis2a4f1362008-11-12 13:38:31 -08001/*
2 * driver/usb/gadget/imx_udc.c
3 *
Darius Augulis593bef62009-01-21 15:17:55 +02004 * Copyright (C) 2005 Mike Lee <eemike@gmail.com>
Darius Augulis2a4f1362008-11-12 13:38:31 -08005 * Copyright (C) 2008 Darius Augulis <augulis.darius@gmail.com>
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 as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
18#include <linux/init.h>
19#include <linux/kernel.h>
20#include <linux/platform_device.h>
21#include <linux/module.h>
22#include <linux/errno.h>
23#include <linux/list.h>
24#include <linux/interrupt.h>
25#include <linux/io.h>
26#include <linux/irq.h>
27#include <linux/device.h>
28#include <linux/dma-mapping.h>
29#include <linux/clk.h>
30#include <linux/delay.h>
Darius Augulisb633d282009-01-21 15:19:19 +020031#include <linux/timer.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090032#include <linux/slab.h>
Darius Augulis2a4f1362008-11-12 13:38:31 -080033
34#include <linux/usb/ch9.h>
35#include <linux/usb/gadget.h>
36
37#include <mach/usb.h>
38#include <mach/hardware.h>
39
40#include "imx_udc.h"
41
42static const char driver_name[] = "imx_udc";
43static const char ep0name[] = "ep0";
44
45void ep0_chg_stat(const char *label, struct imx_udc_struct *imx_usb,
46 enum ep0_state stat);
47
48/*******************************************************************************
49 * IMX UDC hardware related functions
50 *******************************************************************************
51 */
52
53void imx_udc_enable(struct imx_udc_struct *imx_usb)
54{
55 int temp = __raw_readl(imx_usb->base + USB_CTRL);
Darius Augulis593bef62009-01-21 15:17:55 +020056 __raw_writel(temp | CTRL_FE_ENA | CTRL_AFE_ENA,
57 imx_usb->base + USB_CTRL);
Darius Augulis2a4f1362008-11-12 13:38:31 -080058 imx_usb->gadget.speed = USB_SPEED_FULL;
59}
60
61void imx_udc_disable(struct imx_udc_struct *imx_usb)
62{
63 int temp = __raw_readl(imx_usb->base + USB_CTRL);
64
65 __raw_writel(temp & ~(CTRL_FE_ENA | CTRL_AFE_ENA),
66 imx_usb->base + USB_CTRL);
67
68 ep0_chg_stat(__func__, imx_usb, EP0_IDLE);
69 imx_usb->gadget.speed = USB_SPEED_UNKNOWN;
70}
71
72void imx_udc_reset(struct imx_udc_struct *imx_usb)
73{
74 int temp = __raw_readl(imx_usb->base + USB_ENAB);
75
76 /* set RST bit */
77 __raw_writel(temp | ENAB_RST, imx_usb->base + USB_ENAB);
78
79 /* wait RST bit to clear */
80 do {} while (__raw_readl(imx_usb->base + USB_ENAB) & ENAB_RST);
81
82 /* wait CFG bit to assert */
83 do {} while (!(__raw_readl(imx_usb->base + USB_DADR) & DADR_CFG));
84
85 /* udc module is now ready */
86}
87
88void imx_udc_config(struct imx_udc_struct *imx_usb)
89{
90 u8 ep_conf[5];
91 u8 i, j, cfg;
92 struct imx_ep_struct *imx_ep;
93
94 /* wait CFG bit to assert */
95 do {} while (!(__raw_readl(imx_usb->base + USB_DADR) & DADR_CFG));
96
97 /* Download the endpoint buffer for endpoint 0. */
98 for (j = 0; j < 5; j++) {
99 i = (j == 2 ? imx_usb->imx_ep[0].fifosize : 0x00);
100 __raw_writeb(i, imx_usb->base + USB_DDAT);
101 do {} while (__raw_readl(imx_usb->base + USB_DADR) & DADR_BSY);
102 }
103
104 /* Download the endpoint buffers for endpoints 1-5.
105 * We specify two configurations, one interface
106 */
107 for (cfg = 1; cfg < 3; cfg++) {
108 for (i = 1; i < IMX_USB_NB_EP; i++) {
109 imx_ep = &imx_usb->imx_ep[i];
110 /* EP no | Config no */
111 ep_conf[0] = (i << 4) | (cfg << 2);
112 /* Type | Direction */
113 ep_conf[1] = (imx_ep->bmAttributes << 3) |
114 (EP_DIR(imx_ep) << 2);
115 /* Max packet size */
116 ep_conf[2] = imx_ep->fifosize;
117 /* TRXTYP */
118 ep_conf[3] = 0xC0;
119 /* FIFO no */
120 ep_conf[4] = i;
121
122 D_INI(imx_usb->dev,
123 "<%s> ep%d_conf[%d]:"
124 "[%02x-%02x-%02x-%02x-%02x]\n",
125 __func__, i, cfg,
126 ep_conf[0], ep_conf[1], ep_conf[2],
127 ep_conf[3], ep_conf[4]);
128
129 for (j = 0; j < 5; j++) {
130 __raw_writeb(ep_conf[j],
131 imx_usb->base + USB_DDAT);
Darius Augulis593bef62009-01-21 15:17:55 +0200132 do {} while (__raw_readl(imx_usb->base
133 + USB_DADR)
Darius Augulis2a4f1362008-11-12 13:38:31 -0800134 & DADR_BSY);
135 }
136 }
137 }
138
139 /* wait CFG bit to clear */
140 do {} while (__raw_readl(imx_usb->base + USB_DADR) & DADR_CFG);
141}
142
143void imx_udc_init_irq(struct imx_udc_struct *imx_usb)
144{
145 int i;
146
147 /* Mask and clear all irqs */
148 __raw_writel(0xFFFFFFFF, imx_usb->base + USB_MASK);
149 __raw_writel(0xFFFFFFFF, imx_usb->base + USB_INTR);
150 for (i = 0; i < IMX_USB_NB_EP; i++) {
151 __raw_writel(0x1FF, imx_usb->base + USB_EP_MASK(i));
152 __raw_writel(0x1FF, imx_usb->base + USB_EP_INTR(i));
153 }
154
155 /* Enable USB irqs */
156 __raw_writel(INTR_MSOF | INTR_FRAME_MATCH, imx_usb->base + USB_MASK);
157
158 /* Enable EP0 irqs */
159 __raw_writel(0x1FF & ~(EPINTR_DEVREQ | EPINTR_MDEVREQ | EPINTR_EOT
160 | EPINTR_EOF | EPINTR_FIFO_EMPTY | EPINTR_FIFO_FULL),
161 imx_usb->base + USB_EP_MASK(0));
162}
163
164void imx_udc_init_ep(struct imx_udc_struct *imx_usb)
165{
166 int i, max, temp;
167 struct imx_ep_struct *imx_ep;
168 for (i = 0; i < IMX_USB_NB_EP; i++) {
169 imx_ep = &imx_usb->imx_ep[i];
170 switch (imx_ep->fifosize) {
171 case 8:
172 max = 0;
173 break;
174 case 16:
175 max = 1;
176 break;
177 case 32:
178 max = 2;
179 break;
180 case 64:
181 max = 3;
182 break;
183 default:
184 max = 1;
185 break;
186 }
187 temp = (EP_DIR(imx_ep) << 7) | (max << 5)
188 | (imx_ep->bmAttributes << 3);
189 __raw_writel(temp, imx_usb->base + USB_EP_STAT(i));
Darius Augulis593bef62009-01-21 15:17:55 +0200190 __raw_writel(temp | EPSTAT_FLUSH,
191 imx_usb->base + USB_EP_STAT(i));
Darius Augulis2a4f1362008-11-12 13:38:31 -0800192 D_INI(imx_usb->dev, "<%s> ep%d_stat %08x\n", __func__, i,
193 __raw_readl(imx_usb->base + USB_EP_STAT(i)));
194 }
195}
196
197void imx_udc_init_fifo(struct imx_udc_struct *imx_usb)
198{
199 int i, temp;
200 struct imx_ep_struct *imx_ep;
201 for (i = 0; i < IMX_USB_NB_EP; i++) {
202 imx_ep = &imx_usb->imx_ep[i];
203
204 /* Fifo control */
205 temp = EP_DIR(imx_ep) ? 0x0B000000 : 0x0F000000;
206 __raw_writel(temp, imx_usb->base + USB_EP_FCTRL(i));
207 D_INI(imx_usb->dev, "<%s> ep%d_fctrl %08x\n", __func__, i,
208 __raw_readl(imx_usb->base + USB_EP_FCTRL(i)));
209
210 /* Fifo alarm */
211 temp = (i ? imx_ep->fifosize / 2 : 0);
212 __raw_writel(temp, imx_usb->base + USB_EP_FALRM(i));
213 D_INI(imx_usb->dev, "<%s> ep%d_falrm %08x\n", __func__, i,
214 __raw_readl(imx_usb->base + USB_EP_FALRM(i)));
215 }
216}
217
218static void imx_udc_init(struct imx_udc_struct *imx_usb)
219{
220 /* Reset UDC */
221 imx_udc_reset(imx_usb);
222
223 /* Download config to enpoint buffer */
224 imx_udc_config(imx_usb);
225
226 /* Setup interrups */
227 imx_udc_init_irq(imx_usb);
228
229 /* Setup endpoints */
230 imx_udc_init_ep(imx_usb);
231
232 /* Setup fifos */
233 imx_udc_init_fifo(imx_usb);
234}
235
236void imx_ep_irq_enable(struct imx_ep_struct *imx_ep)
237{
238
239 int i = EP_NO(imx_ep);
240
241 __raw_writel(0x1FF, imx_ep->imx_usb->base + USB_EP_MASK(i));
242 __raw_writel(0x1FF, imx_ep->imx_usb->base + USB_EP_INTR(i));
243 __raw_writel(0x1FF & ~(EPINTR_EOT | EPINTR_EOF),
244 imx_ep->imx_usb->base + USB_EP_MASK(i));
245}
246
247void imx_ep_irq_disable(struct imx_ep_struct *imx_ep)
248{
249
250 int i = EP_NO(imx_ep);
251
252 __raw_writel(0x1FF, imx_ep->imx_usb->base + USB_EP_MASK(i));
253 __raw_writel(0x1FF, imx_ep->imx_usb->base + USB_EP_INTR(i));
254}
255
256int imx_ep_empty(struct imx_ep_struct *imx_ep)
257{
258 struct imx_udc_struct *imx_usb = imx_ep->imx_usb;
259
260 return __raw_readl(imx_usb->base + USB_EP_FSTAT(EP_NO(imx_ep)))
261 & FSTAT_EMPTY;
262}
263
264unsigned imx_fifo_bcount(struct imx_ep_struct *imx_ep)
265{
266 struct imx_udc_struct *imx_usb = imx_ep->imx_usb;
267
268 return (__raw_readl(imx_usb->base + USB_EP_STAT(EP_NO(imx_ep)))
269 & EPSTAT_BCOUNT) >> 16;
270}
271
272void imx_flush(struct imx_ep_struct *imx_ep)
273{
274 struct imx_udc_struct *imx_usb = imx_ep->imx_usb;
275
276 int temp = __raw_readl(imx_usb->base + USB_EP_STAT(EP_NO(imx_ep)));
277 __raw_writel(temp | EPSTAT_FLUSH,
278 imx_usb->base + USB_EP_STAT(EP_NO(imx_ep)));
279}
280
281void imx_ep_stall(struct imx_ep_struct *imx_ep)
282{
283 struct imx_udc_struct *imx_usb = imx_ep->imx_usb;
284 int temp, i;
285
Darius Augulis593bef62009-01-21 15:17:55 +0200286 D_ERR(imx_usb->dev,
287 "<%s> Forced stall on %s\n", __func__, imx_ep->ep.name);
Darius Augulis2a4f1362008-11-12 13:38:31 -0800288
289 imx_flush(imx_ep);
290
291 /* Special care for ep0 */
Darius Augulis8f182e52009-01-21 15:17:25 +0200292 if (!EP_NO(imx_ep)) {
Darius Augulis2a4f1362008-11-12 13:38:31 -0800293 temp = __raw_readl(imx_usb->base + USB_CTRL);
Darius Augulis593bef62009-01-21 15:17:55 +0200294 __raw_writel(temp | CTRL_CMDOVER | CTRL_CMDERROR,
295 imx_usb->base + USB_CTRL);
296 do { } while (__raw_readl(imx_usb->base + USB_CTRL)
297 & CTRL_CMDOVER);
Darius Augulis2a4f1362008-11-12 13:38:31 -0800298 temp = __raw_readl(imx_usb->base + USB_CTRL);
299 __raw_writel(temp & ~CTRL_CMDERROR, imx_usb->base + USB_CTRL);
300 }
301 else {
302 temp = __raw_readl(imx_usb->base + USB_EP_STAT(EP_NO(imx_ep)));
303 __raw_writel(temp | EPSTAT_STALL,
304 imx_usb->base + USB_EP_STAT(EP_NO(imx_ep)));
305
306 for (i = 0; i < 100; i ++) {
Darius Augulis593bef62009-01-21 15:17:55 +0200307 temp = __raw_readl(imx_usb->base
308 + USB_EP_STAT(EP_NO(imx_ep)));
Roel Kluin0df24792009-01-17 16:52:17 +0100309 if (!(temp & EPSTAT_STALL))
Darius Augulis2a4f1362008-11-12 13:38:31 -0800310 break;
311 udelay(20);
312 }
Darius Augulis8f182e52009-01-21 15:17:25 +0200313 if (i == 100)
Darius Augulis2a4f1362008-11-12 13:38:31 -0800314 D_ERR(imx_usb->dev, "<%s> Non finished stall on %s\n",
315 __func__, imx_ep->ep.name);
316 }
317}
318
319static int imx_udc_get_frame(struct usb_gadget *_gadget)
320{
321 struct imx_udc_struct *imx_usb = container_of(_gadget,
322 struct imx_udc_struct, gadget);
323
324 return __raw_readl(imx_usb->base + USB_FRAME) & 0x7FF;
325}
326
327static int imx_udc_wakeup(struct usb_gadget *_gadget)
328{
329 return 0;
330}
331
332/*******************************************************************************
333 * USB request control functions
334 *******************************************************************************
335 */
336
Darius Augulis593bef62009-01-21 15:17:55 +0200337static void ep_add_request(struct imx_ep_struct *imx_ep,
338 struct imx_request *req)
Darius Augulis2a4f1362008-11-12 13:38:31 -0800339{
340 if (unlikely(!req))
341 return;
342
343 req->in_use = 1;
344 list_add_tail(&req->queue, &imx_ep->queue);
345}
346
Darius Augulis593bef62009-01-21 15:17:55 +0200347static void ep_del_request(struct imx_ep_struct *imx_ep,
348 struct imx_request *req)
Darius Augulis2a4f1362008-11-12 13:38:31 -0800349{
350 if (unlikely(!req))
351 return;
352
353 list_del_init(&req->queue);
354 req->in_use = 0;
355}
356
Darius Augulis593bef62009-01-21 15:17:55 +0200357static void done(struct imx_ep_struct *imx_ep,
358 struct imx_request *req, int status)
Darius Augulis2a4f1362008-11-12 13:38:31 -0800359{
360 ep_del_request(imx_ep, req);
361
362 if (likely(req->req.status == -EINPROGRESS))
363 req->req.status = status;
364 else
365 status = req->req.status;
366
367 if (status && status != -ESHUTDOWN)
368 D_ERR(imx_ep->imx_usb->dev,
369 "<%s> complete %s req %p stat %d len %u/%u\n", __func__,
370 imx_ep->ep.name, &req->req, status,
371 req->req.actual, req->req.length);
372
373 req->req.complete(&imx_ep->ep, &req->req);
374}
375
376static void nuke(struct imx_ep_struct *imx_ep, int status)
377{
378 struct imx_request *req;
379
380 while (!list_empty(&imx_ep->queue)) {
381 req = list_entry(imx_ep->queue.next, struct imx_request, queue);
382 done(imx_ep, req, status);
383 }
384}
385
386/*******************************************************************************
387 * Data tansfer over USB functions
388 *******************************************************************************
389 */
390static int read_packet(struct imx_ep_struct *imx_ep, struct imx_request *req)
391{
392 u8 *buf;
393 int bytes_ep, bufferspace, count, i;
394
395 bytes_ep = imx_fifo_bcount(imx_ep);
396 bufferspace = req->req.length - req->req.actual;
397
398 buf = req->req.buf + req->req.actual;
399 prefetchw(buf);
400
401 if (unlikely(imx_ep_empty(imx_ep)))
402 count = 0; /* zlp */
403 else
404 count = min(bytes_ep, bufferspace);
405
406 for (i = count; i > 0; i--)
407 *buf++ = __raw_readb(imx_ep->imx_usb->base
408 + USB_EP_FDAT0(EP_NO(imx_ep)));
409 req->req.actual += count;
410
411 return count;
412}
413
414static int write_packet(struct imx_ep_struct *imx_ep, struct imx_request *req)
415{
416 u8 *buf;
417 int length, count, temp;
418
Daniel Glöckner680cc642009-05-28 13:00:14 +0200419 if (unlikely(__raw_readl(imx_ep->imx_usb->base +
420 USB_EP_STAT(EP_NO(imx_ep))) & EPSTAT_ZLPS)) {
421 D_TRX(imx_ep->imx_usb->dev, "<%s> zlp still queued in EP %s\n",
422 __func__, imx_ep->ep.name);
423 return -1;
424 }
425
Darius Augulis2a4f1362008-11-12 13:38:31 -0800426 buf = req->req.buf + req->req.actual;
427 prefetch(buf);
428
429 length = min(req->req.length - req->req.actual, (u32)imx_ep->fifosize);
430
431 if (imx_fifo_bcount(imx_ep) + length > imx_ep->fifosize) {
432 D_TRX(imx_ep->imx_usb->dev, "<%s> packet overfill %s fifo\n",
433 __func__, imx_ep->ep.name);
434 return -1;
435 }
436
437 req->req.actual += length;
438 count = length;
439
440 if (!count && req->req.zero) { /* zlp */
441 temp = __raw_readl(imx_ep->imx_usb->base
442 + USB_EP_STAT(EP_NO(imx_ep)));
443 __raw_writel(temp | EPSTAT_ZLPS, imx_ep->imx_usb->base
444 + USB_EP_STAT(EP_NO(imx_ep)));
445 D_TRX(imx_ep->imx_usb->dev, "<%s> zero packet\n", __func__);
446 return 0;
447 }
448
449 while (count--) {
450 if (count == 0) { /* last byte */
451 temp = __raw_readl(imx_ep->imx_usb->base
452 + USB_EP_FCTRL(EP_NO(imx_ep)));
453 __raw_writel(temp | FCTRL_WFR, imx_ep->imx_usb->base
454 + USB_EP_FCTRL(EP_NO(imx_ep)));
455 }
456 __raw_writeb(*buf++,
457 imx_ep->imx_usb->base + USB_EP_FDAT0(EP_NO(imx_ep)));
458 }
459
460 return length;
461}
462
463static int read_fifo(struct imx_ep_struct *imx_ep, struct imx_request *req)
464{
465 int bytes = 0,
466 count,
467 completed = 0;
468
469 while (__raw_readl(imx_ep->imx_usb->base + USB_EP_FSTAT(EP_NO(imx_ep)))
470 & FSTAT_FR) {
471 count = read_packet(imx_ep, req);
472 bytes += count;
473
474 completed = (count != imx_ep->fifosize);
475 if (completed || req->req.actual == req->req.length) {
476 completed = 1;
477 break;
478 }
479 }
480
481 if (completed || !req->req.length) {
482 done(imx_ep, req, 0);
483 D_REQ(imx_ep->imx_usb->dev, "<%s> %s req<%p> %s\n",
484 __func__, imx_ep->ep.name, req,
485 completed ? "completed" : "not completed");
486 if (!EP_NO(imx_ep))
487 ep0_chg_stat(__func__, imx_ep->imx_usb, EP0_IDLE);
488 }
489
490 D_TRX(imx_ep->imx_usb->dev, "<%s> bytes read: %d\n", __func__, bytes);
491
492 return completed;
493}
494
495static int write_fifo(struct imx_ep_struct *imx_ep, struct imx_request *req)
496{
497 int bytes = 0,
498 count,
499 completed = 0;
500
501 while (!completed) {
502 count = write_packet(imx_ep, req);
503 if (count < 0)
504 break; /* busy */
505 bytes += count;
506
507 /* last packet "must be" short (or a zlp) */
508 completed = (count != imx_ep->fifosize);
509
510 if (unlikely(completed)) {
511 done(imx_ep, req, 0);
512 D_REQ(imx_ep->imx_usb->dev, "<%s> %s req<%p> %s\n",
513 __func__, imx_ep->ep.name, req,
514 completed ? "completed" : "not completed");
515 if (!EP_NO(imx_ep))
Darius Augulis593bef62009-01-21 15:17:55 +0200516 ep0_chg_stat(__func__,
517 imx_ep->imx_usb, EP0_IDLE);
Darius Augulis2a4f1362008-11-12 13:38:31 -0800518 }
519 }
520
521 D_TRX(imx_ep->imx_usb->dev, "<%s> bytes sent: %d\n", __func__, bytes);
522
523 return completed;
524}
525
526/*******************************************************************************
527 * Endpoint handlers
528 *******************************************************************************
529 */
530static int handle_ep(struct imx_ep_struct *imx_ep)
531{
532 struct imx_request *req;
533 int completed = 0;
534
535 do {
536 if (!list_empty(&imx_ep->queue))
537 req = list_entry(imx_ep->queue.next,
538 struct imx_request, queue);
539 else {
540 D_REQ(imx_ep->imx_usb->dev, "<%s> no request on %s\n",
541 __func__, imx_ep->ep.name);
542 return 0;
543 }
544
545 if (EP_DIR(imx_ep)) /* to host */
546 completed = write_fifo(imx_ep, req);
547 else /* to device */
548 completed = read_fifo(imx_ep, req);
549
550 dump_ep_stat(__func__, imx_ep);
551
552 } while (completed);
553
554 return 0;
555}
556
557static int handle_ep0(struct imx_ep_struct *imx_ep)
558{
559 struct imx_request *req = NULL;
560 int ret = 0;
561
Darius Augulis8f182e52009-01-21 15:17:25 +0200562 if (!list_empty(&imx_ep->queue)) {
Darius Augulis2a4f1362008-11-12 13:38:31 -0800563 req = list_entry(imx_ep->queue.next, struct imx_request, queue);
564
Darius Augulis2a4f1362008-11-12 13:38:31 -0800565 switch (imx_ep->imx_usb->ep0state) {
566
567 case EP0_IN_DATA_PHASE: /* GET_DESCRIPTOR */
568 write_fifo(imx_ep, req);
569 break;
570 case EP0_OUT_DATA_PHASE: /* SET_DESCRIPTOR */
571 read_fifo(imx_ep, req);
572 break;
573 default:
574 D_EP0(imx_ep->imx_usb->dev,
575 "<%s> ep0 i/o, odd state %d\n",
576 __func__, imx_ep->imx_usb->ep0state);
577 ep_del_request(imx_ep, req);
578 ret = -EL2HLT;
579 break;
580 }
581 }
582
Darius Augulis8f182e52009-01-21 15:17:25 +0200583 else
584 D_ERR(imx_ep->imx_usb->dev, "<%s> no request on %s\n",
585 __func__, imx_ep->ep.name);
586
Darius Augulis2a4f1362008-11-12 13:38:31 -0800587 return ret;
588}
589
590static void handle_ep0_devreq(struct imx_udc_struct *imx_usb)
591{
592 struct imx_ep_struct *imx_ep = &imx_usb->imx_ep[0];
593 union {
594 struct usb_ctrlrequest r;
595 u8 raw[8];
596 u32 word[2];
597 } u;
598 int temp, i;
599
600 nuke(imx_ep, -EPROTO);
601
602 /* read SETUP packet */
603 for (i = 0; i < 2; i++) {
604 if (imx_ep_empty(imx_ep)) {
605 D_ERR(imx_usb->dev,
606 "<%s> no setup packet received\n", __func__);
607 goto stall;
608 }
Darius Augulis593bef62009-01-21 15:17:55 +0200609 u.word[i] = __raw_readl(imx_usb->base
610 + USB_EP_FDAT(EP_NO(imx_ep)));
Darius Augulis2a4f1362008-11-12 13:38:31 -0800611 }
612
613 temp = imx_ep_empty(imx_ep);
614 while (!imx_ep_empty(imx_ep)) {
615 i = __raw_readl(imx_usb->base + USB_EP_FDAT(EP_NO(imx_ep)));
616 D_ERR(imx_usb->dev,
617 "<%s> wrong to have extra bytes for setup : 0x%08x\n",
618 __func__, i);
619 }
620 if (!temp)
621 goto stall;
622
623 le16_to_cpus(&u.r.wValue);
624 le16_to_cpus(&u.r.wIndex);
625 le16_to_cpus(&u.r.wLength);
626
627 D_REQ(imx_usb->dev, "<%s> SETUP %02x.%02x v%04x i%04x l%04x\n",
628 __func__, u.r.bRequestType, u.r.bRequest,
629 u.r.wValue, u.r.wIndex, u.r.wLength);
630
631 if (imx_usb->set_config) {
632 /* NACK the host by using CMDOVER */
633 temp = __raw_readl(imx_usb->base + USB_CTRL);
634 __raw_writel(temp | CTRL_CMDOVER, imx_usb->base + USB_CTRL);
635
636 D_ERR(imx_usb->dev,
637 "<%s> set config req is pending, NACK the host\n",
638 __func__);
639 return;
640 }
641
642 if (u.r.bRequestType & USB_DIR_IN)
643 ep0_chg_stat(__func__, imx_usb, EP0_IN_DATA_PHASE);
644 else
645 ep0_chg_stat(__func__, imx_usb, EP0_OUT_DATA_PHASE);
646
647 i = imx_usb->driver->setup(&imx_usb->gadget, &u.r);
648 if (i < 0) {
649 D_ERR(imx_usb->dev, "<%s> device setup error %d\n",
650 __func__, i);
651 goto stall;
652 }
653
654 return;
655stall:
656 D_ERR(imx_usb->dev, "<%s> protocol STALL\n", __func__);
657 imx_ep_stall(imx_ep);
658 ep0_chg_stat(__func__, imx_usb, EP0_STALL);
659 return;
660}
661
662/*******************************************************************************
663 * USB gadget callback functions
664 *******************************************************************************
665 */
666
667static int imx_ep_enable(struct usb_ep *usb_ep,
668 const struct usb_endpoint_descriptor *desc)
669{
670 struct imx_ep_struct *imx_ep = container_of(usb_ep,
671 struct imx_ep_struct, ep);
672 struct imx_udc_struct *imx_usb = imx_ep->imx_usb;
673 unsigned long flags;
674
675 if (!usb_ep
676 || !desc
677 || !EP_NO(imx_ep)
678 || desc->bDescriptorType != USB_DT_ENDPOINT
679 || imx_ep->bEndpointAddress != desc->bEndpointAddress) {
680 D_ERR(imx_usb->dev,
681 "<%s> bad ep or descriptor\n", __func__);
682 return -EINVAL;
683 }
684
685 if (imx_ep->bmAttributes != desc->bmAttributes) {
686 D_ERR(imx_usb->dev,
687 "<%s> %s type mismatch\n", __func__, usb_ep->name);
688 return -EINVAL;
689 }
690
691 if (imx_ep->fifosize < le16_to_cpu(desc->wMaxPacketSize)) {
692 D_ERR(imx_usb->dev,
693 "<%s> bad %s maxpacket\n", __func__, usb_ep->name);
694 return -ERANGE;
695 }
696
697 if (!imx_usb->driver || imx_usb->gadget.speed == USB_SPEED_UNKNOWN) {
698 D_ERR(imx_usb->dev, "<%s> bogus device state\n", __func__);
699 return -ESHUTDOWN;
700 }
701
702 local_irq_save(flags);
703
704 imx_ep->stopped = 0;
705 imx_flush(imx_ep);
706 imx_ep_irq_enable(imx_ep);
707
708 local_irq_restore(flags);
709
710 D_EPX(imx_usb->dev, "<%s> ENABLED %s\n", __func__, usb_ep->name);
711 return 0;
712}
713
714static int imx_ep_disable(struct usb_ep *usb_ep)
715{
716 struct imx_ep_struct *imx_ep = container_of(usb_ep,
717 struct imx_ep_struct, ep);
718 unsigned long flags;
719
720 if (!usb_ep || !EP_NO(imx_ep) || !list_empty(&imx_ep->queue)) {
721 D_ERR(imx_ep->imx_usb->dev, "<%s> %s can not be disabled\n",
722 __func__, usb_ep ? imx_ep->ep.name : NULL);
723 return -EINVAL;
724 }
725
726 local_irq_save(flags);
727
728 imx_ep->stopped = 1;
729 nuke(imx_ep, -ESHUTDOWN);
730 imx_flush(imx_ep);
731 imx_ep_irq_disable(imx_ep);
732
733 local_irq_restore(flags);
734
735 D_EPX(imx_ep->imx_usb->dev,
736 "<%s> DISABLED %s\n", __func__, usb_ep->name);
737 return 0;
738}
739
740static struct usb_request *imx_ep_alloc_request
741 (struct usb_ep *usb_ep, gfp_t gfp_flags)
742{
743 struct imx_request *req;
744
Daniel Mack1e0abb72009-05-12 13:50:34 -0700745 if (!usb_ep)
746 return NULL;
747
Darius Augulis2a4f1362008-11-12 13:38:31 -0800748 req = kzalloc(sizeof *req, gfp_flags);
Daniel Mack1e0abb72009-05-12 13:50:34 -0700749 if (!req)
750 return NULL;
Darius Augulis2a4f1362008-11-12 13:38:31 -0800751
752 INIT_LIST_HEAD(&req->queue);
753 req->in_use = 0;
754
755 return &req->req;
756}
757
758static void imx_ep_free_request
759 (struct usb_ep *usb_ep, struct usb_request *usb_req)
760{
761 struct imx_request *req;
762
763 req = container_of(usb_req, struct imx_request, req);
764 WARN_ON(!list_empty(&req->queue));
765 kfree(req);
766}
767
768static int imx_ep_queue
769 (struct usb_ep *usb_ep, struct usb_request *usb_req, gfp_t gfp_flags)
770{
771 struct imx_ep_struct *imx_ep;
772 struct imx_udc_struct *imx_usb;
773 struct imx_request *req;
774 unsigned long flags;
775 int ret = 0;
776
777 imx_ep = container_of(usb_ep, struct imx_ep_struct, ep);
778 imx_usb = imx_ep->imx_usb;
779 req = container_of(usb_req, struct imx_request, req);
780
781 /*
782 Special care on IMX udc.
783 Ignore enqueue when after set configuration from the
784 host. This assume all gadget drivers reply set
785 configuration with the next ep0 req enqueue.
786 */
787 if (imx_usb->set_config && !EP_NO(imx_ep)) {
788 imx_usb->set_config = 0;
Darius Augulis8f182e52009-01-21 15:17:25 +0200789 D_ERR(imx_usb->dev,
Darius Augulis2a4f1362008-11-12 13:38:31 -0800790 "<%s> gadget reply set config\n", __func__);
791 return 0;
792 }
793
794 if (unlikely(!usb_req || !req || !usb_req->complete || !usb_req->buf)) {
795 D_ERR(imx_usb->dev, "<%s> bad params\n", __func__);
796 return -EINVAL;
797 }
798
799 if (unlikely(!usb_ep || !imx_ep)) {
800 D_ERR(imx_usb->dev, "<%s> bad ep\n", __func__);
801 return -EINVAL;
802 }
803
804 if (!imx_usb->driver || imx_usb->gadget.speed == USB_SPEED_UNKNOWN) {
805 D_ERR(imx_usb->dev, "<%s> bogus device state\n", __func__);
806 return -ESHUTDOWN;
807 }
808
Darius Augulis2a4f1362008-11-12 13:38:31 -0800809 /* Debug */
810 D_REQ(imx_usb->dev, "<%s> ep%d %s request for [%d] bytes\n",
811 __func__, EP_NO(imx_ep),
Darius Augulis593bef62009-01-21 15:17:55 +0200812 ((!EP_NO(imx_ep) && imx_ep->imx_usb->ep0state
813 == EP0_IN_DATA_PHASE)
814 || (EP_NO(imx_ep) && EP_DIR(imx_ep)))
815 ? "IN" : "OUT", usb_req->length);
Darius Augulis2a4f1362008-11-12 13:38:31 -0800816 dump_req(__func__, imx_ep, usb_req);
817
818 if (imx_ep->stopped) {
819 usb_req->status = -ESHUTDOWN;
Darius Augulis8f182e52009-01-21 15:17:25 +0200820 return -ESHUTDOWN;
Darius Augulis2a4f1362008-11-12 13:38:31 -0800821 }
822
823 if (req->in_use) {
824 D_ERR(imx_usb->dev,
825 "<%s> refusing to queue req %p (already queued)\n",
826 __func__, req);
Darius Augulis8f182e52009-01-21 15:17:25 +0200827 return 0;
Darius Augulis2a4f1362008-11-12 13:38:31 -0800828 }
829
Darius Augulis8f182e52009-01-21 15:17:25 +0200830 local_irq_save(flags);
831
Darius Augulis2a4f1362008-11-12 13:38:31 -0800832 usb_req->status = -EINPROGRESS;
833 usb_req->actual = 0;
834
835 ep_add_request(imx_ep, req);
836
837 if (!EP_NO(imx_ep))
838 ret = handle_ep0(imx_ep);
839 else
840 ret = handle_ep(imx_ep);
Darius Augulis8f182e52009-01-21 15:17:25 +0200841
Darius Augulis2a4f1362008-11-12 13:38:31 -0800842 local_irq_restore(flags);
843 return ret;
844}
845
846static int imx_ep_dequeue(struct usb_ep *usb_ep, struct usb_request *usb_req)
847{
848
849 struct imx_ep_struct *imx_ep = container_of
850 (usb_ep, struct imx_ep_struct, ep);
851 struct imx_request *req;
852 unsigned long flags;
853
854 if (unlikely(!usb_ep || !EP_NO(imx_ep))) {
855 D_ERR(imx_ep->imx_usb->dev, "<%s> bad ep\n", __func__);
856 return -EINVAL;
857 }
858
859 local_irq_save(flags);
860
861 /* make sure it's actually queued on this endpoint */
862 list_for_each_entry(req, &imx_ep->queue, queue) {
863 if (&req->req == usb_req)
864 break;
865 }
866 if (&req->req != usb_req) {
867 local_irq_restore(flags);
868 return -EINVAL;
869 }
870
871 done(imx_ep, req, -ECONNRESET);
872
873 local_irq_restore(flags);
874 return 0;
875}
876
877static int imx_ep_set_halt(struct usb_ep *usb_ep, int value)
878{
879 struct imx_ep_struct *imx_ep = container_of
880 (usb_ep, struct imx_ep_struct, ep);
881 unsigned long flags;
882
883 if (unlikely(!usb_ep || !EP_NO(imx_ep))) {
884 D_ERR(imx_ep->imx_usb->dev, "<%s> bad ep\n", __func__);
885 return -EINVAL;
886 }
887
888 local_irq_save(flags);
889
890 if ((imx_ep->bEndpointAddress & USB_DIR_IN)
891 && !list_empty(&imx_ep->queue)) {
892 local_irq_restore(flags);
893 return -EAGAIN;
894 }
895
896 imx_ep_stall(imx_ep);
897
898 local_irq_restore(flags);
899
900 D_EPX(imx_ep->imx_usb->dev, "<%s> %s halt\n", __func__, usb_ep->name);
901 return 0;
902}
903
904static int imx_ep_fifo_status(struct usb_ep *usb_ep)
905{
906 struct imx_ep_struct *imx_ep = container_of
907 (usb_ep, struct imx_ep_struct, ep);
908
909 if (!usb_ep) {
910 D_ERR(imx_ep->imx_usb->dev, "<%s> bad ep\n", __func__);
911 return -ENODEV;
912 }
913
914 if (imx_ep->imx_usb->gadget.speed == USB_SPEED_UNKNOWN)
915 return 0;
916 else
917 return imx_fifo_bcount(imx_ep);
918}
919
920static void imx_ep_fifo_flush(struct usb_ep *usb_ep)
921{
922 struct imx_ep_struct *imx_ep = container_of
923 (usb_ep, struct imx_ep_struct, ep);
924 unsigned long flags;
925
926 local_irq_save(flags);
927
928 if (!usb_ep || !EP_NO(imx_ep) || !list_empty(&imx_ep->queue)) {
929 D_ERR(imx_ep->imx_usb->dev, "<%s> bad ep\n", __func__);
930 local_irq_restore(flags);
931 return;
932 }
933
934 /* toggle and halt bits stay unchanged */
935 imx_flush(imx_ep);
936
937 local_irq_restore(flags);
938}
939
940static struct usb_ep_ops imx_ep_ops = {
941 .enable = imx_ep_enable,
942 .disable = imx_ep_disable,
943
944 .alloc_request = imx_ep_alloc_request,
945 .free_request = imx_ep_free_request,
946
947 .queue = imx_ep_queue,
948 .dequeue = imx_ep_dequeue,
949
950 .set_halt = imx_ep_set_halt,
951 .fifo_status = imx_ep_fifo_status,
952 .fifo_flush = imx_ep_fifo_flush,
953};
954
955/*******************************************************************************
956 * USB endpoint control functions
957 *******************************************************************************
958 */
959
960void ep0_chg_stat(const char *label,
961 struct imx_udc_struct *imx_usb, enum ep0_state stat)
962{
963 D_EP0(imx_usb->dev, "<%s> from %15s to %15s\n",
964 label, state_name[imx_usb->ep0state], state_name[stat]);
965
966 if (imx_usb->ep0state == stat)
967 return;
968
969 imx_usb->ep0state = stat;
970}
971
972static void usb_init_data(struct imx_udc_struct *imx_usb)
973{
974 struct imx_ep_struct *imx_ep;
975 u8 i;
976
977 /* device/ep0 records init */
978 INIT_LIST_HEAD(&imx_usb->gadget.ep_list);
979 INIT_LIST_HEAD(&imx_usb->gadget.ep0->ep_list);
980 ep0_chg_stat(__func__, imx_usb, EP0_IDLE);
981
982 /* basic endpoint records init */
983 for (i = 0; i < IMX_USB_NB_EP; i++) {
984 imx_ep = &imx_usb->imx_ep[i];
985
986 if (i) {
987 list_add_tail(&imx_ep->ep.ep_list,
988 &imx_usb->gadget.ep_list);
989 imx_ep->stopped = 1;
990 } else
991 imx_ep->stopped = 0;
992
993 INIT_LIST_HEAD(&imx_ep->queue);
994 }
995}
996
997static void udc_stop_activity(struct imx_udc_struct *imx_usb,
998 struct usb_gadget_driver *driver)
999{
1000 struct imx_ep_struct *imx_ep;
1001 int i;
1002
1003 if (imx_usb->gadget.speed == USB_SPEED_UNKNOWN)
1004 driver = NULL;
1005
1006 /* prevent new request submissions, kill any outstanding requests */
1007 for (i = 1; i < IMX_USB_NB_EP; i++) {
1008 imx_ep = &imx_usb->imx_ep[i];
1009 imx_flush(imx_ep);
1010 imx_ep->stopped = 1;
1011 imx_ep_irq_disable(imx_ep);
1012 nuke(imx_ep, -ESHUTDOWN);
1013 }
1014
1015 imx_usb->cfg = 0;
1016 imx_usb->intf = 0;
1017 imx_usb->alt = 0;
1018
1019 if (driver)
1020 driver->disconnect(&imx_usb->gadget);
1021}
1022
1023/*******************************************************************************
1024 * Interrupt handlers
1025 *******************************************************************************
1026 */
1027
Darius Augulisb633d282009-01-21 15:19:19 +02001028/*
1029 * Called when timer expires.
1030 * Timer is started when CFG_CHG is received.
1031 */
1032static void handle_config(unsigned long data)
Darius Augulis2a4f1362008-11-12 13:38:31 -08001033{
Darius Augulisb633d282009-01-21 15:19:19 +02001034 struct imx_udc_struct *imx_usb = (void *)data;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001035 struct usb_ctrlrequest u;
1036 int temp, cfg, intf, alt;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001037
Darius Augulisb633d282009-01-21 15:19:19 +02001038 local_irq_disable();
Darius Augulis2a4f1362008-11-12 13:38:31 -08001039
Darius Augulisb633d282009-01-21 15:19:19 +02001040 temp = __raw_readl(imx_usb->base + USB_STAT);
1041 cfg = (temp & STAT_CFG) >> 5;
1042 intf = (temp & STAT_INTF) >> 3;
1043 alt = temp & STAT_ALTSET;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001044
Darius Augulisb633d282009-01-21 15:19:19 +02001045 D_REQ(imx_usb->dev,
1046 "<%s> orig config C=%d, I=%d, A=%d / "
1047 "req config C=%d, I=%d, A=%d\n",
1048 __func__, imx_usb->cfg, imx_usb->intf, imx_usb->alt,
1049 cfg, intf, alt);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001050
Darius Augulisb633d282009-01-21 15:19:19 +02001051 if (cfg == 1 || cfg == 2) {
Darius Augulis2a4f1362008-11-12 13:38:31 -08001052
Darius Augulis2a4f1362008-11-12 13:38:31 -08001053 if (imx_usb->cfg != cfg) {
Darius Augulis2a4f1362008-11-12 13:38:31 -08001054 u.bRequest = USB_REQ_SET_CONFIGURATION;
1055 u.bRequestType = USB_DIR_OUT |
1056 USB_TYPE_STANDARD |
1057 USB_RECIP_DEVICE;
1058 u.wValue = cfg;
1059 u.wIndex = 0;
1060 u.wLength = 0;
1061 imx_usb->cfg = cfg;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001062 imx_usb->driver->setup(&imx_usb->gadget, &u);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001063
1064 }
1065 if (imx_usb->intf != intf || imx_usb->alt != alt) {
Darius Augulis2a4f1362008-11-12 13:38:31 -08001066 u.bRequest = USB_REQ_SET_INTERFACE;
1067 u.bRequestType = USB_DIR_OUT |
1068 USB_TYPE_STANDARD |
1069 USB_RECIP_INTERFACE;
1070 u.wValue = alt;
1071 u.wIndex = intf;
1072 u.wLength = 0;
1073 imx_usb->intf = intf;
1074 imx_usb->alt = alt;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001075 imx_usb->driver->setup(&imx_usb->gadget, &u);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001076 }
1077 }
1078
Darius Augulisb633d282009-01-21 15:19:19 +02001079 imx_usb->set_config = 0;
1080
1081 local_irq_enable();
1082}
1083
1084static irqreturn_t imx_udc_irq(int irq, void *dev)
1085{
1086 struct imx_udc_struct *imx_usb = dev;
1087 int intr = __raw_readl(imx_usb->base + USB_INTR);
1088 int temp;
1089
1090 if (intr & (INTR_WAKEUP | INTR_SUSPEND | INTR_RESUME | INTR_RESET_START
1091 | INTR_RESET_STOP | INTR_CFG_CHG)) {
1092 dump_intr(__func__, intr, imx_usb->dev);
1093 dump_usb_stat(__func__, imx_usb);
1094 }
1095
1096 if (!imx_usb->driver)
1097 goto end_irq;
1098
Darius Augulis2a4f1362008-11-12 13:38:31 -08001099 if (intr & INTR_SOF) {
Darius Augulis8f182e52009-01-21 15:17:25 +02001100 /* Copy from Freescale BSP.
1101 We must enable SOF intr and set CMDOVER.
1102 Datasheet don't specifiy this action, but it
1103 is done in Freescale BSP, so just copy it.
1104 */
Darius Augulis2a4f1362008-11-12 13:38:31 -08001105 if (imx_usb->ep0state == EP0_IDLE) {
1106 temp = __raw_readl(imx_usb->base + USB_CTRL);
Darius Augulis593bef62009-01-21 15:17:55 +02001107 __raw_writel(temp | CTRL_CMDOVER,
1108 imx_usb->base + USB_CTRL);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001109 }
1110 }
1111
Darius Augulisb633d282009-01-21 15:19:19 +02001112 if (intr & INTR_CFG_CHG) {
1113 /* A workaround of serious IMX UDC bug.
1114 Handling of CFG_CHG should be delayed for some time, because
1115 IMX does not NACK the host when CFG_CHG interrupt is pending.
1116 There is no time to handle current CFG_CHG
1117 if next CFG_CHG or SETUP packed is send immediately.
1118 We have to clear CFG_CHG, start the timer and
1119 NACK the host by setting CTRL_CMDOVER
1120 if it sends any SETUP packet.
1121 When timer expires, handler is called to handle configuration
1122 changes. While CFG_CHG is not handled (set_config=1),
1123 we must NACK the host to every SETUP packed.
1124 This delay prevents from going out of sync with host.
1125 */
1126 __raw_writel(INTR_CFG_CHG, imx_usb->base + USB_INTR);
1127 imx_usb->set_config = 1;
1128 mod_timer(&imx_usb->timer, jiffies + 5);
1129 goto end_irq;
1130 }
1131
1132 if (intr & INTR_WAKEUP) {
1133 if (imx_usb->gadget.speed == USB_SPEED_UNKNOWN
1134 && imx_usb->driver && imx_usb->driver->resume)
1135 imx_usb->driver->resume(&imx_usb->gadget);
1136 imx_usb->set_config = 0;
1137 del_timer(&imx_usb->timer);
1138 imx_usb->gadget.speed = USB_SPEED_FULL;
1139 }
1140
1141 if (intr & INTR_SUSPEND) {
1142 if (imx_usb->gadget.speed != USB_SPEED_UNKNOWN
1143 && imx_usb->driver && imx_usb->driver->suspend)
1144 imx_usb->driver->suspend(&imx_usb->gadget);
1145 imx_usb->set_config = 0;
1146 del_timer(&imx_usb->timer);
1147 imx_usb->gadget.speed = USB_SPEED_UNKNOWN;
1148 }
1149
1150 if (intr & INTR_RESET_START) {
1151 __raw_writel(intr, imx_usb->base + USB_INTR);
1152 udc_stop_activity(imx_usb, imx_usb->driver);
1153 imx_usb->set_config = 0;
1154 del_timer(&imx_usb->timer);
1155 imx_usb->gadget.speed = USB_SPEED_UNKNOWN;
1156 }
1157
1158 if (intr & INTR_RESET_STOP)
1159 imx_usb->gadget.speed = USB_SPEED_FULL;
1160
Darius Augulis2a4f1362008-11-12 13:38:31 -08001161end_irq:
1162 __raw_writel(intr, imx_usb->base + USB_INTR);
1163 return IRQ_HANDLED;
1164}
1165
1166static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev)
1167{
1168 struct imx_udc_struct *imx_usb = dev;
Darius Augulisd24921a2009-01-21 15:18:33 +02001169 struct imx_ep_struct *imx_ep = &imx_usb->imx_ep[0];
Darius Augulis2a4f1362008-11-12 13:38:31 -08001170 int intr = __raw_readl(imx_usb->base + USB_EP_INTR(0));
1171
1172 dump_ep_intr(__func__, 0, intr, imx_usb->dev);
1173
1174 if (!imx_usb->driver) {
1175 __raw_writel(intr, imx_usb->base + USB_EP_INTR(0));
1176 return IRQ_HANDLED;
1177 }
1178
Darius Augulisd24921a2009-01-21 15:18:33 +02001179 /* DEVREQ has highest priority */
Darius Augulis2a4f1362008-11-12 13:38:31 -08001180 if (intr & (EPINTR_DEVREQ | EPINTR_MDEVREQ))
1181 handle_ep0_devreq(imx_usb);
1182 /* Seem i.MX is missing EOF interrupt sometimes.
Darius Augulisd24921a2009-01-21 15:18:33 +02001183 * Therefore we don't monitor EOF.
1184 * We call handle_ep0() only if a request is queued for ep0.
Darius Augulis2a4f1362008-11-12 13:38:31 -08001185 */
Darius Augulisd24921a2009-01-21 15:18:33 +02001186 else if (!list_empty(&imx_ep->queue))
1187 handle_ep0(imx_ep);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001188
1189 __raw_writel(intr, imx_usb->base + USB_EP_INTR(0));
1190
1191 return IRQ_HANDLED;
1192}
1193
Uwe Kleine-König34404082010-12-06 17:38:24 +01001194#ifndef MX1_INT_USBD0
1195#define MX1_INT_USBD0 MX1_USBD_INT0
1196#endif
1197
Darius Augulis2a4f1362008-11-12 13:38:31 -08001198static irqreturn_t imx_udc_bulk_irq(int irq, void *dev)
1199{
1200 struct imx_udc_struct *imx_usb = dev;
Uwe Kleine-König34404082010-12-06 17:38:24 +01001201 struct imx_ep_struct *imx_ep = &imx_usb->imx_ep[irq - MX1_INT_USBD0];
Darius Augulis2a4f1362008-11-12 13:38:31 -08001202 int intr = __raw_readl(imx_usb->base + USB_EP_INTR(EP_NO(imx_ep)));
1203
Uwe Kleine-König34404082010-12-06 17:38:24 +01001204 dump_ep_intr(__func__, irq - MX1_INT_USBD0, intr, imx_usb->dev);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001205
1206 if (!imx_usb->driver) {
1207 __raw_writel(intr, imx_usb->base + USB_EP_INTR(EP_NO(imx_ep)));
1208 return IRQ_HANDLED;
1209 }
1210
1211 handle_ep(imx_ep);
1212
1213 __raw_writel(intr, imx_usb->base + USB_EP_INTR(EP_NO(imx_ep)));
1214
1215 return IRQ_HANDLED;
1216}
1217
1218irq_handler_t intr_handler(int i)
1219{
1220 switch (i) {
1221 case 0:
1222 return imx_udc_ctrl_irq;
1223 case 1:
1224 case 2:
1225 case 3:
1226 case 4:
1227 case 5:
1228 return imx_udc_bulk_irq;
1229 default:
1230 return imx_udc_irq;
1231 }
1232}
1233
1234/*******************************************************************************
1235 * Static defined IMX UDC structure
1236 *******************************************************************************
1237 */
1238
1239static const struct usb_gadget_ops imx_udc_ops = {
1240 .get_frame = imx_udc_get_frame,
1241 .wakeup = imx_udc_wakeup,
1242};
1243
1244static struct imx_udc_struct controller = {
1245 .gadget = {
1246 .ops = &imx_udc_ops,
1247 .ep0 = &controller.imx_ep[0].ep,
1248 .name = driver_name,
1249 .dev = {
Kay Sievers5df58522009-03-24 16:38:23 -07001250 .init_name = "gadget",
1251 },
Darius Augulis2a4f1362008-11-12 13:38:31 -08001252 },
1253
1254 .imx_ep[0] = {
1255 .ep = {
1256 .name = ep0name,
1257 .ops = &imx_ep_ops,
1258 .maxpacket = 32,
1259 },
1260 .imx_usb = &controller,
1261 .fifosize = 32,
1262 .bEndpointAddress = 0,
1263 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
1264 },
1265 .imx_ep[1] = {
1266 .ep = {
1267 .name = "ep1in-bulk",
1268 .ops = &imx_ep_ops,
1269 .maxpacket = 64,
1270 },
1271 .imx_usb = &controller,
1272 .fifosize = 64,
1273 .bEndpointAddress = USB_DIR_IN | 1,
1274 .bmAttributes = USB_ENDPOINT_XFER_BULK,
1275 },
1276 .imx_ep[2] = {
1277 .ep = {
1278 .name = "ep2out-bulk",
1279 .ops = &imx_ep_ops,
1280 .maxpacket = 64,
1281 },
1282 .imx_usb = &controller,
1283 .fifosize = 64,
1284 .bEndpointAddress = USB_DIR_OUT | 2,
1285 .bmAttributes = USB_ENDPOINT_XFER_BULK,
1286 },
1287 .imx_ep[3] = {
1288 .ep = {
1289 .name = "ep3out-bulk",
1290 .ops = &imx_ep_ops,
1291 .maxpacket = 32,
1292 },
1293 .imx_usb = &controller,
1294 .fifosize = 32,
1295 .bEndpointAddress = USB_DIR_OUT | 3,
1296 .bmAttributes = USB_ENDPOINT_XFER_BULK,
1297 },
1298 .imx_ep[4] = {
1299 .ep = {
1300 .name = "ep4in-int",
1301 .ops = &imx_ep_ops,
1302 .maxpacket = 32,
1303 },
1304 .imx_usb = &controller,
1305 .fifosize = 32,
1306 .bEndpointAddress = USB_DIR_IN | 4,
1307 .bmAttributes = USB_ENDPOINT_XFER_INT,
1308 },
1309 .imx_ep[5] = {
1310 .ep = {
1311 .name = "ep5out-int",
1312 .ops = &imx_ep_ops,
1313 .maxpacket = 32,
1314 },
1315 .imx_usb = &controller,
1316 .fifosize = 32,
1317 .bEndpointAddress = USB_DIR_OUT | 5,
1318 .bmAttributes = USB_ENDPOINT_XFER_INT,
1319 },
1320};
1321
1322/*******************************************************************************
Uwe Kleine-Königb5950762010-11-01 15:38:34 -04001323 * USB gadget driver functions
Darius Augulis2a4f1362008-11-12 13:38:31 -08001324 *******************************************************************************
1325 */
Uwe Kleine-Königb0fca502010-08-12 17:43:53 +02001326int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
1327 int (*bind)(struct usb_gadget *))
Darius Augulis2a4f1362008-11-12 13:38:31 -08001328{
1329 struct imx_udc_struct *imx_usb = &controller;
1330 int retval;
1331
1332 if (!driver
1333 || driver->speed < USB_SPEED_FULL
Uwe Kleine-Königb0fca502010-08-12 17:43:53 +02001334 || !bind
Darius Augulis2a4f1362008-11-12 13:38:31 -08001335 || !driver->disconnect
1336 || !driver->setup)
1337 return -EINVAL;
1338 if (!imx_usb)
1339 return -ENODEV;
1340 if (imx_usb->driver)
1341 return -EBUSY;
1342
1343 /* first hook up the driver ... */
1344 imx_usb->driver = driver;
1345 imx_usb->gadget.dev.driver = &driver->driver;
1346
1347 retval = device_add(&imx_usb->gadget.dev);
1348 if (retval)
1349 goto fail;
Uwe Kleine-Königb0fca502010-08-12 17:43:53 +02001350 retval = bind(&imx_usb->gadget);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001351 if (retval) {
1352 D_ERR(imx_usb->dev, "<%s> bind to driver %s --> error %d\n",
1353 __func__, driver->driver.name, retval);
1354 device_del(&imx_usb->gadget.dev);
1355
1356 goto fail;
1357 }
1358
1359 D_INI(imx_usb->dev, "<%s> registered gadget driver '%s'\n",
1360 __func__, driver->driver.name);
1361
1362 imx_udc_enable(imx_usb);
1363
1364 return 0;
1365fail:
1366 imx_usb->driver = NULL;
1367 imx_usb->gadget.dev.driver = NULL;
1368 return retval;
1369}
Uwe Kleine-Königb0fca502010-08-12 17:43:53 +02001370EXPORT_SYMBOL(usb_gadget_probe_driver);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001371
1372int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
1373{
1374 struct imx_udc_struct *imx_usb = &controller;
1375
1376 if (!imx_usb)
1377 return -ENODEV;
1378 if (!driver || driver != imx_usb->driver || !driver->unbind)
1379 return -EINVAL;
1380
1381 udc_stop_activity(imx_usb, driver);
1382 imx_udc_disable(imx_usb);
Darius Augulisb633d282009-01-21 15:19:19 +02001383 del_timer(&imx_usb->timer);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001384
1385 driver->unbind(&imx_usb->gadget);
1386 imx_usb->gadget.dev.driver = NULL;
1387 imx_usb->driver = NULL;
1388
1389 device_del(&imx_usb->gadget.dev);
1390
1391 D_INI(imx_usb->dev, "<%s> unregistered gadget driver '%s'\n",
1392 __func__, driver->driver.name);
1393
1394 return 0;
1395}
1396EXPORT_SYMBOL(usb_gadget_unregister_driver);
1397
1398/*******************************************************************************
1399 * Module functions
1400 *******************************************************************************
1401 */
1402
1403static int __init imx_udc_probe(struct platform_device *pdev)
1404{
1405 struct imx_udc_struct *imx_usb = &controller;
1406 struct resource *res;
1407 struct imxusb_platform_data *pdata;
1408 struct clk *clk;
1409 void __iomem *base;
1410 int ret = 0;
Tobias Klauserd86a83f2009-09-18 09:14:46 +02001411 int i;
1412 resource_size_t res_size;
Darius Augulis2a4f1362008-11-12 13:38:31 -08001413
1414 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1415 if (!res) {
1416 dev_err(&pdev->dev, "can't get device resources\n");
1417 return -ENODEV;
1418 }
1419
1420 pdata = pdev->dev.platform_data;
1421 if (!pdata) {
1422 dev_err(&pdev->dev, "driver needs platform data\n");
1423 return -ENODEV;
1424 }
1425
Tobias Klauserd86a83f2009-09-18 09:14:46 +02001426 res_size = resource_size(res);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001427 if (!request_mem_region(res->start, res_size, res->name)) {
1428 dev_err(&pdev->dev, "can't allocate %d bytes at %d address\n",
1429 res_size, res->start);
1430 return -ENOMEM;
1431 }
1432
1433 if (pdata->init) {
1434 ret = pdata->init(&pdev->dev);
1435 if (ret)
1436 goto fail0;
1437 }
1438
1439 base = ioremap(res->start, res_size);
1440 if (!base) {
1441 dev_err(&pdev->dev, "ioremap failed\n");
1442 ret = -EIO;
1443 goto fail1;
1444 }
1445
1446 clk = clk_get(NULL, "usbd_clk");
1447 if (IS_ERR(clk)) {
1448 ret = PTR_ERR(clk);
1449 dev_err(&pdev->dev, "can't get USB clock\n");
1450 goto fail2;
1451 }
1452 clk_enable(clk);
1453
1454 if (clk_get_rate(clk) != 48000000) {
1455 D_INI(&pdev->dev,
1456 "Bad USB clock (%d Hz), changing to 48000000 Hz\n",
1457 (int)clk_get_rate(clk));
1458 if (clk_set_rate(clk, 48000000)) {
1459 dev_err(&pdev->dev,
1460 "Unable to set correct USB clock (48MHz)\n");
1461 ret = -EIO;
1462 goto fail3;
1463 }
1464 }
1465
1466 for (i = 0; i < IMX_USB_NB_EP + 1; i++) {
1467 imx_usb->usbd_int[i] = platform_get_irq(pdev, i);
1468 if (imx_usb->usbd_int[i] < 0) {
1469 dev_err(&pdev->dev, "can't get irq number\n");
1470 ret = -ENODEV;
1471 goto fail3;
1472 }
1473 }
1474
1475 for (i = 0; i < IMX_USB_NB_EP + 1; i++) {
1476 ret = request_irq(imx_usb->usbd_int[i], intr_handler(i),
1477 IRQF_DISABLED, driver_name, imx_usb);
1478 if (ret) {
1479 dev_err(&pdev->dev, "can't get irq %i, err %d\n",
1480 imx_usb->usbd_int[i], ret);
1481 for (--i; i >= 0; i--)
1482 free_irq(imx_usb->usbd_int[i], imx_usb);
1483 goto fail3;
1484 }
1485 }
1486
1487 imx_usb->res = res;
1488 imx_usb->base = base;
1489 imx_usb->clk = clk;
1490 imx_usb->dev = &pdev->dev;
1491
1492 device_initialize(&imx_usb->gadget.dev);
1493
1494 imx_usb->gadget.dev.parent = &pdev->dev;
1495 imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask;
1496
1497 platform_set_drvdata(pdev, imx_usb);
1498
1499 usb_init_data(imx_usb);
1500 imx_udc_init(imx_usb);
1501
Darius Augulisb633d282009-01-21 15:19:19 +02001502 init_timer(&imx_usb->timer);
1503 imx_usb->timer.function = handle_config;
1504 imx_usb->timer.data = (unsigned long)imx_usb;
1505
Darius Augulis2a4f1362008-11-12 13:38:31 -08001506 return 0;
1507
1508fail3:
1509 clk_put(clk);
1510 clk_disable(clk);
1511fail2:
1512 iounmap(base);
1513fail1:
1514 if (pdata->exit)
1515 pdata->exit(&pdev->dev);
1516fail0:
1517 release_mem_region(res->start, res_size);
1518 return ret;
1519}
1520
1521static int __exit imx_udc_remove(struct platform_device *pdev)
1522{
1523 struct imx_udc_struct *imx_usb = platform_get_drvdata(pdev);
1524 struct imxusb_platform_data *pdata = pdev->dev.platform_data;
1525 int i;
1526
1527 imx_udc_disable(imx_usb);
Darius Augulisb633d282009-01-21 15:19:19 +02001528 del_timer(&imx_usb->timer);
Darius Augulis2a4f1362008-11-12 13:38:31 -08001529
1530 for (i = 0; i < IMX_USB_NB_EP + 1; i++)
1531 free_irq(imx_usb->usbd_int[i], imx_usb);
1532
1533 clk_put(imx_usb->clk);
1534 clk_disable(imx_usb->clk);
1535 iounmap(imx_usb->base);
1536
Tobias Klauserd86a83f2009-09-18 09:14:46 +02001537 release_mem_region(imx_usb->res->start, resource_size(imx_usb->res));
Darius Augulis2a4f1362008-11-12 13:38:31 -08001538
1539 if (pdata->exit)
1540 pdata->exit(&pdev->dev);
1541
1542 platform_set_drvdata(pdev, NULL);
1543
1544 return 0;
1545}
1546
1547/*----------------------------------------------------------------------------*/
1548
1549#ifdef CONFIG_PM
1550#define imx_udc_suspend NULL
1551#define imx_udc_resume NULL
1552#else
1553#define imx_udc_suspend NULL
1554#define imx_udc_resume NULL
1555#endif
1556
1557/*----------------------------------------------------------------------------*/
1558
1559static struct platform_driver udc_driver = {
1560 .driver = {
1561 .name = driver_name,
1562 .owner = THIS_MODULE,
1563 },
1564 .remove = __exit_p(imx_udc_remove),
1565 .suspend = imx_udc_suspend,
1566 .resume = imx_udc_resume,
1567};
1568
1569static int __init udc_init(void)
1570{
1571 return platform_driver_probe(&udc_driver, imx_udc_probe);
1572}
1573module_init(udc_init);
1574
1575static void __exit udc_exit(void)
1576{
1577 platform_driver_unregister(&udc_driver);
1578}
1579module_exit(udc_exit);
1580
1581MODULE_DESCRIPTION("IMX USB Device Controller driver");
1582MODULE_AUTHOR("Darius Augulis <augulis.darius@gmail.com>");
1583MODULE_LICENSE("GPL");
1584MODULE_ALIAS("platform:imx_udc");