Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa75216d authored by Hemant Kumar's avatar Hemant Kumar Committed by Mayank Rana
Browse files

USB: Allow skipping device resume during system resume



This allows xHC to remain in low power mode and not
resume the bus when system wide resume happens.
Controller comes out of low power mode only when usb
device issues a remote wakeup or if there is a host
initiated bus resume.

Change-Id: I96cdcb9e3642906b4afa08d9bde07e123d9b3977
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent 95c27754
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -1462,6 +1462,9 @@ int usb_suspend(struct device *dev, pm_message_t msg)
{
	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);

	/* From now on we are sure all drivers support suspend/resume
@@ -1491,6 +1494,15 @@ int usb_resume(struct device *dev, pm_message_t msg)
	struct usb_device	*udev = to_usb_device(dev);
	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
	 * tell the PM core in case it was autosuspended previously.
	 * Unbind the interfaces that will need rebinding later,
+4 −0
Original line number Diff line number Diff line
@@ -272,6 +272,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
		goto disable_runtime;
	}

	hcd_to_bus(hcd)->skip_resume = true;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	hcd->regs = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(hcd->regs)) {
@@ -318,6 +320,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
		goto disable_clk;
	}

	hcd_to_bus(xhci->shared_hcd)->skip_resume = true;

	if (device_property_read_bool(&pdev->dev, "usb3-lpm-capable"))
		xhci->quirks |= XHCI_LPM_SUPPORT;

+9 −0
Original line number Diff line number Diff line
@@ -468,6 +468,15 @@ struct usb_bus {
	struct mon_bus *mon_bus;	/* non-null when associated */
	int monitored;			/* non-zero when monitored */
#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;