aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/udlfb.c
diff options
context:
space:
mode:
authorBernie Thompson <bernie@plugable.com>2011-07-10 03:30:00 -0400
committerPaul Mundt <lethal@linux-sh.org>2011-07-13 03:53:30 -0400
commitb63d10130e68aa6480cc1b2483d7c5ce57a05481 (patch)
tree18da62ff1f5a8797b75a91d9f3d74c6ae1ce71c7 /drivers/video/udlfb.c
parentc84c14224bbca6ec60d5851fcc87be0e34df2f44 (diff)
drivers/video/udlfb match class, subclass, and protocol
Match udlfb only against vendor-specific class (e.g. only DisplayLink graphics, not composite standard audio class interfaces). This enables compatibility with composite graphics+audio devices (e.g. HDMI). Match udlfb only against compatible subclass 0 and protocol 0 chips. DisplayLink's USB 3.0 generation chips increment these values to signal that they have a incompatible protocol, preventing udlfb from erroneously matching to hardware it does not support. Tested to confirm proper behavior on both USB 2.0 and USB 3.0 generation devices. Reported-by: Andrew Kephart <akephart@akephart.org> Signed-off-by: Bernie Thompson <bernie@plugable.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/video/udlfb.c')
-rw-r--r--drivers/video/udlfb.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/video/udlfb.c b/drivers/video/udlfb.c
index c6584c9f235..4e133754ba2 100644
--- a/drivers/video/udlfb.c
+++ b/drivers/video/udlfb.c
@@ -49,13 +49,22 @@ static const u32 udlfb_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST |
49 FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR; 49 FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR;
50 50
51/* 51/*
52 * There are many DisplayLink-based products, all with unique PIDs. We are able 52 * There are many DisplayLink-based graphics products, all with unique PIDs.
53 * to support all volume ones (circa 2009) with a single driver, so we match 53 * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
54 * globally on VID. TODO: Probe() needs to detect when we might be running 54 * We also require a match on SubClass (0x00) and Protocol (0x00),
55 * "future" chips, and bail on those, so a compatible driver can match. 55 * which is compatible with all known USB 2.0 era graphics chips and firmware,
56 * but allows DisplayLink to increment those for any future incompatible chips
56 */ 57 */
57static struct usb_device_id id_table[] = { 58static struct usb_device_id id_table[] = {
58 {.idVendor = 0x17e9, .match_flags = USB_DEVICE_ID_MATCH_VENDOR,}, 59 {.idVendor = 0x17e9,
60 .bInterfaceClass = 0xff,
61 .bInterfaceSubClass = 0x00,
62 .bInterfaceProtocol = 0x00,
63 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
64 USB_DEVICE_ID_MATCH_INT_CLASS |
65 USB_DEVICE_ID_MATCH_INT_SUBCLASS |
66 USB_DEVICE_ID_MATCH_INT_PROTOCOL,
67 },
59 {}, 68 {},
60}; 69};
61MODULE_DEVICE_TABLE(usb, id_table); 70MODULE_DEVICE_TABLE(usb, id_table);