Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/usb/fotg210/fotg210-udc.c
26130 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* FOTG210 UDC Driver supports Bulk transfer so far
4
*
5
* Copyright (C) 2013 Faraday Technology Corporation
6
*
7
* Author : Yuan-Hsin Chen <[email protected]>
8
*/
9
10
#include <linux/delay.h>
11
#include <linux/dma-mapping.h>
12
#include <linux/err.h>
13
#include <linux/interrupt.h>
14
#include <linux/io.h>
15
#include <linux/module.h>
16
#include <linux/platform_device.h>
17
#include <linux/usb/ch9.h>
18
#include <linux/usb/gadget.h>
19
#include <linux/usb/otg.h>
20
#include <linux/usb/phy.h>
21
22
#include "fotg210.h"
23
#include "fotg210-udc.h"
24
25
#define DRIVER_DESC "FOTG210 USB Device Controller Driver"
26
#define DRIVER_VERSION "30-April-2013"
27
28
static const char udc_name[] = "fotg210_udc";
29
static const char * const fotg210_ep_name[] = {
30
"ep0", "ep1", "ep2", "ep3", "ep4"};
31
32
static void fotg210_ack_int(struct fotg210_udc *fotg210, u32 offset, u32 mask)
33
{
34
u32 value = ioread32(fotg210->reg + offset);
35
36
value &= ~mask;
37
iowrite32(value, fotg210->reg + offset);
38
}
39
40
static void fotg210_disable_fifo_int(struct fotg210_ep *ep)
41
{
42
u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1);
43
44
if (ep->dir_in)
45
value |= DMISGR1_MF_IN_INT(ep->epnum - 1);
46
else
47
value |= DMISGR1_MF_OUTSPK_INT(ep->epnum - 1);
48
iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1);
49
}
50
51
static void fotg210_enable_fifo_int(struct fotg210_ep *ep)
52
{
53
u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1);
54
55
if (ep->dir_in)
56
value &= ~DMISGR1_MF_IN_INT(ep->epnum - 1);
57
else
58
value &= ~DMISGR1_MF_OUTSPK_INT(ep->epnum - 1);
59
iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1);
60
}
61
62
static void fotg210_set_cxdone(struct fotg210_udc *fotg210)
63
{
64
u32 value = ioread32(fotg210->reg + FOTG210_DCFESR);
65
66
value |= DCFESR_CX_DONE;
67
iowrite32(value, fotg210->reg + FOTG210_DCFESR);
68
}
69
70
static void fotg210_done(struct fotg210_ep *ep, struct fotg210_request *req,
71
int status)
72
{
73
list_del_init(&req->queue);
74
75
/* don't modify queue heads during completion callback */
76
if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN)
77
req->req.status = -ESHUTDOWN;
78
else
79
req->req.status = status;
80
81
spin_unlock(&ep->fotg210->lock);
82
usb_gadget_giveback_request(&ep->ep, &req->req);
83
spin_lock(&ep->fotg210->lock);
84
85
if (ep->epnum) {
86
if (list_empty(&ep->queue))
87
fotg210_disable_fifo_int(ep);
88
} else {
89
fotg210_set_cxdone(ep->fotg210);
90
}
91
}
92
93
static void fotg210_fifo_ep_mapping(struct fotg210_ep *ep, u32 epnum,
94
u32 dir_in)
95
{
96
struct fotg210_udc *fotg210 = ep->fotg210;
97
u32 val;
98
99
/* Driver should map an ep to a fifo and then map the fifo
100
* to the ep. What a brain-damaged design!
101
*/
102
103
/* map a fifo to an ep */
104
val = ioread32(fotg210->reg + FOTG210_EPMAP);
105
val &= ~EPMAP_FIFONOMSK(epnum, dir_in);
106
val |= EPMAP_FIFONO(epnum, dir_in);
107
iowrite32(val, fotg210->reg + FOTG210_EPMAP);
108
109
/* map the ep to the fifo */
110
val = ioread32(fotg210->reg + FOTG210_FIFOMAP);
111
val &= ~FIFOMAP_EPNOMSK(epnum);
112
val |= FIFOMAP_EPNO(epnum);
113
iowrite32(val, fotg210->reg + FOTG210_FIFOMAP);
114
115
/* enable fifo */
116
val = ioread32(fotg210->reg + FOTG210_FIFOCF);
117
val |= FIFOCF_FIFO_EN(epnum - 1);
118
iowrite32(val, fotg210->reg + FOTG210_FIFOCF);
119
}
120
121
static void fotg210_set_fifo_dir(struct fotg210_ep *ep, u32 epnum, u32 dir_in)
122
{
123
struct fotg210_udc *fotg210 = ep->fotg210;
124
u32 val;
125
126
val = ioread32(fotg210->reg + FOTG210_FIFOMAP);
127
val |= (dir_in ? FIFOMAP_DIRIN(epnum - 1) : FIFOMAP_DIROUT(epnum - 1));
128
iowrite32(val, fotg210->reg + FOTG210_FIFOMAP);
129
}
130
131
static void fotg210_set_tfrtype(struct fotg210_ep *ep, u32 epnum, u32 type)
132
{
133
struct fotg210_udc *fotg210 = ep->fotg210;
134
u32 val;
135
136
val = ioread32(fotg210->reg + FOTG210_FIFOCF);
137
val |= FIFOCF_TYPE(type, epnum - 1);
138
iowrite32(val, fotg210->reg + FOTG210_FIFOCF);
139
}
140
141
static void fotg210_set_mps(struct fotg210_ep *ep, u32 epnum, u32 mps,
142
u32 dir_in)
143
{
144
struct fotg210_udc *fotg210 = ep->fotg210;
145
u32 val;
146
u32 offset = dir_in ? FOTG210_INEPMPSR(epnum) :
147
FOTG210_OUTEPMPSR(epnum);
148
149
val = ioread32(fotg210->reg + offset);
150
val |= INOUTEPMPSR_MPS(mps);
151
iowrite32(val, fotg210->reg + offset);
152
}
153
154
static int fotg210_config_ep(struct fotg210_ep *ep,
155
const struct usb_endpoint_descriptor *desc)
156
{
157
struct fotg210_udc *fotg210 = ep->fotg210;
158
159
fotg210_set_fifo_dir(ep, ep->epnum, ep->dir_in);
160
fotg210_set_tfrtype(ep, ep->epnum, ep->type);
161
fotg210_set_mps(ep, ep->epnum, ep->ep.maxpacket, ep->dir_in);
162
fotg210_fifo_ep_mapping(ep, ep->epnum, ep->dir_in);
163
164
fotg210->ep[ep->epnum] = ep;
165
166
return 0;
167
}
168
169
static int fotg210_ep_enable(struct usb_ep *_ep,
170
const struct usb_endpoint_descriptor *desc)
171
{
172
struct fotg210_ep *ep;
173
174
ep = container_of(_ep, struct fotg210_ep, ep);
175
176
ep->desc = desc;
177
ep->epnum = usb_endpoint_num(desc);
178
ep->type = usb_endpoint_type(desc);
179
ep->dir_in = usb_endpoint_dir_in(desc);
180
ep->ep.maxpacket = usb_endpoint_maxp(desc);
181
182
return fotg210_config_ep(ep, desc);
183
}
184
185
static void fotg210_reset_tseq(struct fotg210_udc *fotg210, u8 epnum)
186
{
187
struct fotg210_ep *ep = fotg210->ep[epnum];
188
u32 value;
189
void __iomem *reg;
190
191
reg = (ep->dir_in) ?
192
fotg210->reg + FOTG210_INEPMPSR(epnum) :
193
fotg210->reg + FOTG210_OUTEPMPSR(epnum);
194
195
/* Note: Driver needs to set and clear INOUTEPMPSR_RESET_TSEQ
196
* bit. Controller wouldn't clear this bit. WTF!!!
197
*/
198
199
value = ioread32(reg);
200
value |= INOUTEPMPSR_RESET_TSEQ;
201
iowrite32(value, reg);
202
203
value = ioread32(reg);
204
value &= ~INOUTEPMPSR_RESET_TSEQ;
205
iowrite32(value, reg);
206
}
207
208
static int fotg210_ep_release(struct fotg210_ep *ep)
209
{
210
if (!ep->epnum)
211
return 0;
212
ep->epnum = 0;
213
ep->stall = 0;
214
ep->wedged = 0;
215
216
fotg210_reset_tseq(ep->fotg210, ep->epnum);
217
218
return 0;
219
}
220
221
static int fotg210_ep_disable(struct usb_ep *_ep)
222
{
223
struct fotg210_ep *ep;
224
struct fotg210_request *req;
225
unsigned long flags;
226
227
BUG_ON(!_ep);
228
229
ep = container_of(_ep, struct fotg210_ep, ep);
230
231
while (!list_empty(&ep->queue)) {
232
req = list_entry(ep->queue.next,
233
struct fotg210_request, queue);
234
spin_lock_irqsave(&ep->fotg210->lock, flags);
235
fotg210_done(ep, req, -ECONNRESET);
236
spin_unlock_irqrestore(&ep->fotg210->lock, flags);
237
}
238
239
return fotg210_ep_release(ep);
240
}
241
242
static struct usb_request *fotg210_ep_alloc_request(struct usb_ep *_ep,
243
gfp_t gfp_flags)
244
{
245
struct fotg210_request *req;
246
247
req = kzalloc(sizeof(struct fotg210_request), gfp_flags);
248
if (!req)
249
return NULL;
250
251
INIT_LIST_HEAD(&req->queue);
252
253
return &req->req;
254
}
255
256
static void fotg210_ep_free_request(struct usb_ep *_ep,
257
struct usb_request *_req)
258
{
259
struct fotg210_request *req;
260
261
req = container_of(_req, struct fotg210_request, req);
262
kfree(req);
263
}
264
265
static void fotg210_enable_dma(struct fotg210_ep *ep,
266
dma_addr_t d, u32 len)
267
{
268
u32 value;
269
struct fotg210_udc *fotg210 = ep->fotg210;
270
271
/* set transfer length and direction */
272
value = ioread32(fotg210->reg + FOTG210_DMACPSR1);
273
value &= ~(DMACPSR1_DMA_LEN(0xFFFF) | DMACPSR1_DMA_TYPE(1));
274
value |= DMACPSR1_DMA_LEN(len) | DMACPSR1_DMA_TYPE(ep->dir_in);
275
iowrite32(value, fotg210->reg + FOTG210_DMACPSR1);
276
277
/* set device DMA target FIFO number */
278
value = ioread32(fotg210->reg + FOTG210_DMATFNR);
279
if (ep->epnum)
280
value |= DMATFNR_ACC_FN(ep->epnum - 1);
281
else
282
value |= DMATFNR_ACC_CXF;
283
iowrite32(value, fotg210->reg + FOTG210_DMATFNR);
284
285
/* set DMA memory address */
286
iowrite32(d, fotg210->reg + FOTG210_DMACPSR2);
287
288
/* enable MDMA_EROR and MDMA_CMPLT interrupt */
289
value = ioread32(fotg210->reg + FOTG210_DMISGR2);
290
value &= ~(DMISGR2_MDMA_CMPLT | DMISGR2_MDMA_ERROR);
291
iowrite32(value, fotg210->reg + FOTG210_DMISGR2);
292
293
/* start DMA */
294
value = ioread32(fotg210->reg + FOTG210_DMACPSR1);
295
value |= DMACPSR1_DMA_START;
296
iowrite32(value, fotg210->reg + FOTG210_DMACPSR1);
297
}
298
299
static void fotg210_disable_dma(struct fotg210_ep *ep)
300
{
301
iowrite32(DMATFNR_DISDMA, ep->fotg210->reg + FOTG210_DMATFNR);
302
}
303
304
static void fotg210_wait_dma_done(struct fotg210_ep *ep)
305
{
306
u32 value;
307
308
do {
309
value = ioread32(ep->fotg210->reg + FOTG210_DISGR2);
310
if ((value & DISGR2_USBRST_INT) ||
311
(value & DISGR2_DMA_ERROR))
312
goto dma_reset;
313
} while (!(value & DISGR2_DMA_CMPLT));
314
315
fotg210_ack_int(ep->fotg210, FOTG210_DISGR2, DISGR2_DMA_CMPLT);
316
return;
317
318
dma_reset:
319
value = ioread32(ep->fotg210->reg + FOTG210_DMACPSR1);
320
value |= DMACPSR1_DMA_ABORT;
321
iowrite32(value, ep->fotg210->reg + FOTG210_DMACPSR1);
322
323
/* reset fifo */
324
if (ep->epnum) {
325
value = ioread32(ep->fotg210->reg +
326
FOTG210_FIBCR(ep->epnum - 1));
327
value |= FIBCR_FFRST;
328
iowrite32(value, ep->fotg210->reg +
329
FOTG210_FIBCR(ep->epnum - 1));
330
} else {
331
value = ioread32(ep->fotg210->reg + FOTG210_DCFESR);
332
value |= DCFESR_CX_CLR;
333
iowrite32(value, ep->fotg210->reg + FOTG210_DCFESR);
334
}
335
}
336
337
static void fotg210_start_dma(struct fotg210_ep *ep,
338
struct fotg210_request *req)
339
{
340
struct device *dev = &ep->fotg210->gadget.dev;
341
dma_addr_t d;
342
u8 *buffer;
343
u32 length;
344
345
if (ep->epnum) {
346
if (ep->dir_in) {
347
buffer = req->req.buf;
348
length = req->req.length;
349
} else {
350
buffer = req->req.buf + req->req.actual;
351
length = ioread32(ep->fotg210->reg +
352
FOTG210_FIBCR(ep->epnum - 1)) & FIBCR_BCFX;
353
if (length > req->req.length - req->req.actual)
354
length = req->req.length - req->req.actual;
355
}
356
} else {
357
buffer = req->req.buf + req->req.actual;
358
if (req->req.length - req->req.actual > ep->ep.maxpacket)
359
length = ep->ep.maxpacket;
360
else
361
length = req->req.length - req->req.actual;
362
}
363
364
d = dma_map_single(dev, buffer, length,
365
ep->dir_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
366
367
if (dma_mapping_error(dev, d)) {
368
pr_err("dma_mapping_error\n");
369
return;
370
}
371
372
fotg210_enable_dma(ep, d, length);
373
374
/* check if dma is done */
375
fotg210_wait_dma_done(ep);
376
377
fotg210_disable_dma(ep);
378
379
/* update actual transfer length */
380
req->req.actual += length;
381
382
dma_unmap_single(dev, d, length, DMA_TO_DEVICE);
383
}
384
385
static void fotg210_ep0_queue(struct fotg210_ep *ep,
386
struct fotg210_request *req)
387
{
388
if (!req->req.length) {
389
fotg210_done(ep, req, 0);
390
return;
391
}
392
if (ep->dir_in) { /* if IN */
393
fotg210_start_dma(ep, req);
394
if (req->req.length == req->req.actual)
395
fotg210_done(ep, req, 0);
396
} else { /* OUT */
397
u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR0);
398
399
value &= ~DMISGR0_MCX_OUT_INT;
400
iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR0);
401
}
402
}
403
404
static int fotg210_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
405
gfp_t gfp_flags)
406
{
407
struct fotg210_ep *ep;
408
struct fotg210_request *req;
409
unsigned long flags;
410
int request = 0;
411
412
ep = container_of(_ep, struct fotg210_ep, ep);
413
req = container_of(_req, struct fotg210_request, req);
414
415
if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN)
416
return -ESHUTDOWN;
417
418
spin_lock_irqsave(&ep->fotg210->lock, flags);
419
420
if (list_empty(&ep->queue))
421
request = 1;
422
423
list_add_tail(&req->queue, &ep->queue);
424
425
req->req.actual = 0;
426
req->req.status = -EINPROGRESS;
427
428
if (!ep->epnum) /* ep0 */
429
fotg210_ep0_queue(ep, req);
430
else if (request && !ep->stall)
431
fotg210_enable_fifo_int(ep);
432
433
spin_unlock_irqrestore(&ep->fotg210->lock, flags);
434
435
return 0;
436
}
437
438
static int fotg210_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
439
{
440
struct fotg210_ep *ep;
441
struct fotg210_request *req;
442
unsigned long flags;
443
444
ep = container_of(_ep, struct fotg210_ep, ep);
445
req = container_of(_req, struct fotg210_request, req);
446
447
spin_lock_irqsave(&ep->fotg210->lock, flags);
448
if (!list_empty(&ep->queue))
449
fotg210_done(ep, req, -ECONNRESET);
450
spin_unlock_irqrestore(&ep->fotg210->lock, flags);
451
452
return 0;
453
}
454
455
static void fotg210_set_epnstall(struct fotg210_ep *ep)
456
{
457
struct fotg210_udc *fotg210 = ep->fotg210;
458
u32 value;
459
void __iomem *reg;
460
461
/* check if IN FIFO is empty before stall */
462
if (ep->dir_in) {
463
do {
464
value = ioread32(fotg210->reg + FOTG210_DCFESR);
465
} while (!(value & DCFESR_FIFO_EMPTY(ep->epnum - 1)));
466
}
467
468
reg = (ep->dir_in) ?
469
fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
470
fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
471
value = ioread32(reg);
472
value |= INOUTEPMPSR_STL_EP;
473
iowrite32(value, reg);
474
}
475
476
static void fotg210_clear_epnstall(struct fotg210_ep *ep)
477
{
478
struct fotg210_udc *fotg210 = ep->fotg210;
479
u32 value;
480
void __iomem *reg;
481
482
reg = (ep->dir_in) ?
483
fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
484
fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
485
value = ioread32(reg);
486
value &= ~INOUTEPMPSR_STL_EP;
487
iowrite32(value, reg);
488
}
489
490
static int fotg210_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedge)
491
{
492
struct fotg210_ep *ep;
493
struct fotg210_udc *fotg210;
494
unsigned long flags;
495
496
ep = container_of(_ep, struct fotg210_ep, ep);
497
498
fotg210 = ep->fotg210;
499
500
spin_lock_irqsave(&ep->fotg210->lock, flags);
501
502
if (value) {
503
fotg210_set_epnstall(ep);
504
ep->stall = 1;
505
if (wedge)
506
ep->wedged = 1;
507
} else {
508
fotg210_reset_tseq(fotg210, ep->epnum);
509
fotg210_clear_epnstall(ep);
510
ep->stall = 0;
511
ep->wedged = 0;
512
if (!list_empty(&ep->queue))
513
fotg210_enable_fifo_int(ep);
514
}
515
516
spin_unlock_irqrestore(&ep->fotg210->lock, flags);
517
return 0;
518
}
519
520
static int fotg210_ep_set_halt(struct usb_ep *_ep, int value)
521
{
522
return fotg210_set_halt_and_wedge(_ep, value, 0);
523
}
524
525
static int fotg210_ep_set_wedge(struct usb_ep *_ep)
526
{
527
return fotg210_set_halt_and_wedge(_ep, 1, 1);
528
}
529
530
static void fotg210_ep_fifo_flush(struct usb_ep *_ep)
531
{
532
}
533
534
static const struct usb_ep_ops fotg210_ep_ops = {
535
.enable = fotg210_ep_enable,
536
.disable = fotg210_ep_disable,
537
538
.alloc_request = fotg210_ep_alloc_request,
539
.free_request = fotg210_ep_free_request,
540
541
.queue = fotg210_ep_queue,
542
.dequeue = fotg210_ep_dequeue,
543
544
.set_halt = fotg210_ep_set_halt,
545
.fifo_flush = fotg210_ep_fifo_flush,
546
.set_wedge = fotg210_ep_set_wedge,
547
};
548
549
static void fotg210_clear_tx0byte(struct fotg210_udc *fotg210)
550
{
551
u32 value = ioread32(fotg210->reg + FOTG210_TX0BYTE);
552
553
value &= ~(TX0BYTE_EP1 | TX0BYTE_EP2 | TX0BYTE_EP3
554
| TX0BYTE_EP4);
555
iowrite32(value, fotg210->reg + FOTG210_TX0BYTE);
556
}
557
558
static void fotg210_clear_rx0byte(struct fotg210_udc *fotg210)
559
{
560
u32 value = ioread32(fotg210->reg + FOTG210_RX0BYTE);
561
562
value &= ~(RX0BYTE_EP1 | RX0BYTE_EP2 | RX0BYTE_EP3
563
| RX0BYTE_EP4);
564
iowrite32(value, fotg210->reg + FOTG210_RX0BYTE);
565
}
566
567
/* read 8-byte setup packet only */
568
static void fotg210_rdsetupp(struct fotg210_udc *fotg210,
569
u8 *buffer)
570
{
571
int i = 0;
572
u8 *tmp = buffer;
573
u32 data;
574
u32 length = 8;
575
576
iowrite32(DMATFNR_ACC_CXF, fotg210->reg + FOTG210_DMATFNR);
577
578
for (i = (length >> 2); i > 0; i--) {
579
data = ioread32(fotg210->reg + FOTG210_CXPORT);
580
*tmp = data & 0xFF;
581
*(tmp + 1) = (data >> 8) & 0xFF;
582
*(tmp + 2) = (data >> 16) & 0xFF;
583
*(tmp + 3) = (data >> 24) & 0xFF;
584
tmp = tmp + 4;
585
}
586
587
switch (length % 4) {
588
case 1:
589
data = ioread32(fotg210->reg + FOTG210_CXPORT);
590
*tmp = data & 0xFF;
591
break;
592
case 2:
593
data = ioread32(fotg210->reg + FOTG210_CXPORT);
594
*tmp = data & 0xFF;
595
*(tmp + 1) = (data >> 8) & 0xFF;
596
break;
597
case 3:
598
data = ioread32(fotg210->reg + FOTG210_CXPORT);
599
*tmp = data & 0xFF;
600
*(tmp + 1) = (data >> 8) & 0xFF;
601
*(tmp + 2) = (data >> 16) & 0xFF;
602
break;
603
default:
604
break;
605
}
606
607
iowrite32(DMATFNR_DISDMA, fotg210->reg + FOTG210_DMATFNR);
608
}
609
610
static void fotg210_set_configuration(struct fotg210_udc *fotg210)
611
{
612
u32 value = ioread32(fotg210->reg + FOTG210_DAR);
613
614
value |= DAR_AFT_CONF;
615
iowrite32(value, fotg210->reg + FOTG210_DAR);
616
}
617
618
static void fotg210_set_dev_addr(struct fotg210_udc *fotg210, u32 addr)
619
{
620
u32 value = ioread32(fotg210->reg + FOTG210_DAR);
621
622
value |= (addr & 0x7F);
623
iowrite32(value, fotg210->reg + FOTG210_DAR);
624
}
625
626
static void fotg210_set_cxstall(struct fotg210_udc *fotg210)
627
{
628
u32 value = ioread32(fotg210->reg + FOTG210_DCFESR);
629
630
value |= DCFESR_CX_STL;
631
iowrite32(value, fotg210->reg + FOTG210_DCFESR);
632
}
633
634
static void fotg210_request_error(struct fotg210_udc *fotg210)
635
{
636
fotg210_set_cxstall(fotg210);
637
pr_err("request error!!\n");
638
}
639
640
static void fotg210_set_address(struct fotg210_udc *fotg210,
641
struct usb_ctrlrequest *ctrl)
642
{
643
if (le16_to_cpu(ctrl->wValue) >= 0x0100) {
644
fotg210_request_error(fotg210);
645
} else {
646
fotg210_set_dev_addr(fotg210, le16_to_cpu(ctrl->wValue));
647
fotg210_set_cxdone(fotg210);
648
}
649
}
650
651
static void fotg210_set_feature(struct fotg210_udc *fotg210,
652
struct usb_ctrlrequest *ctrl)
653
{
654
switch (ctrl->bRequestType & USB_RECIP_MASK) {
655
case USB_RECIP_DEVICE:
656
fotg210_set_cxdone(fotg210);
657
break;
658
case USB_RECIP_INTERFACE:
659
fotg210_set_cxdone(fotg210);
660
break;
661
case USB_RECIP_ENDPOINT: {
662
u8 epnum;
663
epnum = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK;
664
if (epnum)
665
fotg210_set_epnstall(fotg210->ep[epnum]);
666
else
667
fotg210_set_cxstall(fotg210);
668
fotg210_set_cxdone(fotg210);
669
}
670
break;
671
default:
672
fotg210_request_error(fotg210);
673
break;
674
}
675
}
676
677
static void fotg210_clear_feature(struct fotg210_udc *fotg210,
678
struct usb_ctrlrequest *ctrl)
679
{
680
struct fotg210_ep *ep =
681
fotg210->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK];
682
683
switch (ctrl->bRequestType & USB_RECIP_MASK) {
684
case USB_RECIP_DEVICE:
685
fotg210_set_cxdone(fotg210);
686
break;
687
case USB_RECIP_INTERFACE:
688
fotg210_set_cxdone(fotg210);
689
break;
690
case USB_RECIP_ENDPOINT:
691
if (ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK) {
692
if (ep->wedged) {
693
fotg210_set_cxdone(fotg210);
694
break;
695
}
696
if (ep->stall)
697
fotg210_set_halt_and_wedge(&ep->ep, 0, 0);
698
}
699
fotg210_set_cxdone(fotg210);
700
break;
701
default:
702
fotg210_request_error(fotg210);
703
break;
704
}
705
}
706
707
static int fotg210_is_epnstall(struct fotg210_ep *ep)
708
{
709
struct fotg210_udc *fotg210 = ep->fotg210;
710
u32 value;
711
void __iomem *reg;
712
713
reg = (ep->dir_in) ?
714
fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
715
fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
716
value = ioread32(reg);
717
return value & INOUTEPMPSR_STL_EP ? 1 : 0;
718
}
719
720
/* For EP0 requests triggered by this driver (currently GET_STATUS response) */
721
static void fotg210_ep0_complete(struct usb_ep *_ep, struct usb_request *req)
722
{
723
struct fotg210_ep *ep;
724
struct fotg210_udc *fotg210;
725
726
ep = container_of(_ep, struct fotg210_ep, ep);
727
fotg210 = ep->fotg210;
728
729
if (req->status || req->actual != req->length) {
730
dev_warn(&fotg210->gadget.dev, "EP0 request failed: %d\n", req->status);
731
}
732
}
733
734
static void fotg210_get_status(struct fotg210_udc *fotg210,
735
struct usb_ctrlrequest *ctrl)
736
{
737
u8 epnum;
738
739
switch (ctrl->bRequestType & USB_RECIP_MASK) {
740
case USB_RECIP_DEVICE:
741
fotg210->ep0_data = cpu_to_le16(1 << USB_DEVICE_SELF_POWERED);
742
break;
743
case USB_RECIP_INTERFACE:
744
fotg210->ep0_data = cpu_to_le16(0);
745
break;
746
case USB_RECIP_ENDPOINT:
747
epnum = ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK;
748
if (epnum)
749
fotg210->ep0_data =
750
cpu_to_le16(fotg210_is_epnstall(fotg210->ep[epnum])
751
<< USB_ENDPOINT_HALT);
752
else
753
fotg210_request_error(fotg210);
754
break;
755
756
default:
757
fotg210_request_error(fotg210);
758
return; /* exit */
759
}
760
761
fotg210->ep0_req->buf = &fotg210->ep0_data;
762
fotg210->ep0_req->length = 2;
763
764
spin_unlock(&fotg210->lock);
765
fotg210_ep_queue(fotg210->gadget.ep0, fotg210->ep0_req, GFP_ATOMIC);
766
spin_lock(&fotg210->lock);
767
}
768
769
static int fotg210_setup_packet(struct fotg210_udc *fotg210,
770
struct usb_ctrlrequest *ctrl)
771
{
772
u8 *p = (u8 *)ctrl;
773
u8 ret = 0;
774
775
fotg210_rdsetupp(fotg210, p);
776
777
fotg210->ep[0]->dir_in = ctrl->bRequestType & USB_DIR_IN;
778
779
if (fotg210->gadget.speed == USB_SPEED_UNKNOWN) {
780
u32 value = ioread32(fotg210->reg + FOTG210_DMCR);
781
fotg210->gadget.speed = value & DMCR_HS_EN ?
782
USB_SPEED_HIGH : USB_SPEED_FULL;
783
}
784
785
/* check request */
786
if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
787
switch (ctrl->bRequest) {
788
case USB_REQ_GET_STATUS:
789
fotg210_get_status(fotg210, ctrl);
790
break;
791
case USB_REQ_CLEAR_FEATURE:
792
fotg210_clear_feature(fotg210, ctrl);
793
break;
794
case USB_REQ_SET_FEATURE:
795
fotg210_set_feature(fotg210, ctrl);
796
break;
797
case USB_REQ_SET_ADDRESS:
798
fotg210_set_address(fotg210, ctrl);
799
break;
800
case USB_REQ_SET_CONFIGURATION:
801
fotg210_set_configuration(fotg210);
802
ret = 1;
803
break;
804
default:
805
ret = 1;
806
break;
807
}
808
} else {
809
ret = 1;
810
}
811
812
return ret;
813
}
814
815
static void fotg210_ep0out(struct fotg210_udc *fotg210)
816
{
817
struct fotg210_ep *ep = fotg210->ep[0];
818
819
if (!list_empty(&ep->queue) && !ep->dir_in) {
820
struct fotg210_request *req;
821
822
req = list_first_entry(&ep->queue,
823
struct fotg210_request, queue);
824
825
if (req->req.length)
826
fotg210_start_dma(ep, req);
827
828
if ((req->req.length - req->req.actual) < ep->ep.maxpacket)
829
fotg210_done(ep, req, 0);
830
} else {
831
pr_err("%s : empty queue\n", __func__);
832
}
833
}
834
835
static void fotg210_ep0in(struct fotg210_udc *fotg210)
836
{
837
struct fotg210_ep *ep = fotg210->ep[0];
838
839
if ((!list_empty(&ep->queue)) && (ep->dir_in)) {
840
struct fotg210_request *req;
841
842
req = list_entry(ep->queue.next,
843
struct fotg210_request, queue);
844
845
if (req->req.length)
846
fotg210_start_dma(ep, req);
847
848
if (req->req.actual == req->req.length)
849
fotg210_done(ep, req, 0);
850
} else {
851
fotg210_set_cxdone(fotg210);
852
}
853
}
854
855
static void fotg210_in_fifo_handler(struct fotg210_ep *ep)
856
{
857
struct fotg210_request *req = list_entry(ep->queue.next,
858
struct fotg210_request, queue);
859
860
if (req->req.length)
861
fotg210_start_dma(ep, req);
862
fotg210_done(ep, req, 0);
863
}
864
865
static void fotg210_out_fifo_handler(struct fotg210_ep *ep)
866
{
867
struct fotg210_request *req = list_entry(ep->queue.next,
868
struct fotg210_request, queue);
869
int disgr1 = ioread32(ep->fotg210->reg + FOTG210_DISGR1);
870
871
fotg210_start_dma(ep, req);
872
873
/* Complete the request when it's full or a short packet arrived.
874
* Like other drivers, short_not_ok isn't handled.
875
*/
876
877
if (req->req.length == req->req.actual ||
878
(disgr1 & DISGR1_SPK_INT(ep->epnum - 1)))
879
fotg210_done(ep, req, 0);
880
}
881
882
static irqreturn_t fotg210_irq(int irq, void *_fotg210)
883
{
884
struct fotg210_udc *fotg210 = _fotg210;
885
u32 int_grp = ioread32(fotg210->reg + FOTG210_DIGR);
886
u32 int_msk = ioread32(fotg210->reg + FOTG210_DMIGR);
887
888
int_grp &= ~int_msk;
889
890
spin_lock(&fotg210->lock);
891
892
if (int_grp & DIGR_INT_G2) {
893
void __iomem *reg = fotg210->reg + FOTG210_DISGR2;
894
u32 int_grp2 = ioread32(reg);
895
u32 int_msk2 = ioread32(fotg210->reg + FOTG210_DMISGR2);
896
897
int_grp2 &= ~int_msk2;
898
899
if (int_grp2 & DISGR2_USBRST_INT) {
900
usb_gadget_udc_reset(&fotg210->gadget,
901
fotg210->driver);
902
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_USBRST_INT);
903
pr_info("fotg210 udc reset\n");
904
}
905
if (int_grp2 & DISGR2_SUSP_INT) {
906
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_SUSP_INT);
907
pr_info("fotg210 udc suspend\n");
908
}
909
if (int_grp2 & DISGR2_RESM_INT) {
910
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_RESM_INT);
911
pr_info("fotg210 udc resume\n");
912
}
913
if (int_grp2 & DISGR2_ISO_SEQ_ERR_INT) {
914
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_ISO_SEQ_ERR_INT);
915
pr_info("fotg210 iso sequence error\n");
916
}
917
if (int_grp2 & DISGR2_ISO_SEQ_ABORT_INT) {
918
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_ISO_SEQ_ABORT_INT);
919
pr_info("fotg210 iso sequence abort\n");
920
}
921
if (int_grp2 & DISGR2_TX0BYTE_INT) {
922
fotg210_clear_tx0byte(fotg210);
923
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_TX0BYTE_INT);
924
pr_info("fotg210 transferred 0 byte\n");
925
}
926
if (int_grp2 & DISGR2_RX0BYTE_INT) {
927
fotg210_clear_rx0byte(fotg210);
928
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_RX0BYTE_INT);
929
pr_info("fotg210 received 0 byte\n");
930
}
931
if (int_grp2 & DISGR2_DMA_ERROR) {
932
fotg210_ack_int(fotg210, FOTG210_DISGR2, DISGR2_DMA_ERROR);
933
}
934
}
935
936
if (int_grp & DIGR_INT_G0) {
937
void __iomem *reg = fotg210->reg + FOTG210_DISGR0;
938
u32 int_grp0 = ioread32(reg);
939
u32 int_msk0 = ioread32(fotg210->reg + FOTG210_DMISGR0);
940
struct usb_ctrlrequest ctrl;
941
942
int_grp0 &= ~int_msk0;
943
944
/* the highest priority in this source register */
945
if (int_grp0 & DISGR0_CX_COMABT_INT) {
946
fotg210_ack_int(fotg210, FOTG210_DISGR0, DISGR0_CX_COMABT_INT);
947
pr_info("fotg210 CX command abort\n");
948
}
949
950
if (int_grp0 & DISGR0_CX_SETUP_INT) {
951
if (fotg210_setup_packet(fotg210, &ctrl)) {
952
spin_unlock(&fotg210->lock);
953
if (fotg210->driver->setup(&fotg210->gadget,
954
&ctrl) < 0)
955
fotg210_set_cxstall(fotg210);
956
spin_lock(&fotg210->lock);
957
}
958
}
959
if (int_grp0 & DISGR0_CX_COMEND_INT)
960
pr_info("fotg210 cmd end\n");
961
962
if (int_grp0 & DISGR0_CX_IN_INT)
963
fotg210_ep0in(fotg210);
964
965
if (int_grp0 & DISGR0_CX_OUT_INT)
966
fotg210_ep0out(fotg210);
967
968
if (int_grp0 & DISGR0_CX_COMFAIL_INT) {
969
fotg210_set_cxstall(fotg210);
970
pr_info("fotg210 ep0 fail\n");
971
}
972
}
973
974
if (int_grp & DIGR_INT_G1) {
975
void __iomem *reg = fotg210->reg + FOTG210_DISGR1;
976
u32 int_grp1 = ioread32(reg);
977
u32 int_msk1 = ioread32(fotg210->reg + FOTG210_DMISGR1);
978
int fifo;
979
980
int_grp1 &= ~int_msk1;
981
982
for (fifo = 0; fifo < FOTG210_MAX_FIFO_NUM; fifo++) {
983
if (int_grp1 & DISGR1_IN_INT(fifo))
984
fotg210_in_fifo_handler(fotg210->ep[fifo + 1]);
985
986
if ((int_grp1 & DISGR1_OUT_INT(fifo)) ||
987
(int_grp1 & DISGR1_SPK_INT(fifo)))
988
fotg210_out_fifo_handler(fotg210->ep[fifo + 1]);
989
}
990
}
991
992
spin_unlock(&fotg210->lock);
993
994
return IRQ_HANDLED;
995
}
996
997
static void fotg210_disable_unplug(struct fotg210_udc *fotg210)
998
{
999
u32 reg = ioread32(fotg210->reg + FOTG210_PHYTMSR);
1000
1001
reg &= ~PHYTMSR_UNPLUG;
1002
iowrite32(reg, fotg210->reg + FOTG210_PHYTMSR);
1003
}
1004
1005
static int fotg210_udc_start(struct usb_gadget *g,
1006
struct usb_gadget_driver *driver)
1007
{
1008
struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
1009
u32 value;
1010
int ret;
1011
1012
/* hook up the driver */
1013
fotg210->driver = driver;
1014
fotg210->gadget.dev.of_node = fotg210->dev->of_node;
1015
fotg210->gadget.speed = USB_SPEED_UNKNOWN;
1016
1017
dev_info(fotg210->dev, "bound driver %s\n", driver->driver.name);
1018
1019
if (!IS_ERR_OR_NULL(fotg210->phy)) {
1020
ret = otg_set_peripheral(fotg210->phy->otg,
1021
&fotg210->gadget);
1022
if (ret)
1023
dev_err(fotg210->dev, "can't bind to phy\n");
1024
}
1025
1026
/* chip enable */
1027
value = ioread32(fotg210->reg + FOTG210_DMCR);
1028
value |= DMCR_CHIP_EN;
1029
iowrite32(value, fotg210->reg + FOTG210_DMCR);
1030
1031
/* enable device global interrupt */
1032
value = ioread32(fotg210->reg + FOTG210_DMCR);
1033
value |= DMCR_GLINT_EN;
1034
iowrite32(value, fotg210->reg + FOTG210_DMCR);
1035
1036
return 0;
1037
}
1038
1039
static void fotg210_init(struct fotg210_udc *fotg210)
1040
{
1041
u32 value;
1042
1043
/* disable global interrupt and set int polarity to active high */
1044
iowrite32(GMIR_MHC_INT | GMIR_MOTG_INT | GMIR_INT_POLARITY,
1045
fotg210->reg + FOTG210_GMIR);
1046
1047
/* mask interrupts for groups other than 0-2 */
1048
iowrite32(~(DMIGR_MINT_G0 | DMIGR_MINT_G1 | DMIGR_MINT_G2),
1049
fotg210->reg + FOTG210_DMIGR);
1050
1051
/* udc software reset */
1052
iowrite32(DMCR_SFRST, fotg210->reg + FOTG210_DMCR);
1053
/* Better wait a bit, but without a datasheet, no idea how long. */
1054
usleep_range(100, 200);
1055
1056
/* disable device global interrupt */
1057
value = ioread32(fotg210->reg + FOTG210_DMCR);
1058
value &= ~DMCR_GLINT_EN;
1059
iowrite32(value, fotg210->reg + FOTG210_DMCR);
1060
1061
/* enable only grp2 irqs we handle */
1062
iowrite32(~(DISGR2_DMA_ERROR | DISGR2_RX0BYTE_INT | DISGR2_TX0BYTE_INT
1063
| DISGR2_ISO_SEQ_ABORT_INT | DISGR2_ISO_SEQ_ERR_INT
1064
| DISGR2_RESM_INT | DISGR2_SUSP_INT | DISGR2_USBRST_INT),
1065
fotg210->reg + FOTG210_DMISGR2);
1066
1067
/* disable all fifo interrupt */
1068
iowrite32(~(u32)0, fotg210->reg + FOTG210_DMISGR1);
1069
1070
/* disable cmd end */
1071
value = ioread32(fotg210->reg + FOTG210_DMISGR0);
1072
value |= DMISGR0_MCX_COMEND;
1073
iowrite32(value, fotg210->reg + FOTG210_DMISGR0);
1074
}
1075
1076
static int fotg210_udc_stop(struct usb_gadget *g)
1077
{
1078
struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
1079
unsigned long flags;
1080
1081
if (!IS_ERR_OR_NULL(fotg210->phy))
1082
return otg_set_peripheral(fotg210->phy->otg, NULL);
1083
1084
spin_lock_irqsave(&fotg210->lock, flags);
1085
1086
fotg210_init(fotg210);
1087
fotg210->driver = NULL;
1088
fotg210->gadget.speed = USB_SPEED_UNKNOWN;
1089
1090
spin_unlock_irqrestore(&fotg210->lock, flags);
1091
1092
return 0;
1093
}
1094
1095
/**
1096
* fotg210_vbus_session - Called by external transceiver to enable/disable udc
1097
* @g: usb gadget
1098
* @is_active: 0 if should disable UDC VBUS, 1 if should enable
1099
*
1100
* Returns: %0
1101
*/
1102
static int fotg210_vbus_session(struct usb_gadget *g, int is_active)
1103
{
1104
struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
1105
1106
/* Call down to core integration layer to drive or disable VBUS */
1107
fotg210_vbus(fotg210->fotg, is_active);
1108
return 0;
1109
}
1110
1111
static const struct usb_gadget_ops fotg210_gadget_ops = {
1112
.udc_start = fotg210_udc_start,
1113
.udc_stop = fotg210_udc_stop,
1114
.vbus_session = fotg210_vbus_session,
1115
};
1116
1117
/**
1118
* fotg210_phy_event - Called by phy upon VBus event
1119
* @nb: notifier block
1120
* @action: phy action, is vbus connect or disconnect
1121
* @data: the usb_gadget structure in fotg210
1122
*
1123
* Called by the USB Phy when a cable connect or disconnect is sensed.
1124
*
1125
* Returns: NOTIFY_OK or NOTIFY_DONE
1126
*/
1127
static int fotg210_phy_event(struct notifier_block *nb, unsigned long action,
1128
void *data)
1129
{
1130
struct usb_gadget *gadget = data;
1131
1132
if (!gadget)
1133
return NOTIFY_DONE;
1134
1135
switch (action) {
1136
case USB_EVENT_VBUS:
1137
usb_gadget_vbus_connect(gadget);
1138
return NOTIFY_OK;
1139
case USB_EVENT_NONE:
1140
usb_gadget_vbus_disconnect(gadget);
1141
return NOTIFY_OK;
1142
default:
1143
return NOTIFY_DONE;
1144
}
1145
}
1146
1147
static struct notifier_block fotg210_phy_notifier = {
1148
.notifier_call = fotg210_phy_event,
1149
};
1150
1151
int fotg210_udc_remove(struct platform_device *pdev)
1152
{
1153
struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
1154
int i;
1155
1156
usb_del_gadget_udc(&fotg210->gadget);
1157
if (!IS_ERR_OR_NULL(fotg210->phy)) {
1158
usb_unregister_notifier(fotg210->phy, &fotg210_phy_notifier);
1159
usb_put_phy(fotg210->phy);
1160
}
1161
iounmap(fotg210->reg);
1162
free_irq(platform_get_irq(pdev, 0), fotg210);
1163
1164
fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
1165
for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
1166
kfree(fotg210->ep[i]);
1167
1168
kfree(fotg210);
1169
1170
return 0;
1171
}
1172
1173
int fotg210_udc_probe(struct platform_device *pdev, struct fotg210 *fotg)
1174
{
1175
struct fotg210_udc *fotg210 = NULL;
1176
struct device *dev = &pdev->dev;
1177
int irq;
1178
int ret = 0;
1179
int i;
1180
1181
irq = platform_get_irq(pdev, 0);
1182
if (irq < 0)
1183
return irq;
1184
1185
/* initialize udc */
1186
fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL);
1187
if (fotg210 == NULL)
1188
return -ENOMEM;
1189
1190
fotg210->dev = dev;
1191
fotg210->fotg = fotg;
1192
1193
fotg210->phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
1194
if (IS_ERR(fotg210->phy)) {
1195
ret = PTR_ERR(fotg210->phy);
1196
if (ret == -EPROBE_DEFER)
1197
goto err_free;
1198
dev_info(dev, "no PHY found\n");
1199
fotg210->phy = NULL;
1200
} else {
1201
ret = usb_phy_init(fotg210->phy);
1202
if (ret)
1203
goto err_free;
1204
dev_info(dev, "found and initialized PHY\n");
1205
}
1206
1207
ret = -ENOMEM;
1208
1209
for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
1210
fotg210->ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
1211
if (!fotg210->ep[i])
1212
goto err_alloc;
1213
}
1214
1215
fotg210->reg = fotg->base;
1216
1217
spin_lock_init(&fotg210->lock);
1218
1219
platform_set_drvdata(pdev, fotg210);
1220
1221
fotg210->gadget.ops = &fotg210_gadget_ops;
1222
1223
fotg210->gadget.max_speed = USB_SPEED_HIGH;
1224
fotg210->gadget.dev.parent = dev;
1225
fotg210->gadget.dev.dma_mask = dev->dma_mask;
1226
fotg210->gadget.name = udc_name;
1227
1228
INIT_LIST_HEAD(&fotg210->gadget.ep_list);
1229
1230
for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
1231
struct fotg210_ep *ep = fotg210->ep[i];
1232
1233
if (i) {
1234
INIT_LIST_HEAD(&fotg210->ep[i]->ep.ep_list);
1235
list_add_tail(&fotg210->ep[i]->ep.ep_list,
1236
&fotg210->gadget.ep_list);
1237
}
1238
ep->fotg210 = fotg210;
1239
INIT_LIST_HEAD(&ep->queue);
1240
ep->ep.name = fotg210_ep_name[i];
1241
ep->ep.ops = &fotg210_ep_ops;
1242
usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
1243
1244
if (i == 0) {
1245
ep->ep.caps.type_control = true;
1246
} else {
1247
ep->ep.caps.type_iso = true;
1248
ep->ep.caps.type_bulk = true;
1249
ep->ep.caps.type_int = true;
1250
}
1251
1252
ep->ep.caps.dir_in = true;
1253
ep->ep.caps.dir_out = true;
1254
}
1255
usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40);
1256
fotg210->gadget.ep0 = &fotg210->ep[0]->ep;
1257
INIT_LIST_HEAD(&fotg210->gadget.ep0->ep_list);
1258
1259
fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep,
1260
GFP_KERNEL);
1261
if (fotg210->ep0_req == NULL)
1262
goto err_map;
1263
1264
fotg210->ep0_req->complete = fotg210_ep0_complete;
1265
1266
fotg210_init(fotg210);
1267
1268
fotg210_disable_unplug(fotg210);
1269
1270
ret = request_irq(irq, fotg210_irq, IRQF_SHARED,
1271
udc_name, fotg210);
1272
if (ret < 0) {
1273
dev_err_probe(dev, ret, "request_irq error\n");
1274
goto err_req;
1275
}
1276
1277
if (!IS_ERR_OR_NULL(fotg210->phy))
1278
usb_register_notifier(fotg210->phy, &fotg210_phy_notifier);
1279
1280
ret = usb_add_gadget_udc(dev, &fotg210->gadget);
1281
if (ret)
1282
goto err_add_udc;
1283
1284
dev_info(dev, "version %s\n", DRIVER_VERSION);
1285
1286
return 0;
1287
1288
err_add_udc:
1289
if (!IS_ERR_OR_NULL(fotg210->phy))
1290
usb_unregister_notifier(fotg210->phy, &fotg210_phy_notifier);
1291
free_irq(irq, fotg210);
1292
1293
err_req:
1294
fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
1295
1296
err_map:
1297
iounmap(fotg210->reg);
1298
1299
err_alloc:
1300
for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
1301
kfree(fotg210->ep[i]);
1302
1303
err_free:
1304
kfree(fotg210);
1305
return ret;
1306
}
1307
1308