diff options
Diffstat (limited to 'drivers/usb/core/quirks.c')
| -rw-r--r-- | drivers/usb/core/quirks.c | 43 | 
1 files changed, 43 insertions, 0 deletions
| diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 5b44cd47da5..12924dbfdc2 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -13,6 +13,7 @@  #include <linux/usb.h>  #include <linux/usb/quirks.h> +#include <linux/usb/hcd.h>  #include "usb.h"  /* Lists of quirky USB devices, split in device quirks and interface quirks. @@ -97,6 +98,9 @@ static const struct usb_device_id usb_quirk_list[] = {  	/* Alcor Micro Corp. Hub */  	{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME }, +	/* MicroTouch Systems touchscreen */ +	{ USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME }, +  	/* appletouch */  	{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, @@ -130,6 +134,9 @@ static const struct usb_device_id usb_quirk_list[] = {  	/* Broadcom BCM92035DGROM BT dongle */  	{ USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME }, +	/* MAYA44USB sound device */ +	{ USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME }, +  	/* Action Semiconductor flash disk */  	{ USB_DEVICE(0x10d6, 0x2200), .driver_info =  			USB_QUIRK_STRING_FETCH_255 }, @@ -155,6 +162,21 @@ static const struct usb_device_id usb_interface_quirk_list[] = {  	{ }  /* terminating entry must be last */  }; +static const struct usb_device_id usb_amd_resume_quirk_list[] = { +	/* Lenovo Mouse with Pixart controller */ +	{ USB_DEVICE(0x17ef, 0x602e), .driver_info = USB_QUIRK_RESET_RESUME }, + +	/* Pixart Mouse */ +	{ USB_DEVICE(0x093a, 0x2500), .driver_info = USB_QUIRK_RESET_RESUME }, +	{ USB_DEVICE(0x093a, 0x2510), .driver_info = USB_QUIRK_RESET_RESUME }, +	{ USB_DEVICE(0x093a, 0x2521), .driver_info = USB_QUIRK_RESET_RESUME }, + +	/* Logitech Optical Mouse M90/M100 */ +	{ USB_DEVICE(0x046d, 0xc05a), .driver_info = USB_QUIRK_RESET_RESUME }, + +	{ }  /* terminating entry must be last */ +}; +  static bool usb_match_any_interface(struct usb_device *udev,  				    const struct usb_device_id *id)  { @@ -181,6 +203,18 @@ static bool usb_match_any_interface(struct usb_device *udev,  	return false;  } +static int usb_amd_resume_quirk(struct usb_device *udev) +{ +	struct usb_hcd *hcd; + +	hcd = bus_to_hcd(udev->bus); +	/* The device should be attached directly to root hub */ +	if (udev->level == 1 && hcd->amd_resume_bug == 1) +		return 1; + +	return 0; +} +  static u32 __usb_detect_quirks(struct usb_device *udev,  			       const struct usb_device_id *id)  { @@ -206,6 +240,15 @@ static u32 __usb_detect_quirks(struct usb_device *udev,  void usb_detect_quirks(struct usb_device *udev)  {  	udev->quirks = __usb_detect_quirks(udev, usb_quirk_list); + +	/* +	 * Pixart-based mice would trigger remote wakeup issue on AMD +	 * Yangtze chipset, so set them as RESET_RESUME flag. +	 */ +	if (usb_amd_resume_quirk(udev)) +		udev->quirks |= __usb_detect_quirks(udev, +				usb_amd_resume_quirk_list); +  	if (udev->quirks)  		dev_dbg(&udev->dev, "USB quirks for this device: %x\n",  			udev->quirks); | 
