multitouch fields */
        unsigned last_field_index;      /* last field index of the report */
        unsigned last_slot_field;       /* the last field of a slot */
+       unsigned mt_report_id;  /* the report ID of the multitouch device */
        __s8 inputmode;         /* InputMode HID feature, -1 if non-existent */
        __s8 inputmode_index;   /* InputMode HID feature index in the report */
        __s8 maxcontact_report_id;      /* Maximum Contact Number HID feature,
                        mt_store_field(usage, td, hi);
                        td->last_field_index = field->index;
                        td->touches_by_report++;
+                       td->mt_report_id = field->report->id;
                        return 1;
                case HID_DG_WIDTH:
                        hid_map_usage(hi, usage, bit, max,
 
 static int mt_event(struct hid_device *hid, struct hid_field *field,
                                struct hid_usage *usage, __s32 value)
+{
+       /* we will handle the hidinput part later, now remains hiddev */
+       if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event)
+               hid->hiddev_hid_event(hid, field, usage, value);
+
+       return 1;
+}
+
+static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
+                               struct hid_usage *usage, __s32 value)
 {
        struct mt_device *td = hid_get_drvdata(hid);
        __s32 quirks = td->mtclass.quirks;
                        break;
 
                default:
-                       /* fallback to the generic hidinput handling */
-                       return 0;
+                       return;
                }
 
                if (usage->usage_index + 1 == field->report_count) {
                }
 
        }
+}
 
-       /* we have handled the hidinput part, now remains hiddev */
-       if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event)
-               hid->hiddev_hid_event(hid, field, usage, value);
+static void mt_report(struct hid_device *hid, struct hid_report *report)
+{
+       struct mt_device *td = hid_get_drvdata(hid);
+       struct hid_field *field;
+       unsigned count;
+       int r, n;
 
-       return 1;
+       if (report->id != td->mt_report_id)
+               return;
+
+       if (!(hid->claimed & HID_CLAIMED_INPUT))
+               return;
+
+       for (r = 0; r < report->maxfield; r++) {
+               field = report->field[r];
+               count = field->report_count;
+
+               if (!(HID_MAIN_ITEM_VARIABLE & field->flags))
+                       continue;
+
+               for (n = 0; n < count; n++)
+                       mt_process_mt_event(hid, field, &field->usage[n],
+                                       field->value[n]);
+       }
 }
 
 static void mt_set_input_mode(struct hid_device *hdev)
        .feature_mapping = mt_feature_mapping,
        .usage_table = mt_grabbed_usages,
        .event = mt_event,
+       .report = mt_report,
 #ifdef CONFIG_PM
        .reset_resume = mt_reset_resume,
        .resume = mt_resume,