[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: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg 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(-)
This commit is contained in:
Родитель
7ff71d6adf
Коммит
9293677af3
|
@ -1431,28 +1431,44 @@ rescan:
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* 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,14 +1489,10 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
void usb_hcd_resume_root_hub (struct usb_hcd *hcd)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
|
EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifdef CONFIG_USB_OTG
|
#ifdef CONFIG_USB_OTG
|
||||||
|
@ -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 = {
|
||||||
*/
|
*/
|
||||||
.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 = {
|
||||||
*/
|
*/
|
||||||
.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 = {
|
||||||
.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 = {
|
||||||
.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 = {
|
||||||
.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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче