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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67#include <linux/module.h>
68#include <linux/kernel.h>
69#include <linux/sched.h>
70#include <linux/slab.h>
71#include <linux/list.h>
72#include <linux/kobject.h>
73#include <linux/prefetch.h>
74#include <linux/platform_device.h>
75#include <linux/io.h>
76#include <linux/iopoll.h>
77#include <linux/dma-mapping.h>
78#include <linux/usb.h>
79#include <linux/usb/of.h>
80
81#include "musb_core.h"
82#include "musb_trace.h"
83
84#define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON)
85
86
87#define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia"
88#define DRIVER_DESC "Inventra Dual-Role USB Controller Driver"
89
90#define MUSB_VERSION "6.0"
91
92#define DRIVER_INFO DRIVER_DESC ", v" MUSB_VERSION
93
94#define MUSB_DRIVER_NAME "musb-hdrc"
95const char musb_driver_name[] = MUSB_DRIVER_NAME;
96
97MODULE_DESCRIPTION(DRIVER_INFO);
98MODULE_AUTHOR(DRIVER_AUTHOR);
99MODULE_LICENSE("GPL");
100MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
101
102
103
104
105static inline struct musb *dev_to_musb(struct device *dev)
106{
107 return dev_get_drvdata(dev);
108}
109
110enum musb_mode musb_get_mode(struct device *dev)
111{
112 enum usb_dr_mode mode;
113
114 mode = usb_get_dr_mode(dev);
115 switch (mode) {
116 case USB_DR_MODE_HOST:
117 return MUSB_HOST;
118 case USB_DR_MODE_PERIPHERAL:
119 return MUSB_PERIPHERAL;
120 case USB_DR_MODE_OTG:
121 case USB_DR_MODE_UNKNOWN:
122 default:
123 return MUSB_OTG;
124 }
125}
126EXPORT_SYMBOL_GPL(musb_get_mode);
127
128
129
130static int musb_ulpi_read(struct usb_phy *phy, u32 reg)
131{
132 void __iomem *addr = phy->io_priv;
133 int i = 0;
134 u8 r;
135 u8 power;
136 int ret;
137
138 pm_runtime_get_sync(phy->io_dev);
139
140
141 power = musb_readb(addr, MUSB_POWER);
142 power &= ~MUSB_POWER_SUSPENDM;
143 musb_writeb(addr, MUSB_POWER, power);
144
145
146
147
148
149 musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)reg);
150 musb_writeb(addr, MUSB_ULPI_REG_CONTROL,
151 MUSB_ULPI_REG_REQ | MUSB_ULPI_RDN_WR);
152
153 while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL)
154 & MUSB_ULPI_REG_CMPLT)) {
155 i++;
156 if (i == 10000) {
157 ret = -ETIMEDOUT;
158 goto out;
159 }
160
161 }
162 r = musb_readb(addr, MUSB_ULPI_REG_CONTROL);
163 r &= ~MUSB_ULPI_REG_CMPLT;
164 musb_writeb(addr, MUSB_ULPI_REG_CONTROL, r);
165
166 ret = musb_readb(addr, MUSB_ULPI_REG_DATA);
167
168out:
169 pm_runtime_put(phy->io_dev);
170
171 return ret;
172}
173
174static int musb_ulpi_write(struct usb_phy *phy, u32 val, u32 reg)
175{
176 void __iomem *addr = phy->io_priv;
177 int i = 0;
178 u8 r = 0;
179 u8 power;
180 int ret = 0;
181
182 pm_runtime_get_sync(phy->io_dev);
183
184
185 power = musb_readb(addr, MUSB_POWER);
186 power &= ~MUSB_POWER_SUSPENDM;
187 musb_writeb(addr, MUSB_POWER, power);
188
189 musb_writeb(addr, MUSB_ULPI_REG_ADDR, (u8)reg);
190 musb_writeb(addr, MUSB_ULPI_REG_DATA, (u8)val);
191 musb_writeb(addr, MUSB_ULPI_REG_CONTROL, MUSB_ULPI_REG_REQ);
192
193 while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL)
194 & MUSB_ULPI_REG_CMPLT)) {
195 i++;
196 if (i == 10000) {
197 ret = -ETIMEDOUT;
198 goto out;
199 }
200 }
201
202 r = musb_readb(addr, MUSB_ULPI_REG_CONTROL);
203 r &= ~MUSB_ULPI_REG_CMPLT;
204 musb_writeb(addr, MUSB_ULPI_REG_CONTROL, r);
205
206out:
207 pm_runtime_put(phy->io_dev);
208
209 return ret;
210}
211
212static struct usb_phy_io_ops musb_ulpi_access = {
213 .read = musb_ulpi_read,
214 .write = musb_ulpi_write,
215};
216
217
218
219static u32 musb_default_fifo_offset(u8 epnum)
220{
221 return 0x20 + (epnum * 4);
222}
223
224
225static void musb_flat_ep_select(void __iomem *mbase, u8 epnum)
226{
227}
228
229static u32 musb_flat_ep_offset(u8 epnum, u16 offset)
230{
231 return 0x100 + (0x10 * epnum) + offset;
232}
233
234
235static void musb_indexed_ep_select(void __iomem *mbase, u8 epnum)
236{
237 musb_writeb(mbase, MUSB_INDEX, epnum);
238}
239
240static u32 musb_indexed_ep_offset(u8 epnum, u16 offset)
241{
242 return 0x10 + offset;
243}
244
245static u32 musb_default_busctl_offset(u8 epnum, u16 offset)
246{
247 return 0x80 + (0x08 * epnum) + offset;
248}
249
250static u8 musb_default_readb(void __iomem *addr, u32 offset)
251{
252 u8 data = __raw_readb(addr + offset);
253
254 trace_musb_readb(__builtin_return_address(0), addr, offset, data);
255 return data;
256}
257
258static void musb_default_writeb(void __iomem *addr, u32 offset, u8 data)
259{
260 trace_musb_writeb(__builtin_return_address(0), addr, offset, data);
261 __raw_writeb(data, addr + offset);
262}
263
264static u16 musb_default_readw(void __iomem *addr, u32 offset)
265{
266 u16 data = __raw_readw(addr + offset);
267
268 trace_musb_readw(__builtin_return_address(0), addr, offset, data);
269 return data;
270}
271
272static void musb_default_writew(void __iomem *addr, u32 offset, u16 data)
273{
274 trace_musb_writew(__builtin_return_address(0), addr, offset, data);
275 __raw_writew(data, addr + offset);
276}
277
278static u16 musb_default_get_toggle(struct musb_qh *qh, int is_out)
279{
280 void __iomem *epio = qh->hw_ep->regs;
281 u16 csr;
282
283 if (is_out)
284 csr = musb_readw(epio, MUSB_TXCSR) & MUSB_TXCSR_H_DATATOGGLE;
285 else
286 csr = musb_readw(epio, MUSB_RXCSR) & MUSB_RXCSR_H_DATATOGGLE;
287
288 return csr;
289}
290
291static u16 musb_default_set_toggle(struct musb_qh *qh, int is_out,
292 struct urb *urb)
293{
294 u16 csr;
295 u16 toggle;
296
297 toggle = usb_gettoggle(urb->dev, qh->epnum, is_out);
298
299 if (is_out)
300 csr = toggle ? (MUSB_TXCSR_H_WR_DATATOGGLE
301 | MUSB_TXCSR_H_DATATOGGLE)
302 : MUSB_TXCSR_CLRDATATOG;
303 else
304 csr = toggle ? (MUSB_RXCSR_H_WR_DATATOGGLE
305 | MUSB_RXCSR_H_DATATOGGLE) : 0;
306
307 return csr;
308}
309
310
311
312
313static void musb_default_write_fifo(struct musb_hw_ep *hw_ep, u16 len,
314 const u8 *src)
315{
316 struct musb *musb = hw_ep->musb;
317 void __iomem *fifo = hw_ep->fifo;
318
319 if (unlikely(len == 0))
320 return;
321
322 prefetch((u8 *)src);
323
324 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n",
325 'T', hw_ep->epnum, fifo, len, src);
326
327
328 if (likely((0x01 & (unsigned long) src) == 0)) {
329 u16 index = 0;
330
331
332 if ((0x02 & (unsigned long) src) == 0) {
333 if (len >= 4) {
334 iowrite32_rep(fifo, src + index, len >> 2);
335 index += len & ~0x03;
336 }
337 if (len & 0x02) {
338 __raw_writew(*(u16 *)&src[index], fifo);
339 index += 2;
340 }
341 } else {
342 if (len >= 2) {
343 iowrite16_rep(fifo, src + index, len >> 1);
344 index += len & ~0x01;
345 }
346 }
347 if (len & 0x01)
348 __raw_writeb(src[index], fifo);
349 } else {
350
351 iowrite8_rep(fifo, src, len);
352 }
353}
354
355
356
357
358static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
359{
360 struct musb *musb = hw_ep->musb;
361 void __iomem *fifo = hw_ep->fifo;
362
363 if (unlikely(len == 0))
364 return;
365
366 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n",
367 'R', hw_ep->epnum, fifo, len, dst);
368
369
370 if (likely((0x01 & (unsigned long) dst) == 0)) {
371 u16 index = 0;
372
373
374 if ((0x02 & (unsigned long) dst) == 0) {
375 if (len >= 4) {
376 ioread32_rep(fifo, dst, len >> 2);
377 index = len & ~0x03;
378 }
379 if (len & 0x02) {
380 *(u16 *)&dst[index] = __raw_readw(fifo);
381 index += 2;
382 }
383 } else {
384 if (len >= 2) {
385 ioread16_rep(fifo, dst, len >> 1);
386 index = len & ~0x01;
387 }
388 }
389 if (len & 0x01)
390 dst[index] = __raw_readb(fifo);
391 } else {
392
393 ioread8_rep(fifo, dst, len);
394 }
395}
396
397
398
399
400u8 (*musb_readb)(void __iomem *addr, u32 offset);
401EXPORT_SYMBOL_GPL(musb_readb);
402
403void (*musb_writeb)(void __iomem *addr, u32 offset, u8 data);
404EXPORT_SYMBOL_GPL(musb_writeb);
405
406u8 (*musb_clearb)(void __iomem *addr, u32 offset);
407EXPORT_SYMBOL_GPL(musb_clearb);
408
409u16 (*musb_readw)(void __iomem *addr, u32 offset);
410EXPORT_SYMBOL_GPL(musb_readw);
411
412void (*musb_writew)(void __iomem *addr, u32 offset, u16 data);
413EXPORT_SYMBOL_GPL(musb_writew);
414
415u16 (*musb_clearw)(void __iomem *addr, u32 offset);
416EXPORT_SYMBOL_GPL(musb_clearw);
417
418u32 musb_readl(void __iomem *addr, u32 offset)
419{
420 u32 data = __raw_readl(addr + offset);
421
422 trace_musb_readl(__builtin_return_address(0), addr, offset, data);
423 return data;
424}
425EXPORT_SYMBOL_GPL(musb_readl);
426
427void musb_writel(void __iomem *addr, u32 offset, u32 data)
428{
429 trace_musb_writel(__builtin_return_address(0), addr, offset, data);
430 __raw_writel(data, addr + offset);
431}
432EXPORT_SYMBOL_GPL(musb_writel);
433
434#ifndef CONFIG_MUSB_PIO_ONLY
435struct dma_controller *
436(*musb_dma_controller_create)(struct musb *musb, void __iomem *base);
437EXPORT_SYMBOL(musb_dma_controller_create);
438
439void (*musb_dma_controller_destroy)(struct dma_controller *c);
440EXPORT_SYMBOL(musb_dma_controller_destroy);
441#endif
442
443
444
445
446void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
447{
448 return hw_ep->musb->io.read_fifo(hw_ep, len, dst);
449}
450
451void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
452{
453 return hw_ep->musb->io.write_fifo(hw_ep, len, src);
454}
455
456static u8 musb_read_devctl(struct musb *musb)
457{
458 return musb_readb(musb->mregs, MUSB_DEVCTL);
459}
460
461
462
463
464
465
466
467
468
469
470
471
472
473int musb_set_host(struct musb *musb)
474{
475 int error = 0;
476 u8 devctl;
477
478 if (!musb)
479 return -EINVAL;
480
481 devctl = musb_read_devctl(musb);
482 if (!(devctl & MUSB_DEVCTL_BDEVICE)) {
483 trace_musb_state(musb, devctl, "Already in host mode");
484 goto init_data;
485 }
486
487 devctl |= MUSB_DEVCTL_SESSION;
488 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
489
490 error = readx_poll_timeout(musb_read_devctl, musb, devctl,
491 !(devctl & MUSB_DEVCTL_BDEVICE), 5000,
492 1000000);
493 if (error) {
494 dev_err(musb->controller, "%s: could not set host: %02x\n",
495 __func__, devctl);
496
497 return error;
498 }
499
500 devctl = musb_read_devctl(musb);
501 trace_musb_state(musb, devctl, "Host mode set");
502
503init_data:
504 musb->is_active = 1;
505 musb->xceiv->otg->state = OTG_STATE_A_IDLE;
506 MUSB_HST_MODE(musb);
507
508 return error;
509}
510EXPORT_SYMBOL_GPL(musb_set_host);
511
512
513
514
515
516
517
518
519
520int musb_set_peripheral(struct musb *musb)
521{
522 int error = 0;
523 u8 devctl;
524
525 if (!musb)
526 return -EINVAL;
527
528 devctl = musb_read_devctl(musb);
529 if (devctl & MUSB_DEVCTL_BDEVICE) {
530 trace_musb_state(musb, devctl, "Already in peripheral mode");
531 goto init_data;
532 }
533
534 devctl &= ~MUSB_DEVCTL_SESSION;
535 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
536
537 error = readx_poll_timeout(musb_read_devctl, musb, devctl,
538 devctl & MUSB_DEVCTL_BDEVICE, 5000,
539 1000000);
540 if (error) {
541 dev_err(musb->controller, "%s: could not set peripheral: %02x\n",
542 __func__, devctl);
543
544 return error;
545 }
546
547 devctl = musb_read_devctl(musb);
548 trace_musb_state(musb, devctl, "Peripheral mode set");
549
550init_data:
551 musb->is_active = 0;
552 musb->xceiv->otg->state = OTG_STATE_B_IDLE;
553 MUSB_DEV_MODE(musb);
554
555 return error;
556}
557EXPORT_SYMBOL_GPL(musb_set_peripheral);
558
559
560
561
562static const u8 musb_test_packet[53] = {
563
564
565
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567
568 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
569
570 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
571
572 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
573
574 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd,
575
576 0xfc, 0x7e, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0x7e
577
578
579};
580
581void musb_load_testpacket(struct musb *musb)
582{
583 void __iomem *regs = musb->endpoints[0].regs;
584
585 musb_ep_select(musb->mregs, 0);
586 musb_write_fifo(musb->control_ep,
587 sizeof(musb_test_packet), musb_test_packet);
588 musb_writew(regs, MUSB_CSR0, MUSB_CSR0_TXPKTRDY);
589}
590
591
592
593
594
595
596static void musb_otg_timer_func(struct timer_list *t)
597{
598 struct musb *musb = from_timer(musb, t, otg_timer);
599 unsigned long flags;
600
601 spin_lock_irqsave(&musb->lock, flags);
602 switch (musb->xceiv->otg->state) {
603 case OTG_STATE_B_WAIT_ACON:
604 musb_dbg(musb,
605 "HNP: b_wait_acon timeout; back to b_peripheral");
606 musb_g_disconnect(musb);
607 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
608 musb->is_active = 0;
609 break;
610 case OTG_STATE_A_SUSPEND:
611 case OTG_STATE_A_WAIT_BCON:
612 musb_dbg(musb, "HNP: %s timeout",
613 usb_otg_state_string(musb->xceiv->otg->state));
614 musb_platform_set_vbus(musb, 0);
615 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
616 break;
617 default:
618 musb_dbg(musb, "HNP: Unhandled mode %s",
619 usb_otg_state_string(musb->xceiv->otg->state));
620 }
621 spin_unlock_irqrestore(&musb->lock, flags);
622}
623
624
625
626
627void musb_hnp_stop(struct musb *musb)
628{
629 struct usb_hcd *hcd = musb->hcd;
630 void __iomem *mbase = musb->mregs;
631 u8 reg;
632
633 musb_dbg(musb, "HNP: stop from %s",
634 usb_otg_state_string(musb->xceiv->otg->state));
635
636 switch (musb->xceiv->otg->state) {
637 case OTG_STATE_A_PERIPHERAL:
638 musb_g_disconnect(musb);
639 musb_dbg(musb, "HNP: back to %s",
640 usb_otg_state_string(musb->xceiv->otg->state));
641 break;
642 case OTG_STATE_B_HOST:
643 musb_dbg(musb, "HNP: Disabling HR");
644 if (hcd)
645 hcd->self.is_b_host = 0;
646 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
647 MUSB_DEV_MODE(musb);
648 reg = musb_readb(mbase, MUSB_POWER);
649 reg |= MUSB_POWER_SUSPENDM;
650 musb_writeb(mbase, MUSB_POWER, reg);
651
652 break;
653 default:
654 musb_dbg(musb, "HNP: Stopping in unknown state %s",
655 usb_otg_state_string(musb->xceiv->otg->state));
656 }
657
658
659
660
661
662
663 musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16);
664}
665
666static void musb_recover_from_babble(struct musb *musb);
667
668static void musb_handle_intr_resume(struct musb *musb, u8 devctl)
669{
670 musb_dbg(musb, "RESUME (%s)",
671 usb_otg_state_string(musb->xceiv->otg->state));
672
673 if (devctl & MUSB_DEVCTL_HM) {
674 switch (musb->xceiv->otg->state) {
675 case OTG_STATE_A_SUSPEND:
676
677 musb->port1_status |=
678 (USB_PORT_STAT_C_SUSPEND << 16)
679 | MUSB_PORT_STAT_RESUME;
680 musb->rh_timer = jiffies
681 + msecs_to_jiffies(USB_RESUME_TIMEOUT);
682 musb->xceiv->otg->state = OTG_STATE_A_HOST;
683 musb->is_active = 1;
684 musb_host_resume_root_hub(musb);
685 schedule_delayed_work(&musb->finish_resume_work,
686 msecs_to_jiffies(USB_RESUME_TIMEOUT));
687 break;
688 case OTG_STATE_B_WAIT_ACON:
689 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
690 musb->is_active = 1;
691 MUSB_DEV_MODE(musb);
692 break;
693 default:
694 WARNING("bogus %s RESUME (%s)\n",
695 "host",
696 usb_otg_state_string(musb->xceiv->otg->state));
697 }
698 } else {
699 switch (musb->xceiv->otg->state) {
700 case OTG_STATE_A_SUSPEND:
701
702 musb->xceiv->otg->state = OTG_STATE_A_HOST;
703 musb_host_resume_root_hub(musb);
704 break;
705 case OTG_STATE_B_WAIT_ACON:
706 case OTG_STATE_B_PERIPHERAL:
707
708
709
710 if ((devctl & MUSB_DEVCTL_VBUS)
711 != (3 << MUSB_DEVCTL_VBUS_SHIFT)
712 ) {
713 musb->int_usb |= MUSB_INTR_DISCONNECT;
714 musb->int_usb &= ~MUSB_INTR_SUSPEND;
715 break;
716 }
717 musb_g_resume(musb);
718 break;
719 case OTG_STATE_B_IDLE:
720 musb->int_usb &= ~MUSB_INTR_SUSPEND;
721 break;
722 default:
723 WARNING("bogus %s RESUME (%s)\n",
724 "peripheral",
725 usb_otg_state_string(musb->xceiv->otg->state));
726 }
727 }
728}
729
730
731static irqreturn_t musb_handle_intr_sessreq(struct musb *musb, u8 devctl)
732{
733 void __iomem *mbase = musb->mregs;
734
735 if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS
736 && (devctl & MUSB_DEVCTL_BDEVICE)) {
737 musb_dbg(musb, "SessReq while on B state");
738 return IRQ_HANDLED;
739 }
740
741 musb_dbg(musb, "SESSION_REQUEST (%s)",
742 usb_otg_state_string(musb->xceiv->otg->state));
743
744
745
746
747
748
749
750
751 musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
752 musb->ep0_stage = MUSB_EP0_START;
753 musb->xceiv->otg->state = OTG_STATE_A_IDLE;
754 MUSB_HST_MODE(musb);
755 musb_platform_set_vbus(musb, 1);
756
757 return IRQ_NONE;
758}
759
760static void musb_handle_intr_vbuserr(struct musb *musb, u8 devctl)
761{
762 int ignore = 0;
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780 switch (musb->xceiv->otg->state) {
781 case OTG_STATE_A_HOST:
782
783
784
785
786
787
788 case OTG_STATE_A_WAIT_BCON:
789 case OTG_STATE_A_WAIT_VRISE:
790 if (musb->vbuserr_retry) {
791 void __iomem *mbase = musb->mregs;
792
793 musb->vbuserr_retry--;
794 ignore = 1;
795 devctl |= MUSB_DEVCTL_SESSION;
796 musb_writeb(mbase, MUSB_DEVCTL, devctl);
797 } else {
798 musb->port1_status |=
799 USB_PORT_STAT_OVERCURRENT
800 | (USB_PORT_STAT_C_OVERCURRENT << 16);
801 }
802 break;
803 default:
804 break;
805 }
806
807 dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller,
808 "VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n",
809 usb_otg_state_string(musb->xceiv->otg->state),
810 devctl,
811 ({ char *s;
812 switch (devctl & MUSB_DEVCTL_VBUS) {
813 case 0 << MUSB_DEVCTL_VBUS_SHIFT:
814 s = "<SessEnd"; break;
815 case 1 << MUSB_DEVCTL_VBUS_SHIFT:
816 s = "<AValid"; break;
817 case 2 << MUSB_DEVCTL_VBUS_SHIFT:
818 s = "<VBusValid"; break;
819
820 default:
821 s = "VALID"; break;
822 } s; }),
823 VBUSERR_RETRY_COUNT - musb->vbuserr_retry,
824 musb->port1_status);
825
826
827 if (!ignore)
828 musb_platform_set_vbus(musb, 0);
829}
830
831static void musb_handle_intr_suspend(struct musb *musb, u8 devctl)
832{
833 musb_dbg(musb, "SUSPEND (%s) devctl %02x",
834 usb_otg_state_string(musb->xceiv->otg->state), devctl);
835
836 switch (musb->xceiv->otg->state) {
837 case OTG_STATE_A_PERIPHERAL:
838
839
840
841
842
843
844
845 musb_hnp_stop(musb);
846 musb_host_resume_root_hub(musb);
847 musb_root_disconnect(musb);
848 musb_platform_try_idle(musb, jiffies
849 + msecs_to_jiffies(musb->a_wait_bcon
850 ? : OTG_TIME_A_WAIT_BCON));
851
852 break;
853 case OTG_STATE_B_IDLE:
854 if (!musb->is_active)
855 break;
856 fallthrough;
857 case OTG_STATE_B_PERIPHERAL:
858 musb_g_suspend(musb);
859 musb->is_active = musb->g.b_hnp_enable;
860 if (musb->is_active) {
861 musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON;
862 musb_dbg(musb, "HNP: Setting timer for b_ase0_brst");
863 mod_timer(&musb->otg_timer, jiffies
864 + msecs_to_jiffies(
865 OTG_TIME_B_ASE0_BRST));
866 }
867 break;
868 case OTG_STATE_A_WAIT_BCON:
869 if (musb->a_wait_bcon != 0)
870 musb_platform_try_idle(musb, jiffies
871 + msecs_to_jiffies(musb->a_wait_bcon));
872 break;
873 case OTG_STATE_A_HOST:
874 musb->xceiv->otg->state = OTG_STATE_A_SUSPEND;
875 musb->is_active = musb->hcd->self.b_hnp_enable;
876 break;
877 case OTG_STATE_B_HOST:
878
879 musb_dbg(musb, "REVISIT: SUSPEND as B_HOST");
880 break;
881 default:
882
883 musb->is_active = 0;
884 break;
885 }
886}
887
888static void musb_handle_intr_connect(struct musb *musb, u8 devctl, u8 int_usb)
889{
890 struct usb_hcd *hcd = musb->hcd;
891
892 musb->is_active = 1;
893 musb->ep0_stage = MUSB_EP0_START;
894
895 musb->intrtxe = musb->epmask;
896 musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe);
897 musb->intrrxe = musb->epmask & 0xfffe;
898 musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe);
899 musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7);
900 musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
901 |USB_PORT_STAT_HIGH_SPEED
902 |USB_PORT_STAT_ENABLE
903 );
904 musb->port1_status |= USB_PORT_STAT_CONNECTION
905 |(USB_PORT_STAT_C_CONNECTION << 16);
906
907
908 if (devctl & MUSB_DEVCTL_LSDEV)
909 musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
910
911
912 switch (musb->xceiv->otg->state) {
913 case OTG_STATE_B_PERIPHERAL:
914 if (int_usb & MUSB_INTR_SUSPEND) {
915 musb_dbg(musb, "HNP: SUSPEND+CONNECT, now b_host");
916 int_usb &= ~MUSB_INTR_SUSPEND;
917 goto b_host;
918 } else
919 musb_dbg(musb, "CONNECT as b_peripheral???");
920 break;
921 case OTG_STATE_B_WAIT_ACON:
922 musb_dbg(musb, "HNP: CONNECT, now b_host");
923b_host:
924 musb->xceiv->otg->state = OTG_STATE_B_HOST;
925 if (musb->hcd)
926 musb->hcd->self.is_b_host = 1;
927 del_timer(&musb->otg_timer);
928 break;
929 default:
930 if ((devctl & MUSB_DEVCTL_VBUS)
931 == (3 << MUSB_DEVCTL_VBUS_SHIFT)) {
932 musb->xceiv->otg->state = OTG_STATE_A_HOST;
933 if (hcd)
934 hcd->self.is_b_host = 0;
935 }
936 break;
937 }
938
939 musb_host_poke_root_hub(musb);
940
941 musb_dbg(musb, "CONNECT (%s) devctl %02x",
942 usb_otg_state_string(musb->xceiv->otg->state), devctl);
943}
944
945static void musb_handle_intr_disconnect(struct musb *musb, u8 devctl)
946{
947 musb_dbg(musb, "DISCONNECT (%s) as %s, devctl %02x",
948 usb_otg_state_string(musb->xceiv->otg->state),
949 MUSB_MODE(musb), devctl);
950
951 switch (musb->xceiv->otg->state) {
952 case OTG_STATE_A_HOST:
953 case OTG_STATE_A_SUSPEND:
954 musb_host_resume_root_hub(musb);
955 musb_root_disconnect(musb);
956 if (musb->a_wait_bcon != 0)
957 musb_platform_try_idle(musb, jiffies
958 + msecs_to_jiffies(musb->a_wait_bcon));
959 break;
960 case OTG_STATE_B_HOST:
961
962
963
964
965
966 musb_root_disconnect(musb);
967 if (musb->hcd)
968 musb->hcd->self.is_b_host = 0;
969 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
970 MUSB_DEV_MODE(musb);
971 musb_g_disconnect(musb);
972 break;
973 case OTG_STATE_A_PERIPHERAL:
974 musb_hnp_stop(musb);
975 musb_root_disconnect(musb);
976 fallthrough;
977 case OTG_STATE_B_WAIT_ACON:
978 case OTG_STATE_B_PERIPHERAL:
979 case OTG_STATE_B_IDLE:
980 musb_g_disconnect(musb);
981 break;
982 default:
983 WARNING("unhandled DISCONNECT transition (%s)\n",
984 usb_otg_state_string(musb->xceiv->otg->state));
985 break;
986 }
987}
988
989
990
991
992
993static void musb_handle_intr_reset(struct musb *musb)
994{
995 if (is_host_active(musb)) {
996
997
998
999
1000
1001
1002
1003
1004 dev_err(musb->controller, "Babble\n");
1005 musb_recover_from_babble(musb);
1006 } else {
1007 musb_dbg(musb, "BUS RESET as %s",
1008 usb_otg_state_string(musb->xceiv->otg->state));
1009 switch (musb->xceiv->otg->state) {
1010 case OTG_STATE_A_SUSPEND:
1011 musb_g_reset(musb);
1012 fallthrough;
1013 case OTG_STATE_A_WAIT_BCON:
1014
1015 musb_dbg(musb, "HNP: in %s, %d msec timeout",
1016 usb_otg_state_string(musb->xceiv->otg->state),
1017 TA_WAIT_BCON(musb));
1018 mod_timer(&musb->otg_timer, jiffies
1019 + msecs_to_jiffies(TA_WAIT_BCON(musb)));
1020 break;
1021 case OTG_STATE_A_PERIPHERAL:
1022 del_timer(&musb->otg_timer);
1023 musb_g_reset(musb);
1024 break;
1025 case OTG_STATE_B_WAIT_ACON:
1026 musb_dbg(musb, "HNP: RESET (%s), to b_peripheral",
1027 usb_otg_state_string(musb->xceiv->otg->state));
1028 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
1029 musb_g_reset(musb);
1030 break;
1031 case OTG_STATE_B_IDLE:
1032 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
1033 fallthrough;
1034 case OTG_STATE_B_PERIPHERAL:
1035 musb_g_reset(musb);
1036 break;
1037 default:
1038 musb_dbg(musb, "Unhandled BUS RESET as %s",
1039 usb_otg_state_string(musb->xceiv->otg->state));
1040 }
1041 }
1042}
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
1056 u8 devctl)
1057{
1058 irqreturn_t handled = IRQ_NONE;
1059
1060 musb_dbg(musb, "<== DevCtl=%02x, int_usb=0x%x", devctl, int_usb);
1061
1062
1063
1064
1065
1066 if (int_usb & MUSB_INTR_RESUME) {
1067 musb_handle_intr_resume(musb, devctl);
1068 handled = IRQ_HANDLED;
1069 }
1070
1071
1072 if (int_usb & MUSB_INTR_SESSREQ) {
1073 if (musb_handle_intr_sessreq(musb, devctl))
1074 return IRQ_HANDLED;
1075 handled = IRQ_HANDLED;
1076 }
1077
1078 if (int_usb & MUSB_INTR_VBUSERROR) {
1079 musb_handle_intr_vbuserr(musb, devctl);
1080 handled = IRQ_HANDLED;
1081 }
1082
1083 if (int_usb & MUSB_INTR_SUSPEND) {
1084 musb_handle_intr_suspend(musb, devctl);
1085 handled = IRQ_HANDLED;
1086 }
1087
1088 if (int_usb & MUSB_INTR_CONNECT) {
1089 musb_handle_intr_connect(musb, devctl, int_usb);
1090 handled = IRQ_HANDLED;
1091 }
1092
1093 if (int_usb & MUSB_INTR_DISCONNECT) {
1094 musb_handle_intr_disconnect(musb, devctl);
1095 handled = IRQ_HANDLED;
1096 }
1097
1098 if (int_usb & MUSB_INTR_RESET) {
1099 musb_handle_intr_reset(musb);
1100 handled = IRQ_HANDLED;
1101 }
1102
1103#if 0
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115 if (int_usb & MUSB_INTR_SOF) {
1116 void __iomem *mbase = musb->mregs;
1117 struct musb_hw_ep *ep;
1118 u8 epnum;
1119 u16 frame;
1120
1121 dev_dbg(musb->controller, "START_OF_FRAME\n");
1122 handled = IRQ_HANDLED;
1123
1124
1125 frame = musb_readw(mbase, MUSB_FRAME);
1126 ep = musb->endpoints;
1127 for (epnum = 1; (epnum < musb->nr_endpoints)
1128 && (musb->epmask >= (1 << epnum));
1129 epnum++, ep++) {
1130
1131
1132
1133
1134 if (ep->dwWaitFrame >= frame) {
1135 ep->dwWaitFrame = 0;
1136 pr_debug("SOF --> periodic TX%s on %d\n",
1137 ep->tx_channel ? " DMA" : "",
1138 epnum);
1139 if (!ep->tx_channel)
1140 musb_h_tx_start(musb, epnum);
1141 else
1142 cppi_hostdma_start(musb, epnum);
1143 }
1144 }
1145 }
1146#endif
1147
1148 schedule_delayed_work(&musb->irq_work, 0);
1149
1150 return handled;
1151}
1152
1153
1154
1155static void musb_disable_interrupts(struct musb *musb)
1156{
1157 void __iomem *mbase = musb->mregs;
1158
1159
1160 musb_writeb(mbase, MUSB_INTRUSBE, 0);
1161 musb->intrtxe = 0;
1162 musb_writew(mbase, MUSB_INTRTXE, 0);
1163 musb->intrrxe = 0;
1164 musb_writew(mbase, MUSB_INTRRXE, 0);
1165
1166
1167 musb_clearb(mbase, MUSB_INTRUSB);
1168 musb_clearw(mbase, MUSB_INTRTX);
1169 musb_clearw(mbase, MUSB_INTRRX);
1170}
1171
1172static void musb_enable_interrupts(struct musb *musb)
1173{
1174 void __iomem *regs = musb->mregs;
1175
1176
1177 musb->intrtxe = musb->epmask;
1178 musb_writew(regs, MUSB_INTRTXE, musb->intrtxe);
1179 musb->intrrxe = musb->epmask & 0xfffe;
1180 musb_writew(regs, MUSB_INTRRXE, musb->intrrxe);
1181 musb_writeb(regs, MUSB_INTRUSBE, 0xf7);
1182
1183}
1184
1185
1186
1187
1188void musb_start(struct musb *musb)
1189{
1190 void __iomem *regs = musb->mregs;
1191 u8 devctl = musb_readb(regs, MUSB_DEVCTL);
1192 u8 power;
1193
1194 musb_dbg(musb, "<== devctl %02x", devctl);
1195
1196 musb_enable_interrupts(musb);
1197 musb_writeb(regs, MUSB_TESTMODE, 0);
1198
1199 power = MUSB_POWER_ISOUPDATE;
1200
1201
1202
1203
1204 if (musb->config->maximum_speed == USB_SPEED_HIGH ||
1205 musb->config->maximum_speed == USB_SPEED_UNKNOWN)
1206 power |= MUSB_POWER_HSENAB;
1207 musb_writeb(regs, MUSB_POWER, power);
1208
1209 musb->is_active = 0;
1210 devctl = musb_readb(regs, MUSB_DEVCTL);
1211 devctl &= ~MUSB_DEVCTL_SESSION;
1212
1213
1214
1215
1216
1217
1218 if (musb->port_mode != MUSB_HOST &&
1219 musb->xceiv->otg->state != OTG_STATE_A_WAIT_BCON &&
1220 (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
1221 musb->is_active = 1;
1222 } else {
1223 devctl |= MUSB_DEVCTL_SESSION;
1224 }
1225
1226 musb_platform_enable(musb);
1227 musb_writeb(regs, MUSB_DEVCTL, devctl);
1228}
1229
1230
1231
1232
1233
1234
1235
1236
1237void musb_stop(struct musb *musb)
1238{
1239
1240 musb_platform_disable(musb);
1241 musb_disable_interrupts(musb);
1242 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
1243
1244
1245
1246
1247
1248
1249
1250
1251 musb_platform_try_idle(musb, 0);
1252}
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266static ushort fifo_mode;
1267
1268
1269module_param(fifo_mode, ushort, 0);
1270MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration");
1271
1272
1273
1274
1275
1276
1277
1278static struct musb_fifo_cfg mode_0_cfg[] = {
1279{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
1280{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
1281{ .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, },
1282{ .hw_ep_num = 3, .style = FIFO_RXTX, .maxpacket = 256, },
1283{ .hw_ep_num = 4, .style = FIFO_RXTX, .maxpacket = 256, },
1284};
1285
1286
1287static struct musb_fifo_cfg mode_1_cfg[] = {
1288{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, },
1289{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, },
1290{ .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, },
1291{ .hw_ep_num = 3, .style = FIFO_RXTX, .maxpacket = 256, },
1292{ .hw_ep_num = 4, .style = FIFO_RXTX, .maxpacket = 256, },
1293};
1294
1295
1296static struct musb_fifo_cfg mode_2_cfg[] = {
1297{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
1298{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
1299{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
1300{ .hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 512, },
1301{ .hw_ep_num = 3, .style = FIFO_RXTX, .maxpacket = 960, },
1302{ .hw_ep_num = 4, .style = FIFO_RXTX, .maxpacket = 1024, },
1303};
1304
1305
1306static struct musb_fifo_cfg mode_3_cfg[] = {
1307{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, },
1308{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, },
1309{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
1310{ .hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 512, },
1311{ .hw_ep_num = 3, .style = FIFO_RXTX, .maxpacket = 256, },
1312{ .hw_ep_num = 4, .style = FIFO_RXTX, .maxpacket = 256, },
1313};
1314
1315
1316static struct musb_fifo_cfg mode_4_cfg[] = {
1317{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
1318{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
1319{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
1320{ .hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 512, },
1321{ .hw_ep_num = 3, .style = FIFO_TX, .maxpacket = 512, },
1322{ .hw_ep_num = 3, .style = FIFO_RX, .maxpacket = 512, },
1323{ .hw_ep_num = 4, .style = FIFO_TX, .maxpacket = 512, },
1324{ .hw_ep_num = 4, .style = FIFO_RX, .maxpacket = 512, },
1325{ .hw_ep_num = 5, .style = FIFO_TX, .maxpacket = 512, },
1326{ .hw_ep_num = 5, .style = FIFO_RX, .maxpacket = 512, },
1327{ .hw_ep_num = 6, .style = FIFO_TX, .maxpacket = 512, },
1328{ .hw_ep_num = 6, .style = FIFO_RX, .maxpacket = 512, },
1329{ .hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 512, },
1330{ .hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 512, },
1331{ .hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 512, },
1332{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 512, },
1333{ .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 512, },
1334{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 512, },
1335{ .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 256, },
1336{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 64, },
1337{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 256, },
1338{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 64, },
1339{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 256, },
1340{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 64, },
1341{ .hw_ep_num = 13, .style = FIFO_RXTX, .maxpacket = 4096, },
1342{ .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, },
1343{ .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, },
1344};
1345
1346
1347static struct musb_fifo_cfg mode_5_cfg[] = {
1348{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
1349{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
1350{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
1351{ .hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 512, },
1352{ .hw_ep_num = 3, .style = FIFO_TX, .maxpacket = 512, },
1353{ .hw_ep_num = 3, .style = FIFO_RX, .maxpacket = 512, },
1354{ .hw_ep_num = 4, .style = FIFO_TX, .maxpacket = 512, },
1355{ .hw_ep_num = 4, .style = FIFO_RX, .maxpacket = 512, },
1356{ .hw_ep_num = 5, .style = FIFO_TX, .maxpacket = 512, },
1357{ .hw_ep_num = 5, .style = FIFO_RX, .maxpacket = 512, },
1358{ .hw_ep_num = 6, .style = FIFO_TX, .maxpacket = 32, },
1359{ .hw_ep_num = 6, .style = FIFO_RX, .maxpacket = 32, },
1360{ .hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 32, },
1361{ .hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 32, },
1362{ .hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 32, },
1363{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 32, },
1364{ .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 32, },
1365{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 32, },
1366{ .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 32, },
1367{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 32, },
1368{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 32, },
1369{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 32, },
1370{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 32, },
1371{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 32, },
1372{ .hw_ep_num = 13, .style = FIFO_RXTX, .maxpacket = 512, },
1373{ .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, },
1374{ .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, },
1375};
1376
1377
1378
1379
1380
1381
1382
1383static int
1384fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep,
1385 const struct musb_fifo_cfg *cfg, u16 offset)
1386{
1387 void __iomem *mbase = musb->mregs;
1388 int size = 0;
1389 u16 maxpacket = cfg->maxpacket;
1390 u16 c_off = offset >> 3;
1391 u8 c_size;
1392
1393
1394
1395 size = ffs(max(maxpacket, (u16) 8)) - 1;
1396 maxpacket = 1 << size;
1397
1398 c_size = size - 3;
1399 if (cfg->mode == BUF_DOUBLE) {
1400 if ((offset + (maxpacket << 1)) >
1401 (1 << (musb->config->ram_bits + 2)))
1402 return -EMSGSIZE;
1403 c_size |= MUSB_FIFOSZ_DPB;
1404 } else {
1405 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2)))
1406 return -EMSGSIZE;
1407 }
1408
1409
1410 musb_writeb(mbase, MUSB_INDEX, hw_ep->epnum);
1411
1412
1413
1414
1415 if (hw_ep->epnum == 1)
1416 musb->bulk_ep = hw_ep;
1417
1418 switch (cfg->style) {
1419 case FIFO_TX:
1420 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
1421 musb_writew(mbase, MUSB_TXFIFOADD, c_off);
1422 hw_ep->tx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
1423 hw_ep->max_packet_sz_tx = maxpacket;
1424 break;
1425 case FIFO_RX:
1426 musb_writeb(mbase, MUSB_RXFIFOSZ, c_size);
1427 musb_writew(mbase, MUSB_RXFIFOADD, c_off);
1428 hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
1429 hw_ep->max_packet_sz_rx = maxpacket;
1430 break;
1431 case FIFO_RXTX:
1432 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
1433 musb_writew(mbase, MUSB_TXFIFOADD, c_off);
1434 hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
1435 hw_ep->max_packet_sz_rx = maxpacket;
1436
1437 musb_writeb(mbase, MUSB_RXFIFOSZ, c_size);
1438 musb_writew(mbase, MUSB_RXFIFOADD, c_off);
1439 hw_ep->tx_double_buffered = hw_ep->rx_double_buffered;
1440 hw_ep->max_packet_sz_tx = maxpacket;
1441
1442 hw_ep->is_shared_fifo = true;
1443 break;
1444 }
1445
1446
1447
1448
1449 musb->epmask |= (1 << hw_ep->epnum);
1450
1451 return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0));
1452}
1453
1454static struct musb_fifo_cfg ep0_cfg = {
1455 .style = FIFO_RXTX, .maxpacket = 64,
1456};
1457
1458static int ep_config_from_table(struct musb *musb)
1459{
1460 const struct musb_fifo_cfg *cfg;
1461 unsigned i, n;
1462 int offset;
1463 struct musb_hw_ep *hw_ep = musb->endpoints;
1464
1465 if (musb->config->fifo_cfg) {
1466 cfg = musb->config->fifo_cfg;
1467 n = musb->config->fifo_cfg_size;
1468 goto done;
1469 }
1470
1471 switch (fifo_mode) {
1472 default:
1473 fifo_mode = 0;
1474 fallthrough;
1475 case 0:
1476 cfg = mode_0_cfg;
1477 n = ARRAY_SIZE(mode_0_cfg);
1478 break;
1479 case 1:
1480 cfg = mode_1_cfg;
1481 n = ARRAY_SIZE(mode_1_cfg);
1482 break;
1483 case 2:
1484 cfg = mode_2_cfg;
1485 n = ARRAY_SIZE(mode_2_cfg);
1486 break;
1487 case 3:
1488 cfg = mode_3_cfg;
1489 n = ARRAY_SIZE(mode_3_cfg);
1490 break;
1491 case 4:
1492 cfg = mode_4_cfg;
1493 n = ARRAY_SIZE(mode_4_cfg);
1494 break;
1495 case 5:
1496 cfg = mode_5_cfg;
1497 n = ARRAY_SIZE(mode_5_cfg);
1498 break;
1499 }
1500
1501 pr_debug("%s: setup fifo_mode %d\n", musb_driver_name, fifo_mode);
1502
1503
1504done:
1505 offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0);
1506
1507
1508
1509
1510
1511
1512 for (i = 0; i < n; i++) {
1513 u8 epn = cfg->hw_ep_num;
1514
1515 if (epn >= musb->config->num_eps) {
1516 pr_debug("%s: invalid ep %d\n",
1517 musb_driver_name, epn);
1518 return -EINVAL;
1519 }
1520 offset = fifo_setup(musb, hw_ep + epn, cfg++, offset);
1521 if (offset < 0) {
1522 pr_debug("%s: mem overrun, ep %d\n",
1523 musb_driver_name, epn);
1524 return offset;
1525 }
1526 epn++;
1527 musb->nr_endpoints = max(epn, musb->nr_endpoints);
1528 }
1529
1530 pr_debug("%s: %d/%d max ep, %d/%d memory\n",
1531 musb_driver_name,
1532 n + 1, musb->config->num_eps * 2 - 1,
1533 offset, (1 << (musb->config->ram_bits + 2)));
1534
1535 if (!musb->bulk_ep) {
1536 pr_debug("%s: missing bulk\n", musb_driver_name);
1537 return -EINVAL;
1538 }
1539
1540 return 0;
1541}
1542
1543
1544
1545
1546
1547
1548static int ep_config_from_hw(struct musb *musb)
1549{
1550 u8 epnum = 0;
1551 struct musb_hw_ep *hw_ep;
1552 void __iomem *mbase = musb->mregs;
1553 int ret = 0;
1554
1555 musb_dbg(musb, "<== static silicon ep config");
1556
1557
1558
1559 for (epnum = 1; epnum < musb->config->num_eps; epnum++) {
1560 musb_ep_select(mbase, epnum);
1561 hw_ep = musb->endpoints + epnum;
1562
1563 ret = musb_read_fifosize(musb, hw_ep, epnum);
1564 if (ret < 0)
1565 break;
1566
1567
1568
1569
1570 if (hw_ep->max_packet_sz_tx < 512
1571 || hw_ep->max_packet_sz_rx < 512)
1572 continue;
1573
1574
1575
1576
1577 if (musb->bulk_ep)
1578 continue;
1579 musb->bulk_ep = hw_ep;
1580 }
1581
1582 if (!musb->bulk_ep) {
1583 pr_debug("%s: missing bulk\n", musb_driver_name);
1584 return -EINVAL;
1585 }
1586
1587 return 0;
1588}
1589
1590enum { MUSB_CONTROLLER_MHDRC, MUSB_CONTROLLER_HDRC, };
1591
1592
1593
1594
1595static int musb_core_init(u16 musb_type, struct musb *musb)
1596{
1597 u8 reg;
1598 char *type;
1599 char aInfo[90];
1600 void __iomem *mbase = musb->mregs;
1601 int status = 0;
1602 int i;
1603
1604
1605 reg = musb_read_configdata(mbase);
1606
1607 strcpy(aInfo, (reg & MUSB_CONFIGDATA_UTMIDW) ? "UTMI-16" : "UTMI-8");
1608 if (reg & MUSB_CONFIGDATA_DYNFIFO) {
1609 strcat(aInfo, ", dyn FIFOs");
1610 musb->dyn_fifo = true;
1611 }
1612 if (reg & MUSB_CONFIGDATA_MPRXE) {
1613 strcat(aInfo, ", bulk combine");
1614 musb->bulk_combine = true;
1615 }
1616 if (reg & MUSB_CONFIGDATA_MPTXE) {
1617 strcat(aInfo, ", bulk split");
1618 musb->bulk_split = true;
1619 }
1620 if (reg & MUSB_CONFIGDATA_HBRXE) {
1621 strcat(aInfo, ", HB-ISO Rx");
1622 musb->hb_iso_rx = true;
1623 }
1624 if (reg & MUSB_CONFIGDATA_HBTXE) {
1625 strcat(aInfo, ", HB-ISO Tx");
1626 musb->hb_iso_tx = true;
1627 }
1628 if (reg & MUSB_CONFIGDATA_SOFTCONE)
1629 strcat(aInfo, ", SoftConn");
1630
1631 pr_debug("%s: ConfigData=0x%02x (%s)\n", musb_driver_name, reg, aInfo);
1632
1633 if (MUSB_CONTROLLER_MHDRC == musb_type) {
1634 musb->is_multipoint = 1;
1635 type = "M";
1636 } else {
1637 musb->is_multipoint = 0;
1638 type = "";
1639 if (IS_ENABLED(CONFIG_USB) &&
1640 !IS_ENABLED(CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB)) {
1641 pr_err("%s: kernel must disable external hubs, please fix the configuration\n",
1642 musb_driver_name);
1643 }
1644 }
1645
1646
1647 musb->hwvers = musb_readw(mbase, MUSB_HWVERS);
1648 pr_debug("%s: %sHDRC RTL version %d.%d%s\n",
1649 musb_driver_name, type, MUSB_HWVERS_MAJOR(musb->hwvers),
1650 MUSB_HWVERS_MINOR(musb->hwvers),
1651 (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : "");
1652
1653
1654 musb_configure_ep0(musb);
1655
1656
1657 musb->nr_endpoints = 1;
1658 musb->epmask = 1;
1659
1660 if (musb->dyn_fifo)
1661 status = ep_config_from_table(musb);
1662 else
1663 status = ep_config_from_hw(musb);
1664
1665 if (status < 0)
1666 return status;
1667
1668
1669 for (i = 0; i < musb->nr_endpoints; i++) {
1670 struct musb_hw_ep *hw_ep = musb->endpoints + i;
1671
1672 hw_ep->fifo = musb->io.fifo_offset(i) + mbase;
1673#if IS_ENABLED(CONFIG_USB_MUSB_TUSB6010)
1674 if (musb->ops->quirks & MUSB_IN_TUSB) {
1675 hw_ep->fifo_async = musb->async + 0x400 +
1676 musb->io.fifo_offset(i);
1677 hw_ep->fifo_sync = musb->sync + 0x400 +
1678 musb->io.fifo_offset(i);
1679 hw_ep->fifo_sync_va =
1680 musb->sync_va + 0x400 + musb->io.fifo_offset(i);
1681
1682 if (i == 0)
1683 hw_ep->conf = mbase - 0x400 + TUSB_EP0_CONF;
1684 else
1685 hw_ep->conf = mbase + 0x400 +
1686 (((i - 1) & 0xf) << 2);
1687 }
1688#endif
1689
1690 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase;
1691 hw_ep->rx_reinit = 1;
1692 hw_ep->tx_reinit = 1;
1693
1694 if (hw_ep->max_packet_sz_tx) {
1695 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d",
1696 musb_driver_name, i,
1697 hw_ep->is_shared_fifo ? "shared" : "tx",
1698 hw_ep->tx_double_buffered
1699 ? "doublebuffer, " : "",
1700 hw_ep->max_packet_sz_tx);
1701 }
1702 if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) {
1703 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d",
1704 musb_driver_name, i,
1705 "rx",
1706 hw_ep->rx_double_buffered
1707 ? "doublebuffer, " : "",
1708 hw_ep->max_packet_sz_rx);
1709 }
1710 if (!(hw_ep->max_packet_sz_tx || hw_ep->max_packet_sz_rx))
1711 musb_dbg(musb, "hw_ep %d not configured", i);
1712 }
1713
1714 return 0;
1715}
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726irqreturn_t musb_interrupt(struct musb *musb)
1727{
1728 irqreturn_t retval = IRQ_NONE;
1729 unsigned long status;
1730 unsigned long epnum;
1731 u8 devctl;
1732
1733 if (!musb->int_usb && !musb->int_tx && !musb->int_rx)
1734 return IRQ_NONE;
1735
1736 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
1737
1738 trace_musb_isr(musb);
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760 if (musb->int_usb)
1761 retval |= musb_stage0_irq(musb, musb->int_usb, devctl);
1762
1763 if (musb->int_tx & 1) {
1764 if (is_host_active(musb))
1765 retval |= musb_h_ep0_irq(musb);
1766 else
1767 retval |= musb_g_ep0_irq(musb);
1768
1769
1770 musb->int_tx &= ~BIT(0);
1771 }
1772
1773 status = musb->int_tx;
1774
1775 for_each_set_bit(epnum, &status, 16) {
1776 retval = IRQ_HANDLED;
1777 if (is_host_active(musb))
1778 musb_host_tx(musb, epnum);
1779 else
1780 musb_g_tx(musb, epnum);
1781 }
1782
1783 status = musb->int_rx;
1784
1785 for_each_set_bit(epnum, &status, 16) {
1786 retval = IRQ_HANDLED;
1787 if (is_host_active(musb))
1788 musb_host_rx(musb, epnum);
1789 else
1790 musb_g_rx(musb, epnum);
1791 }
1792
1793 return retval;
1794}
1795EXPORT_SYMBOL_GPL(musb_interrupt);
1796
1797#ifndef CONFIG_MUSB_PIO_ONLY
1798static bool use_dma = true;
1799
1800
1801module_param(use_dma, bool, 0644);
1802MODULE_PARM_DESC(use_dma, "enable/disable use of DMA");
1803
1804void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit)
1805{
1806
1807
1808 if (!epnum) {
1809 if (!is_cppi_enabled(musb)) {
1810
1811 if (is_host_active(musb))
1812 musb_h_ep0_irq(musb);
1813 else
1814 musb_g_ep0_irq(musb);
1815 }
1816 } else {
1817
1818 if (transmit) {
1819 if (is_host_active(musb))
1820 musb_host_tx(musb, epnum);
1821 else
1822 musb_g_tx(musb, epnum);
1823 } else {
1824
1825 if (is_host_active(musb))
1826 musb_host_rx(musb, epnum);
1827 else
1828 musb_g_rx(musb, epnum);
1829 }
1830 }
1831}
1832EXPORT_SYMBOL_GPL(musb_dma_completion);
1833
1834#else
1835#define use_dma 0
1836#endif
1837
1838static int (*musb_phy_callback)(enum musb_vbus_id_status status);
1839
1840
1841
1842
1843
1844
1845
1846
1847int musb_mailbox(enum musb_vbus_id_status status)
1848{
1849 if (musb_phy_callback)
1850 return musb_phy_callback(status);
1851
1852 return -ENODEV;
1853};
1854EXPORT_SYMBOL_GPL(musb_mailbox);
1855
1856
1857
1858static ssize_t
1859mode_show(struct device *dev, struct device_attribute *attr, char *buf)
1860{
1861 struct musb *musb = dev_to_musb(dev);
1862 unsigned long flags;
1863 int ret;
1864
1865 spin_lock_irqsave(&musb->lock, flags);
1866 ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state));
1867 spin_unlock_irqrestore(&musb->lock, flags);
1868
1869 return ret;
1870}
1871
1872static ssize_t
1873mode_store(struct device *dev, struct device_attribute *attr,
1874 const char *buf, size_t n)
1875{
1876 struct musb *musb = dev_to_musb(dev);
1877 unsigned long flags;
1878 int status;
1879
1880 spin_lock_irqsave(&musb->lock, flags);
1881 if (sysfs_streq(buf, "host"))
1882 status = musb_platform_set_mode(musb, MUSB_HOST);
1883 else if (sysfs_streq(buf, "peripheral"))
1884 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL);
1885 else if (sysfs_streq(buf, "otg"))
1886 status = musb_platform_set_mode(musb, MUSB_OTG);
1887 else
1888 status = -EINVAL;
1889 spin_unlock_irqrestore(&musb->lock, flags);
1890
1891 return (status == 0) ? n : status;
1892}
1893static DEVICE_ATTR_RW(mode);
1894
1895static ssize_t
1896vbus_store(struct device *dev, struct device_attribute *attr,
1897 const char *buf, size_t n)
1898{
1899 struct musb *musb = dev_to_musb(dev);
1900 unsigned long flags;
1901 unsigned long val;
1902
1903 if (sscanf(buf, "%lu", &val) < 1) {
1904 dev_err(dev, "Invalid VBUS timeout ms value\n");
1905 return -EINVAL;
1906 }
1907
1908 spin_lock_irqsave(&musb->lock, flags);
1909
1910 musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ;
1911 if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)
1912 musb->is_active = 0;
1913 musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val));
1914 spin_unlock_irqrestore(&musb->lock, flags);
1915
1916 return n;
1917}
1918
1919static ssize_t
1920vbus_show(struct device *dev, struct device_attribute *attr, char *buf)
1921{
1922 struct musb *musb = dev_to_musb(dev);
1923 unsigned long flags;
1924 unsigned long val;
1925 int vbus;
1926 u8 devctl;
1927
1928 pm_runtime_get_sync(dev);
1929 spin_lock_irqsave(&musb->lock, flags);
1930 val = musb->a_wait_bcon;
1931 vbus = musb_platform_get_vbus_status(musb);
1932 if (vbus < 0) {
1933
1934 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
1935 if ((devctl & MUSB_DEVCTL_VBUS)
1936 == (3 << MUSB_DEVCTL_VBUS_SHIFT))
1937 vbus = 1;
1938 else
1939 vbus = 0;
1940 }
1941 spin_unlock_irqrestore(&musb->lock, flags);
1942 pm_runtime_put_sync(dev);
1943
1944 return sprintf(buf, "Vbus %s, timeout %lu msec\n",
1945 vbus ? "on" : "off", val);
1946}
1947static DEVICE_ATTR_RW(vbus);
1948
1949
1950
1951
1952static ssize_t srp_store(struct device *dev, struct device_attribute *attr,
1953 const char *buf, size_t n)
1954{
1955 struct musb *musb = dev_to_musb(dev);
1956 unsigned short srp;
1957
1958 if (sscanf(buf, "%hu", &srp) != 1
1959 || (srp != 1)) {
1960 dev_err(dev, "SRP: Value must be 1\n");
1961 return -EINVAL;
1962 }
1963
1964 if (srp == 1)
1965 musb_g_wakeup(musb);
1966
1967 return n;
1968}
1969static DEVICE_ATTR_WO(srp);
1970
1971static struct attribute *musb_attrs[] = {
1972 &dev_attr_mode.attr,
1973 &dev_attr_vbus.attr,
1974 &dev_attr_srp.attr,
1975 NULL
1976};
1977ATTRIBUTE_GROUPS(musb);
1978
1979#define MUSB_QUIRK_B_INVALID_VBUS_91 (MUSB_DEVCTL_BDEVICE | \
1980 (2 << MUSB_DEVCTL_VBUS_SHIFT) | \
1981 MUSB_DEVCTL_SESSION)
1982#define MUSB_QUIRK_B_DISCONNECT_99 (MUSB_DEVCTL_BDEVICE | \
1983 (3 << MUSB_DEVCTL_VBUS_SHIFT) | \
1984 MUSB_DEVCTL_SESSION)
1985#define MUSB_QUIRK_A_DISCONNECT_19 ((3 << MUSB_DEVCTL_VBUS_SHIFT) | \
1986 MUSB_DEVCTL_SESSION)
1987
1988static bool musb_state_needs_recheck(struct musb *musb, u8 devctl,
1989 const char *desc)
1990{
1991 if (musb->quirk_retries && !musb->flush_irq_work) {
1992 trace_musb_state(musb, devctl, desc);
1993 schedule_delayed_work(&musb->irq_work,
1994 msecs_to_jiffies(1000));
1995 musb->quirk_retries--;
1996
1997 return true;
1998 }
1999
2000 return false;
2001}
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011static void musb_pm_runtime_check_session(struct musb *musb)
2012{
2013 u8 devctl, s;
2014 int error;
2015
2016 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
2017
2018
2019 s = MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV |
2020 MUSB_DEVCTL_HR;
2021 switch (devctl & ~s) {
2022 case MUSB_QUIRK_B_DISCONNECT_99:
2023 musb_state_needs_recheck(musb, devctl,
2024 "Poll devctl in case of suspend after disconnect");
2025 break;
2026 case MUSB_QUIRK_B_INVALID_VBUS_91:
2027 if (musb_state_needs_recheck(musb, devctl,
2028 "Poll devctl on invalid vbus, assume no session"))
2029 return;
2030 fallthrough;
2031 case MUSB_QUIRK_A_DISCONNECT_19:
2032 if (musb_state_needs_recheck(musb, devctl,
2033 "Poll devctl on possible host mode disconnect"))
2034 return;
2035 if (!musb->session)
2036 break;
2037 trace_musb_state(musb, devctl, "Allow PM on possible host mode disconnect");
2038 pm_runtime_mark_last_busy(musb->controller);
2039 pm_runtime_put_autosuspend(musb->controller);
2040 musb->session = false;
2041 return;
2042 default:
2043 break;
2044 }
2045
2046
2047 s = devctl & MUSB_DEVCTL_SESSION;
2048 if (s == musb->session)
2049 return;
2050
2051
2052 if (s) {
2053 trace_musb_state(musb, devctl, "Block PM on active session");
2054 error = pm_runtime_get_sync(musb->controller);
2055 if (error < 0)
2056 dev_err(musb->controller, "Could not enable: %i\n",
2057 error);
2058 musb->quirk_retries = 3;
2059
2060
2061
2062
2063
2064
2065 if (devctl & MUSB_DEVCTL_BDEVICE)
2066 schedule_delayed_work(&musb->irq_work,
2067 msecs_to_jiffies(3000));
2068 } else {
2069 trace_musb_state(musb, devctl, "Allow PM with no session");
2070 pm_runtime_mark_last_busy(musb->controller);
2071 pm_runtime_put_autosuspend(musb->controller);
2072 }
2073
2074 musb->session = s;
2075}
2076
2077
2078static void musb_irq_work(struct work_struct *data)
2079{
2080 struct musb *musb = container_of(data, struct musb, irq_work.work);
2081 int error;
2082
2083 error = pm_runtime_resume_and_get(musb->controller);
2084 if (error < 0) {
2085 dev_err(musb->controller, "Could not enable: %i\n", error);
2086
2087 return;
2088 }
2089
2090 musb_pm_runtime_check_session(musb);
2091
2092 if (musb->xceiv->otg->state != musb->xceiv_old_state) {
2093 musb->xceiv_old_state = musb->xceiv->otg->state;
2094 sysfs_notify(&musb->controller->kobj, NULL, "mode");
2095 }
2096
2097 pm_runtime_mark_last_busy(musb->controller);
2098 pm_runtime_put_autosuspend(musb->controller);
2099}
2100
2101static void musb_recover_from_babble(struct musb *musb)
2102{
2103 int ret;
2104 u8 devctl;
2105
2106 musb_disable_interrupts(musb);
2107
2108
2109
2110
2111
2112 udelay(10);
2113
2114 ret = musb_platform_recover(musb);
2115 if (ret) {
2116 musb_enable_interrupts(musb);
2117 return;
2118 }
2119
2120
2121 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
2122 devctl &= ~MUSB_DEVCTL_SESSION;
2123 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
2124
2125
2126 musb_root_disconnect(musb);
2127
2128
2129
2130
2131
2132 if (musb->dyn_fifo)
2133 ret = ep_config_from_table(musb);
2134 else
2135 ret = ep_config_from_hw(musb);
2136
2137
2138 if (ret == 0)
2139 musb_start(musb);
2140}
2141
2142
2143
2144
2145
2146static struct musb *allocate_instance(struct device *dev,
2147 const struct musb_hdrc_config *config, void __iomem *mbase)
2148{
2149 struct musb *musb;
2150 struct musb_hw_ep *ep;
2151 int epnum;
2152 int ret;
2153
2154 musb = devm_kzalloc(dev, sizeof(*musb), GFP_KERNEL);
2155 if (!musb)
2156 return NULL;
2157
2158 INIT_LIST_HEAD(&musb->control);
2159 INIT_LIST_HEAD(&musb->in_bulk);
2160 INIT_LIST_HEAD(&musb->out_bulk);
2161 INIT_LIST_HEAD(&musb->pending_list);
2162
2163 musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
2164 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON;
2165 musb->mregs = mbase;
2166 musb->ctrl_base = mbase;
2167 musb->nIrq = -ENODEV;
2168 musb->config = config;
2169 BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS);
2170 for (epnum = 0, ep = musb->endpoints;
2171 epnum < musb->config->num_eps;
2172 epnum++, ep++) {
2173 ep->musb = musb;
2174 ep->epnum = epnum;
2175 }
2176
2177 musb->controller = dev;
2178
2179 ret = musb_host_alloc(musb);
2180 if (ret < 0)
2181 goto err_free;
2182
2183 dev_set_drvdata(dev, musb);
2184
2185 return musb;
2186
2187err_free:
2188 return NULL;
2189}
2190
2191static void musb_free(struct musb *musb)
2192{
2193
2194
2195
2196
2197
2198 if (musb->nIrq >= 0) {
2199 if (musb->irq_wake)
2200 disable_irq_wake(musb->nIrq);
2201 free_irq(musb->nIrq, musb);
2202 }
2203
2204 musb_host_free(musb);
2205}
2206
2207struct musb_pending_work {
2208 int (*callback)(struct musb *musb, void *data);
2209 void *data;
2210 struct list_head node;
2211};
2212
2213#ifdef CONFIG_PM
2214
2215
2216
2217
2218static int musb_run_resume_work(struct musb *musb)
2219{
2220 struct musb_pending_work *w, *_w;
2221 unsigned long flags;
2222 int error = 0;
2223
2224 spin_lock_irqsave(&musb->list_lock, flags);
2225 list_for_each_entry_safe(w, _w, &musb->pending_list, node) {
2226 if (w->callback) {
2227 error = w->callback(musb, w->data);
2228 if (error < 0) {
2229 dev_err(musb->controller,
2230 "resume callback %p failed: %i\n",
2231 w->callback, error);
2232 }
2233 }
2234 list_del(&w->node);
2235 devm_kfree(musb->controller, w);
2236 }
2237 spin_unlock_irqrestore(&musb->list_lock, flags);
2238
2239 return error;
2240}
2241#endif
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251int musb_queue_resume_work(struct musb *musb,
2252 int (*callback)(struct musb *musb, void *data),
2253 void *data)
2254{
2255 struct musb_pending_work *w;
2256 unsigned long flags;
2257 bool is_suspended;
2258 int error;
2259
2260 if (WARN_ON(!callback))
2261 return -EINVAL;
2262
2263 spin_lock_irqsave(&musb->list_lock, flags);
2264 is_suspended = musb->is_runtime_suspended;
2265
2266 if (is_suspended) {
2267 w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC);
2268 if (!w) {
2269 error = -ENOMEM;
2270 goto out_unlock;
2271 }
2272
2273 w->callback = callback;
2274 w->data = data;
2275
2276 list_add_tail(&w->node, &musb->pending_list);
2277 error = 0;
2278 }
2279
2280out_unlock:
2281 spin_unlock_irqrestore(&musb->list_lock, flags);
2282
2283 if (!is_suspended)
2284 error = callback(musb, data);
2285
2286 return error;
2287}
2288EXPORT_SYMBOL_GPL(musb_queue_resume_work);
2289
2290static void musb_deassert_reset(struct work_struct *work)
2291{
2292 struct musb *musb;
2293 unsigned long flags;
2294
2295 musb = container_of(work, struct musb, deassert_reset_work.work);
2296
2297 spin_lock_irqsave(&musb->lock, flags);
2298
2299 if (musb->port1_status & USB_PORT_STAT_RESET)
2300 musb_port_reset(musb, false);
2301
2302 spin_unlock_irqrestore(&musb->lock, flags);
2303}
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313static int
2314musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2315{
2316 int status;
2317 struct musb *musb;
2318 struct musb_hdrc_platform_data *plat = dev_get_platdata(dev);
2319
2320
2321
2322
2323 if (!plat) {
2324 dev_err(dev, "no platform_data?\n");
2325 status = -ENODEV;
2326 goto fail0;
2327 }
2328
2329
2330 musb = allocate_instance(dev, plat->config, ctrl);
2331 if (!musb) {
2332 status = -ENOMEM;
2333 goto fail0;
2334 }
2335
2336 spin_lock_init(&musb->lock);
2337 spin_lock_init(&musb->list_lock);
2338 musb->board_set_power = plat->set_power;
2339 musb->min_power = plat->min_power;
2340 musb->ops = plat->platform_ops;
2341 musb->port_mode = plat->mode;
2342
2343
2344
2345
2346
2347
2348 musb_readb = musb_default_readb;
2349 musb_writeb = musb_default_writeb;
2350 musb_readw = musb_default_readw;
2351 musb_writew = musb_default_writew;
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365 status = musb_platform_init(musb);
2366 if (status < 0)
2367 goto fail1;
2368
2369 if (!musb->isr) {
2370 status = -ENODEV;
2371 goto fail2;
2372 }
2373
2374
2375
2376 if (musb->ops->quirks & MUSB_INDEXED_EP) {
2377 musb->io.ep_offset = musb_indexed_ep_offset;
2378 musb->io.ep_select = musb_indexed_ep_select;
2379 } else {
2380 musb->io.ep_offset = musb_flat_ep_offset;
2381 musb->io.ep_select = musb_flat_ep_select;
2382 }
2383
2384 if (musb->ops->quirks & MUSB_G_NO_SKB_RESERVE)
2385 musb->g.quirk_avoids_skb_reserve = 1;
2386
2387
2388 if (musb->ops->ep_offset)
2389 musb->io.ep_offset = musb->ops->ep_offset;
2390 if (musb->ops->ep_select)
2391 musb->io.ep_select = musb->ops->ep_select;
2392
2393 if (musb->ops->fifo_mode)
2394 fifo_mode = musb->ops->fifo_mode;
2395 else
2396 fifo_mode = 4;
2397
2398 if (musb->ops->fifo_offset)
2399 musb->io.fifo_offset = musb->ops->fifo_offset;
2400 else
2401 musb->io.fifo_offset = musb_default_fifo_offset;
2402
2403 if (musb->ops->busctl_offset)
2404 musb->io.busctl_offset = musb->ops->busctl_offset;
2405 else
2406 musb->io.busctl_offset = musb_default_busctl_offset;
2407
2408 if (musb->ops->readb)
2409 musb_readb = musb->ops->readb;
2410 if (musb->ops->writeb)
2411 musb_writeb = musb->ops->writeb;
2412 if (musb->ops->clearb)
2413 musb_clearb = musb->ops->clearb;
2414 else
2415 musb_clearb = musb_readb;
2416
2417 if (musb->ops->readw)
2418 musb_readw = musb->ops->readw;
2419 if (musb->ops->writew)
2420 musb_writew = musb->ops->writew;
2421 if (musb->ops->clearw)
2422 musb_clearw = musb->ops->clearw;
2423 else
2424 musb_clearw = musb_readw;
2425
2426#ifndef CONFIG_MUSB_PIO_ONLY
2427 if (!musb->ops->dma_init || !musb->ops->dma_exit) {
2428 dev_err(dev, "DMA controller not set\n");
2429 status = -ENODEV;
2430 goto fail2;
2431 }
2432 musb_dma_controller_create = musb->ops->dma_init;
2433 musb_dma_controller_destroy = musb->ops->dma_exit;
2434#endif
2435
2436 if (musb->ops->read_fifo)
2437 musb->io.read_fifo = musb->ops->read_fifo;
2438 else
2439 musb->io.read_fifo = musb_default_read_fifo;
2440
2441 if (musb->ops->write_fifo)
2442 musb->io.write_fifo = musb->ops->write_fifo;
2443 else
2444 musb->io.write_fifo = musb_default_write_fifo;
2445
2446 if (musb->ops->get_toggle)
2447 musb->io.get_toggle = musb->ops->get_toggle;
2448 else
2449 musb->io.get_toggle = musb_default_get_toggle;
2450
2451 if (musb->ops->set_toggle)
2452 musb->io.set_toggle = musb->ops->set_toggle;
2453 else
2454 musb->io.set_toggle = musb_default_set_toggle;
2455
2456 if (!musb->xceiv->io_ops) {
2457 musb->xceiv->io_dev = musb->controller;
2458 musb->xceiv->io_priv = musb->mregs;
2459 musb->xceiv->io_ops = &musb_ulpi_access;
2460 }
2461
2462 if (musb->ops->phy_callback)
2463 musb_phy_callback = musb->ops->phy_callback;
2464
2465
2466
2467
2468
2469
2470
2471
2472 pm_runtime_use_autosuspend(musb->controller);
2473 pm_runtime_set_autosuspend_delay(musb->controller, 500);
2474 pm_runtime_enable(musb->controller);
2475 pm_runtime_get_sync(musb->controller);
2476
2477 status = usb_phy_init(musb->xceiv);
2478 if (status < 0)
2479 goto err_usb_phy_init;
2480
2481 if (use_dma && dev->dma_mask) {
2482 musb->dma_controller =
2483 musb_dma_controller_create(musb, musb->mregs);
2484 if (IS_ERR(musb->dma_controller)) {
2485 status = PTR_ERR(musb->dma_controller);
2486 goto fail2_5;
2487 }
2488 }
2489
2490
2491 musb_platform_disable(musb);
2492 musb_disable_interrupts(musb);
2493 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2494
2495
2496 musb_writeb(musb->mregs, MUSB_POWER, 0);
2497
2498
2499 INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work);
2500 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset);
2501 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume);
2502
2503
2504 status = musb_core_init(plat->config->multipoint
2505 ? MUSB_CONTROLLER_MHDRC
2506 : MUSB_CONTROLLER_HDRC, musb);
2507 if (status < 0)
2508 goto fail3;
2509
2510 timer_setup(&musb->otg_timer, musb_otg_timer_func, 0);
2511
2512
2513 if (request_irq(nIrq, musb->isr, IRQF_SHARED, dev_name(dev), musb)) {
2514 dev_err(dev, "request_irq %d failed!\n", nIrq);
2515 status = -ENODEV;
2516 goto fail3;
2517 }
2518 musb->nIrq = nIrq;
2519
2520 if (enable_irq_wake(nIrq) == 0) {
2521 musb->irq_wake = 1;
2522 device_init_wakeup(dev, 1);
2523 } else {
2524 musb->irq_wake = 0;
2525 }
2526
2527
2528 if (plat->extvbus) {
2529 u8 busctl = musb_readb(musb->mregs, MUSB_ULPI_BUSCONTROL);
2530 busctl |= MUSB_ULPI_USE_EXTVBUS;
2531 musb_writeb(musb->mregs, MUSB_ULPI_BUSCONTROL, busctl);
2532 }
2533
2534 MUSB_DEV_MODE(musb);
2535 musb->xceiv->otg->state = OTG_STATE_B_IDLE;
2536
2537 switch (musb->port_mode) {
2538 case MUSB_HOST:
2539 status = musb_host_setup(musb, plat->power);
2540 if (status < 0)
2541 goto fail3;
2542 status = musb_platform_set_mode(musb, MUSB_HOST);
2543 break;
2544 case MUSB_PERIPHERAL:
2545 status = musb_gadget_setup(musb);
2546 if (status < 0)
2547 goto fail3;
2548 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL);
2549 break;
2550 case MUSB_OTG:
2551 status = musb_host_setup(musb, plat->power);
2552 if (status < 0)
2553 goto fail3;
2554 status = musb_gadget_setup(musb);
2555 if (status) {
2556 musb_host_cleanup(musb);
2557 goto fail3;
2558 }
2559 status = musb_platform_set_mode(musb, MUSB_OTG);
2560 break;
2561 default:
2562 dev_err(dev, "unsupported port mode %d\n", musb->port_mode);
2563 break;
2564 }
2565
2566 if (status < 0)
2567 goto fail3;
2568
2569 musb_init_debugfs(musb);
2570
2571 musb->is_initialized = 1;
2572 pm_runtime_mark_last_busy(musb->controller);
2573 pm_runtime_put_autosuspend(musb->controller);
2574
2575 return 0;
2576
2577fail3:
2578 cancel_delayed_work_sync(&musb->irq_work);
2579 cancel_delayed_work_sync(&musb->finish_resume_work);
2580 cancel_delayed_work_sync(&musb->deassert_reset_work);
2581 if (musb->dma_controller)
2582 musb_dma_controller_destroy(musb->dma_controller);
2583
2584fail2_5:
2585 usb_phy_shutdown(musb->xceiv);
2586
2587err_usb_phy_init:
2588 pm_runtime_dont_use_autosuspend(musb->controller);
2589 pm_runtime_put_sync(musb->controller);
2590 pm_runtime_disable(musb->controller);
2591
2592fail2:
2593 if (musb->irq_wake)
2594 device_init_wakeup(dev, 0);
2595 musb_platform_exit(musb);
2596
2597fail1:
2598 if (status != -EPROBE_DEFER)
2599 dev_err(musb->controller,
2600 "%s failed with status %d\n", __func__, status);
2601
2602 musb_free(musb);
2603
2604fail0:
2605
2606 return status;
2607
2608}
2609
2610
2611
2612
2613
2614
2615static int musb_probe(struct platform_device *pdev)
2616{
2617 struct device *dev = &pdev->dev;
2618 int irq = platform_get_irq_byname(pdev, "mc");
2619 void __iomem *base;
2620
2621 if (irq <= 0)
2622 return -ENODEV;
2623
2624 base = devm_platform_ioremap_resource(pdev, 0);
2625 if (IS_ERR(base))
2626 return PTR_ERR(base);
2627
2628 return musb_init_controller(dev, irq, base);
2629}
2630
2631static int musb_remove(struct platform_device *pdev)
2632{
2633 struct device *dev = &pdev->dev;
2634 struct musb *musb = dev_to_musb(dev);
2635 unsigned long flags;
2636
2637
2638
2639
2640
2641
2642 musb_exit_debugfs(musb);
2643
2644 cancel_delayed_work_sync(&musb->irq_work);
2645 cancel_delayed_work_sync(&musb->finish_resume_work);
2646 cancel_delayed_work_sync(&musb->deassert_reset_work);
2647 pm_runtime_get_sync(musb->controller);
2648 musb_host_cleanup(musb);
2649 musb_gadget_cleanup(musb);
2650
2651 musb_platform_disable(musb);
2652 spin_lock_irqsave(&musb->lock, flags);
2653 musb_disable_interrupts(musb);
2654 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2655 spin_unlock_irqrestore(&musb->lock, flags);
2656 musb_platform_exit(musb);
2657
2658 pm_runtime_dont_use_autosuspend(musb->controller);
2659 pm_runtime_put_sync(musb->controller);
2660 pm_runtime_disable(musb->controller);
2661 musb_phy_callback = NULL;
2662 if (musb->dma_controller)
2663 musb_dma_controller_destroy(musb->dma_controller);
2664 usb_phy_shutdown(musb->xceiv);
2665 musb_free(musb);
2666 device_init_wakeup(dev, 0);
2667 return 0;
2668}
2669
2670#ifdef CONFIG_PM
2671
2672static void musb_save_context(struct musb *musb)
2673{
2674 int i;
2675 void __iomem *musb_base = musb->mregs;
2676 void __iomem *epio;
2677
2678 musb->context.frame = musb_readw(musb_base, MUSB_FRAME);
2679 musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE);
2680 musb->context.busctl = musb_readb(musb_base, MUSB_ULPI_BUSCONTROL);
2681 musb->context.power = musb_readb(musb_base, MUSB_POWER);
2682 musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE);
2683 musb->context.index = musb_readb(musb_base, MUSB_INDEX);
2684 musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL);
2685
2686 for (i = 0; i < musb->config->num_eps; ++i) {
2687 struct musb_hw_ep *hw_ep;
2688
2689 hw_ep = &musb->endpoints[i];
2690 if (!hw_ep)
2691 continue;
2692
2693 epio = hw_ep->regs;
2694 if (!epio)
2695 continue;
2696
2697 musb_writeb(musb_base, MUSB_INDEX, i);
2698 musb->context.index_regs[i].txmaxp =
2699 musb_readw(epio, MUSB_TXMAXP);
2700 musb->context.index_regs[i].txcsr =
2701 musb_readw(epio, MUSB_TXCSR);
2702 musb->context.index_regs[i].rxmaxp =
2703 musb_readw(epio, MUSB_RXMAXP);
2704 musb->context.index_regs[i].rxcsr =
2705 musb_readw(epio, MUSB_RXCSR);
2706
2707 if (musb->dyn_fifo) {
2708 musb->context.index_regs[i].txfifoadd =
2709 musb_readw(musb_base, MUSB_TXFIFOADD);
2710 musb->context.index_regs[i].rxfifoadd =
2711 musb_readw(musb_base, MUSB_RXFIFOADD);
2712 musb->context.index_regs[i].txfifosz =
2713 musb_readb(musb_base, MUSB_TXFIFOSZ);
2714 musb->context.index_regs[i].rxfifosz =
2715 musb_readb(musb_base, MUSB_RXFIFOSZ);
2716 }
2717
2718 musb->context.index_regs[i].txtype =
2719 musb_readb(epio, MUSB_TXTYPE);
2720 musb->context.index_regs[i].txinterval =
2721 musb_readb(epio, MUSB_TXINTERVAL);
2722 musb->context.index_regs[i].rxtype =
2723 musb_readb(epio, MUSB_RXTYPE);
2724 musb->context.index_regs[i].rxinterval =
2725 musb_readb(epio, MUSB_RXINTERVAL);
2726
2727 musb->context.index_regs[i].txfunaddr =
2728 musb_read_txfunaddr(musb, i);
2729 musb->context.index_regs[i].txhubaddr =
2730 musb_read_txhubaddr(musb, i);
2731 musb->context.index_regs[i].txhubport =
2732 musb_read_txhubport(musb, i);
2733
2734 musb->context.index_regs[i].rxfunaddr =
2735 musb_read_rxfunaddr(musb, i);
2736 musb->context.index_regs[i].rxhubaddr =
2737 musb_read_rxhubaddr(musb, i);
2738 musb->context.index_regs[i].rxhubport =
2739 musb_read_rxhubport(musb, i);
2740 }
2741}
2742
2743static void musb_restore_context(struct musb *musb)
2744{
2745 int i;
2746 void __iomem *musb_base = musb->mregs;
2747 void __iomem *epio;
2748 u8 power;
2749
2750 musb_writew(musb_base, MUSB_FRAME, musb->context.frame);
2751 musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode);
2752 musb_writeb(musb_base, MUSB_ULPI_BUSCONTROL, musb->context.busctl);
2753
2754
2755 power = musb_readb(musb_base, MUSB_POWER);
2756 power &= MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME;
2757 musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME);
2758 power |= musb->context.power;
2759 musb_writeb(musb_base, MUSB_POWER, power);
2760
2761 musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe);
2762 musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe);
2763 musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe);
2764 if (musb->context.devctl & MUSB_DEVCTL_SESSION)
2765 musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
2766
2767 for (i = 0; i < musb->config->num_eps; ++i) {
2768 struct musb_hw_ep *hw_ep;
2769
2770 hw_ep = &musb->endpoints[i];
2771 if (!hw_ep)
2772 continue;
2773
2774 epio = hw_ep->regs;
2775 if (!epio)
2776 continue;
2777
2778 musb_writeb(musb_base, MUSB_INDEX, i);
2779 musb_writew(epio, MUSB_TXMAXP,
2780 musb->context.index_regs[i].txmaxp);
2781 musb_writew(epio, MUSB_TXCSR,
2782 musb->context.index_regs[i].txcsr);
2783 musb_writew(epio, MUSB_RXMAXP,
2784 musb->context.index_regs[i].rxmaxp);
2785 musb_writew(epio, MUSB_RXCSR,
2786 musb->context.index_regs[i].rxcsr);
2787
2788 if (musb->dyn_fifo) {
2789 musb_writeb(musb_base, MUSB_TXFIFOSZ,
2790 musb->context.index_regs[i].txfifosz);
2791 musb_writeb(musb_base, MUSB_RXFIFOSZ,
2792 musb->context.index_regs[i].rxfifosz);
2793 musb_writew(musb_base, MUSB_TXFIFOADD,
2794 musb->context.index_regs[i].txfifoadd);
2795 musb_writew(musb_base, MUSB_RXFIFOADD,
2796 musb->context.index_regs[i].rxfifoadd);
2797 }
2798
2799 musb_writeb(epio, MUSB_TXTYPE,
2800 musb->context.index_regs[i].txtype);
2801 musb_writeb(epio, MUSB_TXINTERVAL,
2802 musb->context.index_regs[i].txinterval);
2803 musb_writeb(epio, MUSB_RXTYPE,
2804 musb->context.index_regs[i].rxtype);
2805 musb_writeb(epio, MUSB_RXINTERVAL,
2806
2807 musb->context.index_regs[i].rxinterval);
2808 musb_write_txfunaddr(musb, i,
2809 musb->context.index_regs[i].txfunaddr);
2810 musb_write_txhubaddr(musb, i,
2811 musb->context.index_regs[i].txhubaddr);
2812 musb_write_txhubport(musb, i,
2813 musb->context.index_regs[i].txhubport);
2814
2815 musb_write_rxfunaddr(musb, i,
2816 musb->context.index_regs[i].rxfunaddr);
2817 musb_write_rxhubaddr(musb, i,
2818 musb->context.index_regs[i].rxhubaddr);
2819 musb_write_rxhubport(musb, i,
2820 musb->context.index_regs[i].rxhubport);
2821 }
2822 musb_writeb(musb_base, MUSB_INDEX, musb->context.index);
2823}
2824
2825static int musb_suspend(struct device *dev)
2826{
2827 struct musb *musb = dev_to_musb(dev);
2828 unsigned long flags;
2829 int ret;
2830
2831 ret = pm_runtime_get_sync(dev);
2832 if (ret < 0) {
2833 pm_runtime_put_noidle(dev);
2834 return ret;
2835 }
2836
2837 musb_platform_disable(musb);
2838 musb_disable_interrupts(musb);
2839
2840 musb->flush_irq_work = true;
2841 while (flush_delayed_work(&musb->irq_work))
2842 ;
2843 musb->flush_irq_work = false;
2844
2845 if (!(musb->ops->quirks & MUSB_PRESERVE_SESSION))
2846 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2847
2848 WARN_ON(!list_empty(&musb->pending_list));
2849
2850 spin_lock_irqsave(&musb->lock, flags);
2851
2852 if (is_peripheral_active(musb)) {
2853
2854
2855
2856 } else if (is_host_active(musb)) {
2857
2858
2859
2860 }
2861
2862 musb_save_context(musb);
2863
2864 spin_unlock_irqrestore(&musb->lock, flags);
2865 return 0;
2866}
2867
2868static int musb_resume(struct device *dev)
2869{
2870 struct musb *musb = dev_to_musb(dev);
2871 unsigned long flags;
2872 int error;
2873 u8 devctl;
2874 u8 mask;
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886 musb_restore_context(musb);
2887
2888 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
2889 mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV;
2890 if ((devctl & mask) != (musb->context.devctl & mask))
2891 musb->port1_status = 0;
2892
2893 musb_enable_interrupts(musb);
2894 musb_platform_enable(musb);
2895
2896
2897 if (musb->port_mode == MUSB_HOST &&
2898 !(musb->ops->quirks & MUSB_PRESERVE_SESSION)) {
2899 devctl |= MUSB_DEVCTL_SESSION;
2900 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
2901 }
2902
2903 spin_lock_irqsave(&musb->lock, flags);
2904 error = musb_run_resume_work(musb);
2905 if (error)
2906 dev_err(musb->controller, "resume work failed with %i\n",
2907 error);
2908 spin_unlock_irqrestore(&musb->lock, flags);
2909
2910 pm_runtime_mark_last_busy(dev);
2911 pm_runtime_put_autosuspend(dev);
2912
2913 return 0;
2914}
2915
2916static int musb_runtime_suspend(struct device *dev)
2917{
2918 struct musb *musb = dev_to_musb(dev);
2919
2920 musb_save_context(musb);
2921 musb->is_runtime_suspended = 1;
2922
2923 return 0;
2924}
2925
2926static int musb_runtime_resume(struct device *dev)
2927{
2928 struct musb *musb = dev_to_musb(dev);
2929 unsigned long flags;
2930 int error;
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941 if (!musb->is_initialized)
2942 return 0;
2943
2944 musb_restore_context(musb);
2945
2946 spin_lock_irqsave(&musb->lock, flags);
2947 error = musb_run_resume_work(musb);
2948 if (error)
2949 dev_err(musb->controller, "resume work failed with %i\n",
2950 error);
2951 musb->is_runtime_suspended = 0;
2952 spin_unlock_irqrestore(&musb->lock, flags);
2953
2954 return 0;
2955}
2956
2957static const struct dev_pm_ops musb_dev_pm_ops = {
2958 .suspend = musb_suspend,
2959 .resume = musb_resume,
2960 .runtime_suspend = musb_runtime_suspend,
2961 .runtime_resume = musb_runtime_resume,
2962};
2963
2964#define MUSB_DEV_PM_OPS (&musb_dev_pm_ops)
2965#else
2966#define MUSB_DEV_PM_OPS NULL
2967#endif
2968
2969static struct platform_driver musb_driver = {
2970 .driver = {
2971 .name = musb_driver_name,
2972 .bus = &platform_bus_type,
2973 .pm = MUSB_DEV_PM_OPS,
2974 .dev_groups = musb_groups,
2975 },
2976 .probe = musb_probe,
2977 .remove = musb_remove,
2978};
2979
2980module_platform_driver(musb_driver);
2981