|
@@ -531,6 +531,25 @@ static ssize_t usb2_lpm_besl_store(struct device *dev,
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(usb2_lpm_besl);
|
|
|
|
|
|
+static ssize_t usb3_hardware_lpm_show(struct device *dev,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct usb_device *udev = to_usb_device(dev);
|
|
|
+ const char *p;
|
|
|
+
|
|
|
+ usb_lock_device(udev);
|
|
|
+
|
|
|
+ if (udev->usb3_lpm_enabled)
|
|
|
+ p = "enabled";
|
|
|
+ else
|
|
|
+ p = "disabled";
|
|
|
+
|
|
|
+ usb_unlock_device(udev);
|
|
|
+
|
|
|
+ return sprintf(buf, "%s\n", p);
|
|
|
+}
|
|
|
+static DEVICE_ATTR_RO(usb3_hardware_lpm);
|
|
|
+
|
|
|
static struct attribute *usb2_hardware_lpm_attr[] = {
|
|
|
&dev_attr_usb2_hardware_lpm.attr,
|
|
|
&dev_attr_usb2_lpm_l1_timeout.attr,
|
|
@@ -542,6 +561,15 @@ static struct attribute_group usb2_hardware_lpm_attr_group = {
|
|
|
.attrs = usb2_hardware_lpm_attr,
|
|
|
};
|
|
|
|
|
|
+static struct attribute *usb3_hardware_lpm_attr[] = {
|
|
|
+ &dev_attr_usb3_hardware_lpm.attr,
|
|
|
+ NULL,
|
|
|
+};
|
|
|
+static struct attribute_group usb3_hardware_lpm_attr_group = {
|
|
|
+ .name = power_group_name,
|
|
|
+ .attrs = usb3_hardware_lpm_attr,
|
|
|
+};
|
|
|
+
|
|
|
static struct attribute *power_attrs[] = {
|
|
|
&dev_attr_autosuspend.attr,
|
|
|
&dev_attr_level.attr,
|
|
@@ -564,6 +592,9 @@ static int add_power_attributes(struct device *dev)
|
|
|
if (udev->usb2_hw_lpm_capable == 1)
|
|
|
rc = sysfs_merge_group(&dev->kobj,
|
|
|
&usb2_hardware_lpm_attr_group);
|
|
|
+ if (udev->lpm_capable == 1)
|
|
|
+ rc = sysfs_merge_group(&dev->kobj,
|
|
|
+ &usb3_hardware_lpm_attr_group);
|
|
|
}
|
|
|
|
|
|
return rc;
|