1 // SPDX-License-Identifier: GPL-2.0
3 * FOTG210 UDC Driver supports Bulk transfer so far
5 * Copyright (C) 2013 Faraday Technology Corporation
7 * Author : Yuan-Hsin Chen <yhchen@faraday-tech.com>
10 #include <linux/dma-mapping.h>
11 #include <linux/err.h>
12 #include <linux/interrupt.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/usb/ch9.h>
17 #include <linux/usb/gadget.h>
21 #define DRIVER_DESC "FOTG210 USB Device Controller Driver"
22 #define DRIVER_VERSION "30-April-2013"
24 static const char udc_name
[] = "fotg210_udc";
25 static const char * const fotg210_ep_name
[] = {
26 "ep0", "ep1", "ep2", "ep3", "ep4"};
28 static void fotg210_disable_fifo_int(struct fotg210_ep
*ep
)
30 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
33 value
|= DMISGR1_MF_IN_INT(ep
->epnum
- 1);
35 value
|= DMISGR1_MF_OUTSPK_INT(ep
->epnum
- 1);
36 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
39 static void fotg210_enable_fifo_int(struct fotg210_ep
*ep
)
41 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
44 value
&= ~DMISGR1_MF_IN_INT(ep
->epnum
- 1);
46 value
&= ~DMISGR1_MF_OUTSPK_INT(ep
->epnum
- 1);
47 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR1
);
50 static void fotg210_set_cxdone(struct fotg210_udc
*fotg210
)
52 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
54 value
|= DCFESR_CX_DONE
;
55 iowrite32(value
, fotg210
->reg
+ FOTG210_DCFESR
);
58 static void fotg210_done(struct fotg210_ep
*ep
, struct fotg210_request
*req
,
61 list_del_init(&req
->queue
);
63 /* don't modify queue heads during completion callback */
64 if (ep
->fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
)
65 req
->req
.status
= -ESHUTDOWN
;
67 req
->req
.status
= status
;
69 spin_unlock(&ep
->fotg210
->lock
);
70 usb_gadget_giveback_request(&ep
->ep
, &req
->req
);
71 spin_lock(&ep
->fotg210
->lock
);
74 if (list_empty(&ep
->queue
))
75 fotg210_disable_fifo_int(ep
);
77 fotg210_set_cxdone(ep
->fotg210
);
81 static void fotg210_fifo_ep_mapping(struct fotg210_ep
*ep
, u32 epnum
,
84 struct fotg210_udc
*fotg210
= ep
->fotg210
;
87 /* Driver should map an ep to a fifo and then map the fifo
88 * to the ep. What a brain-damaged design!
91 /* map a fifo to an ep */
92 val
= ioread32(fotg210
->reg
+ FOTG210_EPMAP
);
93 val
&= ~EPMAP_FIFONOMSK(epnum
, dir_in
);
94 val
|= EPMAP_FIFONO(epnum
, dir_in
);
95 iowrite32(val
, fotg210
->reg
+ FOTG210_EPMAP
);
97 /* map the ep to the fifo */
98 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOMAP
);
99 val
&= ~FIFOMAP_EPNOMSK(epnum
);
100 val
|= FIFOMAP_EPNO(epnum
);
101 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOMAP
);
104 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOCF
);
105 val
|= FIFOCF_FIFO_EN(epnum
- 1);
106 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOCF
);
109 static void fotg210_set_fifo_dir(struct fotg210_ep
*ep
, u32 epnum
, u32 dir_in
)
111 struct fotg210_udc
*fotg210
= ep
->fotg210
;
114 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOMAP
);
115 val
|= (dir_in
? FIFOMAP_DIRIN(epnum
- 1) : FIFOMAP_DIROUT(epnum
- 1));
116 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOMAP
);
119 static void fotg210_set_tfrtype(struct fotg210_ep
*ep
, u32 epnum
, u32 type
)
121 struct fotg210_udc
*fotg210
= ep
->fotg210
;
124 val
= ioread32(fotg210
->reg
+ FOTG210_FIFOCF
);
125 val
|= FIFOCF_TYPE(type
, epnum
- 1);
126 iowrite32(val
, fotg210
->reg
+ FOTG210_FIFOCF
);
129 static void fotg210_set_mps(struct fotg210_ep
*ep
, u32 epnum
, u32 mps
,
132 struct fotg210_udc
*fotg210
= ep
->fotg210
;
134 u32 offset
= dir_in
? FOTG210_INEPMPSR(epnum
) :
135 FOTG210_OUTEPMPSR(epnum
);
137 val
= ioread32(fotg210
->reg
+ offset
);
138 val
|= INOUTEPMPSR_MPS(mps
);
139 iowrite32(val
, fotg210
->reg
+ offset
);
142 static int fotg210_config_ep(struct fotg210_ep
*ep
,
143 const struct usb_endpoint_descriptor
*desc
)
145 struct fotg210_udc
*fotg210
= ep
->fotg210
;
147 fotg210_set_fifo_dir(ep
, ep
->epnum
, ep
->dir_in
);
148 fotg210_set_tfrtype(ep
, ep
->epnum
, ep
->type
);
149 fotg210_set_mps(ep
, ep
->epnum
, ep
->ep
.maxpacket
, ep
->dir_in
);
150 fotg210_fifo_ep_mapping(ep
, ep
->epnum
, ep
->dir_in
);
152 fotg210
->ep
[ep
->epnum
] = ep
;
157 static int fotg210_ep_enable(struct usb_ep
*_ep
,
158 const struct usb_endpoint_descriptor
*desc
)
160 struct fotg210_ep
*ep
;
162 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
165 ep
->epnum
= usb_endpoint_num(desc
);
166 ep
->type
= usb_endpoint_type(desc
);
167 ep
->dir_in
= usb_endpoint_dir_in(desc
);
168 ep
->ep
.maxpacket
= usb_endpoint_maxp(desc
);
170 return fotg210_config_ep(ep
, desc
);
173 static void fotg210_reset_tseq(struct fotg210_udc
*fotg210
, u8 epnum
)
175 struct fotg210_ep
*ep
= fotg210
->ep
[epnum
];
180 fotg210
->reg
+ FOTG210_INEPMPSR(epnum
) :
181 fotg210
->reg
+ FOTG210_OUTEPMPSR(epnum
);
183 /* Note: Driver needs to set and clear INOUTEPMPSR_RESET_TSEQ
184 * bit. Controller wouldn't clear this bit. WTF!!!
187 value
= ioread32(reg
);
188 value
|= INOUTEPMPSR_RESET_TSEQ
;
189 iowrite32(value
, reg
);
191 value
= ioread32(reg
);
192 value
&= ~INOUTEPMPSR_RESET_TSEQ
;
193 iowrite32(value
, reg
);
196 static int fotg210_ep_release(struct fotg210_ep
*ep
)
204 fotg210_reset_tseq(ep
->fotg210
, ep
->epnum
);
209 static int fotg210_ep_disable(struct usb_ep
*_ep
)
211 struct fotg210_ep
*ep
;
212 struct fotg210_request
*req
;
217 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
219 while (!list_empty(&ep
->queue
)) {
220 req
= list_entry(ep
->queue
.next
,
221 struct fotg210_request
, queue
);
222 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
223 fotg210_done(ep
, req
, -ECONNRESET
);
224 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
227 return fotg210_ep_release(ep
);
230 static struct usb_request
*fotg210_ep_alloc_request(struct usb_ep
*_ep
,
233 struct fotg210_request
*req
;
235 req
= kzalloc(sizeof(struct fotg210_request
), gfp_flags
);
239 INIT_LIST_HEAD(&req
->queue
);
244 static void fotg210_ep_free_request(struct usb_ep
*_ep
,
245 struct usb_request
*_req
)
247 struct fotg210_request
*req
;
249 req
= container_of(_req
, struct fotg210_request
, req
);
253 static void fotg210_enable_dma(struct fotg210_ep
*ep
,
254 dma_addr_t d
, u32 len
)
257 struct fotg210_udc
*fotg210
= ep
->fotg210
;
259 /* set transfer length and direction */
260 value
= ioread32(fotg210
->reg
+ FOTG210_DMACPSR1
);
261 value
&= ~(DMACPSR1_DMA_LEN(0xFFFF) | DMACPSR1_DMA_TYPE(1));
262 value
|= DMACPSR1_DMA_LEN(len
) | DMACPSR1_DMA_TYPE(ep
->dir_in
);
263 iowrite32(value
, fotg210
->reg
+ FOTG210_DMACPSR1
);
265 /* set device DMA target FIFO number */
266 value
= ioread32(fotg210
->reg
+ FOTG210_DMATFNR
);
268 value
|= DMATFNR_ACC_FN(ep
->epnum
- 1);
270 value
|= DMATFNR_ACC_CXF
;
271 iowrite32(value
, fotg210
->reg
+ FOTG210_DMATFNR
);
273 /* set DMA memory address */
274 iowrite32(d
, fotg210
->reg
+ FOTG210_DMACPSR2
);
276 /* enable MDMA_EROR and MDMA_CMPLT interrupt */
277 value
= ioread32(fotg210
->reg
+ FOTG210_DMISGR2
);
278 value
&= ~(DMISGR2_MDMA_CMPLT
| DMISGR2_MDMA_ERROR
);
279 iowrite32(value
, fotg210
->reg
+ FOTG210_DMISGR2
);
282 value
= ioread32(fotg210
->reg
+ FOTG210_DMACPSR1
);
283 value
|= DMACPSR1_DMA_START
;
284 iowrite32(value
, fotg210
->reg
+ FOTG210_DMACPSR1
);
287 static void fotg210_disable_dma(struct fotg210_ep
*ep
)
289 iowrite32(DMATFNR_DISDMA
, ep
->fotg210
->reg
+ FOTG210_DMATFNR
);
292 static void fotg210_wait_dma_done(struct fotg210_ep
*ep
)
297 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DISGR2
);
298 if ((value
& DISGR2_USBRST_INT
) ||
299 (value
& DISGR2_DMA_ERROR
))
301 } while (!(value
& DISGR2_DMA_CMPLT
));
303 value
&= ~DISGR2_DMA_CMPLT
;
304 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DISGR2
);
308 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMACPSR1
);
309 value
|= DMACPSR1_DMA_ABORT
;
310 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMACPSR1
);
314 value
= ioread32(ep
->fotg210
->reg
+
315 FOTG210_FIBCR(ep
->epnum
- 1));
316 value
|= FIBCR_FFRST
;
317 iowrite32(value
, ep
->fotg210
->reg
+
318 FOTG210_FIBCR(ep
->epnum
- 1));
320 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DCFESR
);
321 value
|= DCFESR_CX_CLR
;
322 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DCFESR
);
326 static void fotg210_start_dma(struct fotg210_ep
*ep
,
327 struct fotg210_request
*req
)
335 buffer
= req
->req
.buf
;
336 length
= req
->req
.length
;
338 buffer
= req
->req
.buf
+ req
->req
.actual
;
339 length
= ioread32(ep
->fotg210
->reg
+
340 FOTG210_FIBCR(ep
->epnum
- 1));
341 length
&= FIBCR_BCFX
;
344 buffer
= req
->req
.buf
+ req
->req
.actual
;
345 if (req
->req
.length
- req
->req
.actual
> ep
->ep
.maxpacket
)
346 length
= ep
->ep
.maxpacket
;
348 length
= req
->req
.length
;
351 d
= dma_map_single(NULL
, buffer
, length
,
352 ep
->dir_in
? DMA_TO_DEVICE
: DMA_FROM_DEVICE
);
354 if (dma_mapping_error(NULL
, d
)) {
355 pr_err("dma_mapping_error\n");
359 dma_sync_single_for_device(NULL
, d
, length
,
360 ep
->dir_in
? DMA_TO_DEVICE
:
363 fotg210_enable_dma(ep
, d
, length
);
365 /* check if dma is done */
366 fotg210_wait_dma_done(ep
);
368 fotg210_disable_dma(ep
);
370 /* update actual transfer length */
371 req
->req
.actual
+= length
;
373 dma_unmap_single(NULL
, d
, length
, DMA_TO_DEVICE
);
376 static void fotg210_ep0_queue(struct fotg210_ep
*ep
,
377 struct fotg210_request
*req
)
379 if (!req
->req
.length
) {
380 fotg210_done(ep
, req
, 0);
383 if (ep
->dir_in
) { /* if IN */
384 fotg210_start_dma(ep
, req
);
385 if ((req
->req
.length
== req
->req
.actual
) ||
386 (req
->req
.actual
< ep
->ep
.maxpacket
))
387 fotg210_done(ep
, req
, 0);
389 u32 value
= ioread32(ep
->fotg210
->reg
+ FOTG210_DMISGR0
);
391 value
&= ~DMISGR0_MCX_OUT_INT
;
392 iowrite32(value
, ep
->fotg210
->reg
+ FOTG210_DMISGR0
);
396 static int fotg210_ep_queue(struct usb_ep
*_ep
, struct usb_request
*_req
,
399 struct fotg210_ep
*ep
;
400 struct fotg210_request
*req
;
404 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
405 req
= container_of(_req
, struct fotg210_request
, req
);
407 if (ep
->fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
)
410 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
412 if (list_empty(&ep
->queue
))
415 list_add_tail(&req
->queue
, &ep
->queue
);
418 req
->req
.status
= -EINPROGRESS
;
420 if (!ep
->epnum
) /* ep0 */
421 fotg210_ep0_queue(ep
, req
);
422 else if (request
&& !ep
->stall
)
423 fotg210_enable_fifo_int(ep
);
425 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
430 static int fotg210_ep_dequeue(struct usb_ep
*_ep
, struct usb_request
*_req
)
432 struct fotg210_ep
*ep
;
433 struct fotg210_request
*req
;
436 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
437 req
= container_of(_req
, struct fotg210_request
, req
);
439 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
440 if (!list_empty(&ep
->queue
))
441 fotg210_done(ep
, req
, -ECONNRESET
);
442 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
447 static void fotg210_set_epnstall(struct fotg210_ep
*ep
)
449 struct fotg210_udc
*fotg210
= ep
->fotg210
;
453 /* check if IN FIFO is empty before stall */
456 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
457 } while (!(value
& DCFESR_FIFO_EMPTY(ep
->epnum
- 1)));
461 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
462 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
463 value
= ioread32(reg
);
464 value
|= INOUTEPMPSR_STL_EP
;
465 iowrite32(value
, reg
);
468 static void fotg210_clear_epnstall(struct fotg210_ep
*ep
)
470 struct fotg210_udc
*fotg210
= ep
->fotg210
;
475 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
476 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
477 value
= ioread32(reg
);
478 value
&= ~INOUTEPMPSR_STL_EP
;
479 iowrite32(value
, reg
);
482 static int fotg210_set_halt_and_wedge(struct usb_ep
*_ep
, int value
, int wedge
)
484 struct fotg210_ep
*ep
;
485 struct fotg210_udc
*fotg210
;
489 ep
= container_of(_ep
, struct fotg210_ep
, ep
);
491 fotg210
= ep
->fotg210
;
493 spin_lock_irqsave(&ep
->fotg210
->lock
, flags
);
496 fotg210_set_epnstall(ep
);
501 fotg210_reset_tseq(fotg210
, ep
->epnum
);
502 fotg210_clear_epnstall(ep
);
505 if (!list_empty(&ep
->queue
))
506 fotg210_enable_fifo_int(ep
);
509 spin_unlock_irqrestore(&ep
->fotg210
->lock
, flags
);
513 static int fotg210_ep_set_halt(struct usb_ep
*_ep
, int value
)
515 return fotg210_set_halt_and_wedge(_ep
, value
, 0);
518 static int fotg210_ep_set_wedge(struct usb_ep
*_ep
)
520 return fotg210_set_halt_and_wedge(_ep
, 1, 1);
523 static void fotg210_ep_fifo_flush(struct usb_ep
*_ep
)
527 static const struct usb_ep_ops fotg210_ep_ops
= {
528 .enable
= fotg210_ep_enable
,
529 .disable
= fotg210_ep_disable
,
531 .alloc_request
= fotg210_ep_alloc_request
,
532 .free_request
= fotg210_ep_free_request
,
534 .queue
= fotg210_ep_queue
,
535 .dequeue
= fotg210_ep_dequeue
,
537 .set_halt
= fotg210_ep_set_halt
,
538 .fifo_flush
= fotg210_ep_fifo_flush
,
539 .set_wedge
= fotg210_ep_set_wedge
,
542 static void fotg210_clear_tx0byte(struct fotg210_udc
*fotg210
)
544 u32 value
= ioread32(fotg210
->reg
+ FOTG210_TX0BYTE
);
546 value
&= ~(TX0BYTE_EP1
| TX0BYTE_EP2
| TX0BYTE_EP3
548 iowrite32(value
, fotg210
->reg
+ FOTG210_TX0BYTE
);
551 static void fotg210_clear_rx0byte(struct fotg210_udc
*fotg210
)
553 u32 value
= ioread32(fotg210
->reg
+ FOTG210_RX0BYTE
);
555 value
&= ~(RX0BYTE_EP1
| RX0BYTE_EP2
| RX0BYTE_EP3
557 iowrite32(value
, fotg210
->reg
+ FOTG210_RX0BYTE
);
560 /* read 8-byte setup packet only */
561 static void fotg210_rdsetupp(struct fotg210_udc
*fotg210
,
569 iowrite32(DMATFNR_ACC_CXF
, fotg210
->reg
+ FOTG210_DMATFNR
);
571 for (i
= (length
>> 2); i
> 0; i
--) {
572 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
574 *(tmp
+ 1) = (data
>> 8) & 0xFF;
575 *(tmp
+ 2) = (data
>> 16) & 0xFF;
576 *(tmp
+ 3) = (data
>> 24) & 0xFF;
580 switch (length
% 4) {
582 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
586 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
588 *(tmp
+ 1) = (data
>> 8) & 0xFF;
591 data
= ioread32(fotg210
->reg
+ FOTG210_CXPORT
);
593 *(tmp
+ 1) = (data
>> 8) & 0xFF;
594 *(tmp
+ 2) = (data
>> 16) & 0xFF;
600 iowrite32(DMATFNR_DISDMA
, fotg210
->reg
+ FOTG210_DMATFNR
);
603 static void fotg210_set_configuration(struct fotg210_udc
*fotg210
)
605 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DAR
);
607 value
|= DAR_AFT_CONF
;
608 iowrite32(value
, fotg210
->reg
+ FOTG210_DAR
);
611 static void fotg210_set_dev_addr(struct fotg210_udc
*fotg210
, u32 addr
)
613 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DAR
);
615 value
|= (addr
& 0x7F);
616 iowrite32(value
, fotg210
->reg
+ FOTG210_DAR
);
619 static void fotg210_set_cxstall(struct fotg210_udc
*fotg210
)
621 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DCFESR
);
623 value
|= DCFESR_CX_STL
;
624 iowrite32(value
, fotg210
->reg
+ FOTG210_DCFESR
);
627 static void fotg210_request_error(struct fotg210_udc
*fotg210
)
629 fotg210_set_cxstall(fotg210
);
630 pr_err("request error!!\n");
633 static void fotg210_set_address(struct fotg210_udc
*fotg210
,
634 struct usb_ctrlrequest
*ctrl
)
636 if (ctrl
->wValue
>= 0x0100) {
637 fotg210_request_error(fotg210
);
639 fotg210_set_dev_addr(fotg210
, ctrl
->wValue
);
640 fotg210_set_cxdone(fotg210
);
644 static void fotg210_set_feature(struct fotg210_udc
*fotg210
,
645 struct usb_ctrlrequest
*ctrl
)
647 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
648 case USB_RECIP_DEVICE
:
649 fotg210_set_cxdone(fotg210
);
651 case USB_RECIP_INTERFACE
:
652 fotg210_set_cxdone(fotg210
);
654 case USB_RECIP_ENDPOINT
: {
656 epnum
= le16_to_cpu(ctrl
->wIndex
) & USB_ENDPOINT_NUMBER_MASK
;
658 fotg210_set_epnstall(fotg210
->ep
[epnum
]);
660 fotg210_set_cxstall(fotg210
);
661 fotg210_set_cxdone(fotg210
);
665 fotg210_request_error(fotg210
);
670 static void fotg210_clear_feature(struct fotg210_udc
*fotg210
,
671 struct usb_ctrlrequest
*ctrl
)
673 struct fotg210_ep
*ep
=
674 fotg210
->ep
[ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
];
676 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
677 case USB_RECIP_DEVICE
:
678 fotg210_set_cxdone(fotg210
);
680 case USB_RECIP_INTERFACE
:
681 fotg210_set_cxdone(fotg210
);
683 case USB_RECIP_ENDPOINT
:
684 if (ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
) {
686 fotg210_set_cxdone(fotg210
);
690 fotg210_set_halt_and_wedge(&ep
->ep
, 0, 0);
692 fotg210_set_cxdone(fotg210
);
695 fotg210_request_error(fotg210
);
700 static int fotg210_is_epnstall(struct fotg210_ep
*ep
)
702 struct fotg210_udc
*fotg210
= ep
->fotg210
;
707 fotg210
->reg
+ FOTG210_INEPMPSR(ep
->epnum
) :
708 fotg210
->reg
+ FOTG210_OUTEPMPSR(ep
->epnum
);
709 value
= ioread32(reg
);
710 return value
& INOUTEPMPSR_STL_EP
? 1 : 0;
713 static void fotg210_get_status(struct fotg210_udc
*fotg210
,
714 struct usb_ctrlrequest
*ctrl
)
718 switch (ctrl
->bRequestType
& USB_RECIP_MASK
) {
719 case USB_RECIP_DEVICE
:
720 fotg210
->ep0_data
= 1 << USB_DEVICE_SELF_POWERED
;
722 case USB_RECIP_INTERFACE
:
723 fotg210
->ep0_data
= 0;
725 case USB_RECIP_ENDPOINT
:
726 epnum
= ctrl
->wIndex
& USB_ENDPOINT_NUMBER_MASK
;
729 fotg210_is_epnstall(fotg210
->ep
[epnum
])
730 << USB_ENDPOINT_HALT
;
732 fotg210_request_error(fotg210
);
736 fotg210_request_error(fotg210
);
740 fotg210
->ep0_req
->buf
= &fotg210
->ep0_data
;
741 fotg210
->ep0_req
->length
= 2;
743 spin_unlock(&fotg210
->lock
);
744 fotg210_ep_queue(fotg210
->gadget
.ep0
, fotg210
->ep0_req
, GFP_ATOMIC
);
745 spin_lock(&fotg210
->lock
);
748 static int fotg210_setup_packet(struct fotg210_udc
*fotg210
,
749 struct usb_ctrlrequest
*ctrl
)
754 fotg210_rdsetupp(fotg210
, p
);
756 fotg210
->ep
[0]->dir_in
= ctrl
->bRequestType
& USB_DIR_IN
;
758 if (fotg210
->gadget
.speed
== USB_SPEED_UNKNOWN
) {
759 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
760 fotg210
->gadget
.speed
= value
& DMCR_HS_EN
?
761 USB_SPEED_HIGH
: USB_SPEED_FULL
;
765 if ((ctrl
->bRequestType
& USB_TYPE_MASK
) == USB_TYPE_STANDARD
) {
766 switch (ctrl
->bRequest
) {
767 case USB_REQ_GET_STATUS
:
768 fotg210_get_status(fotg210
, ctrl
);
770 case USB_REQ_CLEAR_FEATURE
:
771 fotg210_clear_feature(fotg210
, ctrl
);
773 case USB_REQ_SET_FEATURE
:
774 fotg210_set_feature(fotg210
, ctrl
);
776 case USB_REQ_SET_ADDRESS
:
777 fotg210_set_address(fotg210
, ctrl
);
779 case USB_REQ_SET_CONFIGURATION
:
780 fotg210_set_configuration(fotg210
);
794 static void fotg210_ep0out(struct fotg210_udc
*fotg210
)
796 struct fotg210_ep
*ep
= fotg210
->ep
[0];
798 if (!list_empty(&ep
->queue
) && !ep
->dir_in
) {
799 struct fotg210_request
*req
;
801 req
= list_first_entry(&ep
->queue
,
802 struct fotg210_request
, queue
);
805 fotg210_start_dma(ep
, req
);
807 if ((req
->req
.length
- req
->req
.actual
) < ep
->ep
.maxpacket
)
808 fotg210_done(ep
, req
, 0);
810 pr_err("%s : empty queue\n", __func__
);
814 static void fotg210_ep0in(struct fotg210_udc
*fotg210
)
816 struct fotg210_ep
*ep
= fotg210
->ep
[0];
818 if ((!list_empty(&ep
->queue
)) && (ep
->dir_in
)) {
819 struct fotg210_request
*req
;
821 req
= list_entry(ep
->queue
.next
,
822 struct fotg210_request
, queue
);
825 fotg210_start_dma(ep
, req
);
827 if ((req
->req
.length
- req
->req
.actual
) < ep
->ep
.maxpacket
)
828 fotg210_done(ep
, req
, 0);
830 fotg210_set_cxdone(fotg210
);
834 static void fotg210_clear_comabt_int(struct fotg210_udc
*fotg210
)
836 u32 value
= ioread32(fotg210
->reg
+ FOTG210_DISGR0
);
838 value
&= ~DISGR0_CX_COMABT_INT
;
839 iowrite32(value
, fotg210
->reg
+ FOTG210_DISGR0
);
842 static void fotg210_in_fifo_handler(struct fotg210_ep
*ep
)
844 struct fotg210_request
*req
= list_entry(ep
->queue
.next
,
845 struct fotg210_request
, queue
);
848 fotg210_start_dma(ep
, req
);
849 fotg210_done(ep
, req
, 0);
852 static void fotg210_out_fifo_handler(struct fotg210_ep
*ep
)
854 struct fotg210_request
*req
= list_entry(ep
->queue
.next
,
855 struct fotg210_request
, queue
);
857 fotg210_start_dma(ep
, req
);
859 /* finish out transfer */
860 if (req
->req
.length
== req
->req
.actual
||
861 req
->req
.actual
< ep
->ep
.maxpacket
)
862 fotg210_done(ep
, req
, 0);
865 static irqreturn_t
fotg210_irq(int irq
, void *_fotg210
)
867 struct fotg210_udc
*fotg210
= _fotg210
;
868 u32 int_grp
= ioread32(fotg210
->reg
+ FOTG210_DIGR
);
869 u32 int_msk
= ioread32(fotg210
->reg
+ FOTG210_DMIGR
);
873 spin_lock(&fotg210
->lock
);
875 if (int_grp
& DIGR_INT_G2
) {
876 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR2
;
877 u32 int_grp2
= ioread32(reg
);
878 u32 int_msk2
= ioread32(fotg210
->reg
+ FOTG210_DMISGR2
);
881 int_grp2
&= ~int_msk2
;
883 if (int_grp2
& DISGR2_USBRST_INT
) {
884 value
= ioread32(reg
);
885 value
&= ~DISGR2_USBRST_INT
;
886 iowrite32(value
, reg
);
887 pr_info("fotg210 udc reset\n");
889 if (int_grp2
& DISGR2_SUSP_INT
) {
890 value
= ioread32(reg
);
891 value
&= ~DISGR2_SUSP_INT
;
892 iowrite32(value
, reg
);
893 pr_info("fotg210 udc suspend\n");
895 if (int_grp2
& DISGR2_RESM_INT
) {
896 value
= ioread32(reg
);
897 value
&= ~DISGR2_RESM_INT
;
898 iowrite32(value
, reg
);
899 pr_info("fotg210 udc resume\n");
901 if (int_grp2
& DISGR2_ISO_SEQ_ERR_INT
) {
902 value
= ioread32(reg
);
903 value
&= ~DISGR2_ISO_SEQ_ERR_INT
;
904 iowrite32(value
, reg
);
905 pr_info("fotg210 iso sequence error\n");
907 if (int_grp2
& DISGR2_ISO_SEQ_ABORT_INT
) {
908 value
= ioread32(reg
);
909 value
&= ~DISGR2_ISO_SEQ_ABORT_INT
;
910 iowrite32(value
, reg
);
911 pr_info("fotg210 iso sequence abort\n");
913 if (int_grp2
& DISGR2_TX0BYTE_INT
) {
914 fotg210_clear_tx0byte(fotg210
);
915 value
= ioread32(reg
);
916 value
&= ~DISGR2_TX0BYTE_INT
;
917 iowrite32(value
, reg
);
918 pr_info("fotg210 transferred 0 byte\n");
920 if (int_grp2
& DISGR2_RX0BYTE_INT
) {
921 fotg210_clear_rx0byte(fotg210
);
922 value
= ioread32(reg
);
923 value
&= ~DISGR2_RX0BYTE_INT
;
924 iowrite32(value
, reg
);
925 pr_info("fotg210 received 0 byte\n");
927 if (int_grp2
& DISGR2_DMA_ERROR
) {
928 value
= ioread32(reg
);
929 value
&= ~DISGR2_DMA_ERROR
;
930 iowrite32(value
, reg
);
934 if (int_grp
& DIGR_INT_G0
) {
935 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR0
;
936 u32 int_grp0
= ioread32(reg
);
937 u32 int_msk0
= ioread32(fotg210
->reg
+ FOTG210_DMISGR0
);
938 struct usb_ctrlrequest ctrl
;
940 int_grp0
&= ~int_msk0
;
942 /* the highest priority in this source register */
943 if (int_grp0
& DISGR0_CX_COMABT_INT
) {
944 fotg210_clear_comabt_int(fotg210
);
945 pr_info("fotg210 CX command abort\n");
948 if (int_grp0
& DISGR0_CX_SETUP_INT
) {
949 if (fotg210_setup_packet(fotg210
, &ctrl
)) {
950 spin_unlock(&fotg210
->lock
);
951 if (fotg210
->driver
->setup(&fotg210
->gadget
,
953 fotg210_set_cxstall(fotg210
);
954 spin_lock(&fotg210
->lock
);
957 if (int_grp0
& DISGR0_CX_COMEND_INT
)
958 pr_info("fotg210 cmd end\n");
960 if (int_grp0
& DISGR0_CX_IN_INT
)
961 fotg210_ep0in(fotg210
);
963 if (int_grp0
& DISGR0_CX_OUT_INT
)
964 fotg210_ep0out(fotg210
);
966 if (int_grp0
& DISGR0_CX_COMFAIL_INT
) {
967 fotg210_set_cxstall(fotg210
);
968 pr_info("fotg210 ep0 fail\n");
972 if (int_grp
& DIGR_INT_G1
) {
973 void __iomem
*reg
= fotg210
->reg
+ FOTG210_DISGR1
;
974 u32 int_grp1
= ioread32(reg
);
975 u32 int_msk1
= ioread32(fotg210
->reg
+ FOTG210_DMISGR1
);
978 int_grp1
&= ~int_msk1
;
980 for (fifo
= 0; fifo
< FOTG210_MAX_FIFO_NUM
; fifo
++) {
981 if (int_grp1
& DISGR1_IN_INT(fifo
))
982 fotg210_in_fifo_handler(fotg210
->ep
[fifo
+ 1]);
984 if ((int_grp1
& DISGR1_OUT_INT(fifo
)) ||
985 (int_grp1
& DISGR1_SPK_INT(fifo
)))
986 fotg210_out_fifo_handler(fotg210
->ep
[fifo
+ 1]);
990 spin_unlock(&fotg210
->lock
);
995 static void fotg210_disable_unplug(struct fotg210_udc
*fotg210
)
997 u32 reg
= ioread32(fotg210
->reg
+ FOTG210_PHYTMSR
);
999 reg
&= ~PHYTMSR_UNPLUG
;
1000 iowrite32(reg
, fotg210
->reg
+ FOTG210_PHYTMSR
);
1003 static int fotg210_udc_start(struct usb_gadget
*g
,
1004 struct usb_gadget_driver
*driver
)
1006 struct fotg210_udc
*fotg210
= gadget_to_fotg210(g
);
1009 /* hook up the driver */
1010 driver
->driver
.bus
= NULL
;
1011 fotg210
->driver
= driver
;
1013 /* enable device global interrupt */
1014 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
1015 value
|= DMCR_GLINT_EN
;
1016 iowrite32(value
, fotg210
->reg
+ FOTG210_DMCR
);
1021 static void fotg210_init(struct fotg210_udc
*fotg210
)
1025 /* disable global interrupt and set int polarity to active high */
1026 iowrite32(GMIR_MHC_INT
| GMIR_MOTG_INT
| GMIR_INT_POLARITY
,
1027 fotg210
->reg
+ FOTG210_GMIR
);
1029 /* disable device global interrupt */
1030 value
= ioread32(fotg210
->reg
+ FOTG210_DMCR
);
1031 value
&= ~DMCR_GLINT_EN
;
1032 iowrite32(value
, fotg210
->reg
+ FOTG210_DMCR
);
1034 /* disable all fifo interrupt */
1035 iowrite32(~(u32
)0, fotg210
->reg
+ FOTG210_DMISGR1
);
1037 /* disable cmd end */
1038 value
= ioread32(fotg210
->reg
+ FOTG210_DMISGR0
);
1039 value
|= DMISGR0_MCX_COMEND
;
1040 iowrite32(value
, fotg210
->reg
+ FOTG210_DMISGR0
);
1043 static int fotg210_udc_stop(struct usb_gadget
*g
)
1045 struct fotg210_udc
*fotg210
= gadget_to_fotg210(g
);
1046 unsigned long flags
;
1048 spin_lock_irqsave(&fotg210
->lock
, flags
);
1050 fotg210_init(fotg210
);
1051 fotg210
->driver
= NULL
;
1053 spin_unlock_irqrestore(&fotg210
->lock
, flags
);
1058 static const struct usb_gadget_ops fotg210_gadget_ops
= {
1059 .udc_start
= fotg210_udc_start
,
1060 .udc_stop
= fotg210_udc_stop
,
1063 static int fotg210_udc_remove(struct platform_device
*pdev
)
1065 struct fotg210_udc
*fotg210
= platform_get_drvdata(pdev
);
1068 usb_del_gadget_udc(&fotg210
->gadget
);
1069 iounmap(fotg210
->reg
);
1070 free_irq(platform_get_irq(pdev
, 0), fotg210
);
1072 fotg210_ep_free_request(&fotg210
->ep
[0]->ep
, fotg210
->ep0_req
);
1073 for (i
= 0; i
< FOTG210_MAX_NUM_EP
; i
++)
1074 kfree(fotg210
->ep
[i
]);
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
);
1193 iounmap(fotg210
->reg
);
1196 for (i
= 0; i
< FOTG210_MAX_NUM_EP
; i
++)
1197 kfree(fotg210
->ep
[i
]);
1204 static struct platform_driver fotg210_driver
= {
1206 .name
= (char *)udc_name
,
1208 .probe
= fotg210_udc_probe
,
1209 .remove
= fotg210_udc_remove
,
1212 module_platform_driver(fotg210_driver
);
1214 MODULE_AUTHOR("Yuan-Hsin Chen, Feng-Hsin Chiang <john453@faraday-tech.com>");
1215 MODULE_LICENSE("GPL");
1216 MODULE_DESCRIPTION(DRIVER_DESC
);