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