Merge branches 'upstream-fixes', 'wacom' and 'waltop' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Tue, 22 May 2012 09:33:42 +0000 (11:33 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 22 May 2012 09:35:11 +0000 (11:35 +0200)
Conflicts:
drivers/hid/hid-core.c

1  2  3  4 
drivers/hid/Kconfig
drivers/hid/hid-apple.c
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-input.c
drivers/hid/hid-logitech-dj.c

diff --combined drivers/hid/Kconfig
@@@@@ -32,9 -32,13 -32,9 -32,9 +32,13 @@@@@ config HI
          If unsure, say Y.
    
    config HID_BATTERY_STRENGTH
- --    bool
+ ++    bool "Battery level reporting for HID devices"
        depends on HID && POWER_SUPPLY && HID = POWER_SUPPLY
  --    default y
  ++    default n
+ ++    ---help---
+ ++    This option adds support of reporting battery strength (for HID devices
+ ++    that support this feature) through power_supply class so that userspace
+ ++    tools, such as upower, can display it.
    
    config HIDRAW
        bool "/dev/hidraw raw HID device support"
@@@@@ -60,18 -64,6 -60,6 -60,6 +64,18 @@@@@ source "drivers/hid/usbhid/Kconfig
    menu "Special HID drivers"
        depends on HID
    
 +++config HID_GENERIC
 +++    tristate "Generic HID driver"
 +++    depends on HID
 +++    default y
 +++    ---help---
 +++    Support for generic HID devices.
 +++
 +++    To compile this driver as a module, choose M here: the module
 +++    will be called hid-generic.
 +++
 +++    If unsure, say Y.
 +++
    config HID_A4TECH
        tristate "A4 tech mice" if EXPERT
        depends on USB_HID
@@@@@ -104,12 -96,6 -92,6 -92,6 +108,12 @@@@@ config HID_APPL
        Say Y here if you want support for keyboards of Apple iBooks, PowerBooks,
        MacBooks, MacBook Pros and Apple Aluminum.
    
 +++config HID_AUREAL
 +++    tristate "Aureal"
 +++    depends on USB_HID
 +++    ---help---
 +++    Support for Aureal Cy se W-01RN Remote Controller and other Aureal derived remotes.
 +++
    config HID_BELKIN
        tristate "Belkin Flip KVM and Wireless keyboard" if EXPERT
        depends on USB_HID
@@@@@ -613,16 -599,16 -595,10 -595,16 +617,10 @@@@@ config THRUSTMASTER_F
    config HID_WACOM
        tristate "Wacom Bluetooth devices support"
        depends on BT_HIDP
-- -    ---help---
-- -    Support for Wacom Graphire Bluetooth tablet.
-- -
-- -config HID_WACOM_POWER_SUPPLY
-- -    bool "Wacom Bluetooth devices power supply status support"
-- -    depends on HID_WACOM
++ +    depends on LEDS_CLASS
        select POWER_SUPPLY
        ---help---
-- -      Say Y here if you want to enable power supply status monitoring for
-- -      Wacom Bluetooth devices.
++ +    Support for Wacom Graphire Bluetooth and Intuos4 WL tablets.
    
    config HID_WIIMOTE
        tristate "Nintendo Wii Remote support"
diff --combined drivers/hid/hid-apple.c
@@@@@ -234,7 -234,7 -234,7 -234,7 +234,7 @@@@@ static int hidinput_apple_event(struct 
                }
        }
    
 ---        if (iso_layout) {
 +++    if (iso_layout) {
                if (asc->quirks & APPLE_ISO_KEYBOARD) {
                        trans = apple_find_translation(apple_iso_keyboard, usage->code);
                        if (trans) {
@@@@@ -458,6 -458,9 -458,6 -458,6 +458,9 @@@@@ static const struct hid_device_id apple
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
                .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
                        APPLE_ISO_KEYBOARD },
+ ++    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
+ ++                            USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
+ ++            .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS),
                .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
diff --combined drivers/hid/hid-core.c
@@@@@ -230,16 -230,9 -230,9 -230,9 +230,16 @@@@@ static int hid_add_field(struct hid_par
                return -1;
        }
    
 ---    if (parser->global.logical_maximum < parser->global.logical_minimum) {
 ---            hid_err(parser->device, "logical range invalid %d %d\n",
 ---                            parser->global.logical_minimum, parser->global.logical_maximum);
 +++    /* Handle both signed and unsigned cases properly */
 +++    if ((parser->global.logical_minimum < 0 &&
 +++            parser->global.logical_maximum <
 +++            parser->global.logical_minimum) ||
 +++            (parser->global.logical_minimum >= 0 &&
 +++            (__u32)parser->global.logical_maximum <
 +++            (__u32)parser->global.logical_minimum)) {
 +++            dbg_hid("logical range invalid 0x%x 0x%x\n",
 +++                    parser->global.logical_minimum,
 +++                    parser->global.logical_maximum);
                return -1;
        }
    
@@@@@ -553,11 -546,12 -546,12 -546,12 +553,11 @@@@@ static void hid_free_report(struct hid_
    }
    
    /*
 --- * Free a device structure, all reports, and all fields.
 +++ * Close report. This function returns the device
 +++ * state to the point prior to hid_open_report().
     */
 ---
 ---static void hid_device_release(struct device *dev)
 +++static void hid_close_report(struct hid_device *device)
    {
 ---    struct hid_device *device = container_of(dev, struct hid_device, dev);
        unsigned i, j;
    
        for (i = 0; i < HID_REPORT_TYPES; i++) {
                        if (report)
                                hid_free_report(report);
                }
 +++            memset(report_enum, 0, sizeof(*report_enum));
 +++            INIT_LIST_HEAD(&report_enum->report_list);
        }
    
        kfree(device->rdesc);
 +++    device->rdesc = NULL;
 +++    device->rsize = 0;
 +++
        kfree(device->collection);
 ---    kfree(device);
 +++    device->collection = NULL;
 +++    device->collection_size = 0;
 +++    device->maxcollection = 0;
 +++    device->maxapplication = 0;
 +++
 +++    device->status &= ~HID_STAT_PARSED;
 +++}
 +++
 +++/*
 +++ * Free a device structure, all reports, and all fields.
 +++ */
 +++
 +++static void hid_device_release(struct device *dev)
 +++{
 +++    struct hid_device *hid = container_of(dev, struct hid_device, dev);
 +++
 +++    hid_close_report(hid);
 +++    kfree(hid->dev_rdesc);
 +++    kfree(hid);
    }
    
    /*
@@@@@ -665,60 -636,6 -636,6 -636,6 +665,60 @@@@@ static u8 *fetch_item(__u8 *start, __u
        return NULL;
    }
    
 +++static void hid_scan_usage(struct hid_device *hid, u32 usage)
 +++{
 +++    if (usage == HID_DG_CONTACTID)
 +++            hid->group = HID_GROUP_MULTITOUCH;
 +++}
 +++
 +++/*
 +++ * Scan a report descriptor before the device is added to the bus.
 +++ * Sets device groups and other properties that determine what driver
 +++ * to load.
 +++ */
 +++static int hid_scan_report(struct hid_device *hid)
 +++{
 +++    unsigned int page = 0, delim = 0;
 +++    __u8 *start = hid->dev_rdesc;
 +++    __u8 *end = start + hid->dev_rsize;
 +++    unsigned int u, u_min = 0, u_max = 0;
 +++    struct hid_item item;
 +++
 +++    hid->group = HID_GROUP_GENERIC;
 +++    while ((start = fetch_item(start, end, &item)) != NULL) {
 +++            if (item.format != HID_ITEM_FORMAT_SHORT)
 +++                    return -EINVAL;
 +++            if (item.type == HID_ITEM_TYPE_GLOBAL) {
 +++                    if (item.tag == HID_GLOBAL_ITEM_TAG_USAGE_PAGE)
 +++                            page = item_udata(&item) << 16;
 +++            } else if (item.type == HID_ITEM_TYPE_LOCAL) {
 +++                    if (delim > 1)
 +++                            break;
 +++                    u = item_udata(&item);
 +++                    if (item.size <= 2)
 +++                            u += page;
 +++                    switch (item.tag) {
 +++                    case HID_LOCAL_ITEM_TAG_DELIMITER:
 +++                            delim += !!u;
 +++                            break;
 +++                    case HID_LOCAL_ITEM_TAG_USAGE:
 +++                            hid_scan_usage(hid, u);
 +++                            break;
 +++                    case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
 +++                            u_min = u;
 +++                            break;
 +++                    case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
 +++                            u_max = u;
 +++                            for (u = u_min; u <= u_max; u++)
 +++                                    hid_scan_usage(hid, u);
 +++                            break;
 +++                    }
 +++            }
 +++    }
 +++
 +++    return 0;
 +++}
 +++
    /**
     * hid_parse_report - parse device report
     *
     * @start: report start
     * @size: report size
     *
 +++ * Allocate the device report as read by the bus driver. This function should
 +++ * only be called from parse() in ll drivers.
 +++ */
 +++int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size)
 +++{
 +++    hid->dev_rdesc = kmemdup(start, size, GFP_KERNEL);
 +++    if (!hid->dev_rdesc)
 +++            return -ENOMEM;
 +++    hid->dev_rsize = size;
 +++    return 0;
 +++}
 +++EXPORT_SYMBOL_GPL(hid_parse_report);
 +++
 +++/**
 +++ * hid_open_report - open a driver-specific device report
 +++ *
 +++ * @device: hid device
 +++ *
     * Parse a report description into a hid_device structure. Reports are
     * enumerated, fields are attached to these reports.
     * 0 returned on success, otherwise nonzero error value.
 +++ *
 +++ * This function (or the equivalent hid_parse() macro) should only be
 +++ * called from probe() in drivers, before starting the device.
     */
 ---int hid_parse_report(struct hid_device *device, __u8 *start,
 ---            unsigned size)
 +++int hid_open_report(struct hid_device *device)
    {
        struct hid_parser *parser;
        struct hid_item item;
 +++    unsigned int size;
 +++    __u8 *start;
        __u8 *end;
        int ret;
        static int (*dispatch_type[])(struct hid_parser *parser,
                hid_parser_reserved
        };
    
 +++    if (WARN_ON(device->status & HID_STAT_PARSED))
 +++            return -EBUSY;
 +++
 +++    start = device->dev_rdesc;
 +++    if (WARN_ON(!start))
 +++            return -ENODEV;
 +++    size = device->dev_rsize;
 +++
        if (device->driver->report_fixup)
                start = device->driver->report_fixup(device, start, &size);
    
        parser->device = device;
    
        end = start + size;
 +++
 +++    device->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
 +++                                 sizeof(struct hid_collection), GFP_KERNEL);
 +++    if (!device->collection) {
 +++            ret = -ENOMEM;
 +++            goto err;
 +++    }
 +++    device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
 +++
        ret = -EINVAL;
        while ((start = fetch_item(start, end, &item)) != NULL) {
    
                                goto err;
                        }
                        vfree(parser);
 +++                    device->status |= HID_STAT_PARSED;
                        return 0;
                }
        }
        hid_err(device, "item fetching failed at offset %d\n", (int)(end - start));
    err:
        vfree(parser);
 +++    hid_close_report(device);
        return ret;
    }
 ---EXPORT_SYMBOL_GPL(hid_parse_report);
 +++EXPORT_SYMBOL_GPL(hid_open_report);
    
    /*
     * Convert a signed n-bit integer to signed 32-bit integer. Common
@@@@@ -1156,7 -1032,7 -1032,7 -1032,7 +1156,7 @@@@@ static struct hid_report *hid_get_repor
        return report;
    }
    
 ---void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
 +++int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
                int interrupt)
    {
        struct hid_report_enum *report_enum = hid->report_enum + type;
        unsigned int a;
        int rsize, csize = size;
        u8 *cdata = data;
 +++    int ret = 0;
    
        report = hid_get_report(report_enum, data);
        if (!report)
 ---            return;
 +++            goto out;
    
        if (report_enum->numbered) {
                cdata++;
    
        if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
                hid->hiddev_report_event(hid, report);
 ---    if (hid->claimed & HID_CLAIMED_HIDRAW)
 ---            hidraw_report_event(hid, data, size);
 +++    if (hid->claimed & HID_CLAIMED_HIDRAW) {
 +++            ret = hidraw_report_event(hid, data, size);
 +++            if (ret)
 +++                    goto out;
 +++    }
    
        for (a = 0; a < report->maxfield; a++)
                hid_input_field(hid, report->field[a], cdata, interrupt);
    
        if (hid->claimed & HID_CLAIMED_INPUT)
                hidinput_report_event(hid, report);
 +++out:
 +++    return ret;
    }
    EXPORT_SYMBOL_GPL(hid_report_raw_event);
    
                }
        }
    
 ---    hid_report_raw_event(hid, type, data, size, interrupt);
 +++    ret = hid_report_raw_event(hid, type, data, size, interrupt);
    
    unlock:
        up(&hid->driver_lock);
@@@@@ -1288,8 -1158,7 -1158,7 -1158,7 +1288,8 @@@@@ EXPORT_SYMBOL_GPL(hid_input_report)
    static bool hid_match_one_id(struct hid_device *hdev,
                const struct hid_device_id *id)
    {
 ---    return id->bus == hdev->bus &&
 +++    return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) &&
 +++            (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
                (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
                (id->product == HID_ANY_ID || id->product == hdev->product);
    }
@@@@@ -1365,6 -1234,10 -1234,10 -1234,10 +1365,6 @@@@@ int hid_connect(struct hid_device *hdev
        if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
                                connect_mask & HID_CONNECT_HIDINPUT_FORCE))
                hdev->claimed |= HID_CLAIMED_INPUT;
 ---    if (hdev->quirks & HID_QUIRK_MULTITOUCH) {
 ---            /* this device should be handled by hid-multitouch, skip it */
 ---            return -ENODEV;
 ---    }
    
        if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
                        !hdev->hiddev_connect(hdev,
@@@@@ -1441,10 -1314,13 -1314,13 -1314,13 +1441,10 @@@@@ EXPORT_SYMBOL_GPL(hid_disconnect)
    
    /* a list of devices for which there is a specialized driver on HID bus */
    static const struct hid_device_id hid_have_special_driver[] = {
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, USB_DEVICE_ID_ACTIONSTAR_1011) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
 +++    { HID_USB_DEVICE(USB_VENDOR_ID_AUREAL, USB_DEVICE_ID_AUREAL_W01RN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_BAANTO, USB_DEVICE_ID_BAANTO_MT_190W2), },
        { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
 ---    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL, USB_DEVICE_ID_GAMETEL_MT_MODE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, USB_DEVICE_ID_GOODTOUCH_000f) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT, USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6650) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT780) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT880) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_PCI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
 ---    { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
 +++    { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XAT, USB_DEVICE_ID_XAT_CSR) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX1) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX1) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR1) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX2) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX2) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR2) },
