2007-01-26 16:26:21 +03:00
/*
* USB device quirk handling logic and table
*
* Copyright ( c ) 2007 Oliver Neukum
* Copyright ( c ) 2007 Greg Kroah - Hartman < gregkh @ suse . de >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation , version 2.
*
*
*/
# include <linux/usb.h>
# include <linux/usb/quirks.h>
# include "usb.h"
/* List of quirky USB devices. Please keep this list ordered by:
* 1 ) Vendor ID
* 2 ) Product ID
* 3 ) Class ID
*
* as we want specific devices to be overridden first , and only after that , any
* class specific quirks .
*
* Right now the logic aborts if it finds a valid device in the table , we might
* want to change that in the future if it turns out that a whole class of
* devices is broken . . .
*/
static const struct usb_device_id usb_quirk_list [ ] = {
2007-09-04 18:11:41 +04:00
/* CBM - Flash disk */
{ USB_DEVICE ( 0x0204 , 0x6025 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2008-02-27 23:43:47 +03:00
2007-01-26 16:26:21 +03:00
/* HP 5300/5370C scanner */
2008-02-27 23:43:47 +03:00
{ USB_DEVICE ( 0x03f0 , 0x0701 ) , . driver_info =
USB_QUIRK_STRING_FETCH_255 } ,
2007-08-28 12:34:22 +04:00
2008-02-04 18:34:11 +03:00
/* Creative SB Audigy 2 NX */
{ USB_DEVICE ( 0x041e , 0x3020 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2010-07-22 02:05:01 +04:00
/* Logitech Harmony 700-series */
{ USB_DEVICE ( 0x046d , 0xc122 ) , . driver_info = USB_QUIRK_DELAY_INIT } ,
2008-02-27 23:43:47 +03:00
/* Philips PSC805 audio device */
{ USB_DEVICE ( 0x0471 , 0x0155 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2010-07-09 16:18:50 +04:00
/* Artisman Watchdog Dongle */
{ USB_DEVICE ( 0x04b4 , 0x0526 ) , . driver_info =
USB_QUIRK_CONFIG_INTF_STRINGS } ,
2011-02-05 23:52:00 +03:00
/* Samsung Android phone modem - ID conflict with SPH-I500 */
{ USB_DEVICE ( 0x04e8 , 0x6601 ) , . driver_info =
USB_QUIRK_CONFIG_INTF_STRINGS } ,
2008-02-04 18:34:11 +03:00
/* Roland SC-8820 */
{ USB_DEVICE ( 0x0582 , 0x0007 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
/* Edirol SD-20 */
{ USB_DEVICE ( 0x0582 , 0x0027 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2008-06-17 19:56:55 +04:00
/* appletouch */
{ USB_DEVICE ( 0x05ac , 0x021a ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2008-05-27 11:05:46 +04:00
/* Avision AV600U */
{ USB_DEVICE ( 0x0638 , 0x0a13 ) , . driver_info =
USB_QUIRK_STRING_FETCH_255 } ,
2009-03-18 21:28:53 +03:00
/* Saitek Cyborg Gold Joystick */
{ USB_DEVICE ( 0x06a3 , 0x0006 ) , . driver_info =
USB_QUIRK_CONFIG_INTF_STRINGS } ,
2007-09-04 19:15:08 +04:00
/* M-Systems Flash Disk Pioneers */
{ USB_DEVICE ( 0x08ec , 0x1000 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2011-02-17 18:26:38 +03:00
/* Keytouch QWERTY Panel keyboard */
{ USB_DEVICE ( 0x0926 , 0x3333 ) , . driver_info =
USB_QUIRK_CONFIG_INTF_STRINGS } ,
2008-03-11 17:20:12 +03:00
/* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
{ USB_DEVICE ( 0x0971 , 0x2000 ) , . driver_info = USB_QUIRK_NO_SET_INTF } ,
2010-07-14 20:26:22 +04:00
/* Broadcom BCM92035DGROM BT dongle */
{ USB_DEVICE ( 0x0a5c , 0x2021 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2008-02-27 23:43:47 +03:00
/* Action Semiconductor flash disk */
{ USB_DEVICE ( 0x10d6 , 0x2200 ) , . driver_info =
USB_QUIRK_STRING_FETCH_255 } ,
2007-06-20 01:16:10 +04:00
2007-09-04 19:15:08 +04:00
/* SKYMEDI USB_DRIVE */
{ USB_DEVICE ( 0x1516 , 0x8628 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2007-01-26 16:26:21 +03:00
2010-03-29 14:03:17 +04:00
/* BUILDWIN Photo Frame */
{ USB_DEVICE ( 0x1908 , 0x1315 ) , . driver_info =
USB_QUIRK_HONOR_BNUMINTERFACES } ,
2008-02-27 23:43:47 +03:00
/* INTEL VALUE SSD */
{ USB_DEVICE ( 0x8086 , 0xf1a5 ) , . driver_info = USB_QUIRK_RESET_RESUME } ,
2007-01-26 16:26:21 +03:00
{ } /* terminating entry must be last */
} ;
static const struct usb_device_id * find_id ( struct usb_device * udev )
{
const struct usb_device_id * id = usb_quirk_list ;
for ( ; id - > idVendor | | id - > bDeviceClass | | id - > bInterfaceClass | |
id - > driver_info ; id + + ) {
if ( usb_match_device ( udev , id ) )
return id ;
}
return NULL ;
}
/*
* Detect any quirks the device has , and do any housekeeping for it if needed .
*/
void usb_detect_quirks ( struct usb_device * udev )
{
const struct usb_device_id * id = usb_quirk_list ;
id = find_id ( udev ) ;
if ( id )
udev - > quirks = ( u32 ) ( id - > driver_info ) ;
if ( udev - > quirks )
dev_dbg ( & udev - > dev , " USB quirks for this device: %x \n " ,
udev - > quirks ) ;
2008-03-06 19:04:13 +03:00
/* For the present, all devices default to USB-PERSIST enabled */
#if 0 /* was: #ifdef CONFIG_PM */
2008-03-03 23:15:59 +03:00
/* Hubs are automatically enabled for USB-PERSIST */
if ( udev - > descriptor . bDeviceClass = = USB_CLASS_HUB )
udev - > persist_enabled = 1 ;
2008-03-06 19:04:13 +03:00
2008-03-03 23:15:59 +03:00
# else
2008-03-06 19:04:13 +03:00
/* In the absence of PM, we can safely enable USB-PERSIST
2008-03-03 23:15:59 +03:00
* for all devices . It will affect things like hub resets
* and EMF - related port disables .
*/
2009-12-18 14:14:21 +03:00
if ( ! ( udev - > quirks & USB_QUIRK_RESET_MORPHS ) )
udev - > persist_enabled = 1 ;
2008-03-03 23:15:59 +03:00
# endif /* CONFIG_PM */
2007-01-26 16:26:21 +03:00
}