[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090608150039.GB17579@srcf.ucam.org>
Date: Mon, 8 Jun 2009 16:00:39 +0100
From: Matthew Garrett <mjg@...hat.com>
To: Alan Stern <stern@...land.harvard.edu>
Cc: alan-jenkins@...fmail.co.uk, Pekka Enberg <penberg@...helsinki.fi>,
Corentin Chary <corentin.chary@...il.com>,
acpi4asus-user@...ts.sourceforge.net, len.brown@...el.com,
linux-kernel@...r.kernel.org, linux-usb@...r.kernel.org,
Darren Salt <linux@...mustbejoking.demon.co.uk>
Subject: Re: [PATCH] eeepc-laptop: enable camera by default
On Sun, Jun 07, 2009 at 11:10:52PM -0400, Alan Stern wrote:
> On Mon, 8 Jun 2009, Matthew Garrett wrote:
>
> > On Sun, Jun 07, 2009 at 11:03:48PM -0400, Alan Stern wrote:
> >
> > > There's no mechanism for this. It many environments it couldn't work,
> > > because the decision about whether to enable autosuspend is made when
> > > the device is first created (i.e., when the creation uevent is
> > > received), whereas driver binding doesn't occur until later.
> >
> > There's a lot of power management situations where you don't end up with
> > the optimal power configuration until a driver's bound. It's certainly
> > possible to do this in userspace, but if we know that the hardware
> > supported by a given driver will always work then it seems reasonable to
> > have it whitelist autosuspend on that device.
>
> Sure. Such a thing could be added easily enough. It just doesn't
> exist now, that's all.
Something roughly like this? We'd probably also want a function call so
drivers can do it based on the ID of the device they're handling, but in
some cases we can probably assume that all devices supported by the
driver will work.
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index d0a21a5..36f63a7 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -355,6 +355,8 @@ int usb_driver_claim_interface(struct usb_driver *driver,
iface->condition = USB_INTERFACE_BOUND;
mark_active(iface);
iface->pm_usage_cnt = !(driver->supports_autosuspend);
+ if (driver->supports_autosuspend && driver->enable_autosuspend)
+ udev->autosuspend_disabled=0;
usb_pm_unlock(udev);
/* if interface was already added, bind now; else let
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 3aa2cd1..b4696f2 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -819,6 +819,8 @@ struct usbdrv_wrap {
* added to this driver by preventing the sysfs file from being created.
* @supports_autosuspend: if set to 0, the USB core will not allow autosuspend
* for interfaces bound to this driver.
+ * @enable_autosuspend: if set to 1, the USB core will automatically enable
+ * autosuspend for interfaces bound to this driver.
* @soft_unbind: if set to 1, the USB core will not kill URBs and disable
* endpoints before calling the driver's disconnect method.
*
@@ -861,6 +863,7 @@ struct usb_driver {
struct usbdrv_wrap drvwrap;
unsigned int no_dynamic_id:1;
unsigned int supports_autosuspend:1;
+ unsigned int enable_autosuspend:1;
unsigned int soft_unbind:1;
};
#define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)
--
Matthew Garrett | mjg59@...f.ucam.org
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists