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