Merge "USB: Allow skipping device resume during system resume"
This commit is contained in:
commit
d1a64e4014
3 changed files with 25 additions and 0 deletions
|
@ -1441,6 +1441,9 @@ int usb_suspend(struct device *dev, pm_message_t msg)
|
||||||
{
|
{
|
||||||
struct usb_device *udev = to_usb_device(dev);
|
struct usb_device *udev = to_usb_device(dev);
|
||||||
|
|
||||||
|
if (udev->bus->skip_resume && udev->state == USB_STATE_SUSPENDED)
|
||||||
|
return 0;
|
||||||
|
|
||||||
unbind_no_pm_drivers_interfaces(udev);
|
unbind_no_pm_drivers_interfaces(udev);
|
||||||
|
|
||||||
/* From now on we are sure all drivers support suspend/resume
|
/* From now on we are sure all drivers support suspend/resume
|
||||||
|
@ -1470,6 +1473,15 @@ int usb_resume(struct device *dev, pm_message_t msg)
|
||||||
struct usb_device *udev = to_usb_device(dev);
|
struct usb_device *udev = to_usb_device(dev);
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some buses would like to keep their devices in suspend
|
||||||
|
* state after system resume. Their resume happen when
|
||||||
|
* a remote wakeup is detected or interface driver start
|
||||||
|
* I/O.
|
||||||
|
*/
|
||||||
|
if (udev->bus->skip_resume)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* For all calls, take the device back to full power and
|
/* For all calls, take the device back to full power and
|
||||||
* tell the PM core in case it was autosuspended previously.
|
* tell the PM core in case it was autosuspended previously.
|
||||||
* Unbind the interfaces that will need rebinding later,
|
* Unbind the interfaces that will need rebinding later,
|
||||||
|
|
|
@ -167,6 +167,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
||||||
if (!hcd)
|
if (!hcd)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
hcd_to_bus(hcd)->skip_resume = true;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
hcd->regs = devm_ioremap_resource(&pdev->dev, res);
|
hcd->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||||
if (IS_ERR(hcd->regs)) {
|
if (IS_ERR(hcd->regs)) {
|
||||||
|
@ -221,6 +223,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
||||||
goto disable_clk;
|
goto disable_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hcd_to_bus(xhci->shared_hcd)->skip_resume = true;
|
||||||
|
|
||||||
if ((node && of_property_read_bool(node, "usb3-lpm-capable")) ||
|
if ((node && of_property_read_bool(node, "usb3-lpm-capable")) ||
|
||||||
(pdata && pdata->usb3_lpm_capable))
|
(pdata && pdata->usb3_lpm_capable))
|
||||||
xhci->quirks |= XHCI_LPM_SUPPORT;
|
xhci->quirks |= XHCI_LPM_SUPPORT;
|
||||||
|
|
|
@ -395,6 +395,15 @@ struct usb_bus {
|
||||||
struct mon_bus *mon_bus; /* non-null when associated */
|
struct mon_bus *mon_bus; /* non-null when associated */
|
||||||
int monitored; /* non-zero when monitored */
|
int monitored; /* non-zero when monitored */
|
||||||
#endif
|
#endif
|
||||||
|
unsigned skip_resume:1; /* All USB devices are brought into full
|
||||||
|
* power state after system resume. It
|
||||||
|
* is desirable for some buses to keep
|
||||||
|
* their devices in suspend state even
|
||||||
|
* after system resume. The devices
|
||||||
|
* are resumed later when a remote
|
||||||
|
* wakeup is detected or an interface
|
||||||
|
* driver starts I/O.
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct usb_dev_state;
|
struct usb_dev_state;
|
||||||
|
|
Loading…
Add table
Reference in a new issue