summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/Kconfig28
-rw-r--r--drivers/hid/Makefile2
-rw-r--r--drivers/hid/hid-chicony.c7
-rw-r--r--drivers/hid/hid-core.c21
-rw-r--r--drivers/hid/hid-ids.h16
-rw-r--r--drivers/hid/hid-kye.c399
-rw-r--r--drivers/hid/hid-magicmouse.c2
-rw-r--r--drivers/hid/hid-multitouch.c5
-rw-r--r--drivers/hid/hid-saitek.c70
-rw-r--r--drivers/hid/hid-sjoy.c6
-rw-r--r--drivers/hid/hid-tivo.c90
-rw-r--r--drivers/hid/hid-uclogic.c413
-rw-r--r--drivers/hid/hid-wacom.c1
-rw-r--r--drivers/hid/hid-waltop.c881
-rw-r--r--drivers/hid/usbhid/hid-quirks.c3
15 files changed, 860 insertions, 1084 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 3890ac698061..a3d033252995 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -200,11 +200,14 @@ config HID_KEYTOUCH
 		- Keytouch IEC 60945
 
 config HID_KYE
-	tristate "Kye/Genius Ergo Mouse" if EXPERT
+	tristate "KYE/Genius devices"
 	depends on USB_HID
-	default !EXPERT
 	---help---
-	Support for Kye/Genius Ergo Mouse.
+	Support for KYE/Genius devices not fully compliant with HID standard:
+	- Ergo Mouse
+	- EasyPen i405X tablet
+	- MousePen i608X tablet
+	- EasyPen M610X tablet
 
 config HID_UCLOGIC
 	tristate "UC-Logic"
@@ -257,7 +260,9 @@ config HID_LOGITECH_DJ
 	---help---
 	Say Y if you want support for Logitech Unifying receivers and devices.
 	Unifying receivers are capable of pairing up to 6 Logitech compliant
-	devices to the same receiver.
+	devices to the same receiver. Without this driver it will be handled by
+	generic USB_HID driver and all incomming events will be multiplexed
+	into a single mouse and a single keyboard device.
 
 config LOGITECH_FF
 	bool "Logitech force feedback support"
@@ -485,6 +490,15 @@ config HID_ROCCAT
 	Say Y here if you have a Roccat mouse or keyboard and want
 	support for its special functionalities.
 
+config HID_SAITEK
+	tristate "Saitek non-fully HID-compliant devices"
+	depends on USB_HID
+	---help---
+	Support for Saitek devices that are not fully compliant with the
+	HID standard.
+
+	Currently only supports the PS1000 controller.
+
 config HID_SAMSUNG
 	tristate "Samsung InfraRed remote control or keyboards"
 	depends on USB_HID
@@ -549,6 +563,12 @@ config SMARTJOYPLUS_FF
 	Say Y here if you have a SmartJoy PLUS PS2/USB adapter and want to
 	enable force feedback support for it.
 
+config HID_TIVO
+	tristate "TiVo Slide Bluetooth remote control support"
+	depends on (USB_HID || BT_HIDP)
+	---help---
+	Say Y if you have a TiVo Slide Bluetooth remote control.
+
 config HID_TOPSEED
 	tristate "TopSeed Cyberlink, BTC Emprex, Conceptronic remote control support"
 	depends on USB_HID
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 7d926719e21b..22f1d16cd79c 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -67,6 +67,7 @@ obj-$(CONFIG_HID_PRIMAX)	+= hid-primax.o
 obj-$(CONFIG_HID_ROCCAT)	+= hid-roccat.o hid-roccat-common.o \
 	hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \
 	hid-roccat-koneplus.o hid-roccat-kovaplus.o hid-roccat-pyra.o
+obj-$(CONFIG_HID_SAITEK)	+= hid-saitek.o
 obj-$(CONFIG_HID_SAMSUNG)	+= hid-samsung.o
 obj-$(CONFIG_HID_SMARTJOYPLUS)	+= hid-sjoy.o
 obj-$(CONFIG_HID_SONY)		+= hid-sony.o
@@ -74,6 +75,7 @@ obj-$(CONFIG_HID_SPEEDLINK)	+= hid-speedlink.o
 obj-$(CONFIG_HID_SUNPLUS)	+= hid-sunplus.o
 obj-$(CONFIG_HID_GREENASIA)	+= hid-gaff.o
 obj-$(CONFIG_HID_THRUSTMASTER)	+= hid-tmff.o
+obj-$(CONFIG_HID_TIVO)		+= hid-tivo.o
 obj-$(CONFIG_HID_TOPSEED)	+= hid-topseed.o
 obj-$(CONFIG_HID_TWINHAN)	+= hid-twinhan.o
 obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c
index 8965ad93d510..b99af346fdff 100644
--- a/drivers/hid/hid-chicony.c
+++ b/drivers/hid/hid-chicony.c
@@ -45,6 +45,12 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
 	case 0xff09: ch_map_key_clear(BTN_9);	break;
 	case 0xff0a: ch_map_key_clear(BTN_A);	break;
 	case 0xff0b: ch_map_key_clear(BTN_B);	break;
+	case 0x00f1: ch_map_key_clear(KEY_WLAN);	break;
+	case 0x00f2: ch_map_key_clear(KEY_BRIGHTNESSDOWN);	break;
+	case 0x00f3: ch_map_key_clear(KEY_BRIGHTNESSUP);	break;
+	case 0x00f4: ch_map_key_clear(KEY_DISPLAY_OFF);	break;
+	case 0x00f7: ch_map_key_clear(KEY_CAMERA);	break;
+	case 0x00f8: ch_map_key_clear(KEY_PROG1);	break;
 	default:
 		return 0;
 	}
@@ -53,6 +59,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
 
 static const struct hid_device_id ch_devices[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
 	{ }
 };
 MODULE_DEVICE_TABLE(hid, ch_devices);
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 05a0c9a35bf2..f5d1ca8272c5 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -4,7 +4,7 @@
  *  Copyright (c) 1999 Andreas Gal
  *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
  *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
- *  Copyright (c) 2006-2010 Jiri Kosina
+ *  Copyright (c) 2006-2012 Jiri Kosina
  */
 
 /*
@@ -50,6 +50,10 @@ module_param_named(debug, hid_debug, int, 0600);
 MODULE_PARM_DESC(debug, "toggle HID debugging messages");
 EXPORT_SYMBOL_GPL(hid_debug);
 
+static int hid_ignore_special_drivers = 0;
+module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
+MODULE_PARM_DESC(debug, "Ignore any special drivers and handle all devices by generic driver");
+
 /*
  * Register a new report for a device.
  */
@@ -1395,6 +1399,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) },
@@ -1418,6 +1423,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
+	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL, USB_DEVICE_ID_GAMETEL_MT_MODE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
@@ -1436,6 +1442,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) },
@@ -1463,8 +1472,10 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G27_WHEEL) },
+#if IS_ENABLED(CONFIG_HID_LOGITECH_DJ)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) },
+#endif
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
@@ -1519,6 +1530,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
@@ -1538,6 +1550,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) },
+	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },
@@ -1551,6 +1565,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) },
@@ -1559,6 +1574,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_XAT, USB_DEVICE_ID_XAT_CSR) },
@@ -1674,7 +1691,7 @@ static int hid_bus_match(struct device *dev, struct device_driver *drv)
 		return 0;
 
 	/* generic wants all that don't have specialized driver */
-	if (!strncmp(hdrv->name, "generic-", 8))
+	if (!strncmp(hdrv->name, "generic-", 8) && !hid_ignore_special_drivers)
 		return !hid_match_id(hdev, hid_have_special_driver);
 
 	return 1;
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 55360fefee5b..3eb00902ca40 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -177,6 +177,7 @@
 #define USB_VENDOR_ID_CH		0x068e
 #define USB_DEVICE_ID_CH_PRO_THROTTLE	0x00f1
 #define USB_DEVICE_ID_CH_PRO_PEDALS	0x00f2
+#define USB_DEVICE_ID_CH_FIGHTERSTICK	0x00f3
 #define USB_DEVICE_ID_CH_COMBATSTICK	0x00f4
 #define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE       0x0051
 #define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE	0x00ff
@@ -194,6 +195,7 @@
 #define USB_DEVICE_ID_CHICONY_TACTICAL_PAD	0x0418
 #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH	0xb19d
 #define USB_DEVICE_ID_CHICONY_WIRELESS	0x0618
+#define USB_DEVICE_ID_CHICONY_WIRELESS2	0x1123
 
 #define USB_VENDOR_ID_CHUNGHWAT		0x2247
 #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH	0x0001
@@ -280,6 +282,9 @@
 #define USB_VENDOR_ID_EZKEY		0x0518
 #define USB_DEVICE_ID_BTC_8193		0x0002
 
+#define USB_VENDOR_ID_FRUCTEL	0x25B6
+#define USB_DEVICE_ID_GAMETEL_MT_MODE	0x0002
+
 #define USB_VENDOR_ID_GAMERON		0x0810
 #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR	0x0001
 #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR	0x0002
@@ -417,6 +422,9 @@
 #define USB_VENDOR_ID_KYE		0x0458
 #define USB_DEVICE_ID_KYE_ERGO_525V	0x0087
 #define USB_DEVICE_ID_KYE_GPEN_560	0x5003
+#define USB_DEVICE_ID_KYE_EASYPEN_I405X	0x5010
+#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X	0x5011
+#define USB_DEVICE_ID_KYE_EASYPEN_M610X	0x5013
 
 #define USB_VENDOR_ID_LABTEC		0x1020
 #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD	0x0006
