Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / usb / gadget / udc / mv_u3d.h
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 */
124 struct mv_u3d_cap_regs {
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 */
132 struct mv_u3d_op_regs {
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 */
161 struct mv_u3d_vuc_regs {
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 */
197 struct mv_u3d_ep_context {
198         u32     rsvd0;
199         u32     rsvd1;
200         u32     trb_addr_lo;            /* TRB address low 32 bit */
201         u32     trb_addr_hi;            /* TRB address high 32 bit */
202         u32     rsvd2;
203         u32     rsvd3;
204         struct usb_ctrlrequest setup_buffer;    /* setup data buffer */
205 };
206
207 /* TRB control data structure */
208 struct mv_u3d_trb_ctrl {
209         u32     own:1;          /* owner of TRB */
210         u32     rsvd1:3;
211         u32     chain:1;        /* associate this TRB with the
212                                 next TRB on the Ring */
213         u32     ioc:1;          /* interrupt on complete */
214         u32     rsvd2:4;
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  */
227 struct mv_u3d_trb_hw {
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 {
243         struct usb_gadget               gadget;
244         struct usb_gadget_driver        *driver;
245         spinlock_t                      lock;   /* device lock */
246         struct completion               *done;
247         struct device                   *dev;
248         int                             irq;
249
250         /* usb controller registers */
251         struct mv_u3d_cap_regs __iomem  *cap_regs;
252         struct mv_u3d_op_regs __iomem   *op_regs;
253         struct mv_u3d_vuc_regs __iomem  *vuc_regs;
254         void __iomem                    *phy_regs;
255
256         unsigned int                    max_eps;
257         struct mv_u3d_ep_context        *ep_context;
258         size_t                          ep_context_size;
259         dma_addr_t                      ep_context_dma;
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
283         struct mv_usb_addon_irq *vbus;
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 */
296         u32                     direction;
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