1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef __DRIVERS_USB_CHIPIDEA_CI_H
14#define __DRIVERS_USB_CHIPIDEA_CI_H
15
16#include <linux/list.h>
17#include <linux/irqreturn.h>
18#include <linux/usb.h>
19#include <linux/usb/gadget.h>
20#include <linux/usb/otg-fsm.h>
21
22
23
24
25#define TD_PAGE_COUNT 5
26#define CI_HDRC_PAGE_SIZE 4096ul
27#define ENDPT_MAX 32
28
29
30
31
32
33#define ID_ID 0x0
34#define ID_HWGENERAL 0x4
35#define ID_HWHOST 0x8
36#define ID_HWDEVICE 0xc
37#define ID_HWTXBUF 0x10
38#define ID_HWRXBUF 0x14
39#define ID_SBUSCFG 0x90
40
41
42enum ci_hw_regs {
43 CAP_CAPLENGTH,
44 CAP_HCCPARAMS,
45 CAP_DCCPARAMS,
46 CAP_TESTMODE,
47 CAP_LAST = CAP_TESTMODE,
48 OP_USBCMD,
49 OP_USBSTS,
50 OP_USBINTR,
51 OP_DEVICEADDR,
52 OP_ENDPTLISTADDR,
53 OP_TTCTRL,
54 OP_BURSTSIZE,
55 OP_PORTSC,
56 OP_DEVLC,
57 OP_OTGSC,
58 OP_USBMODE,
59 OP_ENDPTSETUPSTAT,
60 OP_ENDPTPRIME,
61 OP_ENDPTFLUSH,
62 OP_ENDPTSTAT,
63 OP_ENDPTCOMPLETE,
64 OP_ENDPTCTRL,
65
66 OP_LAST = OP_ENDPTCTRL + ENDPT_MAX / 2,
67};
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85struct ci_hw_ep {
86 struct usb_ep ep;
87 u8 dir;
88 u8 num;
89 u8 type;
90 char name[16];
91 struct {
92 struct list_head queue;
93 struct ci_hw_qh *ptr;
94 dma_addr_t dma;
95 } qh;
96 int wedge;
97
98
99 struct ci_hdrc *ci;
100 spinlock_t *lock;
101 struct dma_pool *td_pool;
102 struct td_node *pending_td;
103};
104
105enum ci_role {
106 CI_ROLE_HOST = 0,
107 CI_ROLE_GADGET,
108 CI_ROLE_END,
109};
110
111enum ci_revision {
112 CI_REVISION_1X = 10,
113 CI_REVISION_20 = 20,
114 CI_REVISION_21,
115 CI_REVISION_22,
116 CI_REVISION_23,
117 CI_REVISION_24,
118 CI_REVISION_25,
119 CI_REVISION_25_PLUS,
120 CI_REVISION_UNKNOWN = 99,
121};
122
123
124
125
126
127
128
129
130struct ci_role_driver {
131 int (*start)(struct ci_hdrc *);
132 void (*stop)(struct ci_hdrc *);
133 irqreturn_t (*irq)(struct ci_hdrc *);
134 const char *name;
135};
136
137
138
139
140
141
142
143
144
145
146
147struct hw_bank {
148 unsigned lpm;
149 resource_size_t phys;
150 void __iomem *abs;
151 void __iomem *cap;
152 void __iomem *op;
153 size_t size;
154 void __iomem *regmap[OP_LAST + 1];
155};
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203struct ci_hdrc {
204 struct device *dev;
205 spinlock_t lock;
206 struct hw_bank hw_bank;
207 int irq;
208 struct ci_role_driver *roles[CI_ROLE_END];
209 enum ci_role role;
210 bool is_otg;
211 struct usb_otg otg;
212 struct otg_fsm fsm;
213 struct hrtimer otg_fsm_hrtimer;
214 ktime_t hr_timeouts[NUM_OTG_FSM_TIMERS];
215 unsigned enabled_otg_timer_bits;
216 enum otg_fsm_timer next_otg_timer;
217 struct work_struct work;
218 struct workqueue_struct *wq;
219
220 struct dma_pool *qh_pool;
221 struct dma_pool *td_pool;
222
223 struct usb_gadget gadget;
224 struct usb_gadget_driver *driver;
225 unsigned hw_ep_max;
226 struct ci_hw_ep ci_hw_ep[ENDPT_MAX];
227 u32 ep0_dir;
228 struct ci_hw_ep *ep0out, *ep0in;
229
230 struct usb_request *status;
231 bool setaddr;
232 u8 address;
233 u8 remote_wakeup;
234 u8 suspended;
235 u8 test_mode;
236
237 struct ci_hdrc_platform_data *platdata;
238 int vbus_active;
239 struct phy *phy;
240
241 struct usb_phy *usb_phy;
242 struct usb_hcd *hcd;
243 struct dentry *debugfs;
244 bool id_event;
245 bool b_sess_valid_event;
246 bool imx28_write_fix;
247 bool supports_runtime_pm;
248 bool in_lpm;
249 bool wakeup_int;
250 enum ci_revision rev;
251};
252
253static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci)
254{
255 BUG_ON(ci->role >= CI_ROLE_END || !ci->roles[ci->role]);
256 return ci->roles[ci->role];
257}
258
259static inline int ci_role_start(struct ci_hdrc *ci, enum ci_role role)
260{
261 int ret;
262
263 if (role >= CI_ROLE_END)
264 return -EINVAL;
265
266 if (!ci->roles[role])
267 return -ENXIO;
268
269 ret = ci->roles[role]->start(ci);
270 if (!ret)
271 ci->role = role;
272 return ret;
273}
274
275static inline void ci_role_stop(struct ci_hdrc *ci)
276{
277 enum ci_role role = ci->role;
278
279 if (role == CI_ROLE_END)
280 return;
281
282 ci->role = CI_ROLE_END;
283
284 ci->roles[role]->stop(ci);
285}
286
287
288
289
290
291
292
293
294
295static inline u32 hw_read_id_reg(struct ci_hdrc *ci, u32 offset, u32 mask)
296{
297 return ioread32(ci->hw_bank.abs + offset) & mask;
298}
299
300
301
302
303
304
305
306
307static inline void hw_write_id_reg(struct ci_hdrc *ci, u32 offset,
308 u32 mask, u32 data)
309{
310 if (~mask)
311 data = (ioread32(ci->hw_bank.abs + offset) & ~mask)
312 | (data & mask);
313
314 iowrite32(data, ci->hw_bank.abs + offset);
315}
316
317
318
319
320
321
322
323
324
325static inline u32 hw_read(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask)
326{
327 return ioread32(ci->hw_bank.regmap[reg]) & mask;
328}
329
330#ifdef CONFIG_SOC_IMX28
331static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
332{
333 __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr));
334}
335#else
336static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
337{
338}
339#endif
340
341static inline void __hw_write(struct ci_hdrc *ci, u32 val,
342 void __iomem *addr)
343{
344 if (ci->imx28_write_fix)
345 imx28_ci_writel(val, addr);
346 else
347 iowrite32(val, addr);
348}
349
350
351
352
353
354
355
356
357static inline void hw_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
358 u32 mask, u32 data)
359{
360 if (~mask)
361 data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
362 | (data & mask);
363
364 __hw_write(ci, data, ci->hw_bank.regmap[reg]);
365}
366
367
368
369
370
371
372
373
374
375static inline u32 hw_test_and_clear(struct ci_hdrc *ci, enum ci_hw_regs reg,
376 u32 mask)
377{
378 u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
379
380 __hw_write(ci, val, ci->hw_bank.regmap[reg]);
381 return val;
382}
383
384
385
386
387
388
389
390
391
392
393static inline u32 hw_test_and_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
394 u32 mask, u32 data)
395{
396 u32 val = hw_read(ci, reg, ~0);
397
398 hw_write(ci, reg, mask, data);
399 return (val & mask) >> __ffs(mask);
400}
401
402
403
404
405
406
407
408static inline bool ci_otg_is_fsm_mode(struct ci_hdrc *ci)
409{
410#ifdef CONFIG_USB_OTG_FSM
411 struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps;
412
413 return ci->is_otg && ci->roles[CI_ROLE_HOST] &&
414 ci->roles[CI_ROLE_GADGET] && (otg_caps->srp_support ||
415 otg_caps->hnp_support || otg_caps->adp_support);
416#else
417 return false;
418#endif
419}
420
421u32 hw_read_intr_enable(struct ci_hdrc *ci);
422
423u32 hw_read_intr_status(struct ci_hdrc *ci);
424
425int hw_device_reset(struct ci_hdrc *ci);
426
427int hw_port_test_set(struct ci_hdrc *ci, u8 mode);
428
429u8 hw_port_test_get(struct ci_hdrc *ci);
430
431int hw_wait_reg(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask,
432 u32 value, unsigned int timeout_ms);
433
434void ci_platform_configure(struct ci_hdrc *ci);
435
436int dbg_create_files(struct ci_hdrc *ci);
437
438void dbg_remove_files(struct ci_hdrc *ci);
439#endif
440