include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / hid / hid-ntrig.c
index f6f882d..9b24fc5 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/device.h>
 #include <linux/hid.h>
 #include <linux/module.h>
+#include <linux/slab.h>
 
 #include "hid-ids.h"
 
@@ -140,6 +141,9 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
                        nd->reading_mt = 1;
                        nd->first_contact_confidence = 0;
                        break;
+               case HID_DG_TIPSWITCH:
+                       /* Prevent emission of touch until validated */
+                       return 1;
                case HID_DG_CONFIDENCE:
                        nd->confidence = value;
                        break;
@@ -165,6 +169,8 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
                         * to emit a normal (X, Y) position
                         */
                        if (!nd->reading_mt) {
+                               input_report_key(input, BTN_TOOL_DOUBLETAP,
+                                                (nd->confidence != 0));
                                input_event(input, EV_ABS, ABS_X, nd->x);
                                input_event(input, EV_ABS, ABS_Y, nd->y);
                        }
@@ -257,6 +263,7 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
                                                BTN_TOOL_TRIPLETAP, 0);
                                input_report_key(input,
                                                BTN_TOOL_QUADTAP, 0);
+                               input_report_key(input, BTN_TOUCH, 0);
                        }
                        break;
 
@@ -306,13 +313,20 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
 
 
        list_for_each_entry(hidinput, &hdev->inputs, list) {
+               if (hidinput->report->maxfield < 1)
+                       continue;
+
                input = hidinput->input;
                switch (hidinput->report->field[0]->application) {
                case HID_DG_PEN:
                        input->name = "N-Trig Pen";
                        break;
                case HID_DG_TOUCHSCREEN:
+                       /* These keys are redundant for fingers, clear them
+                        * to prevent incorrect identification */
                        __clear_bit(BTN_TOOL_PEN, input->keybit);
+                       __clear_bit(BTN_TOOL_FINGER, input->keybit);
+                       __clear_bit(BTN_0, input->keybit);
                        /*
                         * A little something special to enable
                         * two and three finger taps.