Lines Matching refs:musb
127 static inline struct musb *dev_to_musb(struct device *dev) in dev_to_musb()
295 struct musb *musb = hw_ep->musb; in musb_default_write_fifo() local
303 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_write_fifo()
339 struct musb *musb = hw_ep->musb; in musb_default_read_fifo() local
345 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_read_fifo()
399 (*musb_dma_controller_create)(struct musb *musb, void __iomem *base);
411 return hw_ep->musb->io.read_fifo(hw_ep, len, dst); in musb_read_fifo()
416 return hw_ep->musb->io.write_fifo(hw_ep, len, src); in musb_write_fifo()
441 void musb_load_testpacket(struct musb *musb) in musb_load_testpacket() argument
443 void __iomem *regs = musb->endpoints[0].regs; in musb_load_testpacket()
445 musb_ep_select(musb->mregs, 0); in musb_load_testpacket()
446 musb_write_fifo(musb->control_ep, in musb_load_testpacket()
458 struct musb *musb = (struct musb *)data; in musb_otg_timer_func() local
461 spin_lock_irqsave(&musb->lock, flags); in musb_otg_timer_func()
462 switch (musb->xceiv->otg->state) { in musb_otg_timer_func()
464 dev_dbg(musb->controller, "HNP: b_wait_acon timeout; back to b_peripheral\n"); in musb_otg_timer_func()
465 musb_g_disconnect(musb); in musb_otg_timer_func()
466 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_otg_timer_func()
467 musb->is_active = 0; in musb_otg_timer_func()
471 dev_dbg(musb->controller, "HNP: %s timeout\n", in musb_otg_timer_func()
472 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
473 musb_platform_set_vbus(musb, 0); in musb_otg_timer_func()
474 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL; in musb_otg_timer_func()
477 dev_dbg(musb->controller, "HNP: Unhandled mode %s\n", in musb_otg_timer_func()
478 usb_otg_state_string(musb->xceiv->otg->state)); in musb_otg_timer_func()
480 spin_unlock_irqrestore(&musb->lock, flags); in musb_otg_timer_func()
486 void musb_hnp_stop(struct musb *musb) in musb_hnp_stop() argument
488 struct usb_hcd *hcd = musb->hcd; in musb_hnp_stop()
489 void __iomem *mbase = musb->mregs; in musb_hnp_stop()
492 dev_dbg(musb->controller, "HNP: stop from %s\n", in musb_hnp_stop()
493 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
495 switch (musb->xceiv->otg->state) { in musb_hnp_stop()
497 musb_g_disconnect(musb); in musb_hnp_stop()
498 dev_dbg(musb->controller, "HNP: back to %s\n", in musb_hnp_stop()
499 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
502 dev_dbg(musb->controller, "HNP: Disabling HR\n"); in musb_hnp_stop()
505 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_hnp_stop()
506 MUSB_DEV_MODE(musb); in musb_hnp_stop()
513 dev_dbg(musb->controller, "HNP: Stopping in unknown state %s\n", in musb_hnp_stop()
514 usb_otg_state_string(musb->xceiv->otg->state)); in musb_hnp_stop()
522 musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16); in musb_hnp_stop()
525 static void musb_recover_from_babble(struct musb *musb);
539 static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, in musb_stage0_irq() argument
544 dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl, in musb_stage0_irq()
553 dev_dbg(musb->controller, "RESUME (%s)\n", in musb_stage0_irq()
554 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
557 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
563 musb->port1_status |= in musb_stage0_irq()
566 musb->rh_timer = jiffies in musb_stage0_irq()
568 musb->need_finish_resume = 1; in musb_stage0_irq()
570 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_stage0_irq()
571 musb->is_active = 1; in musb_stage0_irq()
572 musb_host_resume_root_hub(musb); in musb_stage0_irq()
575 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_stage0_irq()
576 musb->is_active = 1; in musb_stage0_irq()
577 MUSB_DEV_MODE(musb); in musb_stage0_irq()
582 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
585 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
588 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_stage0_irq()
589 musb_host_resume_root_hub(musb); in musb_stage0_irq()
599 musb->int_usb |= MUSB_INTR_DISCONNECT; in musb_stage0_irq()
600 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_stage0_irq()
603 musb_g_resume(musb); in musb_stage0_irq()
606 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_stage0_irq()
611 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
618 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
622 dev_dbg(musb->controller, "SessReq while on B state\n"); in musb_stage0_irq()
626 dev_dbg(musb->controller, "SESSION_REQUEST (%s)\n", in musb_stage0_irq()
627 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
637 musb->ep0_stage = MUSB_EP0_START; in musb_stage0_irq()
638 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in musb_stage0_irq()
639 MUSB_HST_MODE(musb); in musb_stage0_irq()
640 musb_platform_set_vbus(musb, 1); in musb_stage0_irq()
664 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
674 if (musb->vbuserr_retry) { in musb_stage0_irq()
675 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
677 musb->vbuserr_retry--; in musb_stage0_irq()
682 musb->port1_status |= in musb_stage0_irq()
691 dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller, in musb_stage0_irq()
693 usb_otg_state_string(musb->xceiv->otg->state), in musb_stage0_irq()
707 VBUSERR_RETRY_COUNT - musb->vbuserr_retry, in musb_stage0_irq()
708 musb->port1_status); in musb_stage0_irq()
712 musb_platform_set_vbus(musb, 0); in musb_stage0_irq()
717 dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n", in musb_stage0_irq()
718 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_stage0_irq()
721 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
730 musb_hnp_stop(musb); in musb_stage0_irq()
731 musb_host_resume_root_hub(musb); in musb_stage0_irq()
732 musb_root_disconnect(musb); in musb_stage0_irq()
733 musb_platform_try_idle(musb, jiffies in musb_stage0_irq()
734 + msecs_to_jiffies(musb->a_wait_bcon in musb_stage0_irq()
739 if (!musb->is_active) in musb_stage0_irq()
742 musb_g_suspend(musb); in musb_stage0_irq()
743 musb->is_active = musb->g.b_hnp_enable; in musb_stage0_irq()
744 if (musb->is_active) { in musb_stage0_irq()
745 musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON; in musb_stage0_irq()
746 dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); in musb_stage0_irq()
747 mod_timer(&musb->otg_timer, jiffies in musb_stage0_irq()
753 if (musb->a_wait_bcon != 0) in musb_stage0_irq()
754 musb_platform_try_idle(musb, jiffies in musb_stage0_irq()
755 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_stage0_irq()
758 musb->xceiv->otg->state = OTG_STATE_A_SUSPEND; in musb_stage0_irq()
759 musb->is_active = musb->hcd->self.b_hnp_enable; in musb_stage0_irq()
763 dev_dbg(musb->controller, "REVISIT: SUSPEND as B_HOST\n"); in musb_stage0_irq()
767 musb->is_active = 0; in musb_stage0_irq()
773 struct usb_hcd *hcd = musb->hcd; in musb_stage0_irq()
776 musb->is_active = 1; in musb_stage0_irq()
778 musb->ep0_stage = MUSB_EP0_START; in musb_stage0_irq()
780 musb->intrtxe = musb->epmask; in musb_stage0_irq()
781 musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); in musb_stage0_irq()
782 musb->intrrxe = musb->epmask & 0xfffe; in musb_stage0_irq()
783 musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); in musb_stage0_irq()
784 musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); in musb_stage0_irq()
785 musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED in musb_stage0_irq()
789 musb->port1_status |= USB_PORT_STAT_CONNECTION in musb_stage0_irq()
794 musb->port1_status |= USB_PORT_STAT_LOW_SPEED; in musb_stage0_irq()
797 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
800 dev_dbg(musb->controller, "HNP: SUSPEND+CONNECT, now b_host\n"); in musb_stage0_irq()
804 dev_dbg(musb->controller, "CONNECT as b_peripheral???\n"); in musb_stage0_irq()
807 dev_dbg(musb->controller, "HNP: CONNECT, now b_host\n"); in musb_stage0_irq()
809 musb->xceiv->otg->state = OTG_STATE_B_HOST; in musb_stage0_irq()
810 if (musb->hcd) in musb_stage0_irq()
811 musb->hcd->self.is_b_host = 1; in musb_stage0_irq()
812 del_timer(&musb->otg_timer); in musb_stage0_irq()
817 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_stage0_irq()
824 musb_host_poke_root_hub(musb); in musb_stage0_irq()
826 dev_dbg(musb->controller, "CONNECT (%s) devctl %02x\n", in musb_stage0_irq()
827 usb_otg_state_string(musb->xceiv->otg->state), devctl); in musb_stage0_irq()
831 dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n", in musb_stage0_irq()
832 usb_otg_state_string(musb->xceiv->otg->state), in musb_stage0_irq()
833 MUSB_MODE(musb), devctl); in musb_stage0_irq()
836 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
839 musb_host_resume_root_hub(musb); in musb_stage0_irq()
840 musb_root_disconnect(musb); in musb_stage0_irq()
841 if (musb->a_wait_bcon != 0) in musb_stage0_irq()
842 musb_platform_try_idle(musb, jiffies in musb_stage0_irq()
843 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_stage0_irq()
851 musb_root_disconnect(musb); in musb_stage0_irq()
852 if (musb->hcd) in musb_stage0_irq()
853 musb->hcd->self.is_b_host = 0; in musb_stage0_irq()
854 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_stage0_irq()
855 MUSB_DEV_MODE(musb); in musb_stage0_irq()
856 musb_g_disconnect(musb); in musb_stage0_irq()
859 musb_hnp_stop(musb); in musb_stage0_irq()
860 musb_root_disconnect(musb); in musb_stage0_irq()
866 musb_g_disconnect(musb); in musb_stage0_irq()
870 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
889 dev_err(musb->controller, "Babble\n"); in musb_stage0_irq()
891 if (is_host_active(musb)) in musb_stage0_irq()
892 musb_recover_from_babble(musb); in musb_stage0_irq()
894 dev_dbg(musb->controller, "BUS RESET as %s\n", in musb_stage0_irq()
895 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
896 switch (musb->xceiv->otg->state) { in musb_stage0_irq()
898 musb_g_reset(musb); in musb_stage0_irq()
902 dev_dbg(musb->controller, "HNP: in %s, %d msec timeout\n", in musb_stage0_irq()
903 usb_otg_state_string(musb->xceiv->otg->state), in musb_stage0_irq()
904 TA_WAIT_BCON(musb)); in musb_stage0_irq()
905 mod_timer(&musb->otg_timer, jiffies in musb_stage0_irq()
906 + msecs_to_jiffies(TA_WAIT_BCON(musb))); in musb_stage0_irq()
909 del_timer(&musb->otg_timer); in musb_stage0_irq()
910 musb_g_reset(musb); in musb_stage0_irq()
913 dev_dbg(musb->controller, "HNP: RESET (%s), to b_peripheral\n", in musb_stage0_irq()
914 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
915 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_stage0_irq()
916 musb_g_reset(musb); in musb_stage0_irq()
919 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; in musb_stage0_irq()
922 musb_g_reset(musb); in musb_stage0_irq()
925 dev_dbg(musb->controller, "Unhandled BUS RESET as %s\n", in musb_stage0_irq()
926 usb_otg_state_string(musb->xceiv->otg->state)); in musb_stage0_irq()
944 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
949 dev_dbg(musb->controller, "START_OF_FRAME\n"); in musb_stage0_irq()
954 ep = musb->endpoints; in musb_stage0_irq()
955 for (epnum = 1; (epnum < musb->nr_endpoints) in musb_stage0_irq()
956 && (musb->epmask >= (1 << epnum)); in musb_stage0_irq()
968 musb_h_tx_start(musb, epnum); in musb_stage0_irq()
970 cppi_hostdma_start(musb, epnum); in musb_stage0_irq()
976 schedule_work(&musb->irq_work); in musb_stage0_irq()
983 static void musb_disable_interrupts(struct musb *musb) in musb_disable_interrupts() argument
985 void __iomem *mbase = musb->mregs; in musb_disable_interrupts()
990 musb->intrtxe = 0; in musb_disable_interrupts()
992 musb->intrrxe = 0; in musb_disable_interrupts()
1001 static void musb_enable_interrupts(struct musb *musb) in musb_enable_interrupts() argument
1003 void __iomem *regs = musb->mregs; in musb_enable_interrupts()
1006 musb->intrtxe = musb->epmask; in musb_enable_interrupts()
1007 musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); in musb_enable_interrupts()
1008 musb->intrrxe = musb->epmask & 0xfffe; in musb_enable_interrupts()
1009 musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); in musb_enable_interrupts()
1014 static void musb_generic_disable(struct musb *musb) in musb_generic_disable() argument
1016 void __iomem *mbase = musb->mregs; in musb_generic_disable()
1018 musb_disable_interrupts(musb); in musb_generic_disable()
1027 void musb_start(struct musb *musb) in musb_start() argument
1029 void __iomem *regs = musb->mregs; in musb_start()
1033 dev_dbg(musb->controller, "<== devctl %02x\n", devctl); in musb_start()
1035 musb_enable_interrupts(musb); in musb_start()
1043 if (musb->config->maximum_speed == USB_SPEED_HIGH || in musb_start()
1044 musb->config->maximum_speed == USB_SPEED_UNKNOWN) in musb_start()
1048 musb->is_active = 0; in musb_start()
1057 if (musb->port_mode != MUSB_PORT_MODE_HOST && in musb_start()
1058 musb->xceiv->otg->state != OTG_STATE_A_WAIT_BCON && in musb_start()
1060 musb->is_active = 1; in musb_start()
1065 musb_platform_enable(musb); in musb_start()
1076 void musb_stop(struct musb *musb) in musb_stop() argument
1079 musb_platform_disable(musb); in musb_stop()
1080 musb_generic_disable(musb); in musb_stop()
1081 dev_dbg(musb->controller, "HDRC disabled\n"); in musb_stop()
1090 musb_platform_try_idle(musb, 0); in musb_stop()
1095 struct musb *musb = dev_to_musb(&pdev->dev); in musb_shutdown() local
1098 pm_runtime_get_sync(musb->controller); in musb_shutdown()
1100 musb_host_cleanup(musb); in musb_shutdown()
1101 musb_gadget_cleanup(musb); in musb_shutdown()
1103 spin_lock_irqsave(&musb->lock, flags); in musb_shutdown()
1104 musb_platform_disable(musb); in musb_shutdown()
1105 musb_generic_disable(musb); in musb_shutdown()
1106 spin_unlock_irqrestore(&musb->lock, flags); in musb_shutdown()
1108 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_shutdown()
1109 musb_platform_exit(musb); in musb_shutdown()
1111 pm_runtime_put(musb->controller); in musb_shutdown()
1246 fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, in fifo_setup() argument
1249 void __iomem *mbase = musb->mregs; in fifo_setup()
1263 (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1267 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1278 musb->bulk_ep = hw_ep; in fifo_setup()
1311 musb->epmask |= (1 << hw_ep->epnum); in fifo_setup()
1320 static int ep_config_from_table(struct musb *musb) in ep_config_from_table() argument
1325 struct musb_hw_ep *hw_ep = musb->endpoints; in ep_config_from_table()
1327 if (musb->config->fifo_cfg) { in ep_config_from_table()
1328 cfg = musb->config->fifo_cfg; in ep_config_from_table()
1329 n = musb->config->fifo_cfg_size; in ep_config_from_table()
1368 offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0); in ep_config_from_table()
1378 if (epn >= musb->config->num_eps) { in ep_config_from_table()
1383 offset = fifo_setup(musb, hw_ep + epn, cfg++, offset); in ep_config_from_table()
1390 musb->nr_endpoints = max(epn, musb->nr_endpoints); in ep_config_from_table()
1395 n + 1, musb->config->num_eps * 2 - 1, in ep_config_from_table()
1396 offset, (1 << (musb->config->ram_bits + 2))); in ep_config_from_table()
1398 if (!musb->bulk_ep) { in ep_config_from_table()
1411 static int ep_config_from_hw(struct musb *musb) in ep_config_from_hw() argument
1415 void __iomem *mbase = musb->mregs; in ep_config_from_hw()
1418 dev_dbg(musb->controller, "<== static silicon ep config\n"); in ep_config_from_hw()
1422 for (epnum = 1; epnum < musb->config->num_eps; epnum++) { in ep_config_from_hw()
1424 hw_ep = musb->endpoints + epnum; in ep_config_from_hw()
1426 ret = musb_read_fifosize(musb, hw_ep, epnum); in ep_config_from_hw()
1440 if (musb->bulk_ep) in ep_config_from_hw()
1442 musb->bulk_ep = hw_ep; in ep_config_from_hw()
1445 if (!musb->bulk_ep) { in ep_config_from_hw()
1458 static int musb_core_init(u16 musb_type, struct musb *musb) in musb_core_init() argument
1463 void __iomem *mbase = musb->mregs; in musb_core_init()
1473 musb->dyn_fifo = true; in musb_core_init()
1477 musb->bulk_combine = true; in musb_core_init()
1481 musb->bulk_split = true; in musb_core_init()
1485 musb->hb_iso_rx = true; in musb_core_init()
1489 musb->hb_iso_tx = true; in musb_core_init()
1499 musb->is_multipoint = 1; in musb_core_init()
1502 musb->is_multipoint = 0; in musb_core_init()
1512 musb->hwvers = musb_read_hwvers(mbase); in musb_core_init()
1513 snprintf(aRevision, 32, "%d.%d%s", MUSB_HWVERS_MAJOR(musb->hwvers), in musb_core_init()
1514 MUSB_HWVERS_MINOR(musb->hwvers), in musb_core_init()
1515 (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : ""); in musb_core_init()
1520 musb_configure_ep0(musb); in musb_core_init()
1523 musb->nr_endpoints = 1; in musb_core_init()
1524 musb->epmask = 1; in musb_core_init()
1526 if (musb->dyn_fifo) in musb_core_init()
1527 status = ep_config_from_table(musb); in musb_core_init()
1529 status = ep_config_from_hw(musb); in musb_core_init()
1535 for (i = 0; i < musb->nr_endpoints; i++) { in musb_core_init()
1536 struct musb_hw_ep *hw_ep = musb->endpoints + i; in musb_core_init()
1538 hw_ep->fifo = musb->io.fifo_offset(i) + mbase; in musb_core_init()
1540 if (musb->io.quirks & MUSB_IN_TUSB) { in musb_core_init()
1541 hw_ep->fifo_async = musb->async + 0x400 + in musb_core_init()
1542 musb->io.fifo_offset(i); in musb_core_init()
1543 hw_ep->fifo_sync = musb->sync + 0x400 + in musb_core_init()
1544 musb->io.fifo_offset(i); in musb_core_init()
1546 musb->sync_va + 0x400 + musb->io.fifo_offset(i); in musb_core_init()
1556 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase; in musb_core_init()
1561 dev_dbg(musb->controller, in musb_core_init()
1570 dev_dbg(musb->controller, in musb_core_init()
1579 dev_dbg(musb->controller, "hw_ep %d not configured\n", i); in musb_core_init()
1594 irqreturn_t musb_interrupt(struct musb *musb) in musb_interrupt() argument
1601 if (!musb->int_usb && !musb->int_tx && !musb->int_rx) in musb_interrupt()
1604 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_interrupt()
1606 dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n", in musb_interrupt()
1607 is_host_active(musb) ? "host" : "peripheral", in musb_interrupt()
1608 musb->int_usb, musb->int_tx, musb->int_rx); in musb_interrupt()
1630 if (musb->int_usb) in musb_interrupt()
1631 retval |= musb_stage0_irq(musb, musb->int_usb, devctl); in musb_interrupt()
1633 if (musb->int_tx & 1) { in musb_interrupt()
1634 if (is_host_active(musb)) in musb_interrupt()
1635 retval |= musb_h_ep0_irq(musb); in musb_interrupt()
1637 retval |= musb_g_ep0_irq(musb); in musb_interrupt()
1640 musb->int_tx &= ~BIT(0); in musb_interrupt()
1643 status = musb->int_tx; in musb_interrupt()
1647 if (is_host_active(musb)) in musb_interrupt()
1648 musb_host_tx(musb, epnum); in musb_interrupt()
1650 musb_g_tx(musb, epnum); in musb_interrupt()
1653 status = musb->int_rx; in musb_interrupt()
1657 if (is_host_active(musb)) in musb_interrupt()
1658 musb_host_rx(musb, epnum); in musb_interrupt()
1660 musb_g_rx(musb, epnum); in musb_interrupt()
1674 void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit) in musb_dma_completion() argument
1679 if (!is_cppi_enabled(musb)) { in musb_dma_completion()
1681 if (is_host_active(musb)) in musb_dma_completion()
1682 musb_h_ep0_irq(musb); in musb_dma_completion()
1684 musb_g_ep0_irq(musb); in musb_dma_completion()
1689 if (is_host_active(musb)) in musb_dma_completion()
1690 musb_host_tx(musb, epnum); in musb_dma_completion()
1692 musb_g_tx(musb, epnum); in musb_dma_completion()
1695 if (is_host_active(musb)) in musb_dma_completion()
1696 musb_host_rx(musb, epnum); in musb_dma_completion()
1698 musb_g_rx(musb, epnum); in musb_dma_completion()
1713 struct musb *musb = dev_to_musb(dev); in musb_mode_show() local
1717 spin_lock_irqsave(&musb->lock, flags); in musb_mode_show()
1718 ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state)); in musb_mode_show()
1719 spin_unlock_irqrestore(&musb->lock, flags); in musb_mode_show()
1728 struct musb *musb = dev_to_musb(dev); in musb_mode_store() local
1732 spin_lock_irqsave(&musb->lock, flags); in musb_mode_store()
1734 status = musb_platform_set_mode(musb, MUSB_HOST); in musb_mode_store()
1736 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in musb_mode_store()
1738 status = musb_platform_set_mode(musb, MUSB_OTG); in musb_mode_store()
1741 spin_unlock_irqrestore(&musb->lock, flags); in musb_mode_store()
1751 struct musb *musb = dev_to_musb(dev); in musb_vbus_store() local
1760 spin_lock_irqsave(&musb->lock, flags); in musb_vbus_store()
1762 musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ; in musb_vbus_store()
1763 if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON) in musb_vbus_store()
1764 musb->is_active = 0; in musb_vbus_store()
1765 musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val)); in musb_vbus_store()
1766 spin_unlock_irqrestore(&musb->lock, flags); in musb_vbus_store()
1774 struct musb *musb = dev_to_musb(dev); in musb_vbus_show() local
1780 spin_lock_irqsave(&musb->lock, flags); in musb_vbus_show()
1781 val = musb->a_wait_bcon; in musb_vbus_show()
1782 vbus = musb_platform_get_vbus_status(musb); in musb_vbus_show()
1785 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_vbus_show()
1792 spin_unlock_irqrestore(&musb->lock, flags); in musb_vbus_show()
1806 struct musb *musb = dev_to_musb(dev); in musb_srp_store() local
1816 musb_g_wakeup(musb); in musb_srp_store()
1836 struct musb *musb = container_of(data, struct musb, irq_work); in musb_irq_work() local
1838 if (musb->xceiv->otg->state != musb->xceiv_old_state) { in musb_irq_work()
1839 musb->xceiv_old_state = musb->xceiv->otg->state; in musb_irq_work()
1840 sysfs_notify(&musb->controller->kobj, NULL, "mode"); in musb_irq_work()
1844 static void musb_recover_from_babble(struct musb *musb) in musb_recover_from_babble() argument
1849 musb_disable_interrupts(musb); in musb_recover_from_babble()
1857 ret = musb_platform_recover(musb); in musb_recover_from_babble()
1859 musb_enable_interrupts(musb); in musb_recover_from_babble()
1864 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_recover_from_babble()
1866 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_recover_from_babble()
1869 musb_root_disconnect(musb); in musb_recover_from_babble()
1875 if (musb->dyn_fifo) in musb_recover_from_babble()
1876 ret = ep_config_from_table(musb); in musb_recover_from_babble()
1878 ret = ep_config_from_hw(musb); in musb_recover_from_babble()
1882 musb_start(musb); in musb_recover_from_babble()
1889 static struct musb *allocate_instance(struct device *dev, in allocate_instance()
1892 struct musb *musb; in allocate_instance() local
1897 musb = devm_kzalloc(dev, sizeof(*musb), GFP_KERNEL); in allocate_instance()
1898 if (!musb) in allocate_instance()
1901 INIT_LIST_HEAD(&musb->control); in allocate_instance()
1902 INIT_LIST_HEAD(&musb->in_bulk); in allocate_instance()
1903 INIT_LIST_HEAD(&musb->out_bulk); in allocate_instance()
1905 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; in allocate_instance()
1906 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; in allocate_instance()
1907 musb->mregs = mbase; in allocate_instance()
1908 musb->ctrl_base = mbase; in allocate_instance()
1909 musb->nIrq = -ENODEV; in allocate_instance()
1910 musb->config = config; in allocate_instance()
1911 BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS); in allocate_instance()
1912 for (epnum = 0, ep = musb->endpoints; in allocate_instance()
1913 epnum < musb->config->num_eps; in allocate_instance()
1915 ep->musb = musb; in allocate_instance()
1919 musb->controller = dev; in allocate_instance()
1921 ret = musb_host_alloc(musb); in allocate_instance()
1925 dev_set_drvdata(dev, musb); in allocate_instance()
1927 return musb; in allocate_instance()
1933 static void musb_free(struct musb *musb) in musb_free() argument
1941 sysfs_remove_group(&musb->controller->kobj, &musb_attr_group); in musb_free()
1944 if (musb->nIrq >= 0) { in musb_free()
1945 if (musb->irq_wake) in musb_free()
1946 disable_irq_wake(musb->nIrq); in musb_free()
1947 free_irq(musb->nIrq, musb); in musb_free()
1950 musb_host_free(musb); in musb_free()
1955 struct musb *musb; in musb_deassert_reset() local
1958 musb = container_of(work, struct musb, deassert_reset_work.work); in musb_deassert_reset()
1960 spin_lock_irqsave(&musb->lock, flags); in musb_deassert_reset()
1962 if (musb->port1_status & USB_PORT_STAT_RESET) in musb_deassert_reset()
1963 musb_port_reset(musb, false); in musb_deassert_reset()
1965 spin_unlock_irqrestore(&musb->lock, flags); in musb_deassert_reset()
1980 struct musb *musb; in musb_init_controller() local
1993 musb = allocate_instance(dev, plat->config, ctrl); in musb_init_controller()
1994 if (!musb) { in musb_init_controller()
1999 spin_lock_init(&musb->lock); in musb_init_controller()
2000 musb->board_set_power = plat->set_power; in musb_init_controller()
2001 musb->min_power = plat->min_power; in musb_init_controller()
2002 musb->ops = plat->platform_ops; in musb_init_controller()
2003 musb->port_mode = plat->mode; in musb_init_controller()
2018 pm_runtime_use_autosuspend(musb->controller); in musb_init_controller()
2019 pm_runtime_set_autosuspend_delay(musb->controller, 200); in musb_init_controller()
2020 pm_runtime_enable(musb->controller); in musb_init_controller()
2034 status = musb_platform_init(musb); in musb_init_controller()
2038 if (!musb->isr) { in musb_init_controller()
2043 if (musb->ops->quirks) in musb_init_controller()
2044 musb->io.quirks = musb->ops->quirks; in musb_init_controller()
2047 if (musb->io.quirks & MUSB_INDEXED_EP) { in musb_init_controller()
2048 musb->io.ep_offset = musb_indexed_ep_offset; in musb_init_controller()
2049 musb->io.ep_select = musb_indexed_ep_select; in musb_init_controller()
2051 musb->io.ep_offset = musb_flat_ep_offset; in musb_init_controller()
2052 musb->io.ep_select = musb_flat_ep_select; in musb_init_controller()
2055 if (musb->ops->ep_offset) in musb_init_controller()
2056 musb->io.ep_offset = musb->ops->ep_offset; in musb_init_controller()
2057 if (musb->ops->ep_select) in musb_init_controller()
2058 musb->io.ep_select = musb->ops->ep_select; in musb_init_controller()
2061 if (musb->ops->ep_offset) in musb_init_controller()
2062 musb->io.ep_offset = musb->ops->ep_offset; in musb_init_controller()
2063 if (musb->ops->ep_select) in musb_init_controller()
2064 musb->io.ep_select = musb->ops->ep_select; in musb_init_controller()
2066 if (musb->ops->fifo_mode) in musb_init_controller()
2067 fifo_mode = musb->ops->fifo_mode; in musb_init_controller()
2071 if (musb->ops->fifo_offset) in musb_init_controller()
2072 musb->io.fifo_offset = musb->ops->fifo_offset; in musb_init_controller()
2074 musb->io.fifo_offset = musb_default_fifo_offset; in musb_init_controller()
2076 if (musb->ops->busctl_offset) in musb_init_controller()
2077 musb->io.busctl_offset = musb->ops->busctl_offset; in musb_init_controller()
2079 musb->io.busctl_offset = musb_default_busctl_offset; in musb_init_controller()
2081 if (musb->ops->readb) in musb_init_controller()
2082 musb_readb = musb->ops->readb; in musb_init_controller()
2083 if (musb->ops->writeb) in musb_init_controller()
2084 musb_writeb = musb->ops->writeb; in musb_init_controller()
2085 if (musb->ops->readw) in musb_init_controller()
2086 musb_readw = musb->ops->readw; in musb_init_controller()
2087 if (musb->ops->writew) in musb_init_controller()
2088 musb_writew = musb->ops->writew; in musb_init_controller()
2089 if (musb->ops->readl) in musb_init_controller()
2090 musb_readl = musb->ops->readl; in musb_init_controller()
2091 if (musb->ops->writel) in musb_init_controller()
2092 musb_writel = musb->ops->writel; in musb_init_controller()
2095 if (!musb->ops->dma_init || !musb->ops->dma_exit) { in musb_init_controller()
2100 musb_dma_controller_create = musb->ops->dma_init; in musb_init_controller()
2101 musb_dma_controller_destroy = musb->ops->dma_exit; in musb_init_controller()
2104 if (musb->ops->read_fifo) in musb_init_controller()
2105 musb->io.read_fifo = musb->ops->read_fifo; in musb_init_controller()
2107 musb->io.read_fifo = musb_default_read_fifo; in musb_init_controller()
2109 if (musb->ops->write_fifo) in musb_init_controller()
2110 musb->io.write_fifo = musb->ops->write_fifo; in musb_init_controller()
2112 musb->io.write_fifo = musb_default_write_fifo; in musb_init_controller()
2114 if (!musb->xceiv->io_ops) { in musb_init_controller()
2115 musb->xceiv->io_dev = musb->controller; in musb_init_controller()
2116 musb->xceiv->io_priv = musb->mregs; in musb_init_controller()
2117 musb->xceiv->io_ops = &musb_ulpi_access; in musb_init_controller()
2120 pm_runtime_get_sync(musb->controller); in musb_init_controller()
2123 musb->dma_controller = in musb_init_controller()
2124 musb_dma_controller_create(musb, musb->mregs); in musb_init_controller()
2125 if (IS_ERR(musb->dma_controller)) { in musb_init_controller()
2126 status = PTR_ERR(musb->dma_controller); in musb_init_controller()
2132 musb_platform_disable(musb); in musb_init_controller()
2133 musb_generic_disable(musb); in musb_init_controller()
2136 INIT_WORK(&musb->irq_work, musb_irq_work); in musb_init_controller()
2137 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); in musb_init_controller()
2138 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); in musb_init_controller()
2143 : MUSB_CONTROLLER_HDRC, musb); in musb_init_controller()
2147 setup_timer(&musb->otg_timer, musb_otg_timer_func, (unsigned long) musb); in musb_init_controller()
2150 if (request_irq(nIrq, musb->isr, 0, dev_name(dev), musb)) { in musb_init_controller()
2155 musb->nIrq = nIrq; in musb_init_controller()
2158 musb->irq_wake = 1; in musb_init_controller()
2161 musb->irq_wake = 0; in musb_init_controller()
2166 u8 busctl = musb_read_ulpi_buscontrol(musb->mregs); in musb_init_controller()
2168 musb_write_ulpi_buscontrol(musb->mregs, busctl); in musb_init_controller()
2171 if (musb->xceiv->otg->default_a) { in musb_init_controller()
2172 MUSB_HST_MODE(musb); in musb_init_controller()
2173 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in musb_init_controller()
2175 MUSB_DEV_MODE(musb); in musb_init_controller()
2176 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in musb_init_controller()
2179 switch (musb->port_mode) { in musb_init_controller()
2181 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2184 status = musb_platform_set_mode(musb, MUSB_HOST); in musb_init_controller()
2187 status = musb_gadget_setup(musb); in musb_init_controller()
2190 status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); in musb_init_controller()
2193 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2196 status = musb_gadget_setup(musb); in musb_init_controller()
2198 musb_host_cleanup(musb); in musb_init_controller()
2201 status = musb_platform_set_mode(musb, MUSB_OTG); in musb_init_controller()
2204 dev_err(dev, "unsupported port mode %d\n", musb->port_mode); in musb_init_controller()
2211 status = musb_init_debugfs(musb); in musb_init_controller()
2215 status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group); in musb_init_controller()
2219 pm_runtime_put(musb->controller); in musb_init_controller()
2225 pm_runtime_irq_safe(musb->controller); in musb_init_controller()
2230 musb_exit_debugfs(musb); in musb_init_controller()
2233 musb_gadget_cleanup(musb); in musb_init_controller()
2234 musb_host_cleanup(musb); in musb_init_controller()
2237 cancel_work_sync(&musb->irq_work); in musb_init_controller()
2238 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_init_controller()
2239 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_init_controller()
2240 if (musb->dma_controller) in musb_init_controller()
2241 musb_dma_controller_destroy(musb->dma_controller); in musb_init_controller()
2243 pm_runtime_put_sync(musb->controller); in musb_init_controller()
2246 if (musb->irq_wake) in musb_init_controller()
2248 musb_platform_exit(musb); in musb_init_controller()
2251 pm_runtime_disable(musb->controller); in musb_init_controller()
2252 dev_err(musb->controller, in musb_init_controller()
2255 musb_free(musb); in musb_init_controller()
2289 struct musb *musb = dev_to_musb(dev); in musb_remove() local
2296 musb_exit_debugfs(musb); in musb_remove()
2299 if (musb->dma_controller) in musb_remove()
2300 musb_dma_controller_destroy(musb->dma_controller); in musb_remove()
2302 cancel_work_sync(&musb->irq_work); in musb_remove()
2303 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_remove()
2304 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_remove()
2305 musb_free(musb); in musb_remove()
2312 static void musb_save_context(struct musb *musb) in musb_save_context() argument
2315 void __iomem *musb_base = musb->mregs; in musb_save_context()
2318 musb->context.frame = musb_readw(musb_base, MUSB_FRAME); in musb_save_context()
2319 musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); in musb_save_context()
2320 musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs); in musb_save_context()
2321 musb->context.power = musb_readb(musb_base, MUSB_POWER); in musb_save_context()
2322 musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); in musb_save_context()
2323 musb->context.index = musb_readb(musb_base, MUSB_INDEX); in musb_save_context()
2324 musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); in musb_save_context()
2326 for (i = 0; i < musb->config->num_eps; ++i) { in musb_save_context()
2329 hw_ep = &musb->endpoints[i]; in musb_save_context()
2338 musb->context.index_regs[i].txmaxp = in musb_save_context()
2340 musb->context.index_regs[i].txcsr = in musb_save_context()
2342 musb->context.index_regs[i].rxmaxp = in musb_save_context()
2344 musb->context.index_regs[i].rxcsr = in musb_save_context()
2347 if (musb->dyn_fifo) { in musb_save_context()
2348 musb->context.index_regs[i].txfifoadd = in musb_save_context()
2350 musb->context.index_regs[i].rxfifoadd = in musb_save_context()
2352 musb->context.index_regs[i].txfifosz = in musb_save_context()
2354 musb->context.index_regs[i].rxfifosz = in musb_save_context()
2358 musb->context.index_regs[i].txtype = in musb_save_context()
2360 musb->context.index_regs[i].txinterval = in musb_save_context()
2362 musb->context.index_regs[i].rxtype = in musb_save_context()
2364 musb->context.index_regs[i].rxinterval = in musb_save_context()
2367 musb->context.index_regs[i].txfunaddr = in musb_save_context()
2368 musb_read_txfunaddr(musb, i); in musb_save_context()
2369 musb->context.index_regs[i].txhubaddr = in musb_save_context()
2370 musb_read_txhubaddr(musb, i); in musb_save_context()
2371 musb->context.index_regs[i].txhubport = in musb_save_context()
2372 musb_read_txhubport(musb, i); in musb_save_context()
2374 musb->context.index_regs[i].rxfunaddr = in musb_save_context()
2375 musb_read_rxfunaddr(musb, i); in musb_save_context()
2376 musb->context.index_regs[i].rxhubaddr = in musb_save_context()
2377 musb_read_rxhubaddr(musb, i); in musb_save_context()
2378 musb->context.index_regs[i].rxhubport = in musb_save_context()
2379 musb_read_rxhubport(musb, i); in musb_save_context()
2383 static void musb_restore_context(struct musb *musb) in musb_restore_context() argument
2386 void __iomem *musb_base = musb->mregs; in musb_restore_context()
2390 musb_writew(musb_base, MUSB_FRAME, musb->context.frame); in musb_restore_context()
2391 musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); in musb_restore_context()
2392 musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); in musb_restore_context()
2397 musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); in musb_restore_context()
2398 power |= musb->context.power; in musb_restore_context()
2401 musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); in musb_restore_context()
2402 musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); in musb_restore_context()
2403 musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); in musb_restore_context()
2404 musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); in musb_restore_context()
2406 for (i = 0; i < musb->config->num_eps; ++i) { in musb_restore_context()
2409 hw_ep = &musb->endpoints[i]; in musb_restore_context()
2419 musb->context.index_regs[i].txmaxp); in musb_restore_context()
2421 musb->context.index_regs[i].txcsr); in musb_restore_context()
2423 musb->context.index_regs[i].rxmaxp); in musb_restore_context()
2425 musb->context.index_regs[i].rxcsr); in musb_restore_context()
2427 if (musb->dyn_fifo) { in musb_restore_context()
2429 musb->context.index_regs[i].txfifosz); in musb_restore_context()
2431 musb->context.index_regs[i].rxfifosz); in musb_restore_context()
2433 musb->context.index_regs[i].txfifoadd); in musb_restore_context()
2435 musb->context.index_regs[i].rxfifoadd); in musb_restore_context()
2439 musb->context.index_regs[i].txtype); in musb_restore_context()
2441 musb->context.index_regs[i].txinterval); in musb_restore_context()
2443 musb->context.index_regs[i].rxtype); in musb_restore_context()
2446 musb->context.index_regs[i].rxinterval); in musb_restore_context()
2447 musb_write_txfunaddr(musb, i, in musb_restore_context()
2448 musb->context.index_regs[i].txfunaddr); in musb_restore_context()
2449 musb_write_txhubaddr(musb, i, in musb_restore_context()
2450 musb->context.index_regs[i].txhubaddr); in musb_restore_context()
2451 musb_write_txhubport(musb, i, in musb_restore_context()
2452 musb->context.index_regs[i].txhubport); in musb_restore_context()
2454 musb_write_rxfunaddr(musb, i, in musb_restore_context()
2455 musb->context.index_regs[i].rxfunaddr); in musb_restore_context()
2456 musb_write_rxhubaddr(musb, i, in musb_restore_context()
2457 musb->context.index_regs[i].rxhubaddr); in musb_restore_context()
2458 musb_write_rxhubport(musb, i, in musb_restore_context()
2459 musb->context.index_regs[i].rxhubport); in musb_restore_context()
2461 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); in musb_restore_context()
2466 struct musb *musb = dev_to_musb(dev); in musb_suspend() local
2469 musb_platform_disable(musb); in musb_suspend()
2470 musb_generic_disable(musb); in musb_suspend()
2472 spin_lock_irqsave(&musb->lock, flags); in musb_suspend()
2474 if (is_peripheral_active(musb)) { in musb_suspend()
2478 } else if (is_host_active(musb)) { in musb_suspend()
2484 musb_save_context(musb); in musb_suspend()
2486 spin_unlock_irqrestore(&musb->lock, flags); in musb_suspend()
2492 struct musb *musb = dev_to_musb(dev); in musb_resume() local
2506 musb_restore_context(musb); in musb_resume()
2508 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_resume()
2510 if ((devctl & mask) != (musb->context.devctl & mask)) in musb_resume()
2511 musb->port1_status = 0; in musb_resume()
2512 if (musb->need_finish_resume) { in musb_resume()
2513 musb->need_finish_resume = 0; in musb_resume()
2514 schedule_delayed_work(&musb->finish_resume_work, in musb_resume()
2526 musb_start(musb); in musb_resume()
2533 struct musb *musb = dev_to_musb(dev); in musb_runtime_suspend() local
2535 musb_save_context(musb); in musb_runtime_suspend()
2542 struct musb *musb = dev_to_musb(dev); in musb_runtime_resume() local
2555 musb_restore_context(musb); in musb_runtime_resume()
2558 if (musb->need_finish_resume) { in musb_runtime_resume()
2559 musb->need_finish_resume = 0; in musb_runtime_resume()
2560 schedule_delayed_work(&musb->finish_resume_work, in musb_runtime_resume()