@@ -629,6 +637,7 @@
 
 #define USB_VENDOR_ID_SAITEK		0x06a3
 #define USB_DEVICE_ID_SAITEK_RUMBLEPAD	0xff17
+#define USB_DEVICE_ID_SAITEK_PS1000	0x0621
 
 #define USB_VENDOR_ID_SAMSUNG		0x0419
 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE	0x0001
@@ -670,6 +679,10 @@
 
 #define USB_VENDOR_ID_THRUSTMASTER	0x044f
 
+#define USB_VENDOR_ID_TIVO		0x150a
+#define USB_DEVICE_ID_TIVO_SLIDE_BT	0x1200
+#define USB_DEVICE_ID_TIVO_SLIDE	0x1201
+
 #define USB_VENDOR_ID_TOPSEED		0x0766
 #define USB_DEVICE_ID_TOPSEED_CYBERLINK	0x0204
 
@@ -720,6 +733,8 @@
 #define USB_VENDOR_ID_WALTOP				0x172f
 #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH	0x0032
 #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH	0x0034
+#define USB_DEVICE_ID_WALTOP_Q_PAD			0x0037
+#define USB_DEVICE_ID_WALTOP_PID_0038			0x0038
 #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH	0x0501
 #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH	0x0500
 
@@ -728,6 +743,7 @@
 #define USB_DEVICE_ID_1_PHIDGETSERVO_20	0x8101
 #define USB_DEVICE_ID_4_PHIDGETSERVO_20	0x8104
 #define USB_DEVICE_ID_8_8_4_IF_KIT	0x8201
+#define USB_DEVICE_ID_SUPER_JOY_BOX_3	0x8888
 #define USB_DEVICE_ID_QUAD_USB_JOYPAD	0x8800
 #define USB_DEVICE_ID_DUAL_USB_JOYPAD	0x8866
 
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c
index f2ba9efc3a53..b4f0d8216fd0 100644
--- a/drivers/hid/hid-kye.c
+++ b/drivers/hid/hid-kye.c
@@ -3,6 +3,7 @@
  *
  *  Copyright (c) 2009 Jiri Kosina
  *  Copyright (c) 2009 Tomas Hanak
+ *  Copyright (c) 2012 Nikolai Kondrashov
  */
 
 /*
@@ -15,36 +16,399 @@
 #include <linux/device.h>
 #include <linux/hid.h>
 #include <linux/module.h>
+#include <linux/usb.h>
+#include "usbhid/usbhid.h"
 
 #include "hid-ids.h"
 
-/* the fixups that need to be done:
- *   - change led usage page to button for extra buttons
- *   - report size 8 count 1 must be size 1 count 8 for button bitfield
- *   - change the button usage range to 4-7 for the extra buttons
+/*
+ * See EasyPen i405X description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=KYE_EasyPen_i405X
  */
