From 6bc6cff52e0c4c4c876b1b8a5750041da61ad42b Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Fri, 4 May 2007 11:53:03 -0400 Subject: [PATCH] USB: add RESET_RESUME device quirk This patch (as888) adds a new USB device quirk for devices which are unable to resume correctly. By using the new code added for the USB-persist facility, it is a simple matter to reset these devices instead of resuming them. To get things kicked off, a quirk entry is added for the Philips PSC805. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/driver.c | 4 ++++ drivers/usb/core/hub.c | 5 +++++ drivers/usb/core/quirks.c | 3 +++ include/linux/usb/quirks.h | 3 +++ 4 files changed, 15 insertions(+) diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 12dd986bdffd..02d6db61c940 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -24,6 +24,7 @@ #include #include +#include #include #include "hcd.h" #include "usb.h" @@ -835,6 +836,9 @@ static int usb_resume_device(struct usb_device *udev) goto done; } + if (udev->quirks & USB_QUIRK_RESET_RESUME) + udev->reset_resume = 1; + udriver = to_usb_device_driver(udev->dev.driver); status = udriver->resume(udev); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 51d2d304568b..d37ad083d5ef 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2939,6 +2939,11 @@ static int config_descriptors_changed(struct usb_device *udev) * this from a driver probe() routine after downloading new firmware. * For calls that might not occur during probe(), drivers should lock * the device using usb_lock_device_for_reset(). + * + * Locking exception: This routine may also be called from within an + * autoresume handler. Such usage won't conflict with other tasks + * holding the device lock because these tasks should always call + * usb_autopm_resume_device(), thereby preventing any unwanted autoresume. */ int usb_reset_device(struct usb_device *udev) { diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 739f520908aa..f37fa012f329 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -35,6 +35,9 @@ static const struct usb_device_id usb_quirk_list[] = { /* Elsa MicroLink 56k (V.250) */ { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, + /* Philips PSC805 audio device */ + { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME }, + { } /* terminating entry must be last */ }; diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index 6bac8faacbc6..8da374caf582 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h @@ -9,3 +9,6 @@ /* string descriptors must not be fetched using a 255-byte read */ #define USB_QUIRK_STRING_FETCH_255 0x00000002 + +/* device can't resume correctly so reset it instead */ +#define USB_QUIRK_RESET_RESUME 0x00000004