1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#ifndef __MUSB_CORE_H__
36#define __MUSB_CORE_H__
37
38#include <linux/slab.h>
39#include <linux/list.h>
40#include <linux/interrupt.h>
41#include <linux/errno.h>
42#include <linux/timer.h>
43#include <linux/device.h>
44#include <linux/usb/ch9.h>
45#include <linux/usb/gadget.h>
46#include <linux/usb.h>
47#include <linux/usb/otg.h>
48#include <linux/usb/musb.h>
49#include <linux/phy/phy.h>
50#include <linux/workqueue.h>
51
52struct musb;
53struct musb_hw_ep;
54struct musb_ep;
55
56
57#define MUSB_HWVERS_MAJOR(x) ((x >> 10) & 0x1f)
58#define MUSB_HWVERS_MINOR(x) (x & 0x3ff)
59#define MUSB_HWVERS_RC 0x8000
60#define MUSB_HWVERS_1300 0x52C
61#define MUSB_HWVERS_1400 0x590
62#define MUSB_HWVERS_1800 0x720
63#define MUSB_HWVERS_1900 0x784
64#define MUSB_HWVERS_2000 0x800
65
66#include "musb_debug.h"
67#include "musb_dma.h"
68
69#include "musb_io.h"
70
71#include "musb_gadget.h"
72#include <linux/usb/hcd.h>
73#include "musb_host.h"
74
75
76
77
78#define is_peripheral_active(m) (!(m)->is_host)
79#define is_host_active(m) ((m)->is_host)
80
81enum {
82 MUSB_PORT_MODE_HOST = 1,
83 MUSB_PORT_MODE_GADGET,
84 MUSB_PORT_MODE_DUAL_ROLE,
85};
86
87
88
89#ifndef MUSB_C_NUM_EPS
90#define MUSB_C_NUM_EPS ((u8)16)
91#endif
92
93#ifndef MUSB_MAX_END0_PACKET
94#define MUSB_MAX_END0_PACKET ((u16)MUSB_EP0_FIFOSIZE)
95#endif
96
97
98enum musb_h_ep0_state {
99 MUSB_EP0_IDLE,
100 MUSB_EP0_START,
101 MUSB_EP0_IN,
102 MUSB_EP0_OUT,
103 MUSB_EP0_STATUS,
104} __attribute__ ((packed));
105
106
107enum musb_g_ep0_state {
108 MUSB_EP0_STAGE_IDLE,
109 MUSB_EP0_STAGE_SETUP,
110 MUSB_EP0_STAGE_TX,
111 MUSB_EP0_STAGE_RX,
112 MUSB_EP0_STAGE_STATUSIN,
113 MUSB_EP0_STAGE_STATUSOUT,
114 MUSB_EP0_STAGE_ACKWAIT,
115} __attribute__ ((packed));
116
117
118
119
120
121#define OTG_TIME_A_WAIT_VRISE 100
122#define OTG_TIME_A_WAIT_BCON 1100
123#define OTG_TIME_A_AIDL_BDIS 200
124#define OTG_TIME_B_ASE0_BRST 100
125
126
127
128#define MUSB_HST_MODE(_musb)\
129 { (_musb)->is_host = true; }
130#define MUSB_DEV_MODE(_musb) \
131 { (_musb)->is_host = false; }
132
133#define test_devctl_hst_mode(_x) \
134 (musb_readb((_x)->mregs, MUSB_DEVCTL)&MUSB_DEVCTL_HM)
135
136#define MUSB_MODE(musb) ((musb)->is_host ? "Host" : "Peripheral")
137
138
139
140struct musb_io;
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173struct musb_platform_ops {
174
175#define MUSB_DMA_UX500 BIT(6)
176#define MUSB_DMA_CPPI41 BIT(5)
177#define MUSB_DMA_CPPI BIT(4)
178#define MUSB_DMA_TUSB_OMAP BIT(3)
179#define MUSB_DMA_INVENTRA BIT(2)
180#define MUSB_IN_TUSB BIT(1)
181#define MUSB_INDEXED_EP BIT(0)
182 u32 quirks;
183
184 int (*init)(struct musb *musb);
185 int (*exit)(struct musb *musb);
186
187 void (*enable)(struct musb *musb);
188 void (*disable)(struct musb *musb);
189
190 u32 (*ep_offset)(u8 epnum, u16 offset);
191 void (*ep_select)(void __iomem *mbase, u8 epnum);
192 u16 fifo_mode;
193 u32 (*fifo_offset)(u8 epnum);
194 u32 (*busctl_offset)(u8 epnum, u16 offset);
195 u8 (*readb)(const void __iomem *addr, unsigned offset);
196 void (*writeb)(void __iomem *addr, unsigned offset, u8 data);
197 u16 (*readw)(const void __iomem *addr, unsigned offset);
198 void (*writew)(void __iomem *addr, unsigned offset, u16 data);
199 u32 (*readl)(const void __iomem *addr, unsigned offset);
200 void (*writel)(void __iomem *addr, unsigned offset, u32 data);
201 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf);
202 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
203 struct dma_controller *
204 (*dma_init) (struct musb *musb, void __iomem *base);
205 void (*dma_exit)(struct dma_controller *c);
206 int (*set_mode)(struct musb *musb, u8 mode);
207 void (*try_idle)(struct musb *musb, unsigned long timeout);
208 int (*recover)(struct musb *musb);
209
210 int (*vbus_status)(struct musb *musb);
211 void (*set_vbus)(struct musb *musb, int on);
212
213 int (*adjust_channel_params)(struct dma_channel *channel,
214 u16 packet_sz, u8 *mode,
215 dma_addr_t *dma_addr, u32 *len);
216 void (*pre_root_reset_end)(struct musb *musb);
217 void (*post_root_reset_end)(struct musb *musb);
218 int (*phy_callback)(enum musb_vbus_id_status status);
219};
220
221
222
223
224
225
226struct musb_hw_ep {
227 struct musb *musb;
228 void __iomem *fifo;
229 void __iomem *regs;
230
231#if IS_ENABLED(CONFIG_USB_MUSB_TUSB6010)
232 void __iomem *conf;
233#endif
234
235
236 u8 epnum;
237
238
239 bool is_shared_fifo;
240 bool tx_double_buffered;
241 bool rx_double_buffered;
242 u16 max_packet_sz_tx;
243 u16 max_packet_sz_rx;
244
245 struct dma_channel *tx_channel;
246 struct dma_channel *rx_channel;
247
248#if IS_ENABLED(CONFIG_USB_MUSB_TUSB6010)
249
250 dma_addr_t fifo_async;
251 dma_addr_t fifo_sync;
252 void __iomem *fifo_sync_va;
253#endif
254
255
256 struct musb_qh *in_qh;
257 struct musb_qh *out_qh;
258
259 u8 rx_reinit;
260 u8 tx_reinit;
261
262
263 struct musb_ep ep_in;
264 struct musb_ep ep_out;
265};
266
267static inline struct musb_request *next_in_request(struct musb_hw_ep *hw_ep)
268{
269 return next_request(&hw_ep->ep_in);
270}
271
272static inline struct musb_request *next_out_request(struct musb_hw_ep *hw_ep)
273{
274 return next_request(&hw_ep->ep_out);
275}
276
277struct musb_csr_regs {
278
279 u16 txmaxp, txcsr, rxmaxp, rxcsr;
280 u16 rxfifoadd, txfifoadd;
281 u8 txtype, txinterval, rxtype, rxinterval;
282 u8 rxfifosz, txfifosz;
283 u8 txfunaddr, txhubaddr, txhubport;
284 u8 rxfunaddr, rxhubaddr, rxhubport;
285};
286
287struct musb_context_registers {
288
289 u8 power;
290 u8 intrusbe;
291 u16 frame;
292 u8 index, testmode;
293
294 u8 devctl, busctl, misc;
295 u32 otg_interfsel;
296
297 struct musb_csr_regs index_regs[MUSB_C_NUM_EPS];
298};
299
300
301
302
303struct musb {
304
305 spinlock_t lock;
306 spinlock_t list_lock;
307
308 struct musb_io io;
309 const struct musb_platform_ops *ops;
310 struct musb_context_registers context;
311
312 irqreturn_t (*isr)(int, void *);
313 struct delayed_work irq_work;
314 struct delayed_work deassert_reset_work;
315 struct delayed_work finish_resume_work;
316 struct delayed_work gadget_work;
317 u16 hwvers;
318
319 u16 intrrxe;
320 u16 intrtxe;
321
322#define MUSB_PORT_STAT_RESUME (1 << 31)
323
324 u32 port1_status;
325
326 unsigned long rh_timer;
327
328 enum musb_h_ep0_state ep0_stage;
329
330
331
332
333
334
335
336 struct musb_hw_ep *bulk_ep;
337
338 struct list_head control;
339 struct list_head in_bulk;
340 struct list_head out_bulk;
341 struct list_head pending_list;
342
343 struct timer_list otg_timer;
344 struct notifier_block nb;
345
346 struct dma_controller *dma_controller;
347
348 struct device *controller;
349 void __iomem *ctrl_base;
350 void __iomem *mregs;
351
352#if IS_ENABLED(CONFIG_USB_MUSB_TUSB6010)
353 dma_addr_t async;
354 dma_addr_t sync;
355 void __iomem *sync_va;
356 u8 tusb_revision;
357#endif
358
359
360 u8 int_usb;
361 u16 int_rx;
362 u16 int_tx;
363
364 struct usb_phy *xceiv;
365 struct phy *phy;
366
367 int nIrq;
368 unsigned irq_wake:1;
369
370 struct musb_hw_ep endpoints[MUSB_C_NUM_EPS];
371#define control_ep endpoints
372
373#define VBUSERR_RETRY_COUNT 3
374 u16 vbuserr_retry;
375 u16 epmask;
376 u8 nr_endpoints;
377
378 int (*board_set_power)(int state);
379
380 u8 min_power;
381
382 int port_mode;
383 bool session;
384 unsigned long quirk_retries;
385 bool is_host;
386
387 int a_wait_bcon;
388 unsigned long idle_timeout;
389
390 unsigned is_initialized:1;
391 unsigned is_runtime_suspended:1;
392
393
394 unsigned is_active:1;
395
396 unsigned is_multipoint:1;
397
398 unsigned hb_iso_rx:1;
399 unsigned hb_iso_tx:1;
400 unsigned dyn_fifo:1;
401
402 unsigned bulk_split:1;
403#define can_bulk_split(musb,type) \
404 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bulk_split)
405
406 unsigned bulk_combine:1;
407#define can_bulk_combine(musb,type) \
408 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bulk_combine)
409
410
411 unsigned is_suspended:1;
412 unsigned need_finish_resume :1;
413
414
415 unsigned may_wakeup:1;
416
417
418
419
420
421 unsigned is_self_powered:1;
422 unsigned is_bus_powered:1;
423
424 unsigned set_address:1;
425 unsigned test_mode:1;
426 unsigned softconnect:1;
427
428 u8 address;
429 u8 test_mode_nr;
430 u16 ackpend;
431 enum musb_g_ep0_state ep0_state;
432 struct usb_gadget g;
433 struct usb_gadget_driver *gadget_driver;
434 struct usb_hcd *hcd;
435
436
437
438
439
440
441
442
443
444
445
446
447 unsigned double_buffer_not_ok:1;
448
449 const struct musb_hdrc_config *config;
450
451 int xceiv_old_state;
452#ifdef CONFIG_DEBUG_FS
453 struct dentry *debugfs_root;
454#endif
455};
456
457
458#include "musb_regs.h"
459
460static inline struct musb *gadget_to_musb(struct usb_gadget *g)
461{
462 return container_of(g, struct musb, g);
463}
464
465#ifdef CONFIG_BLACKFIN
466static inline int musb_read_fifosize(struct musb *musb,
467 struct musb_hw_ep *hw_ep, u8 epnum)
468{
469 musb->nr_endpoints++;
470 musb->epmask |= (1 << epnum);
471
472 if (epnum < 5) {
473 hw_ep->max_packet_sz_tx = 128;
474 hw_ep->max_packet_sz_rx = 128;
475 } else {
476 hw_ep->max_packet_sz_tx = 1024;
477 hw_ep->max_packet_sz_rx = 1024;
478 }
479 hw_ep->is_shared_fifo = false;
480
481 return 0;
482}
483
484static inline void musb_configure_ep0(struct musb *musb)
485{
486 musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE;
487 musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE;
488 musb->endpoints[0].is_shared_fifo = true;
489}
490
491#else
492
493static inline int musb_read_fifosize(struct musb *musb,
494 struct musb_hw_ep *hw_ep, u8 epnum)
495{
496 void __iomem *mbase = musb->mregs;
497 u8 reg = 0;
498
499
500 reg = musb_readb(mbase, musb->io.ep_offset(epnum, MUSB_FIFOSIZE));
501
502 if (!reg)
503 return -ENODEV;
504
505 musb->nr_endpoints++;
506 musb->epmask |= (1 << epnum);
507
508 hw_ep->max_packet_sz_tx = 1 << (reg & 0x0f);
509
510
511 if ((reg & 0xf0) == 0xf0) {
512 hw_ep->max_packet_sz_rx = hw_ep->max_packet_sz_tx;
513 hw_ep->is_shared_fifo = true;
514 return 0;
515 } else {
516 hw_ep->max_packet_sz_rx = 1 << ((reg & 0xf0) >> 4);
517 hw_ep->is_shared_fifo = false;
518 }
519
520 return 0;
521}
522
523static inline void musb_configure_ep0(struct musb *musb)
524{
525 musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE;
526 musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE;
527 musb->endpoints[0].is_shared_fifo = true;
528}
529#endif
530
531
532
533
534extern const char musb_driver_name[];
535
536extern void musb_stop(struct musb *musb);
537extern void musb_start(struct musb *musb);
538
539extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src);
540extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst);
541
542extern void musb_load_testpacket(struct musb *);
543
544extern irqreturn_t musb_interrupt(struct musb *);
545
546extern void musb_hnp_stop(struct musb *musb);
547
548int musb_queue_resume_work(struct musb *musb,
549 int (*callback)(struct musb *musb, void *data),
550 void *data);
551
552static inline void musb_platform_set_vbus(struct musb *musb, int is_on)
553{
554 if (musb->ops->set_vbus)
555 musb->ops->set_vbus(musb, is_on);
556}
557
558static inline void musb_platform_enable(struct musb *musb)
559{
560 if (musb->ops->enable)
561 musb->ops->enable(musb);
562}
563
564static inline void musb_platform_disable(struct musb *musb)
565{
566 if (musb->ops->disable)
567 musb->ops->disable(musb);
568}
569
570static inline int musb_platform_set_mode(struct musb *musb, u8 mode)
571{
572 if (!musb->ops->set_mode)
573 return 0;
574
575 return musb->ops->set_mode(musb, mode);
576}
577
578static inline void musb_platform_try_idle(struct musb *musb,
579 unsigned long timeout)
580{
581 if (musb->ops->try_idle)
582 musb->ops->try_idle(musb, timeout);
583}
584
585static inline int musb_platform_recover(struct musb *musb)
586{
587 if (!musb->ops->recover)
588 return 0;
589
590 return musb->ops->recover(musb);
591}
592
593static inline int musb_platform_get_vbus_status(struct musb *musb)
594{
595 if (!musb->ops->vbus_status)
596 return -EINVAL;
597
598 return musb->ops->vbus_status(musb);
599}
600
601static inline int musb_platform_init(struct musb *musb)
602{
603 if (!musb->ops->init)
604 return -EINVAL;
605
606 return musb->ops->init(musb);
607}
608
609static inline int musb_platform_exit(struct musb *musb)
610{
611 if (!musb->ops->exit)
612 return -EINVAL;
613
614 return musb->ops->exit(musb);
615}
616
617static inline void musb_platform_pre_root_reset_end(struct musb *musb)
618{
619 if (musb->ops->pre_root_reset_end)
620 musb->ops->pre_root_reset_end(musb);
621}
622
623static inline void musb_platform_post_root_reset_end(struct musb *musb)
624{
625 if (musb->ops->post_root_reset_end)
626 musb->ops->post_root_reset_end(musb);
627}
628
629#endif
630