xref: /OK3568_Linux_fs/kernel/drivers/usb/gadget/udc/fotg210.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Faraday FOTG210 USB OTG controller
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2013 Faraday Technology Corporation
6*4882a593Smuzhiyun  * Author: Yuan-Hsin Chen <yhchen@faraday-tech.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/kernel.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define FOTG210_MAX_NUM_EP	5 /* ep0...ep4 */
12*4882a593Smuzhiyun #define FOTG210_MAX_FIFO_NUM	4 /* fifo0...fifo4 */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /* Global Mask of HC/OTG/DEV interrupt Register(0xC4) */
15*4882a593Smuzhiyun #define FOTG210_GMIR		0xC4
16*4882a593Smuzhiyun #define GMIR_INT_POLARITY	0x8 /*Active High*/
17*4882a593Smuzhiyun #define GMIR_MHC_INT		0x4
18*4882a593Smuzhiyun #define GMIR_MOTG_INT		0x2
19*4882a593Smuzhiyun #define GMIR_MDEV_INT		0x1
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /*  Device Main Control Register(0x100) */
22*4882a593Smuzhiyun #define FOTG210_DMCR		0x100
23*4882a593Smuzhiyun #define DMCR_HS_EN		(1 << 6)
24*4882a593Smuzhiyun #define DMCR_CHIP_EN		(1 << 5)
25*4882a593Smuzhiyun #define DMCR_SFRST		(1 << 4)
26*4882a593Smuzhiyun #define DMCR_GOSUSP		(1 << 3)
27*4882a593Smuzhiyun #define DMCR_GLINT_EN		(1 << 2)
28*4882a593Smuzhiyun #define DMCR_HALF_SPEED		(1 << 1)
29*4882a593Smuzhiyun #define DMCR_CAP_RMWAKUP	(1 << 0)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* Device Address Register(0x104) */
32*4882a593Smuzhiyun #define FOTG210_DAR		0x104
33*4882a593Smuzhiyun #define DAR_AFT_CONF		(1 << 7)
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* Device Test Register(0x108) */
36*4882a593Smuzhiyun #define FOTG210_DTR		0x108
37*4882a593Smuzhiyun #define DTR_TST_CLRFF		(1 << 0)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* PHY Test Mode Selector register(0x114) */
40*4882a593Smuzhiyun #define FOTG210_PHYTMSR		0x114
41*4882a593Smuzhiyun #define PHYTMSR_TST_PKT		(1 << 4)
42*4882a593Smuzhiyun #define PHYTMSR_TST_SE0NAK	(1 << 3)
43*4882a593Smuzhiyun #define PHYTMSR_TST_KSTA	(1 << 2)
44*4882a593Smuzhiyun #define PHYTMSR_TST_JSTA	(1 << 1)
45*4882a593Smuzhiyun #define PHYTMSR_UNPLUG		(1 << 0)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Cx configuration and FIFO Empty Status register(0x120) */
48*4882a593Smuzhiyun #define FOTG210_DCFESR		0x120
49*4882a593Smuzhiyun #define DCFESR_FIFO_EMPTY(fifo)	(1 << 8 << (fifo))
50*4882a593Smuzhiyun #define DCFESR_CX_EMP		(1 << 5)
51*4882a593Smuzhiyun #define DCFESR_CX_CLR		(1 << 3)
52*4882a593Smuzhiyun #define DCFESR_CX_STL		(1 << 2)
53*4882a593Smuzhiyun #define DCFESR_TST_PKDONE	(1 << 1)
54*4882a593Smuzhiyun #define DCFESR_CX_DONE		(1 << 0)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* Device IDLE Counter Register(0x124) */
57*4882a593Smuzhiyun #define FOTG210_DICR		0x124
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Device Mask of Interrupt Group Register (0x130) */
60*4882a593Smuzhiyun #define FOTG210_DMIGR		0x130
61*4882a593Smuzhiyun #define DMIGR_MINT_G0		(1 << 0)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* Device Mask of Interrupt Source Group 0(0x134) */
64*4882a593Smuzhiyun #define FOTG210_DMISGR0		0x134
65*4882a593Smuzhiyun #define DMISGR0_MCX_COMEND	(1 << 3)
66*4882a593Smuzhiyun #define DMISGR0_MCX_OUT_INT	(1 << 2)
67*4882a593Smuzhiyun #define DMISGR0_MCX_IN_INT	(1 << 1)
68*4882a593Smuzhiyun #define DMISGR0_MCX_SETUP_INT	(1 << 0)
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /* Device Mask of Interrupt Source Group 1 Register(0x138)*/
71*4882a593Smuzhiyun #define FOTG210_DMISGR1		0x138
72*4882a593Smuzhiyun #define DMISGR1_MF3_IN_INT	(1 << 19)
73*4882a593Smuzhiyun #define DMISGR1_MF2_IN_INT	(1 << 18)
74*4882a593Smuzhiyun #define DMISGR1_MF1_IN_INT	(1 << 17)
75*4882a593Smuzhiyun #define DMISGR1_MF0_IN_INT	(1 << 16)
76*4882a593Smuzhiyun #define DMISGR1_MF_IN_INT(fifo)	(1 << (16 + (fifo)))
77*4882a593Smuzhiyun #define DMISGR1_MF3_SPK_INT	(1 << 7)
78*4882a593Smuzhiyun #define DMISGR1_MF3_OUT_INT	(1 << 6)
79*4882a593Smuzhiyun #define DMISGR1_MF2_SPK_INT	(1 << 5)
80*4882a593Smuzhiyun #define DMISGR1_MF2_OUT_INT	(1 << 4)
81*4882a593Smuzhiyun #define DMISGR1_MF1_SPK_INT	(1 << 3)
82*4882a593Smuzhiyun #define DMISGR1_MF1_OUT_INT	(1 << 2)
83*4882a593Smuzhiyun #define DMISGR1_MF0_SPK_INT	(1 << 1)
84*4882a593Smuzhiyun #define DMISGR1_MF0_OUT_INT	(1 << 0)
85*4882a593Smuzhiyun #define DMISGR1_MF_OUTSPK_INT(fifo)	(0x3 << (fifo) * 2)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* Device Mask of Interrupt Source Group 2 Register (0x13C) */
88*4882a593Smuzhiyun #define FOTG210_DMISGR2		0x13C
89*4882a593Smuzhiyun #define DMISGR2_MDMA_ERROR	(1 << 8)
90*4882a593Smuzhiyun #define DMISGR2_MDMA_CMPLT	(1 << 7)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /* Device Interrupt group Register (0x140) */
93*4882a593Smuzhiyun #define FOTG210_DIGR		0x140
94*4882a593Smuzhiyun #define DIGR_INT_G2		(1 << 2)
95*4882a593Smuzhiyun #define DIGR_INT_G1		(1 << 1)
96*4882a593Smuzhiyun #define DIGR_INT_G0		(1 << 0)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* Device Interrupt Source Group 0 Register (0x144) */
99*4882a593Smuzhiyun #define FOTG210_DISGR0		0x144
100*4882a593Smuzhiyun #define DISGR0_CX_COMABT_INT	(1 << 5)
101*4882a593Smuzhiyun #define DISGR0_CX_COMFAIL_INT	(1 << 4)
102*4882a593Smuzhiyun #define DISGR0_CX_COMEND_INT	(1 << 3)
103*4882a593Smuzhiyun #define DISGR0_CX_OUT_INT	(1 << 2)
104*4882a593Smuzhiyun #define DISGR0_CX_IN_INT	(1 << 1)
105*4882a593Smuzhiyun #define DISGR0_CX_SETUP_INT	(1 << 0)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /* Device Interrupt Source Group 1 Register (0x148) */
108*4882a593Smuzhiyun #define FOTG210_DISGR1		0x148
109*4882a593Smuzhiyun #define DISGR1_OUT_INT(fifo)	(1 << ((fifo) * 2))
110*4882a593Smuzhiyun #define DISGR1_SPK_INT(fifo)	(1 << 1 << ((fifo) * 2))
111*4882a593Smuzhiyun #define DISGR1_IN_INT(fifo)	(1 << 16 << (fifo))
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* Device Interrupt Source Group 2 Register (0x14C) */
114*4882a593Smuzhiyun #define FOTG210_DISGR2		0x14C
115*4882a593Smuzhiyun #define DISGR2_DMA_ERROR	(1 << 8)
116*4882a593Smuzhiyun #define DISGR2_DMA_CMPLT	(1 << 7)
117*4882a593Smuzhiyun #define DISGR2_RX0BYTE_INT	(1 << 6)
118*4882a593Smuzhiyun #define DISGR2_TX0BYTE_INT	(1 << 5)
119*4882a593Smuzhiyun #define DISGR2_ISO_SEQ_ABORT_INT	(1 << 4)
120*4882a593Smuzhiyun #define DISGR2_ISO_SEQ_ERR_INT	(1 << 3)
121*4882a593Smuzhiyun #define DISGR2_RESM_INT		(1 << 2)
122*4882a593Smuzhiyun #define DISGR2_SUSP_INT		(1 << 1)
123*4882a593Smuzhiyun #define DISGR2_USBRST_INT	(1 << 0)
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /* Device Receive Zero-Length Data Packet Register (0x150)*/
126*4882a593Smuzhiyun #define FOTG210_RX0BYTE		0x150
127*4882a593Smuzhiyun #define RX0BYTE_EP8		(1 << 7)
128*4882a593Smuzhiyun #define RX0BYTE_EP7		(1 << 6)
129*4882a593Smuzhiyun #define RX0BYTE_EP6		(1 << 5)
130*4882a593Smuzhiyun #define RX0BYTE_EP5		(1 << 4)
131*4882a593Smuzhiyun #define RX0BYTE_EP4		(1 << 3)
132*4882a593Smuzhiyun #define RX0BYTE_EP3		(1 << 2)
133*4882a593Smuzhiyun #define RX0BYTE_EP2		(1 << 1)
134*4882a593Smuzhiyun #define RX0BYTE_EP1		(1 << 0)
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /* Device Transfer Zero-Length Data Packet Register (0x154)*/
137*4882a593Smuzhiyun #define FOTG210_TX0BYTE		0x154
138*4882a593Smuzhiyun #define TX0BYTE_EP8		(1 << 7)
139*4882a593Smuzhiyun #define TX0BYTE_EP7		(1 << 6)
140*4882a593Smuzhiyun #define TX0BYTE_EP6		(1 << 5)
141*4882a593Smuzhiyun #define TX0BYTE_EP5		(1 << 4)
142*4882a593Smuzhiyun #define TX0BYTE_EP4		(1 << 3)
143*4882a593Smuzhiyun #define TX0BYTE_EP3		(1 << 2)
144*4882a593Smuzhiyun #define TX0BYTE_EP2		(1 << 1)
145*4882a593Smuzhiyun #define TX0BYTE_EP1		(1 << 0)
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun /* Device IN Endpoint x MaxPacketSize Register(0x160+4*(x-1)) */
148*4882a593Smuzhiyun #define FOTG210_INEPMPSR(ep)	(0x160 + 4 * ((ep) - 1))
149*4882a593Smuzhiyun #define INOUTEPMPSR_MPS(mps)	((mps) & 0x2FF)
150*4882a593Smuzhiyun #define INOUTEPMPSR_STL_EP	(1 << 11)
151*4882a593Smuzhiyun #define INOUTEPMPSR_RESET_TSEQ	(1 << 12)
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun /* Device OUT Endpoint x MaxPacketSize Register(0x180+4*(x-1)) */
154*4882a593Smuzhiyun #define FOTG210_OUTEPMPSR(ep)	(0x180 + 4 * ((ep) - 1))
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /* Device Endpoint 1~4 Map Register (0x1A0) */
157*4882a593Smuzhiyun #define FOTG210_EPMAP		0x1A0
158*4882a593Smuzhiyun #define EPMAP_FIFONO(ep, dir)		\
159*4882a593Smuzhiyun 	((((ep) - 1) << ((ep) - 1) * 8) << ((dir) ? 0 : 4))
160*4882a593Smuzhiyun #define EPMAP_FIFONOMSK(ep, dir)	\
161*4882a593Smuzhiyun 	((3 << ((ep) - 1) * 8) << ((dir) ? 0 : 4))
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /* Device FIFO Map Register (0x1A8) */
164*4882a593Smuzhiyun #define FOTG210_FIFOMAP		0x1A8
165*4882a593Smuzhiyun #define FIFOMAP_DIROUT(fifo)	(0x0 << 4 << (fifo) * 8)
166*4882a593Smuzhiyun #define FIFOMAP_DIRIN(fifo)	(0x1 << 4 << (fifo) * 8)
167*4882a593Smuzhiyun #define FIFOMAP_BIDIR(fifo)	(0x2 << 4 << (fifo) * 8)
168*4882a593Smuzhiyun #define FIFOMAP_NA(fifo)	(0x3 << 4 << (fifo) * 8)
169*4882a593Smuzhiyun #define FIFOMAP_EPNO(ep)	((ep) << ((ep) - 1) * 8)
170*4882a593Smuzhiyun #define FIFOMAP_EPNOMSK(ep)	(0xF << ((ep) - 1) * 8)
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /* Device FIFO Confuguration Register (0x1AC) */
173*4882a593Smuzhiyun #define FOTG210_FIFOCF		0x1AC
174*4882a593Smuzhiyun #define FIFOCF_TYPE(type, fifo)	((type) << (fifo) * 8)
175*4882a593Smuzhiyun #define FIFOCF_BLK_SIN(fifo)	(0x0 << (fifo) * 8 << 2)
176*4882a593Smuzhiyun #define FIFOCF_BLK_DUB(fifo)	(0x1 << (fifo) * 8 << 2)
177*4882a593Smuzhiyun #define FIFOCF_BLK_TRI(fifo)	(0x2 << (fifo) * 8 << 2)
178*4882a593Smuzhiyun #define FIFOCF_BLKSZ_512(fifo)	(0x0 << (fifo) * 8 << 4)
179*4882a593Smuzhiyun #define FIFOCF_BLKSZ_1024(fifo)	(0x1 << (fifo) * 8 << 4)
180*4882a593Smuzhiyun #define FIFOCF_FIFO_EN(fifo)	(0x1 << (fifo) * 8 << 5)
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /* Device FIFO n Instruction and Byte Count Register (0x1B0+4*n) */
183*4882a593Smuzhiyun #define FOTG210_FIBCR(fifo)	(0x1B0 + (fifo) * 4)
184*4882a593Smuzhiyun #define FIBCR_BCFX		0x7FF
185*4882a593Smuzhiyun #define FIBCR_FFRST		(1 << 12)
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* Device DMA Target FIFO Number Register (0x1C0) */
188*4882a593Smuzhiyun #define FOTG210_DMATFNR		0x1C0
189*4882a593Smuzhiyun #define DMATFNR_ACC_CXF		(1 << 4)
190*4882a593Smuzhiyun #define DMATFNR_ACC_F3		(1 << 3)
191*4882a593Smuzhiyun #define DMATFNR_ACC_F2		(1 << 2)
192*4882a593Smuzhiyun #define DMATFNR_ACC_F1		(1 << 1)
193*4882a593Smuzhiyun #define DMATFNR_ACC_F0		(1 << 0)
194*4882a593Smuzhiyun #define DMATFNR_ACC_FN(fifo)	(1 << (fifo))
195*4882a593Smuzhiyun #define DMATFNR_DISDMA		0
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* Device DMA Controller Parameter setting 1 Register (0x1C8) */
198*4882a593Smuzhiyun #define FOTG210_DMACPSR1	0x1C8
199*4882a593Smuzhiyun #define DMACPSR1_DMA_LEN(len)	(((len) & 0xFFFF) << 8)
200*4882a593Smuzhiyun #define DMACPSR1_DMA_ABORT	(1 << 3)
201*4882a593Smuzhiyun #define DMACPSR1_DMA_TYPE(dir_in)	(((dir_in) ? 1 : 0) << 1)
202*4882a593Smuzhiyun #define DMACPSR1_DMA_START	(1 << 0)
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* Device DMA Controller Parameter setting 2 Register (0x1CC) */
205*4882a593Smuzhiyun #define FOTG210_DMACPSR2	0x1CC
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /* Device DMA Controller Parameter setting 3 Register (0x1CC) */
208*4882a593Smuzhiyun #define FOTG210_CXPORT		0x1D0
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun struct fotg210_request {
211*4882a593Smuzhiyun 	struct usb_request	req;
212*4882a593Smuzhiyun 	struct list_head	queue;
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun struct fotg210_ep {
216*4882a593Smuzhiyun 	struct usb_ep		ep;
217*4882a593Smuzhiyun 	struct fotg210_udc	*fotg210;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	struct list_head	queue;
220*4882a593Smuzhiyun 	unsigned		stall:1;
221*4882a593Smuzhiyun 	unsigned		wedged:1;
222*4882a593Smuzhiyun 	unsigned		use_dma:1;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	unsigned char		epnum;
225*4882a593Smuzhiyun 	unsigned char		type;
226*4882a593Smuzhiyun 	unsigned char		dir_in;
227*4882a593Smuzhiyun 	unsigned int		maxp;
228*4882a593Smuzhiyun 	const struct usb_endpoint_descriptor	*desc;
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun struct fotg210_udc {
232*4882a593Smuzhiyun 	spinlock_t		lock; /* protect the struct */
233*4882a593Smuzhiyun 	void __iomem		*reg;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	unsigned long		irq_trigger;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	struct usb_gadget		gadget;
238*4882a593Smuzhiyun 	struct usb_gadget_driver	*driver;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	struct fotg210_ep	*ep[FOTG210_MAX_NUM_EP];
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	struct usb_request	*ep0_req;	/* for internal request */
243*4882a593Smuzhiyun 	__le16			ep0_data;
244*4882a593Smuzhiyun 	u8			ep0_dir;	/* 0/0x80  out/in */
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	u8			reenum;		/* if re-enumeration */
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #define gadget_to_fotg210(g)	container_of((g), struct fotg210_udc, gadget)
250