Lines Matching refs:musb
21 #define next_ep0_request(musb) next_in_request(&(musb)->endpoints[0]) argument
51 struct musb *musb, in service_tx_status_request() argument
54 void __iomem *mbase = musb->mregs; in service_tx_status_request()
63 result[0] = musb->g.is_selfpowered << USB_DEVICE_SELF_POWERED; in service_tx_status_request()
64 result[0] |= musb->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; in service_tx_status_request()
65 if (musb->g.is_otg) { in service_tx_status_request()
66 result[0] |= musb->g.b_hnp_enable in service_tx_status_request()
68 result[0] |= musb->g.a_alt_hnp_support in service_tx_status_request()
70 result[0] |= musb->g.a_hnp_support in service_tx_status_request()
99 ep = &musb->endpoints[epnum].ep_in; in service_tx_status_request()
101 ep = &musb->endpoints[epnum].ep_out; in service_tx_status_request()
102 regs = musb->endpoints[epnum].regs; in service_tx_status_request()
133 musb_write_fifo(&musb->endpoints[0], len, result); in service_tx_status_request()
151 service_in_request(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest) in service_in_request() argument
159 handled = service_tx_status_request(musb, in service_in_request()
175 static void musb_g_ep0_giveback(struct musb *musb, struct usb_request *req) in musb_g_ep0_giveback() argument
177 musb_g_giveback(&musb->endpoints[0].ep_in, req, 0); in musb_g_ep0_giveback()
183 static inline void musb_try_b_hnp_enable(struct musb *musb) in musb_try_b_hnp_enable() argument
185 void __iomem *mbase = musb->mregs; in musb_try_b_hnp_enable()
188 musb_dbg(musb, "HNP: Setting HR"); in musb_try_b_hnp_enable()
204 service_zero_data_request(struct musb *musb, in service_zero_data_request() argument
206 __releases(musb->lock) in service_zero_data_request()
207 __acquires(musb->lock) in service_zero_data_request()
210 void __iomem *mbase = musb->mregs; in service_zero_data_request()
219 musb->set_address = true; in service_zero_data_request()
220 musb->address = (u8) (ctrlrequest->wValue & 0x7f); in service_zero_data_request()
230 musb->may_wakeup = 0; in service_zero_data_request()
249 ep = musb->endpoints + epnum; in service_zero_data_request()
285 musb_dbg(musb, "restarting the request"); in service_zero_data_request()
286 musb_ep_restart(musb, request); in service_zero_data_request()
305 musb->may_wakeup = 1; in service_zero_data_request()
308 if (musb->g.speed != USB_SPEED_HIGH) in service_zero_data_request()
316 musb->test_mode_nr = in service_zero_data_request()
321 musb->test_mode_nr = in service_zero_data_request()
326 musb->test_mode_nr = in service_zero_data_request()
331 musb->test_mode_nr = in service_zero_data_request()
338 musb->test_mode_nr = in service_zero_data_request()
344 musb->test_mode_nr = in service_zero_data_request()
350 musb->test_mode_nr = in service_zero_data_request()
356 musb->test_mode_nr = in service_zero_data_request()
365 musb->test_mode = true; in service_zero_data_request()
368 if (!musb->g.is_otg) in service_zero_data_request()
370 musb->g.b_hnp_enable = 1; in service_zero_data_request()
371 musb_try_b_hnp_enable(musb); in service_zero_data_request()
374 if (!musb->g.is_otg) in service_zero_data_request()
376 musb->g.a_hnp_support = 1; in service_zero_data_request()
379 if (!musb->g.is_otg) in service_zero_data_request()
381 musb->g.a_alt_hnp_support = 1; in service_zero_data_request()
409 ep = musb->endpoints + epnum; in service_zero_data_request()
460 static void ep0_rxstate(struct musb *musb) in ep0_rxstate() argument
462 void __iomem *regs = musb->control_ep->regs; in ep0_rxstate()
467 request = next_ep0_request(musb); in ep0_rxstate()
484 musb_read_fifo(&musb->endpoints[0], count, buf); in ep0_rxstate()
489 musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; in ep0_rxstate()
501 musb->ackpend = csr; in ep0_rxstate()
502 musb_g_ep0_giveback(musb, req); in ep0_rxstate()
503 if (!musb->ackpend) in ep0_rxstate()
505 musb->ackpend = 0; in ep0_rxstate()
507 musb_ep_select(musb->mregs, 0); in ep0_rxstate()
517 static void ep0_txstate(struct musb *musb) in ep0_txstate() argument
519 void __iomem *regs = musb->control_ep->regs; in ep0_txstate()
520 struct musb_request *req = next_ep0_request(musb); in ep0_txstate()
528 musb_dbg(musb, "odd; csr0 %04x", musb_readw(regs, MUSB_CSR0)); in ep0_txstate()
538 musb_write_fifo(&musb->endpoints[0], fifo_count, fifo_src); in ep0_txstate()
545 musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; in ep0_txstate()
556 musb->ackpend = csr; in ep0_txstate()
557 musb_g_ep0_giveback(musb, request); in ep0_txstate()
558 if (!musb->ackpend) in ep0_txstate()
560 musb->ackpend = 0; in ep0_txstate()
564 musb_ep_select(musb->mregs, 0); in ep0_txstate()
575 musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req) in musb_read_setup() argument
578 void __iomem *regs = musb->control_ep->regs; in musb_read_setup()
580 musb_read_fifo(&musb->endpoints[0], sizeof *req, (u8 *)req); in musb_read_setup()
585 musb_dbg(musb, "SETUP req%02x.%02x v%04x i%04x l%d", in musb_read_setup()
593 r = next_ep0_request(musb); in musb_read_setup()
595 musb_g_ep0_giveback(musb, &r->request); in musb_read_setup()
605 musb->set_address = false; in musb_read_setup()
606 musb->ackpend = MUSB_CSR0_P_SVDRXPKTRDY; in musb_read_setup()
609 musb->ackpend |= MUSB_CSR0_TXPKTRDY; in musb_read_setup()
610 musb->ep0_state = MUSB_EP0_STAGE_ACKWAIT; in musb_read_setup()
612 musb->ep0_state = MUSB_EP0_STAGE_TX; in musb_read_setup()
617 musb->ackpend = 0; in musb_read_setup()
619 musb->ep0_state = MUSB_EP0_STAGE_RX; in musb_read_setup()
623 forward_to_driver(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest) in forward_to_driver() argument
624 __releases(musb->lock) in forward_to_driver()
625 __acquires(musb->lock) in forward_to_driver()
628 if (!musb->gadget_driver) in forward_to_driver()
630 spin_unlock(&musb->lock); in forward_to_driver()
631 retval = musb->gadget_driver->setup(&musb->g, ctrlrequest); in forward_to_driver()
632 spin_lock(&musb->lock); in forward_to_driver()
641 irqreturn_t musb_g_ep0_irq(struct musb *musb) in musb_g_ep0_irq() argument
645 void __iomem *mbase = musb->mregs; in musb_g_ep0_irq()
646 void __iomem *regs = musb->endpoints[0].regs; in musb_g_ep0_irq()
653 musb_dbg(musb, "csr %04x, count %d, ep0stage %s", in musb_g_ep0_irq()
654 csr, len, decode_ep0stage(musb->ep0_state)); in musb_g_ep0_irq()
669 musb->ep0_state = MUSB_EP0_STAGE_IDLE; in musb_g_ep0_irq()
678 switch (musb->ep0_state) { in musb_g_ep0_irq()
680 musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; in musb_g_ep0_irq()
683 musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; in musb_g_ep0_irq()
687 decode_ep0stage(musb->ep0_state)); in musb_g_ep0_irq()
697 switch (musb->ep0_state) { in musb_g_ep0_irq()
702 ep0_txstate(musb); in musb_g_ep0_irq()
710 ep0_rxstate(musb); in musb_g_ep0_irq()
723 if (musb->set_address) { in musb_g_ep0_irq()
724 musb->set_address = false; in musb_g_ep0_irq()
725 musb_writeb(mbase, MUSB_FADDR, musb->address); in musb_g_ep0_irq()
729 else if (musb->test_mode) { in musb_g_ep0_irq()
730 musb_dbg(musb, "entering TESTMODE"); in musb_g_ep0_irq()
732 if (MUSB_TEST_PACKET == musb->test_mode_nr) in musb_g_ep0_irq()
733 musb_load_testpacket(musb); in musb_g_ep0_irq()
736 musb->test_mode_nr); in musb_g_ep0_irq()
745 req = next_ep0_request(musb); in musb_g_ep0_irq()
747 musb_g_ep0_giveback(musb, &req->request); in musb_g_ep0_irq()
758 musb->ep0_state = MUSB_EP0_STAGE_IDLE; in musb_g_ep0_irq()
769 musb->ep0_state = MUSB_EP0_STAGE_SETUP; in musb_g_ep0_irq()
782 musb_read_setup(musb, &setup); in musb_g_ep0_irq()
786 if (unlikely(musb->g.speed == USB_SPEED_UNKNOWN)) { in musb_g_ep0_irq()
793 musb->g.speed = (power & MUSB_POWER_HSMODE) in musb_g_ep0_irq()
798 switch (musb->ep0_state) { in musb_g_ep0_irq()
807 musb, &setup); in musb_g_ep0_irq()
815 musb->ackpend |= MUSB_CSR0_P_DATAEND; in musb_g_ep0_irq()
819 musb->ep0_state = in musb_g_ep0_irq()
828 handled = service_in_request(musb, &setup); in musb_g_ep0_irq()
830 musb->ackpend = MUSB_CSR0_TXPKTRDY in musb_g_ep0_irq()
832 musb->ep0_state = in musb_g_ep0_irq()
842 musb_dbg(musb, "handled %d, csr %04x, ep0stage %s", in musb_g_ep0_irq()
844 decode_ep0stage(musb->ep0_state)); in musb_g_ep0_irq()
855 handled = forward_to_driver(musb, &setup); in musb_g_ep0_irq()
859 musb_dbg(musb, "stall (%d)", handled); in musb_g_ep0_irq()
860 musb->ackpend |= MUSB_CSR0_P_SENDSTALL; in musb_g_ep0_irq()
861 musb->ep0_state = MUSB_EP0_STAGE_IDLE; in musb_g_ep0_irq()
864 musb->ackpend); in musb_g_ep0_irq()
865 musb->ackpend = 0; in musb_g_ep0_irq()
881 musb->ep0_state = MUSB_EP0_STAGE_IDLE; in musb_g_ep0_irq()
907 struct musb *musb; in musb_g_ep0_queue() local
916 musb = ep->musb; in musb_g_ep0_queue()
917 regs = musb->control_ep->regs; in musb_g_ep0_queue()
920 req->musb = musb; in musb_g_ep0_queue()
925 spin_lock_irqsave(&musb->lock, lockflags); in musb_g_ep0_queue()
932 switch (musb->ep0_state) { in musb_g_ep0_queue()
939 musb_dbg(musb, "ep0 request queued in state %d", in musb_g_ep0_queue()
940 musb->ep0_state); in musb_g_ep0_queue()
948 musb_dbg(musb, "queue to %s (%s), length=%d", in musb_g_ep0_queue()
952 musb_ep_select(musb->mregs, 0); in musb_g_ep0_queue()
955 if (musb->ep0_state == MUSB_EP0_STAGE_TX) in musb_g_ep0_queue()
956 ep0_txstate(musb); in musb_g_ep0_queue()
959 else if (musb->ep0_state == MUSB_EP0_STAGE_ACKWAIT) { in musb_g_ep0_queue()
963 musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; in musb_g_ep0_queue()
965 musb->ackpend | MUSB_CSR0_P_DATAEND); in musb_g_ep0_queue()
966 musb->ackpend = 0; in musb_g_ep0_queue()
967 musb_g_ep0_giveback(ep->musb, r); in musb_g_ep0_queue()
974 } else if (musb->ackpend) { in musb_g_ep0_queue()
975 musb_writew(regs, MUSB_CSR0, musb->ackpend); in musb_g_ep0_queue()
976 musb->ackpend = 0; in musb_g_ep0_queue()
980 spin_unlock_irqrestore(&musb->lock, lockflags); in musb_g_ep0_queue()
993 struct musb *musb; in musb_g_ep0_halt() local
1003 musb = ep->musb; in musb_g_ep0_halt()
1004 base = musb->mregs; in musb_g_ep0_halt()
1005 regs = musb->control_ep->regs; in musb_g_ep0_halt()
1008 spin_lock_irqsave(&musb->lock, flags); in musb_g_ep0_halt()
1016 csr = musb->ackpend; in musb_g_ep0_halt()
1018 switch (musb->ep0_state) { in musb_g_ep0_halt()
1037 musb->ep0_state = MUSB_EP0_STAGE_IDLE; in musb_g_ep0_halt()
1038 musb->ackpend = 0; in musb_g_ep0_halt()
1041 musb_dbg(musb, "ep0 can't halt in state %d", musb->ep0_state); in musb_g_ep0_halt()
1046 spin_unlock_irqrestore(&musb->lock, flags); in musb_g_ep0_halt()