+
+/* Original EasyPen i405X report descriptor size */
+#define EASYPEN_I405X_RDESC_ORIG_SIZE	476
+
+/* Fixed EasyPen i405X report descriptor */
+static __u8 easypen_i405x_rdesc_fixed[] = {
+	0x06, 0x00, 0xFF, /*  Usage Page (FF00h),             */
+	0x09, 0x01,       /*  Usage (01h),                    */
+	0xA1, 0x01,       /*  Collection (Application),       */
+	0x85, 0x05,       /*    Report ID (5),                */
+	0x09, 0x01,       /*    Usage (01h),                  */
+	0x15, 0x80,       /*    Logical Minimum (-128),       */
+	0x25, 0x7F,       /*    Logical Maximum (127),        */
+	0x75, 0x08,       /*    Report Size (8),              */
+	0x95, 0x07,       /*    Report Count (7),             */
+	0xB1, 0x02,       /*    Feature (Variable),           */
+	0xC0,             /*  End Collection,                 */
+	0x05, 0x0D,       /*  Usage Page (Digitizer),         */
+	0x09, 0x02,       /*  Usage (Pen),                    */
+	0xA1, 0x01,       /*  Collection (Application),       */
+	0x85, 0x10,       /*    Report ID (16),               */
+	0x09, 0x20,       /*    Usage (Stylus),               */
+	0xA0,             /*    Collection (Physical),        */
+	0x14,             /*      Logical Minimum (0),        */
+	0x25, 0x01,       /*      Logical Maximum (1),        */
+	0x75, 0x01,       /*      Report Size (1),            */
+	0x09, 0x42,       /*      Usage (Tip Switch),         */
+	0x09, 0x44,       /*      Usage (Barrel Switch),      */
+	0x09, 0x46,       /*      Usage (Tablet Pick),        */
+	0x95, 0x03,       /*      Report Count (3),           */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x95, 0x04,       /*      Report Count (4),           */
+	0x81, 0x03,       /*      Input (Constant, Variable), */
+	0x09, 0x32,       /*      Usage (In Range),           */
+	0x95, 0x01,       /*      Report Count (1),           */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x75, 0x10,       /*      Report Size (16),           */
+	0x95, 0x01,       /*      Report Count (1),           */
+	0xA4,             /*      Push,                       */
+	0x05, 0x01,       /*      Usage Page (Desktop),       */
+	0x55, 0xFD,       /*      Unit Exponent (-3),         */
+	0x65, 0x13,       /*      Unit (Inch),                */
+	0x34,             /*      Physical Minimum (0),       */
+	0x09, 0x30,       /*      Usage (X),                  */
+	0x46, 0x7C, 0x15, /*      Physical Maximum (5500),    */
+	0x26, 0x00, 0x37, /*      Logical Maximum (14080),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x09, 0x31,       /*      Usage (Y),                  */
+	0x46, 0xA0, 0x0F, /*      Physical Maximum (4000),    */
+	0x26, 0x00, 0x28, /*      Logical Maximum (10240),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0xB4,             /*      Pop,                        */
+	0x09, 0x30,       /*      Usage (Tip Pressure),       */
+	0x26, 0xFF, 0x03, /*      Logical Maximum (1023),     */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0xC0,             /*    End Collection,               */
+	0xC0              /*  End Collection                  */
+};
+
+/*
+ * See MousePen i608X description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=KYE_MousePen_i608X
+ */
+
+/* Original MousePen i608X report descriptor size */
+#define MOUSEPEN_I608X_RDESC_ORIG_SIZE	476
+
+/* Fixed MousePen i608X report descriptor */
+static __u8 mousepen_i608x_rdesc_fixed[] = {
+	0x06, 0x00, 0xFF, /*  Usage Page (FF00h),             */
+	0x09, 0x01,       /*  Usage (01h),                    */
+	0xA1, 0x01,       /*  Collection (Application),       */
+	0x85, 0x05,       /*    Report ID (5),                */
+	0x09, 0x01,       /*    Usage (01h),                  */
+	0x15, 0x80,       /*    Logical Minimum (-128),       */
+	0x25, 0x7F,       /*    Logical Maximum (127),        */
+	0x75, 0x08,       /*    Report Size (8),              */
+	0x95, 0x07,       /*    Report Count (7),             */
+	0xB1, 0x02,       /*    Feature (Variable),           */
+	0xC0,             /*  End Collection,                 */
+	0x05, 0x0D,       /*  Usage Page (Digitizer),         */
+	0x09, 0x02,       /*  Usage (Pen),                    */
+	0xA1, 0x01,       /*  Collection (Application),       */
+	0x85, 0x10,       /*    Report ID (16),               */
+	0x09, 0x20,       /*    Usage (Stylus),               */
+	0xA0,             /*    Collection (Physical),        */
+	0x14,             /*      Logical Minimum (0),        */
+	0x25, 0x01,       /*      Logical Maximum (1),        */
+	0x75, 0x01,       /*      Report Size (1),            */
+	0x09, 0x42,       /*      Usage (Tip Switch),         */
+	0x09, 0x44,       /*      Usage (Barrel Switch),      */
+	0x09, 0x46,       /*      Usage (Tablet Pick),        */
+	0x95, 0x03,       /*      Report Count (3),           */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x95, 0x04,       /*      Report Count (4),           */
+	0x81, 0x03,       /*      Input (Constant, Variable), */
+	0x09, 0x32,       /*      Usage (In Range),           */
+	0x95, 0x01,       /*      Report Count (1),           */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x75, 0x10,       /*      Report Size (16),           */
+	0x95, 0x01,       /*      Report Count (1),           */
+	0xA4,             /*      Push,                       */
+	0x05, 0x01,       /*      Usage Page (Desktop),       */
+	0x55, 0xFD,       /*      Unit Exponent (-3),         */
+	0x65, 0x13,       /*      Unit (Inch),                */
+	0x34,             /*      Physical Minimum (0),       */
+	0x09, 0x30,       /*      Usage (X),                  */
+	0x46, 0x40, 0x1F, /*      Physical Maximum (8000),    */
+	0x26, 0x00, 0x50, /*      Logical Maximum (20480),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x09, 0x31,       /*      Usage (Y),                  */
+	0x46, 0x70, 0x17, /*      Physical Maximum (6000),    */
+	0x26, 0x00, 0x3C, /*      Logical Maximum (15360),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0xB4,             /*      Pop,                        */
+	0x09, 0x30,       /*      Usage (Tip Pressure),       */
+	0x26, 0xFF, 0x03, /*      Logical Maximum (1023),     */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0xC0,             /*    End Collection,               */
+	0xC0,             /*  End Collection,                 */
+	0x05, 0x01,       /*  Usage Page (Desktop),           */
+	0x09, 0x02,       /*  Usage (Mouse),                  */
+	0xA1, 0x01,       /*  Collection (Application),       */
+	0x85, 0x11,       /*    Report ID (17),               */
+	0x09, 0x01,       /*    Usage (Pointer),              */
+	0xA0,             /*    Collection (Physical),        */
+	0x14,             /*      Logical Minimum (0),        */
+	0xA4,             /*      Push,                       */
+	0x05, 0x09,       /*      Usage Page (Button),        */
+	0x75, 0x01,       /*      Report Size (1),            */
+	0x19, 0x01,       /*      Usage Minimum (01h),        */
+	0x29, 0x03,       /*      Usage Maximum (03h),        */
+	0x25, 0x01,       /*      Logical Maximum (1),        */
+	0x95, 0x03,       /*      Report Count (3),           */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x95, 0x05,       /*      Report Count (5),           */
+	0x81, 0x01,       /*      Input (Constant),           */
+	0xB4,             /*      Pop,                        */
+	0x95, 0x01,       /*      Report Count (1),           */
+	0xA4,             /*      Push,                       */
+	0x55, 0xFD,       /*      Unit Exponent (-3),         */
+	0x65, 0x13,       /*      Unit (Inch),                */
+	0x34,             /*      Physical Minimum (0),       */
+	0x75, 0x10,       /*      Report Size (16),           */
+	0x09, 0x30,       /*      Usage (X),                  */
+	0x46, 0x40, 0x1F, /*      Physical Maximum (8000),    */
+	0x26, 0x00, 0x50, /*      Logical Maximum (20480),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0x09, 0x31,       /*      Usage (Y),                  */
+	0x46, 0x70, 0x17, /*      Physical Maximum (6000),    */
+	0x26, 0x00, 0x3C, /*      Logical Maximum (15360),    */
+	0x81, 0x02,       /*      Input (Variable),           */
+	0xB4,             /*      Pop,                        */
+	0x75, 0x08,       /*      Report Size (8),            */
+	0x09, 0x38,       /*      Usage (Wheel),              */
+	0x15, 0xFF,       /*      Logical Minimum (-1),       */
+	0x25, 0x01,       /*      Logical Maximum (1),        */
+	0x81, 0x06,       /*      Input (Variable, Relative), */
+	0x81, 0x01,       /*      Input (Constant),           */
+	0xC0,             /*    End Collection,               */
+	0xC0              /*  End Collection                  */
+};
+
+/*
+ * See EasyPen M610X description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=KYE_EasyPen_M610X
+ */
+
+/* Original EasyPen M610X report descriptor size */
+#define EASYPEN_M610X_RDESC_ORIG_SIZE	476
+
+/* Fixed EasyPen M610X report descriptor */
+static __u8 easypen_m610x_rdesc_fixed[] = {
+	0x06, 0x00, 0xFF,             /*  Usage Page (FF00h),             */
+	0x09, 0x01,                   /*  Usage (01h),                    */
+	0xA1, 0x01,                   /*  Collection (Application),       */
+	0x85, 0x05,                   /*    Report ID (5),                */
+	0x09, 0x01,                   /*    Usage (01h),                  */
+	0x15, 0x80,                   /*    Logical Minimum (-128),       */
+	0x25, 0x7F,                   /*    Logical Maximum (127),        */
+	0x75, 0x08,                   /*    Report Size (8),              */
+	0x95, 0x07,                   /*    Report Count (7),             */
+	0xB1, 0x02,                   /*    Feature (Variable),           */
+	0xC0,                         /*  End Collection,                 */
+	0x05, 0x0D,                   /*  Usage Page (Digitizer),         */
+	0x09, 0x02,                   /*  Usage (Pen),                    */
+	0xA1, 0x01,                   /*  Collection (Application),       */
+	0x85, 0x10,                   /*    Report ID (16),               */
+	0x09, 0x20,                   /*    Usage (Stylus),               */
+	0xA0,                         /*    Collection (Physical),        */
+	0x14,                         /*      Logical Minimum (0),        */
+	0x25, 0x01,                   /*      Logical Maximum (1),        */
+	0x75, 0x01,                   /*      Report Size (1),            */
+	0x09, 0x42,                   /*      Usage (Tip Switch),         */
+	0x09, 0x44,                   /*      Usage (Barrel Switch),      */
+	0x09, 0x46,                   /*      Usage (Tablet Pick),        */
+	0x95, 0x03,                   /*      Report Count (3),           */
+	0x81, 0x02,                   /*      Input (Variable),           */
+	0x95, 0x04,                   /*      Report Count (4),           */
+	0x81, 0x03,                   /*      Input (Constant, Variable), */
+	0x09, 0x32,                   /*      Usage (In Range),           */
+	0x95, 0x01,                   /*      Report Count (1),           */
+	0x81, 0x02,                   /*      Input (Variable),           */
+	0x75, 0x10,                   /*      Report Size (16),           */
+	0x95, 0x01,                   /*      Report Count (1),           */
+	0xA4,                         /*      Push,                       */
+	0x05, 0x01,                   /*      Usage Page (Desktop),       */
+	0x55, 0xFD,                   /*      Unit Exponent (-3),         */
+	0x65, 0x13,                   /*      Unit (Inch),                */
+	0x34,                         /*      Physical Minimum (0),       */
+	0x09, 0x30,                   /*      Usage (X),                  */
+	0x46, 0x10, 0x27,             /*      Physical Maximum (10000),   */
+	0x27, 0x00, 0xA0, 0x00, 0x00, /*      Logical Maximum (40960),    */
+	0x81, 0x02,                   /*      Input (Variable),           */
+	0x09, 0x31,                   /*      Usage (Y),                  */
+	0x46, 0x6A, 0x18,             /*      Physical Maximum (6250),    */
+	0x26, 0x00, 0x64,             /*      Logical Maximum (25600),    */
+	0x81, 0x02,                   /*      Input (Variable),           */
+	0xB4,                         /*      Pop,                        */
+	0x09, 0x30,                   /*      Usage (Tip Pressure),       */
+	0x26, 0xFF, 0x03,             /*      Logical Maximum (1023),     */
+	0x81, 0x02,                   /*      Input (Variable),           */
+	0xC0,                         /*    End Collection,               */
+	0xC0,                         /*  End Collection,                 */
+	0x05, 0x0C,                   /*  Usage Page (Consumer),          */
+	0x09, 0x01,                   /*  Usage (Consumer Control),       */
+	0xA1, 0x01,                   /*  Collection (Application),       */
+	0x85, 0x12,                   /*    Report ID (18),               */
+	0x14,                         /*    Logical Minimum (0),          */
+	0x25, 0x01,                   /*    Logical Maximum (1),          */
+	0x75, 0x01,                   /*    Report Size (1),              */
+	0x95, 0x04,                   /*    Report Count (4),             */
+	0x0A, 0x1A, 0x02,             /*    Usage (AC Undo),              */
+	0x0A, 0x79, 0x02,             /*    Usage (AC Redo Or Repeat),    */
+	0x0A, 0x2D, 0x02,             /*    Usage (AC Zoom In),           */
+	0x0A, 0x2E, 0x02,             /*    Usage (AC Zoom Out),          */
+	0x81, 0x02,                   /*    Input (Variable),             */
+	0x95, 0x01,                   /*    Report Count (1),             */
+	0x75, 0x14,                   /*    Report Size (20),             */
+	0x81, 0x03,                   /*    Input (Constant, Variable),   */
+	0x75, 0x20,                   /*    Report Size (32),             */
+	0x81, 0x03,                   /*    Input (Constant, Variable),   */
+	0xC0                          /*  End Collection                  */
+};
+
 static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 		unsigned int *rsize)
 {
-	if (*rsize >= 74 &&
-		rdesc[61] == 0x05 && rdesc[62] == 0x08 &&
-		rdesc[63] == 0x19 && rdesc[64] == 0x08 &&
-		rdesc[65] == 0x29 && rdesc[66] == 0x0f &&
-		rdesc[71] == 0x75 && rdesc[72] == 0x08 &&
-		rdesc[73] == 0x95 && rdesc[74] == 0x01) {
-		hid_info(hdev,
-			 "fixing up Kye/Genius Ergo Mouse report descriptor\n");
-		rdesc[62] = 0x09;
-		rdesc[64] = 0x04;
-		rdesc[66] = 0x07;
-		rdesc[72] = 0x01;
-		rdesc[74] = 0x08;
+	switch (hdev->product) {
+	case USB_DEVICE_ID_KYE_ERGO_525V:
+		/* the fixups that need to be done:
+		 *   - change led usage page to button for extra buttons
+		 *   - report size 8 count 1 must be size 1 count 8 for button
+		 *     bitfield
+		 *   - change the button usage range to 4-7 for the extra
+		 *     buttons
+		 */
+		if (*rsize >= 74 &&
+			rdesc[61] == 0x05 && rdesc[62] == 0x08 &&
+			rdesc[63] == 0x19 && rdesc[64] == 0x08 &&
+			rdesc[65] == 0x29 && rdesc[66] == 0x0f &&
+			rdesc[71] == 0x75 && rdesc[72] == 0x08 &&
+			rdesc[73] == 0x95 && rdesc[74] == 0x01) {
+			hid_info(hdev,
+				 "fixing up Kye/Genius Ergo Mouse "
+				 "report descriptor\n");
+			rdesc[62] = 0x09;
+			rdesc[64] = 0x04;
+			rdesc[66] = 0x07;
+			rdesc[72] = 0x01;
+			rdesc[74] = 0x08;
+		}
+		break;
+	case USB_DEVICE_ID_KYE_EASYPEN_I405X:
+		if (*rsize == EASYPEN_I405X_RDESC_ORIG_SIZE) {
+			rdesc = easypen_i405x_rdesc_fixed;
+			*rsize = sizeof(easypen_i405x_rdesc_fixed);
+		}
+		break;
+	case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
+		if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) {
+			rdesc = mousepen_i608x_rdesc_fixed;
+			*rsize = sizeof(mousepen_i608x_rdesc_fixed);
+		}
+		break;
+	case USB_DEVICE_ID_KYE_EASYPEN_M610X:
+		if (*rsize == EASYPEN_M610X_RDESC_ORIG_SIZE) {
+			rdesc = easypen_m610x_rdesc_fixed;
+			*rsize = sizeof(easypen_m610x_rdesc_fixed);
+		}
+		break;
 	}
 	return rdesc;
 }
 