+++     { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XAT, USB_DEVICE_ID_XAT_CSR) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX1) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX1) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR1) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX2) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX2) },
   -    { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
@@@@@ -1703,7 -1631,6 -1631,6 -1632,6 +1703,7 @@@@@ static ssize_t store_new_id(struct devi
                return -ENOMEM;
    
        dynid->id.bus = bus;
 +++    dynid->id.group = HID_GROUP_ANY;
        dynid->id.vendor = vendor;
        dynid->id.product = product;
        dynid->id.driver_data = driver_data;
@@@@@ -1752,7 -1679,18 -1679,18 -1680,18 +1752,7 @@@@@ static int hid_bus_match(struct device 
        struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    
 ---    if ((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
 ---            !strncmp(hdrv->name, "hid-multitouch", 14))
 ---            return 1;
 ---
 ---    if (!hid_match_device(hdev, hdrv))
 ---            return 0;
 ---
 ---    /* generic wants all that don't have specialized driver */
 ---    if (!strncmp(hdrv->name, "generic-", 8) && !hid_ignore_special_drivers)
 ---            return !hid_match_id(hdev, hid_have_special_driver);
 ---
 ---    return 1;
 +++    return hid_match_device(hdev, hdrv) != NULL;
    }
    
    static int hid_device_probe(struct device *dev)
        if (!hdev->driver) {
                id = hid_match_device(hdev, hdrv);
                if (id == NULL) {
 ---                    if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
 ---                            !strncmp(hdrv->name, "hid-multitouch", 14))) {
 ---                            ret = -ENODEV;
 ---                            goto unlock;
 ---                    }
 +++                    ret = -ENODEV;
 +++                    goto unlock;
                }
    
                hdev->driver = hdrv;
                if (hdrv->probe) {
                        ret = hdrv->probe(hdev, id);
                } else { /* default probe */
 ---                    ret = hid_parse(hdev);
 +++                    ret = hid_open_report(hdev);
                        if (!ret)
                                ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
                }
 ---            if (ret)
 +++            if (ret) {
 +++                    hid_close_report(hdev);
                        hdev->driver = NULL;
 +++            }
        }
    unlock:
        up(&hdev->driver_lock);
@@@@@ -1805,7 -1744,6 -1744,6 -1745,6 +1805,7 @@@@@ static int hid_device_remove(struct dev
                        hdrv->remove(hdev);
                else /* default remove */
                        hid_hw_stop(hdev);
 +++            hid_close_report(hdev);
                hdev->driver = NULL;
        }
    
        return 0;
    }
    
 +++static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
 +++                         char *buf)
 +++{
 +++    struct hid_device *hdev = container_of(dev, struct hid_device, dev);
 +++    int len;
 +++
 +++    len = snprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
 +++                   hdev->bus, hdev->group, hdev->vendor, hdev->product);
 +++
 +++    return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
 +++}
 +++
 +++static struct device_attribute hid_dev_attrs[] = {
 +++    __ATTR_RO(modalias),
 +++    __ATTR_NULL,
 +++};
 +++
    static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
    {
        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
        if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
                return -ENOMEM;
    
 ---    if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X",
 ---                    hdev->bus, hdev->vendor, hdev->product))
 +++    if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
 +++                       hdev->bus, hdev->group, hdev->vendor, hdev->product))
                return -ENOMEM;
    
        return 0;
    
    static struct bus_type hid_bus_type = {
        .name           = "hid",
 +++    .dev_attrs      = hid_dev_attrs,
        .match          = hid_bus_match,
        .probe          = hid_device_probe,
        .remove         = hid_device_remove,
@@@@@ -2015,16 -1935,16 -1935,6 -1936,6 +2015,16 @@@@@ static const struct hid_device_id hid_i
        { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
  ++#if defined(CONFIG_MOUSE_SYNAPTICS_USB) || defined(CONFIG_MOUSE_SYNAPTICS_USB_MODULE)
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_CPAD) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_STICK) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WP) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_COMP_TP) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) },
  ++    { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
  ++#endif
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
@@@@@ -2106,16 -2026,16 -2016,6 -2017,6 +2106,16 @@@@@ static bool hid_ignore(struct hid_devic
                if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
                                hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST)
                        return true;
  ++            /*
  ++             * The Keene FM transmitter USB device has the same USB ID as
  ++             * the Logitech AudioHub Speaker, but it should ignore the hid.
  ++             * Check if the name is that of the Keene device.
  ++             * For reference: the name of the AudioHub is
  ++             * "HOLTEK  AudioHub Speaker".
  ++             */
  ++            if (hdev->product == USB_DEVICE_ID_LOGITECH_AUDIOHUB &&
  ++                    !strcmp(hdev->name, "HOLTEK  B-LINK USB Audio  "))
  ++                            return true;
                break;
        case USB_VENDOR_ID_SOUNDGRAPH:
                if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST &&
@@@@@ -2155,26 -2075,6 -2055,6 -2056,6 +2155,26 @@@@@ int hid_add_device(struct hid_device *h
                && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE)))
                return -ENODEV;
    
 +++    /*
 +++     * Read the device report descriptor once and use as template
 +++     * for the driver-specific modifications.
 +++     */
 +++    ret = hdev->ll_driver->parse(hdev);
 +++    if (ret)
 +++            return ret;
 +++    if (!hdev->dev_rdesc)
 +++            return -ENODEV;
 +++
 +++    /*
 +++     * Scan generic devices for group information
 +++     */
 +++    if (hid_ignore_special_drivers ||
 +++        !hid_match_id(hdev, hid_have_special_driver)) {
 +++            ret = hid_scan_report(hdev);
 +++            if (ret)
 +++                    hid_warn(hdev, "bad device descriptor (%d)\n", ret);
 +++    }
 +++
        /* XXX hack, any other cleaner solution after the driver core
         * is converted to allow more than 20 bytes as the device name? */
        dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
@@@@@ -2203,6 -2103,7 -2083,7 -2084,7 +2203,6 @@@@@ EXPORT_SYMBOL_GPL(hid_add_device)
    struct hid_device *hid_allocate_device(void)
    {
        struct hid_device *hdev;
 ---    unsigned int i;
        int ret = -ENOMEM;
    
        hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
        hdev->dev.release = hid_device_release;
        hdev->dev.bus = &hid_bus_type;
    
 ---    hdev->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
 ---                    sizeof(struct hid_collection), GFP_KERNEL);
 ---    if (hdev->collection == NULL)
 ---            goto err;
 ---    hdev->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
 ---
 ---    for (i = 0; i < HID_REPORT_TYPES; i++)
 ---            INIT_LIST_HEAD(&hdev->report_enum[i].report_list);
 +++    hid_close_report(hdev);
    
        init_waitqueue_head(&hdev->debug_wait);
        INIT_LIST_HEAD(&hdev->debug_list);
        sema_init(&hdev->driver_lock, 1);
    
        return hdev;
 ---err:
 ---    put_device(&hdev->dev);
 ---    return ERR_PTR(ret);
    }
    EXPORT_SYMBOL_GPL(hid_allocate_device);
    
@@@@@ -2230,9 -2141,6 -2121,6 -2122,6 +2230,9 @@@@@ static void hid_remove_device(struct hi
                hid_debug_unregister(hdev);
                hdev->status &= ~HID_STAT_ADDED;
        }
 +++    kfree(hdev->dev_rdesc);
 +++    hdev->dev_rdesc = NULL;
 +++    hdev->dev_rsize = 0;
    }
    
    /**
diff --combined drivers/hid/hid-ids.h
    #define USB_DEVICE_ID_ATMEL_MULTITOUCH      0x211c
    #define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER   0x2118
    
 +++#define USB_VENDOR_ID_AUREAL                0x0755
 +++#define USB_DEVICE_ID_AUREAL_W01RN  0x2626
 +++
    #define USB_VENDOR_ID_AVERMEDIA             0x07ca
    #define USB_DEVICE_ID_AVER_FM_MR800 0xb800
    
 +++#define USB_VENDOR_ID_BAANTO                0x2453
 +++#define USB_DEVICE_ID_BAANTO_MT_190W2       0x0100
 +++
    #define USB_VENDOR_ID_BELKIN                0x050d
    #define USB_DEVICE_ID_FLIP_KVM              0x3201
    
    #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
    
    #define USB_VENDOR_ID_LOGITECH              0x046d
  ++#define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e
    #define USB_DEVICE_ID_LOGITECH_RECEIVER     0xc101
    #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST  0xc110
    #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
    #define USB_DEVICE_ID_SYMBOL_SCANNER_1      0x0800
    #define USB_DEVICE_ID_SYMBOL_SCANNER_2      0x1300
    
  ++#define USB_VENDOR_ID_SYNAPTICS             0x06cb
  ++#define USB_DEVICE_ID_SYNAPTICS_TP  0x0001
  ++#define USB_DEVICE_ID_SYNAPTICS_INT_TP      0x0002
  ++#define USB_DEVICE_ID_SYNAPTICS_CPAD        0x0003
  ++#define USB_DEVICE_ID_SYNAPTICS_TS  0x0006
  ++#define USB_DEVICE_ID_SYNAPTICS_STICK       0x0007
  ++#define USB_DEVICE_ID_SYNAPTICS_WP  0x0008
  ++#define USB_DEVICE_ID_SYNAPTICS_COMP_TP     0x0009
  ++#define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010
  ++#define USB_DEVICE_ID_SYNAPTICS_DPAD        0x0013
  ++
    #define USB_VENDOR_ID_THRUSTMASTER  0x044f
    
    #define USB_VENDOR_ID_TIVO          0x150a
    #define USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U        0x0004
    #define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U        0x0005
    #define USB_DEVICE_ID_UCLOGIC_TABLET_WP1062 0x0064
 +++#define USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850       0x0522
    
    #define USB_VENDOR_ID_UNITEC        0x227d
    #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709
    #define USB_DEVICE_ID_WALTOP_PID_0038                       0x0038
    #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH 0x0501
    #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH 0x0500
+++ #define USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET     0x0502
    
    #define USB_VENDOR_ID_WISEGROUP             0x0925
    #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005
diff --combined drivers/hid/hid-input.c
@@@@@ -225,7 -225,7 -225,7 -225,10 +225,10 @@@@@ static __s32 hidinput_calc_abs_res(cons
         * Verify and convert units.
         * See HID specification v1.11 6.2.2.7 Global Items for unit decoding
         */
---     if (code == ABS_X || code == ABS_Y || code == ABS_Z) {
+++     switch (code) {
+++     case ABS_X:
+++     case ABS_Y:
+++     case ABS_Z:
                if (field->unit == 0x11) {              /* If centimeters */
                        /* Convert to millimeters */
                        unit_exponent += 1;
                } else {
                        return 0;
                }
---     } else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) {
+++             break;
+++ 
+++     case ABS_RX:
+++     case ABS_RY:
+++     case ABS_RZ:
+++     case ABS_TILT_X:
+++     case ABS_TILT_Y:
                if (field->unit == 0x14) {              /* If degrees */
                        /* Convert to radians */
                        prev = logical_extents;
                } else if (field->unit != 0x12) {       /* If not radians */
                        return 0;
                }
---     } else {
+++             break;
+++ 
+++     default:
                return 0;
        }
    
@@@@@ -623,6 -623,6 -623,6 -634,14 +634,14 @@@@@ static void hidinput_configure_usage(st
                        map_key_clear(BTN_TOOL_RUBBER);
                        break;
    
+++             case 0x3d: /* X Tilt */
+++                     map_abs_clear(ABS_TILT_X);
+++                     break;
+++ 
+++             case 0x3e: /* Y Tilt */
+++                     map_abs_clear(ABS_TILT_Y);
+++                     break;
+++ 
                case 0x33: /* Touch */
                case 0x42: /* TipSwitch */
                case 0x43: /* TipSwitch2 */
                        map_key_clear(BTN_STYLUS2);
                        break;
    
 ---            case 0x51: /* ContactID */
 ---                    device->quirks |= HID_QUIRK_MULTITOUCH;
 ---                    goto unknown;
 ---
                default:  goto unknown;
                }
                break;
