diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c
index 49ce69d..375064d 100644
--- a/drivers/hid/hid-ntrig.c
+++ b/drivers/hid/hid-ntrig.c
@@ -15,12 +15,18 @@
 
 #include <linux/device.h>
 #include <linux/hid.h>
+#include <linux/usb.h>
 #include <linux/module.h>
 
 #include "hid-ids.h"
 
 #define NTRIG_DUPLICATE_USAGES	0x001
 
+#define NTRIG_MODE_PEN   0x00
+#define NTRIG_MODE_TOUCH 0x01
+#define NTRIG_MODE_AUTO  0x02
+#define NTRIG_MODE_DUAL  0x03
+
 #define nt_map_key_clear(c)	hid_map_usage_clear(hi, usage, bit, max, \
 					EV_KEY, (c))
 
@@ -237,6 +243,58 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
 	return 1;
 }
 
+static int ntrig_set_mode(struct hid_device *hdev)
+{
+	struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
+	struct usb_device *dev = interface_to_usbdev(intf);
+	int ret;
+	char *buf = kmalloc (2, GFP_KERNEL);
+
+	if (!buf)
+		return -ENOMEM;
+
+	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+			      HID_REQ_GET_REPORT, /* Request */
+			      USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, /* RequestType */
+			      0x30A, /* Value */
+			      0x1, /* Index */
+			      buf, /* Data */
+			      2, /* Data size */
+			      USB_CTRL_GET_TIMEOUT);
+
+	printk ("GET_REPORT request returned %x %x\n", buf[0], buf[1]);
+
+	if (ret < 0) {
+		dev_err(&hdev->dev, "can't enable multitouch mode\n");
+		kfree(buf);
+
+		return ret;
+	}
+
+	buf[0] = NTRIG_MODE_TOUCH;
+	buf[1] = '\0';
+
+	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+			      0xF, /* Request */
+			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* RequestType */
+			      0x402, /* Value */
+			      0x100, /* Index */
+			      buf, /* Data */
+			      2, /* Data size */
+			      USB_CTRL_SET_TIMEOUT);
+
+	if (ret < 0) {
+		dev_err(&hdev->dev, "can't set touch mode\n");
+		kfree(buf);
+
+		return ret;
+	}
+
+	kfree (buf);
+
+	return ret;
+}
+
 static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
 	int ret;
@@ -255,10 +313,21 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
 	if (!ret)
 		ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
 
-	if (ret)
+	if (ret) {
 		kfree (nd);
+		return ret;
+	}
 
-	return ret;
+	ret = ntrig_set_mode (hdev);
+
+	if (ret < 0) {
+		hid_hw_stop(hdev);
+		kfree (nd);
+
+		return ret;
+	}
+
+        return 0;
 }
 
 static void ntrig_remove(struct hid_device *hdev)