+/**
+ * Enable fully-functional tablet mode by setting a special feature report.
+ *
+ * @hdev:	HID device
+ *
+ * The specific report ID and data were discovered by sniffing the
+ * Windows driver traffic.
+ */
+static int kye_tablet_enable(struct hid_device *hdev)
+{
+	struct list_head *list;
+	struct list_head *head;
+	struct hid_report *report;
+	__s32 *value;
+
+	list = &hdev->report_enum[HID_FEATURE_REPORT].report_list;
+	list_for_each(head, list) {
+		report = list_entry(head, struct hid_report, list);
+		if (report->id == 5)
+			break;
+	}
+
+	if (head == list) {
+		hid_err(hdev, "tablet-enabling feature report not found\n");
+		return -ENODEV;
+	}
+
+	if (report->maxfield < 1 || report->field[0]->report_count < 7) {
+		hid_err(hdev, "invalid tablet-enabling feature report\n");
+		return -ENODEV;
+	}
+
+	value = report->field[0]->value;
+
+	value[0] = 0x12;
+	value[1] = 0x10;
+	value[2] = 0x11;
+	value[3] = 0x12;
+	value[4] = 0x00;
+	value[5] = 0x00;
+	value[6] = 0x00;
+	usbhid_submit_report(hdev, report, USB_DIR_OUT);
+
+	return 0;
+}
+
+static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
+{
+	int ret;
+
+	ret = hid_parse(hdev);
+	if (ret) {
+		hid_err(hdev, "parse failed\n");
+		goto err;
+	}
+
+	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+	if (ret) {
+		hid_err(hdev, "hw start failed\n");
+		goto err;
+	}
+
+	switch (id->product) {
+	case USB_DEVICE_ID_KYE_EASYPEN_I405X:
+	case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
+	case USB_DEVICE_ID_KYE_EASYPEN_M610X:
+		ret = kye_tablet_enable(hdev);
+		if (ret) {
+			hid_err(hdev, "tablet enabling failed\n");
+			goto enabling_err;
+		}
+		break;
+	}
+
+	return 0;
+enabling_err:
+	hid_hw_stop(hdev);
+err:
+	return ret;
+}
+
 static const struct hid_device_id kye_devices[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+				USB_DEVICE_ID_KYE_EASYPEN_I405X) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+				USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+				USB_DEVICE_ID_KYE_EASYPEN_M610X) },
 	{ }
 };
 MODULE_DEVICE_TABLE(hid, kye_devices);
@@ -52,6 +416,7 @@ MODULE_DEVICE_TABLE(hid, kye_devices);
 static struct hid_driver kye_driver = {
 	.name = "kye",
 	.id_table = kye_devices,
+	.probe = kye_probe,
 	.report_fixup = kye_report_fixup,
 };
 
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index 2ab71758e2e2..7cf3ffe4b7bc 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -418,6 +418,8 @@ static void magicmouse_setup_input(struct input_dev *input, struct hid_device *h
 		__set_bit(BTN_TOOL_TRIPLETAP, input->keybit);
 		__set_bit(BTN_TOOL_QUADTAP, input->keybit);
 		__set_bit(BTN_TOUCH, input->keybit);
+		__set_bit(INPUT_PROP_POINTER, input->propbit);
+		__set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
 	}
 
 	if (report_touches) {
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 6fb46d70f39d..1d5b94167b52 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -837,6 +837,11 @@ static const struct hid_device_id mt_devices[] = {
 		HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
 			USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
 
+	/* Gametel game controller */
+	{ .driver_data = MT_CLS_DEFAULT,
+		HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL,
+			USB_DEVICE_ID_GAMETEL_MT_MODE) },
+
 	/* GoodTouch panels */
 	{ .driver_data = MT_CLS_DEFAULT,
 		HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
diff --git a/drivers/hid/hid-saitek.c b/drivers/hid/hid-saitek.c
new file mode 100644
index 000000000000..45aea77bb611
--- /dev/null
+++ b/drivers/hid/hid-saitek.c
@@ -0,0 +1,70 @@
+/*
+ *  HID driver for Saitek devices, currently only the PS1000 (USB gamepad).
+ *  Fixes the HID report descriptor by removing a non-existent axis and
+ *  clearing the constant bit on the input reports for buttons and d-pad.
+ *  (This module is based on "hid-ortek".)
+ *
+ *  Copyright (c) 2012 Andreas Hübner
+ */
+
+/*
+ * 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; either version 2 of the License, or (at your option)
+ * any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+
+#include "hid-ids.h"
+
+static __u8 *saitek_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+		unsigned int *rsize)
+{
+	if (*rsize == 137 && rdesc[20] == 0x09 && rdesc[21] == 0x33
+			&& rdesc[94] == 0x81 && rdesc[95] == 0x03
+			&& rdesc[110] == 0x81 && rdesc[111] == 0x03) {
+
+		hid_info(hdev, "Fixing up Saitek PS1000 report descriptor\n");
+
+		/* convert spurious axis to a "noop" Logical Minimum (0) */
+		rdesc[20] = 0x15;
+		rdesc[21] = 0x00;
+
+		/* clear constant bit on buttons and d-pad */
+		rdesc[95] = 0x02;
+		rdesc[111] = 0x02;
+
+	}
+	return rdesc;
+}
+
+static const struct hid_device_id saitek_devices[] = {
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000)},
+	{ }
+};
+
+MODULE_DEVICE_TABLE(hid, saitek_devices);
+
+static struct hid_driver saitek_driver = {
+	.name = "saitek",
+	.id_table = saitek_devices,
+	.report_fixup = saitek_report_fixup
+};
+
+static int __init saitek_init(void)
+{
+	return hid_register_driver(&saitek_driver);
+}
+
+static void __exit saitek_exit(void)
+{
+	hid_unregister_driver(&saitek_driver);
+}
+
+module_init(saitek_init);
+module_exit(saitek_exit);
+MODULE_LICENSE("GPL");
diff --git a/drivers/hid/hid-sjoy.c b/drivers/hid/hid-sjoy.c
index 4b1448613ea6..42257acfeb73 100644
--- a/drivers/hid/hid-sjoy.c
+++ b/drivers/hid/hid-sjoy.c
@@ -155,7 +155,8 @@ err:
 }
 
 static const struct hid_device_id sjoy_devices[] = {
-	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO),
+		.driver_data = HID_QUIRK_NOGET },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO),
 		.driver_data = HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET |
 			       HID_QUIRK_SKIP_OUTPUT_REPORTS },
@@ -163,8 +164,9 @@ static const struct hid_device_id sjoy_devices[] = {
 		.driver_data = HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET |
 			       HID_QUIRK_SKIP_OUTPUT_REPORTS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD),
-		.driver_data = HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET |
+		.driver_data = HID_QUIRK_MULTI_INPUT |
 			       HID_QUIRK_SKIP_OUTPUT_REPORTS },
 	{ }
 };
