USB: ohci: merge ohci_finish_controller_resume with ohci_resume
Merge ohci_finish_controller_resume with ohci_resume as suggested by Alan Stern. Since ohci_finish_controller_resume no longer exists, update the various OHCI drivers to call ohci_resume() instead. Some drivers used to set themselves the bit HCD_FLAG_HW_ACCESSIBLE, which is now handled by ohci_resume(). Acked-by: Jingoo Han <jg1.han@samsung.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Florian Fainelli <florian@openwrt.org> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d4ae47dc56
commit
cfa49b4b88
11 changed files with 48 additions and 57 deletions
|
@ -705,7 +705,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
|
||||||
if (!clocked)
|
if (!clocked)
|
||||||
at91_start_clock();
|
at91_start_clock();
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -194,7 +194,7 @@ static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev)
|
||||||
|
|
||||||
ep93xx_start_hc(&pdev->dev);
|
ep93xx_start_hc(&pdev->dev);
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -252,10 +252,7 @@ static int exynos_ohci_resume(struct device *dev)
|
||||||
if (pdata && pdata->phy_init)
|
if (pdata && pdata->phy_init)
|
||||||
pdata->phy_init(pdev, S5P_USB_PHY_HOST);
|
pdata->phy_init(pdev, S5P_USB_PHY_HOST);
|
||||||
|
|
||||||
/* Mark hardware accessible again as we are out of D3 state by now */
|
ohci_resume(hcd, false);
|
||||||
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1035,13 +1035,50 @@ static int __maybe_unused ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
|
||||||
|
|
||||||
static int __maybe_unused ohci_resume(struct usb_hcd *hcd, bool hibernated)
|
static int __maybe_unused ohci_resume(struct usb_hcd *hcd, bool hibernated)
|
||||||
{
|
{
|
||||||
|
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
int port;
|
||||||
|
bool need_reinit = false;
|
||||||
|
|
||||||
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
||||||
|
|
||||||
/* Make sure resume from hibernation re-enumerates everything */
|
/* Make sure resume from hibernation re-enumerates everything */
|
||||||
if (hibernated)
|
if (hibernated)
|
||||||
ohci_usb_reset(hcd_to_ohci(hcd));
|
ohci_usb_reset(ohci);
|
||||||
|
|
||||||
|
/* See if the controller is already running or has been reset */
|
||||||
|
ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
|
||||||
|
if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
|
||||||
|
need_reinit = true;
|
||||||
|
} else {
|
||||||
|
switch (ohci->hc_control & OHCI_CTRL_HCFS) {
|
||||||
|
case OHCI_USB_OPER:
|
||||||
|
case OHCI_USB_RESET:
|
||||||
|
need_reinit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If needed, reinitialize and suspend the root hub */
|
||||||
|
if (need_reinit) {
|
||||||
|
spin_lock_irq(&ohci->lock);
|
||||||
|
ohci_rh_resume(ohci);
|
||||||
|
ohci_rh_suspend(ohci, 0);
|
||||||
|
spin_unlock_irq(&ohci->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Normally just turn on port power and enable interrupts */
|
||||||
|
else {
|
||||||
|
ohci_dbg(ohci, "powerup ports\n");
|
||||||
|
for (port = 0; port < ohci->num_ports; port++)
|
||||||
|
ohci_writel(ohci, RH_PS_PPS,
|
||||||
|
&ohci->regs->roothub.portstatus[port]);
|
||||||
|
|
||||||
|
ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
|
||||||
|
ohci_readl(ohci, &ohci->regs->intrenable);
|
||||||
|
msleep(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_hcd_resume_root_hub(hcd);
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -316,48 +316,6 @@ static int ohci_bus_resume (struct usb_hcd *hcd)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Carry out the final steps of resuming the controller device */
|
|
||||||
static void __maybe_unused ohci_finish_controller_resume(struct usb_hcd *hcd)
|
|
||||||
{
|
|
||||||
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
|
||||||
int port;
|
|
||||||
bool need_reinit = false;
|
|
||||||
|
|
||||||
/* See if the controller is already running or has been reset */
|
|
||||||
ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
|
|
||||||
if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
|
|
||||||
need_reinit = true;
|
|
||||||
} else {
|
|
||||||
switch (ohci->hc_control & OHCI_CTRL_HCFS) {
|
|
||||||
case OHCI_USB_OPER:
|
|
||||||
case OHCI_USB_RESET:
|
|
||||||
need_reinit = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If needed, reinitialize and suspend the root hub */
|
|
||||||
if (need_reinit) {
|
|
||||||
spin_lock_irq(&ohci->lock);
|
|
||||||
ohci_rh_resume(ohci);
|
|
||||||
ohci_rh_suspend(ohci, 0);
|
|
||||||
spin_unlock_irq(&ohci->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Normally just turn on port power and enable interrupts */
|
|
||||||
else {
|
|
||||||
ohci_dbg(ohci, "powerup ports\n");
|
|
||||||
for (port = 0; port < ohci->num_ports; port++)
|
|
||||||
ohci_writel(ohci, RH_PS_PPS,
|
|
||||||
&ohci->regs->roothub.portstatus[port]);
|
|
||||||
|
|
||||||
ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
|
|
||||||
ohci_readl(ohci, &ohci->regs->intrenable);
|
|
||||||
msleep(20);
|
|
||||||
}
|
|
||||||
|
|
||||||
usb_hcd_resume_root_hub(hcd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Carry out polling-, autostop-, and autoresume-related state changes */
|
/* Carry out polling-, autostop-, and autoresume-related state changes */
|
||||||
static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
|
static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
|
||||||
int any_connected, int rhsc_status)
|
int any_connected, int rhsc_status)
|
||||||
|
|
|
@ -530,7 +530,7 @@ static int ohci_omap_resume(struct platform_device *dev)
|
||||||
ohci->next_statechange = jiffies;
|
ohci->next_statechange = jiffies;
|
||||||
|
|
||||||
omap_ohci_clock_power(1);
|
omap_ohci_clock_power(1);
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,7 +203,7 @@ static int ohci_platform_resume(struct device *dev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -591,7 +591,7 @@ static int ohci_hcd_pxa27x_drv_resume(struct device *dev)
|
||||||
/* Select Power Management Mode */
|
/* Select Power Management Mode */
|
||||||
pxa27x_ohci_select_pmm(ohci, inf->port_mode);
|
pxa27x_ohci_select_pmm(ohci, inf->port_mode);
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -524,8 +524,7 @@ static int ohci_hcd_s3c2410_drv_resume(struct device *dev)
|
||||||
|
|
||||||
s3c2410_start_hc(pdev, hcd);
|
s3c2410_start_hc(pdev, hcd);
|
||||||
|
|
||||||
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
ohci_resume(hcd, false);
|
||||||
ohci_finish_controller_resume(hcd);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,7 +231,7 @@ static int spear_ohci_hcd_drv_resume(struct platform_device *dev)
|
||||||
ohci->next_statechange = jiffies;
|
ohci->next_statechange = jiffies;
|
||||||
|
|
||||||
spear_start_ohci(ohci_p);
|
spear_start_ohci(ohci_p);
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -352,7 +352,7 @@ static int ohci_hcd_tmio_drv_resume(struct platform_device *dev)
|
||||||
|
|
||||||
spin_unlock_irqrestore(&tmio->lock, flags);
|
spin_unlock_irqrestore(&tmio->lock, flags);
|
||||||
|
|
||||||
ohci_finish_controller_resume(hcd);
|
ohci_resume(hcd, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue