field = kzalloc((sizeof(struct hid_field) +
                         usages * sizeof(struct hid_usage) +
-                        usages * sizeof(unsigned)), GFP_KERNEL);
+                        2 * usages * sizeof(unsigned int)), GFP_KERNEL);
        if (!field)
                return NULL;
 
        report->field[field->index] = field;
        field->usage = (struct hid_usage *)(field + 1);
        field->value = (s32 *)(field->usage + usages);
+       field->new_value = (s32 *)(field->value + usages);
        field->report = report;
 
        return field;
        __s32 max = field->logical_maximum;
        __s32 *value;
 
-       value = kmalloc_array(count, sizeof(__s32), GFP_ATOMIC);
-       if (!value)
-               return;
+       value = field->new_value;
+       memset(value, 0, count * sizeof(__s32));
 
        for (n = 0; n < count; n++) {
 
                    value[n] >= min && value[n] <= max &&
                    value[n] - min < field->maxusage &&
                    field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)
-                       goto exit;
+                       return;
        }
 
        for (n = 0; n < count; n++) {
        }
 
        memcpy(field->value, value, count * sizeof(__s32));
-exit:
-       kfree(value);
 }
 
 /*
 
        unsigned  report_count;         /* number of this field in the report */
        unsigned  report_type;          /* (input,output,feature) */
        __s32    *value;                /* last known value(s) */
+       __s32    *new_value;            /* newly read value(s) */
        __s32     logical_minimum;
        __s32     logical_maximum;
        __s32     physical_minimum;