Greg:
Pavel Machek has stated that the current /sys/devices/.../power/state
interface is broken and likely to be replaced. It seems like a good idea
to add a separate private interface for use with USB devices, where
we know that the only possible power states are suspended and fully-on.
This patch (as737) adds a "suspended" attribute for each usb_device.
Writing 1 to the attribute will suspend the device and its interfaces, and
writing 0 will resume them. The attribute is present only when
CONFIG_USB_SUSPEND has been set, for obvious reasons.
The patch also makes a small cleanup to the sysfs.c file, by moving the
dev_attr_configuration entry into the large attribute group instead of
handling it separately.
Alan Stern
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
---
Index: usb-2.6/drivers/usb/core/sysfs.c
===================================================================
--- usb-2.6.orig/drivers/usb/core/sysfs.c
+++ usb-2.6/drivers/usb/core/sysfs.c
@@ -61,7 +61,7 @@ static ssize_t
set_bConfigurationValue (struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
- struct usb_device *udev = udev = to_usb_device (dev);
+ struct usb_device *udev = to_usb_device (dev);
int config, value;
if (sscanf (buf, "%u", &config) != 1 || config > 255)
@@ -149,6 +149,37 @@ show_maxchild (struct device *dev, struc
}
static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL);
+/* suspended attribute is present only if CONFIG_USB_SUSPEND is set */
+#ifdef CONFIG_USB_SUSPEND
+
+static ssize_t
+show_suspended (struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct usb_device *udev = to_usb_device (dev);
+
+ return sprintf(buf, "%d\n", (udev->state == USB_STATE_SUSPENDED));
+}
+
+static ssize_t
+set_suspended (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned value;
+
+ if (sscanf (buf, "%u", &value) != 1 || value > 1)
+ return -EINVAL;
+ if (value)
+ value = dpm_runtime_suspend(dev, PMSG_SUSPEND);
+ else
+ dpm_runtime_resume(dev); /* No return code?? */
+ return (value < 0) ? value : count;
+}
+
+static DEVICE_ATTR(suspended, S_IRUGO | S_IWUSR,
+ show_suspended, set_suspended);
+
+#endif /* CONFIG_USB_SUSPEND */
+
/* Descriptor fields */
#define usb_descriptor_attr_le16(field, format_string) \
static ssize_t \
@@ -187,6 +218,7 @@ usb_descriptor_attr (bMaxPacketSize0, "%
static struct attribute *dev_attrs[] = {
/* current configuration's attributes */
+ &dev_attr_configuration.attr,
&dev_attr_bNumInterfaces.attr,
&dev_attr_bConfigurationValue.attr,
&dev_attr_bmAttributes.attr,
@@ -204,6 +236,9 @@ static struct attribute *dev_attrs[] = {
&dev_attr_devnum.attr,
&dev_attr_version.attr,
&dev_attr_maxchild.attr,
+#ifdef CONFIG_USB_SUSPEND
+ &dev_attr_suspended.attr,
+#endif
NULL,
};
static struct attribute_group dev_attr_grp = {
@@ -222,7 +257,6 @@ void usb_create_sysfs_dev_files (struct
device_create_file (dev, &dev_attr_product);
if (udev->serial)
device_create_file (dev, &dev_attr_serial);
- device_create_file (dev, &dev_attr_configuration);
usb_create_ep_files(dev, &udev->ep0, udev);
}
@@ -239,7 +273,6 @@ void usb_remove_sysfs_dev_files (struct
device_remove_file(dev, &dev_attr_product);
if (udev->serial)
device_remove_file(dev, &dev_attr_serial);
- device_remove_file (dev, &dev_attr_configuration);
}
/* Interface fields */
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel