Am Freitag, 19. Januar 2007 16:01 schrieb Alan Stern:
> On Fri, 19 Jan 2007, Oliver Neukum wrote:
>
> > Hi,
> >
> > this is the second take of the patch to switch off autosuspend
Third take.
> > through sysfs to allow battery powered devices to recharge of the
> > bus. It includes the cleanups Alan suggested.
Alan?
Regards
Oliver
Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
----
--- a/include/linux/usb.h 2007-01-23 12:15:07.000000000 +0100
+++ b/include/linux/usb.h 2007-01-23 11:53:46.000000000 +0100
@@ -364,6 +364,7 @@
unsigned discon_suspended:1; /* Disconnected while suspended */
unsigned have_langid:1; /* whether string_langid is valid */
+ unsigned may_autosuspend:1; /* whether it should autosuspend */
int string_langid; /* language ID for strings */
/* static strings from the device */
--- a/drivers/usb/core/sysfs.c 2007-01-23 12:29:29.000000000 +0100
+++ b/drivers/usb/core/sysfs.c 2007-01-23 12:00:01.000000000 +0100
@@ -148,6 +148,39 @@
}
static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL);
+static ssize_t
+show_autosuspend(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct usb_device *udev;
+
+ udev = to_usb_device(dev);
+ return sprintf(buf, "%d\n", udev->may_autosuspend);
+}
+
+static ssize_t
+set_autosuspend(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct usb_device *udev = to_usb_device(dev);
+ int value, old;
+
+ if (sscanf (buf, "%u", &value) != 1 || value > 1)
+ return -EINVAL;
+
+ /* protected by sysfs's lock */
+ old = udev->may_autosuspend;
+ udev->may_autosuspend = value;
+ if (!value && old)
+ usb_autoresume_device(udev);
+ else if (value && !old)
+ usb_autosuspend_device(udev);
+
+ return count;
+}
+
+static DEVICE_ATTR(autosuspend, S_IRUGO | S_IWUSR,
+ show_autosuspend, set_autosuspend);
+
/* Descriptor fields */
#define usb_descriptor_attr_le16(field, format_string) \
static ssize_t \
@@ -185,6 +218,8 @@
usb_descriptor_attr(bMaxPacketSize0, "%d\n")
static struct attribute *dev_attrs[] = {
+ /* power management attributes */
+ &dev_attr_autosuspend.attr,
/* current configuration's attributes */
&dev_attr_configuration.attr,
&dev_attr_bNumInterfaces.attr,
--- a/drivers/usb/core/usb.c 2007-01-23 12:14:58.000000000 +0100
+++ b/drivers/usb/core/usb.c 2007-01-23 11:56:13.000000000 +0100
@@ -301,6 +301,7 @@
dev->portnum = port1;
dev->bus = bus;
dev->parent = parent;
+ dev->may_autosuspend = 1;
INIT_LIST_HEAD(&dev->filelist);
#ifdef CONFIG_PM
--- a/drivers/usb/core/driver.c 2007-01-23 12:14:58.000000000 +0100
+++ b/drivers/usb/core/driver.c 2007-01-23 11:51:27.000000000 +0100
@@ -948,7 +948,8 @@
int i;
struct usb_interface *intf;
- /* For autosuspend, fail fast if anything is in use.
+ /* For autosuspend, fail fast if anything is in use or autosuspend
+ * is disabled through sysfs.
* Also fail if any interfaces require remote wakeup but it
* isn't available. */
udev->do_remote_wakeup = device_may_wakeup(&udev->dev);
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel