1
2
3
4
5
6
7
8
9
10#ifndef __DRIVERS_USB_CHIPIDEA_CI_H
11#define __DRIVERS_USB_CHIPIDEA_CI_H
12
13#include <linux/list.h>
14#include <linux/irqreturn.h>
15#include <linux/usb.h>
16#include <linux/usb/gadget.h>
17#include <linux/usb/otg-fsm.h>
18#include <linux/usb/otg.h>
19#include <linux/ulpi/interface.h>
20
21
22
23
24#define TD_PAGE_COUNT 5
25#define CI_HDRC_PAGE_SIZE 4096ul
26#define ENDPT_MAX 32
27
28
29
30
31
32#define ID_ID 0x0
33#define ID_HWGENERAL 0x4
34#define ID_HWHOST 0x8
35#define ID_HWDEVICE 0xc
36#define ID_HWTXBUF 0x10
37#define ID_HWRXBUF 0x14
38#define ID_SBUSCFG 0x90
39
40
41enum ci_hw_regs {
42 CAP_CAPLENGTH,
43 CAP_HCCPARAMS,
44 CAP_DCCPARAMS,
45 CAP_TESTMODE,
46 CAP_LAST = CAP_TESTMODE,
47 OP_USBCMD,
48 OP_USBSTS,
49 OP_USBINTR,
50 OP_DEVICEADDR,
51 OP_ENDPTLISTADDR,
52 OP_TTCTRL,
53 OP_BURSTSIZE,
54 OP_ULPI_VIEWPORT,
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
203
204
205
206struct ci_hdrc {
207 struct device *dev;
208 spinlock_t lock;
209 struct hw_bank hw_bank;
210 int irq;
211 struct ci_role_driver *roles[CI_ROLE_END];
212 enum ci_role role;
213 bool is_otg;
214 struct usb_otg otg;
215 struct otg_fsm fsm;
216 struct hrtimer otg_fsm_hrtimer;
217 ktime_t hr_timeouts[NUM_OTG_FSM_TIMERS];
218 unsigned enabled_otg_timer_bits;
219 enum otg_fsm_timer next_otg_timer;
220 struct work_struct work;
221 struct workqueue_struct *wq;
222
223 struct dma_pool *qh_pool;
224 struct dma_pool *td_pool;
225
226 struct usb_gadget gadget;
227 struct usb_gadget_driver *driver;
228 enum usb_device_state resume_state;
229 unsigned hw_ep_max;
230 struct ci_hw_ep ci_hw_ep[ENDPT_MAX];
231 u32 ep0_dir;
232 struct ci_hw_ep *ep0out, *ep0in;
233
234 struct usb_request *status;
235 bool setaddr;
236 u8 address;
237 u8 remote_wakeup;
238 u8 suspended;
239 u8 test_mode;
240
241 struct ci_hdrc_platform_data *platdata;
242 int vbus_active;
243#ifdef CONFIG_USB_CHIPIDEA_ULPI
244 struct ulpi *ulpi;
245 struct ulpi_ops ulpi_ops;
246#endif
247 struct phy *phy;
248
249 struct usb_phy *usb_phy;
250 struct usb_hcd *hcd;
251 struct dentry *debugfs;
252 bool id_event;
253 bool b_sess_valid_event;
254 bool imx28_write_fix;
255 bool supports_runtime_pm;
256 bool in_lpm;
257 bool wakeup_int;
258 enum ci_revision rev;
259};
260
261static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci)
262{
263 BUG_ON(ci->role >= CI_ROLE_END || !ci->roles[ci->role]);
264 return ci->roles[ci->role];
265}
266
267static inline int ci_role_start(struct ci_hdrc *ci, enum ci_role role)
268{
269 int ret;
270
271 if (role >= CI_ROLE_END)
272 return -EINVAL;
273
274 if (!ci->roles[role])
275 return -ENXIO;
276
277 ret = ci->roles[role]->start(ci);
278 if (!ret)
279 ci->role = role;
280 return ret;
281}
282
283static inline void ci_role_stop(struct ci_hdrc *ci)
284{
285 enum ci_role role = ci->role;
286
287 if (role == CI_ROLE_END)
288 return;
289
290 ci->role = CI_ROLE_END;
291
292 ci->roles[role]->stop(ci);
293}
294
295
296
297
298
299
300
301
302
303static inline u32 hw_read_id_reg(struct ci_hdrc *ci, u32 offset, u32 mask)
304{
305 return ioread32(ci->hw_bank.abs + offset) & mask;
306}
307
308
309
310
311
312
313
314
315static inline void hw_write_id_reg(struct ci_hdrc *ci, u32 offset,
316 u32 mask, u32 data)
317{
318 if (~mask)
319 data = (ioread32(ci->hw_bank.abs + offset) & ~mask)
320 | (data & mask);
321
322 iowrite32(data, ci->hw_bank.abs + offset);
323}
324
325
326
327
328
329
330
331
332
333static inline u32 hw_read(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask)
334{
335 return ioread32(ci->hw_bank.regmap[reg]) & mask;
336}
337
338#ifdef CONFIG_SOC_IMX28
339static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
340{
341 __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr));
342}
343#else
344static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
345{
346}
347#endif
348
349static inline void __hw_write(struct ci_hdrc *ci, u32 val,
350 void __iomem *addr)
351{
352 if (ci->imx28_write_fix)
353 imx28_ci_writel(val, addr);
354 else
355 iowrite32(val, addr);
356}
357
358
359
360
361
362
363
364
365static inline void hw_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
366 u32 mask, u32 data)
367{
368 if (~mask)
369 data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
370 | (data & mask);
371
372 __hw_write(ci, data, ci->hw_bank.regmap[reg]);
373}
374
375
376
377
378
379
380
381
382
383static inline u32 hw_test_and_clear(struct ci_hdrc *ci, enum ci_hw_regs reg,
384 u32 mask)
385{
386 u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
387
388 __hw_write(ci, val, ci->hw_bank.regmap[reg]);
389 return val;
390}
391
392
393
394
395
396
397
398
399
400
401static inline u32 hw_test_and_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
402 u32 mask, u32 data)
403{
404 u32 val = hw_read(ci, reg, ~0);
405
406 hw_write(ci, reg, mask, data);
407 return (val & mask) >> __ffs(mask);
408}
409
410
411
412
413
414
415
416static inline bool ci_otg_is_fsm_mode(struct ci_hdrc *ci)
417{
418#ifdef CONFIG_USB_OTG_FSM
419 struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps;
420
421 return ci->is_otg && ci->roles[CI_ROLE_HOST] &&
422 ci->roles[CI_ROLE_GADGET] && (otg_caps->srp_support ||
423 otg_caps->hnp_support || otg_caps->adp_support);
424#else
425 return false;
426#endif
427}
428
429#if IS_ENABLED(CONFIG_USB_CHIPIDEA_ULPI)
430int ci_ulpi_init(struct ci_hdrc *ci);
431void ci_ulpi_exit(struct ci_hdrc *ci);
432int ci_ulpi_resume(struct ci_hdrc *ci);
433#else
434static inline int ci_ulpi_init(struct ci_hdrc *ci) { return 0; }
435static inline void ci_ulpi_exit(struct ci_hdrc *ci) { }
436static inline int ci_ulpi_resume(struct ci_hdrc *ci) { return 0; }
437#endif
438
439u32 hw_read_intr_enable(struct ci_hdrc *ci);
440
441u32 hw_read_intr_status(struct ci_hdrc *ci);
442
443int hw_device_reset(struct ci_hdrc *ci);
444
445int hw_port_test_set(struct ci_hdrc *ci, u8 mode);
446
447u8 hw_port_test_get(struct ci_hdrc *ci);
448
449void hw_phymode_configure(struct ci_hdrc *ci);
450
451void ci_platform_configure(struct ci_hdrc *ci);
452
453int dbg_create_files(struct ci_hdrc *ci);
454
455void dbg_remove_files(struct ci_hdrc *ci);
456#endif
457