This source file includes following definitions.
- ci_role_start
- ci_role_stop
- ci_role_to_usb_role
- hw_read_id_reg
- hw_write_id_reg
- hw_read
- imx28_ci_writel
- imx28_ci_writel
- __hw_write
- hw_write
- hw_test_and_clear
- hw_test_and_write
- ci_otg_is_fsm_mode
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
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
42 enum 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_ULPI_VIEWPORT,
56 OP_PORTSC,
57 OP_DEVLC,
58 OP_OTGSC,
59 OP_USBMODE,
60 OP_ENDPTSETUPSTAT,
61 OP_ENDPTPRIME,
62 OP_ENDPTFLUSH,
63 OP_ENDPTSTAT,
64 OP_ENDPTCOMPLETE,
65 OP_ENDPTCTRL,
66
67 OP_LAST = OP_ENDPTCTRL + ENDPT_MAX / 2,
68 };
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 struct ci_hw_ep {
87 struct usb_ep ep;
88 u8 dir;
89 u8 num;
90 u8 type;
91 char name[16];
92 struct {
93 struct list_head queue;
94 struct ci_hw_qh *ptr;
95 dma_addr_t dma;
96 } qh;
97 int wedge;
98
99
100 struct ci_hdrc *ci;
101 spinlock_t *lock;
102 struct dma_pool *td_pool;
103 struct td_node *pending_td;
104 };
105
106 enum ci_role {
107 CI_ROLE_HOST = 0,
108 CI_ROLE_GADGET,
109 CI_ROLE_END,
110 };
111
112 enum ci_revision {
113 CI_REVISION_1X = 10,
114 CI_REVISION_20 = 20,
115 CI_REVISION_21,
116 CI_REVISION_22,
117 CI_REVISION_23,
118 CI_REVISION_24,
119 CI_REVISION_25,
120 CI_REVISION_25_PLUS,
121 CI_REVISION_UNKNOWN = 99,
122 };
123
124
125
126
127
128
129
130
131 struct ci_role_driver {
132 int (*start)(struct ci_hdrc *);
133 void (*stop)(struct ci_hdrc *);
134 irqreturn_t (*irq)(struct ci_hdrc *);
135 const char *name;
136 };
137
138
139
140
141
142
143
144
145
146
147
148 struct hw_bank {
149 unsigned lpm;
150 resource_size_t phys;
151 void __iomem *abs;
152 void __iomem *cap;
153 void __iomem *op;
154 size_t size;
155 void __iomem *regmap[OP_LAST + 1];
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
206
207 struct ci_hdrc {
208 struct device *dev;
209 spinlock_t lock;
210 struct hw_bank hw_bank;
211 int irq;
212 struct ci_role_driver *roles[CI_ROLE_END];
213 enum ci_role role;
214 bool is_otg;
215 struct usb_otg otg;
216 struct otg_fsm fsm;
217 struct hrtimer otg_fsm_hrtimer;
218 ktime_t hr_timeouts[NUM_OTG_FSM_TIMERS];
219 unsigned enabled_otg_timer_bits;
220 enum otg_fsm_timer next_otg_timer;
221 struct usb_role_switch *role_switch;
222 struct work_struct work;
223 struct workqueue_struct *wq;
224
225 struct dma_pool *qh_pool;
226 struct dma_pool *td_pool;
227
228 struct usb_gadget gadget;
229 struct usb_gadget_driver *driver;
230 enum usb_device_state resume_state;
231 unsigned hw_ep_max;
232 struct ci_hw_ep ci_hw_ep[ENDPT_MAX];
233 u32 ep0_dir;
234 struct ci_hw_ep *ep0out, *ep0in;
235
236 struct usb_request *status;
237 bool setaddr;
238 u8 address;
239 u8 remote_wakeup;
240 u8 suspended;
241 u8 test_mode;
242
243 struct ci_hdrc_platform_data *platdata;
244 int vbus_active;
245 struct ulpi *ulpi;
246 struct ulpi_ops ulpi_ops;
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
261 static 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
267 static 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
283 static 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 static inline enum usb_role ci_role_to_usb_role(struct ci_hdrc *ci)
296 {
297 if (ci->role == CI_ROLE_HOST)
298 return USB_ROLE_HOST;
299 else if (ci->role == CI_ROLE_GADGET && ci->vbus_active)
300 return USB_ROLE_DEVICE;
301 else
302 return USB_ROLE_NONE;
303 }
304
305
306
307
308
309
310
311
312
313 static inline u32 hw_read_id_reg(struct ci_hdrc *ci, u32 offset, u32 mask)
314 {
315 return ioread32(ci->hw_bank.abs + offset) & mask;
316 }
317
318
319
320
321
322
323
324
325 static inline void hw_write_id_reg(struct ci_hdrc *ci, u32 offset,
326 u32 mask, u32 data)
327 {
328 if (~mask)
329 data = (ioread32(ci->hw_bank.abs + offset) & ~mask)
330 | (data & mask);
331
332 iowrite32(data, ci->hw_bank.abs + offset);
333 }
334
335
336
337
338
339
340
341
342
343 static inline u32 hw_read(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask)
344 {
345 return ioread32(ci->hw_bank.regmap[reg]) & mask;
346 }
347
348 #ifdef CONFIG_SOC_IMX28
349 static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
350 {
351 __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr));
352 }
353 #else
354 static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr)
355 {
356 }
357 #endif
358
359 static inline void __hw_write(struct ci_hdrc *ci, u32 val,
360 void __iomem *addr)
361 {
362 if (ci->imx28_write_fix)
363 imx28_ci_writel(val, addr);
364 else
365 iowrite32(val, addr);
366 }
367
368
369
370
371
372
373
374
375 static inline void hw_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
376 u32 mask, u32 data)
377 {
378 if (~mask)
379 data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
380 | (data & mask);
381
382 __hw_write(ci, data, ci->hw_bank.regmap[reg]);
383 }
384
385
386
387
388
389
390
391
392
393 static inline u32 hw_test_and_clear(struct ci_hdrc *ci, enum ci_hw_regs reg,
394 u32 mask)
395 {
396 u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
397
398 __hw_write(ci, val, ci->hw_bank.regmap[reg]);
399 return val;
400 }
401
402
403
404
405
406
407
408
409
410
411 static inline u32 hw_test_and_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
412 u32 mask, u32 data)
413 {
414 u32 val = hw_read(ci, reg, ~0);
415
416 hw_write(ci, reg, mask, data);
417 return (val & mask) >> __ffs(mask);
418 }
419
420
421
422
423
424
425
426 static inline bool ci_otg_is_fsm_mode(struct ci_hdrc *ci)
427 {
428 #ifdef CONFIG_USB_OTG_FSM
429 struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps;
430
431 return ci->is_otg && ci->roles[CI_ROLE_HOST] &&
432 ci->roles[CI_ROLE_GADGET] && (otg_caps->srp_support ||
433 otg_caps->hnp_support || otg_caps->adp_support);
434 #else
435 return false;
436 #endif
437 }
438
439 int ci_ulpi_init(struct ci_hdrc *ci);
440 void ci_ulpi_exit(struct ci_hdrc *ci);
441 int ci_ulpi_resume(struct ci_hdrc *ci);
442
443 u32 hw_read_intr_enable(struct ci_hdrc *ci);
444
445 u32 hw_read_intr_status(struct ci_hdrc *ci);
446
447 int hw_device_reset(struct ci_hdrc *ci);
448
449 int hw_port_test_set(struct ci_hdrc *ci, u8 mode);
450
451 u8 hw_port_test_get(struct ci_hdrc *ci);
452
453 void hw_phymode_configure(struct ci_hdrc *ci);
454
455 void ci_platform_configure(struct ci_hdrc *ci);
456
457 void dbg_create_files(struct ci_hdrc *ci);
458
459 void dbg_remove_files(struct ci_hdrc *ci);
460 #endif