diff options
Diffstat (limited to 'drivers/usb/hid.c')
-rw-r--r-- | drivers/usb/hid.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/usb/hid.c b/drivers/usb/hid.c index 85b44010c..778bb3532 100644 --- a/drivers/usb/hid.c +++ b/drivers/usb/hid.c @@ -40,6 +40,8 @@ #include <linux/smp_lock.h> #include <linux/spinlock.h> +#include <asm/unaligned.h> + #undef DEBUG #undef DEBUG_DATA @@ -573,14 +575,14 @@ static __u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item) case 2: if ((end - start) >= 2) { - item->data.u16 = le16_to_cpu( *((__u16*)start)++); + item->data.u16 = le16_to_cpu( get_unaligned(((__u16*)start)++)); return start; } case 3: item->size++; if ((end - start) >= 4) { - item->data.u32 = le32_to_cpu( *((__u32*)start)++); + item->data.u32 = le32_to_cpu( get_unaligned(((__u32*)start)++)); return start; } } @@ -706,7 +708,7 @@ static __inline__ __u32 s32ton(__s32 value, unsigned n) static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) { report += (offset >> 5) << 2; offset &= 31; - return (le64_to_cpu(*(__u64*)report) >> offset) & ((1 << n) - 1); + return (le64_to_cpu(get_unaligned((__u64*)report)) >> offset) & ((1 << n) - 1); } static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) @@ -1408,19 +1410,16 @@ static struct usb_driver hid_driver = { disconnect: hid_disconnect }; -#ifdef MODULE -void cleanup_module(void) +static int __init hid_init(void) { - usb_deregister(&hid_driver); + usb_register(&hid_driver); + return 0; } -int init_module(void) -#else -int hid_init(void) -#endif +static void __exit hid_exit(void) { - usb_register(&hid_driver); - return 0; + usb_deregister(&hid_driver); } -__initcall(hid_init); +module_init(hid_init); +module_exit(hid_exit); |