@@@@@ -1204,6 -1208,13 -1208,13 -1227,13 +1223,6 @@@@@ int hidinput_connect(struct hid_device 
                }
        }
    
 ---    if (hid->quirks & HID_QUIRK_MULTITOUCH) {
 ---            /* generic hid does not know how to handle multitouch devices */
 ---            if (hidinput)
 ---                    goto out_cleanup;
 ---            goto out_unwind;
 ---    }
 ---
        if (hidinput && input_register_device(hidinput->input))
                goto out_cleanup;
    
    #include <linux/hid.h>
    #include <linux/module.h>
    #include <linux/usb.h>
+ ++#include <asm/unaligned.h>
    #include "usbhid/usbhid.h"
    #include "hid-ids.h"
    #include "hid-logitech-dj.h"
@@@@@ -155,14 -156,6 -155,6 -155,6 +156,14 @@@@@ static const char media_descriptor[] = 
    /* Maximum size of all defined hid reports in bytes (including report id) */
    #define MAX_REPORT_SIZE 8
    
 +++/* Make sure all descriptors are present here */
 +++#define MAX_RDESC_SIZE                              \
 +++    (sizeof(kbd_descriptor) +               \
 +++     sizeof(mse_descriptor) +               \
 +++     sizeof(consumer_descriptor) +          \
 +++     sizeof(syscontrol_descriptor) +        \
 +++     sizeof(media_descriptor))
 +++
    /* Number of possible hid report types that can be created by this driver.
     *
     * Right now, RF report types have the same report types (or report id's)
@@@@@ -273,8 -266,8 -265,8 -265,8 +274,8 @@@@@ static void logi_dj_recv_add_djhid_devi
                goto dj_device_allocate_fail;
        }
    
- --    dj_dev->reports_supported = le32_to_cpu(
- --            dj_report->report_params[DEVICE_PAIRED_RF_REPORT_TYPE]);
+ ++    dj_dev->reports_supported = get_unaligned_le32(
+ ++            dj_report->report_params + DEVICE_PAIRED_RF_REPORT_TYPE);
        dj_dev->hdev = dj_hiddev;
        dj_dev->dj_receiver_dev = djrcv_dev;
        dj_dev->device_index = dj_report->device_index;
@@@@@ -481,17 -474,9 -473,9 -473,9 +482,17 @@@@@ static int logi_dj_output_hidraw_report
        return 0;
    }
    
 +++static void rdcat(char **rdesc, unsigned int *rsize, const char *data, unsigned int size)
 +++{
 +++    memcpy(*rdesc + *rsize, data, size);
 +++    *rsize += size;
 +++}
 +++
    static int logi_dj_ll_parse(struct hid_device *hid)
    {
        struct dj_device *djdev = hid->driver_data;
 +++    unsigned int rsize = 0;
 +++    char *rdesc;
        int retval;
    
        dbg_hid("%s\n", __func__);
        djdev->hdev->version = 0x0111;
        djdev->hdev->country = 0x00;
    
 +++    rdesc = kmalloc(MAX_RDESC_SIZE, GFP_KERNEL);
 +++    if (!rdesc)
 +++            return -ENOMEM;
 +++
        if (djdev->reports_supported & STD_KEYBOARD) {
                dbg_hid("%s: sending a kbd descriptor, reports_supported: %x\n",
                        __func__, djdev->reports_supported);
 ---            retval = hid_parse_report(hid,
 ---                                      (u8 *) kbd_descriptor,
 ---                                      sizeof(kbd_descriptor));
 ---            if (retval) {
 ---                    dbg_hid("%s: sending a kbd descriptor, hid_parse failed"
 ---                            " error: %d\n", __func__, retval);
 ---                    return retval;
 ---            }
 +++            rdcat(&rdesc, &rsize, kbd_descriptor, sizeof(kbd_descriptor));
        }
    
        if (djdev->reports_supported & STD_MOUSE) {
                dbg_hid("%s: sending a mouse descriptor, reports_supported: "
                        "%x\n", __func__, djdev->reports_supported);
 ---            retval = hid_parse_report(hid,
 ---                                      (u8 *) mse_descriptor,
 ---                                      sizeof(mse_descriptor));
 ---            if (retval) {
 ---                    dbg_hid("%s: sending a mouse descriptor, hid_parse "
 ---                            "failed error: %d\n", __func__, retval);
 ---                    return retval;
 ---            }
 +++            rdcat(&rdesc, &rsize, mse_descriptor, sizeof(mse_descriptor));
        }
    
        if (djdev->reports_supported & MULTIMEDIA) {
                dbg_hid("%s: sending a multimedia report descriptor: %x\n",
                        __func__, djdev->reports_supported);
 ---            retval = hid_parse_report(hid,
 ---                                      (u8 *) consumer_descriptor,
 ---                                      sizeof(consumer_descriptor));
 ---            if (retval) {
 ---                    dbg_hid("%s: sending a consumer_descriptor, hid_parse "
 ---                            "failed error: %d\n", __func__, retval);
 ---                    return retval;
 ---            }
 +++            rdcat(&rdesc, &rsize, consumer_descriptor, sizeof(consumer_descriptor));
        }
    
        if (djdev->reports_supported & POWER_KEYS) {
                dbg_hid("%s: sending a power keys report descriptor: %x\n",
                        __func__, djdev->reports_supported);
 ---            retval = hid_parse_report(hid,
 ---                                      (u8 *) syscontrol_descriptor,
 ---                                      sizeof(syscontrol_descriptor));
 ---            if (retval) {
 ---                    dbg_hid("%s: sending a syscontrol_descriptor, "
 ---                            "hid_parse failed error: %d\n",
 ---                            __func__, retval);
 ---                    return retval;
 ---            }
 +++            rdcat(&rdesc, &rsize, syscontrol_descriptor, sizeof(syscontrol_descriptor));
        }
    
        if (djdev->reports_supported & MEDIA_CENTER) {
                dbg_hid("%s: sending a media center report descriptor: %x\n",
                        __func__, djdev->reports_supported);
 ---            retval = hid_parse_report(hid,
 ---                                      (u8 *) media_descriptor,
 ---                                      sizeof(media_descriptor));
 ---            if (retval) {
 ---                    dbg_hid("%s: sending a media_descriptor, hid_parse "
 ---                            "failed error: %d\n", __func__, retval);
 ---                    return retval;
 ---            }
 +++            rdcat(&rdesc, &rsize, media_descriptor, sizeof(media_descriptor));
        }
    
        if (djdev->reports_supported & KBD_LEDS) {
                        __func__, djdev->reports_supported);
        }
    
 ---    return 0;
 +++    retval = hid_parse_report(hid, rdesc, rsize);
 +++    kfree(rdesc);
 +++
 +++    return retval;
    }
    
    static int logi_dj_ll_input_event(struct input_dev *dev, unsigned int type,