# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.301 -> 1.302 # drivers/usb/hid.h 1.7 -> 1.8 # include/linux/hiddev.h 1.1 -> 1.2 # drivers/input/joydev.c 1.4 -> 1.5 # drivers/usb/hid-core.c 1.9 -> 1.10 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/04/02 greg@kroah.com 1.302 # USB HID driver fixes # # - several fixes from 2.5 that are needed in 2.4 # - allow driver to work without hid-input # - remove unneeded #ifdefs in code # -------------------------------------------- # diff -Nru a/drivers/input/joydev.c b/drivers/input/joydev.c --- a/drivers/input/joydev.c Wed Apr 3 10:47:42 2002 +++ b/drivers/input/joydev.c Wed Apr 3 10:47:42 2002 @@ -411,7 +411,7 @@ static struct input_handle *joydev_connect(struct input_handler *handler, struct input_dev *dev) { struct joydev *joydev; - int i, j, minor; + int i, j, t, minor; if (!(test_bit(EV_KEY, dev->evbit) && test_bit(EV_ABS, dev->evbit) && (test_bit(ABS_X, dev->absbit) || test_bit(ABS_Y, dev->absbit)) && @@ -470,8 +470,10 @@ joydev->corr[i].prec = dev->absfuzz[j]; joydev->corr[i].coef[0] = (dev->absmax[j] + dev->absmin[j]) / 2 - dev->absflat[j]; joydev->corr[i].coef[1] = (dev->absmax[j] + dev->absmin[j]) / 2 + dev->absflat[j]; - joydev->corr[i].coef[2] = (1 << 29) / ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]); - joydev->corr[i].coef[3] = (1 << 29) / ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]); + if (!(t = ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]))) + continue; + joydev->corr[i].coef[2] = (1 << 29) / t; + joydev->corr[i].coef[3] = (1 << 29) / t; joydev->abs[i] = joydev_correct(dev->abs[j], joydev->corr + i); } diff -Nru a/drivers/usb/hid-core.c b/drivers/usb/hid-core.c --- a/drivers/usb/hid-core.c Wed Apr 3 10:47:42 2002 +++ b/drivers/usb/hid-core.c Wed Apr 3 10:47:42 2002 @@ -47,9 +47,7 @@ #include #include "hid.h" -#ifdef CONFIG_USB_HIDDEV #include -#endif /* * Version Information @@ -204,17 +202,13 @@ return -1; } - if (HID_MAIN_ITEM_VARIABLE & ~flags) { /* ARRAY */ - if (parser->global.logical_maximum <= parser->global.logical_minimum) { - dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum); - return -1; - } - usages = parser->local.usage_index; - /* Hint: we can assume usages < MAX_USAGE here */ - } else { /* VARIABLE */ - usages = parser->global.report_count; + if (parser->global.logical_maximum <= parser->global.logical_minimum) { + dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum); + return -1; } + usages = parser->local.usage_index; + offset = report->size; report->size += parser->global.report_size * parser->global.report_count; @@ -310,7 +304,10 @@ return 0; case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM: - parser->global.logical_maximum = item_sdata(item); + if (parser->global.logical_minimum < 0) + parser->global.logical_maximum = item_sdata(item); + else + parser->global.logical_maximum = item_udata(item); return 0; case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM: @@ -318,7 +315,10 @@ return 0; case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM: - parser->global.physical_maximum = item_sdata(item); + if (parser->global.physical_minimum < 0) + parser->global.physical_maximum = item_sdata(item); + else + parser->global.physical_maximum = item_udata(item); return 0; case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: @@ -735,10 +735,8 @@ hid_dump_input(usage, value); if (hid->claimed & HID_CLAIMED_INPUT) hidinput_hid_event(hid, field, usage, value); -#ifdef CONFIG_USB_HIDDEV if (hid->claimed & HID_CLAIMED_HIDDEV) hiddev_hid_event(hid, usage->hid, value); -#endif } @@ -1239,10 +1237,8 @@ if (!hidinput_connect(hid)) hid->claimed |= HID_CLAIMED_INPUT; -#ifdef CONFIG_USB_HIDDEV if (!hiddev_connect(hid)) hid->claimed |= HID_CLAIMED_HIDDEV; -#endif printk(KERN_INFO); if (hid->claimed & HID_CLAIMED_INPUT) @@ -1272,13 +1268,10 @@ dbg("cleanup called"); usb_unlink_urb(&hid->urb); - if (hid->claimed & HID_CLAIMED_INPUT) hidinput_disconnect(hid); -#ifdef CONFIG_USB_HIDDEV if (hid->claimed & HID_CLAIMED_HIDDEV) hiddev_disconnect(hid); -#endif hid_free_device(hid); } @@ -1299,9 +1292,7 @@ static int __init hid_init(void) { -#ifdef CONFIG_USB_HIDDEV hiddev_init(); -#endif usb_register(&hid_driver); info(DRIVER_VERSION " " DRIVER_AUTHOR); info(DRIVER_DESC); @@ -1311,9 +1302,7 @@ static void __exit hid_exit(void) { -#ifdef CONFIG_USB_HIDDEV hiddev_exit(); -#endif usb_deregister(&hid_driver); } diff -Nru a/drivers/usb/hid.h b/drivers/usb/hid.h --- a/drivers/usb/hid.h Wed Apr 3 10:47:42 2002 +++ b/drivers/usb/hid.h Wed Apr 3 10:47:42 2002 @@ -352,9 +352,6 @@ struct hid_class_descriptor desc[1]; } __attribute__ ((packed)); -void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); -int hidinput_connect(struct hid_device *); -void hidinput_disconnect(struct hid_device *); #ifdef DEBUG #include "hid-debug.h" @@ -365,7 +362,17 @@ #endif +#ifdef CONFIG_USB_HIDINPUT #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || ( a == 0x000c0001)) +extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); +extern int hidinput_connect(struct hid_device *); +extern void hidinput_disconnect(struct hid_device *); +#else +#define IS_INPUT_APPLICATION(a) (0) +static inline void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) { } +static inline int hidinput_connect(struct hid_device *hid) { return -ENODEV; } +static inline void hidinput_disconnect(struct hid_device *hid) { } +#endif int hid_open(struct hid_device *); void hid_close(struct hid_device *); diff -Nru a/include/linux/hiddev.h b/include/linux/hiddev.h --- a/include/linux/hiddev.h Wed Apr 3 10:47:42 2002 +++ b/include/linux/hiddev.h Wed Apr 3 10:47:42 2002 @@ -185,7 +185,7 @@ #else static inline void *hiddev_connect(struct hid_device *hid) { return NULL; } static inline void hiddev_disconnect(struct hid_device *hid) { } -static inline void hiddev_event(struct hid_device *hid, unsigned int usage, int value) { } +static inline void hiddev_hid_event(struct hid_device *hid, unsigned int usage, int value) { } static inline int hiddev_init(void) { return 0; } static inline void hiddev_exit(void) { } #endif