Lines Matching +full:startup +full:- +full:time +full:- +full:ms

1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright (C) 2005-2006 by Texas Instruments
7 * Copyright (C) 2006-2007 Nokia Corporation
14 #include <linux/time.h>
29 spin_lock_irqsave(&musb->lock, flags); in musb_host_finish_resume()
31 power = musb_readb(musb->mregs, MUSB_POWER); in musb_host_finish_resume()
34 musb_writeb(musb->mregs, MUSB_POWER, power); in musb_host_finish_resume()
41 musb->is_active = 1; in musb_host_finish_resume()
42 musb->port1_status &= ~(USB_PORT_STAT_SUSPEND | MUSB_PORT_STAT_RESUME); in musb_host_finish_resume()
43 musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16; in musb_host_finish_resume()
44 usb_hcd_poll_rh_status(musb->hcd); in musb_host_finish_resume()
46 musb->xceiv->otg->state = OTG_STATE_A_HOST; in musb_host_finish_resume()
48 spin_unlock_irqrestore(&musb->lock, flags); in musb_host_finish_resume()
53 struct usb_otg *otg = musb->xceiv->otg; in musb_port_suspend()
55 void __iomem *mbase = musb->mregs; in musb_port_suspend()
70 return -EBUSY; in musb_port_suspend()
80 if (retries-- < 1) in musb_port_suspend()
87 musb->port1_status |= USB_PORT_STAT_SUSPEND; in musb_port_suspend()
88 switch (musb->xceiv->otg->state) { in musb_port_suspend()
90 musb->xceiv->otg->state = OTG_STATE_A_SUSPEND; in musb_port_suspend()
91 musb->is_active = otg->host->b_hnp_enable; in musb_port_suspend()
92 if (musb->is_active) in musb_port_suspend()
93 mod_timer(&musb->otg_timer, jiffies in musb_port_suspend()
99 musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON; in musb_port_suspend()
100 musb->is_active = otg->host->b_hnp_enable; in musb_port_suspend()
105 usb_otg_state_string(musb->xceiv->otg->state)); in musb_port_suspend()
114 musb->port1_status |= MUSB_PORT_STAT_RESUME; in musb_port_suspend()
115 schedule_delayed_work(&musb->finish_resume_work, in musb_port_suspend()
124 void __iomem *mbase = musb->mregs; in musb_port_reset()
126 if (musb->xceiv->otg->state == OTG_STATE_B_IDLE) { in musb_port_reset()
128 musb->port1_status &= ~USB_PORT_STAT_RESET; in musb_port_reset()
136 * the appropriate amount of time has passed in musb_port_reset()
141 * If RESUME is set, we must make sure it stays minimum 20 ms. in musb_port_reset()
148 long remain = (unsigned long) musb->rh_timer - jiffies; in musb_port_reset()
150 if (musb->rh_timer > 0 && remain > 0) { in musb_port_reset()
153 &musb->deassert_reset_work, remain); in musb_port_reset()
160 /* Give the core 1 ms to clear MUSB_POWER_RESUME */ in musb_port_reset()
161 schedule_delayed_work(&musb->deassert_reset_work, in musb_port_reset()
170 musb->port1_status |= USB_PORT_STAT_RESET; in musb_port_reset()
171 musb->port1_status &= ~USB_PORT_STAT_ENABLE; in musb_port_reset()
172 schedule_delayed_work(&musb->deassert_reset_work, in musb_port_reset()
183 musb_dbg(musb, "high-speed device connected"); in musb_port_reset()
184 musb->port1_status |= USB_PORT_STAT_HIGH_SPEED; in musb_port_reset()
187 musb->port1_status &= ~USB_PORT_STAT_RESET; in musb_port_reset()
188 musb->port1_status |= USB_PORT_STAT_ENABLE in musb_port_reset()
191 usb_hcd_poll_rh_status(musb->hcd); in musb_port_reset()
193 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; in musb_port_reset()
199 struct usb_otg *otg = musb->xceiv->otg; in musb_root_disconnect()
201 musb->port1_status = USB_PORT_STAT_POWER in musb_root_disconnect()
204 usb_hcd_poll_rh_status(musb->hcd); in musb_root_disconnect()
205 musb->is_active = 0; in musb_root_disconnect()
207 switch (musb->xceiv->otg->state) { in musb_root_disconnect()
209 if (otg->host->b_hnp_enable) { in musb_root_disconnect()
210 musb->xceiv->otg->state = OTG_STATE_A_PERIPHERAL; in musb_root_disconnect()
211 musb->g.is_a_peripheral = 1; in musb_root_disconnect()
216 musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON; in musb_root_disconnect()
217 musb->is_active = 0; in musb_root_disconnect()
220 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in musb_root_disconnect()
224 usb_otg_state_string(musb->xceiv->otg->state)); in musb_root_disconnect()
230 /*---------------------------------------------------------------------*/
232 /* Caller may or may not hold musb->lock */
239 if (musb->port1_status & 0xffff0000) { in musb_hub_status_data()
249 * In host-only mode we start a connection right away. In OTG mode in musb_has_gadget()
257 return musb->port_mode == MUSB_HOST; in musb_has_gadget()
275 spin_lock_irqsave(&musb->lock, flags); in musb_hub_control()
278 spin_unlock_irqrestore(&musb->lock, flags); in musb_hub_control()
279 return -ESHUTDOWN; in musb_hub_control()
308 if (!hcd->self.is_b_host) in musb_hub_control()
321 musb->port1_status &= ~(1 << wValue); in musb_hub_control()
327 desc->bDescLength = 9; in musb_hub_control()
328 desc->bDescriptorType = USB_DT_HUB; in musb_hub_control()
329 desc->bNbrPorts = 1; in musb_hub_control()
330 desc->wHubCharacteristics = cpu_to_le16( in musb_hub_control()
331 HUB_CHAR_INDV_PORT_LPSM /* per-port power switching */ in musb_hub_control()
334 desc->bPwrOn2PwrGood = 5; /* msec/2 */ in musb_hub_control()
335 desc->bHubContrCurrent = 0; in musb_hub_control()
338 desc->u.hs.DeviceRemovable[0] = 0x02; /* port 1 */ in musb_hub_control()
339 desc->u.hs.DeviceRemovable[1] = 0xff; in musb_hub_control()
350 put_unaligned(cpu_to_le32(musb->port1_status in musb_hub_control()
355 musb_dbg(musb, "port status %08x", musb->port1_status); in musb_hub_control()
365 * magic side effects from incompletely-described in musb_hub_control()
366 * rules about startup... in musb_hub_control()
371 * logic relating to VBUS power-up. in musb_hub_control()
373 if (!hcd->self.is_b_host && musb_has_gadget(musb)) in musb_hub_control()
410 musb_writeb(musb->mregs, MUSB_DEVCTL, in musb_hub_control()
420 musb_writeb(musb->mregs, MUSB_TESTMODE, temp); in musb_hub_control()
426 musb->port1_status |= 1 << wValue; in musb_hub_control()
432 retval = -EPIPE; in musb_hub_control()
434 spin_unlock_irqrestore(&musb->lock, flags); in musb_hub_control()