xref: /OK3568_Linux_fs/u-boot/include/usb/fotg210.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Faraday USB 2.0 OTG Controller
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * (C) Copyright 2010 Faraday Technology
5*4882a593Smuzhiyun  * Dante Su <dantesu@faraday-tech.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef _FOTG210_H
11*4882a593Smuzhiyun #define _FOTG210_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct fotg210_regs {
14*4882a593Smuzhiyun 	/* USB Host Controller */
15*4882a593Smuzhiyun 	struct {
16*4882a593Smuzhiyun 		uint32_t data[4];
17*4882a593Smuzhiyun 	} hccr;			/* 0x00 - 0x0f: hccr */
18*4882a593Smuzhiyun 	struct {
19*4882a593Smuzhiyun 		uint32_t data[9];
20*4882a593Smuzhiyun 	} hcor;			/* 0x10 - 0x33: hcor */
21*4882a593Smuzhiyun 	uint32_t rsvd1[3];
22*4882a593Smuzhiyun 	uint32_t miscr;	/* 0x40: Miscellaneous Register */
23*4882a593Smuzhiyun 	uint32_t rsvd2[15];
24*4882a593Smuzhiyun 	/* USB OTG Controller */
25*4882a593Smuzhiyun 	uint32_t otgcsr;/* 0x80: OTG Control Status Register */
26*4882a593Smuzhiyun 	uint32_t otgisr;/* 0x84: OTG Interrupt Status Register */
27*4882a593Smuzhiyun 	uint32_t otgier;/* 0x88: OTG Interrupt Enable Register */
28*4882a593Smuzhiyun 	uint32_t rsvd3[13];
29*4882a593Smuzhiyun 	uint32_t isr;	/* 0xC0: Global Interrupt Status Register */
30*4882a593Smuzhiyun 	uint32_t imr;	/* 0xC4: Global Interrupt Mask Register */
31*4882a593Smuzhiyun 	uint32_t rsvd4[14];
32*4882a593Smuzhiyun 	/* USB Device Controller */
33*4882a593Smuzhiyun 	uint32_t dev_ctrl;/* 0x100: Device Control Register */
34*4882a593Smuzhiyun 	uint32_t dev_addr;/* 0x104: Device Address Register */
35*4882a593Smuzhiyun 	uint32_t dev_test;/* 0x108: Device Test Register */
36*4882a593Smuzhiyun 	uint32_t sof_fnr; /* 0x10c: SOF Frame Number Register */
37*4882a593Smuzhiyun 	uint32_t sof_mtr; /* 0x110: SOF Mask Timer Register */
38*4882a593Smuzhiyun 	uint32_t phy_tmsr;/* 0x114: PHY Test Mode Selector Register */
39*4882a593Smuzhiyun 	uint32_t rsvd5[2];
40*4882a593Smuzhiyun 	uint32_t cxfifo;/* 0x120: CX FIFO Register */
41*4882a593Smuzhiyun 	uint32_t idle;	/* 0x124: IDLE Counter Register */
42*4882a593Smuzhiyun 	uint32_t rsvd6[2];
43*4882a593Smuzhiyun 	uint32_t gimr;	/* 0x130: Group Interrupt Mask Register */
44*4882a593Smuzhiyun 	uint32_t gimr0; /* 0x134: Group Interrupt Mask Register 0 */
45*4882a593Smuzhiyun 	uint32_t gimr1; /* 0x138: Group Interrupt Mask Register 1 */
46*4882a593Smuzhiyun 	uint32_t gimr2; /* 0x13c: Group Interrupt Mask Register 2 */
47*4882a593Smuzhiyun 	uint32_t gisr;	/* 0x140: Group Interrupt Status Register */
48*4882a593Smuzhiyun 	uint32_t gisr0; /* 0x144: Group Interrupt Status Register 0 */
49*4882a593Smuzhiyun 	uint32_t gisr1; /* 0x148: Group Interrupt Status Register 1 */
50*4882a593Smuzhiyun 	uint32_t gisr2; /* 0x14c: Group Interrupt Status Register 2 */
51*4882a593Smuzhiyun 	uint32_t rxzlp; /* 0x150: Receive Zero-Length-Packet Register */
52*4882a593Smuzhiyun 	uint32_t txzlp; /* 0x154: Transfer Zero-Length-Packet Register */
53*4882a593Smuzhiyun 	uint32_t isoeasr;/* 0x158: ISOC Error/Abort Status Register */
54*4882a593Smuzhiyun 	uint32_t rsvd7[1];
55*4882a593Smuzhiyun 	uint32_t iep[8]; /* 0x160 - 0x17f: IN Endpoint Register */
56*4882a593Smuzhiyun 	uint32_t oep[8]; /* 0x180 - 0x19f: OUT Endpoint Register */
57*4882a593Smuzhiyun 	uint32_t epmap14;/* 0x1a0: Endpoint Map Register (EP1 ~ 4) */
58*4882a593Smuzhiyun 	uint32_t epmap58;/* 0x1a4: Endpoint Map Register (EP5 ~ 8) */
59*4882a593Smuzhiyun 	uint32_t fifomap;/* 0x1a8: FIFO Map Register */
60*4882a593Smuzhiyun 	uint32_t fifocfg; /* 0x1ac: FIFO Configuration Register */
61*4882a593Smuzhiyun 	uint32_t fifocsr[4];/* 0x1b0 - 0x1bf: FIFO Control Status Register */
62*4882a593Smuzhiyun 	uint32_t dma_fifo; /* 0x1c0: DMA Target FIFO Register */
63*4882a593Smuzhiyun 	uint32_t rsvd8[1];
64*4882a593Smuzhiyun 	uint32_t dma_ctrl; /* 0x1c8: DMA Control Register */
65*4882a593Smuzhiyun 	uint32_t dma_addr; /* 0x1cc: DMA Address Register */
66*4882a593Smuzhiyun 	uint32_t ep0_data; /* 0x1d0: EP0 Setup Packet PIO Register */
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* Miscellaneous Register */
70*4882a593Smuzhiyun #define MISCR_SUSPEND  (1 << 6) /* Put transceiver in suspend mode */
71*4882a593Smuzhiyun #define MISCR_EOF2(x)  (((x) & 0x3) << 4) /* EOF 2 Timing */
72*4882a593Smuzhiyun #define MISCR_EOF1(x)  (((x) & 0x3) << 2) /* EOF 1 Timing */
73*4882a593Smuzhiyun #define MISCR_ASST(x)  (((x) & 0x3) << 0) /* Async. Sched. Sleep Timer */
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* OTG Control Status Register */
76*4882a593Smuzhiyun #define OTGCSR_SPD_HIGH     (2 << 22) /* Speed of the attached device (host) */
77*4882a593Smuzhiyun #define OTGCSR_SPD_LOW      (1 << 22)
78*4882a593Smuzhiyun #define OTGCSR_SPD_FULL     (0 << 22)
79*4882a593Smuzhiyun #define OTGCSR_SPD_MASK     (3 << 22)
80*4882a593Smuzhiyun #define OTGCSR_SPD_SHIFT    22
81*4882a593Smuzhiyun #define OTGCSR_SPD(x)       (((x) >> 22) & 0x03)
82*4882a593Smuzhiyun #define OTGCSR_DEV_A        (0 << 21) /* Acts as A-device */
83*4882a593Smuzhiyun #define OTGCSR_DEV_B        (1 << 21) /* Acts as B-device */
84*4882a593Smuzhiyun #define OTGCSR_ROLE_H       (0 << 20) /* Acts as Host */
85*4882a593Smuzhiyun #define OTGCSR_ROLE_D       (1 << 20) /* Acts as Device */
86*4882a593Smuzhiyun #define OTGCSR_A_VBUS_VLD   (1 << 19) /* A-device VBUS Valid */
87*4882a593Smuzhiyun #define OTGCSR_A_SESS_VLD   (1 << 18) /* A-device Session Valid */
88*4882a593Smuzhiyun #define OTGCSR_B_SESS_VLD   (1 << 17) /* B-device Session Valid */
89*4882a593Smuzhiyun #define OTGCSR_B_SESS_END   (1 << 16) /* B-device Session End */
90*4882a593Smuzhiyun #define OTGCSR_HFT_LONG     (1 << 11) /* HDISCON noise filter = 270 us*/
91*4882a593Smuzhiyun #define OTGCSR_HFT          (0 << 11) /* HDISCON noise filter = 135 us*/
92*4882a593Smuzhiyun #define OTGCSR_VFT_LONG     (1 << 10) /* VBUS noise filter = 472 us*/
93*4882a593Smuzhiyun #define OTGCSR_VFT          (0 << 10) /* VBUS noise filter = 135 us*/
94*4882a593Smuzhiyun #define OTGCSR_IDFT_LONG    (1 << 9)  /* ID noise filter = 4 ms*/
95*4882a593Smuzhiyun #define OTGCSR_IDFT         (0 << 9)  /* ID noise filter = 3 ms*/
96*4882a593Smuzhiyun #define OTGCSR_A_SRPR_VBUS  (0 << 8)  /* A-device: SRP responds to VBUS */
97*4882a593Smuzhiyun #define OTGCSR_A_SRPR_DATA  (1 << 8)  /* A-device: SRP responds to DATA-LINE */
98*4882a593Smuzhiyun #define OTGCSR_A_SRP_EN     (1 << 7)  /* A-device SRP detection enabled */
99*4882a593Smuzhiyun #define OTGCSR_A_HNP        (1 << 6)  /* Set role=A-device with HNP enabled */
100*4882a593Smuzhiyun #define OTGCSR_A_BUSDROP    (1 << 5)  /* A-device drop bus (power-down) */
101*4882a593Smuzhiyun #define OTGCSR_A_BUSREQ     (1 << 4)  /* A-device request bus */
102*4882a593Smuzhiyun #define OTGCSR_B_VBUS_DISC  (1 << 2)  /* B-device discharges VBUS */
103*4882a593Smuzhiyun #define OTGCSR_B_HNP        (1 << 1)  /* B-device enable HNP */
104*4882a593Smuzhiyun #define OTGCSR_B_BUSREQ     (1 << 0)  /* B-device request bus */
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* OTG Interrupt Status Register */
107*4882a593Smuzhiyun #define OTGISR_APRM         (1 << 12) /* Mini-A plug removed */
108*4882a593Smuzhiyun #define OTGISR_BPRM         (1 << 11) /* Mini-B plug removed */
109*4882a593Smuzhiyun #define OTGISR_OVD          (1 << 10) /* over-current detected */
110*4882a593Smuzhiyun #define OTGISR_IDCHG        (1 << 9)  /* ID(A/B) changed */
111*4882a593Smuzhiyun #define OTGISR_RLCHG        (1 << 8)  /* Role(Host/Device) changed */
112*4882a593Smuzhiyun #define OTGISR_BSESSEND     (1 << 6)  /* B-device Session End */
113*4882a593Smuzhiyun #define OTGISR_AVBUSERR     (1 << 5)  /* A-device VBUS Error */
114*4882a593Smuzhiyun #define OTGISR_ASRP         (1 << 4)  /* A-device SRP detected */
115*4882a593Smuzhiyun #define OTGISR_BSRP         (1 << 0)  /* B-device SRP complete */
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun /* OTG Interrupt Enable Register */
118*4882a593Smuzhiyun #define OTGIER_APRM         (1 << 12) /* Mini-A plug removed */
119*4882a593Smuzhiyun #define OTGIER_BPRM         (1 << 11) /* Mini-B plug removed */
120*4882a593Smuzhiyun #define OTGIER_OVD          (1 << 10) /* over-current detected */
121*4882a593Smuzhiyun #define OTGIER_IDCHG        (1 << 9)  /* ID(A/B) changed */
122*4882a593Smuzhiyun #define OTGIER_RLCHG        (1 << 8)  /* Role(Host/Device) changed */
123*4882a593Smuzhiyun #define OTGIER_BSESSEND     (1 << 6)  /* B-device Session End */
124*4882a593Smuzhiyun #define OTGIER_AVBUSERR     (1 << 5)  /* A-device VBUS Error */
125*4882a593Smuzhiyun #define OTGIER_ASRP         (1 << 4)  /* A-device SRP detected */
126*4882a593Smuzhiyun #define OTGIER_BSRP         (1 << 0)  /* B-device SRP complete */
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* Global Interrupt Status Register (W1C) */
129*4882a593Smuzhiyun #define ISR_HOST            (1 << 2)  /* USB Host interrupt */
130*4882a593Smuzhiyun #define ISR_OTG             (1 << 1)  /* USB OTG interrupt */
131*4882a593Smuzhiyun #define ISR_DEV             (1 << 0)  /* USB Device interrupt */
132*4882a593Smuzhiyun #define ISR_MASK            0x07
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /* Global Interrupt Mask Register */
135*4882a593Smuzhiyun #define IMR_IRQLH           (1 << 3)  /* Interrupt triggered at level-high */
136*4882a593Smuzhiyun #define IMR_IRQLL           (0 << 3)  /* Interrupt triggered at level-low */
137*4882a593Smuzhiyun #define IMR_HOST            (1 << 2)  /* USB Host interrupt */
138*4882a593Smuzhiyun #define IMR_OTG             (1 << 1)  /* USB OTG interrupt */
139*4882a593Smuzhiyun #define IMR_DEV             (1 << 0)  /* USB Device interrupt */
140*4882a593Smuzhiyun #define IMR_MASK            0x0f
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* Device Control Register */
143*4882a593Smuzhiyun #define DEVCTRL_FS_FORCED   (1 << 9)  /* Forced to be Full-Speed Mode */
144*4882a593Smuzhiyun #define DEVCTRL_HS          (1 << 6)  /* High Speed Mode */
145*4882a593Smuzhiyun #define DEVCTRL_FS          (0 << 6)  /* Full Speed Mode */
146*4882a593Smuzhiyun #define DEVCTRL_EN          (1 << 5)  /* Chip Enable */
147*4882a593Smuzhiyun #define DEVCTRL_RESET       (1 << 4)  /* Chip Software Reset */
148*4882a593Smuzhiyun #define DEVCTRL_SUSPEND     (1 << 3)  /* Enter Suspend Mode */
149*4882a593Smuzhiyun #define DEVCTRL_GIRQ_EN     (1 << 2)  /* Global Interrupt Enabled */
150*4882a593Smuzhiyun #define DEVCTRL_HALFSPD     (1 << 1)  /* Half speed mode for FPGA test */
151*4882a593Smuzhiyun #define DEVCTRL_RWAKEUP     (1 << 0)  /* Enable remote wake-up */
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun /* Device Address Register */
154*4882a593Smuzhiyun #define DEVADDR_CONF        (1 << 7)  /* SET_CONFIGURATION has been executed */
155*4882a593Smuzhiyun #define DEVADDR_ADDR(x)     ((x) & 0x7f)
156*4882a593Smuzhiyun #define DEVADDR_ADDR_MASK   0x7f
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* Device Test Register */
159*4882a593Smuzhiyun #define DEVTEST_NOSOF       (1 << 6)  /* Do not generate SOF */
160*4882a593Smuzhiyun #define DEVTEST_TST_MODE    (1 << 5)  /* Enter Test Mode */
161*4882a593Smuzhiyun #define DEVTEST_TST_NOTS    (1 << 4)  /* Do not toggle sequence */
162*4882a593Smuzhiyun #define DEVTEST_TST_NOCRC   (1 << 3)  /* Do not append CRC */
163*4882a593Smuzhiyun #define DEVTEST_TST_CLREA   (1 << 2)  /* Clear External Side Address */
164*4882a593Smuzhiyun #define DEVTEST_TST_CXLP    (1 << 1)  /* EP0 loopback test */
165*4882a593Smuzhiyun #define DEVTEST_TST_CLRFF   (1 << 0)  /* Clear FIFO */
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* SOF Frame Number Register */
168*4882a593Smuzhiyun #define SOFFNR_UFN(x)       (((x) >> 11) & 0x7) /* SOF Micro-Frame Number */
169*4882a593Smuzhiyun #define SOFFNR_FNR(x)       ((x) & 0x7ff) /* SOF Frame Number */
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun /* SOF Mask Timer Register */
172*4882a593Smuzhiyun #define SOFMTR_TMR(x)       ((x) & 0xffff)
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /* PHY Test Mode Selector Register */
175*4882a593Smuzhiyun #define PHYTMSR_TST_PKT     (1 << 4) /* Packet send test */
176*4882a593Smuzhiyun #define PHYTMSR_TST_SE0NAK  (1 << 3) /* High-Speed quiescent state */
177*4882a593Smuzhiyun #define PHYTMSR_TST_KSTA    (1 << 2) /* High-Speed K state */
178*4882a593Smuzhiyun #define PHYTMSR_TST_JSTA    (1 << 1) /* High-Speed J state */
179*4882a593Smuzhiyun #define PHYTMSR_UNPLUG      (1 << 0) /* Enable soft-detachment */
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* CX FIFO Register */
182*4882a593Smuzhiyun #define CXFIFO_BYTES(x)     (((x) >> 24) & 0x7f) /* CX/EP0 FIFO byte count */
183*4882a593Smuzhiyun #define CXFIFO_FIFOE(x)     (1 << (((x) & 0x03) + 8)) /* EPx FIFO empty */
184*4882a593Smuzhiyun #define CXFIFO_FIFOE_FIFO0  (1 << 8)
185*4882a593Smuzhiyun #define CXFIFO_FIFOE_FIFO1  (1 << 9)
186*4882a593Smuzhiyun #define CXFIFO_FIFOE_FIFO2  (1 << 10)
187*4882a593Smuzhiyun #define CXFIFO_FIFOE_FIFO3  (1 << 11)
188*4882a593Smuzhiyun #define CXFIFO_FIFOE_MASK   (0x0f << 8)
189*4882a593Smuzhiyun #define CXFIFO_CXFIFOE      (1 << 5) /* CX FIFO empty */
190*4882a593Smuzhiyun #define CXFIFO_CXFIFOF      (1 << 4) /* CX FIFO full */
191*4882a593Smuzhiyun #define CXFIFO_CXFIFOCLR    (1 << 3) /* CX FIFO clear */
192*4882a593Smuzhiyun #define CXFIFO_CXSTALL      (1 << 2) /* CX Stall */
193*4882a593Smuzhiyun #define CXFIFO_TSTPKTFIN    (1 << 1) /* Test packet data transfer finished */
194*4882a593Smuzhiyun #define CXFIFO_CXFIN        (1 << 0) /* CX data transfer finished */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* IDLE Counter Register */
197*4882a593Smuzhiyun #define IDLE_MS(x)          ((x) & 0x07) /* PHY suspend delay = x ms */
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun /* Group Interrupt Mask(Disable) Register */
200*4882a593Smuzhiyun #define GIMR_GRP2           (1 << 2) /* Disable interrupt group 2 */
201*4882a593Smuzhiyun #define GIMR_GRP1           (1 << 1) /* Disable interrupt group 1 */
202*4882a593Smuzhiyun #define GIMR_GRP0           (1 << 0) /* Disable interrupt group 0 */
203*4882a593Smuzhiyun #define GIMR_MASK           0x07
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun /* Group Interrupt Mask(Disable) Register 0 (CX) */
206*4882a593Smuzhiyun #define GIMR0_CXABORT       (1 << 5) /* CX command abort interrupt */
207*4882a593Smuzhiyun #define GIMR0_CXERR         (1 << 4) /* CX command error interrupt */
208*4882a593Smuzhiyun #define GIMR0_CXEND         (1 << 3) /* CX command end interrupt */
209*4882a593Smuzhiyun #define GIMR0_CXOUT         (1 << 2) /* EP0-OUT packet interrupt */
210*4882a593Smuzhiyun #define GIMR0_CXIN          (1 << 1) /* EP0-IN packet interrupt */
211*4882a593Smuzhiyun #define GIMR0_CXSETUP       (1 << 0) /* EP0-SETUP packet interrupt */
212*4882a593Smuzhiyun #define GIMR0_MASK          0x3f
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /* Group Interrupt Mask(Disable) Register 1 (FIFO) */
215*4882a593Smuzhiyun #define GIMR1_FIFO_IN(x)    (1 << (((x) & 3) + 16))    /* FIFOx IN */
216*4882a593Smuzhiyun #define GIMR1_FIFO_TX(x)    GIMR1_FIFO_IN(x)
217*4882a593Smuzhiyun #define GIMR1_FIFO_OUT(x)   (1 << (((x) & 3) * 2))     /* FIFOx OUT */
218*4882a593Smuzhiyun #define GIMR1_FIFO_SPK(x)   (1 << (((x) & 3) * 2 + 1)) /* FIFOx SHORT PACKET */
219*4882a593Smuzhiyun #define GIMR1_FIFO_RX(x)    (GIMR1_FIFO_OUT(x) | GIMR1_FIFO_SPK(x))
220*4882a593Smuzhiyun #define GIMR1_MASK          0xf00ff
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun /* Group Interrupt Mask(Disable) Register 2 (Device) */
223*4882a593Smuzhiyun #define GIMR2_WAKEUP        (1 << 10) /* Device waked up */
224*4882a593Smuzhiyun #define GIMR2_IDLE          (1 << 9)  /* Device idle */
225*4882a593Smuzhiyun #define GIMR2_DMAERR        (1 << 8)  /* DMA error */
226*4882a593Smuzhiyun #define GIMR2_DMAFIN        (1 << 7)  /* DMA finished */
227*4882a593Smuzhiyun #define GIMR2_ZLPRX         (1 << 6)  /* Zero-Length-Packet Rx Interrupt */
228*4882a593Smuzhiyun #define GIMR2_ZLPTX         (1 << 5)  /* Zero-Length-Packet Tx Interrupt */
229*4882a593Smuzhiyun #define GIMR2_ISOCABT       (1 << 4)  /* ISOC Abort Interrupt */
230*4882a593Smuzhiyun #define GIMR2_ISOCERR       (1 << 3)  /* ISOC Error Interrupt */
231*4882a593Smuzhiyun #define GIMR2_RESUME        (1 << 2)  /* Resume state change Interrupt */
232*4882a593Smuzhiyun #define GIMR2_SUSPEND       (1 << 1)  /* Suspend state change Interrupt */
233*4882a593Smuzhiyun #define GIMR2_RESET         (1 << 0)  /* Reset Interrupt */
234*4882a593Smuzhiyun #define GIMR2_MASK          0x7ff
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /* Group Interrupt Status Register */
237*4882a593Smuzhiyun #define GISR_GRP2           (1 << 2) /* Interrupt group 2 */
238*4882a593Smuzhiyun #define GISR_GRP1           (1 << 1) /* Interrupt group 1 */
239*4882a593Smuzhiyun #define GISR_GRP0           (1 << 0) /* Interrupt group 0 */
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun /* Group Interrupt Status Register 0 (CX) */
242*4882a593Smuzhiyun #define GISR0_CXABORT       (1 << 5) /* CX command abort interrupt */
243*4882a593Smuzhiyun #define GISR0_CXERR         (1 << 4) /* CX command error interrupt */
244*4882a593Smuzhiyun #define GISR0_CXEND         (1 << 3) /* CX command end interrupt */
245*4882a593Smuzhiyun #define GISR0_CXOUT         (1 << 2) /* EP0-OUT packet interrupt */
246*4882a593Smuzhiyun #define GISR0_CXIN          (1 << 1) /* EP0-IN packet interrupt */
247*4882a593Smuzhiyun #define GISR0_CXSETUP       (1 << 0) /* EP0-SETUP packet interrupt */
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /* Group Interrupt Status Register 1 (FIFO) */
250*4882a593Smuzhiyun #define GISR1_IN_FIFO(x)    (1 << (((x) & 0x03) + 16))    /* FIFOx IN */
251*4882a593Smuzhiyun #define GISR1_OUT_FIFO(x)   (1 << (((x) & 0x03) * 2))     /* FIFOx OUT */
252*4882a593Smuzhiyun #define GISR1_SPK_FIFO(x)   (1 << (((x) & 0x03) * 2 + 1)) /* FIFOx SPK */
253*4882a593Smuzhiyun #define GISR1_RX_FIFO(x)    (3 << (((x) & 0x03) * 2))     /* FIFOx OUT/SPK */
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /* Group Interrupt Status Register 2 (Device) */
256*4882a593Smuzhiyun #define GISR2_WAKEUP        (1 << 10) /* Device waked up */
257*4882a593Smuzhiyun #define GISR2_IDLE          (1 << 9)  /* Device idle */
258*4882a593Smuzhiyun #define GISR2_DMAERR        (1 << 8)  /* DMA error */
259*4882a593Smuzhiyun #define GISR2_DMAFIN        (1 << 7)  /* DMA finished */
260*4882a593Smuzhiyun #define GISR2_ZLPRX         (1 << 6)  /* Zero-Length-Packet Rx Interrupt */
261*4882a593Smuzhiyun #define GISR2_ZLPTX         (1 << 5)  /* Zero-Length-Packet Tx Interrupt */
262*4882a593Smuzhiyun #define GISR2_ISOCABT       (1 << 4)  /* ISOC Abort Interrupt */
263*4882a593Smuzhiyun #define GISR2_ISOCERR       (1 << 3)  /* ISOC Error Interrupt */
264*4882a593Smuzhiyun #define GISR2_RESUME        (1 << 2)  /* Resume state change Interrupt */
265*4882a593Smuzhiyun #define GISR2_SUSPEND       (1 << 1)  /* Suspend state change Interrupt */
266*4882a593Smuzhiyun #define GISR2_RESET         (1 << 0)  /* Reset Interrupt */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /* Receive Zero-Length-Packet Register */
269*4882a593Smuzhiyun #define RXZLP_EP(x)         (1 << ((x) - 1)) /* EPx ZLP rx interrupt */
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /* Transfer Zero-Length-Packet Register */
272*4882a593Smuzhiyun #define TXZLP_EP(x)         (1 << ((x) - 1)) /* EPx ZLP tx interrupt */
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /* ISOC Error/Abort Status Register */
275*4882a593Smuzhiyun #define ISOEASR_EP(x)       (0x10001 << ((x) - 1)) /* EPx ISOC Error/Abort */
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun /* IN Endpoint Register */
278*4882a593Smuzhiyun #define IEP_SENDZLP         (1 << 15)     /* Send Zero-Length-Packet */
279*4882a593Smuzhiyun #define IEP_TNRHB(x)        (((x) & 0x03) << 13) \
280*4882a593Smuzhiyun 	/* Transaction Number for High-Bandwidth EP(ISOC) */
281*4882a593Smuzhiyun #define IEP_RESET           (1 << 12)     /* Reset Toggle Sequence */
282*4882a593Smuzhiyun #define IEP_STALL           (1 << 11)     /* Stall */
283*4882a593Smuzhiyun #define IEP_MAXPS(x)        ((x) & 0x7ff) /* Max. packet size */
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* OUT Endpoint Register */
286*4882a593Smuzhiyun #define OEP_RESET           (1 << 12)     /* Reset Toggle Sequence */
287*4882a593Smuzhiyun #define OEP_STALL           (1 << 11)     /* Stall */
288*4882a593Smuzhiyun #define OEP_MAXPS(x)        ((x) & 0x7ff) /* Max. packet size */
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /* Endpoint Map Register (EP1 ~ EP4) */
291*4882a593Smuzhiyun #define EPMAP14_SET_IN(ep, fifo) \
292*4882a593Smuzhiyun 	((fifo) & 3) << (((ep) - 1) << 3 + 0)
293*4882a593Smuzhiyun #define EPMAP14_SET_OUT(ep, fifo) \
294*4882a593Smuzhiyun 	((fifo) & 3) << (((ep) - 1) << 3 + 4)
295*4882a593Smuzhiyun #define EPMAP14_SET(ep, in, out) \
296*4882a593Smuzhiyun 	do { \
297*4882a593Smuzhiyun 		EPMAP14_SET_IN(ep, in); \
298*4882a593Smuzhiyun 		EPMAP14_SET_OUT(ep, out); \
299*4882a593Smuzhiyun 	} while (0)
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #define EPMAP14_DEFAULT     0x33221100 /* EP1->FIFO0, EP2->FIFO1... */
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun /* Endpoint Map Register (EP5 ~ EP8) */
304*4882a593Smuzhiyun #define EPMAP58_SET_IN(ep, fifo) \
305*4882a593Smuzhiyun 	((fifo) & 3) << (((ep) - 5) << 3 + 0)
306*4882a593Smuzhiyun #define EPMAP58_SET_OUT(ep, fifo) \
307*4882a593Smuzhiyun 	((fifo) & 3) << (((ep) - 5) << 3 + 4)
308*4882a593Smuzhiyun #define EPMAP58_SET(ep, in, out) \
309*4882a593Smuzhiyun 	do { \
310*4882a593Smuzhiyun 		EPMAP58_SET_IN(ep, in); \
311*4882a593Smuzhiyun 		EPMAP58_SET_OUT(ep, out); \
312*4882a593Smuzhiyun 	} while (0)
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun #define EPMAP58_DEFAULT     0x00000000 /* All EPx->FIFO0 */
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* FIFO Map Register */
317*4882a593Smuzhiyun #define FIFOMAP_BIDIR       (2 << 4)
318*4882a593Smuzhiyun #define FIFOMAP_IN          (1 << 4)
319*4882a593Smuzhiyun #define FIFOMAP_OUT         (0 << 4)
320*4882a593Smuzhiyun #define FIFOMAP_DIR_MASK    0x30
321*4882a593Smuzhiyun #define FIFOMAP_EP(x)       ((x) & 0x0f)
322*4882a593Smuzhiyun #define FIFOMAP_EP_MASK     0x0f
323*4882a593Smuzhiyun #define FIFOMAP_CFG_MASK    0x3f
324*4882a593Smuzhiyun #define FIFOMAP_DEFAULT     0x04030201 /* FIFO0->EP1, FIFO1->EP2... */
325*4882a593Smuzhiyun #define FIFOMAP(fifo, cfg)  (((cfg) & 0x3f) << (((fifo) & 3) << 3))
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun /* FIFO Configuration Register */
328*4882a593Smuzhiyun #define FIFOCFG_EN          (1 << 5)
329*4882a593Smuzhiyun #define FIFOCFG_BLKSZ_1024  (1 << 4)
330*4882a593Smuzhiyun #define FIFOCFG_BLKSZ_512   (0 << 4)
331*4882a593Smuzhiyun #define FIFOCFG_3BLK        (2 << 2)
332*4882a593Smuzhiyun #define FIFOCFG_2BLK        (1 << 2)
333*4882a593Smuzhiyun #define FIFOCFG_1BLK        (0 << 2)
334*4882a593Smuzhiyun #define FIFOCFG_NBLK_MASK   3
335*4882a593Smuzhiyun #define FIFOCFG_NBLK_SHIFT  2
336*4882a593Smuzhiyun #define FIFOCFG_INTR        (3 << 0)
337*4882a593Smuzhiyun #define FIFOCFG_BULK        (2 << 0)
338*4882a593Smuzhiyun #define FIFOCFG_ISOC        (1 << 0)
339*4882a593Smuzhiyun #define FIFOCFG_RSVD        (0 << 0)  /* Reserved */
340*4882a593Smuzhiyun #define FIFOCFG_TYPE_MASK   3
341*4882a593Smuzhiyun #define FIFOCFG_TYPE_SHIFT  0
342*4882a593Smuzhiyun #define FIFOCFG_CFG_MASK    0x3f
343*4882a593Smuzhiyun #define FIFOCFG(fifo, cfg)  (((cfg) & 0x3f) << (((fifo) & 3) << 3))
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /* FIFO Control Status Register */
346*4882a593Smuzhiyun #define FIFOCSR_RESET       (1 << 12) /* FIFO Reset */
347*4882a593Smuzhiyun #define FIFOCSR_BYTES(x)    ((x) & 0x7ff) /* Length(bytes) for OUT-EP/FIFO */
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun /* DMA Target FIFO Register */
350*4882a593Smuzhiyun #define DMAFIFO_CX          (1 << 4) /* DMA FIFO = CX FIFO */
351*4882a593Smuzhiyun #define DMAFIFO_FIFO(x)     (1 << ((x) & 0x3)) /* DMA FIFO = FIFOx */
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun /* DMA Control Register */
354*4882a593Smuzhiyun #define DMACTRL_LEN(x)      (((x) & 0x1ffff) << 8) /* DMA length (Bytes) */
355*4882a593Smuzhiyun #define DMACTRL_LEN_SHIFT   8
356*4882a593Smuzhiyun #define DMACTRL_CLRFF       (1 << 4) /* Clear FIFO upon DMA abort */
357*4882a593Smuzhiyun #define DMACTRL_ABORT       (1 << 3) /* DMA abort */
358*4882a593Smuzhiyun #define DMACTRL_IO2IO       (1 << 2) /* IO to IO */
359*4882a593Smuzhiyun #define DMACTRL_FIFO2MEM    (0 << 1) /* FIFO to Memory */
360*4882a593Smuzhiyun #define DMACTRL_MEM2FIFO    (1 << 1) /* Memory to FIFO */
361*4882a593Smuzhiyun #define DMACTRL_START       (1 << 0) /* DMA start */
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun #endif
364