• Home
  • Raw
  • Download

Lines Matching refs:musb

105 static inline struct musb *dev_to_musb(struct device *dev)  in dev_to_musb()
316 struct musb *musb = hw_ep->musb; in musb_default_write_fifo() local
324 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_write_fifo()
360 struct musb *musb = hw_ep->musb; in musb_default_read_fifo() local
366 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_read_fifo()
436 (*musb_dma_controller_create)(struct musb *musb, void __iomem *base);
448 return hw_ep->musb->io.read_fifo(hw_ep, len, dst); in musb_read_fifo()
453 return hw_ep->musb->io.write_fifo(hw_ep, len, src); in musb_write_fifo()
456 static u8 musb_read_devctl(struct musb *musb) in musb_read_devctl() argument
458 return musb_readb(musb->mregs, MUSB_DEVCTL); in musb_read_devctl()
473 int musb_set_host(struct musb *musb) in musb_set_host() argument
478 if (!musb) in musb_set_host()
481 devctl = musb_read_devctl(musb); in musb_set_host()
483 trace_musb_state(musb, devctl, "Already in host mode"); in musb_set_host()
488 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_set_host()
490 error = readx_poll_timeout(musb_read_devctl, musb, devctl, in musb_set_host()
494 dev_err(musb->controller, "%s: could not set host: %02x\n", in musb_set_host()
500 devctl = musb_read_devctl(musb); in musb_set_host()
501 trace_musb_state(musb, devctl, "Host mode set"); in musb_set_host()
504 musb->is_active = 1; in musb_set_host()
505 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in musb_set_host()
506 MUSB_HST_MODE(musb); in musb_set_host()
520 int musb_set_peripheral(struct musb *musb) in musb_set_peripheral() argument
525 if (!musb) in musb_set_peripheral()
528 devctl = musb_read_devctl(musb); in musb_set_peripheral()
530 trace_musb_state(musb, devctl, "Already in peripheral mode"); in musb_set_peripheral()
535 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_set_peripheral()
537 error = readx_poll_timeout(musb_read_devctl, musb, devctl, in musb_set_peripheral()
541 dev_err(musb->controller, "%s: could not set peripheral: %02x\n", in musb_set_peripheral()
547 devctl = musb_read_devctl(musb); in musb_set_peripheral()
548 trace_musb_state(musb, devctl, "Peripheral mode set"); in musb_set_peripheral()
551 musb->is_active = 0; in musb_set_peripheral()
552 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in musb_set_peripheral()
553 MUSB_DEV_MODE(musb); in musb_set_peripheral()
581 void musb_load_testpacket(struct musb *musb) in musb_load_testpacket() argument
583 void __iomem *regs = musb->endpoints[0].regs; in musb_load_testpacket()
585 musb_ep_select(musb->mregs, 0); in musb_load_testpacket()
586 musb_write_fifo(musb->control_ep, in musb_load_testpacket()
598 struct musb *musb = from_timer(musb, t, otg_timer); in musb_otg_timer_func() local
601 spin_lock_irqsave(&musb->lock, flags); in musb_otg_timer_func()
602 switch (musb->xceiv->otg->state) { in musb_otg_timer_func()
604 musb_dbg(musb, in musb_otg_timer_func()
606 musb_g_disconnect(musb); in musb_otg_timer_func()
607 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_otg_timer_func()
608 musb->is_active = 0; in musb_otg_timer_func()
612 musb_dbg(musb, "HNP: %s timeout", in musb_otg_timer_func()
613 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
614 musb_platform_set_vbus(musb, 0); in musb_otg_timer_func()
615 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL; in musb_otg_timer_func()
618 musb_dbg(musb, "HNP: Unhandled mode %s", in musb_otg_timer_func()
619 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
621 spin_unlock_irqrestore(&musb->lock, flags); in musb_otg_timer_func()
627 void musb_hnp_stop(struct musb *musb) in musb_hnp_stop() argument
629 struct usb_hcd *hcd = musb->hcd; in musb_hnp_stop()
630 void __iomem *mbase = musb->mregs; in musb_hnp_stop()
633 musb_dbg(musb, "HNP: stop from %s", in musb_hnp_stop()
634 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
636 switch (musb->xceiv->otg->state) { in musb_hnp_stop()
638 musb_g_disconnect(musb); in musb_hnp_stop()
639 musb_dbg(musb, "HNP: back to %s", in musb_hnp_stop()
640 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
643 musb_dbg(musb, "HNP: Disabling HR"); in musb_hnp_stop()
646 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_hnp_stop()
647 MUSB_DEV_MODE(musb); in musb_hnp_stop()
654 musb_dbg(musb, "HNP: Stopping in unknown state %s", in musb_hnp_stop()
655 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
663 musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16); in musb_hnp_stop()
666 static void musb_recover_from_babble(struct musb *musb);
668 static void musb_handle_intr_resume(struct musb *musb, u8 devctl) in musb_handle_intr_resume() argument
670 musb_dbg(musb, "RESUME (%s)", in musb_handle_intr_resume()
671 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
674 switch (musb->xceiv->otg->state) { in musb_handle_intr_resume()
677 musb->port1_status |= in musb_handle_intr_resume()
680 musb->rh_timer = jiffies in musb_handle_intr_resume()
682 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_resume()
683 musb->is_active = 1; in musb_handle_intr_resume()
684 musb_host_resume_root_hub(musb); in musb_handle_intr_resume()
685 schedule_delayed_work(&musb->finish_resume_work, in musb_handle_intr_resume()
689 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_resume()
690 musb->is_active = 1; in musb_handle_intr_resume()
691 MUSB_DEV_MODE(musb); in musb_handle_intr_resume()
696 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
699 switch (musb->xceiv->otg->state) { in musb_handle_intr_resume()
702 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_resume()
703 musb_host_resume_root_hub(musb); in musb_handle_intr_resume()
713 musb->int_usb |= MUSB_INTR_DISCONNECT; in musb_handle_intr_resume()
714 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
717 musb_g_resume(musb); in musb_handle_intr_resume()
720 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
725 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_resume()
731 static irqreturn_t musb_handle_intr_sessreq(struct musb *musb, u8 devctl) in musb_handle_intr_sessreq() argument
733 void __iomem *mbase = musb->mregs; in musb_handle_intr_sessreq()
737 musb_dbg(musb, "SessReq while on B state"); in musb_handle_intr_sessreq()
741 musb_dbg(musb, "SESSION_REQUEST (%s)", in musb_handle_intr_sessreq()
742 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_sessreq()
752 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_sessreq()
753 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in musb_handle_intr_sessreq()
754 MUSB_HST_MODE(musb); in musb_handle_intr_sessreq()
755 musb_platform_set_vbus(musb, 1); in musb_handle_intr_sessreq()
760 static void musb_handle_intr_vbuserr(struct musb *musb, u8 devctl) in musb_handle_intr_vbuserr() argument
780 switch (musb->xceiv->otg->state) { in musb_handle_intr_vbuserr()
790 if (musb->vbuserr_retry) { in musb_handle_intr_vbuserr()
791 void __iomem *mbase = musb->mregs; in musb_handle_intr_vbuserr()
793 musb->vbuserr_retry--; in musb_handle_intr_vbuserr()
798 musb->port1_status |= in musb_handle_intr_vbuserr()
807 dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller, in musb_handle_intr_vbuserr()
809 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_vbuserr()
823 VBUSERR_RETRY_COUNT - musb->vbuserr_retry, in musb_handle_intr_vbuserr()
824 musb->port1_status); in musb_handle_intr_vbuserr()
828 musb_platform_set_vbus(musb, 0); in musb_handle_intr_vbuserr()
831 static void musb_handle_intr_suspend(struct musb *musb, u8 devctl) in musb_handle_intr_suspend() argument
833 musb_dbg(musb, "SUSPEND (%s) devctl %02x", in musb_handle_intr_suspend()
834 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_handle_intr_suspend()
836 switch (musb->xceiv->otg->state) { in musb_handle_intr_suspend()
845 musb_hnp_stop(musb); in musb_handle_intr_suspend()
846 musb_host_resume_root_hub(musb); in musb_handle_intr_suspend()
847 musb_root_disconnect(musb); in musb_handle_intr_suspend()
848 musb_platform_try_idle(musb, jiffies in musb_handle_intr_suspend()
849 + msecs_to_jiffies(musb->a_wait_bcon in musb_handle_intr_suspend()
854 if (!musb->is_active) in musb_handle_intr_suspend()
858 musb_g_suspend(musb); in musb_handle_intr_suspend()
859 musb->is_active = musb->g.b_hnp_enable; in musb_handle_intr_suspend()
860 if (musb->is_active) { in musb_handle_intr_suspend()
861 musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON; in musb_handle_intr_suspend()
862 musb_dbg(musb, "HNP: Setting timer for b_ase0_brst"); in musb_handle_intr_suspend()
863 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_suspend()
869 if (musb->a_wait_bcon != 0) in musb_handle_intr_suspend()
870 musb_platform_try_idle(musb, jiffies in musb_handle_intr_suspend()
871 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_suspend()
874 musb->xceiv->otg->state = OTG_STATE_A_SUSPEND; in musb_handle_intr_suspend()
875 musb->is_active = musb->hcd->self.b_hnp_enable; in musb_handle_intr_suspend()
879 musb_dbg(musb, "REVISIT: SUSPEND as B_HOST"); in musb_handle_intr_suspend()
883 musb->is_active = 0; in musb_handle_intr_suspend()
888 static void musb_handle_intr_connect(struct musb *musb, u8 devctl, u8 int_usb) in musb_handle_intr_connect() argument
890 struct usb_hcd *hcd = musb->hcd; in musb_handle_intr_connect()
892 musb->is_active = 1; in musb_handle_intr_connect()
893 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_connect()
895 musb->intrtxe = musb->epmask; in musb_handle_intr_connect()
896 musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); in musb_handle_intr_connect()
897 musb->intrrxe = musb->epmask & 0xfffe; in musb_handle_intr_connect()
898 musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); in musb_handle_intr_connect()
899 musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); in musb_handle_intr_connect()
900 musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED in musb_handle_intr_connect()
904 musb->port1_status |= USB_PORT_STAT_CONNECTION in musb_handle_intr_connect()
909 musb->port1_status |= USB_PORT_STAT_LOW_SPEED; in musb_handle_intr_connect()
912 switch (musb->xceiv->otg->state) { in musb_handle_intr_connect()
915 musb_dbg(musb, "HNP: SUSPEND+CONNECT, now b_host"); in musb_handle_intr_connect()
919 musb_dbg(musb, "CONNECT as b_peripheral???"); in musb_handle_intr_connect()
922 musb_dbg(musb, "HNP: CONNECT, now b_host"); in musb_handle_intr_connect()
924 musb->xceiv->otg->state = OTG_STATE_B_HOST; in musb_handle_intr_connect()
925 if (musb->hcd) in musb_handle_intr_connect()
926 musb->hcd->self.is_b_host = 1; in musb_handle_intr_connect()
927 del_timer(&musb->otg_timer); in musb_handle_intr_connect()
932 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_handle_intr_connect()
939 musb_host_poke_root_hub(musb); in musb_handle_intr_connect()
941 musb_dbg(musb, "CONNECT (%s) devctl %02x", in musb_handle_intr_connect()
942 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_handle_intr_connect()
945 static void musb_handle_intr_disconnect(struct musb *musb, u8 devctl) in musb_handle_intr_disconnect() argument
947 musb_dbg(musb, "DISCONNECT (%s) as %s, devctl %02x", in musb_handle_intr_disconnect()
948 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_disconnect()
949 MUSB_MODE(musb), devctl); in musb_handle_intr_disconnect()
951 switch (musb->xceiv->otg->state) { in musb_handle_intr_disconnect()
954 musb_host_resume_root_hub(musb); in musb_handle_intr_disconnect()
955 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
956 if (musb->a_wait_bcon != 0) in musb_handle_intr_disconnect()
957 musb_platform_try_idle(musb, jiffies in musb_handle_intr_disconnect()
958 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_disconnect()
966 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
967 if (musb->hcd) in musb_handle_intr_disconnect()
968 musb->hcd->self.is_b_host = 0; in musb_handle_intr_disconnect()
969 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_disconnect()
970 MUSB_DEV_MODE(musb); in musb_handle_intr_disconnect()
971 musb_g_disconnect(musb); in musb_handle_intr_disconnect()
974 musb_hnp_stop(musb); in musb_handle_intr_disconnect()
975 musb_root_disconnect(musb); in musb_handle_intr_disconnect()
980 musb_g_disconnect(musb); in musb_handle_intr_disconnect()
984 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_disconnect()
993 static void musb_handle_intr_reset(struct musb *musb) in musb_handle_intr_reset() argument
995 if (is_host_active(musb)) { in musb_handle_intr_reset()
1004 dev_err(musb->controller, "Babble\n"); in musb_handle_intr_reset()
1005 musb_recover_from_babble(musb); in musb_handle_intr_reset()
1007 musb_dbg(musb, "BUS RESET as %s", in musb_handle_intr_reset()
1008 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
1009 switch (musb->xceiv->otg->state) { in musb_handle_intr_reset()
1011 musb_g_reset(musb); in musb_handle_intr_reset()
1015 musb_dbg(musb, "HNP: in %s, %d msec timeout", in musb_handle_intr_reset()
1016 usb_otg_state_string(musb->xceiv->otg->state), in musb_handle_intr_reset()
1017 TA_WAIT_BCON(musb)); in musb_handle_intr_reset()
1018 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_reset()
1019 + msecs_to_jiffies(TA_WAIT_BCON(musb))); in musb_handle_intr_reset()
1022 del_timer(&musb->otg_timer); in musb_handle_intr_reset()
1023 musb_g_reset(musb); in musb_handle_intr_reset()
1026 musb_dbg(musb, "HNP: RESET (%s), to b_peripheral", in musb_handle_intr_reset()
1027 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
1028 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_reset()
1029 musb_g_reset(musb); in musb_handle_intr_reset()
1032 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_handle_intr_reset()
1035 musb_g_reset(musb); in musb_handle_intr_reset()
1038 musb_dbg(musb, "Unhandled BUS RESET as %s", in musb_handle_intr_reset()
1039 usb_otg_state_string(musb->xceiv->otg->state)); in musb_handle_intr_reset()
1055 static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, in musb_stage0_irq() argument
1060 musb_dbg(musb, "<== DevCtl=%02x, int_usb=0x%x", devctl, int_usb); in musb_stage0_irq()
1067 musb_handle_intr_resume(musb, devctl); in musb_stage0_irq()
1073 if (musb_handle_intr_sessreq(musb, devctl)) in musb_stage0_irq()
1079 musb_handle_intr_vbuserr(musb, devctl); in musb_stage0_irq()
1084 musb_handle_intr_suspend(musb, devctl); in musb_stage0_irq()
1089 musb_handle_intr_connect(musb, devctl, int_usb); in musb_stage0_irq()
1094 musb_handle_intr_disconnect(musb, devctl); in musb_stage0_irq()
1099 musb_handle_intr_reset(musb); in musb_stage0_irq()
1116 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
1121 dev_dbg(musb->controller, "START_OF_FRAME\n"); in musb_stage0_irq()
1126 ep = musb->endpoints; in musb_stage0_irq()
1127 for (epnum = 1; (epnum < musb->nr_endpoints) in musb_stage0_irq()
1128 && (musb->epmask >= (1 << epnum)); in musb_stage0_irq()
1140 musb_h_tx_start(musb, epnum); in musb_stage0_irq()
1142 cppi_hostdma_start(musb, epnum); in musb_stage0_irq()
1148 schedule_delayed_work(&musb->irq_work, 0); in musb_stage0_irq()
1155 static void musb_disable_interrupts(struct musb *musb) in musb_disable_interrupts() argument
1157 void __iomem *mbase = musb->mregs; in musb_disable_interrupts()
1161 musb->intrtxe = 0; in musb_disable_interrupts()
1163 musb->intrrxe = 0; in musb_disable_interrupts()
1172 static void musb_enable_interrupts(struct musb *musb) in musb_enable_interrupts() argument
1174 void __iomem *regs = musb->mregs; in musb_enable_interrupts()
1177 musb->intrtxe = musb->epmask; in musb_enable_interrupts()
1178 musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); in musb_enable_interrupts()
1179 musb->intrrxe = musb->epmask & 0xfffe; in musb_enable_interrupts()
1180 musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); in musb_enable_interrupts()
1188 void musb_start(struct musb *musb) in musb_start() argument
1190 void __iomem *regs = musb->mregs; in musb_start()
1194 musb_dbg(musb, "<== devctl %02x", devctl); in musb_start()
1196 musb_enable_interrupts(musb); in musb_start()
1204 if (musb->config->maximum_speed == USB_SPEED_HIGH || in musb_start()
1205 musb->config->maximum_speed == USB_SPEED_UNKNOWN) in musb_start()
1209 musb->is_active = 0; in musb_start()
1218 if (musb->port_mode != MUSB_HOST && in musb_start()
1219 musb->xceiv->otg->state != OTG_STATE_A_WAIT_BCON && in musb_start()
1221 musb->is_active = 1; in musb_start()
1226 musb_platform_enable(musb); in musb_start()
1237 void musb_stop(struct musb *musb) in musb_stop() argument
1240 musb_platform_disable(musb); in musb_stop()
1241 musb_disable_interrupts(musb); in musb_stop()
1242 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_stop()
1251 musb_platform_try_idle(musb, 0); in musb_stop()
1384 fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, in fifo_setup() argument
1387 void __iomem *mbase = musb->mregs; in fifo_setup()
1401 (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1405 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1416 musb->bulk_ep = hw_ep; in fifo_setup()
1449 musb->epmask |= (1 << hw_ep->epnum); in fifo_setup()
1458 static int ep_config_from_table(struct musb *musb) in ep_config_from_table() argument
1463 struct musb_hw_ep *hw_ep = musb->endpoints; in ep_config_from_table()
1465 if (musb->config->fifo_cfg) { in ep_config_from_table()
1466 cfg = musb->config->fifo_cfg; in ep_config_from_table()
1467 n = musb->config->fifo_cfg_size; in ep_config_from_table()
1505 offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0); in ep_config_from_table()
1515 if (epn >= musb->config->num_eps) { in ep_config_from_table()
1520 offset = fifo_setup(musb, hw_ep + epn, cfg++, offset); in ep_config_from_table()
1527 musb->nr_endpoints = max(epn, musb->nr_endpoints); in ep_config_from_table()
1532 n + 1, musb->config->num_eps * 2 - 1, in ep_config_from_table()
1533 offset, (1 << (musb->config->ram_bits + 2))); in ep_config_from_table()
1535 if (!musb->bulk_ep) { in ep_config_from_table()
1548 static int ep_config_from_hw(struct musb *musb) in ep_config_from_hw() argument
1552 void __iomem *mbase = musb->mregs; in ep_config_from_hw()
1555 musb_dbg(musb, "<== static silicon ep config"); in ep_config_from_hw()
1559 for (epnum = 1; epnum < musb->config->num_eps; epnum++) { in ep_config_from_hw()
1561 hw_ep = musb->endpoints + epnum; in ep_config_from_hw()
1563 ret = musb_read_fifosize(musb, hw_ep, epnum); in ep_config_from_hw()
1577 if (musb->bulk_ep) in ep_config_from_hw()
1579 musb->bulk_ep = hw_ep; in ep_config_from_hw()
1582 if (!musb->bulk_ep) { in ep_config_from_hw()
1595 static int musb_core_init(u16 musb_type, struct musb *musb) in musb_core_init() argument
1600 void __iomem *mbase = musb->mregs; in musb_core_init()
1610 musb->dyn_fifo = true; in musb_core_init()
1614 musb->bulk_combine = true; in musb_core_init()
1618 musb->bulk_split = true; in musb_core_init()
1622 musb->hb_iso_rx = true; in musb_core_init()
1626 musb->hb_iso_tx = true; in musb_core_init()
1634 musb->is_multipoint = 1; in musb_core_init()
1637 musb->is_multipoint = 0; in musb_core_init()
1647 musb->hwvers = musb_readw(mbase, MUSB_HWVERS); in musb_core_init()
1649 musb_driver_name, type, MUSB_HWVERS_MAJOR(musb->hwvers), in musb_core_init()
1650 MUSB_HWVERS_MINOR(musb->hwvers), in musb_core_init()
1651 (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : ""); in musb_core_init()
1654 musb_configure_ep0(musb); in musb_core_init()
1657 musb->nr_endpoints = 1; in musb_core_init()
1658 musb->epmask = 1; in musb_core_init()
1660 if (musb->dyn_fifo) in musb_core_init()
1661 status = ep_config_from_table(musb); in musb_core_init()
1663 status = ep_config_from_hw(musb); in musb_core_init()
1669 for (i = 0; i < musb->nr_endpoints; i++) { in musb_core_init()
1670 struct musb_hw_ep *hw_ep = musb->endpoints + i; in musb_core_init()
1672 hw_ep->fifo = musb->io.fifo_offset(i) + mbase; in musb_core_init()
1674 if (musb->ops->quirks & MUSB_IN_TUSB) { in musb_core_init()
1675 hw_ep->fifo_async = musb->async + 0x400 + in musb_core_init()
1676 musb->io.fifo_offset(i); in musb_core_init()
1677 hw_ep->fifo_sync = musb->sync + 0x400 + in musb_core_init()
1678 musb->io.fifo_offset(i); in musb_core_init()
1680 musb->sync_va + 0x400 + musb->io.fifo_offset(i); in musb_core_init()
1690 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase; in musb_core_init()
1695 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d", in musb_core_init()
1703 musb_dbg(musb, "%s: hw_ep %d%s, %smax %d", in musb_core_init()
1711 musb_dbg(musb, "hw_ep %d not configured", i); in musb_core_init()
1726 irqreturn_t musb_interrupt(struct musb *musb) in musb_interrupt() argument
1733 if (!musb->int_usb && !musb->int_tx && !musb->int_rx) in musb_interrupt()
1736 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_interrupt()
1738 trace_musb_isr(musb); in musb_interrupt()
1760 if (musb->int_usb) in musb_interrupt()
1761 retval |= musb_stage0_irq(musb, musb->int_usb, devctl); in musb_interrupt()
1763 if (musb->int_tx & 1) { in musb_interrupt()
1764 if (is_host_active(musb)) in musb_interrupt()
1765 retval |= musb_h_ep0_irq(musb); in musb_interrupt()
1767 retval |= musb_g_ep0_irq(musb); in musb_interrupt()
1770 musb->int_tx &= ~BIT(0); in musb_interrupt()
1773 status = musb->int_tx; in musb_interrupt()
1777 if (is_host_active(musb)) in musb_interrupt()
1778 musb_host_tx(musb, epnum); in musb_interrupt()
1780 musb_g_tx(musb, epnum); in musb_interrupt()
1783 status = musb->int_rx; in musb_interrupt()
1787 if (is_host_active(musb)) in musb_interrupt()
1788 musb_host_rx(musb, epnum); in musb_interrupt()
1790 musb_g_rx(musb, epnum); in musb_interrupt()
1804 void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit) in musb_dma_completion() argument
1809 if (!is_cppi_enabled(musb)) { in musb_dma_completion()
1811 if (is_host_active(musb)) in musb_dma_completion()
1812 musb_h_ep0_irq(musb); in musb_dma_completion()
1814 musb_g_ep0_irq(musb); in musb_dma_completion()
1819 if (is_host_active(musb)) in musb_dma_completion()
1820 musb_host_tx(musb, epnum); in musb_dma_completion()
1822 musb_g_tx(musb, epnum); in musb_dma_completion()
1825 if (is_host_active(musb)) in musb_dma_completion()
1826 musb_host_rx(musb, epnum); in musb_dma_completion()
1828 musb_g_rx(musb, epnum); in musb_dma_completion()
1861 struct musb *musb = dev_to_musb(dev); in mode_show() local
1865 spin_lock_irqsave(&musb->lock, flags); in mode_show()
1866 ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state)); in mode_show()
1867 spin_unlock_irqrestore(&musb->lock, flags); in mode_show()
1876 struct musb *musb = dev_to_musb(dev); in mode_store() local
1880 spin_lock_irqsave(&musb->lock, flags); in mode_store()
1882 status = musb_platform_set_mode(musb, MUSB_HOST); in mode_store()
1884 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in mode_store()
1886 status = musb_platform_set_mode(musb, MUSB_OTG); in mode_store()
1889 spin_unlock_irqrestore(&musb->lock, flags); in mode_store()
1899 struct musb *musb = dev_to_musb(dev); in vbus_store() local
1908 spin_lock_irqsave(&musb->lock, flags); in vbus_store()
1910 musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ; in vbus_store()
1911 if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON) in vbus_store()
1912 musb->is_active = 0; in vbus_store()
1913 musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val)); in vbus_store()
1914 spin_unlock_irqrestore(&musb->lock, flags); in vbus_store()
1922 struct musb *musb = dev_to_musb(dev); in vbus_show() local
1929 spin_lock_irqsave(&musb->lock, flags); in vbus_show()
1930 val = musb->a_wait_bcon; in vbus_show()
1931 vbus = musb_platform_get_vbus_status(musb); in vbus_show()
1934 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in vbus_show()
1941 spin_unlock_irqrestore(&musb->lock, flags); in vbus_show()
1955 struct musb *musb = dev_to_musb(dev); in srp_store() local
1965 musb_g_wakeup(musb); in srp_store()
1977 ATTRIBUTE_GROUPS(musb);
1988 static bool musb_state_needs_recheck(struct musb *musb, u8 devctl, in musb_state_needs_recheck() argument
1991 if (musb->quirk_retries && !musb->flush_irq_work) { in musb_state_needs_recheck()
1992 trace_musb_state(musb, devctl, desc); in musb_state_needs_recheck()
1993 schedule_delayed_work(&musb->irq_work, in musb_state_needs_recheck()
1995 musb->quirk_retries--; in musb_state_needs_recheck()
2011 static void musb_pm_runtime_check_session(struct musb *musb) in musb_pm_runtime_check_session() argument
2016 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_pm_runtime_check_session()
2023 musb_state_needs_recheck(musb, devctl, in musb_pm_runtime_check_session()
2027 if (musb_state_needs_recheck(musb, devctl, in musb_pm_runtime_check_session()
2032 if (musb_state_needs_recheck(musb, devctl, in musb_pm_runtime_check_session()
2035 if (!musb->session) in musb_pm_runtime_check_session()
2037 trace_musb_state(musb, devctl, "Allow PM on possible host mode disconnect"); in musb_pm_runtime_check_session()
2038 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
2039 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
2040 musb->session = false; in musb_pm_runtime_check_session()
2048 if (s == musb->session) in musb_pm_runtime_check_session()
2053 trace_musb_state(musb, devctl, "Block PM on active session"); in musb_pm_runtime_check_session()
2054 error = pm_runtime_get_sync(musb->controller); in musb_pm_runtime_check_session()
2056 dev_err(musb->controller, "Could not enable: %i\n", in musb_pm_runtime_check_session()
2058 musb->quirk_retries = 3; in musb_pm_runtime_check_session()
2066 schedule_delayed_work(&musb->irq_work, in musb_pm_runtime_check_session()
2069 trace_musb_state(musb, devctl, "Allow PM with no session"); in musb_pm_runtime_check_session()
2070 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
2071 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
2074 musb->session = s; in musb_pm_runtime_check_session()
2080 struct musb *musb = container_of(data, struct musb, irq_work.work); in musb_irq_work() local
2083 error = pm_runtime_resume_and_get(musb->controller); in musb_irq_work()
2085 dev_err(musb->controller, "Could not enable: %i\n", error); in musb_irq_work()
2090 musb_pm_runtime_check_session(musb); in musb_irq_work()
2092 if (musb->xceiv->otg->state != musb->xceiv_old_state) { in musb_irq_work()
2093 musb->xceiv_old_state = musb->xceiv->otg->state; in musb_irq_work()
2094 sysfs_notify(&musb->controller->kobj, NULL, "mode"); in musb_irq_work()
2097 pm_runtime_mark_last_busy(musb->controller); in musb_irq_work()
2098 pm_runtime_put_autosuspend(musb->controller); in musb_irq_work()
2101 static void musb_recover_from_babble(struct musb *musb) in musb_recover_from_babble() argument
2106 musb_disable_interrupts(musb); in musb_recover_from_babble()
2114 ret = musb_platform_recover(musb); in musb_recover_from_babble()
2116 musb_enable_interrupts(musb); in musb_recover_from_babble()
2121 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_recover_from_babble()
2123 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_recover_from_babble()
2126 musb_root_disconnect(musb); in musb_recover_from_babble()
2132 if (musb->dyn_fifo) in musb_recover_from_babble()
2133 ret = ep_config_from_table(musb); in musb_recover_from_babble()
2135 ret = ep_config_from_hw(musb); in musb_recover_from_babble()
2139 musb_start(musb); in musb_recover_from_babble()
2146 static struct musb *allocate_instance(struct device *dev, in allocate_instance()
2149 struct musb *musb; in allocate_instance() local
2154 musb = devm_kzalloc(dev, sizeof(*musb), GFP_KERNEL); in allocate_instance()
2155 if (!musb) in allocate_instance()
2158 INIT_LIST_HEAD(&musb->control); in allocate_instance()
2159 INIT_LIST_HEAD(&musb->in_bulk); in allocate_instance()
2160 INIT_LIST_HEAD(&musb->out_bulk); in allocate_instance()
2161 INIT_LIST_HEAD(&musb->pending_list); in allocate_instance()
2163 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; in allocate_instance()
2164 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; in allocate_instance()
2165 musb->mregs = mbase; in allocate_instance()
2166 musb->ctrl_base = mbase; in allocate_instance()
2167 musb->nIrq = -ENODEV; in allocate_instance()
2168 musb->config = config; in allocate_instance()
2169 BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS); in allocate_instance()
2170 for (epnum = 0, ep = musb->endpoints; in allocate_instance()
2171 epnum < musb->config->num_eps; in allocate_instance()
2173 ep->musb = musb; in allocate_instance()
2177 musb->controller = dev; in allocate_instance()
2179 ret = musb_host_alloc(musb); in allocate_instance()
2183 dev_set_drvdata(dev, musb); in allocate_instance()
2185 return musb; in allocate_instance()
2191 static void musb_free(struct musb *musb) in musb_free() argument
2198 if (musb->nIrq >= 0) { in musb_free()
2199 if (musb->irq_wake) in musb_free()
2200 disable_irq_wake(musb->nIrq); in musb_free()
2201 free_irq(musb->nIrq, musb); in musb_free()
2204 musb_host_free(musb); in musb_free()
2208 int (*callback)(struct musb *musb, void *data);
2218 static int musb_run_resume_work(struct musb *musb) in musb_run_resume_work() argument
2224 spin_lock_irqsave(&musb->list_lock, flags); in musb_run_resume_work()
2225 list_for_each_entry_safe(w, _w, &musb->pending_list, node) { in musb_run_resume_work()
2227 error = w->callback(musb, w->data); in musb_run_resume_work()
2229 dev_err(musb->controller, in musb_run_resume_work()
2235 devm_kfree(musb->controller, w); in musb_run_resume_work()
2237 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_run_resume_work()
2251 int musb_queue_resume_work(struct musb *musb, in musb_queue_resume_work() argument
2252 int (*callback)(struct musb *musb, void *data), in musb_queue_resume_work() argument
2263 spin_lock_irqsave(&musb->list_lock, flags); in musb_queue_resume_work()
2264 is_suspended = musb->is_runtime_suspended; in musb_queue_resume_work()
2267 w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC); in musb_queue_resume_work()
2276 list_add_tail(&w->node, &musb->pending_list); in musb_queue_resume_work()
2281 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_queue_resume_work()
2284 error = callback(musb, data); in musb_queue_resume_work()
2292 struct musb *musb; in musb_deassert_reset() local
2295 musb = container_of(work, struct musb, deassert_reset_work.work); in musb_deassert_reset()
2297 spin_lock_irqsave(&musb->lock, flags); in musb_deassert_reset()
2299 if (musb->port1_status & USB_PORT_STAT_RESET) in musb_deassert_reset()
2300 musb_port_reset(musb, false); in musb_deassert_reset()
2302 spin_unlock_irqrestore(&musb->lock, flags); in musb_deassert_reset()
2317 struct musb *musb; in musb_init_controller() local
2330 musb = allocate_instance(dev, plat->config, ctrl); in musb_init_controller()
2331 if (!musb) { in musb_init_controller()
2336 spin_lock_init(&musb->lock); in musb_init_controller()
2337 spin_lock_init(&musb->list_lock); in musb_init_controller()
2338 musb->board_set_power = plat->set_power; in musb_init_controller()
2339 musb->min_power = plat->min_power; in musb_init_controller()
2340 musb->ops = plat->platform_ops; in musb_init_controller()
2341 musb->port_mode = plat->mode; in musb_init_controller()
2365 status = musb_platform_init(musb); in musb_init_controller()
2369 if (!musb->isr) { in musb_init_controller()
2376 if (musb->ops->quirks & MUSB_INDEXED_EP) { in musb_init_controller()
2377 musb->io.ep_offset = musb_indexed_ep_offset; in musb_init_controller()
2378 musb->io.ep_select = musb_indexed_ep_select; in musb_init_controller()
2380 musb->io.ep_offset = musb_flat_ep_offset; in musb_init_controller()
2381 musb->io.ep_select = musb_flat_ep_select; in musb_init_controller()
2384 if (musb->ops->quirks & MUSB_G_NO_SKB_RESERVE) in musb_init_controller()
2385 musb->g.quirk_avoids_skb_reserve = 1; in musb_init_controller()
2388 if (musb->ops->ep_offset) in musb_init_controller()
2389 musb->io.ep_offset = musb->ops->ep_offset; in musb_init_controller()
2390 if (musb->ops->ep_select) in musb_init_controller()
2391 musb->io.ep_select = musb->ops->ep_select; in musb_init_controller()
2393 if (musb->ops->fifo_mode) in musb_init_controller()
2394 fifo_mode = musb->ops->fifo_mode; in musb_init_controller()
2398 if (musb->ops->fifo_offset) in musb_init_controller()
2399 musb->io.fifo_offset = musb->ops->fifo_offset; in musb_init_controller()
2401 musb->io.fifo_offset = musb_default_fifo_offset; in musb_init_controller()
2403 if (musb->ops->busctl_offset) in musb_init_controller()
2404 musb->io.busctl_offset = musb->ops->busctl_offset; in musb_init_controller()
2406 musb->io.busctl_offset = musb_default_busctl_offset; in musb_init_controller()
2408 if (musb->ops->readb) in musb_init_controller()
2409 musb_readb = musb->ops->readb; in musb_init_controller()
2410 if (musb->ops->writeb) in musb_init_controller()
2411 musb_writeb = musb->ops->writeb; in musb_init_controller()
2412 if (musb->ops->clearb) in musb_init_controller()
2413 musb_clearb = musb->ops->clearb; in musb_init_controller()
2417 if (musb->ops->readw) in musb_init_controller()
2418 musb_readw = musb->ops->readw; in musb_init_controller()
2419 if (musb->ops->writew) in musb_init_controller()
2420 musb_writew = musb->ops->writew; in musb_init_controller()
2421 if (musb->ops->clearw) in musb_init_controller()
2422 musb_clearw = musb->ops->clearw; in musb_init_controller()
2427 if (!musb->ops->dma_init || !musb->ops->dma_exit) { in musb_init_controller()
2432 musb_dma_controller_create = musb->ops->dma_init; in musb_init_controller()
2433 musb_dma_controller_destroy = musb->ops->dma_exit; in musb_init_controller()
2436 if (musb->ops->read_fifo) in musb_init_controller()
2437 musb->io.read_fifo = musb->ops->read_fifo; in musb_init_controller()
2439 musb->io.read_fifo = musb_default_read_fifo; in musb_init_controller()
2441 if (musb->ops->write_fifo) in musb_init_controller()
2442 musb->io.write_fifo = musb->ops->write_fifo; in musb_init_controller()
2444 musb->io.write_fifo = musb_default_write_fifo; in musb_init_controller()
2446 if (musb->ops->get_toggle) in musb_init_controller()
2447 musb->io.get_toggle = musb->ops->get_toggle; in musb_init_controller()
2449 musb->io.get_toggle = musb_default_get_toggle; in musb_init_controller()
2451 if (musb->ops->set_toggle) in musb_init_controller()
2452 musb->io.set_toggle = musb->ops->set_toggle; in musb_init_controller()
2454 musb->io.set_toggle = musb_default_set_toggle; in musb_init_controller()
2456 if (!musb->xceiv->io_ops) { in musb_init_controller()
2457 musb->xceiv->io_dev = musb->controller; in musb_init_controller()
2458 musb->xceiv->io_priv = musb->mregs; in musb_init_controller()
2459 musb->xceiv->io_ops = &musb_ulpi_access; in musb_init_controller()
2462 if (musb->ops->phy_callback) in musb_init_controller()
2463 musb_phy_callback = musb->ops->phy_callback; in musb_init_controller()
2472 pm_runtime_use_autosuspend(musb->controller); in musb_init_controller()
2473 pm_runtime_set_autosuspend_delay(musb->controller, 500); in musb_init_controller()
2474 pm_runtime_enable(musb->controller); in musb_init_controller()
2475 pm_runtime_get_sync(musb->controller); in musb_init_controller()
2477 status = usb_phy_init(musb->xceiv); in musb_init_controller()
2482 musb->dma_controller = in musb_init_controller()
2483 musb_dma_controller_create(musb, musb->mregs); in musb_init_controller()
2484 if (IS_ERR(musb->dma_controller)) { in musb_init_controller()
2485 status = PTR_ERR(musb->dma_controller); in musb_init_controller()
2491 musb_platform_disable(musb); in musb_init_controller()
2492 musb_disable_interrupts(musb); in musb_init_controller()
2493 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_init_controller()
2496 musb_writeb(musb->mregs, MUSB_POWER, 0); in musb_init_controller()
2499 INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); in musb_init_controller()
2500 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); in musb_init_controller()
2501 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); in musb_init_controller()
2506 : MUSB_CONTROLLER_HDRC, musb); in musb_init_controller()
2510 timer_setup(&musb->otg_timer, musb_otg_timer_func, 0); in musb_init_controller()
2513 if (request_irq(nIrq, musb->isr, IRQF_SHARED, dev_name(dev), musb)) { in musb_init_controller()
2518 musb->nIrq = nIrq; in musb_init_controller()
2521 musb->irq_wake = 1; in musb_init_controller()
2524 musb->irq_wake = 0; in musb_init_controller()
2529 u8 busctl = musb_readb(musb->mregs, MUSB_ULPI_BUSCONTROL); in musb_init_controller()
2531 musb_writeb(musb->mregs, MUSB_ULPI_BUSCONTROL, busctl); in musb_init_controller()
2534 MUSB_DEV_MODE(musb); in musb_init_controller()
2535 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in musb_init_controller()
2537 switch (musb->port_mode) { in musb_init_controller()
2539 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2542 status = musb_platform_set_mode(musb, MUSB_HOST); in musb_init_controller()
2545 status = musb_gadget_setup(musb); in musb_init_controller()
2548 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in musb_init_controller()
2551 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2554 status = musb_gadget_setup(musb); in musb_init_controller()
2556 musb_host_cleanup(musb); in musb_init_controller()
2559 status = musb_platform_set_mode(musb, MUSB_OTG); in musb_init_controller()
2562 dev_err(dev, "unsupported port mode %d\n", musb->port_mode); in musb_init_controller()
2569 musb_init_debugfs(musb); in musb_init_controller()
2571 musb->is_initialized = 1; in musb_init_controller()
2572 pm_runtime_mark_last_busy(musb->controller); in musb_init_controller()
2573 pm_runtime_put_autosuspend(musb->controller); in musb_init_controller()
2578 cancel_delayed_work_sync(&musb->irq_work); in musb_init_controller()
2579 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_init_controller()
2580 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_init_controller()
2581 if (musb->dma_controller) in musb_init_controller()
2582 musb_dma_controller_destroy(musb->dma_controller); in musb_init_controller()
2585 usb_phy_shutdown(musb->xceiv); in musb_init_controller()
2588 pm_runtime_dont_use_autosuspend(musb->controller); in musb_init_controller()
2589 pm_runtime_put_sync(musb->controller); in musb_init_controller()
2590 pm_runtime_disable(musb->controller); in musb_init_controller()
2593 if (musb->irq_wake) in musb_init_controller()
2595 musb_platform_exit(musb); in musb_init_controller()
2599 dev_err(musb->controller, in musb_init_controller()
2602 musb_free(musb); in musb_init_controller()
2634 struct musb *musb = dev_to_musb(dev); in musb_remove() local
2642 musb_exit_debugfs(musb); in musb_remove()
2644 cancel_delayed_work_sync(&musb->irq_work); in musb_remove()
2645 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_remove()
2646 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_remove()
2647 pm_runtime_get_sync(musb->controller); in musb_remove()
2648 musb_host_cleanup(musb); in musb_remove()
2649 musb_gadget_cleanup(musb); in musb_remove()
2651 musb_platform_disable(musb); in musb_remove()
2652 spin_lock_irqsave(&musb->lock, flags); in musb_remove()
2653 musb_disable_interrupts(musb); in musb_remove()
2654 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_remove()
2655 spin_unlock_irqrestore(&musb->lock, flags); in musb_remove()
2656 musb_platform_exit(musb); in musb_remove()
2658 pm_runtime_dont_use_autosuspend(musb->controller); in musb_remove()
2659 pm_runtime_put_sync(musb->controller); in musb_remove()
2660 pm_runtime_disable(musb->controller); in musb_remove()
2662 if (musb->dma_controller) in musb_remove()
2663 musb_dma_controller_destroy(musb->dma_controller); in musb_remove()
2664 usb_phy_shutdown(musb->xceiv); in musb_remove()
2665 musb_free(musb); in musb_remove()
2672 static void musb_save_context(struct musb *musb) in musb_save_context() argument
2675 void __iomem *musb_base = musb->mregs; in musb_save_context()
2678 musb->context.frame = musb_readw(musb_base, MUSB_FRAME); in musb_save_context()
2679 musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); in musb_save_context()
2680 musb->context.busctl = musb_readb(musb_base, MUSB_ULPI_BUSCONTROL); in musb_save_context()
2681 musb->context.power = musb_readb(musb_base, MUSB_POWER); in musb_save_context()
2682 musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); in musb_save_context()
2683 musb->context.index = musb_readb(musb_base, MUSB_INDEX); in musb_save_context()
2684 musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); in musb_save_context()
2686 for (i = 0; i < musb->config->num_eps; ++i) { in musb_save_context()
2689 hw_ep = &musb->endpoints[i]; in musb_save_context()
2698 musb->context.index_regs[i].txmaxp = in musb_save_context()
2700 musb->context.index_regs[i].txcsr = in musb_save_context()
2702 musb->context.index_regs[i].rxmaxp = in musb_save_context()
2704 musb->context.index_regs[i].rxcsr = in musb_save_context()
2707 if (musb->dyn_fifo) { in musb_save_context()
2708 musb->context.index_regs[i].txfifoadd = in musb_save_context()
2710 musb->context.index_regs[i].rxfifoadd = in musb_save_context()
2712 musb->context.index_regs[i].txfifosz = in musb_save_context()
2714 musb->context.index_regs[i].rxfifosz = in musb_save_context()
2718 musb->context.index_regs[i].txtype = in musb_save_context()
2720 musb->context.index_regs[i].txinterval = in musb_save_context()
2722 musb->context.index_regs[i].rxtype = in musb_save_context()
2724 musb->context.index_regs[i].rxinterval = in musb_save_context()
2727 musb->context.index_regs[i].txfunaddr = in musb_save_context()
2728 musb_read_txfunaddr(musb, i); in musb_save_context()
2729 musb->context.index_regs[i].txhubaddr = in musb_save_context()
2730 musb_read_txhubaddr(musb, i); in musb_save_context()
2731 musb->context.index_regs[i].txhubport = in musb_save_context()
2732 musb_read_txhubport(musb, i); in musb_save_context()
2734 musb->context.index_regs[i].rxfunaddr = in musb_save_context()
2735 musb_read_rxfunaddr(musb, i); in musb_save_context()
2736 musb->context.index_regs[i].rxhubaddr = in musb_save_context()
2737 musb_read_rxhubaddr(musb, i); in musb_save_context()
2738 musb->context.index_regs[i].rxhubport = in musb_save_context()
2739 musb_read_rxhubport(musb, i); in musb_save_context()
2743 static void musb_restore_context(struct musb *musb) in musb_restore_context() argument
2746 void __iomem *musb_base = musb->mregs; in musb_restore_context()
2750 musb_writew(musb_base, MUSB_FRAME, musb->context.frame); in musb_restore_context()
2751 musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); in musb_restore_context()
2752 musb_writeb(musb_base, MUSB_ULPI_BUSCONTROL, musb->context.busctl); in musb_restore_context()
2757 musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); in musb_restore_context()
2758 power |= musb->context.power; in musb_restore_context()
2761 musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); in musb_restore_context()
2762 musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); in musb_restore_context()
2763 musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); in musb_restore_context()
2764 if (musb->context.devctl & MUSB_DEVCTL_SESSION) in musb_restore_context()
2765 musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); in musb_restore_context()
2767 for (i = 0; i < musb->config->num_eps; ++i) { in musb_restore_context()
2770 hw_ep = &musb->endpoints[i]; in musb_restore_context()
2780 musb->context.index_regs[i].txmaxp); in musb_restore_context()
2782 musb->context.index_regs[i].txcsr); in musb_restore_context()
2784 musb->context.index_regs[i].rxmaxp); in musb_restore_context()
2786 musb->context.index_regs[i].rxcsr); in musb_restore_context()
2788 if (musb->dyn_fifo) { in musb_restore_context()
2790 musb->context.index_regs[i].txfifosz); in musb_restore_context()
2792 musb->context.index_regs[i].rxfifosz); in musb_restore_context()
2794 musb->context.index_regs[i].txfifoadd); in musb_restore_context()
2796 musb->context.index_regs[i].rxfifoadd); in musb_restore_context()
2800 musb->context.index_regs[i].txtype); in musb_restore_context()
2802 musb->context.index_regs[i].txinterval); in musb_restore_context()
2804 musb->context.index_regs[i].rxtype); in musb_restore_context()
2807 musb->context.index_regs[i].rxinterval); in musb_restore_context()
2808 musb_write_txfunaddr(musb, i, in musb_restore_context()
2809 musb->context.index_regs[i].txfunaddr); in musb_restore_context()
2810 musb_write_txhubaddr(musb, i, in musb_restore_context()
2811 musb->context.index_regs[i].txhubaddr); in musb_restore_context()
2812 musb_write_txhubport(musb, i, in musb_restore_context()
2813 musb->context.index_regs[i].txhubport); in musb_restore_context()
2815 musb_write_rxfunaddr(musb, i, in musb_restore_context()
2816 musb->context.index_regs[i].rxfunaddr); in musb_restore_context()
2817 musb_write_rxhubaddr(musb, i, in musb_restore_context()
2818 musb->context.index_regs[i].rxhubaddr); in musb_restore_context()
2819 musb_write_rxhubport(musb, i, in musb_restore_context()
2820 musb->context.index_regs[i].rxhubport); in musb_restore_context()
2822 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); in musb_restore_context()
2827 struct musb *musb = dev_to_musb(dev); in musb_suspend() local
2837 musb_platform_disable(musb); in musb_suspend()
2838 musb_disable_interrupts(musb); in musb_suspend()
2840 musb->flush_irq_work = true; in musb_suspend()
2841 while (flush_delayed_work(&musb->irq_work)) in musb_suspend()
2843 musb->flush_irq_work = false; in musb_suspend()
2845 if (!(musb->ops->quirks & MUSB_PRESERVE_SESSION)) in musb_suspend()
2846 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_suspend()
2848 WARN_ON(!list_empty(&musb->pending_list)); in musb_suspend()
2850 spin_lock_irqsave(&musb->lock, flags); in musb_suspend()
2852 if (is_peripheral_active(musb)) { in musb_suspend()
2856 } else if (is_host_active(musb)) { in musb_suspend()
2862 musb_save_context(musb); in musb_suspend()
2864 spin_unlock_irqrestore(&musb->lock, flags); in musb_suspend()
2870 struct musb *musb = dev_to_musb(dev); in musb_resume() local
2886 musb_restore_context(musb); in musb_resume()
2888 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_resume()
2890 if ((devctl & mask) != (musb->context.devctl & mask)) in musb_resume()
2891 musb->port1_status = 0; in musb_resume()
2893 musb_enable_interrupts(musb); in musb_resume()
2894 musb_platform_enable(musb); in musb_resume()
2897 if (musb->port_mode == MUSB_HOST && in musb_resume()
2898 !(musb->ops->quirks & MUSB_PRESERVE_SESSION)) { in musb_resume()
2900 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_resume()
2903 spin_lock_irqsave(&musb->lock, flags); in musb_resume()
2904 error = musb_run_resume_work(musb); in musb_resume()
2906 dev_err(musb->controller, "resume work failed with %i\n", in musb_resume()
2908 spin_unlock_irqrestore(&musb->lock, flags); in musb_resume()
2918 struct musb *musb = dev_to_musb(dev); in musb_runtime_suspend() local
2920 musb_save_context(musb); in musb_runtime_suspend()
2921 musb->is_runtime_suspended = 1; in musb_runtime_suspend()
2928 struct musb *musb = dev_to_musb(dev); in musb_runtime_resume() local
2941 if (!musb->is_initialized) in musb_runtime_resume()
2944 musb_restore_context(musb); in musb_runtime_resume()
2946 spin_lock_irqsave(&musb->lock, flags); in musb_runtime_resume()
2947 error = musb_run_resume_work(musb); in musb_runtime_resume()
2949 dev_err(musb->controller, "resume work failed with %i\n", in musb_runtime_resume()
2951 musb->is_runtime_suspended = 0; in musb_runtime_resume()
2952 spin_unlock_irqrestore(&musb->lock, flags); in musb_runtime_resume()