diff --git a/drivers/hid/hid-tivo.c b/drivers/hid/hid-tivo.c
new file mode 100644
index 000000000000..de47039c708c
--- /dev/null
+++ b/drivers/hid/hid-tivo.c
@@ -0,0 +1,90 @@
+/*
+ *  HID driver for TiVo Slide Bluetooth remote
+ *
+ *  Copyright (c) 2011 Jarod Wilson <jarod@redhat.com>
+ *  based on the hid-topseed driver, which is in turn, based on hid-cherry...
+ */
+
+/*
+ * 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; either version 2 of the License, or (at your option)
+ * any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/module.h>
+
+#include "hid-ids.h"
+
+#define HID_UP_TIVOVENDOR	0xffff0000
+#define tivo_map_key_clear(c)	hid_map_usage_clear(hi, usage, bit, max, \
+					EV_KEY, (c))
+
+static int tivo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+		struct hid_field *field, struct hid_usage *usage,
+		unsigned long **bit, int *max)
+{
+	switch (usage->hid & HID_USAGE_PAGE) {
+	case HID_UP_TIVOVENDOR:
+		switch (usage->hid & HID_USAGE) {
+		/* TiVo button */
+		case 0x3d: tivo_map_key_clear(KEY_MEDIA);	break;
+		/* Live TV */
+		case 0x3e: tivo_map_key_clear(KEY_TV);		break;
+		/* Red thumbs down */
+		case 0x41: tivo_map_key_clear(KEY_KPMINUS);	break;
+		/* Green thumbs up */
+		case 0x42: tivo_map_key_clear(KEY_KPPLUS);	break;
+		default:
+			return 0;
+		}
+		break;
+	case HID_UP_CONSUMER:
+		switch (usage->hid & HID_USAGE) {
+		/* Enter/Last (default mapping: KEY_LAST) */
+		case 0x083: tivo_map_key_clear(KEY_ENTER);	break;
+		/* Info (default mapping: KEY_PROPS) */
+		case 0x209: tivo_map_key_clear(KEY_INFO);	break;
+		default:
+			return 0;
+		}
+		break;
+	default:
+		return 0;
+	}
+
+	/* This means we found a matching mapping here, else, look in the
+	 * standard hid mappings in hid-input.c */
+	return 1;
+}
+
+static const struct hid_device_id tivo_devices[] = {
+	/* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */
+	{ HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
+	{ }
+};
+MODULE_DEVICE_TABLE(hid, tivo_devices);
+
+static struct hid_driver tivo_driver = {
+	.name = "tivo_slide",
+	.id_table = tivo_devices,
+	.input_mapping = tivo_input_mapping,
+};
+
+static int __init tivo_init(void)
+{
+	return hid_register_driver(&tivo_driver);
+}
+
+static void __exit tivo_exit(void)
+{
+	hid_unregister_driver(&tivo_driver);
+}
+
+module_init(tivo_init);
+module_exit(tivo_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
diff --git a/drivers/hid/hid-uclogic.c b/drivers/hid/hid-uclogic.c
index e15732f1a22d..1f1128910337 100644
--- a/drivers/hid/hid-uclogic.c
+++ b/drivers/hid/hid-uclogic.c
@@ -18,141 +18,16 @@
 #include "hid-ids.h"
 
 /*
- * The original descriptors of WPXXXXU tablets have three report IDs, of
- * which only two are used (8 and 9), and the remaining (7) seems to have
- * the originally intended pen description which was abandoned for some
- * reason.  From this unused description it is possible to extract the
- * actual physical extents and resolution. All the models use the same
- * descriptor with different extents for the unused report ID.
- *
- * Here it is:
- *
- *  Usage Page (Digitizer),         ; Digitizer (0Dh)
- *  Usage (Pen),                    ; Pen (02h, application collection)
- *  Collection (Application),
- *    Report ID (7),
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (Tip Switch),         ; Tip switch (42h, momentary control)
- *      Usage (Barrel Switch),      ; Barrel switch (44h, momentary control)
- *      Usage (Eraser),             ; Eraser (45h, momentary control)
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (3),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage (In Range),           ; In range (32h, momentary control)
- *      Report Count (1),
- *      Input (Variable),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Physical Minimum (0),
- *      Physical Maximum (Xpm),
- *      Logical Maximum (Xlm),
- *      Input (Variable),
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Physical Maximum (Ypm),
- *      Logical Maximum (Ylm),
- *      Input (Variable),
- *      Pop,
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Input (Variable),
- *      Report Size (16),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (8),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (5),
- *      Input (Constant),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Usage (Wheel),              ; Wheel (38h, dynamic value)
- *      Usage (00h),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (4),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (9),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (5),
- *      Input (Constant),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (32767),
- *      Physical Minimum (0),
- *      Physical Maximum (32767),
- *      Report Count (2),
- *      Report Size (16),
- *      Input (Variable),
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Report Count (1),
- *      Report Size (16),
- *      Input (Variable),
- *    End Collection,
- *  End Collection
- *
- * Here are the extents values for the WPXXXXU models:
- *
- *              Xpm     Xlm     Ypm     Ylm
- *  WP4030U     4000    8000    3000    6000
- *  WP5540U     5500    11000   4000    8000
- *  WP8060U     8000    16000   6000    12000
- *
- * This suggests that all of them have 2000 LPI resolution, as advertised.
+ * See WPXXXXU model descriptions, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP4030U
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP5540U
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP8060U
  */
 
 /* Size of the original descriptor of WPXXXXU tablets */
 #define WPXXXXU_RDESC_ORIG_SIZE	212
 
-/*
- * Fixed WP4030U report descriptor.
- * Although the hardware might actually support it, the mouse description
- * has been removed, since there seems to be no devices having one and it
- * wouldn't make much sense because of the working area size.
- */
+/* Fixed WP4030U report descriptor */
 static __u8 wp4030u_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -343,148 +218,14 @@ static __u8 wp8060u_rdesc_fixed[] = {
 };
 
 /*
- * Original WP1062 report descriptor.
- *
- * Only report ID 9 is actually used.
- *
- *  Usage Page (Digitizer),         ; Digitizer (0Dh)
- *  Usage (Pen),                    ; Pen (02h, application collection)
- *  Collection (Application),
- *    Report ID (7),
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (Tip Switch),         ; Tip switch (42h, momentary control)
- *      Usage (Barrel Switch),      ; Barrel switch (44h, momentary control)
- *      Usage (Eraser),             ; Eraser (45h, momentary control)
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (3),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage (In Range),           ; In range (32h, momentary control)
- *      Report Count (1),
- *      Input (Variable),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch),
- *      Physical Minimum (0),
- *      Physical Maximum (10000),
- *      Logical Maximum (20000),
- *      Input (Variable),
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Physical Maximum (6583),
- *      Logical Maximum (13166),
- *      Input (Variable),
- *      Pop,
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Input (Variable),
- *      Report Size (16),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (8),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (5),
- *      Input (Constant),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Usage (Wheel),              ; Wheel (38h, dynamic value)
- *      Usage (00h),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (4),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (9),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (4),
- *      Input (Constant),
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (In Range),           ; In range (32h, momentary control)
- *      Report Count (1),
- *      Input (Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch),
- *      Physical Minimum (0),
- *      Physical Maximum (10000),
- *      Logical Maximum (20000),
- *      Input (Variable),
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Physical Maximum (6583),
- *      Logical Maximum (13166),
- *      Input (Variable),
- *      Pop,
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Report Count (1),
- *      Report Size (16),
- *      Input (Variable),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (00h),
- *  Collection (Application),
- *    Report ID (4),
- *    Logical Minimum (0),
- *    Logical Maximum (255),
- *    Usage (00h),
- *    Report Size (8),
- *    Report Count (3),
- *    Feature (Variable),
- *  End Collection
+ * See WP1062 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP1062
  */
 
 /* Size of the original descriptor of WP1062 tablet */
 #define WP1062_RDESC_ORIG_SIZE	254
 
-/*
- * Fixed WP1062 report descriptor.
- *
- * Removed unused reports, corrected second barrel button usage code, physical
- * units.
- */
+/* Fixed WP1062 report descriptor */
 static __u8 wp1062_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -530,146 +271,14 @@ static __u8 wp1062_rdesc_fixed[] = {
 };
 
 /*
- * Original PF1209 report descriptor.
- *
- * The descriptor is similar to WPXXXXU descriptors, with an addition of a
- * feature report (ID 4) of unknown purpose.
- *
- * Although the advertised resolution is 4000 LPI the unused report ID
- * (taken from WPXXXXU, it seems) states 2000 LPI, but it is probably
- * incorrect and is a result of blind copying without understanding. Anyway
- * the real logical extents are always scaled to 0..32767, which IMHO spoils
- * the precision.
- *
- *  Usage Page (Digitizer),         ; Digitizer (0Dh)
- *  Usage (Pen),                    ; Pen (02h, application collection)
- *  Collection (Application),
- *    Report ID (7),
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (Tip Switch),         ; Tip switch (42h, momentary control)
- *      Usage (Barrel Switch),      ; Barrel switch (44h, momentary control)
- *      Usage (Eraser),             ; Eraser (45h, momentary control)
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (3),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage (In Range),           ; In range (32h, momentary control)
- *      Report Count (1),
- *      Input (Variable),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Physical Minimum (0),
- *      Physical Maximum (12000),
- *      Logical Maximum (24000),
- *      Input (Variable),
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Physical Maximum (9000),
- *      Logical Maximum (18000),
- *      Input (Variable),
- *      Pop,
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Input (Variable),
- *      Report Size (16),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (8),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (5),
- *      Input (Constant),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Usage (Wheel),              ; Wheel (38h, dynamic value)
- *      Usage (00h),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (4),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (9),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (03h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Count (3),
- *      Report Size (1),
- *      Input (Variable),
- *      Report Count (5),
- *      Input (Constant),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (32767),
- *      Physical Minimum (0),
- *      Physical Maximum (32767),
- *      Report Count (2),
- *      Report Size (16),
- *      Input (Variable),
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Maximum (1023),
- *      Report Count (1),
- *      Report Size (16),
- *      Input (Variable),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (00h),
- *  Collection (Application),
- *    Report ID (4),
- *    Logical Minimum (0),
- *    Logical Maximum (255),
- *    Usage (00h),
- *    Report Size (8),
- *    Report Count (3),
- *    Feature (Variable),
- *  End Collection
+ * See PF1209 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_PF1209
  */
 
 /* Size of the original descriptor of PF1209 tablet */
 #define PF1209_RDESC_ORIG_SIZE	234
 
-/*
- * Fixed PF1209 report descriptor
- *
- * The descriptor is fixed similarly to WP5540U and WP8060U, plus the
- * feature report is removed, because its purpose is unknown and it is of no
- * use to the generic HID driver anyway for now.
- */
+/* Fixed PF1209 report descriptor */
 static __u8 pf1209_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c
index 694545d5bfea..067e2963314c 100644
--- a/drivers/hid/hid-wacom.c
+++ b/drivers/hid/hid-wacom.c
@@ -590,6 +590,7 @@ static int wacom_probe(struct hid_device *hdev,
 		wacom_poke(hdev, 1);
 		break;
 	case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH:
+		sprintf(hdev->name, "%s", "Wacom Intuos4 WL");
 		wdata->features = 0;
 		wacom_set_features(hdev);
 		break;
diff --git a/drivers/hid/hid-waltop.c b/drivers/hid/hid-waltop.c
index b3a4163f2e67..2cfd95c4467b 100644
--- a/drivers/hid/hid-waltop.c
+++ b/drivers/hid/hid-waltop.c
@@ -43,139 +43,14 @@
  */
 
 /*
- * Original Slim Tablet 5.8 inch report descriptor.
- *
- * All the reports except the report with ID 16 (the stylus) are unused,
- * possibly because the tablet is not configured to, or because they were
- * just copied from a more capable model. The full purpose of features
- * described for report ID 2 is unknown.
- *
- * The stylus buttons are described as three bit fields, whereas actually
- * it's an "array", i.e. they're reported as button numbers (1, 2 and 3).
- * The "eraser" field is not used. There is also a "push" without a "pop" in
- * the stylus description.
- *
- *  Usage Page (Desktop),           ; Generic desktop controls (01h)
- *  Usage (Mouse),                  ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (1),
- *    Usage (Pointer),              ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),        ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (05h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Size (3),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Usage (Wheel),              ; Wheel (38h, dynamic value)
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Digitizer),         ; Digitizer (0Dh)
- *  Usage (Pen),                    ; Pen (02h, application collection)
- *  Collection (Application),
- *    Report ID (2),
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *      Usage (Azimuth),            ; Azimuth (3Fh, dynamic value)
- *      Usage (Altitude),           ; Altitude (40h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (2),
- *      Feature (Variable),
- *    End Collection,
- *    Report ID (5),
- *    Usage Page (Digitizer),       ; Digitizer (0Dh)
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (10),
- *    Usage Page (Digitizer),       ; Digitizer (0Dh)
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (16),
- *    Usage (Stylus),               ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (Tip Switch),         ; Tip switch (42h, momentary control)
- *      Usage (Barrel Switch),      ; Barrel switch (44h, momentary control)
- *      Usage (Invert),             ; Invert (3Ch, momentary control)
- *      Usage (Eraser),             ; Eraser (45h, momentary control)
- *      Usage (In Range),           ; In range (32h, momentary control)
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),       ; Generic desktop controls (01h)
- *      Usage (X),                  ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Logical Minimum (0),
- *      Logical Maximum (10000),
- *      Physical Minimum (0),
- *      Physical Maximum (10000),
- *      Input (Variable),
- *      Usage (Y),                  ; Y (31h, dynamic value)
- *      Logical Maximum (6000),
- *      Physical Maximum (6000),
- *      Input (Variable),
- *      Usage Page (Digitizer),     ; Digitizer (0Dh)
- *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (1023),
- *      Physical Minimum (0),
- *      Physical Maximum (1023),
- *      Input (Variable),
- *    End Collection,
- *  End Collection
+ * See Slim Tablet 5.8 inch description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_Slim_Tablet_5.8%22
  */
 
 /* Size of the original report descriptor of Slim Tablet 5.8 inch */
 #define SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE	222
 
-/*
- * Fixed Slim Tablet 5.8 inch descriptor.
- *
- * All the reports except the stylus report (ID 16) were removed as unused.
- * The stylus buttons description was fixed.
- */
+/* Fixed Slim Tablet 5.8 inch descriptor */
 static __u8 slim_tablet_5_8_inch_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -224,158 +99,14 @@ static __u8 slim_tablet_5_8_inch_rdesc_fixed[] = {
 };
 
 /*
- * Original Slim Tablet 12.1 inch report descriptor.
- *
- * The descriptor is similar to the Slim Tablet 5.8 inch descriptor with the
- * addition of a keyboard report, seemingly unused. It may have get here
- * from a Media Tablet - probably an unimplemented feature.
- *
- *  Usage Page (Desktop),             ; Generic desktop controls (01h)
- *  Usage (Mouse),                    ; Mouse (02h, application collection)
- *  Collection (Application),
- *    Report ID (1),
- *    Usage (Pointer),                ; Pointer (01h, physical collection)
- *    Collection (Physical),
- *      Usage Page (Button),          ; Button (09h)
- *      Usage Minimum (01h),
- *      Usage Maximum (05h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Size (3),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),         ; Generic desktop controls (01h)
- *      Usage (X),                    ; X (30h, dynamic value)
- *      Usage (Y),                    ; Y (31h, dynamic value)
- *      Usage (Wheel),                ; Wheel (38h, dynamic value)
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Digitizer),           ; Digitizer (0Dh)
- *  Usage (Pen),                      ; Pen (02h, application collection)
- *  Collection (Application),
- *    Report ID (2),
- *    Usage (Stylus),                 ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *      Usage (Azimuth),              ; Azimuth (3Fh, dynamic value)
- *      Usage (Altitude),             ; Altitude (40h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (2),
- *      Feature (Variable),
- *    End Collection,
- *    Report ID (5),
- *    Usage Page (Digitizer),         ; Digitizer (0Dh)
- *    Usage (Stylus),                 ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (10),
- *    Usage Page (Digitizer),         ; Digitizer (0Dh)
- *    Usage (Stylus),                 ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (16),
- *    Usage (Stylus),                 ; Stylus (20h, logical collection)
- *    Collection (Physical),
- *      Usage (Tip Switch),           ; Tip switch (42h, momentary control)
- *      Usage (Barrel Switch),        ; Barrel switch (44h, momentary control)
- *      Usage (Invert),               ; Invert (3Ch, momentary control)
- *      Usage (Eraser),               ; Eraser (45h, momentary control)
- *      Usage (In Range),             ; In range (32h, momentary control)
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),         ; Generic desktop controls (01h)
- *      Usage (X),                    ; X (30h, dynamic value)
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Logical Minimum (0),
- *      Logical Maximum (20000),
- *      Physical Minimum (0),
- *      Physical Maximum (20000),
- *      Input (Variable),
- *      Usage (Y),                    ; Y (31h, dynamic value)
- *      Logical Maximum (12500),
- *      Physical Maximum (12500),
- *      Input (Variable),
- *      Usage Page (Digitizer),       ; Digitizer (0Dh)
- *      Usage (Tip Pressure),         ; Tip pressure (30h, dynamic value)
- *      Logical Minimum (0),
- *      Logical Maximum (1023),
- *      Physical Minimum (0),
- *      Physical Maximum (1023),
- *      Input (Variable),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),             ; Generic desktop controls (01h)
- *  Usage (Keyboard),                 ; Keyboard (06h, application collection)
- *  Collection (Application),
- *    Report ID (13),
- *    Usage Page (Keyboard),          ; Keyboard/keypad (07h)
- *    Usage Minimum (KB Leftcontrol), ; Keyboard left control
- *                                    ; (E0h, dynamic value)
- *    Usage Maximum (KB Right GUI),   ; Keyboard right GUI (E7h, dynamic value)
- *    Logical Minimum (0),
- *    Logical Maximum (1),
- *    Report Size (1),
- *    Report Count (8),
- *    Input (Variable),
- *    Report Size (8),
- *    Report Count (1),
- *    Input (Constant),
- *    Usage Page (Keyboard),          ; Keyboard/keypad (07h)
- *    Usage Minimum (None),           ; No event (00h, selector)
- *    Usage Maximum (KB Application), ; Keyboard Application (65h, selector)
- *    Logical Minimum (0),
- *    Logical Maximum (101),
- *    Report Size (8),
- *    Report Count (5),
- *    Input,
- *  End Collection
+ * See Slim Tablet 12.1 inch description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_Slim_Tablet_12.1%22
  */
 
 /* Size of the original report descriptor of Slim Tablet 12.1 inch */
 #define SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE	269
 
-/*
- * Fixed Slim Tablet 12.1 inch descriptor.
- *
- * All the reports except the stylus report (ID 16) were removed as unused.
- * The stylus buttons description was fixed.
- */
+/* Fixed Slim Tablet 12.1 inch descriptor */
 static __u8 slim_tablet_12_1_inch_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -424,217 +155,128 @@ static __u8 slim_tablet_12_1_inch_rdesc_fixed[] = {
 };
 
 /*
- * Original Media Tablet 10.6 inch report descriptor.
- *
- * There are at least two versions of this model in the wild. They are
- * represented by Genius G-Pen M609 (older version) and Genius G-Pen M609X
- * (newer version).
- *
- * Both versions have the usual pen with two barrel buttons and two
- * identical wheels with center buttons in the top corners of the tablet
- * base. They also have buttons on the top, between the wheels, for
- * selecting the wheels' functions and wide/standard mode. In the wide mode
- * the whole working surface is sensed, in the standard mode a narrower area
- * is sensed, but the logical report extents remain the same. These modes
- * correspond roughly to 16:9 and 4:3 aspect ratios respectively.
- *
- * The older version has three wheel function buttons ("scroll", "zoom" and
- * "volume") and two separate buttons for wide and standard mode. The newer
- * version has four wheel function buttons (plus "brush") and only one
- * button is used for selecting wide/standard mode. So, the total number of
- * buttons remains the same, but one of the mode buttons is repurposed as a
- * wheels' function button in the newer version.
- *
- * The wheel functions are:
- * scroll   - the wheels act as scroll wheels, the center buttons switch
- *            between vertical and horizontal scrolling;
- * zoom     - the wheels zoom in/out, the buttons supposedly reset to 100%;
- * volume   - the wheels control the sound volume, the buttons mute;
- * brush    - the wheels are supposed to control brush width in a graphics
- *            editor, the buttons do nothing.
- *
- * Below is the newer version's report descriptor. It may very well be that
- * the older version's descriptor is different and thus it won't be
- * supported.
- *
- * The mouse report (ID 1) only uses the wheel field for reporting the tablet
- * wheels' scroll mode. The keyboard report (ID 13) is used to report the
- * wheels' zoom and brush control functions as key presses. The report ID 12
- * is used to report the wheels' volume control functions. The stylus report
- * (ID 16) has the same problems as the Slim Tablet 5.8 inch report has.
- *
- * The rest of the reports are unused, at least in the default configuration.
- * The purpose of the features is unknown.
- *
- *  Usage Page (Desktop),
- *  Usage (Mouse),
- *  Collection (Application),
- *    Report ID (1),
- *    Usage (Pointer),
- *    Collection (Physical),
- *      Usage Page (Button),
- *      Usage Minimum (01h),
- *      Usage Maximum (05h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Size (3),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),
- *      Usage (X),
- *      Usage (Y),
- *      Usage (Wheel),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Digitizer),
- *  Usage (Pen),
- *  Collection (Application),
- *    Report ID (2),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *      Usage (Azimuth),
- *      Usage (Altitude),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (2),
- *      Feature (Variable),
- *    End Collection,
- *    Report ID (5),
- *    Usage Page (Digitizer),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (10),
- *    Usage Page (Digitizer),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (16),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (Tip Switch),
- *      Usage (Barrel Switch),
- *      Usage (Invert),
- *      Usage (Eraser),
- *      Usage (In Range),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),
- *      Usage (X),
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Logical Minimum (0),
- *      Logical Maximum (18000),
- *      Physical Minimum (0),
- *      Physical Maximum (18000),
- *      Input (Variable),
- *      Usage (Y),
- *      Logical Maximum (11000),
- *      Physical Maximum (11000),
- *      Input (Variable),
- *      Usage Page (Digitizer),
- *      Usage (Tip Pressure),
- *      Logical Minimum (0),
- *      Logical Maximum (1023),
- *      Physical Minimum (0),
- *      Physical Maximum (1023),
- *      Input (Variable),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),
- *  Usage (Keyboard),
- *  Collection (Application),
- *    Report ID (13),
- *    Usage Page (Keyboard),
- *    Usage Minimum (KB Leftcontrol),
- *    Usage Maximum (KB Right GUI),
- *    Logical Minimum (0),
- *    Logical Maximum (1),
- *    Report Size (1),
- *    Report Count (8),
- *    Input (Variable),
- *    Report Size (8),
- *    Report Count (1),
- *    Input (Constant),
- *    Usage Page (Keyboard),
- *    Usage Minimum (None),
- *    Usage Maximum (KB Application),
- *    Logical Minimum (0),
- *    Logical Maximum (101),
- *    Report Size (8),
- *    Report Count (5),
- *    Input,
- *  End Collection,
- *  Usage Page (Consumer),
- *  Usage (Consumer Control),
- *  Collection (Application),
- *    Report ID (12),
- *    Usage (Volume Inc),
- *    Usage (Volume Dec),
- *    Usage (Mute),
- *    Logical Minimum (0),
- *    Logical Maximum (1),
- *    Report Size (1),
- *    Report Count (3),
- *    Input (Variable, Relative),
- *    Report Size (5),
- *    Report Count (1),
- *    Input (Constant, Variable, Relative),
- *  End Collection
+ * See Q Pad description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_Q_Pad
  */
 
-/* Size of the original report descriptor of Media Tablet 10.6 inch */
-#define MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE	300
+/* Size of the original report descriptor of Q Pad */
+#define Q_PAD_RDESC_ORIG_SIZE	241
+
+/* Fixed Q Pad descriptor */
+static __u8 q_pad_rdesc_fixed[] = {
+	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
+	0x09, 0x02,         /*  Usage (Pen),                        */
+	0xA1, 0x01,         /*  Collection (Application),           */
+	0x85, 0x10,         /*      Report ID (16),                 */
+	0x09, 0x20,         /*      Usage (Stylus),                 */
+	0xA0,               /*      Collection (Physical),          */
+	0x09, 0x42,         /*          Usage (Tip Switch),         */
+	0x09, 0x44,         /*          Usage (Barrel Switch),      */
+	0x09, 0x46,         /*          Usage (Tablet Pick),        */
+	0x15, 0x01,         /*          Logical Minimum (1),        */
+	0x25, 0x03,         /*          Logical Maximum (3),        */
+	0x75, 0x04,         /*          Report Size (4),            */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x80,               /*          Input,                      */
+	0x09, 0x32,         /*          Usage (In Range),           */
+	0x14,               /*          Logical Minimum (0),        */
+	0x25, 0x01,         /*          Logical Maximum (1),        */
+	0x75, 0x01,         /*          Report Size (1),            */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0x95, 0x03,         /*          Report Count (3),           */
+	0x81, 0x03,         /*          Input (Constant, Variable), */
+	0x75, 0x10,         /*          Report Size (16),           */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x14,               /*          Logical Minimum (0),        */
+	0xA4,               /*          Push,                       */
+	0x05, 0x01,         /*          Usage Page (Desktop),       */
+	0x65, 0x13,         /*          Unit (Inch),                */
+	0x55, 0xFD,         /*          Unit Exponent (-3),         */
+	0x34,               /*          Physical Minimum (0),       */
+	0x09, 0x30,         /*          Usage (X),                  */
+	0x46, 0x70, 0x17,   /*          Physical Maximum (6000),    */
+	0x26, 0x00, 0x30,   /*          Logical Maximum (12288),    */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0x09, 0x31,         /*          Usage (Y),                  */
+	0x46, 0x94, 0x11,   /*          Physical Maximum (4500),    */
+	0x26, 0x00, 0x24,   /*          Logical Maximum (9216),     */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0xB4,               /*          Pop,                        */
+	0x09, 0x30,         /*          Usage (Tip Pressure),       */
+	0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0xC0,               /*      End Collection,                 */
+	0xC0                /*  End Collection                      */
+};
 
 /*
- * Fixed Media Tablet 10.6 inch descriptor.
- *
- * The descriptions of reports unused in the default configuration are
- * removed. The stylus report (ID 16) is fixed similarly to Slim Tablet 5.8
- * inch.  The unused mouse report (ID 1) fields are replaced with constant
- * padding.
- *
- * The keyboard report (ID 13) is hacked to instead have an "array" field
- * reporting consumer page controls, and all the unused bits are masked out
- * with constant padding. The "brush" wheels' function is represented as "Scan
- * Previous/Next Track" controls due to the lack of brush controls in the
- * usage tables specification.
+ * See description, device and HID report descriptors of tablet with PID 0038 at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_PID_0038
+ */
+
+/* Size of the original report descriptor of tablet with PID 0038 */
+#define PID_0038_RDESC_ORIG_SIZE	241
+
+/*
+ * Fixed report descriptor for tablet with PID 0038.
+ */
+static __u8 pid_0038_rdesc_fixed[] = {
+	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
+	0x09, 0x02,         /*  Usage (Pen),                        */
+	0xA1, 0x01,         /*  Collection (Application),           */
+	0x85, 0x10,         /*      Report ID (16),                 */
+	0x09, 0x20,         /*      Usage (Stylus),                 */
+	0xA0,               /*      Collection (Physical),          */
+	0x09, 0x42,         /*          Usage (Tip Switch),         */
+	0x09, 0x44,         /*          Usage (Barrel Switch),      */
+	0x09, 0x46,         /*          Usage (Tablet Pick),        */
+	0x15, 0x01,         /*          Logical Minimum (1),        */
+	0x25, 0x03,         /*          Logical Maximum (3),        */
+	0x75, 0x04,         /*          Report Size (4),            */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x80,               /*          Input,                      */
+	0x09, 0x32,         /*          Usage (In Range),           */
+	0x14,               /*          Logical Minimum (0),        */
+	0x25, 0x01,         /*          Logical Maximum (1),        */
+	0x75, 0x01,         /*          Report Size (1),            */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0x95, 0x03,         /*          Report Count (3),           */
+	0x81, 0x03,         /*          Input (Constant, Variable), */
+	0x75, 0x10,         /*          Report Size (16),           */
+	0x95, 0x01,         /*          Report Count (1),           */
+	0x14,               /*          Logical Minimum (0),        */
+	0xA4,               /*          Push,                       */
+	0x05, 0x01,         /*          Usage Page (Desktop),       */
+	0x65, 0x13,         /*          Unit (Inch),                */
+	0x55, 0xFD,         /*          Unit Exponent (-3),         */
+	0x34,               /*          Physical Minimum (0),       */
+	0x09, 0x30,         /*          Usage (X),                  */
+	0x46, 0x2E, 0x22,   /*          Physical Maximum (8750),    */
+	0x26, 0x00, 0x46,   /*          Logical Maximum (17920),    */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0x09, 0x31,         /*          Usage (Y),                  */
+	0x46, 0x82, 0x14,   /*          Physical Maximum (5250),    */
+	0x26, 0x00, 0x2A,   /*          Logical Maximum (10752),    */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0xB4,               /*          Pop,                        */
+	0x09, 0x30,         /*          Usage (Tip Pressure),       */
+	0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
+	0x81, 0x02,         /*          Input (Variable),           */
+	0xC0,               /*      End Collection,                 */
+	0xC0                /*  End Collection                      */
+};
+
+/*
+ * See Media Tablet 10.6 inch description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_Media_Tablet_10.6%22
  */
+
+/* Size of the original report descriptor of Media Tablet 10.6 inch */
+#define MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE	300
+
+/* Fixed Media Tablet 10.6 inch descriptor */
 static __u8 media_tablet_10_6_inch_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -745,187 +387,14 @@ static __u8 media_tablet_10_6_inch_rdesc_fixed[] = {
 };
 
 /*
- * Original Media Tablet 14.1 inch report descriptor.
- *
- * There are at least two versions of this model in the wild. They are
- * represented by Genius G-Pen M712 (older version) and Genius G-Pen M712X
- * (newer version). The hardware difference between these versions is the same
- * as between older and newer versions of Media Tablet 10.6 inch. The report
- * descriptors are identical for both versions.
- *
- * The function, behavior and report descriptor of this tablet is similar to
- * that of Media Tablet 10.6 inch. However, there is one more field (with
- * Consumer AC Pan usage) in the mouse description. Then the tablet X and Y
- * logical extents both get scaled to 0..16383 range (a hardware limit?),
- * which kind of defeats the advertised 4000 LPI resolution, considering the
- * physical extents of 12x7.25 inches. Plus, reports 5, 10 and 255 are used
- * sometimes (while moving the pen) with unknown purpose. Also, the key codes
- * generated for zoom in/out are different.
- *
- *  Usage Page (Desktop),
- *  Usage (Mouse),
- *  Collection (Application),
- *    Report ID (1),
- *    Usage (Pointer),
- *    Collection (Physical),
- *      Usage Page (Button),
- *      Usage Minimum (01h),
- *      Usage Maximum (05h),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Size (3),
- *      Report Count (1),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),
- *      Usage (X),
- *      Usage (Y),
- *      Usage (Wheel),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (3),
- *      Input (Variable, Relative),
- *      Usage Page (Consumer),
- *      Logical Minimum (-127),
- *      Logical Maximum (127),
- *      Report Size (8),
- *      Report Count (1),
- *      Usage (AC Pan),
- *      Input (Variable, Relative),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Digitizer),
- *  Usage (Pen),
- *  Collection (Application),
- *    Report ID (2),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *      Usage (Azimuth),
- *      Usage (Altitude),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (2),
- *      Feature (Variable),
- *    End Collection,
- *    Report ID (5),
- *    Usage Page (Digitizer),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (10),
- *    Usage Page (Digitizer),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (00h),
- *      Logical Minimum (0),
- *      Logical Maximum (255),
- *      Report Size (8),
- *      Report Count (7),
- *      Input (Variable),
- *    End Collection,
- *    Report ID (16),
- *    Usage (Stylus),
- *    Collection (Physical),
- *      Usage (Tip Switch),
- *      Usage (Barrel Switch),
- *      Usage (Invert),
- *      Usage (Eraser),
- *      Usage (In Range),
- *      Logical Minimum (0),
- *      Logical Maximum (1),
- *      Report Size (1),
- *      Report Count (5),
- *      Input (Variable),
- *      Report Count (3),
- *      Input (Constant, Variable),
- *      Usage Page (Desktop),
- *      Usage (X),
- *      Report Size (16),
- *      Report Count (1),
- *      Push,
- *      Unit Exponent (13),
- *      Unit (Inch^3),
- *      Logical Minimum (0),
- *      Logical Maximum (16383),
- *      Physical Minimum (0),
- *      Physical Maximum (16383),
- *      Input (Variable),
- *      Usage (Y),
- *      Input (Variable),
- *      Usage Page (Digitizer),
- *      Usage (Tip Pressure),
- *      Logical Minimum (0),
- *      Logical Maximum (1023),
- *      Physical Minimum (0),
- *      Physical Maximum (1023),
- *      Input (Variable),
- *    End Collection,
- *  End Collection,
- *  Usage Page (Desktop),
- *  Usage (Keyboard),
- *  Collection (Application),
- *    Report ID (13),
- *    Usage Page (Keyboard),
- *    Usage Minimum (KB Leftcontrol),
- *    Usage Maximum (KB Right GUI),
- *    Logical Minimum (0),
- *    Logical Maximum (1),
- *    Report Size (1),
- *    Report Count (8),
- *    Input (Variable),
- *    Report Size (8),
- *    Report Count (1),
- *    Input (Constant),
- *    Usage Page (Keyboard),
- *    Usage Minimum (None),
- *    Usage Maximum (KB Application),
- *    Logical Minimum (0),
- *    Logical Maximum (101),
- *    Report Size (8),
- *    Report Count (5),
- *    Input,
- *  End Collection,
- *  Usage Page (Consumer),
- *  Usage (Consumer Control),
- *  Collection (Application),
- *    Report ID (12),
- *    Usage (Volume Inc),
- *    Usage (Volume Dec),
- *    Usage (Mute),
- *    Logical Minimum (0),
- *    Logical Maximum (1),
- *    Report Size (1),
- *    Report Count (3),
- *    Input (Variable, Relative),
- *    Report Size (5),
- *    Report Count (1),
- *    Input (Constant, Variable, Relative),
- *  End Collection
+ * See Media Tablet 14.1 inch description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=Waltop_Media_Tablet_14.1%22
  */
 
 /* Size of the original report descriptor of Media Tablet 14.1 inch */
 #define MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE	309
 
-/*
- * Fixed Media Tablet 14.1 inch descriptor.
- * It is fixed similarly to the Media Tablet 10.6 inch descriptor.
- */
+/* Fixed Media Tablet 14.1 inch descriptor */
 static __u8 media_tablet_14_1_inch_rdesc_fixed[] = {
 	0x05, 0x0D,         /*  Usage Page (Digitizer),             */
 	0x09, 0x02,         /*  Usage (Pen),                        */
@@ -1033,6 +502,47 @@ static __u8 media_tablet_14_1_inch_rdesc_fixed[] = {
 	0xC0                /*  End Collection                      */
 };
 
+struct waltop_state {
+	u8 pressure0;
+	u8 pressure1;
+};
+
+static int waltop_probe(struct hid_device *hdev,
+			const struct hid_device_id *id)
+{
+	int ret;
+	struct waltop_state *s;
+
+	s = kzalloc(sizeof(*s), GFP_KERNEL);
+	if (s == NULL) {
+		hid_err(hdev, "can't allocate device state\n");
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	s->pressure0 = 0;
+	s->pressure1 = 0;
+
+	hid_set_drvdata(hdev, s);
+
+	ret = hid_parse(hdev);
+	if (ret) {
+		hid_err(hdev, "parse failed\n");
+		goto err;
+	}
+
+	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+	if (ret) {
+		hid_err(hdev, "hw start failed\n");
+		goto err;
+	}
+
+	return 0;
+err:
+	kfree(s);
+	return ret;
+}
+
 static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 		unsigned int *rsize)
 {
@@ -1049,6 +559,18 @@ static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 			*rsize = sizeof(slim_tablet_12_1_inch_rdesc_fixed);
 		}
 		break;
+	case USB_DEVICE_ID_WALTOP_Q_PAD:
+		if (*rsize == Q_PAD_RDESC_ORIG_SIZE) {
+			rdesc = q_pad_rdesc_fixed;
+			*rsize = sizeof(q_pad_rdesc_fixed);
+		}
+		break;
+	case USB_DEVICE_ID_WALTOP_PID_0038:
+		if (*rsize == PID_0038_RDESC_ORIG_SIZE) {
+			rdesc = pid_0038_rdesc_fixed;
+			*rsize = sizeof(pid_0038_rdesc_fixed);
+		}
+		break;
 	case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH:
 		if (*rsize == MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE) {
 			rdesc = media_tablet_10_6_inch_rdesc_fixed;
@@ -1065,12 +587,54 @@ static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 	return rdesc;
 }
 
+static int waltop_raw_event(struct hid_device *hdev, struct hid_report *report,
+		     u8 *data, int size)
+{
+	/* If this is a pen input report of a tablet with PID 0038 */
+	if (hdev->product == USB_DEVICE_ID_WALTOP_PID_0038 &&
+	    report->type == HID_INPUT_REPORT &&
+	    report->id == 16 &&
+	    size == 8) {
+		struct waltop_state *s = hid_get_drvdata(hdev);
+
+		/*
+		 * Ignore maximum pressure reported when a barrel button is
+		 * pressed.
+		 */
+
+		/* If a barrel button is pressed */
+		if ((data[1] & 0xF) > 1) {
+			/* Use the last known pressure */
+			data[6] = s->pressure0;
+			data[7] = s->pressure1;
+		} else {
+			/* Remember reported pressure */
+			s->pressure0 = data[6];
+			s->pressure1 = data[7];
+		}
+	}
+
+	return 0;
+}
+
+static void waltop_remove(struct hid_device *hdev)
+{
+	struct waltop_state *s = hid_get_drvdata(hdev);
+
+	hid_hw_stop(hdev);
+	kfree(s);
+}
+
 static const struct hid_device_id waltop_devices[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
 				USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
 				USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
+				USB_DEVICE_ID_WALTOP_Q_PAD) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
+				USB_DEVICE_ID_WALTOP_PID_0038) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
 				USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
 				USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
@@ -1081,7 +645,10 @@ MODULE_DEVICE_TABLE(hid, waltop_devices);
 static struct hid_driver waltop_driver = {
 	.name = "waltop",
 	.id_table = waltop_devices,
+	.probe = waltop_probe,
 	.report_fixup = waltop_report_fixup,
+	.raw_event = waltop_raw_event,
+	.remove = waltop_remove,
 };
 
 static int __init waltop_init(void)
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 0dd0bebac69f..782c63955f29 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -60,6 +60,7 @@ static const struct hid_blacklist {
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
+	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET },
@@ -96,6 +97,8 @@ static const struct hid_blacklist {
 	{ USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH, HID_QUIRK_MULTI_INPUT },
 	{ USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT },
 	{ USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS },
+	{ USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT },
+	{ USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT },
 	{ 0, 0 }
 };