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