2 * FOTG210 UDC Driver supports Bulk transfer so far
4 * Copyright (C) 2013 Faraday Technology Corporation
6 * Author : Yuan-Hsin Chen <yhchen@faraday-tech.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
13 #include <linux/dma-mapping.h>
14 #include <linux/err.h>
15 #include <linux/interrupt.h>
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/usb/ch9.h>
20 #include <linux/usb/gadget.h>
24 #define DRIVER_DESC "FOTG210 USB Device Controller Driver"
25 #define DRIVER_VERSION "30-April-2013"
27 static const char udc_name
[] = "fotg210_udc";
28 static const char * const fotg210_ep_name
[] = {
29 "ep0", "ep1", "ep2", "ep3", "ep4"};
31 static void fotg210_disable_fifo_int(struct fotg210_ep
*ep
)
33 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
36 value
|= DMISGR1_MF_IN_INT(ep
->epnum
- 1);
38 value
|= DMISGR1_MF_OUTSPK_INT(ep
->epnum
- 1);
39 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
42 static void fotg210_enable_fifo_int(struct fotg210_ep
*ep
)
44 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
47 value
&= ~DMISGR1_MF_IN_INT(ep
->epnum
- 1);
49 value
&= ~DMISGR1_MF_OUTSPK_INT(ep
->epnum
- 1);
50 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
53 static void fotg210_set_cxdone(struct fotg210_udc
*fotg210
)
55 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
57 value
|= DCFESR_CX_DONE
;
58 iowrite32(value
, fotg210
->reg
+ FOTG210_DCFESR
);
61 static void fotg210_done(struct fotg210_ep
*ep
, struct fotg210_request
*req
,
64 list_del_init(&req
->queue
);
66 /* don't modify queue heads during completion callback */
67 if (ep
->fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
)
68 req
->req
.status
= -ESHUTDOWN
;
70 req
->req
.status
= status
;
72 spin_unlock(&ep
->fotg210
->lock
);
73 usb_gadget_giveback_request(&ep
->ep
, &req
->req
);
74 spin_lock(&ep
->fotg210
->lock
);
77 if (list_empty(&ep
->queue
))
78 fotg210_disable_fifo_int(ep
);
80 fotg210_set_cxdone(ep
->fotg210
);
84 static void fotg210_fifo_ep_mapping(struct fotg210_ep
*ep
, u32 epnum
,
87 struct fotg210_udc
*fotg210
= ep
->fotg210
;
90 /* Driver should map an ep to a fifo and then map the fifo
91 * to the ep. What a brain-damaged design!
94 /* map a fifo to an ep */
95 val
= ioread32(fotg210
->reg
+ FOTG210_EPMAP
);
96 val
&= ~EPMAP_FIFONOMSK(epnum
, dir_in
);
97 val
|= EPMAP_FIFONO(epnum
, dir_in
);
98 iowrite32(val
, fotg210
->reg
+ FOTG210_EPMAP
);
100 /* map the ep to the fifo */
101 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOMAP
);
102 val
&= ~FIFOMAP_EPNOMSK(epnum
);
103 val
|= FIFOMAP_EPNO(epnum
);
104 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOMAP
);
107 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOCF
);
108 val
|= FIFOCF_FIFO_EN(epnum
- 1);
109 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOCF
);
112 static void fotg210_set_fifo_dir(struct fotg210_ep
*ep
, u32 epnum
, u32 dir_in
)
114 struct fotg210_udc
*fotg210
= ep
->fotg210
;
117 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOMAP
);
118 val
|= (dir_in
? FIFOMAP_DIRIN(epnum
- 1) : FIFOMAP_DIROUT(epnum
- 1));
119 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOMAP
);
122 static void fotg210_set_tfrtype(struct fotg210_ep
*ep
, u32 epnum
, u32 type
)
124 struct fotg210_udc
*fotg210
= ep
->fotg210
;
127 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOCF
);
128 val
|= FIFOCF_TYPE(type
, epnum
- 1);
129 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOCF
);
132 static void fotg210_set_mps(struct fotg210_ep
*ep
, u32 epnum
, u32 mps
,
135 struct fotg210_udc
*fotg210
= ep
->fotg210
;
137 u32 offset
= dir_in
? FOTG210_INEPMPSR(epnum
) :
138 FOTG210_OUTEPMPSR(epnum
);
140 val
= ioread32(fotg210
->reg
+ offset
);
141 val
|= INOUTEPMPSR_MPS(mps
);
142 iowrite32(val
, fotg210
->reg
+ offset
);
145 static int fotg210_config_ep(struct fotg210_ep
*ep
,
146 const struct usb_endpoint_descriptor
*desc
)
148 struct fotg210_udc
*fotg210
= ep
->fotg210
;
150 fotg210_set_fifo_dir(ep
, ep
->epnum
, ep
->dir_in
);
151 fotg210_set_tfrtype(ep
, ep
->epnum
, ep
->type
);
152 fotg210_set_mps(ep
, ep
->epnum
, ep
->ep
.maxpacket
, ep
->dir_in
);
153 fotg210_fifo_ep_mapping(ep
, ep
->epnum
, ep
->dir_in
);
155 fotg210
->ep
[ep
->epnum
] = ep
;
160 static int fotg210_ep_enable(struct usb_ep
*_ep
,
161 const struct usb_endpoint_descriptor
*desc
)
163 struct fotg210_ep
*ep
;
165 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
168 ep
->epnum
= usb_endpoint_num(desc
);
169 ep
->type
= usb_endpoint_type(desc
);
170 ep
->dir_in
= usb_endpoint_dir_in(desc
);
171 ep
->ep
.maxpacket
= usb_endpoint_maxp(desc
);
173 return fotg210_config_ep(ep
, desc
);
176 static void fotg210_reset_tseq(struct fotg210_udc
*fotg210
, u8 epnum
)
178 struct fotg210_ep
*ep
= fotg210
->ep
[epnum
];
183 fotg210
->reg
+ FOTG210_INEPMPSR(epnum
) :
184 fotg210
->reg
+ FOTG210_OUTEPMPSR(epnum
);
186 /* Note: Driver needs to set and clear INOUTEPMPSR_RESET_TSEQ
187 * bit. Controller wouldn't clear this bit. WTF!!!
190 value
= ioread32(reg
);
191 value
|= INOUTEPMPSR_RESET_TSEQ
;
192 iowrite32(value
, reg
);
194 value
= ioread32(reg
);
195 value
&= ~INOUTEPMPSR_RESET_TSEQ
;
196 iowrite32(value
, reg
);
199 static int fotg210_ep_release(struct fotg210_ep
*ep
)
207 fotg210_reset_tseq(ep
->fotg210
, ep
->epnum
);
212 static int fotg210_ep_disable(struct usb_ep
*_ep
)
214 struct fotg210_ep
*ep
;
215 struct fotg210_request
*req
;
220 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
222 while (!list_empty(&ep
->queue
)) {
223 req
= list_entry(ep
->queue
.next
,
224 struct fotg210_request
, queue
);
225 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
226 fotg210_done(ep
, req
, -ECONNRESET
);
227 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
230 return fotg210_ep_release(ep
);
233 static struct usb_request
*fotg210_ep_alloc_request(struct usb_ep
*_ep
,
236 struct fotg210_request
*req
;
238 req
= kzalloc(sizeof(struct fotg210_request
), gfp_flags
);
242 INIT_LIST_HEAD(&req
->queue
);
247 static void fotg210_ep_free_request(struct usb_ep
*_ep
,
248 struct usb_request
*_req
)
250 struct fotg210_request
*req
;
252 req
= container_of(_req
, struct fotg210_request
, req
);
256 static void fotg210_enable_dma(struct fotg210_ep
*ep
,
257 dma_addr_t d
, u32 len
)
260 struct fotg210_udc
*fotg210
= ep
->fotg210
;
262 /* set transfer length and direction */
263 value
= ioread32(fotg210
->reg
+ FOTG210_DMACPSR1
);
264 value
&= ~(DMACPSR1_DMA_LEN(0xFFFF) | DMACPSR1_DMA_TYPE(1));
265 value
|= DMACPSR1_DMA_LEN(len
) | DMACPSR1_DMA_TYPE(ep
->dir_in
);
266 iowrite32(value
, fotg210
->reg
+ FOTG210_DMACPSR1
);
268 /* set device DMA target FIFO number */
269 value
= ioread32(fotg210
->reg
+ FOTG210_DMATFNR
);
271 value
|= DMATFNR_ACC_FN(ep
->epnum
- 1);
273 value
|= DMATFNR_ACC_CXF
;
274 iowrite32(value
, fotg210
->reg
+ FOTG210_DMATFNR
);
276 /* set DMA memory address */
277 iowrite32(d
, fotg210
->reg
+ FOTG210_DMACPSR2
);
279 /* enable MDMA_EROR and MDMA_CMPLT interrupt */
280 value
= ioread32(fotg210
->reg
+ FOTG210_DMISGR2
);
281 value
&= ~(DMISGR2_MDMA_CMPLT
| DMISGR2_MDMA_ERROR
);
282 iowrite32(value
, fotg210
->reg
+ FOTG210_DMISGR2
);
285 value
= ioread32(fotg210
->reg
+ FOTG210_DMACPSR1
);
286 value
|= DMACPSR1_DMA_START
;
287 iowrite32(value
, fotg210
->reg
+ FOTG210_DMACPSR1
);
290 static void fotg210_disable_dma(struct fotg210_ep
*ep
)
292 iowrite32(DMATFNR_DISDMA
, ep
->fotg210
->reg
+ FOTG210_DMATFNR
);
295 static void fotg210_wait_dma_done(struct fotg210_ep
*ep
)
300 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DISGR2
);
301 if ((value
& DISGR2_USBRST_INT
) ||
302 (value
& DISGR2_DMA_ERROR
))
304 } while (!(value
& DISGR2_DMA_CMPLT
));
306 value
&= ~DISGR2_DMA_CMPLT
;
307 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DISGR2
);
311 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMACPSR1
);
312 value
|= DMACPSR1_DMA_ABORT
;
313 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMACPSR1
);
317 value
= ioread32(ep
->fotg210
->reg
+
318 FOTG210_FIBCR(ep
->epnum
- 1));
319 value
|= FIBCR_FFRST
;
320 iowrite32(value
, ep
->fotg210
->reg
+
321 FOTG210_FIBCR(ep
->epnum
- 1));
323 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DCFESR
);
324 value
|= DCFESR_CX_CLR
;
325 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DCFESR
);
329 static void fotg210_start_dma(struct fotg210_ep
*ep
,
330 struct fotg210_request
*req
)
338 buffer
= req
->req
.buf
;
339 length
= req
->req
.length
;
341 buffer
= req
->req
.buf
+ req
->req
.actual
;
342 length
= ioread32(ep
->fotg210
->reg
+
343 FOTG210_FIBCR(ep
->epnum
- 1));
344 length
&= FIBCR_BCFX
;
347 buffer
= req
->req
.buf
+ req
->req
.actual
;
348 if (req
->req
.length
- req
->req
.actual
> ep
->ep
.maxpacket
)
349 length
= ep
->ep
.maxpacket
;
351 length
= req
->req
.length
;
354 d
= dma_map_single(NULL
, buffer
, length
,
355 ep
->dir_in
? DMA_TO_DEVICE
: DMA_FROM_DEVICE
);
357 if (dma_mapping_error(NULL
, d
)) {
358 pr_err("dma_mapping_error\n");
362 dma_sync_single_for_device(NULL
, d
, length
,
363 ep
->dir_in
? DMA_TO_DEVICE
:
366 fotg210_enable_dma(ep
, d
, length
);
368 /* check if dma is done */
369 fotg210_wait_dma_done(ep
);
371 fotg210_disable_dma(ep
);
373 /* update actual transfer length */
374 req
->req
.actual
+= length
;
376 dma_unmap_single(NULL
, d
, length
, DMA_TO_DEVICE
);
379 static void fotg210_ep0_queue(struct fotg210_ep
*ep
,
380 struct fotg210_request
*req
)
382 if (!req
->req
.length
) {
383 fotg210_done(ep
, req
, 0);
386 if (ep
->dir_in
) { /* if IN */
387 fotg210_start_dma(ep
, req
);
388 if ((req
->req
.length
== req
->req
.actual
) ||
389 (req
->req
.actual
< ep
->ep
.maxpacket
))
390 fotg210_done(ep
, req
, 0);
392 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR0
);
394 value
&= ~DMISGR0_MCX_OUT_INT
;
395 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR0
);
399 static int fotg210_ep_queue(struct usb_ep
*_ep
, struct usb_request
*_req
,
402 struct fotg210_ep
*ep
;
403 struct fotg210_request
*req
;
407 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
408 req
= container_of(_req
, struct fotg210_request
, req
);
410 if (ep
->fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
)
413 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
415 if (list_empty(&ep
->queue
))
418 list_add_tail(&req
->queue
, &ep
->queue
);
421 req
->req
.status
= -EINPROGRESS
;
423 if (!ep
->epnum
) /* ep0 */
424 fotg210_ep0_queue(ep
, req
);
425 else if (request
&& !ep
->stall
)
426 fotg210_enable_fifo_int(ep
);
428 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
433 static int fotg210_ep_dequeue(struct usb_ep
*_ep
, struct usb_request
*_req
)
435 struct fotg210_ep
*ep
;
436 struct fotg210_request
*req
;
439 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
440 req
= container_of(_req
, struct fotg210_request
, req
);
442 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
443 if (!list_empty(&ep
->queue
))
444 fotg210_done(ep
, req
, -ECONNRESET
);
445 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
450 static void fotg210_set_epnstall(struct fotg210_ep
*ep
)
452 struct fotg210_udc
*fotg210
= ep
->fotg210
;
456 /* check if IN FIFO is empty before stall */
459 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
460 } while (!(value
& DCFESR_FIFO_EMPTY(ep
->epnum
- 1)));
464 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
465 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
466 value
= ioread32(reg
);
467 value
|= INOUTEPMPSR_STL_EP
;
468 iowrite32(value
, reg
);
471 static void fotg210_clear_epnstall(struct fotg210_ep
*ep
)
473 struct fotg210_udc
*fotg210
= ep
->fotg210
;
478 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
479 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
480 value
= ioread32(reg
);
481 value
&= ~INOUTEPMPSR_STL_EP
;
482 iowrite32(value
, reg
);
485 static int fotg210_set_halt_and_wedge(struct usb_ep
*_ep
, int value
, int wedge
)
487 struct fotg210_ep
*ep
;
488 struct fotg210_udc
*fotg210
;
492 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
494 fotg210
= ep
->fotg210
;
496 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
499 fotg210_set_epnstall(ep
);
504 fotg210_reset_tseq(fotg210
, ep
->epnum
);
505 fotg210_clear_epnstall(ep
);
508 if (!list_empty(&ep
->queue
))
509 fotg210_enable_fifo_int(ep
);
512 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
516 static int fotg210_ep_set_halt(struct usb_ep
*_ep
, int value
)
518 return fotg210_set_halt_and_wedge(_ep
, value
, 0);
521 static int fotg210_ep_set_wedge(struct usb_ep
*_ep
)
523 return fotg210_set_halt_and_wedge(_ep
, 1, 1);
526 static void fotg210_ep_fifo_flush(struct usb_ep
*_ep
)
530 static const struct usb_ep_ops fotg210_ep_ops
= {
531 .enable
= fotg210_ep_enable
,
532 .disable
= fotg210_ep_disable
,
534 .alloc_request
= fotg210_ep_alloc_request
,
535 .free_request
= fotg210_ep_free_request
,
537 .queue
= fotg210_ep_queue
,
538 .dequeue
= fotg210_ep_dequeue
,
540 .set_halt
= fotg210_ep_set_halt
,
541 .fifo_flush
= fotg210_ep_fifo_flush
,
542 .set_wedge
= fotg210_ep_set_wedge
,
545 static void fotg210_clear_tx0byte(struct fotg210_udc
*fotg210
)
547 u32 value
= ioread32(fotg210
->reg
+ FOTG210_TX0BYTE
);
549 value
&= ~(TX0BYTE_EP1
| TX0BYTE_EP2
| TX0BYTE_EP3
551 iowrite32(value
, fotg210
->reg
+ FOTG210_TX0BYTE
);
554 static void fotg210_clear_rx0byte(struct fotg210_udc
*fotg210
)
556 u32 value
= ioread32(fotg210
->reg
+ FOTG210_RX0BYTE
);
558 value
&= ~(RX0BYTE_EP1
| RX0BYTE_EP2
| RX0BYTE_EP3
560 iowrite32(value
, fotg210
->reg
+ FOTG210_RX0BYTE
);
563 /* read 8-byte setup packet only */
564 static void fotg210_rdsetupp(struct fotg210_udc
*fotg210
,
572 iowrite32(DMATFNR_ACC_CXF
, fotg210
->reg
+ FOTG210_DMATFNR
);
574 for (i
= (length
>> 2); i
> 0; i
--) {
575 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
577 *(tmp
+ 1) = (data
>> 8) & 0xFF;
578 *(tmp
+ 2) = (data
>> 16) & 0xFF;
579 *(tmp
+ 3) = (data
>> 24) & 0xFF;
583 switch (length
% 4) {
585 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
589 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
591 *(tmp
+ 1) = (data
>> 8) & 0xFF;
594 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
596 *(tmp
+ 1) = (data
>> 8) & 0xFF;
597 *(tmp
+ 2) = (data
>> 16) & 0xFF;
603 iowrite32(DMATFNR_DISDMA
, fotg210
->reg
+ FOTG210_DMATFNR
);
606 static void fotg210_set_configuration(struct fotg210_udc
*fotg210
)
608 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DAR
);
610 value
|= DAR_AFT_CONF
;
611 iowrite32(value
, fotg210
->reg
+ FOTG210_DAR
);
614 static void fotg210_set_dev_addr(struct fotg210_udc
*fotg210
, u32 addr
)
616 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DAR
);
618 value
|= (addr
& 0x7F);
619 iowrite32(value
, fotg210
->reg
+ FOTG210_DAR
);
622 static void fotg210_set_cxstall(struct fotg210_udc
*fotg210
)
624 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
626 value
|= DCFESR_CX_STL
;
627 iowrite32(value
, fotg210
->reg
+ FOTG210_DCFESR
);
630 static void fotg210_request_error(struct fotg210_udc
*fotg210
)
632 fotg210_set_cxstall(fotg210
);
633 pr_err("request error!!\n");
636 static void fotg210_set_address(struct fotg210_udc
*fotg210
,
637 struct usb_ctrlrequest
*ctrl
)
639 if (ctrl
->wValue
>= 0x0100) {
640 fotg210_request_error(fotg210
);
642 fotg210_set_dev_addr(fotg210
, ctrl
->wValue
);
643 fotg210_set_cxdone(fotg210
);
647 static void fotg210_set_feature(struct fotg210_udc
*fotg210
,
648 struct usb_ctrlrequest
*ctrl
)
650 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
651 case USB_RECIP_DEVICE
:
652 fotg210_set_cxdone(fotg210
);
654 case USB_RECIP_INTERFACE
:
655 fotg210_set_cxdone(fotg210
);
657 case USB_RECIP_ENDPOINT
: {
659 epnum
= le16_to_cpu(ctrl
->wIndex
) & USB_ENDPOINT_NUMBER_MASK
;
661 fotg210_set_epnstall(fotg210
->ep
[epnum
]);
663 fotg210_set_cxstall(fotg210
);
664 fotg210_set_cxdone(fotg210
);
668 fotg210_request_error(fotg210
);
673 static void fotg210_clear_feature(struct fotg210_udc
*fotg210
,
674 struct usb_ctrlrequest
*ctrl
)
676 struct fotg210_ep
*ep
=
677 fotg210
->ep
[ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
];
679 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
680 case USB_RECIP_DEVICE
:
681 fotg210_set_cxdone(fotg210
);
683 case USB_RECIP_INTERFACE
:
684 fotg210_set_cxdone(fotg210
);
686 case USB_RECIP_ENDPOINT
:
687 if (ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
) {
689 fotg210_set_cxdone(fotg210
);
693 fotg210_set_halt_and_wedge(&ep
->ep
, 0, 0);
695 fotg210_set_cxdone(fotg210
);
698 fotg210_request_error(fotg210
);
703 static int fotg210_is_epnstall(struct fotg210_ep
*ep
)
705 struct fotg210_udc
*fotg210
= ep
->fotg210
;
710 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
711 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
712 value
= ioread32(reg
);
713 return value
& INOUTEPMPSR_STL_EP
? 1 : 0;
716 static void fotg210_get_status(struct fotg210_udc
*fotg210
,
717 struct usb_ctrlrequest
*ctrl
)
721 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
722 case USB_RECIP_DEVICE
:
723 fotg210
->ep0_data
= 1 << USB_DEVICE_SELF_POWERED
;
725 case USB_RECIP_INTERFACE
:
726 fotg210
->ep0_data
= 0;
728 case USB_RECIP_ENDPOINT
:
729 epnum
= ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
;
732 fotg210_is_epnstall(fotg210
->ep
[epnum
])
733 << USB_ENDPOINT_HALT
;
735 fotg210_request_error(fotg210
);
739 fotg210_request_error(fotg210
);
743 fotg210
->ep0_req
->buf
= &fotg210
->ep0_data
;
744 fotg210
->ep0_req
->length
= 2;
746 spin_unlock(&fotg210
->lock
);
747 fotg210_ep_queue(fotg210
->gadget
.ep0
, fotg210
->ep0_req
, GFP_KERNEL
);
748 spin_lock(&fotg210
->lock
);
751 static int fotg210_setup_packet(struct fotg210_udc
*fotg210
,
752 struct usb_ctrlrequest
*ctrl
)
757 fotg210_rdsetupp(fotg210
, p
);
759 fotg210
->ep
[0]->dir_in
= ctrl
->bRequestType
& USB_DIR_IN
;
761 if (fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
) {
762 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
763 fotg210
->gadget
.speed
= value
& DMCR_HS_EN
?
764 USB_SPEED_HIGH
: USB_SPEED_FULL
;
768 if ((ctrl
->bRequestType
& USB_TYPE_MASK
) == USB_TYPE_STANDARD
) {
769 switch (ctrl
->bRequest
) {
770 case USB_REQ_GET_STATUS
:
771 fotg210_get_status(fotg210
, ctrl
);
773 case USB_REQ_CLEAR_FEATURE
:
774 fotg210_clear_feature(fotg210
, ctrl
);
776 case USB_REQ_SET_FEATURE
:
777 fotg210_set_feature(fotg210
, ctrl
);
779 case USB_REQ_SET_ADDRESS
:
780 fotg210_set_address(fotg210
, ctrl
);
782 case USB_REQ_SET_CONFIGURATION
:
783 fotg210_set_configuration(fotg210
);
797 static void fotg210_ep0out(struct fotg210_udc
*fotg210
)
799 struct fotg210_ep
*ep
= fotg210
->ep
[0];
801 if (!list_empty(&ep
->queue
) && !ep
->dir_in
) {
802 struct fotg210_request
*req
;
804 req
= list_first_entry(&ep
->queue
,
805 struct fotg210_request
, queue
);
808 fotg210_start_dma(ep
, req
);
810 if ((req
->req
.length
- req
->req
.actual
) < ep
->ep
.maxpacket
)
811 fotg210_done(ep
, req
, 0);
813 pr_err("%s : empty queue\n", __func__
);
817 static void fotg210_ep0in(struct fotg210_udc
*fotg210
)
819 struct fotg210_ep
*ep
= fotg210
->ep
[0];
821 if ((!list_empty(&ep
->queue
)) && (ep
->dir_in
)) {
822 struct fotg210_request
*req
;
824 req
= list_entry(ep
->queue
.next
,
825 struct fotg210_request
, queue
);
828 fotg210_start_dma(ep
, req
);
830 if ((req
->req
.length
- req
->req
.actual
) < ep
->ep
.maxpacket
)
831 fotg210_done(ep
, req
, 0);
833 fotg210_set_cxdone(fotg210
);
837 static void fotg210_clear_comabt_int(struct fotg210_udc
*fotg210
)
839 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DISGR0
);
841 value
&= ~DISGR0_CX_COMABT_INT
;
842 iowrite32(value
, fotg210
->reg
+ FOTG210_DISGR0
);
845 static void fotg210_in_fifo_handler(struct fotg210_ep
*ep
)
847 struct fotg210_request
*req
= list_entry(ep
->queue
.next
,
848 struct fotg210_request
, queue
);
851 fotg210_start_dma(ep
, req
);
852 fotg210_done(ep
, req
, 0);
855 static void fotg210_out_fifo_handler(struct fotg210_ep
*ep
)
857 struct fotg210_request
*req
= list_entry(ep
->queue
.next
,
858 struct fotg210_request
, queue
);
860 fotg210_start_dma(ep
, req
);
862 /* finish out transfer */
863 if (req
->req
.length
== req
->req
.actual
||
864 req
->req
.actual
< ep
->ep
.maxpacket
)
865 fotg210_done(ep
, req
, 0);
868 static irqreturn_t
fotg210_irq(int irq
, void *_fotg210
)
870 struct fotg210_udc
*fotg210
= _fotg210
;
871 u32 int_grp
= ioread32(fotg210
->reg
+ FOTG210_DIGR
);
872 u32 int_msk
= ioread32(fotg210
->reg
+ FOTG210_DMIGR
);
876 spin_lock(&fotg210
->lock
);
878 if (int_grp
& DIGR_INT_G2
) {
879 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR2
;
880 u32 int_grp2
= ioread32(reg
);
881 u32 int_msk2
= ioread32(fotg210
->reg
+ FOTG210_DMISGR2
);
884 int_grp2
&= ~int_msk2
;
886 if (int_grp2
& DISGR2_USBRST_INT
) {
887 value
= ioread32(reg
);
888 value
&= ~DISGR2_USBRST_INT
;
889 iowrite32(value
, reg
);
890 pr_info("fotg210 udc reset\n");
892 if (int_grp2
& DISGR2_SUSP_INT
) {
893 value
= ioread32(reg
);
894 value
&= ~DISGR2_SUSP_INT
;
895 iowrite32(value
, reg
);
896 pr_info("fotg210 udc suspend\n");
898 if (int_grp2
& DISGR2_RESM_INT
) {
899 value
= ioread32(reg
);
900 value
&= ~DISGR2_RESM_INT
;
901 iowrite32(value
, reg
);
902 pr_info("fotg210 udc resume\n");
904 if (int_grp2
& DISGR2_ISO_SEQ_ERR_INT
) {
905 value
= ioread32(reg
);
906 value
&= ~DISGR2_ISO_SEQ_ERR_INT
;
907 iowrite32(value
, reg
);
908 pr_info("fotg210 iso sequence error\n");
910 if (int_grp2
& DISGR2_ISO_SEQ_ABORT_INT
) {
911 value
= ioread32(reg
);
912 value
&= ~DISGR2_ISO_SEQ_ABORT_INT
;
913 iowrite32(value
, reg
);
914 pr_info("fotg210 iso sequence abort\n");
916 if (int_grp2
& DISGR2_TX0BYTE_INT
) {
917 fotg210_clear_tx0byte(fotg210
);
918 value
= ioread32(reg
);
919 value
&= ~DISGR2_TX0BYTE_INT
;
920 iowrite32(value
, reg
);
921 pr_info("fotg210 transferred 0 byte\n");
923 if (int_grp2
& DISGR2_RX0BYTE_INT
) {
924 fotg210_clear_rx0byte(fotg210
);
925 value
= ioread32(reg
);
926 value
&= ~DISGR2_RX0BYTE_INT
;
927 iowrite32(value
, reg
);
928 pr_info("fotg210 received 0 byte\n");
930 if (int_grp2
& DISGR2_DMA_ERROR
) {
931 value
= ioread32(reg
);
932 value
&= ~DISGR2_DMA_ERROR
;
933 iowrite32(value
, reg
);
937 if (int_grp
& DIGR_INT_G0
) {
938 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR0
;
939 u32 int_grp0
= ioread32(reg
);
940 u32 int_msk0
= ioread32(fotg210
->reg
+ FOTG210_DMISGR0
);
941 struct usb_ctrlrequest ctrl
;
943 int_grp0
&= ~int_msk0
;
945 /* the highest priority in this source register */
946 if (int_grp0
& DISGR0_CX_COMABT_INT
) {
947 fotg210_clear_comabt_int(fotg210
);
948 pr_info("fotg210 CX command abort\n");
951 if (int_grp0
& DISGR0_CX_SETUP_INT
) {
952 if (fotg210_setup_packet(fotg210
, &ctrl
)) {
953 spin_unlock(&fotg210
->lock
);
954 if (fotg210
->driver
->setup(&fotg210
->gadget
,
956 fotg210_set_cxstall(fotg210
);
957 spin_lock(&fotg210
->lock
);
960 if (int_grp0
& DISGR0_CX_COMEND_INT
)
961 pr_info("fotg210 cmd end\n");
963 if (int_grp0
& DISGR0_CX_IN_INT
)
964 fotg210_ep0in(fotg210
);
966 if (int_grp0
& DISGR0_CX_OUT_INT
)
967 fotg210_ep0out(fotg210
);
969 if (int_grp0
& DISGR0_CX_COMFAIL_INT
) {
970 fotg210_set_cxstall(fotg210
);
971 pr_info("fotg210 ep0 fail\n");
975 if (int_grp
& DIGR_INT_G1
) {
976 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR1
;
977 u32 int_grp1
= ioread32(reg
);
978 u32 int_msk1
= ioread32(fotg210
->reg
+ FOTG210_DMISGR1
);
981 int_grp1
&= ~int_msk1
;
983 for (fifo
= 0; fifo
< FOTG210_MAX_FIFO_NUM
; fifo
++) {
984 if (int_grp1
& DISGR1_IN_INT(fifo
))
985 fotg210_in_fifo_handler(fotg210
->ep
[fifo
+ 1]);
987 if ((int_grp1
& DISGR1_OUT_INT(fifo
)) ||
988 (int_grp1
& DISGR1_SPK_INT(fifo
)))
989 fotg210_out_fifo_handler(fotg210
->ep
[fifo
+ 1]);
993 spin_unlock(&fotg210
->lock
);
998 static void fotg210_disable_unplug(struct fotg210_udc
*fotg210
)
1000 u32 reg
= ioread32(fotg210
->reg
+ FOTG210_PHYTMSR
);
1002 reg
&= ~PHYTMSR_UNPLUG
;
1003 iowrite32(reg
, fotg210
->reg
+ FOTG210_PHYTMSR
);
1006 static int fotg210_udc_start(struct usb_gadget
*g
,
1007 struct usb_gadget_driver
*driver
)
1009 struct fotg210_udc
*fotg210
= gadget_to_fotg210(g
);
1012 /* hook up the driver */
1013 driver
->driver
.bus
= NULL
;
1014 fotg210
->driver
= driver
;
1016 /* enable device global interrupt */
1017 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
1018 value
|= DMCR_GLINT_EN
;
1019 iowrite32(value
, fotg210
->reg
+ FOTG210_DMCR
);
1024 static void fotg210_init(struct fotg210_udc
*fotg210
)
1028 /* disable global interrupt and set int polarity to active high */
1029 iowrite32(GMIR_MHC_INT
| GMIR_MOTG_INT
| GMIR_INT_POLARITY
,
1030 fotg210
->reg
+ FOTG210_GMIR
);
1032 /* disable device global interrupt */
1033 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
1034 value
&= ~DMCR_GLINT_EN
;
1035 iowrite32(value
, fotg210
->reg
+ FOTG210_DMCR
);
1037 /* disable all fifo interrupt */
1038 iowrite32(~(u32
)0, fotg210
->reg
+ FOTG210_DMISGR1
);
1040 /* disable cmd end */
1041 value
= ioread32(fotg210
->reg
+ FOTG210_DMISGR0
);
1042 value
|= DMISGR0_MCX_COMEND
;
1043 iowrite32(value
, fotg210
->reg
+ FOTG210_DMISGR0
);
1046 static int fotg210_udc_stop(struct usb_gadget
*g
)
1048 struct fotg210_udc
*fotg210
= gadget_to_fotg210(g
);
1049 unsigned long flags
;
1051 spin_lock_irqsave(&fotg210
->lock
, flags
);
1053 fotg210_init(fotg210
);
1054 fotg210
->driver
= NULL
;
1056 spin_unlock_irqrestore(&fotg210
->lock
, flags
);
1061 static const struct usb_gadget_ops fotg210_gadget_ops
= {
1062 .udc_start
= fotg210_udc_start
,
1063 .udc_stop
= fotg210_udc_stop
,
1066 static int fotg210_udc_remove(struct platform_device
*pdev
)
1068 struct fotg210_udc
*fotg210
= platform_get_drvdata(pdev
);
1070 usb_del_gadget_udc(&fotg210
->gadget
);
1071 iounmap(fotg210
->reg
);
1072 free_irq(platform_get_irq(pdev
, 0), fotg210
);
1074 fotg210_ep_free_request(&fotg210
->ep
[0]->ep
, fotg210
->ep0_req
);
1080 static int fotg210_udc_probe(struct platform_device
*pdev
)
1082 struct resource
*res
, *ires
;
1083 struct fotg210_udc
*fotg210
= NULL
;
1084 struct fotg210_ep
*_ep
[FOTG210_MAX_NUM_EP
];
1088 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1090 pr_err("platform_get_resource error.\n");
1094 ires
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
1096 pr_err("platform_get_resource IORESOURCE_IRQ error.\n");
1102 /* initialize udc */
1103 fotg210
= kzalloc(sizeof(struct fotg210_udc
), GFP_KERNEL
);
1104 if (fotg210
== NULL
)
1107 for (i
= 0; i
< FOTG210_MAX_NUM_EP
; i
++) {
1108 _ep
[i
] = kzalloc(sizeof(struct fotg210_ep
), GFP_KERNEL
);
1111 fotg210
->ep
[i
] = _ep
[i
];
1114 fotg210
->reg
= ioremap(res
->start
, resource_size(res
));
1115 if (fotg210
->reg
== NULL
) {
1116 pr_err("ioremap error.\n");
1120 spin_lock_init(&fotg210
->lock
);
1122 platform_set_drvdata(pdev
, fotg210
);
1124 fotg210
->gadget
.ops
= &fotg210_gadget_ops
;
1126 fotg210
->gadget
.max_speed
= USB_SPEED_HIGH
;
1127 fotg210
->gadget
.dev
.parent
= &pdev
->dev
;
1128 fotg210
->gadget
.dev
.dma_mask
= pdev
->dev
.dma_mask
;
1129 fotg210
->gadget
.name
= udc_name
;
1131 INIT_LIST_HEAD(&fotg210
->gadget
.ep_list
);
1133 for (i
= 0; i
< FOTG210_MAX_NUM_EP
; i
++) {
1134 struct fotg210_ep
*ep
= fotg210
->ep
[i
];
1137 INIT_LIST_HEAD(&fotg210
->ep
[i
]->ep
.ep_list
);
1138 list_add_tail(&fotg210
->ep
[i
]->ep
.ep_list
,
1139 &fotg210
->gadget
.ep_list
);
1141 ep
->fotg210
= fotg210
;
1142 INIT_LIST_HEAD(&ep
->queue
);
1143 ep
->ep
.name
= fotg210_ep_name
[i
];
1144 ep
->ep
.ops
= &fotg210_ep_ops
;
1145 usb_ep_set_maxpacket_limit(&ep
->ep
, (unsigned short) ~0);
1148 ep
->ep
.caps
.type_control
= true;
1150 ep
->ep
.caps
.type_iso
= true;
1151 ep
->ep
.caps
.type_bulk
= true;
1152 ep
->ep
.caps
.type_int
= true;
1155 ep
->ep
.caps
.dir_in
= true;
1156 ep
->ep
.caps
.dir_out
= true;
1158 usb_ep_set_maxpacket_limit(&fotg210
->ep
[0]->ep
, 0x40);
1159 fotg210
->gadget
.ep0
= &fotg210
->ep
[0]->ep
;
1160 INIT_LIST_HEAD(&fotg210
->gadget
.ep0
->ep_list
);
1162 fotg210
->ep0_req
= fotg210_ep_alloc_request(&fotg210
->ep
[0]->ep
,
1164 if (fotg210
->ep0_req
== NULL
)
1167 fotg210_init(fotg210
);
1169 fotg210_disable_unplug(fotg210
);
1171 ret
= request_irq(ires
->start
, fotg210_irq
, IRQF_SHARED
,
1174 pr_err("request_irq error (%d)\n", ret
);
1178 ret
= usb_add_gadget_udc(&pdev
->dev
, &fotg210
->gadget
);
1182 dev_info(&pdev
->dev
, "version %s\n", DRIVER_VERSION
);
1187 free_irq(ires
->start
, fotg210
);
1190 fotg210_ep_free_request(&fotg210
->ep
[0]->ep
, fotg210
->ep0_req
);
1194 iounmap(fotg210
->reg
);
1202 static struct platform_driver fotg210_driver
= {
1204 .name
= (char *)udc_name
,
1206 .probe
= fotg210_udc_probe
,
1207 .remove
= fotg210_udc_remove
,
1210 module_platform_driver(fotg210_driver
);
1212 MODULE_AUTHOR("Yuan-Hsin Chen, Feng-Hsin Chiang <john453@faraday-tech.com>");
1213 MODULE_LICENSE("GPL");
1214 MODULE_DESCRIPTION(DRIVER_DESC
);