Lines Matching +full:hnp +full:- +full:disable

1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright (C) 2005-2006 by Texas Instruments
7 * Copyright (C) 2006-2007 Nokia Corporation
11 * Inventra (Multipoint) Dual-Role Controller Driver for Linux.
15 * in the works. These are normal Linux-USB controller drivers which
29 * - Lack of host-side transaction scheduling, for all transfer types.
35 * includes DaVinci EVM in a common non-OTG mode.
59 * - Kconfig for everything user-configurable
60 * - platform_device for addressing, irq, and platform_data
61 * - platform_data is mostly for board-specific information
78 #include <linux/dma-mapping.h>
85 #define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON)
89 #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver"
95 #define MUSB_DRIVER_NAME "musb-hdrc"
104 /*-------------------------------------------------------------------------*/
129 /*-------------------------------------------------------------------------*/
133 void __iomem *addr = phy->io_priv; in musb_ulpi_read()
139 pm_runtime_get_sync(phy->io_dev); in musb_ulpi_read()
158 ret = -ETIMEDOUT; in musb_ulpi_read()
170 pm_runtime_put(phy->io_dev); in musb_ulpi_read()
177 void __iomem *addr = phy->io_priv; in musb_ulpi_write()
183 pm_runtime_get_sync(phy->io_dev); in musb_ulpi_write()
198 ret = -ETIMEDOUT; in musb_ulpi_write()
208 pm_runtime_put(phy->io_dev); in musb_ulpi_write()
218 /*-------------------------------------------------------------------------*/
281 void __iomem *epio = qh->hw_ep->regs; in musb_default_get_toggle()
298 toggle = usb_gettoggle(urb->dev, qh->epnum, is_out); in musb_default_set_toggle()
317 struct musb *musb = hw_ep->musb; in musb_default_write_fifo()
318 void __iomem *fifo = hw_ep->fifo; in musb_default_write_fifo()
325 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_write_fifo()
326 'T', hw_ep->epnum, fifo, len, src); in musb_default_write_fifo()
332 /* best case is 32bit-aligned source address */ in musb_default_write_fifo()
361 struct musb *musb = hw_ep->musb; in musb_default_read_fifo()
362 void __iomem *fifo = hw_ep->fifo; in musb_default_read_fifo()
367 dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", in musb_default_read_fifo()
368 'R', hw_ep->epnum, fifo, len, dst); in musb_default_read_fifo()
374 /* best case is 32bit-aligned destination address */ in musb_default_read_fifo()
449 return hw_ep->musb->io.read_fifo(hw_ep, len, dst); in musb_read_fifo()
454 return hw_ep->musb->io.write_fifo(hw_ep, len, src); in musb_write_fifo()
459 return musb_readb(musb->mregs, MUSB_DEVCTL); in musb_read_devctl()
463 * musb_set_host - set and initialize host mode
480 return -EINVAL; in musb_set_host()
489 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_set_host()
495 dev_err(musb->controller, "%s: could not set host: %02x\n", in musb_set_host()
505 musb->is_active = 1; in musb_set_host()
514 * musb_set_peripheral - set and initialize peripheral mode
527 return -EINVAL; in musb_set_peripheral()
536 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_set_peripheral()
542 dev_err(musb->controller, "%s: could not set peripheral: %02x\n", in musb_set_peripheral()
552 musb->is_active = 0; in musb_set_peripheral()
560 /*-------------------------------------------------------------------------*/
584 void __iomem *regs = musb->endpoints[0].regs; in musb_load_testpacket()
586 musb_ep_select(musb->mregs, 0); in musb_load_testpacket()
587 musb_write_fifo(musb->control_ep, in musb_load_testpacket()
592 /*-------------------------------------------------------------------------*/
595 * Handles OTG hnp timeouts, such as b_ase0_brst
602 spin_lock_irqsave(&musb->lock, flags); in musb_otg_timer_func()
606 "HNP: b_wait_acon timeout; back to b_peripheral"); in musb_otg_timer_func()
609 musb->is_active = 0; in musb_otg_timer_func()
613 musb_dbg(musb, "HNP: %s timeout", in musb_otg_timer_func()
619 musb_dbg(musb, "HNP: Unhandled mode %s", in musb_otg_timer_func()
622 spin_unlock_irqrestore(&musb->lock, flags); in musb_otg_timer_func()
626 * Stops the HNP transition. Caller must take care of locking.
630 struct usb_hcd *hcd = musb->hcd; in musb_hnp_stop()
631 void __iomem *mbase = musb->mregs; in musb_hnp_stop()
634 musb_dbg(musb, "HNP: stop from %s", musb_otg_state_string(musb)); in musb_hnp_stop()
639 musb_dbg(musb, "HNP: back to %s", musb_otg_state_string(musb)); in musb_hnp_stop()
642 musb_dbg(musb, "HNP: Disabling HR"); in musb_hnp_stop()
644 hcd->self.is_b_host = 0; in musb_hnp_stop()
653 musb_dbg(musb, "HNP: Stopping in unknown state %s", in musb_hnp_stop()
658 * When returning to A state after HNP, avoid hub_port_rebounce(), in musb_hnp_stop()
662 musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16); in musb_hnp_stop()
675 musb->port1_status |= in musb_handle_intr_resume()
678 musb->rh_timer = jiffies in musb_handle_intr_resume()
681 musb->is_active = 1; in musb_handle_intr_resume()
683 schedule_delayed_work(&musb->finish_resume_work, in musb_handle_intr_resume()
688 musb->is_active = 1; in musb_handle_intr_resume()
711 musb->int_usb |= MUSB_INTR_DISCONNECT; in musb_handle_intr_resume()
712 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
718 musb->int_usb &= ~MUSB_INTR_SUSPEND; in musb_handle_intr_resume()
731 void __iomem *mbase = musb->mregs; in musb_handle_intr_sessreq()
743 * - turn on VBUS (with silicon-specific mechanism) in musb_handle_intr_sessreq()
744 * - go through A_WAIT_VRISE in musb_handle_intr_sessreq()
745 * - ... to A_WAIT_BCON. in musb_handle_intr_sessreq()
749 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_sessreq()
761 /* During connection as an A-Device, we may see a short in musb_handle_intr_vbuserr()
764 * (So: less common with truly self-powered devices, where in musb_handle_intr_vbuserr()
772 * (b) software: ignore non-repeated VBUS errors. in musb_handle_intr_vbuserr()
787 if (musb->vbuserr_retry) { in musb_handle_intr_vbuserr()
788 void __iomem *mbase = musb->mregs; in musb_handle_intr_vbuserr()
790 musb->vbuserr_retry--; in musb_handle_intr_vbuserr()
795 musb->port1_status |= in musb_handle_intr_vbuserr()
804 dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller, in musb_handle_intr_vbuserr()
820 VBUSERR_RETRY_COUNT - musb->vbuserr_retry, in musb_handle_intr_vbuserr()
821 musb->port1_status); in musb_handle_intr_vbuserr()
836 * this silicon doesn't report ID-no-longer-grounded. in musb_handle_intr_suspend()
846 + msecs_to_jiffies(musb->a_wait_bcon in musb_handle_intr_suspend()
851 if (!musb->is_active) in musb_handle_intr_suspend()
856 musb->is_active = musb->g.b_hnp_enable; in musb_handle_intr_suspend()
857 if (musb->is_active) { in musb_handle_intr_suspend()
859 musb_dbg(musb, "HNP: Setting timer for b_ase0_brst"); in musb_handle_intr_suspend()
860 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_suspend()
866 if (musb->a_wait_bcon != 0) in musb_handle_intr_suspend()
868 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_suspend()
872 musb->is_active = musb->hcd->self.b_hnp_enable; in musb_handle_intr_suspend()
880 musb->is_active = 0; in musb_handle_intr_suspend()
887 struct usb_hcd *hcd = musb->hcd; in musb_handle_intr_connect()
889 musb->is_active = 1; in musb_handle_intr_connect()
890 musb->ep0_stage = MUSB_EP0_START; in musb_handle_intr_connect()
892 musb->intrtxe = musb->epmask; in musb_handle_intr_connect()
893 musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); in musb_handle_intr_connect()
894 musb->intrrxe = musb->epmask & 0xfffe; in musb_handle_intr_connect()
895 musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); in musb_handle_intr_connect()
896 musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); in musb_handle_intr_connect()
897 musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED in musb_handle_intr_connect()
901 musb->port1_status |= USB_PORT_STAT_CONNECTION in musb_handle_intr_connect()
906 musb->port1_status |= USB_PORT_STAT_LOW_SPEED; in musb_handle_intr_connect()
912 musb_dbg(musb, "HNP: SUSPEND+CONNECT, now b_host"); in musb_handle_intr_connect()
919 musb_dbg(musb, "HNP: CONNECT, now b_host"); in musb_handle_intr_connect()
922 if (musb->hcd) in musb_handle_intr_connect()
923 musb->hcd->self.is_b_host = 1; in musb_handle_intr_connect()
924 timer_delete(&musb->otg_timer); in musb_handle_intr_connect()
931 hcd->self.is_b_host = 0; in musb_handle_intr_connect()
953 if (musb->a_wait_bcon != 0) in musb_handle_intr_disconnect()
955 + msecs_to_jiffies(musb->a_wait_bcon)); in musb_handle_intr_disconnect()
964 if (musb->hcd) in musb_handle_intr_disconnect()
965 musb->hcd->self.is_b_host = 0; in musb_handle_intr_disconnect()
1001 dev_err(musb->controller, "Babble\n"); in musb_handle_intr_reset()
1009 case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */ in musb_handle_intr_reset()
1011 musb_dbg(musb, "HNP: in %s, %d msec timeout", in musb_handle_intr_reset()
1014 mod_timer(&musb->otg_timer, jiffies in musb_handle_intr_reset()
1018 timer_delete(&musb->otg_timer); in musb_handle_intr_reset()
1022 musb_dbg(musb, "HNP: RESET (%s), to b_peripheral", in musb_handle_intr_reset()
1112 void __iomem *mbase = musb->mregs; in musb_stage0_irq()
1117 dev_dbg(musb->controller, "START_OF_FRAME\n"); in musb_stage0_irq()
1122 ep = musb->endpoints; in musb_stage0_irq()
1123 for (epnum = 1; (epnum < musb->nr_endpoints) in musb_stage0_irq()
1124 && (musb->epmask >= (1 << epnum)); in musb_stage0_irq()
1130 if (ep->dwWaitFrame >= frame) { in musb_stage0_irq()
1131 ep->dwWaitFrame = 0; in musb_stage0_irq()
1132 pr_debug("SOF --> periodic TX%s on %d\n", in musb_stage0_irq()
1133 ep->tx_channel ? " DMA" : "", in musb_stage0_irq()
1135 if (!ep->tx_channel) in musb_stage0_irq()
1144 schedule_delayed_work(&musb->irq_work, 0); in musb_stage0_irq()
1149 /*-------------------------------------------------------------------------*/
1153 void __iomem *mbase = musb->mregs; in musb_disable_interrupts()
1155 /* disable interrupts */ in musb_disable_interrupts()
1157 musb->intrtxe = 0; in musb_disable_interrupts()
1159 musb->intrrxe = 0; in musb_disable_interrupts()
1170 void __iomem *regs = musb->mregs; in musb_enable_interrupts()
1173 musb->intrtxe = musb->epmask; in musb_enable_interrupts()
1174 musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); in musb_enable_interrupts()
1175 musb->intrrxe = musb->epmask & 0xfffe; in musb_enable_interrupts()
1176 musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); in musb_enable_interrupts()
1186 void __iomem *regs = musb->mregs; in musb_start()
1198 * we will default to high-speed. in musb_start()
1200 if (musb->config->maximum_speed == USB_SPEED_HIGH || in musb_start()
1201 musb->config->maximum_speed == USB_SPEED_UNKNOWN) in musb_start()
1205 musb->is_active = 0; in musb_start()
1210 * (a) ID-grounded irq, host mode; in musb_start()
1214 if (musb->port_mode != MUSB_HOST && in musb_start()
1217 musb->is_active = 1; in musb_start()
1227 * Make the HDRC stop (disable interrupts, etc.);
1238 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_stop()
1241 * - mark host and/or peripheral drivers unusable/inactive in musb_stop()
1242 * - disable DMA (and enable it in HdrcStart) in musb_stop()
1243 * - make sure we can musb_start() after musb_stop(); with in musb_stop()
1245 * - ... in musb_stop()
1250 /*-------------------------------------------------------------------------*/
1253 * The silicon either has hard-wired endpoint configurations, or else
1256 * away from compile-time hardware parameters, we can no longer rely on
1273 /* mode 0 - fits in 2KB */
1282 /* mode 1 - fits in 4KB */
1291 /* mode 2 - fits in 4KB */
1301 /* mode 3 - fits in 4KB */
1311 /* mode 4 - fits in 16KB */
1342 /* mode 5 - fits in 8KB */
1374 * configure a fifo; for non-shared endpoints, this may be called
1383 void __iomem *mbase = musb->mregs; in fifo_setup()
1385 u16 maxpacket = cfg->maxpacket; in fifo_setup()
1389 /* expect hw_ep has already been zero-initialized */ in fifo_setup()
1391 size = ffs(max_t(u16, maxpacket, 8)) - 1; in fifo_setup()
1394 c_size = size - 3; in fifo_setup()
1395 if (cfg->mode == BUF_DOUBLE) { in fifo_setup()
1397 (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1398 return -EMSGSIZE; in fifo_setup()
1401 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2))) in fifo_setup()
1402 return -EMSGSIZE; in fifo_setup()
1406 musb_writeb(mbase, MUSB_INDEX, hw_ep->epnum); in fifo_setup()
1411 if (hw_ep->epnum == 1) in fifo_setup()
1412 musb->bulk_ep = hw_ep; in fifo_setup()
1414 switch (cfg->style) { in fifo_setup()
1418 hw_ep->tx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); in fifo_setup()
1419 hw_ep->max_packet_sz_tx = maxpacket; in fifo_setup()
1424 hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); in fifo_setup()
1425 hw_ep->max_packet_sz_rx = maxpacket; in fifo_setup()
1430 hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); in fifo_setup()
1431 hw_ep->max_packet_sz_rx = maxpacket; in fifo_setup()
1435 hw_ep->tx_double_buffered = hw_ep->rx_double_buffered; in fifo_setup()
1436 hw_ep->max_packet_sz_tx = maxpacket; in fifo_setup()
1438 hw_ep->is_shared_fifo = true; in fifo_setup()
1445 musb->epmask |= (1 << hw_ep->epnum); in fifo_setup()
1459 struct musb_hw_ep *hw_ep = musb->endpoints; in ep_config_from_table()
1461 if (musb->config->fifo_cfg) { in ep_config_from_table()
1462 cfg = musb->config->fifo_cfg; in ep_config_from_table()
1463 n = musb->config->fifo_cfg_size; in ep_config_from_table()
1505 * be better than static musb->config->num_eps and DYN_FIFO_SIZE... in ep_config_from_table()
1509 u8 epn = cfg->hw_ep_num; in ep_config_from_table()
1511 if (epn >= musb->config->num_eps) { in ep_config_from_table()
1514 return -EINVAL; in ep_config_from_table()
1523 musb->nr_endpoints = max(epn, musb->nr_endpoints); in ep_config_from_table()
1528 n + 1, musb->config->num_eps * 2 - 1, in ep_config_from_table()
1529 offset, (1 << (musb->config->ram_bits + 2))); in ep_config_from_table()
1531 if (!musb->bulk_ep) { in ep_config_from_table()
1533 return -EINVAL; in ep_config_from_table()
1541 * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false
1548 void __iomem *mbase = musb->mregs; in ep_config_from_hw()
1555 for (epnum = 1; epnum < musb->config->num_eps; epnum++) { in ep_config_from_hw()
1557 hw_ep = musb->endpoints + epnum; in ep_config_from_hw()
1563 /* FIXME set up hw_ep->{rx,tx}_double_buffered */ in ep_config_from_hw()
1566 if (hw_ep->max_packet_sz_tx < 512 in ep_config_from_hw()
1567 || hw_ep->max_packet_sz_rx < 512) in ep_config_from_hw()
1573 if (musb->bulk_ep) in ep_config_from_hw()
1575 musb->bulk_ep = hw_ep; in ep_config_from_hw()
1578 if (!musb->bulk_ep) { in ep_config_from_hw()
1580 return -EINVAL; in ep_config_from_hw()
1596 void __iomem *mbase = musb->mregs; in musb_core_init()
1603 strcpy(aInfo, (reg & MUSB_CONFIGDATA_UTMIDW) ? "UTMI-16" : "UTMI-8"); in musb_core_init()
1606 musb->dyn_fifo = true; in musb_core_init()
1610 musb->bulk_combine = true; in musb_core_init()
1614 musb->bulk_split = true; in musb_core_init()
1617 strcat(aInfo, ", HB-ISO Rx"); in musb_core_init()
1618 musb->hb_iso_rx = true; in musb_core_init()
1621 strcat(aInfo, ", HB-ISO Tx"); in musb_core_init()
1622 musb->hb_iso_tx = true; in musb_core_init()
1630 musb->is_multipoint = 1; in musb_core_init()
1633 musb->is_multipoint = 0; in musb_core_init()
1637 pr_err("%s: kernel must disable external hubs, please fix the configuration\n", in musb_core_init()
1643 musb->hwvers = musb_readw(mbase, MUSB_HWVERS); in musb_core_init()
1645 musb_driver_name, type, MUSB_HWVERS_MAJOR(musb->hwvers), in musb_core_init()
1646 MUSB_HWVERS_MINOR(musb->hwvers), in musb_core_init()
1647 (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : ""); in musb_core_init()
1653 musb->nr_endpoints = 1; in musb_core_init()
1654 musb->epmask = 1; in musb_core_init()
1656 if (musb->dyn_fifo) in musb_core_init()
1665 for (i = 0; i < musb->nr_endpoints; i++) { in musb_core_init()
1666 struct musb_hw_ep *hw_ep = musb->endpoints + i; in musb_core_init()
1668 hw_ep->fifo = musb->io.fifo_offset(i) + mbase; in musb_core_init()
1670 if (musb->ops->quirks & MUSB_IN_TUSB) { in musb_core_init()
1671 hw_ep->fifo_async = musb->async + 0x400 + in musb_core_init()
1672 musb->io.fifo_offset(i); in musb_core_init()
1673 hw_ep->fifo_sync = musb->sync + 0x400 + in musb_core_init()
1674 musb->io.fifo_offset(i); in musb_core_init()
1675 hw_ep->fifo_sync_va = in musb_core_init()
1676 musb->sync_va + 0x400 + musb->io.fifo_offset(i); in musb_core_init()
1679 hw_ep->conf = mbase - 0x400 + TUSB_EP0_CONF; in musb_core_init()
1681 hw_ep->conf = mbase + 0x400 + in musb_core_init()
1682 (((i - 1) & 0xf) << 2); in musb_core_init()
1686 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase; in musb_core_init()
1687 hw_ep->rx_reinit = 1; in musb_core_init()
1688 hw_ep->tx_reinit = 1; in musb_core_init()
1690 if (hw_ep->max_packet_sz_tx) { in musb_core_init()
1693 hw_ep->is_shared_fifo ? "shared" : "tx", in musb_core_init()
1694 hw_ep->tx_double_buffered in musb_core_init()
1696 hw_ep->max_packet_sz_tx); in musb_core_init()
1698 if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) { in musb_core_init()
1702 hw_ep->rx_double_buffered in musb_core_init()
1704 hw_ep->max_packet_sz_rx); in musb_core_init()
1706 if (!(hw_ep->max_packet_sz_tx || hw_ep->max_packet_sz_rx)) in musb_core_init()
1713 /*-------------------------------------------------------------------------*/
1717 * irq sources (phy, dma, etc) will be handled first, musb->int_* values
1729 if (!musb->int_usb && !musb->int_tx && !musb->int_rx) in musb_interrupt()
1732 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_interrupt()
1756 if (musb->int_usb) in musb_interrupt()
1757 retval |= musb_stage0_irq(musb, musb->int_usb, devctl); in musb_interrupt()
1759 if (musb->int_tx & 1) { in musb_interrupt()
1766 musb->int_tx &= ~BIT(0); in musb_interrupt()
1769 status = musb->int_tx; in musb_interrupt()
1779 status = musb->int_rx; in musb_interrupt()
1798 MODULE_PARM_DESC(use_dma, "enable/disable use of DMA");
1837 * musb_mailbox - optional phy notifier function
1848 return -ENODEV; in musb_mailbox()
1852 /*-------------------------------------------------------------------------*/
1861 spin_lock_irqsave(&musb->lock, flags); in mode_show()
1863 spin_unlock_irqrestore(&musb->lock, flags); in mode_show()
1876 spin_lock_irqsave(&musb->lock, flags); in mode_store()
1884 status = -EINVAL; in mode_store()
1885 spin_unlock_irqrestore(&musb->lock, flags); in mode_store()
1901 return -EINVAL; in vbus_store()
1904 spin_lock_irqsave(&musb->lock, flags); in vbus_store()
1906 musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ; in vbus_store()
1908 musb->is_active = 0; in vbus_store()
1910 spin_unlock_irqrestore(&musb->lock, flags); in vbus_store()
1925 spin_lock_irqsave(&musb->lock, flags); in vbus_show()
1926 val = musb->a_wait_bcon; in vbus_show()
1930 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in vbus_show()
1937 spin_unlock_irqrestore(&musb->lock, flags); in vbus_show()
1957 return -EINVAL; in srp_store()
1987 if (musb->quirk_retries && !musb->flush_irq_work) { in musb_state_needs_recheck()
1989 schedule_delayed_work(&musb->irq_work, in musb_state_needs_recheck()
1991 musb->quirk_retries--; in musb_state_needs_recheck()
2005 * elsewhere, proper locking must be implemented for musb->session.
2012 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_pm_runtime_check_session()
2031 if (!musb->session) in musb_pm_runtime_check_session()
2034 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
2035 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
2036 musb->session = false; in musb_pm_runtime_check_session()
2044 if (s == musb->session) in musb_pm_runtime_check_session()
2050 error = pm_runtime_get_sync(musb->controller); in musb_pm_runtime_check_session()
2052 dev_err(musb->controller, "Could not enable: %i\n", in musb_pm_runtime_check_session()
2054 musb->quirk_retries = 3; in musb_pm_runtime_check_session()
2057 * We can get a spurious MUSB_INTR_SESSREQ interrupt on start-up in musb_pm_runtime_check_session()
2058 * in B-peripheral mode with nothing connected and the session in musb_pm_runtime_check_session()
2062 schedule_delayed_work(&musb->irq_work, in musb_pm_runtime_check_session()
2066 pm_runtime_mark_last_busy(musb->controller); in musb_pm_runtime_check_session()
2067 pm_runtime_put_autosuspend(musb->controller); in musb_pm_runtime_check_session()
2070 musb->session = s; in musb_pm_runtime_check_session()
2079 error = pm_runtime_resume_and_get(musb->controller); in musb_irq_work()
2081 dev_err(musb->controller, "Could not enable: %i\n", error); in musb_irq_work()
2088 if (musb_get_state(musb) != musb->xceiv_old_state) { in musb_irq_work()
2089 musb->xceiv_old_state = musb_get_state(musb); in musb_irq_work()
2090 sysfs_notify(&musb->controller->kobj, NULL, "mode"); in musb_irq_work()
2093 pm_runtime_mark_last_busy(musb->controller); in musb_irq_work()
2094 pm_runtime_put_autosuspend(musb->controller); in musb_irq_work()
2117 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_recover_from_babble()
2119 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_recover_from_babble()
2128 if (musb->dyn_fifo) in musb_recover_from_babble()
2138 /* --------------------------------------------------------------------------
2154 INIT_LIST_HEAD(&musb->control); in allocate_instance()
2155 INIT_LIST_HEAD(&musb->in_bulk); in allocate_instance()
2156 INIT_LIST_HEAD(&musb->out_bulk); in allocate_instance()
2157 INIT_LIST_HEAD(&musb->pending_list); in allocate_instance()
2159 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; in allocate_instance()
2160 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; in allocate_instance()
2161 musb->mregs = mbase; in allocate_instance()
2162 musb->ctrl_base = mbase; in allocate_instance()
2163 musb->nIrq = -ENODEV; in allocate_instance()
2164 musb->config = config; in allocate_instance()
2165 BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS); in allocate_instance()
2166 for (epnum = 0, ep = musb->endpoints; in allocate_instance()
2167 epnum < musb->config->num_eps; in allocate_instance()
2169 ep->musb = musb; in allocate_instance()
2170 ep->epnum = epnum; in allocate_instance()
2173 musb->controller = dev; in allocate_instance()
2191 * cleanup after everything's been de-activated. in musb_free()
2194 if (musb->nIrq >= 0) { in musb_free()
2195 if (musb->irq_wake) in musb_free()
2196 disable_irq_wake(musb->nIrq); in musb_free()
2197 free_irq(musb->nIrq, musb); in musb_free()
2212 * musb_queue_resume_work(). Callers must take musb->lock.
2220 spin_lock_irqsave(&musb->list_lock, flags); in musb_run_resume_work()
2221 list_for_each_entry_safe(w, _w, &musb->pending_list, node) { in musb_run_resume_work()
2222 if (w->callback) { in musb_run_resume_work()
2223 error = w->callback(musb, w->data); in musb_run_resume_work()
2225 dev_err(musb->controller, in musb_run_resume_work()
2227 w->callback, error); in musb_run_resume_work()
2230 list_del(&w->node); in musb_run_resume_work()
2231 devm_kfree(musb->controller, w); in musb_run_resume_work()
2233 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_run_resume_work()
2241 * on resume. Caller must take musb->lock and must hold an RPM reference.
2244 * resume is done calling musb_run_resume_work() and return -EINPROGRESS
2257 return -EINVAL; in musb_queue_resume_work()
2259 spin_lock_irqsave(&musb->list_lock, flags); in musb_queue_resume_work()
2260 is_suspended = musb->is_runtime_suspended; in musb_queue_resume_work()
2263 w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC); in musb_queue_resume_work()
2265 error = -ENOMEM; in musb_queue_resume_work()
2269 w->callback = callback; in musb_queue_resume_work()
2270 w->data = data; in musb_queue_resume_work()
2272 list_add_tail(&w->node, &musb->pending_list); in musb_queue_resume_work()
2277 spin_unlock_irqrestore(&musb->list_lock, flags); in musb_queue_resume_work()
2293 spin_lock_irqsave(&musb->lock, flags); in musb_deassert_reset()
2295 if (musb->port1_status & USB_PORT_STAT_RESET) in musb_deassert_reset()
2298 spin_unlock_irqrestore(&musb->lock, flags); in musb_deassert_reset()
2302 * Perform generic per-controller initialization.
2307 * not yet corrected for platform-specific offsets
2321 status = -ENODEV; in musb_init_controller()
2326 musb = allocate_instance(dev, plat->config, ctrl); in musb_init_controller()
2328 status = -ENOMEM; in musb_init_controller()
2332 spin_lock_init(&musb->lock); in musb_init_controller()
2333 spin_lock_init(&musb->list_lock); in musb_init_controller()
2334 musb->min_power = plat->min_power; in musb_init_controller()
2335 musb->ops = plat->platform_ops; in musb_init_controller()
2336 musb->port_mode = plat->mode; in musb_init_controller()
2349 * - adjusts musb->mregs in musb_init_controller()
2350 * - sets the musb->isr in musb_init_controller()
2351 * - may initialize an integrated transceiver in musb_init_controller()
2352 * - initializes musb->xceiv, usually by otg_get_phy() in musb_init_controller()
2353 * - stops powering VBUS in musb_init_controller()
2358 * isp1504, non-OTG, etc) mostly hooking up through ULPI. in musb_init_controller()
2364 if (!musb->isr) { in musb_init_controller()
2365 status = -ENODEV; in musb_init_controller()
2371 if (musb->ops->quirks & MUSB_INDEXED_EP) { in musb_init_controller()
2372 musb->io.ep_offset = musb_indexed_ep_offset; in musb_init_controller()
2373 musb->io.ep_select = musb_indexed_ep_select; in musb_init_controller()
2375 musb->io.ep_offset = musb_flat_ep_offset; in musb_init_controller()
2376 musb->io.ep_select = musb_flat_ep_select; in musb_init_controller()
2379 if (musb->ops->quirks & MUSB_G_NO_SKB_RESERVE) in musb_init_controller()
2380 musb->g.quirk_avoids_skb_reserve = 1; in musb_init_controller()
2383 if (musb->ops->ep_offset) in musb_init_controller()
2384 musb->io.ep_offset = musb->ops->ep_offset; in musb_init_controller()
2385 if (musb->ops->ep_select) in musb_init_controller()
2386 musb->io.ep_select = musb->ops->ep_select; in musb_init_controller()
2388 if (musb->ops->fifo_mode) in musb_init_controller()
2389 fifo_mode = musb->ops->fifo_mode; in musb_init_controller()
2393 if (musb->ops->fifo_offset) in musb_init_controller()
2394 musb->io.fifo_offset = musb->ops->fifo_offset; in musb_init_controller()
2396 musb->io.fifo_offset = musb_default_fifo_offset; in musb_init_controller()
2398 if (musb->ops->busctl_offset) in musb_init_controller()
2399 musb->io.busctl_offset = musb->ops->busctl_offset; in musb_init_controller()
2401 musb->io.busctl_offset = musb_default_busctl_offset; in musb_init_controller()
2403 if (musb->ops->readb) in musb_init_controller()
2404 musb_readb = musb->ops->readb; in musb_init_controller()
2405 if (musb->ops->writeb) in musb_init_controller()
2406 musb_writeb = musb->ops->writeb; in musb_init_controller()
2407 if (musb->ops->clearb) in musb_init_controller()
2408 musb_clearb = musb->ops->clearb; in musb_init_controller()
2412 if (musb->ops->readw) in musb_init_controller()
2413 musb_readw = musb->ops->readw; in musb_init_controller()
2414 if (musb->ops->writew) in musb_init_controller()
2415 musb_writew = musb->ops->writew; in musb_init_controller()
2416 if (musb->ops->clearw) in musb_init_controller()
2417 musb_clearw = musb->ops->clearw; in musb_init_controller()
2422 if (!musb->ops->dma_init || !musb->ops->dma_exit) { in musb_init_controller()
2424 status = -ENODEV; in musb_init_controller()
2427 musb_dma_controller_create = musb->ops->dma_init; in musb_init_controller()
2428 musb_dma_controller_destroy = musb->ops->dma_exit; in musb_init_controller()
2431 if (musb->ops->read_fifo) in musb_init_controller()
2432 musb->io.read_fifo = musb->ops->read_fifo; in musb_init_controller()
2434 musb->io.read_fifo = musb_default_read_fifo; in musb_init_controller()
2436 if (musb->ops->write_fifo) in musb_init_controller()
2437 musb->io.write_fifo = musb->ops->write_fifo; in musb_init_controller()
2439 musb->io.write_fifo = musb_default_write_fifo; in musb_init_controller()
2441 if (musb->ops->get_toggle) in musb_init_controller()
2442 musb->io.get_toggle = musb->ops->get_toggle; in musb_init_controller()
2444 musb->io.get_toggle = musb_default_get_toggle; in musb_init_controller()
2446 if (musb->ops->set_toggle) in musb_init_controller()
2447 musb->io.set_toggle = musb->ops->set_toggle; in musb_init_controller()
2449 musb->io.set_toggle = musb_default_set_toggle; in musb_init_controller()
2451 if (IS_ENABLED(CONFIG_USB_PHY) && musb->xceiv && !musb->xceiv->io_ops) { in musb_init_controller()
2452 musb->xceiv->io_dev = musb->controller; in musb_init_controller()
2453 musb->xceiv->io_priv = musb->mregs; in musb_init_controller()
2454 musb->xceiv->io_ops = &musb_ulpi_access; in musb_init_controller()
2457 if (musb->ops->phy_callback) in musb_init_controller()
2458 musb_phy_callback = musb->ops->phy_callback; in musb_init_controller()
2467 pm_runtime_use_autosuspend(musb->controller); in musb_init_controller()
2468 pm_runtime_set_autosuspend_delay(musb->controller, 500); in musb_init_controller()
2469 pm_runtime_enable(musb->controller); in musb_init_controller()
2470 pm_runtime_get_sync(musb->controller); in musb_init_controller()
2472 status = usb_phy_init(musb->xceiv); in musb_init_controller()
2476 if (use_dma && dev->dma_mask) { in musb_init_controller()
2477 musb->dma_controller = in musb_init_controller()
2478 musb_dma_controller_create(musb, musb->mregs); in musb_init_controller()
2479 if (IS_ERR(musb->dma_controller)) { in musb_init_controller()
2480 status = PTR_ERR(musb->dma_controller); in musb_init_controller()
2488 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_init_controller()
2491 musb_writeb(musb->mregs, MUSB_POWER, 0); in musb_init_controller()
2494 INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); in musb_init_controller()
2495 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); in musb_init_controller()
2496 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); in musb_init_controller()
2499 status = musb_core_init(plat->config->multipoint in musb_init_controller()
2505 timer_setup(&musb->otg_timer, musb_otg_timer_func, 0); in musb_init_controller()
2508 if (request_irq(nIrq, musb->isr, IRQF_SHARED, dev_name(dev), musb)) { in musb_init_controller()
2510 status = -ENODEV; in musb_init_controller()
2513 musb->nIrq = nIrq; in musb_init_controller()
2516 musb->irq_wake = 1; in musb_init_controller()
2519 musb->irq_wake = 0; in musb_init_controller()
2523 if (plat->extvbus) { in musb_init_controller()
2524 u8 busctl = musb_readb(musb->mregs, MUSB_ULPI_BUSCONTROL); in musb_init_controller()
2526 musb_writeb(musb->mregs, MUSB_ULPI_BUSCONTROL, busctl); in musb_init_controller()
2532 switch (musb->port_mode) { in musb_init_controller()
2534 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2546 status = musb_host_setup(musb, plat->power); in musb_init_controller()
2557 dev_err(dev, "unsupported port mode %d\n", musb->port_mode); in musb_init_controller()
2566 musb->is_initialized = 1; in musb_init_controller()
2567 pm_runtime_mark_last_busy(musb->controller); in musb_init_controller()
2568 pm_runtime_put_autosuspend(musb->controller); in musb_init_controller()
2573 cancel_delayed_work_sync(&musb->irq_work); in musb_init_controller()
2574 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_init_controller()
2575 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_init_controller()
2576 if (musb->dma_controller) in musb_init_controller()
2577 musb_dma_controller_destroy(musb->dma_controller); in musb_init_controller()
2580 usb_phy_shutdown(musb->xceiv); in musb_init_controller()
2583 pm_runtime_dont_use_autosuspend(musb->controller); in musb_init_controller()
2584 pm_runtime_put_sync(musb->controller); in musb_init_controller()
2585 pm_runtime_disable(musb->controller); in musb_init_controller()
2588 if (musb->irq_wake) in musb_init_controller()
2593 dev_err_probe(musb->controller, status, "%s failed\n", __func__); in musb_init_controller()
2603 /*-------------------------------------------------------------------------*/
2610 struct device *dev = &pdev->dev; in musb_probe()
2626 struct device *dev = &pdev->dev; in musb_remove()
2631 * - Host mode: host may still be active in musb_remove()
2632 * - Peripheral mode: peripheral is deactivated (or never-activated) in musb_remove()
2633 * - OTG mode: both roles are deactivated (or never-activated) in musb_remove()
2637 cancel_delayed_work_sync(&musb->irq_work); in musb_remove()
2638 cancel_delayed_work_sync(&musb->finish_resume_work); in musb_remove()
2639 cancel_delayed_work_sync(&musb->deassert_reset_work); in musb_remove()
2640 pm_runtime_get_sync(musb->controller); in musb_remove()
2645 spin_lock_irqsave(&musb->lock, flags); in musb_remove()
2647 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_remove()
2648 spin_unlock_irqrestore(&musb->lock, flags); in musb_remove()
2651 pm_runtime_dont_use_autosuspend(musb->controller); in musb_remove()
2652 pm_runtime_put_sync(musb->controller); in musb_remove()
2653 pm_runtime_disable(musb->controller); in musb_remove()
2655 if (musb->dma_controller) in musb_remove()
2656 musb_dma_controller_destroy(musb->dma_controller); in musb_remove()
2657 usb_phy_shutdown(musb->xceiv); in musb_remove()
2667 void __iomem *musb_base = musb->mregs; in musb_save_context()
2670 musb->context.frame = musb_readw(musb_base, MUSB_FRAME); in musb_save_context()
2671 musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); in musb_save_context()
2672 musb->context.busctl = musb_readb(musb_base, MUSB_ULPI_BUSCONTROL); in musb_save_context()
2673 musb->context.power = musb_readb(musb_base, MUSB_POWER); in musb_save_context()
2674 musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); in musb_save_context()
2675 musb->context.index = musb_readb(musb_base, MUSB_INDEX); in musb_save_context()
2676 musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); in musb_save_context()
2678 for (i = 0; i < musb->config->num_eps; ++i) { in musb_save_context()
2679 epio = musb->endpoints[i].regs; in musb_save_context()
2684 musb->context.index_regs[i].txmaxp = in musb_save_context()
2686 musb->context.index_regs[i].txcsr = in musb_save_context()
2688 musb->context.index_regs[i].rxmaxp = in musb_save_context()
2690 musb->context.index_regs[i].rxcsr = in musb_save_context()
2693 if (musb->dyn_fifo) { in musb_save_context()
2694 musb->context.index_regs[i].txfifoadd = in musb_save_context()
2696 musb->context.index_regs[i].rxfifoadd = in musb_save_context()
2698 musb->context.index_regs[i].txfifosz = in musb_save_context()
2700 musb->context.index_regs[i].rxfifosz = in musb_save_context()
2704 musb->context.index_regs[i].txtype = in musb_save_context()
2706 musb->context.index_regs[i].txinterval = in musb_save_context()
2708 musb->context.index_regs[i].rxtype = in musb_save_context()
2710 musb->context.index_regs[i].rxinterval = in musb_save_context()
2713 musb->context.index_regs[i].txfunaddr = in musb_save_context()
2715 musb->context.index_regs[i].txhubaddr = in musb_save_context()
2717 musb->context.index_regs[i].txhubport = in musb_save_context()
2720 musb->context.index_regs[i].rxfunaddr = in musb_save_context()
2722 musb->context.index_regs[i].rxhubaddr = in musb_save_context()
2724 musb->context.index_regs[i].rxhubport = in musb_save_context()
2732 void __iomem *musb_base = musb->mregs; in musb_restore_context()
2736 musb_writew(musb_base, MUSB_FRAME, musb->context.frame); in musb_restore_context()
2737 musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); in musb_restore_context()
2738 musb_writeb(musb_base, MUSB_ULPI_BUSCONTROL, musb->context.busctl); in musb_restore_context()
2743 musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); in musb_restore_context()
2744 power |= musb->context.power; in musb_restore_context()
2747 musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); in musb_restore_context()
2748 musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); in musb_restore_context()
2749 musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); in musb_restore_context()
2750 if (musb->context.devctl & MUSB_DEVCTL_SESSION) in musb_restore_context()
2751 musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); in musb_restore_context()
2753 for (i = 0; i < musb->config->num_eps; ++i) { in musb_restore_context()
2754 epio = musb->endpoints[i].regs; in musb_restore_context()
2760 musb->context.index_regs[i].txmaxp); in musb_restore_context()
2762 musb->context.index_regs[i].txcsr); in musb_restore_context()
2764 musb->context.index_regs[i].rxmaxp); in musb_restore_context()
2766 musb->context.index_regs[i].rxcsr); in musb_restore_context()
2768 if (musb->dyn_fifo) { in musb_restore_context()
2770 musb->context.index_regs[i].txfifosz); in musb_restore_context()
2772 musb->context.index_regs[i].rxfifosz); in musb_restore_context()
2774 musb->context.index_regs[i].txfifoadd); in musb_restore_context()
2776 musb->context.index_regs[i].rxfifoadd); in musb_restore_context()
2780 musb->context.index_regs[i].txtype); in musb_restore_context()
2782 musb->context.index_regs[i].txinterval); in musb_restore_context()
2784 musb->context.index_regs[i].rxtype); in musb_restore_context()
2787 musb->context.index_regs[i].rxinterval); in musb_restore_context()
2789 musb->context.index_regs[i].txfunaddr); in musb_restore_context()
2791 musb->context.index_regs[i].txhubaddr); in musb_restore_context()
2793 musb->context.index_regs[i].txhubport); in musb_restore_context()
2796 musb->context.index_regs[i].rxfunaddr); in musb_restore_context()
2798 musb->context.index_regs[i].rxhubaddr); in musb_restore_context()
2800 musb->context.index_regs[i].rxhubport); in musb_restore_context()
2802 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); in musb_restore_context()
2820 musb->flush_irq_work = true; in musb_suspend()
2821 while (flush_delayed_work(&musb->irq_work)) in musb_suspend()
2823 musb->flush_irq_work = false; in musb_suspend()
2825 if (!(musb->ops->quirks & MUSB_PRESERVE_SESSION)) in musb_suspend()
2826 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); in musb_suspend()
2828 WARN_ON(!list_empty(&musb->pending_list)); in musb_suspend()
2830 spin_lock_irqsave(&musb->lock, flags); in musb_suspend()
2838 * they will even be wakeup-enabled. in musb_suspend()
2844 spin_unlock_irqrestore(&musb->lock, flags); in musb_suspend()
2868 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in musb_resume()
2870 if ((devctl & mask) != (musb->context.devctl & mask)) in musb_resume()
2871 musb->port1_status = 0; in musb_resume()
2877 if (musb->port_mode == MUSB_HOST && in musb_resume()
2878 !(musb->ops->quirks & MUSB_PRESERVE_SESSION)) { in musb_resume()
2880 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in musb_resume()
2883 spin_lock_irqsave(&musb->lock, flags); in musb_resume()
2886 dev_err(musb->controller, "resume work failed with %i\n", in musb_resume()
2888 spin_unlock_irqrestore(&musb->lock, flags); in musb_resume()
2901 musb->is_runtime_suspended = 1; in musb_runtime_suspend()
2921 if (!musb->is_initialized) in musb_runtime_resume()
2926 spin_lock_irqsave(&musb->lock, flags); in musb_runtime_resume()
2929 dev_err(musb->controller, "resume work failed with %i\n", in musb_runtime_resume()
2931 musb->is_runtime_suspended = 0; in musb_runtime_resume()
2932 spin_unlock_irqrestore(&musb->lock, flags); in musb_runtime_resume()