1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/usb/langwell_udc.h>
21
22#if defined(CONFIG_USB_LANGWELL_OTG)
23#include <linux/usb/langwell_otg.h>
24#endif
25
26
27
28
29
30
31
32
33
34
35
36struct langwell_dtd {
37 u32 dtd_next;
38
39#define DTD_NEXT(d) (((d)>>5)&0x7ffffff)
40#define DTD_NEXT_MASK (0x7ffffff << 5)
41
42#define DTD_TERM BIT(0)
43
44 u32 dtd_status:8;
45#define DTD_STATUS(d) (((d)>>0)&0xff)
46#define DTD_STS_ACTIVE BIT(7)
47#define DTD_STS_HALTED BIT(6)
48#define DTD_STS_DBE BIT(5)
49#define DTD_STS_TRE BIT(3)
50
51 u32 dtd_res0:2;
52
53 u32 dtd_multo:2;
54#define DTD_MULTO (BIT(11) | BIT(10))
55
56 u32 dtd_res1:3;
57
58 u32 dtd_ioc:1;
59#define DTD_IOC BIT(15)
60
61 u32 dtd_total:15;
62#define DTD_TOTAL(d) (((d)>>16)&0x7fff)
63#define DTD_MAX_TRANSFER_LENGTH 0x4000
64
65 u32 dtd_res2:1;
66
67 u32 dtd_buf[5];
68#define DTD_OFFSET_MASK 0xfff
69
70#define DTD_BUFFER(d) (((d)>>12)&0x3ff)
71
72#define DTD_C_OFFSET(d) (((d)>>0)&0xfff)
73
74#define DTD_FRAME(d) (((d)>>0)&0x7ff)
75
76
77
78
79 dma_addr_t dtd_dma;
80
81 struct langwell_dtd *next_dtd_virt;
82};
83
84
85
86
87
88
89
90
91
92struct langwell_dqh {
93
94 u32 dqh_res0:15;
95 u32 dqh_ios:1;
96#define DQH_IOS BIT(15)
97 u32 dqh_mpl:11;
98#define DQH_MPL (0x7ff << 16)
99 u32 dqh_res1:2;
100 u32 dqh_zlt:1;
101#define DQH_ZLT BIT(29)
102 u32 dqh_mult:2;
103#define DQH_MULT (BIT(30) | BIT(31))
104
105
106 u32 dqh_current;
107#define DQH_C_DTD(e) \
108 (((e)>>5)&0x7ffffff)
109
110
111 u32 dtd_next;
112 u32 dtd_status:8;
113 u32 dtd_res0:2;
114 u32 dtd_multo:2;
115 u32 dtd_res1:3;
116 u32 dtd_ioc:1;
117 u32 dtd_total:15;
118 u32 dtd_res2:1;
119 u32 dtd_buf[5];
120
121 u32 dqh_res2;
122 struct usb_ctrlrequest dqh_setup;
123} __attribute__ ((aligned(64)));
124
125
126
127struct langwell_ep {
128 struct usb_ep ep;
129 dma_addr_t dma;
130 struct langwell_udc *dev;
131 unsigned long irqs;
132 struct list_head queue;
133 struct langwell_dqh *dqh;
134 const struct usb_endpoint_descriptor *desc;
135 char name[14];
136 unsigned stopped:1,
137 ep_type:2,
138 ep_num:8;
139};
140
141
142
143struct langwell_request {
144 struct usb_request req;
145 struct langwell_dtd *dtd, *head, *tail;
146 struct langwell_ep *ep;
147 dma_addr_t dtd_dma;
148 struct list_head queue;
149 unsigned dtd_count;
150 unsigned mapped:1;
151};
152
153
154
155enum ep0_state {
156 WAIT_FOR_SETUP,
157 DATA_STATE_XMIT,
158 DATA_STATE_NEED_ZLP,
159 WAIT_FOR_OUT_STATUS,
160 DATA_STATE_RECV,
161};
162
163
164
165enum lpm_state {
166 LPM_L0,
167 LPM_L1,
168 LPM_L2,
169 LPM_L3,
170};
171
172
173
174struct langwell_udc {
175
176 struct usb_gadget gadget;
177 spinlock_t lock;
178 struct langwell_ep *ep;
179 struct usb_gadget_driver *driver;
180 struct otg_transceiver *transceiver;
181 u8 dev_addr;
182 u32 usb_state;
183 u32 resume_state;
184 u32 bus_reset;
185 enum lpm_state lpm_state;
186 enum ep0_state ep0_state;
187 u32 ep0_dir;
188 u16 dciversion;
189 unsigned ep_max;
190 unsigned devcap:1,
191 enabled:1,
192 region:1,
193 got_irq:1,
194 powered:1,
195 remote_wakeup:1,
196 rate:1,
197 is_reset:1,
198 softconnected:1,
199 vbus_active:1,
200 suspended:1,
201 stopped:1,
202 lpm:1;
203
204
205 struct pci_dev *pdev;
206
207
208 struct langwell_otg *lotg;
209
210
211 struct langwell_cap_regs __iomem *cap_regs;
212 struct langwell_op_regs __iomem *op_regs;
213
214 struct usb_ctrlrequest local_setup_buff;
215 struct langwell_dqh *ep_dqh;
216 size_t ep_dqh_size;
217 dma_addr_t ep_dqh_dma;
218
219
220 struct langwell_request *status_req;
221
222
223 struct dma_pool *dtd_pool;
224
225
226 struct completion *done;
227};
228
229