struct input_dev *pen_input = wacom->pen_input;
        unsigned char *data = wacom->data;
+       int number_of_valid_frames = 0;
+       int time_interval = 15000000;
+       ktime_t time_packet_received = ktime_get();
        int i;
 
        if (wacom->features.type == INTUOSP2_BT ||
                wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF;
        }
 
+       /* number of valid frames */
        for (i = 0; i < pen_frames; i++) {
                unsigned char *frame = &data[i*pen_frame_len + 1];
                bool valid = frame[0] & 0x80;
+
+               if (valid)
+                       number_of_valid_frames++;
+       }
+
+       if (number_of_valid_frames) {
+               if (wacom->hid_data.time_delayed)
+                       time_interval = ktime_get() - wacom->hid_data.time_delayed;
+               time_interval /= number_of_valid_frames;
+               wacom->hid_data.time_delayed = time_packet_received;
+       }
+
+       for (i = 0; i < number_of_valid_frames; i++) {
+               unsigned char *frame = &data[i*pen_frame_len + 1];
+               bool valid = frame[0] & 0x80;
                bool prox = frame[0] & 0x40;
                bool range = frame[0] & 0x20;
                bool invert = frame[0] & 0x10;
+               int frames_number_reversed = number_of_valid_frames - i - 1;
+               int event_timestamp = time_packet_received - frames_number_reversed * time_interval;
 
                if (!valid)
                        continue;
                        wacom->tool[0] = 0;
                        wacom->id[0] = 0;
                        wacom->serial[0] = 0;
+                       wacom->hid_data.time_delayed = 0;
                        return;
                }
 
                                                 get_unaligned_le16(&frame[11]));
                        }
                }
+
                if (wacom->tool[0]) {
                        input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
                        if (wacom->features.type == INTUOSP2_BT ||
 
                wacom->shared->stylus_in_proximity = prox;
 
+               /* add timestamp to unpack the frames */
+               input_set_timestamp(pen_input, event_timestamp);
+
                input_sync(pen_input);
        }
 }