1
2
3
4
5
6
7
8
9
10#ifndef __MV_UDC_H
11#define __MV_UDC_H
12
13#define VUSBHS_MAX_PORTS 8
14
15#define DQH_ALIGNMENT 2048
16#define DTD_ALIGNMENT 64
17#define DMA_BOUNDARY 4096
18
19#define EP_DIR_IN 1
20#define EP_DIR_OUT 0
21
22#define DMA_ADDR_INVALID (~(dma_addr_t)0)
23
24#define EP0_MAX_PKT_SIZE 64
25
26#define WAIT_FOR_SETUP 0
27#define DATA_STATE_XMIT 1
28#define DATA_STATE_NEED_ZLP 2
29#define WAIT_FOR_OUT_STATUS 3
30#define DATA_STATE_RECV 4
31
32#define CAPLENGTH_MASK (0xff)
33#define DCCPARAMS_DEN_MASK (0x1f)
34
35#define HCSPARAMS_PPC (0x10)
36
37
38#define USB_FRINDEX_MASKS 0x3fff
39
40
41#define USBCMD_RUN_STOP (0x00000001)
42#define USBCMD_CTRL_RESET (0x00000002)
43#define USBCMD_SETUP_TRIPWIRE_SET (0x00002000)
44#define USBCMD_SETUP_TRIPWIRE_CLEAR (~USBCMD_SETUP_TRIPWIRE_SET)
45
46#define USBCMD_ATDTW_TRIPWIRE_SET (0x00004000)
47#define USBCMD_ATDTW_TRIPWIRE_CLEAR (~USBCMD_ATDTW_TRIPWIRE_SET)
48
49
50#define USBCMD_FRAME_SIZE_1024 (0x00000000)
51#define USBCMD_FRAME_SIZE_512 (0x00000004)
52#define USBCMD_FRAME_SIZE_256 (0x00000008)
53#define USBCMD_FRAME_SIZE_128 (0x0000000C)
54#define USBCMD_FRAME_SIZE_64 (0x00008000)
55#define USBCMD_FRAME_SIZE_32 (0x00008004)
56#define USBCMD_FRAME_SIZE_16 (0x00008008)
57#define USBCMD_FRAME_SIZE_8 (0x0000800C)
58
59#define EPCTRL_TX_ALL_MASK (0xFFFF0000)
60#define EPCTRL_RX_ALL_MASK (0x0000FFFF)
61
62#define EPCTRL_TX_DATA_TOGGLE_RST (0x00400000)
63#define EPCTRL_TX_EP_STALL (0x00010000)
64#define EPCTRL_RX_EP_STALL (0x00000001)
65#define EPCTRL_RX_DATA_TOGGLE_RST (0x00000040)
66#define EPCTRL_RX_ENABLE (0x00000080)
67#define EPCTRL_TX_ENABLE (0x00800000)
68#define EPCTRL_CONTROL (0x00000000)
69#define EPCTRL_ISOCHRONOUS (0x00040000)
70#define EPCTRL_BULK (0x00080000)
71#define EPCTRL_INT (0x000C0000)
72#define EPCTRL_TX_TYPE (0x000C0000)
73#define EPCTRL_RX_TYPE (0x0000000C)
74#define EPCTRL_DATA_TOGGLE_INHIBIT (0x00000020)
75#define EPCTRL_TX_EP_TYPE_SHIFT (18)
76#define EPCTRL_RX_EP_TYPE_SHIFT (2)
77
78#define EPCOMPLETE_MAX_ENDPOINTS (16)
79
80
81#define USB_EP_LIST_ADDRESS_MASK 0xfffff800
82
83#define PORTSCX_W1C_BITS 0x2a
84#define PORTSCX_PORT_RESET 0x00000100
85#define PORTSCX_PORT_POWER 0x00001000
86#define PORTSCX_FORCE_FULL_SPEED_CONNECT 0x01000000
87#define PORTSCX_PAR_XCVR_SELECT 0xC0000000
88#define PORTSCX_PORT_FORCE_RESUME 0x00000040
89#define PORTSCX_PORT_SUSPEND 0x00000080
90#define PORTSCX_PORT_SPEED_FULL 0x00000000
91#define PORTSCX_PORT_SPEED_LOW 0x04000000
92#define PORTSCX_PORT_SPEED_HIGH 0x08000000
93#define PORTSCX_PORT_SPEED_MASK 0x0C000000
94
95
96#define USBMODE_CTRL_MODE_IDLE 0x00000000
97#define USBMODE_CTRL_MODE_DEVICE 0x00000002
98#define USBMODE_CTRL_MODE_HOST 0x00000003
99#define USBMODE_CTRL_MODE_RSV 0x00000001
100#define USBMODE_SETUP_LOCK_OFF 0x00000008
101#define USBMODE_STREAM_DISABLE 0x00000010
102
103
104#define USBSTS_INT 0x00000001
105#define USBSTS_ERR 0x00000002
106#define USBSTS_PORT_CHANGE 0x00000004
107#define USBSTS_FRM_LST_ROLL 0x00000008
108#define USBSTS_SYS_ERR 0x00000010
109#define USBSTS_IAA 0x00000020
110#define USBSTS_RESET 0x00000040
111#define USBSTS_SOF 0x00000080
112#define USBSTS_SUSPEND 0x00000100
113#define USBSTS_HC_HALTED 0x00001000
114#define USBSTS_RCL 0x00002000
115#define USBSTS_PERIODIC_SCHEDULE 0x00004000
116#define USBSTS_ASYNC_SCHEDULE 0x00008000
117
118
119
120#define USBINTR_INT_EN (0x00000001)
121#define USBINTR_ERR_INT_EN (0x00000002)
122#define USBINTR_PORT_CHANGE_DETECT_EN (0x00000004)
123
124#define USBINTR_ASYNC_ADV_AAE (0x00000020)
125#define USBINTR_ASYNC_ADV_AAE_ENABLE (0x00000020)
126#define USBINTR_ASYNC_ADV_AAE_DISABLE (0xFFFFFFDF)
127
128#define USBINTR_RESET_EN (0x00000040)
129#define USBINTR_SOF_UFRAME_EN (0x00000080)
130#define USBINTR_DEVICE_SUSPEND (0x00000100)
131
132#define USB_DEVICE_ADDRESS_MASK (0xfe000000)
133#define USB_DEVICE_ADDRESS_BIT_SHIFT (25)
134
135struct mv_cap_regs {
136 u32 caplength_hciversion;
137 u32 hcsparams;
138 u32 hccparams;
139 u32 reserved[5];
140 u32 dciversion;
141 u32 dccparams;
142};
143
144struct mv_op_regs {
145 u32 usbcmd;
146 u32 usbsts;
147 u32 usbintr;
148 u32 frindex;
149 u32 reserved1[1];
150 u32 deviceaddr;
151 u32 eplistaddr;
152 u32 ttctrl;
153 u32 burstsize;
154 u32 txfilltuning;
155 u32 reserved[4];
156 u32 epnak;
157 u32 epnaken;
158 u32 configflag;
159 u32 portsc[VUSBHS_MAX_PORTS];
160 u32 otgsc;
161 u32 usbmode;
162 u32 epsetupstat;
163 u32 epprime;
164 u32 epflush;
165 u32 epstatus;
166 u32 epcomplete;
167 u32 epctrlx[16];
168 u32 mcr;
169 u32 isr;
170 u32 ier;
171};
172
173struct mv_udc {
174 struct usb_gadget gadget;
175 struct usb_gadget_driver *driver;
176 spinlock_t lock;
177 struct completion *done;
178 struct platform_device *dev;
179 int irq;
180
181 struct mv_cap_regs __iomem *cap_regs;
182 struct mv_op_regs __iomem *op_regs;
183 void __iomem *phy_regs;
184 unsigned int max_eps;
185 struct mv_dqh *ep_dqh;
186 size_t ep_dqh_size;
187 dma_addr_t ep_dqh_dma;
188
189 struct dma_pool *dtd_pool;
190 struct mv_ep *eps;
191
192 struct mv_dtd *dtd_head;
193 struct mv_dtd *dtd_tail;
194 unsigned int dtd_entries;
195
196 struct mv_req *status_req;
197 struct usb_ctrlrequest local_setup_buff;
198
199 unsigned int resume_state;
200 unsigned int usb_state;
201 unsigned int ep0_state;
202 unsigned int ep0_dir;
203
204 unsigned int dev_addr;
205 unsigned int test_mode;
206
207 int errors;
208 unsigned softconnect:1,
209 vbus_active:1,
210 remote_wakeup:1,
211 softconnected:1,
212 force_fs:1,
213 clock_gating:1,
214 active:1,
215 stopped:1;
216
217 struct work_struct vbus_work;
218 struct workqueue_struct *qwork;
219
220 struct usb_phy *transceiver;
221
222 struct mv_usb_platform_data *pdata;
223
224
225 unsigned int clknum;
226 struct clk *clk[0];
227};
228
229
230struct mv_ep {
231 struct usb_ep ep;
232 struct mv_udc *udc;
233 struct list_head queue;
234 struct mv_dqh *dqh;
235 u32 direction;
236 char name[14];
237 unsigned stopped:1,
238 wedge:1,
239 ep_type:2,
240 ep_num:8;
241};
242
243
244struct mv_req {
245 struct usb_request req;
246 struct mv_dtd *dtd, *head, *tail;
247 struct mv_ep *ep;
248 struct list_head queue;
249 unsigned int test_mode;
250 unsigned dtd_count;
251 unsigned mapped:1;
252};
253
254#define EP_QUEUE_HEAD_MULT_POS 30
255#define EP_QUEUE_HEAD_ZLT_SEL 0x20000000
256#define EP_QUEUE_HEAD_MAX_PKT_LEN_POS 16
257#define EP_QUEUE_HEAD_MAX_PKT_LEN(ep_info) (((ep_info)>>16)&0x07ff)
258#define EP_QUEUE_HEAD_IOS 0x00008000
259#define EP_QUEUE_HEAD_NEXT_TERMINATE 0x00000001
260#define EP_QUEUE_HEAD_IOC 0x00008000
261#define EP_QUEUE_HEAD_MULTO 0x00000C00
262#define EP_QUEUE_HEAD_STATUS_HALT 0x00000040
263#define EP_QUEUE_HEAD_STATUS_ACTIVE 0x00000080
264#define EP_QUEUE_CURRENT_OFFSET_MASK 0x00000FFF
265#define EP_QUEUE_HEAD_NEXT_POINTER_MASK 0xFFFFFFE0
266#define EP_QUEUE_FRINDEX_MASK 0x000007FF
267#define EP_MAX_LENGTH_TRANSFER 0x4000
268
269struct mv_dqh {
270
271 u32 max_packet_length;
272 u32 curr_dtd_ptr;
273 u32 next_dtd_ptr;
274
275 u32 size_ioc_int_sts;
276 u32 buff_ptr0;
277 u32 buff_ptr1;
278 u32 buff_ptr2;
279 u32 buff_ptr3;
280 u32 buff_ptr4;
281 u32 reserved1;
282
283 u8 setup_buffer[8];
284 u32 reserved2[4];
285};
286
287
288#define DTD_NEXT_TERMINATE (0x00000001)
289#define DTD_IOC (0x00008000)
290#define DTD_STATUS_ACTIVE (0x00000080)
291#define DTD_STATUS_HALTED (0x00000040)
292#define DTD_STATUS_DATA_BUFF_ERR (0x00000020)
293#define DTD_STATUS_TRANSACTION_ERR (0x00000008)
294#define DTD_RESERVED_FIELDS (0x00007F00)
295#define DTD_ERROR_MASK (0x68)
296#define DTD_ADDR_MASK (0xFFFFFFE0)
297#define DTD_PACKET_SIZE 0x7FFF0000
298#define DTD_LENGTH_BIT_POS (16)
299
300struct mv_dtd {
301 u32 dtd_next;
302 u32 size_ioc_sts;
303 u32 buff_ptr0;
304 u32 buff_ptr1;
305 u32 buff_ptr2;
306 u32 buff_ptr3;
307 u32 buff_ptr4;
308 u32 scratch_ptr;
309
310 dma_addr_t td_dma;
311 struct mv_dtd *next_dtd_virt;
312};
313
314#endif
315