Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mv_u3d.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  */
8 
9 #ifndef __MV_U3D_H
10 #define __MV_U3D_H
11 
12 #define MV_U3D_EP_CONTEXT_ALIGNMENT 32
13 #define MV_U3D_TRB_ALIGNMENT 16
14 #define MV_U3D_DMA_BOUNDARY 4096
15 #define MV_U3D_EP0_MAX_PKT_SIZE 512
16 
17 /* ep0 transfer state */
18 #define MV_U3D_WAIT_FOR_SETUP 0
19 #define MV_U3D_DATA_STATE_XMIT 1
20 #define MV_U3D_DATA_STATE_NEED_ZLP 2
21 #define MV_U3D_WAIT_FOR_OUT_STATUS 3
22 #define MV_U3D_DATA_STATE_RECV 4
23 #define MV_U3D_STATUS_STAGE 5
24 
25 #define MV_U3D_EP_MAX_LENGTH_TRANSFER 0x10000
26 
27 /* USB3 Interrupt Status */
28 #define MV_U3D_USBINT_SETUP 0x00000001
29 #define MV_U3D_USBINT_RX_COMPLETE 0x00000002
30 #define MV_U3D_USBINT_TX_COMPLETE 0x00000004
31 #define MV_U3D_USBINT_UNDER_RUN 0x00000008
32 #define MV_U3D_USBINT_RXDESC_ERR 0x00000010
33 #define MV_U3D_USBINT_TXDESC_ERR 0x00000020
34 #define MV_U3D_USBINT_RX_TRB_COMPLETE 0x00000040
35 #define MV_U3D_USBINT_TX_TRB_COMPLETE 0x00000080
36 #define MV_U3D_USBINT_VBUS_VALID 0x00010000
37 #define MV_U3D_USBINT_STORAGE_CMD_FULL 0x00020000
38 #define MV_U3D_USBINT_LINK_CHG 0x01000000
39 
40 /* USB3 Interrupt Enable */
41 #define MV_U3D_INTR_ENABLE_SETUP 0x00000001
42 #define MV_U3D_INTR_ENABLE_RX_COMPLETE 0x00000002
43 #define MV_U3D_INTR_ENABLE_TX_COMPLETE 0x00000004
44 #define MV_U3D_INTR_ENABLE_UNDER_RUN 0x00000008
45 #define MV_U3D_INTR_ENABLE_RXDESC_ERR 0x00000010
46 #define MV_U3D_INTR_ENABLE_TXDESC_ERR 0x00000020
47 #define MV_U3D_INTR_ENABLE_RX_TRB_COMPLETE 0x00000040
48 #define MV_U3D_INTR_ENABLE_TX_TRB_COMPLETE 0x00000080
49 #define MV_U3D_INTR_ENABLE_RX_BUFFER_ERR 0x00000100
50 #define MV_U3D_INTR_ENABLE_VBUS_VALID 0x00010000
51 #define MV_U3D_INTR_ENABLE_STORAGE_CMD_FULL 0x00020000
52 #define MV_U3D_INTR_ENABLE_LINK_CHG 0x01000000
53 #define MV_U3D_INTR_ENABLE_PRIME_STATUS 0x02000000
54 
55 /* USB3 Link Change */
56 #define MV_U3D_LINK_CHANGE_LINK_UP 0x00000001
57 #define MV_U3D_LINK_CHANGE_SUSPEND 0x00000002
58 #define MV_U3D_LINK_CHANGE_RESUME 0x00000004
59 #define MV_U3D_LINK_CHANGE_WRESET 0x00000008
60 #define MV_U3D_LINK_CHANGE_HRESET 0x00000010
61 #define MV_U3D_LINK_CHANGE_VBUS_INVALID 0x00000020
62 #define MV_U3D_LINK_CHANGE_INACT 0x00000040
63 #define MV_U3D_LINK_CHANGE_DISABLE_AFTER_U0 0x00000080
64 #define MV_U3D_LINK_CHANGE_U1 0x00000100
65 #define MV_U3D_LINK_CHANGE_U2 0x00000200
66 #define MV_U3D_LINK_CHANGE_U3 0x00000400
67 
68 /* bridge setting */
69 #define MV_U3D_BRIDGE_SETTING_VBUS_VALID (1 << 16)
70 
71 /* Command Register Bit Masks */
72 #define MV_U3D_CMD_RUN_STOP 0x00000001
73 #define MV_U3D_CMD_CTRL_RESET 0x00000002
74 
75 /* ep control register */
76 #define MV_U3D_EPXCR_EP_TYPE_CONTROL 0
77 #define MV_U3D_EPXCR_EP_TYPE_ISOC 1
78 #define MV_U3D_EPXCR_EP_TYPE_BULK 2
79 #define MV_U3D_EPXCR_EP_TYPE_INT 3
80 #define MV_U3D_EPXCR_EP_ENABLE_SHIFT 4
81 #define MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT 12
82 #define MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT 16
83 #define MV_U3D_USB_BULK_BURST_OUT 6
84 #define MV_U3D_USB_BULK_BURST_IN 14
85 
86 #define MV_U3D_EPXCR_EP_FLUSH (1 << 7)
87 #define MV_U3D_EPXCR_EP_HALT (1 << 1)
88 #define MV_U3D_EPXCR_EP_INIT (1)
89 
90 /* TX/RX Status Register */
91 #define MV_U3D_XFERSTATUS_COMPLETE_SHIFT 24
92 #define MV_U3D_COMPLETE_INVALID 0
93 #define MV_U3D_COMPLETE_SUCCESS 1
94 #define MV_U3D_COMPLETE_BUFF_ERR 2
95 #define MV_U3D_COMPLETE_SHORT_PACKET 3
96 #define MV_U3D_COMPLETE_TRB_ERR 5
97 #define MV_U3D_XFERSTATUS_TRB_LENGTH_MASK (0xFFFFFF)
98 
99 #define MV_U3D_USB_LINK_BYPASS_VBUS 0x8
100 
101 #define MV_U3D_LTSSM_PHY_INIT_DONE 0x80000000
102 #define MV_U3D_LTSSM_NEVER_GO_COMPLIANCE 0x40000000
103 
104 #define MV_U3D_USB3_OP_REGS_OFFSET 0x100
105 #define MV_U3D_USB3_PHY_OFFSET 0xB800
106 
107 #define DCS_ENABLE 0x1
108 
109 /* timeout */
110 #define MV_U3D_RESET_TIMEOUT 10000
111 #define MV_U3D_FLUSH_TIMEOUT 100000
112 #define MV_U3D_OWN_TIMEOUT 10000
113 #define LOOPS_USEC_SHIFT 4
114 #define LOOPS_USEC (1 << LOOPS_USEC_SHIFT)
115 #define LOOPS(timeout) ((timeout) >> LOOPS_USEC_SHIFT)
116 
117 /* ep direction */
118 #define MV_U3D_EP_DIR_IN 1
119 #define MV_U3D_EP_DIR_OUT 0
120 #define mv_u3d_ep_dir(ep) (((ep)->ep_num == 0) ? \
121  ((ep)->u3d->ep0_dir) : ((ep)->direction))
122 
123 /* usb capability registers */
125  u32 rsvd[5];
126  u32 dboff; /* doorbell register offset */
127  u32 rtsoff; /* runtime register offset */
128  u32 vuoff; /* vendor unique register offset */
129 };
130 
131 /* operation registers */
133  u32 usbcmd; /* Command register */
134  u32 rsvd1[11];
135  u32 dcbaapl; /* Device Context Base Address low register */
136  u32 dcbaaph; /* Device Context Base Address high register */
137  u32 rsvd2[243];
138  u32 portsc; /* port status and control register*/
139  u32 portlinkinfo; /* port link info register*/
140  u32 rsvd3[9917];
141  u32 doorbell; /* doorbell register */
142 };
143 
144 /* control enpoint enable registers */
145 struct epxcr {
146  u32 epxoutcr0; /* ep out control 0 register */
147  u32 epxoutcr1; /* ep out control 1 register */
148  u32 epxincr0; /* ep in control 0 register */
149  u32 epxincr1; /* ep in control 1 register */
150 };
151 
152 /* transfer status registers */
153 struct xferstatus {
154  u32 curdeqlo; /* current TRB pointer low */
155  u32 curdeqhi; /* current TRB pointer high */
156  u32 statuslo; /* transfer status low */
157  u32 statushi; /* transfer status high */
158 };
159 
160 /* vendor unique control registers */
162  u32 ctrlepenable; /* control endpoint enable register */
163  u32 setuplock; /* setup lock register */
164  u32 endcomplete; /* endpoint transfer complete register */
165  u32 intrcause; /* interrupt cause register */
166  u32 intrenable; /* interrupt enable register */
167  u32 trbcomplete; /* TRB complete register */
168  u32 linkchange; /* link change register */
169  u32 rsvd1[5];
170  u32 trbunderrun; /* TRB underrun register */
171  u32 rsvd2[43];
172  u32 bridgesetting; /* bridge setting register */
173  u32 rsvd3[7];
174  struct xferstatus txst[16]; /* TX status register */
175  struct xferstatus rxst[16]; /* RX status register */
176  u32 ltssm; /* LTSSM control register */
177  u32 pipe; /* PIPE control register */
178  u32 linkcr0; /* link control 0 register */
179  u32 linkcr1; /* link control 1 register */
180  u32 rsvd6[60];
181  u32 mib0; /* MIB0 counter register */
182  u32 usblink; /* usb link control register */
183  u32 ltssmstate; /* LTSSM state register */
184  u32 linkerrorcause; /* link error cause register */
185  u32 rsvd7[60];
186  u32 devaddrtiebrkr; /* device address and tie breaker */
187  u32 itpinfo0; /* ITP info 0 register */
188  u32 itpinfo1; /* ITP info 1 register */
189  u32 rsvd8[61];
190  struct epxcr epcr[16]; /* ep control register */
191  u32 rsvd9[64];
192  u32 phyaddr; /* PHY address register */
193  u32 phydata; /* PHY data register */
194 };
195 
196 /* Endpoint context structure */
200  u32 trb_addr_lo; /* TRB address low 32 bit */
201  u32 trb_addr_hi; /* TRB address high 32 bit */
204  struct usb_ctrlrequest setup_buffer; /* setup data buffer */
205 };
206 
207 /* TRB control data structure */
209  u32 own:1; /* owner of TRB */
211  u32 chain:1; /* associate this TRB with the
212  next TRB on the Ring */
213  u32 ioc:1; /* interrupt on complete */
215  u32 type:6; /* TRB type */
216 #define TYPE_NORMAL 1
217 #define TYPE_DATA 3
218 #define TYPE_LINK 6
219  u32 dir:1; /* Working at data stage of control endpoint
220  operation. 0 is OUT and 1 is IN. */
221  u32 rsvd3:15;
222 };
223 
224 /* TRB data structure
225  * For multiple TRB, all the TRBs' physical address should be continuous.
226  */
228  u32 buf_addr_lo; /* data buffer address low 32 bit */
229  u32 buf_addr_hi; /* data buffer address high 32 bit */
230  u32 trb_len; /* transfer length */
231  struct mv_u3d_trb_ctrl ctrl; /* TRB control data */
232 };
233 
234 /* TRB structure */
235 struct mv_u3d_trb {
236  struct mv_u3d_trb_hw *trb_hw; /* point to the trb_hw structure */
237  dma_addr_t trb_dma; /* dma address for this trb_hw */
238  struct list_head trb_list; /* trb list */
239 };
240 
241 /* device data structure */
242 struct mv_u3d {
245  spinlock_t lock; /* device lock */
246  struct completion *done;
247  struct device *dev;
248  int irq;
249 
250  /* usb controller registers */
255 
256  unsigned int max_eps;
260 
261  struct dma_pool *trb_pool; /* for TRB data structure */
262  struct mv_u3d_ep *eps;
263 
264  struct mv_u3d_req *status_req; /* ep0 status request */
265  struct usb_ctrlrequest local_setup_buff; /* store setup data*/
266 
267  unsigned int resume_state; /* USB state to resume */
268  unsigned int usb_state; /* USB current state */
269  unsigned int ep0_state; /* Endpoint zero state */
270  unsigned int ep0_dir;
271 
272  unsigned int dev_addr; /* device address */
273 
274  unsigned int errors;
275 
276  unsigned softconnect:1;
277  unsigned vbus_active:1; /* vbus is active or not */
278  unsigned remote_wakeup:1; /* support remote wakeup */
279  unsigned clock_gating:1; /* clock gating or not */
280  unsigned active:1; /* udc is active or not */
281  unsigned vbus_valid_detect:1; /* udc vbus detection */
282 
284  unsigned int power;
285 
286  struct clk *clk;
287 };
288 
289 /* endpoint data structure */
290 struct mv_u3d_ep {
291  struct usb_ep ep;
292  struct mv_u3d *u3d;
293  struct list_head queue; /* ep request queued hardware */
294  struct list_head req_list; /* list of ep request */
295  struct mv_u3d_ep_context *ep_context; /* ep context */
297  char name[14];
298  u32 processing; /* there is ep request
299  queued on haredware */
300  spinlock_t req_lock; /* ep lock */
301  unsigned wedge:1;
302  unsigned enabled:1;
303  unsigned ep_type:2;
304  unsigned ep_num:8;
305 };
306 
307 /* request data structure */
308 struct mv_u3d_req {
309  struct usb_request req;
310  struct mv_u3d_ep *ep;
311  struct list_head queue; /* ep requst queued on hardware */
312  struct list_head list; /* ep request list */
313  struct list_head trb_list; /* trb list of a request */
314 
315  struct mv_u3d_trb *trb_head; /* point to first trb of a request */
316  unsigned trb_count; /* TRB number in the chain */
317  unsigned chain; /* TRB chain or not */
318 };
319 
320 #endif