lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20190709103025.25761-1-hu1.chen@intel.com>
Date:   Tue,  9 Jul 2019 18:30:25 +0800
From:   "Chen, Hu" <hu1.chen@...el.com>
To:     hdegoede@...hat.com
Cc:     hu1.chen@...el.com, m.balaji@...el.com,
        Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
        linux-usb@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: [PATCH v2] usb: roles: Add PM callbacks

On some Broxton NUC, the usb role is lost after S3 (it becomes "none").
Add PM callbacks to address this. In .suspend, save the role. In
.resume, restore usb role to saved one if it's lost.

Tests:
Run Android on UC6CAY, a NUC powered by Broxton. The usb port near to
the power button is switchable.
- as device. Access the NUC via "adb shell" from a host PC. Adb works
after S3 cycle.
- as host. Mouse works on that usb port after S3 cycle.

Without this fix, both of tests fails.

Signed-off-by: Chen, Hu <hu1.chen@...el.com>
Signed-off-by: Balaji <m.balaji@...el.com>
---
v2: The role maybe changed by ISR or firmware etc. between .suspend and
.resume (Hans).
 .../usb/roles/intel-xhci-usb-role-switch.c    | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/usb/roles/intel-xhci-usb-role-switch.c b/drivers/usb/roles/intel-xhci-usb-role-switch.c
index 277de96181f9..e830299c401e 100644
--- a/drivers/usb/roles/intel-xhci-usb-role-switch.c
+++ b/drivers/usb/roles/intel-xhci-usb-role-switch.c
@@ -20,6 +20,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/usb/role.h>
+#include <linux/power_supply.h>
 
 /* register definition */
 #define DUAL_ROLE_CFG0			0x68
@@ -37,6 +38,7 @@
 struct intel_xhci_usb_data {
 	struct usb_role_switch *role_sw;
 	void __iomem *base;
+	enum usb_role role;
 };
 
 static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role)
@@ -167,6 +169,29 @@ static int intel_xhci_usb_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int intel_xhci_usb_suspend(struct platform_device *pdev,
+				  pm_message_t state)
+{
+	struct intel_xhci_usb_data *data = platform_get_drvdata(pdev);
+	struct device *dev = &pdev->dev;
+
+	data->role = intel_xhci_usb_get_role(dev);
+
+	return 0;
+}
+
+static int intel_xhci_usb_resume(struct platform_device *pdev)
+{
+	struct intel_xhci_usb_data *data = platform_get_drvdata(pdev);
+	struct device *dev = &pdev->dev;
+
+	if (intel_xhci_usb_get_role(dev) == USB_ROLE_NONE &&
+	    power_supply_is_system_supplied())
+		intel_xhci_usb_set_role(dev, data->role);
+
+	return 0;
+}
+
 static const struct platform_device_id intel_xhci_usb_table[] = {
 	{ .name = DRV_NAME },
 	{}
@@ -180,6 +205,8 @@ static struct platform_driver intel_xhci_usb_driver = {
 	.id_table = intel_xhci_usb_table,
 	.probe = intel_xhci_usb_probe,
 	.remove = intel_xhci_usb_remove,
+	.suspend = intel_xhci_usb_suspend,
+	.resume = intel_xhci_usb_resume,
 };
 
 module_platform_driver(intel_xhci_usb_driver);
-- 
2.22.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