1*9e40493fSBo Shen /*
2*9e40493fSBo Shen * Register definition for Atmel USBA high speed USB device controller
3*9e40493fSBo Shen * [Original from Linux kernel: drivers/usb/gadget/atmel_usba_udc.h]
4*9e40493fSBo Shen *
5*9e40493fSBo Shen * Copyright (C) 2005-2013 Atmel Corporation
6*9e40493fSBo Shen * Bo Shen <voice.shen@atmel.com>
7*9e40493fSBo Shen *
8*9e40493fSBo Shen * SPDX-License-Identifier: GPL-2.0+
9*9e40493fSBo Shen */
10*9e40493fSBo Shen
11*9e40493fSBo Shen #ifndef __LINUX_USB_GADGET_USBA_UDC_H__
12*9e40493fSBo Shen #define __LINUX_USB_GADGET_USBA_UDC_H__
13*9e40493fSBo Shen
14*9e40493fSBo Shen /* USB register offsets */
15*9e40493fSBo Shen #define USBA_CTRL 0x0000
16*9e40493fSBo Shen #define USBA_FNUM 0x0004
17*9e40493fSBo Shen #define USBA_INT_ENB 0x0010
18*9e40493fSBo Shen #define USBA_INT_STA 0x0014
19*9e40493fSBo Shen #define USBA_INT_CLR 0x0018
20*9e40493fSBo Shen #define USBA_EPT_RST 0x001c
21*9e40493fSBo Shen #define USBA_TST 0x00e0
22*9e40493fSBo Shen
23*9e40493fSBo Shen /* USB endpoint register offsets */
24*9e40493fSBo Shen #define USBA_EPT_CFG 0x0000
25*9e40493fSBo Shen #define USBA_EPT_CTL_ENB 0x0004
26*9e40493fSBo Shen #define USBA_EPT_CTL_DIS 0x0008
27*9e40493fSBo Shen #define USBA_EPT_CTL 0x000c
28*9e40493fSBo Shen #define USBA_EPT_SET_STA 0x0014
29*9e40493fSBo Shen #define USBA_EPT_CLR_STA 0x0018
30*9e40493fSBo Shen #define USBA_EPT_STA 0x001c
31*9e40493fSBo Shen
32*9e40493fSBo Shen /* USB DMA register offsets */
33*9e40493fSBo Shen #define USBA_DMA_NXT_DSC 0x0000
34*9e40493fSBo Shen #define USBA_DMA_ADDRESS 0x0004
35*9e40493fSBo Shen #define USBA_DMA_CONTROL 0x0008
36*9e40493fSBo Shen #define USBA_DMA_STATUS 0x000c
37*9e40493fSBo Shen
38*9e40493fSBo Shen /* Bitfields in CTRL */
39*9e40493fSBo Shen #define USBA_DEV_ADDR_OFFSET 0
40*9e40493fSBo Shen #define USBA_DEV_ADDR_SIZE 7
41*9e40493fSBo Shen #define USBA_FADDR_EN (1 << 7)
42*9e40493fSBo Shen #define USBA_EN_USBA (1 << 8)
43*9e40493fSBo Shen #define USBA_DETACH (1 << 9)
44*9e40493fSBo Shen #define USBA_REMOTE_WAKE_UP (1 << 10)
45*9e40493fSBo Shen #define USBA_PULLD_DIS (1 << 11)
46*9e40493fSBo Shen
47*9e40493fSBo Shen #define USBA_ENABLE_MASK (USBA_EN_USBA | USBA_PULLD_DIS)
48*9e40493fSBo Shen #define USBA_DISABLE_MASK USBA_DETACH
49*9e40493fSBo Shen
50*9e40493fSBo Shen /* Bitfields in FNUM */
51*9e40493fSBo Shen #define USBA_MICRO_FRAME_NUM_OFFSET 0
52*9e40493fSBo Shen #define USBA_MICRO_FRAME_NUM_SIZE 3
53*9e40493fSBo Shen #define USBA_FRAME_NUMBER_OFFSET 3
54*9e40493fSBo Shen #define USBA_FRAME_NUMBER_SIZE 11
55*9e40493fSBo Shen #define USBA_FRAME_NUM_ERROR (1 << 31)
56*9e40493fSBo Shen
57*9e40493fSBo Shen /* Bitfields in INT_ENB/INT_STA/INT_CLR */
58*9e40493fSBo Shen #define USBA_HIGH_SPEED (1 << 0)
59*9e40493fSBo Shen #define USBA_DET_SUSPEND (1 << 1)
60*9e40493fSBo Shen #define USBA_MICRO_SOF (1 << 2)
61*9e40493fSBo Shen #define USBA_SOF (1 << 3)
62*9e40493fSBo Shen #define USBA_END_OF_RESET (1 << 4)
63*9e40493fSBo Shen #define USBA_WAKE_UP (1 << 5)
64*9e40493fSBo Shen #define USBA_END_OF_RESUME (1 << 6)
65*9e40493fSBo Shen #define USBA_UPSTREAM_RESUME (1 << 7)
66*9e40493fSBo Shen #define USBA_EPT_INT_OFFSET 8
67*9e40493fSBo Shen #define USBA_EPT_INT_SIZE 16
68*9e40493fSBo Shen #define USBA_DMA_INT_OFFSET 24
69*9e40493fSBo Shen #define USBA_DMA_INT_SIZE 8
70*9e40493fSBo Shen
71*9e40493fSBo Shen /* Bitfields in EPT_RST */
72*9e40493fSBo Shen #define USBA_RST_OFFSET 0
73*9e40493fSBo Shen #define USBA_RST_SIZE 16
74*9e40493fSBo Shen
75*9e40493fSBo Shen /* Bitfields in USBA_TST */
76*9e40493fSBo Shen #define USBA_SPEED_CFG_OFFSET 0
77*9e40493fSBo Shen #define USBA_SPEED_CFG_SIZE 2
78*9e40493fSBo Shen #define USBA_TST_J_MODE (1 << 2)
79*9e40493fSBo Shen #define USBA_TST_K_MODE (1 << 3)
80*9e40493fSBo Shen #define USBA_TST_PKT_MODE (1 << 4)
81*9e40493fSBo Shen #define USBA_OPMODE2 (1 << 5)
82*9e40493fSBo Shen
83*9e40493fSBo Shen /* Bitfields in EPT_CFG */
84*9e40493fSBo Shen #define USBA_EPT_SIZE_OFFSET 0
85*9e40493fSBo Shen #define USBA_EPT_SIZE_SIZE 3
86*9e40493fSBo Shen #define USBA_EPT_DIR_IN (1 << 3)
87*9e40493fSBo Shen #define USBA_EPT_TYPE_OFFSET 4
88*9e40493fSBo Shen #define USBA_EPT_TYPE_SIZE 2
89*9e40493fSBo Shen #define USBA_BK_NUMBER_OFFSET 6
90*9e40493fSBo Shen #define USBA_BK_NUMBER_SIZE 2
91*9e40493fSBo Shen #define USBA_NB_TRANS_OFFSET 8
92*9e40493fSBo Shen #define USBA_NB_TRANS_SIZE 2
93*9e40493fSBo Shen #define USBA_EPT_MAPPED (1 << 31)
94*9e40493fSBo Shen
95*9e40493fSBo Shen /* Bitfields in EPT_CTL/EPT_CTL_ENB/EPT_CTL_DIS */
96*9e40493fSBo Shen #define USBA_EPT_ENABLE (1 << 0)
97*9e40493fSBo Shen #define USBA_AUTO_VALID (1 << 1)
98*9e40493fSBo Shen #define USBA_INTDIS_DMA (1 << 3)
99*9e40493fSBo Shen #define USBA_NYET_DIS (1 << 4)
100*9e40493fSBo Shen #define USBA_DATAX_RX (1 << 6)
101*9e40493fSBo Shen #define USBA_MDATA_RX (1 << 7)
102*9e40493fSBo Shen /* Bits 8-15 and 31 enable interrupts for respective bits in EPT_STA */
103*9e40493fSBo Shen #define USBA_BUSY_BANK_IE (1 << 18)
104*9e40493fSBo Shen
105*9e40493fSBo Shen /* Bitfields in EPT_SET_STA/EPT_CLR_STA/EPT_STA */
106*9e40493fSBo Shen #define USBA_FORCE_STALL (1 << 5)
107*9e40493fSBo Shen #define USBA_TOGGLE_CLR (1 << 6)
108*9e40493fSBo Shen #define USBA_TOGGLE_SEQ_OFFSET 6
109*9e40493fSBo Shen #define USBA_TOGGLE_SEQ_SIZE 2
110*9e40493fSBo Shen #define USBA_ERR_OVFLW (1 << 8)
111*9e40493fSBo Shen #define USBA_RX_BK_RDY (1 << 9)
112*9e40493fSBo Shen #define USBA_KILL_BANK (1 << 9)
113*9e40493fSBo Shen #define USBA_TX_COMPLETE (1 << 10)
114*9e40493fSBo Shen #define USBA_TX_PK_RDY (1 << 11)
115*9e40493fSBo Shen #define USBA_ISO_ERR_TRANS (1 << 11)
116*9e40493fSBo Shen #define USBA_RX_SETUP (1 << 12)
117*9e40493fSBo Shen #define USBA_ISO_ERR_FLOW (1 << 12)
118*9e40493fSBo Shen #define USBA_STALL_SENT (1 << 13)
119*9e40493fSBo Shen #define USBA_ISO_ERR_CRC (1 << 13)
120*9e40493fSBo Shen #define USBA_ISO_ERR_NBTRANS (1 << 13)
121*9e40493fSBo Shen #define USBA_NAK_IN (1 << 14)
122*9e40493fSBo Shen #define USBA_ISO_ERR_FLUSH (1 << 14)
123*9e40493fSBo Shen #define USBA_NAK_OUT (1 << 15)
124*9e40493fSBo Shen #define USBA_CURRENT_BANK_OFFSET 16
125*9e40493fSBo Shen #define USBA_CURRENT_BANK_SIZE 2
126*9e40493fSBo Shen #define USBA_BUSY_BANKS_OFFSET 18
127*9e40493fSBo Shen #define USBA_BUSY_BANKS_SIZE 2
128*9e40493fSBo Shen #define USBA_BYTE_COUNT_OFFSET 20
129*9e40493fSBo Shen #define USBA_BYTE_COUNT_SIZE 11
130*9e40493fSBo Shen #define USBA_SHORT_PACKET (1 << 31)
131*9e40493fSBo Shen
132*9e40493fSBo Shen /* Bitfields in DMA_CONTROL */
133*9e40493fSBo Shen #define USBA_DMA_CH_EN (1 << 0)
134*9e40493fSBo Shen #define USBA_DMA_LINK (1 << 1)
135*9e40493fSBo Shen #define USBA_DMA_END_TR_EN (1 << 2)
136*9e40493fSBo Shen #define USBA_DMA_END_BUF_EN (1 << 3)
137*9e40493fSBo Shen #define USBA_DMA_END_TR_IE (1 << 4)
138*9e40493fSBo Shen #define USBA_DMA_END_BUF_IE (1 << 5)
139*9e40493fSBo Shen #define USBA_DMA_DESC_LOAD_IE (1 << 6)
140*9e40493fSBo Shen #define USBA_DMA_BURST_LOCK (1 << 7)
141*9e40493fSBo Shen #define USBA_DMA_BUF_LEN_OFFSET 16
142*9e40493fSBo Shen #define USBA_DMA_BUF_LEN_SIZE 16
143*9e40493fSBo Shen
144*9e40493fSBo Shen /* Bitfields in DMA_STATUS */
145*9e40493fSBo Shen #define USBA_DMA_CH_ACTIVE (1 << 1)
146*9e40493fSBo Shen #define USBA_DMA_END_TR_ST (1 << 4)
147*9e40493fSBo Shen #define USBA_DMA_END_BUF_ST (1 << 5)
148*9e40493fSBo Shen #define USBA_DMA_DESC_LOAD_ST (1 << 6)
149*9e40493fSBo Shen
150*9e40493fSBo Shen /* Constants for SPEED_CFG */
151*9e40493fSBo Shen #define USBA_SPEED_CFG_NORMAL 0
152*9e40493fSBo Shen #define USBA_SPEED_CFG_FORCE_HIGH 2
153*9e40493fSBo Shen #define USBA_SPEED_CFG_FORCE_FULL 3
154*9e40493fSBo Shen
155*9e40493fSBo Shen /* Constants for EPT_SIZE */
156*9e40493fSBo Shen #define USBA_EPT_SIZE_8 0
157*9e40493fSBo Shen #define USBA_EPT_SIZE_16 1
158*9e40493fSBo Shen #define USBA_EPT_SIZE_32 2
159*9e40493fSBo Shen #define USBA_EPT_SIZE_64 3
160*9e40493fSBo Shen #define USBA_EPT_SIZE_128 4
161*9e40493fSBo Shen #define USBA_EPT_SIZE_256 5
162*9e40493fSBo Shen #define USBA_EPT_SIZE_512 6
163*9e40493fSBo Shen #define USBA_EPT_SIZE_1024 7
164*9e40493fSBo Shen
165*9e40493fSBo Shen /* Constants for EPT_TYPE */
166*9e40493fSBo Shen #define USBA_EPT_TYPE_CONTROL 0
167*9e40493fSBo Shen #define USBA_EPT_TYPE_ISO 1
168*9e40493fSBo Shen #define USBA_EPT_TYPE_BULK 2
169*9e40493fSBo Shen #define USBA_EPT_TYPE_INT 3
170*9e40493fSBo Shen
171*9e40493fSBo Shen /* Constants for BK_NUMBER */
172*9e40493fSBo Shen #define USBA_BK_NUMBER_ZERO 0
173*9e40493fSBo Shen #define USBA_BK_NUMBER_ONE 1
174*9e40493fSBo Shen #define USBA_BK_NUMBER_DOUBLE 2
175*9e40493fSBo Shen #define USBA_BK_NUMBER_TRIPLE 3
176*9e40493fSBo Shen
177*9e40493fSBo Shen /* Bit manipulation macros */
178*9e40493fSBo Shen #define USBA_BF(name, value) \
179*9e40493fSBo Shen (((value) & ((1 << USBA_##name##_SIZE) - 1)) \
180*9e40493fSBo Shen << USBA_##name##_OFFSET)
181*9e40493fSBo Shen #define USBA_BFEXT(name, value) \
182*9e40493fSBo Shen (((value) >> USBA_##name##_OFFSET) \
183*9e40493fSBo Shen & ((1 << USBA_##name##_SIZE) - 1))
184*9e40493fSBo Shen #define USBA_BFINS(name, value, old) \
185*9e40493fSBo Shen (((old) & ~(((1 << USBA_##name##_SIZE) - 1) \
186*9e40493fSBo Shen << USBA_##name##_OFFSET)) \
187*9e40493fSBo Shen | USBA_BF(name, value))
188*9e40493fSBo Shen
189*9e40493fSBo Shen /* Register access macros */
190*9e40493fSBo Shen #define usba_readl(udc, reg) \
191*9e40493fSBo Shen __raw_readl((udc)->regs + USBA_##reg)
192*9e40493fSBo Shen #define usba_writel(udc, reg, value) \
193*9e40493fSBo Shen __raw_writel((value), (udc)->regs + USBA_##reg)
194*9e40493fSBo Shen #define usba_ep_readl(ep, reg) \
195*9e40493fSBo Shen __raw_readl((ep)->ep_regs + USBA_EPT_##reg)
196*9e40493fSBo Shen #define usba_ep_writel(ep, reg, value) \
197*9e40493fSBo Shen __raw_writel((value), (ep)->ep_regs + USBA_EPT_##reg)
198*9e40493fSBo Shen #define usba_dma_readl(ep, reg) \
199*9e40493fSBo Shen __raw_readl((ep)->dma_regs + USBA_DMA_##reg)
200*9e40493fSBo Shen #define usba_dma_writel(ep, reg, value) \
201*9e40493fSBo Shen __raw_writel((value), (ep)->dma_regs + USBA_DMA_##reg)
202*9e40493fSBo Shen
203*9e40493fSBo Shen /* Calculate base address for a given endpoint or DMA controller */
204*9e40493fSBo Shen #define USBA_EPT_BASE(x) (0x100 + (x) * 0x20)
205*9e40493fSBo Shen #define USBA_DMA_BASE(x) (0x300 + (x) * 0x10)
206*9e40493fSBo Shen #define USBA_FIFO_BASE(x) ((x) << 16)
207*9e40493fSBo Shen
208*9e40493fSBo Shen /* Synth parameters */
209*9e40493fSBo Shen #define USBA_NR_ENDPOINTS 7
210*9e40493fSBo Shen
211*9e40493fSBo Shen #define EP0_FIFO_SIZE 64
212*9e40493fSBo Shen #define EP0_EPT_SIZE USBA_EPT_SIZE_64
213*9e40493fSBo Shen #define EP0_NR_BANKS 1
214*9e40493fSBo Shen
215*9e40493fSBo Shen #define DBG_ERR 0x0001 /* report all error returns */
216*9e40493fSBo Shen #define DBG_HW 0x0002 /* debug hardware initialization */
217*9e40493fSBo Shen #define DBG_GADGET 0x0004 /* calls to/from gadget driver */
218*9e40493fSBo Shen #define DBG_INT 0x0008 /* interrupts */
219*9e40493fSBo Shen #define DBG_BUS 0x0010 /* report changes in bus state */
220*9e40493fSBo Shen #define DBG_QUEUE 0x0020 /* debug request queue processing */
221*9e40493fSBo Shen #define DBG_FIFO 0x0040 /* debug FIFO contents */
222*9e40493fSBo Shen #define DBG_DMA 0x0080 /* debug DMA handling */
223*9e40493fSBo Shen #define DBG_REQ 0x0100 /* print out queued request length */
224*9e40493fSBo Shen #define DBG_ALL 0xffff
225*9e40493fSBo Shen #define DBG_NONE 0x0000
226*9e40493fSBo Shen
227*9e40493fSBo Shen #define DEBUG_LEVEL (DBG_ERR)
228*9e40493fSBo Shen
229*9e40493fSBo Shen #define DBG(level, fmt, ...) \
230*9e40493fSBo Shen do { \
231*9e40493fSBo Shen if ((level) & DEBUG_LEVEL) \
232*9e40493fSBo Shen debug("udc: " fmt, ## __VA_ARGS__); \
233*9e40493fSBo Shen } while (0)
234*9e40493fSBo Shen
235*9e40493fSBo Shen enum usba_ctrl_state {
236*9e40493fSBo Shen WAIT_FOR_SETUP,
237*9e40493fSBo Shen DATA_STAGE_IN,
238*9e40493fSBo Shen DATA_STAGE_OUT,
239*9e40493fSBo Shen STATUS_STAGE_IN,
240*9e40493fSBo Shen STATUS_STAGE_OUT,
241*9e40493fSBo Shen STATUS_STAGE_ADDR,
242*9e40493fSBo Shen STATUS_STAGE_TEST,
243*9e40493fSBo Shen };
244*9e40493fSBo Shen
245*9e40493fSBo Shen struct usba_dma_desc {
246*9e40493fSBo Shen dma_addr_t next;
247*9e40493fSBo Shen dma_addr_t addr;
248*9e40493fSBo Shen u32 ctrl;
249*9e40493fSBo Shen };
250*9e40493fSBo Shen
251*9e40493fSBo Shen struct usba_ep {
252*9e40493fSBo Shen int state;
253*9e40493fSBo Shen void *ep_regs;
254*9e40493fSBo Shen void *dma_regs;
255*9e40493fSBo Shen void *fifo;
256*9e40493fSBo Shen struct usb_ep ep;
257*9e40493fSBo Shen struct usba_udc *udc;
258*9e40493fSBo Shen
259*9e40493fSBo Shen struct list_head queue;
260*9e40493fSBo Shen
261*9e40493fSBo Shen u16 fifo_size;
262*9e40493fSBo Shen u8 nr_banks;
263*9e40493fSBo Shen u8 index;
264*9e40493fSBo Shen unsigned int can_dma:1;
265*9e40493fSBo Shen unsigned int can_isoc:1;
266*9e40493fSBo Shen unsigned int is_isoc:1;
267*9e40493fSBo Shen unsigned int is_in:1;
268*9e40493fSBo Shen
269*9e40493fSBo Shen const struct usb_endpoint_descriptor *desc;
270*9e40493fSBo Shen };
271*9e40493fSBo Shen
272*9e40493fSBo Shen struct usba_request {
273*9e40493fSBo Shen struct usb_request req;
274*9e40493fSBo Shen struct list_head queue;
275*9e40493fSBo Shen
276*9e40493fSBo Shen u32 ctrl;
277*9e40493fSBo Shen
278*9e40493fSBo Shen unsigned int submitted:1;
279*9e40493fSBo Shen unsigned int last_transaction:1;
280*9e40493fSBo Shen unsigned int using_dma:1;
281*9e40493fSBo Shen unsigned int mapped:1;
282*9e40493fSBo Shen };
283*9e40493fSBo Shen
284*9e40493fSBo Shen struct usba_udc {
285*9e40493fSBo Shen void *regs;
286*9e40493fSBo Shen void *fifo;
287*9e40493fSBo Shen
288*9e40493fSBo Shen struct usb_gadget gadget;
289*9e40493fSBo Shen struct usb_gadget_driver *driver;
290*9e40493fSBo Shen struct platform_device *pdev;
291*9e40493fSBo Shen int irq;
292*9e40493fSBo Shen int vbus_pin;
293*9e40493fSBo Shen int vbus_pin_inverted;
294*9e40493fSBo Shen int num_ep;
295*9e40493fSBo Shen struct usba_ep *usba_ep;
296*9e40493fSBo Shen
297*9e40493fSBo Shen u16 devstatus;
298*9e40493fSBo Shen
299*9e40493fSBo Shen u16 test_mode;
300*9e40493fSBo Shen int vbus_prev;
301*9e40493fSBo Shen };
302*9e40493fSBo Shen
to_usba_ep(struct usb_ep * ep)303*9e40493fSBo Shen static inline struct usba_ep *to_usba_ep(struct usb_ep *ep)
304*9e40493fSBo Shen {
305*9e40493fSBo Shen return container_of(ep, struct usba_ep, ep);
306*9e40493fSBo Shen }
307*9e40493fSBo Shen
to_usba_req(struct usb_request * req)308*9e40493fSBo Shen static inline struct usba_request *to_usba_req(struct usb_request *req)
309*9e40493fSBo Shen {
310*9e40493fSBo Shen return container_of(req, struct usba_request, req);
311*9e40493fSBo Shen }
312*9e40493fSBo Shen
to_usba_udc(struct usb_gadget * gadget)313*9e40493fSBo Shen static inline struct usba_udc *to_usba_udc(struct usb_gadget *gadget)
314*9e40493fSBo Shen {
315*9e40493fSBo Shen return container_of(gadget, struct usba_udc, gadget);
316*9e40493fSBo Shen }
317*9e40493fSBo Shen
318*9e40493fSBo Shen #define ep_is_control(ep) ((ep)->index == 0)
319*9e40493fSBo Shen #define ep_is_idle(ep) ((ep)->state == EP_STATE_IDLE)
320*9e40493fSBo Shen
321*9e40493fSBo Shen #endif /* __LINUX_USB_GADGET_USBA_UDC_H */
322