提交 9293677a 编写于 作者: D David Brownell 提交者: Greg Kroah-Hartman

[PATCH] all HCDs provide root hub suspend/resume methods

This cleans up a small recent FIXME, ensuring that all the HCDs provide
root hub suspend/resume methods.  It also wraps the calls to those root
suspend routines just like on the PCI "USB_SUSPEND not defined" cases,
so non-PCI bus glue won't be as tempted to behave very differently.

Several of the SOC based OHCI drivers forgot to list those methods;
the patch also adds those missing declarations.
Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>

 drivers/usb/core/hcd.c          |   42 +++++++++++++++++++++++++---------------
 drivers/usb/host/ohci-au1xxx.c  |    5 ++++
 drivers/usb/host/ohci-lh7a404.c |    5 ++++
 drivers/usb/host/ohci-pxa27x.c  |    1
 drivers/usb/host/ohci-s3c2410.c |    1
 drivers/usb/host/ohci-sa1111.c  |    1
 6 files changed, 40 insertions(+), 15 deletions(-)
上级 7ff71d6a
...@@ -1431,28 +1431,44 @@ hcd_endpoint_disable (struct usb_device *udev, struct usb_host_endpoint *ep) ...@@ -1431,28 +1431,44 @@ hcd_endpoint_disable (struct usb_device *udev, struct usb_host_endpoint *ep)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* FIXME make this #ifdef CONFIG_PM ... update root hubs, retest */ #ifdef CONFIG_PM
#ifdef CONFIG_USB_SUSPEND
static int hcd_hub_suspend (struct usb_bus *bus) static int hcd_hub_suspend (struct usb_bus *bus)
{ {
struct usb_hcd *hcd; struct usb_hcd *hcd;
int status;
hcd = container_of (bus, struct usb_hcd, self); hcd = container_of (bus, struct usb_hcd, self);
if (hcd->driver->hub_suspend) if (!hcd->driver->hub_suspend)
return hcd->driver->hub_suspend (hcd); return -ENOENT;
return 0; hcd->state = HC_STATE_QUIESCING;
status = hcd->driver->hub_suspend (hcd);
if (status == 0)
hcd->state = HC_STATE_SUSPENDED;
else
dev_dbg(&bus->root_hub->dev, "%s fail, err %d\n",
"suspend", status);
return status;
} }
static int hcd_hub_resume (struct usb_bus *bus) static int hcd_hub_resume (struct usb_bus *bus)
{ {
struct usb_hcd *hcd; struct usb_hcd *hcd;
int status;
hcd = container_of (bus, struct usb_hcd, self); hcd = container_of (bus, struct usb_hcd, self);
if (hcd->driver->hub_resume) if (!hcd->driver->hub_resume)
return hcd->driver->hub_resume (hcd); return -ENOENT;
return 0; hcd->state = HC_STATE_RESUMING;
status = hcd->driver->hub_resume (hcd);
if (status == 0)
hcd->state = HC_STATE_RUNNING;
else {
dev_dbg(&bus->root_hub->dev, "%s fail, err %d\n",
"resume", status);
usb_hc_died(hcd);
}
return status;
} }
/** /**
...@@ -1473,13 +1489,9 @@ void usb_hcd_resume_root_hub (struct usb_hcd *hcd) ...@@ -1473,13 +1489,9 @@ void usb_hcd_resume_root_hub (struct usb_hcd *hcd)
usb_resume_root_hub (hcd->self.root_hub); usb_resume_root_hub (hcd->self.root_hub);
spin_unlock_irqrestore (&hcd_root_hub_lock, flags); spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
} }
EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
#else
void usb_hcd_resume_root_hub (struct usb_hcd *hcd)
{
}
#endif #endif
EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -1532,7 +1544,7 @@ static struct usb_operations usb_hcd_operations = { ...@@ -1532,7 +1544,7 @@ static struct usb_operations usb_hcd_operations = {
.buffer_alloc = hcd_buffer_alloc, .buffer_alloc = hcd_buffer_alloc,
.buffer_free = hcd_buffer_free, .buffer_free = hcd_buffer_free,
.disable = hcd_endpoint_disable, .disable = hcd_endpoint_disable,
#ifdef CONFIG_USB_SUSPEND #ifdef CONFIG_PM
.hub_suspend = hcd_hub_suspend, .hub_suspend = hcd_hub_suspend,
.hub_resume = hcd_hub_resume, .hub_resume = hcd_hub_resume,
#endif #endif
......
...@@ -214,6 +214,11 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { ...@@ -214,6 +214,11 @@ static const struct hc_driver ohci_au1xxx_hc_driver = {
*/ */
.hub_status_data = ohci_hub_status_data, .hub_status_data = ohci_hub_status_data,
.hub_control = ohci_hub_control, .hub_control = ohci_hub_control,
#ifdef CONFIG_PM
.hub_suspend = ohci_hub_suspend,
.hub_resume = ohci_hub_resume,
#endif
.start_port_reset = ohci_start_port_reset,
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -193,6 +193,11 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { ...@@ -193,6 +193,11 @@ static const struct hc_driver ohci_lh7a404_hc_driver = {
*/ */
.hub_status_data = ohci_hub_status_data, .hub_status_data = ohci_hub_status_data,
.hub_control = ohci_hub_control, .hub_control = ohci_hub_control,
#ifdef CONFIG_PM
.hub_suspend = ohci_hub_suspend,
.hub_resume = ohci_hub_resume,
#endif
.start_port_reset = ohci_start_port_reset,
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -282,6 +282,7 @@ static const struct hc_driver ohci_pxa27x_hc_driver = { ...@@ -282,6 +282,7 @@ static const struct hc_driver ohci_pxa27x_hc_driver = {
.hub_suspend = ohci_hub_suspend, .hub_suspend = ohci_hub_suspend,
.hub_resume = ohci_hub_resume, .hub_resume = ohci_hub_resume,
#endif #endif
.start_port_reset = ohci_start_port_reset,
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -452,6 +452,7 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { ...@@ -452,6 +452,7 @@ static const struct hc_driver ohci_s3c2410_hc_driver = {
.hub_suspend = ohci_hub_suspend, .hub_suspend = ohci_hub_suspend,
.hub_resume = ohci_hub_resume, .hub_resume = ohci_hub_resume,
#endif #endif
.start_port_reset = ohci_start_port_reset,
}; };
/* device driver */ /* device driver */
......
...@@ -239,6 +239,7 @@ static const struct hc_driver ohci_sa1111_hc_driver = { ...@@ -239,6 +239,7 @@ static const struct hc_driver ohci_sa1111_hc_driver = {
.hub_suspend = ohci_hub_suspend, .hub_suspend = ohci_hub_suspend,
.hub_resume = ohci_hub_resume, .hub_resume = ohci_hub_resume,
#endif #endif
.start_port_reset = ohci_start_port_reset,
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册