Lines Matching refs:musb

104 static inline struct musb *dev_to_musb(struct device *dev)  in dev_to_musb()
283 struct musb *musb = hw_ep->musb; in musb_default_write_fifo() local
291 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_write_fifo()
327 struct musb *musb = hw_ep->musb; in musb_default_read_fifo() local
333 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_read_fifo()
397 (*musb_dma_controller_create)(struct musb *musb, void __iomem *base);
409 return hw_ep->musb->io.read_fifo(hw_ep, len, dst); in musb_read_fifo()
414 return hw_ep->musb->io.write_fifo(hw_ep, len, src); in musb_write_fifo()
439 void musb_load_testpacket(struct musb *musb) in musb_load_testpacket() argument
441 void __iomem *regs = musb->endpoints[0].regs; in musb_load_testpacket()
443 musb_ep_select(musb->mregs, 0); in musb_load_testpacket()
444 musb_write_fifo(musb->control_ep, in musb_load_testpacket()
456 struct musb *musb = from_timer(musb, t, otg_timer); in musb_otg_timer_func() local
459 spin_lock_irqsave(&musb->lock, flags); in musb_otg_timer_func()
460 switch (musb->xceiv->otg->state) { in musb_otg_timer_func()
462 musb_dbg(musb, in musb_otg_timer_func()
464 musb_g_disconnect(musb); in musb_otg_timer_func()
465 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_otg_timer_func()
466 musb->is_active = 0; in musb_otg_timer_func()
470 musb_dbg(musb, "HNP: %s timeout", in musb_otg_timer_func()
471 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
472 musb_platform_set_vbus(musb, 0); in musb_otg_timer_func()
473 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL; in musb_otg_timer_func()
476 musb_dbg(musb, "HNP: Unhandled mode %s", in musb_otg_timer_func()
477 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
479 spin_unlock_irqrestore(&musb->lock, flags); in musb_otg_timer_func()
485 void musb_hnp_stop(struct musb *musb) in musb_hnp_stop() argument
487 struct usb_hcd *hcd = musb->hcd; in musb_hnp_stop()
488 void __iomem *mbase = musb->mregs; in musb_hnp_stop()
491 musb_dbg(musb, "HNP: stop from %s", in musb_hnp_stop()
492 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
494 switch (musb->xceiv->otg->state) { in musb_hnp_stop()
496 musb_g_disconnect(musb); in musb_hnp_stop()
497 musb_dbg(musb, "HNP: back to %s", in musb_hnp_stop()
498 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
501 musb_dbg(musb, "HNP: Disabling HR"); in musb_hnp_stop()
504 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_hnp_stop()
505 MUSB_DEV_MODE(musb); in musb_hnp_stop()
512 musb_dbg(musb, "HNP: Stopping in unknown state %s", in musb_hnp_stop()
513 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
521 musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16); in musb_hnp_stop()
524 static void musb_recover_from_babble(struct musb *musb);
526 static void musb_handle_intr_resume(struct musb *musb, u8 devctl) in musb_handle_intr_resume() argument
528 musb_dbg(musb, "RESUME (%s)", in musb_handle_intr_resume()
529 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
532 switch (musb->xceiv->otg->state) { in musb_handle_intr_resume()
535 musb->port1_status |= in musb_handle_intr_resume()
538 musb->rh_timer = jiffies in musb_handle_intr_resume()
540 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_resume()
541 musb->is_active = 1; in musb_handle_intr_resume()
542 musb_host_resume_root_hub(musb); in musb_handle_intr_resume()
543 schedule_delayed_work(&musb->finish_resume_work, in musb_handle_intr_resume()
547 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_resume()
548 musb->is_active = 1; in musb_handle_intr_resume()
549 MUSB_DEV_MODE(musb); in musb_handle_intr_resume()
554 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
557 switch (musb->xceiv->otg->state) { in musb_handle_intr_resume()
560 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_resume()
561 musb_host_resume_root_hub(musb); in musb_handle_intr_resume()
571 musb->int_usb |= MUSB_INTR_DISCONNECT; in musb_handle_intr_resume()
572 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
575 musb_g_resume(musb); in musb_handle_intr_resume()
578 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
583 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
589 static irqreturn_t musb_handle_intr_sessreq(struct musb *musb, u8 devctl) in musb_handle_intr_sessreq() argument
591 void __iomem *mbase = musb->mregs; in musb_handle_intr_sessreq()
595 musb_dbg(musb, "SessReq while on B state"); in musb_handle_intr_sessreq()
599 musb_dbg(musb, "SESSION_REQUEST (%s)", in musb_handle_intr_sessreq()
600 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_sessreq()
610 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_sessreq()
611 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in musb_handle_intr_sessreq()
612 MUSB_HST_MODE(musb); in musb_handle_intr_sessreq()
613 musb_platform_set_vbus(musb, 1); in musb_handle_intr_sessreq()
618 static void musb_handle_intr_vbuserr(struct musb *musb, u8 devctl) in musb_handle_intr_vbuserr() argument
638 switch (musb->xceiv->otg->state) { in musb_handle_intr_vbuserr()
648 if (musb->vbuserr_retry) { in musb_handle_intr_vbuserr()
649 void __iomem *mbase = musb->mregs; in musb_handle_intr_vbuserr()
651 musb->vbuserr_retry--; in musb_handle_intr_vbuserr()
656 musb->port1_status |= in musb_handle_intr_vbuserr()
665 dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller, in musb_handle_intr_vbuserr()
667 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_vbuserr()
681 VBUSERR_RETRY_COUNT - musb->vbuserr_retry, in musb_handle_intr_vbuserr()
682 musb->port1_status); in musb_handle_intr_vbuserr()
686 musb_platform_set_vbus(musb, 0); in musb_handle_intr_vbuserr()
689 static void musb_handle_intr_suspend(struct musb *musb, u8 devctl) in musb_handle_intr_suspend() argument
691 musb_dbg(musb, "SUSPEND (%s) devctl %02x", in musb_handle_intr_suspend()
692 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_handle_intr_suspend()
694 switch (musb->xceiv->otg->state) { in musb_handle_intr_suspend()
703 musb_hnp_stop(musb); in musb_handle_intr_suspend()
704 musb_host_resume_root_hub(musb); in musb_handle_intr_suspend()
705 musb_root_disconnect(musb); in musb_handle_intr_suspend()
706 musb_platform_try_idle(musb, jiffies in musb_handle_intr_suspend()
707 + msecs_to_jiffies(musb->a_wait_bcon in musb_handle_intr_suspend()
712 if (!musb->is_active) in musb_handle_intr_suspend()
716 musb_g_suspend(musb); in musb_handle_intr_suspend()
717 musb->is_active = musb->g.b_hnp_enable; in musb_handle_intr_suspend()
718 if (musb->is_active) { in musb_handle_intr_suspend()
719 musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON; in musb_handle_intr_suspend()
720 musb_dbg(musb, "HNP: Setting timer for b_ase0_brst"); in musb_handle_intr_suspend()
721 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_suspend()
727 if (musb->a_wait_bcon != 0) in musb_handle_intr_suspend()
728 musb_platform_try_idle(musb, jiffies in musb_handle_intr_suspend()
729 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_suspend()
732 musb->xceiv->otg->state = OTG_STATE_A_SUSPEND; in musb_handle_intr_suspend()
733 musb->is_active = musb->hcd->self.b_hnp_enable; in musb_handle_intr_suspend()
737 musb_dbg(musb, "REVISIT: SUSPEND as B_HOST"); in musb_handle_intr_suspend()
741 musb->is_active = 0; in musb_handle_intr_suspend()
746 static void musb_handle_intr_connect(struct musb *musb, u8 devctl, u8 int_usb) in musb_handle_intr_connect() argument
748 struct usb_hcd *hcd = musb->hcd; in musb_handle_intr_connect()
750 musb->is_active = 1; in musb_handle_intr_connect()
751 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_connect()
753 musb->intrtxe = musb->epmask; in musb_handle_intr_connect()
754 musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); in musb_handle_intr_connect()
755 musb->intrrxe = musb->epmask & 0xfffe; in musb_handle_intr_connect()
756 musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); in musb_handle_intr_connect()
757 musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); in musb_handle_intr_connect()
758 musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED in musb_handle_intr_connect()
762 musb->port1_status |= USB_PORT_STAT_CONNECTION in musb_handle_intr_connect()
767 musb->port1_status |= USB_PORT_STAT_LOW_SPEED; in musb_handle_intr_connect()
770 switch (musb->xceiv->otg->state) { in musb_handle_intr_connect()
773 musb_dbg(musb, "HNP: SUSPEND+CONNECT, now b_host"); in musb_handle_intr_connect()
777 musb_dbg(musb, "CONNECT as b_peripheral???"); in musb_handle_intr_connect()
780 musb_dbg(musb, "HNP: CONNECT, now b_host"); in musb_handle_intr_connect()
782 musb->xceiv->otg->state = OTG_STATE_B_HOST; in musb_handle_intr_connect()
783 if (musb->hcd) in musb_handle_intr_connect()
784 musb->hcd->self.is_b_host = 1; in musb_handle_intr_connect()
785 del_timer(&musb->otg_timer); in musb_handle_intr_connect()
790 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_connect()
797 musb_host_poke_root_hub(musb); in musb_handle_intr_connect()
799 musb_dbg(musb, "CONNECT (%s) devctl %02x", in musb_handle_intr_connect()
800 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_handle_intr_connect()
803 static void musb_handle_intr_disconnect(struct musb *musb, u8 devctl) in musb_handle_intr_disconnect() argument
805 musb_dbg(musb, "DISCONNECT (%s) as %s, devctl %02x", in musb_handle_intr_disconnect()
806 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_disconnect()
807 MUSB_MODE(musb), devctl); in musb_handle_intr_disconnect()
809 switch (musb->xceiv->otg->state) { in musb_handle_intr_disconnect()
812 musb_host_resume_root_hub(musb); in musb_handle_intr_disconnect()
813 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
814 if (musb->a_wait_bcon != 0) in musb_handle_intr_disconnect()
815 musb_platform_try_idle(musb, jiffies in musb_handle_intr_disconnect()
816 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_disconnect()
824 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
825 if (musb->hcd) in musb_handle_intr_disconnect()
826 musb->hcd->self.is_b_host = 0; in musb_handle_intr_disconnect()
827 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_disconnect()
828 MUSB_DEV_MODE(musb); in musb_handle_intr_disconnect()
829 musb_g_disconnect(musb); in musb_handle_intr_disconnect()
832 musb_hnp_stop(musb); in musb_handle_intr_disconnect()
833 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
839 musb_g_disconnect(musb); in musb_handle_intr_disconnect()
843 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_disconnect()
852 static void musb_handle_intr_reset(struct musb *musb) in musb_handle_intr_reset() argument
854 if (is_host_active(musb)) { in musb_handle_intr_reset()
863 dev_err(musb->controller, "Babble\n"); in musb_handle_intr_reset()
864 musb_recover_from_babble(musb); in musb_handle_intr_reset()
866 musb_dbg(musb, "BUS RESET as %s", in musb_handle_intr_reset()
867 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
868 switch (musb->xceiv->otg->state) { in musb_handle_intr_reset()
870 musb_g_reset(musb); in musb_handle_intr_reset()
874 musb_dbg(musb, "HNP: in %s, %d msec timeout", in musb_handle_intr_reset()
875 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_reset()
876 TA_WAIT_BCON(musb)); in musb_handle_intr_reset()
877 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_reset()
878 + msecs_to_jiffies(TA_WAIT_BCON(musb))); in musb_handle_intr_reset()
881 del_timer(&musb->otg_timer); in musb_handle_intr_reset()
882 musb_g_reset(musb); in musb_handle_intr_reset()
885 musb_dbg(musb, "HNP: RESET (%s), to b_peripheral", in musb_handle_intr_reset()
886 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
887 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_reset()
888 musb_g_reset(musb); in musb_handle_intr_reset()
891 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_reset()
894 musb_g_reset(musb); in musb_handle_intr_reset()
897 musb_dbg(musb, "Unhandled BUS RESET as %s", in musb_handle_intr_reset()
898 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
915 static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, in musb_stage0_irq() argument
920 musb_dbg(musb, "<== DevCtl=%02x, int_usb=0x%x", devctl, int_usb); in musb_stage0_irq()
927 musb_handle_intr_resume(musb, devctl); in musb_stage0_irq()
933 if (musb_handle_intr_sessreq(musb, devctl)) in musb_stage0_irq()
939 musb_handle_intr_vbuserr(musb, devctl); in musb_stage0_irq()
944 musb_handle_intr_suspend(musb, devctl); in musb_stage0_irq()
949 musb_handle_intr_connect(musb, devctl, int_usb); in musb_stage0_irq()
954 musb_handle_intr_disconnect(musb, devctl); in musb_stage0_irq()
959 musb_handle_intr_reset(musb); in musb_stage0_irq()
976 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
981 dev_dbg(musb->controller, "START_OF_FRAME\n"); in musb_stage0_irq()
986 ep = musb->endpoints; in musb_stage0_irq()
987 for (epnum = 1; (epnum < musb->nr_endpoints) in musb_stage0_irq()
988 && (musb->epmask >= (1 << epnum)); in musb_stage0_irq()
1000 musb_h_tx_start(musb, epnum); in musb_stage0_irq()
1002 cppi_hostdma_start(musb, epnum); in musb_stage0_irq()
1008 schedule_delayed_work(&musb->irq_work, 0); in musb_stage0_irq()
1015 static void musb_disable_interrupts(struct musb *musb) in musb_disable_interrupts() argument
1017 void __iomem *mbase = musb->mregs; in musb_disable_interrupts()
1022 musb->intrtxe = 0; in musb_disable_interrupts()
1024 musb->intrrxe = 0; in musb_disable_interrupts()
1033 static void musb_enable_interrupts(struct musb *musb) in musb_enable_interrupts() argument
1035 void __iomem *regs = musb->mregs; in musb_enable_interrupts()
1038 musb->intrtxe = musb->epmask; in musb_enable_interrupts()
1039 musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); in musb_enable_interrupts()
1040 musb->intrrxe = musb->epmask & 0xfffe; in musb_enable_interrupts()
1041 musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); in musb_enable_interrupts()
1049 void musb_start(struct musb *musb) in musb_start() argument
1051 void __iomem *regs = musb->mregs; in musb_start()
1055 musb_dbg(musb, "<== devctl %02x", devctl); in musb_start()
1057 musb_enable_interrupts(musb); in musb_start()
1065 if (musb->config->maximum_speed == USB_SPEED_HIGH || in musb_start()
1066 musb->config->maximum_speed == USB_SPEED_UNKNOWN) in musb_start()
1070 musb->is_active = 0; in musb_start()
1079 if (musb->port_mode != MUSB_HOST && in musb_start()
1080 musb->xceiv->otg->state != OTG_STATE_A_WAIT_BCON && in musb_start()
1082 musb->is_active = 1; in musb_start()
1087 musb_platform_enable(musb); in musb_start()
1098 void musb_stop(struct musb *musb) in musb_stop() argument
1101 musb_platform_disable(musb); in musb_stop()
1102 musb_disable_interrupts(musb); in musb_stop()
1103 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_stop()
1112 musb_platform_try_idle(musb, 0); in musb_stop()
1245 fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, in fifo_setup() argument
1248 void __iomem *mbase = musb->mregs; in fifo_setup()
1262 (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1266 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1277 musb->bulk_ep = hw_ep; in fifo_setup()
1310 musb->epmask |= (1 << hw_ep->epnum); in fifo_setup()
1319 static int ep_config_from_table(struct musb *musb) in ep_config_from_table() argument
1324 struct musb_hw_ep *hw_ep = musb->endpoints; in ep_config_from_table()
1326 if (musb->config->fifo_cfg) { in ep_config_from_table()
1327 cfg = musb->config->fifo_cfg; in ep_config_from_table()
1328 n = musb->config->fifo_cfg_size; in ep_config_from_table()
1366 offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0); in ep_config_from_table()
1376 if (epn >= musb->config->num_eps) { in ep_config_from_table()
1381 offset = fifo_setup(musb, hw_ep + epn, cfg++, offset); in ep_config_from_table()
1388 musb->nr_endpoints = max(epn, musb->nr_endpoints); in ep_config_from_table()
1393 n + 1, musb->config->num_eps * 2 - 1, in ep_config_from_table()
1394 offset, (1 << (musb->config->ram_bits + 2))); in ep_config_from_table()
1396 if (!musb->bulk_ep) { in ep_config_from_table()
1409 static int ep_config_from_hw(struct musb *musb) in ep_config_from_hw() argument
1413 void __iomem *mbase = musb->mregs; in ep_config_from_hw()
1416 musb_dbg(musb, "<== static silicon ep config"); in ep_config_from_hw()
1420 for (epnum = 1; epnum < musb->config->num_eps; epnum++) { in ep_config_from_hw()
1422 hw_ep = musb->endpoints + epnum; in ep_config_from_hw()
1424 ret = musb_read_fifosize(musb, hw_ep, epnum); in ep_config_from_hw()
1438 if (musb->bulk_ep) in ep_config_from_hw()
1440 musb->bulk_ep = hw_ep; in ep_config_from_hw()
1443 if (!musb->bulk_ep) { in ep_config_from_hw()
1456 static int musb_core_init(u16 musb_type, struct musb *musb) in musb_core_init() argument
1461 void __iomem *mbase = musb->mregs; in musb_core_init()
1471 musb->dyn_fifo = true; in musb_core_init()
1475 musb->bulk_combine = true; in musb_core_init()
1479 musb->bulk_split = true; in musb_core_init()
1483 musb->hb_iso_rx = true; in musb_core_init()
1487 musb->hb_iso_tx = true; in musb_core_init()
1495 musb->is_multipoint = 1; in musb_core_init()
1498 musb->is_multipoint = 0; in musb_core_init()
1507 musb->hwvers = musb_readw(mbase, MUSB_HWVERS); in musb_core_init()
1509 musb_driver_name, type, MUSB_HWVERS_MAJOR(musb->hwvers), in musb_core_init()
1510 MUSB_HWVERS_MINOR(musb->hwvers), in musb_core_init()
1511 (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : ""); in musb_core_init()
1514 musb_configure_ep0(musb); in musb_core_init()
1517 musb->nr_endpoints = 1; in musb_core_init()
1518 musb->epmask = 1; in musb_core_init()
1520 if (musb->dyn_fifo) in musb_core_init()
1521 status = ep_config_from_table(musb); in musb_core_init()
1523 status = ep_config_from_hw(musb); in musb_core_init()
1529 for (i = 0; i < musb->nr_endpoints; i++) { in musb_core_init()
1530 struct musb_hw_ep *hw_ep = musb->endpoints + i; in musb_core_init()
1532 hw_ep->fifo = musb->io.fifo_offset(i) + mbase; in musb_core_init()
1534 if (musb->ops->quirks & MUSB_IN_TUSB) { in musb_core_init()
1535 hw_ep->fifo_async = musb->async + 0x400 + in musb_core_init()
1536 musb->io.fifo_offset(i); in musb_core_init()
1537 hw_ep->fifo_sync = musb->sync + 0x400 + in musb_core_init()
1538 musb->io.fifo_offset(i); in musb_core_init()
1540 musb->sync_va + 0x400 + musb->io.fifo_offset(i); in musb_core_init()
1550 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase; in musb_core_init()
1555 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d", in musb_core_init()
1563 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d", in musb_core_init()
1571 musb_dbg(musb, "hw_ep %d not configured", i); in musb_core_init()
1586 irqreturn_t musb_interrupt(struct musb *musb) in musb_interrupt() argument
1593 if (!musb->int_usb && !musb->int_tx && !musb->int_rx) in musb_interrupt()
1596 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_interrupt()
1598 trace_musb_isr(musb); in musb_interrupt()
1620 if (musb->int_usb) in musb_interrupt()
1621 retval |= musb_stage0_irq(musb, musb->int_usb, devctl); in musb_interrupt()
1623 if (musb->int_tx & 1) { in musb_interrupt()
1624 if (is_host_active(musb)) in musb_interrupt()
1625 retval |= musb_h_ep0_irq(musb); in musb_interrupt()
1627 retval |= musb_g_ep0_irq(musb); in musb_interrupt()
1630 musb->int_tx &= ~BIT(0); in musb_interrupt()
1633 status = musb->int_tx; in musb_interrupt()
1637 if (is_host_active(musb)) in musb_interrupt()
1638 musb_host_tx(musb, epnum); in musb_interrupt()
1640 musb_g_tx(musb, epnum); in musb_interrupt()
1643 status = musb->int_rx; in musb_interrupt()
1647 if (is_host_active(musb)) in musb_interrupt()
1648 musb_host_rx(musb, epnum); in musb_interrupt()
1650 musb_g_rx(musb, epnum); in musb_interrupt()
1664 void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit) in musb_dma_completion() argument
1669 if (!is_cppi_enabled(musb)) { in musb_dma_completion()
1671 if (is_host_active(musb)) in musb_dma_completion()
1672 musb_h_ep0_irq(musb); in musb_dma_completion()
1674 musb_g_ep0_irq(musb); in musb_dma_completion()
1679 if (is_host_active(musb)) in musb_dma_completion()
1680 musb_host_tx(musb, epnum); in musb_dma_completion()
1682 musb_g_tx(musb, epnum); in musb_dma_completion()
1685 if (is_host_active(musb)) in musb_dma_completion()
1686 musb_host_rx(musb, epnum); in musb_dma_completion()
1688 musb_g_rx(musb, epnum); in musb_dma_completion()
1721 struct musb *musb = dev_to_musb(dev); in mode_show() local
1725 spin_lock_irqsave(&musb->lock, flags); in mode_show()
1726 ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state)); in mode_show()
1727 spin_unlock_irqrestore(&musb->lock, flags); in mode_show()
1736 struct musb *musb = dev_to_musb(dev); in mode_store() local
1740 spin_lock_irqsave(&musb->lock, flags); in mode_store()
1742 status = musb_platform_set_mode(musb, MUSB_HOST); in mode_store()
1744 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in mode_store()
1746 status = musb_platform_set_mode(musb, MUSB_OTG); in mode_store()
1749 spin_unlock_irqrestore(&musb->lock, flags); in mode_store()
1759 struct musb *musb = dev_to_musb(dev); in vbus_store() local
1768 spin_lock_irqsave(&musb->lock, flags); in vbus_store()
1770 musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ; in vbus_store()
1771 if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON) in vbus_store()
1772 musb->is_active = 0; in vbus_store()
1773 musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val)); in vbus_store()
1774 spin_unlock_irqrestore(&musb->lock, flags); in vbus_store()
1782 struct musb *musb = dev_to_musb(dev); in vbus_show() local
1789 spin_lock_irqsave(&musb->lock, flags); in vbus_show()
1790 val = musb->a_wait_bcon; in vbus_show()
1791 vbus = musb_platform_get_vbus_status(musb); in vbus_show()
1794 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in vbus_show()
1801 spin_unlock_irqrestore(&musb->lock, flags); in vbus_show()
1815 struct musb *musb = dev_to_musb(dev); in srp_store() local
1825 musb_g_wakeup(musb); in srp_store()
1856 static void musb_pm_runtime_check_session(struct musb *musb) in musb_pm_runtime_check_session() argument
1861 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_pm_runtime_check_session()
1868 if (musb->quirk_retries && !musb->flush_irq_work) { in musb_pm_runtime_check_session()
1869 musb_dbg(musb, in musb_pm_runtime_check_session()
1871 schedule_delayed_work(&musb->irq_work, in musb_pm_runtime_check_session()
1873 musb->quirk_retries--; in musb_pm_runtime_check_session()
1878 if (musb->quirk_retries && !musb->flush_irq_work) { in musb_pm_runtime_check_session()
1879 musb_dbg(musb, in musb_pm_runtime_check_session()
1881 schedule_delayed_work(&musb->irq_work, in musb_pm_runtime_check_session()
1883 musb->quirk_retries--; in musb_pm_runtime_check_session()
1886 if (!musb->session) in musb_pm_runtime_check_session()
1888 musb_dbg(musb, "Allow PM on possible host mode disconnect"); in musb_pm_runtime_check_session()
1889 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
1890 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
1891 musb->session = false; in musb_pm_runtime_check_session()
1899 if (s == musb->session) in musb_pm_runtime_check_session()
1904 musb_dbg(musb, "Block PM on active session: %02x", devctl); in musb_pm_runtime_check_session()
1905 error = pm_runtime_get_sync(musb->controller); in musb_pm_runtime_check_session()
1907 dev_err(musb->controller, "Could not enable: %i\n", in musb_pm_runtime_check_session()
1909 musb->quirk_retries = 3; in musb_pm_runtime_check_session()
1911 musb_dbg(musb, "Allow PM with no session: %02x", devctl); in musb_pm_runtime_check_session()
1912 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
1913 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
1916 musb->session = s; in musb_pm_runtime_check_session()
1922 struct musb *musb = container_of(data, struct musb, irq_work.work); in musb_irq_work() local
1925 error = pm_runtime_get_sync(musb->controller); in musb_irq_work()
1927 dev_err(musb->controller, "Could not enable: %i\n", error); in musb_irq_work()
1932 musb_pm_runtime_check_session(musb); in musb_irq_work()
1934 if (musb->xceiv->otg->state != musb->xceiv_old_state) { in musb_irq_work()
1935 musb->xceiv_old_state = musb->xceiv->otg->state; in musb_irq_work()
1936 sysfs_notify(&musb->controller->kobj, NULL, "mode"); in musb_irq_work()
1939 pm_runtime_mark_last_busy(musb->controller); in musb_irq_work()
1940 pm_runtime_put_autosuspend(musb->controller); in musb_irq_work()
1943 static void musb_recover_from_babble(struct musb *musb) in musb_recover_from_babble() argument
1948 musb_disable_interrupts(musb); in musb_recover_from_babble()
1956 ret = musb_platform_recover(musb); in musb_recover_from_babble()
1958 musb_enable_interrupts(musb); in musb_recover_from_babble()
1963 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_recover_from_babble()
1965 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_recover_from_babble()
1968 musb_root_disconnect(musb); in musb_recover_from_babble()
1974 if (musb->dyn_fifo) in musb_recover_from_babble()
1975 ret = ep_config_from_table(musb); in musb_recover_from_babble()
1977 ret = ep_config_from_hw(musb); in musb_recover_from_babble()
1981 musb_start(musb); in musb_recover_from_babble()
1988 static struct musb *allocate_instance(struct device *dev, in allocate_instance()
1991 struct musb *musb; in allocate_instance() local
1996 musb = devm_kzalloc(dev, sizeof(*musb), GFP_KERNEL); in allocate_instance()
1997 if (!musb) in allocate_instance()
2000 INIT_LIST_HEAD(&musb->control); in allocate_instance()
2001 INIT_LIST_HEAD(&musb->in_bulk); in allocate_instance()
2002 INIT_LIST_HEAD(&musb->out_bulk); in allocate_instance()
2003 INIT_LIST_HEAD(&musb->pending_list); in allocate_instance()
2005 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; in allocate_instance()
2006 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; in allocate_instance()
2007 musb->mregs = mbase; in allocate_instance()
2008 musb->ctrl_base = mbase; in allocate_instance()
2009 musb->nIrq = -ENODEV; in allocate_instance()
2010 musb->config = config; in allocate_instance()
2011 BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS); in allocate_instance()
2012 for (epnum = 0, ep = musb->endpoints; in allocate_instance()
2013 epnum < musb->config->num_eps; in allocate_instance()
2015 ep->musb = musb; in allocate_instance()
2019 musb->controller = dev; in allocate_instance()
2021 ret = musb_host_alloc(musb); in allocate_instance()
2025 dev_set_drvdata(dev, musb); in allocate_instance()
2027 return musb; in allocate_instance()
2033 static void musb_free(struct musb *musb) in musb_free() argument
2041 sysfs_remove_group(&musb->controller->kobj, &musb_attr_group); in musb_free()
2044 if (musb->nIrq >= 0) { in musb_free()
2045 if (musb->irq_wake) in musb_free()
2046 disable_irq_wake(musb->nIrq); in musb_free()
2047 free_irq(musb->nIrq, musb); in musb_free()
2050 musb_host_free(musb); in musb_free()
2054 int (*callback)(struct musb *musb, void *data);
2064 static int musb_run_resume_work(struct musb *musb) in musb_run_resume_work() argument
2070 spin_lock_irqsave(&musb->list_lock, flags); in musb_run_resume_work()
2071 list_for_each_entry_safe(w, _w, &musb->pending_list, node) { in musb_run_resume_work()
2073 error = w->callback(musb, w->data); in musb_run_resume_work()
2075 dev_err(musb->controller, in musb_run_resume_work()
2081 devm_kfree(musb->controller, w); in musb_run_resume_work()
2083 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_run_resume_work()
2097 int musb_queue_resume_work(struct musb *musb, in musb_queue_resume_work() argument
2098 int (*callback)(struct musb *musb, void *data), in musb_queue_resume_work() argument
2108 if (pm_runtime_active(musb->controller)) in musb_queue_resume_work()
2109 return callback(musb, data); in musb_queue_resume_work()
2111 w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC); in musb_queue_resume_work()
2117 spin_lock_irqsave(&musb->list_lock, flags); in musb_queue_resume_work()
2118 if (musb->is_runtime_suspended) { in musb_queue_resume_work()
2119 list_add_tail(&w->node, &musb->pending_list); in musb_queue_resume_work()
2122 dev_err(musb->controller, "could not add resume work %p\n", in musb_queue_resume_work()
2124 devm_kfree(musb->controller, w); in musb_queue_resume_work()
2127 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_queue_resume_work()
2135 struct musb *musb; in musb_deassert_reset() local
2138 musb = container_of(work, struct musb, deassert_reset_work.work); in musb_deassert_reset()
2140 spin_lock_irqsave(&musb->lock, flags); in musb_deassert_reset()
2142 if (musb->port1_status & USB_PORT_STAT_RESET) in musb_deassert_reset()
2143 musb_port_reset(musb, false); in musb_deassert_reset()
2145 spin_unlock_irqrestore(&musb->lock, flags); in musb_deassert_reset()
2160 struct musb *musb; in musb_init_controller() local
2173 musb = allocate_instance(dev, plat->config, ctrl); in musb_init_controller()
2174 if (!musb) { in musb_init_controller()
2179 spin_lock_init(&musb->lock); in musb_init_controller()
2180 spin_lock_init(&musb->list_lock); in musb_init_controller()
2181 musb->board_set_power = plat->set_power; in musb_init_controller()
2182 musb->min_power = plat->min_power; in musb_init_controller()
2183 musb->ops = plat->platform_ops; in musb_init_controller()
2184 musb->port_mode = plat->mode; in musb_init_controller()
2208 status = musb_platform_init(musb); in musb_init_controller()
2212 if (!musb->isr) { in musb_init_controller()
2219 if (musb->ops->quirks & MUSB_INDEXED_EP) { in musb_init_controller()
2220 musb->io.ep_offset = musb_indexed_ep_offset; in musb_init_controller()
2221 musb->io.ep_select = musb_indexed_ep_select; in musb_init_controller()
2223 musb->io.ep_offset = musb_flat_ep_offset; in musb_init_controller()
2224 musb->io.ep_select = musb_flat_ep_select; in musb_init_controller()
2227 if (musb->ops->quirks & MUSB_G_NO_SKB_RESERVE) in musb_init_controller()
2228 musb->g.quirk_avoids_skb_reserve = 1; in musb_init_controller()
2231 if (musb->ops->ep_offset) in musb_init_controller()
2232 musb->io.ep_offset = musb->ops->ep_offset; in musb_init_controller()
2233 if (musb->ops->ep_select) in musb_init_controller()
2234 musb->io.ep_select = musb->ops->ep_select; in musb_init_controller()
2236 if (musb->ops->fifo_mode) in musb_init_controller()
2237 fifo_mode = musb->ops->fifo_mode; in musb_init_controller()
2241 if (musb->ops->fifo_offset) in musb_init_controller()
2242 musb->io.fifo_offset = musb->ops->fifo_offset; in musb_init_controller()
2244 musb->io.fifo_offset = musb_default_fifo_offset; in musb_init_controller()
2246 if (musb->ops->busctl_offset) in musb_init_controller()
2247 musb->io.busctl_offset = musb->ops->busctl_offset; in musb_init_controller()
2249 musb->io.busctl_offset = musb_default_busctl_offset; in musb_init_controller()
2251 if (musb->ops->readb) in musb_init_controller()
2252 musb_readb = musb->ops->readb; in musb_init_controller()
2253 if (musb->ops->writeb) in musb_init_controller()
2254 musb_writeb = musb->ops->writeb; in musb_init_controller()
2255 if (musb->ops->readw) in musb_init_controller()
2256 musb_readw = musb->ops->readw; in musb_init_controller()
2257 if (musb->ops->writew) in musb_init_controller()
2258 musb_writew = musb->ops->writew; in musb_init_controller()
2261 if (!musb->ops->dma_init || !musb->ops->dma_exit) { in musb_init_controller()
2266 musb_dma_controller_create = musb->ops->dma_init; in musb_init_controller()
2267 musb_dma_controller_destroy = musb->ops->dma_exit; in musb_init_controller()
2270 if (musb->ops->read_fifo) in musb_init_controller()
2271 musb->io.read_fifo = musb->ops->read_fifo; in musb_init_controller()
2273 musb->io.read_fifo = musb_default_read_fifo; in musb_init_controller()
2275 if (musb->ops->write_fifo) in musb_init_controller()
2276 musb->io.write_fifo = musb->ops->write_fifo; in musb_init_controller()
2278 musb->io.write_fifo = musb_default_write_fifo; in musb_init_controller()
2280 if (!musb->xceiv->io_ops) { in musb_init_controller()
2281 musb->xceiv->io_dev = musb->controller; in musb_init_controller()
2282 musb->xceiv->io_priv = musb->mregs; in musb_init_controller()
2283 musb->xceiv->io_ops = &musb_ulpi_access; in musb_init_controller()
2286 if (musb->ops->phy_callback) in musb_init_controller()
2287 musb_phy_callback = musb->ops->phy_callback; in musb_init_controller()
2296 pm_runtime_use_autosuspend(musb->controller); in musb_init_controller()
2297 pm_runtime_set_autosuspend_delay(musb->controller, 500); in musb_init_controller()
2298 pm_runtime_enable(musb->controller); in musb_init_controller()
2299 pm_runtime_get_sync(musb->controller); in musb_init_controller()
2301 status = usb_phy_init(musb->xceiv); in musb_init_controller()
2306 musb->dma_controller = in musb_init_controller()
2307 musb_dma_controller_create(musb, musb->mregs); in musb_init_controller()
2308 if (IS_ERR(musb->dma_controller)) { in musb_init_controller()
2309 status = PTR_ERR(musb->dma_controller); in musb_init_controller()
2315 musb_platform_disable(musb); in musb_init_controller()
2316 musb_disable_interrupts(musb); in musb_init_controller()
2317 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_init_controller()
2320 INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); in musb_init_controller()
2321 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); in musb_init_controller()
2322 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); in musb_init_controller()
2327 : MUSB_CONTROLLER_HDRC, musb); in musb_init_controller()
2331 timer_setup(&musb->otg_timer, musb_otg_timer_func, 0); in musb_init_controller()
2334 if (request_irq(nIrq, musb->isr, IRQF_SHARED, dev_name(dev), musb)) { in musb_init_controller()
2339 musb->nIrq = nIrq; in musb_init_controller()
2342 musb->irq_wake = 1; in musb_init_controller()
2345 musb->irq_wake = 0; in musb_init_controller()
2350 u8 busctl = musb_readb(musb->mregs, MUSB_ULPI_BUSCONTROL); in musb_init_controller()
2352 musb_writeb(musb->mregs, MUSB_ULPI_BUSCONTROL, busctl); in musb_init_controller()
2355 MUSB_DEV_MODE(musb); in musb_init_controller()
2356 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in musb_init_controller()
2358 switch (musb->port_mode) { in musb_init_controller()
2360 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2363 status = musb_platform_set_mode(musb, MUSB_HOST); in musb_init_controller()
2366 status = musb_gadget_setup(musb); in musb_init_controller()
2369 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in musb_init_controller()
2372 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2375 status = musb_gadget_setup(musb); in musb_init_controller()
2377 musb_host_cleanup(musb); in musb_init_controller()
2380 status = musb_platform_set_mode(musb, MUSB_OTG); in musb_init_controller()
2383 dev_err(dev, "unsupported port mode %d\n", musb->port_mode); in musb_init_controller()
2390 musb_init_debugfs(musb); in musb_init_controller()
2392 status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group); in musb_init_controller()
2396 musb->is_initialized = 1; in musb_init_controller()
2397 pm_runtime_mark_last_busy(musb->controller); in musb_init_controller()
2398 pm_runtime_put_autosuspend(musb->controller); in musb_init_controller()
2403 musb_exit_debugfs(musb); in musb_init_controller()
2405 musb_gadget_cleanup(musb); in musb_init_controller()
2406 musb_host_cleanup(musb); in musb_init_controller()
2409 cancel_delayed_work_sync(&musb->irq_work); in musb_init_controller()
2410 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_init_controller()
2411 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_init_controller()
2412 if (musb->dma_controller) in musb_init_controller()
2413 musb_dma_controller_destroy(musb->dma_controller); in musb_init_controller()
2416 usb_phy_shutdown(musb->xceiv); in musb_init_controller()
2419 pm_runtime_dont_use_autosuspend(musb->controller); in musb_init_controller()
2420 pm_runtime_put_sync(musb->controller); in musb_init_controller()
2421 pm_runtime_disable(musb->controller); in musb_init_controller()
2424 if (musb->irq_wake) in musb_init_controller()
2426 musb_platform_exit(musb); in musb_init_controller()
2430 dev_err(musb->controller, in musb_init_controller()
2433 musb_free(musb); in musb_init_controller()
2467 struct musb *musb = dev_to_musb(dev); in musb_remove() local
2475 musb_exit_debugfs(musb); in musb_remove()
2477 cancel_delayed_work_sync(&musb->irq_work); in musb_remove()
2478 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_remove()
2479 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_remove()
2480 pm_runtime_get_sync(musb->controller); in musb_remove()
2481 musb_host_cleanup(musb); in musb_remove()
2482 musb_gadget_cleanup(musb); in musb_remove()
2484 musb_platform_disable(musb); in musb_remove()
2485 spin_lock_irqsave(&musb->lock, flags); in musb_remove()
2486 musb_disable_interrupts(musb); in musb_remove()
2487 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_remove()
2488 spin_unlock_irqrestore(&musb->lock, flags); in musb_remove()
2489 musb_platform_exit(musb); in musb_remove()
2491 pm_runtime_dont_use_autosuspend(musb->controller); in musb_remove()
2492 pm_runtime_put_sync(musb->controller); in musb_remove()
2493 pm_runtime_disable(musb->controller); in musb_remove()
2495 if (musb->dma_controller) in musb_remove()
2496 musb_dma_controller_destroy(musb->dma_controller); in musb_remove()
2497 usb_phy_shutdown(musb->xceiv); in musb_remove()
2498 musb_free(musb); in musb_remove()
2505 static void musb_save_context(struct musb *musb) in musb_save_context() argument
2508 void __iomem *musb_base = musb->mregs; in musb_save_context()
2511 musb->context.frame = musb_readw(musb_base, MUSB_FRAME); in musb_save_context()
2512 musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); in musb_save_context()
2513 musb->context.busctl = musb_readb(musb_base, MUSB_ULPI_BUSCONTROL); in musb_save_context()
2514 musb->context.power = musb_readb(musb_base, MUSB_POWER); in musb_save_context()
2515 musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); in musb_save_context()
2516 musb->context.index = musb_readb(musb_base, MUSB_INDEX); in musb_save_context()
2517 musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); in musb_save_context()
2519 for (i = 0; i < musb->config->num_eps; ++i) { in musb_save_context()
2522 hw_ep = &musb->endpoints[i]; in musb_save_context()
2531 musb->context.index_regs[i].txmaxp = in musb_save_context()
2533 musb->context.index_regs[i].txcsr = in musb_save_context()
2535 musb->context.index_regs[i].rxmaxp = in musb_save_context()
2537 musb->context.index_regs[i].rxcsr = in musb_save_context()
2540 if (musb->dyn_fifo) { in musb_save_context()
2541 musb->context.index_regs[i].txfifoadd = in musb_save_context()
2543 musb->context.index_regs[i].rxfifoadd = in musb_save_context()
2545 musb->context.index_regs[i].txfifosz = in musb_save_context()
2547 musb->context.index_regs[i].rxfifosz = in musb_save_context()
2551 musb->context.index_regs[i].txtype = in musb_save_context()
2553 musb->context.index_regs[i].txinterval = in musb_save_context()
2555 musb->context.index_regs[i].rxtype = in musb_save_context()
2557 musb->context.index_regs[i].rxinterval = in musb_save_context()
2560 musb->context.index_regs[i].txfunaddr = in musb_save_context()
2561 musb_read_txfunaddr(musb, i); in musb_save_context()
2562 musb->context.index_regs[i].txhubaddr = in musb_save_context()
2563 musb_read_txhubaddr(musb, i); in musb_save_context()
2564 musb->context.index_regs[i].txhubport = in musb_save_context()
2565 musb_read_txhubport(musb, i); in musb_save_context()
2567 musb->context.index_regs[i].rxfunaddr = in musb_save_context()
2568 musb_read_rxfunaddr(musb, i); in musb_save_context()
2569 musb->context.index_regs[i].rxhubaddr = in musb_save_context()
2570 musb_read_rxhubaddr(musb, i); in musb_save_context()
2571 musb->context.index_regs[i].rxhubport = in musb_save_context()
2572 musb_read_rxhubport(musb, i); in musb_save_context()
2576 static void musb_restore_context(struct musb *musb) in musb_restore_context() argument
2579 void __iomem *musb_base = musb->mregs; in musb_restore_context()
2583 musb_writew(musb_base, MUSB_FRAME, musb->context.frame); in musb_restore_context()
2584 musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); in musb_restore_context()
2585 musb_writeb(musb_base, MUSB_ULPI_BUSCONTROL, musb->context.busctl); in musb_restore_context()
2590 musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); in musb_restore_context()
2591 power |= musb->context.power; in musb_restore_context()
2594 musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); in musb_restore_context()
2595 musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); in musb_restore_context()
2596 musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); in musb_restore_context()
2597 if (musb->context.devctl & MUSB_DEVCTL_SESSION) in musb_restore_context()
2598 musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); in musb_restore_context()
2600 for (i = 0; i < musb->config->num_eps; ++i) { in musb_restore_context()
2603 hw_ep = &musb->endpoints[i]; in musb_restore_context()
2613 musb->context.index_regs[i].txmaxp); in musb_restore_context()
2615 musb->context.index_regs[i].txcsr); in musb_restore_context()
2617 musb->context.index_regs[i].rxmaxp); in musb_restore_context()
2619 musb->context.index_regs[i].rxcsr); in musb_restore_context()
2621 if (musb->dyn_fifo) { in musb_restore_context()
2623 musb->context.index_regs[i].txfifosz); in musb_restore_context()
2625 musb->context.index_regs[i].rxfifosz); in musb_restore_context()
2627 musb->context.index_regs[i].txfifoadd); in musb_restore_context()
2629 musb->context.index_regs[i].rxfifoadd); in musb_restore_context()
2633 musb->context.index_regs[i].txtype); in musb_restore_context()
2635 musb->context.index_regs[i].txinterval); in musb_restore_context()
2637 musb->context.index_regs[i].rxtype); in musb_restore_context()
2640 musb->context.index_regs[i].rxinterval); in musb_restore_context()
2641 musb_write_txfunaddr(musb, i, in musb_restore_context()
2642 musb->context.index_regs[i].txfunaddr); in musb_restore_context()
2643 musb_write_txhubaddr(musb, i, in musb_restore_context()
2644 musb->context.index_regs[i].txhubaddr); in musb_restore_context()
2645 musb_write_txhubport(musb, i, in musb_restore_context()
2646 musb->context.index_regs[i].txhubport); in musb_restore_context()
2648 musb_write_rxfunaddr(musb, i, in musb_restore_context()
2649 musb->context.index_regs[i].rxfunaddr); in musb_restore_context()
2650 musb_write_rxhubaddr(musb, i, in musb_restore_context()
2651 musb->context.index_regs[i].rxhubaddr); in musb_restore_context()
2652 musb_write_rxhubport(musb, i, in musb_restore_context()
2653 musb->context.index_regs[i].rxhubport); in musb_restore_context()
2655 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); in musb_restore_context()
2660 struct musb *musb = dev_to_musb(dev); in musb_suspend() local
2670 musb_platform_disable(musb); in musb_suspend()
2671 musb_disable_interrupts(musb); in musb_suspend()
2673 musb->flush_irq_work = true; in musb_suspend()
2674 while (flush_delayed_work(&musb->irq_work)) in musb_suspend()
2676 musb->flush_irq_work = false; in musb_suspend()
2678 if (!(musb->ops->quirks & MUSB_PRESERVE_SESSION)) in musb_suspend()
2679 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_suspend()
2681 WARN_ON(!list_empty(&musb->pending_list)); in musb_suspend()
2683 spin_lock_irqsave(&musb->lock, flags); in musb_suspend()
2685 if (is_peripheral_active(musb)) { in musb_suspend()
2689 } else if (is_host_active(musb)) { in musb_suspend()
2695 musb_save_context(musb); in musb_suspend()
2697 spin_unlock_irqrestore(&musb->lock, flags); in musb_suspend()
2703 struct musb *musb = dev_to_musb(dev); in musb_resume() local
2719 musb_restore_context(musb); in musb_resume()
2721 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_resume()
2723 if ((devctl & mask) != (musb->context.devctl & mask)) in musb_resume()
2724 musb->port1_status = 0; in musb_resume()
2726 musb_enable_interrupts(musb); in musb_resume()
2727 musb_platform_enable(musb); in musb_resume()
2729 spin_lock_irqsave(&musb->lock, flags); in musb_resume()
2730 error = musb_run_resume_work(musb); in musb_resume()
2732 dev_err(musb->controller, "resume work failed with %i\n", in musb_resume()
2734 spin_unlock_irqrestore(&musb->lock, flags); in musb_resume()
2744 struct musb *musb = dev_to_musb(dev); in musb_runtime_suspend() local
2746 musb_save_context(musb); in musb_runtime_suspend()
2747 musb->is_runtime_suspended = 1; in musb_runtime_suspend()
2754 struct musb *musb = dev_to_musb(dev); in musb_runtime_resume() local
2767 if (!musb->is_initialized) in musb_runtime_resume()
2770 musb_restore_context(musb); in musb_runtime_resume()
2772 spin_lock_irqsave(&musb->lock, flags); in musb_runtime_resume()
2773 error = musb_run_resume_work(musb); in musb_runtime_resume()
2775 dev_err(musb->controller, "resume work failed with %i\n", in musb_runtime_resume()
2777 musb->is_runtime_suspended = 0; in musb_runtime_resume()
2778 spin_unlock_irqrestore(&musb->lock, flags); in musb_runtime_resume()