From e53fe3d30f5d21be9419af95300334fb66d298ca Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Wed, 17 Apr 2013 19:38:13 +0200 Subject: [PATCH] --- yaml --- r: 366317 b: refs/heads/master c: a5f04b9df1113e0c16271afe5e43028f0d763f13 h: refs/heads/master i: 366315: 3dcae34b0e38b7bc0edbaf8c6e530533a1141f78 v: v3 --- [refs] | 2 +- trunk/drivers/hid/Kconfig | 11 - trunk/drivers/hid/Makefile | 1 - trunk/drivers/hid/hid-apple.c | 4 + trunk/drivers/hid/hid-appleir.c | 352 -------------------------------- trunk/drivers/hid/hid-core.c | 32 +-- trunk/drivers/hid/hid-debug.c | 30 +++ trunk/drivers/hid/hid-ids.h | 5 +- trunk/include/linux/hid-debug.h | 6 +- 9 files changed, 44 insertions(+), 399 deletions(-) delete mode 100644 trunk/drivers/hid/hid-appleir.c diff --git a/[refs] b/[refs] index 1febc706c93b..2922bf66e7d6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9a4a5574ce427c364d81746fc7fb82d86b5f1a7e +refs/heads/master: a5f04b9df1113e0c16271afe5e43028f0d763f13 diff --git a/trunk/drivers/hid/Kconfig b/trunk/drivers/hid/Kconfig index 7f5e0aa5fe5a..5f07d85c4189 100644 --- a/trunk/drivers/hid/Kconfig +++ b/trunk/drivers/hid/Kconfig @@ -122,17 +122,6 @@ config HID_APPLE Say Y here if you want support for keyboards of Apple iBooks, PowerBooks, MacBooks, MacBook Pros and Apple Aluminum. -config HID_APPLEIR - tristate "Apple infrared receiver" - depends on (USB_HID) - ---help--- - Support for Apple infrared remote control. All the Apple computers from - 2005 onwards include such a port, except the unibody Macbook (2009), - and Mac Pros. This receiver is also used in the Apple TV set-top box - prior to the 2010 model. - - Say Y here if you want support for Apple infrared remote control. - config HID_AUREAL tristate "Aureal" depends on USB_HID diff --git a/trunk/drivers/hid/Makefile b/trunk/drivers/hid/Makefile index cec36715a457..72d1b0bc0a97 100644 --- a/trunk/drivers/hid/Makefile +++ b/trunk/drivers/hid/Makefile @@ -39,7 +39,6 @@ endif obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o obj-$(CONFIG_HID_ACRUX) += hid-axff.o obj-$(CONFIG_HID_APPLE) += hid-apple.o -obj-$(CONFIG_HID_APPLEIR) += hid-appleir.o obj-$(CONFIG_HID_AUREAL) += hid-aureal.o obj-$(CONFIG_HID_BELKIN) += hid-belkin.o obj-$(CONFIG_HID_CHERRY) += hid-cherry.o diff --git a/trunk/drivers/hid/hid-apple.c b/trunk/drivers/hid/hid-apple.c index 5c5c57b6d59a..320a958d4139 100644 --- a/trunk/drivers/hid/hid-apple.c +++ b/trunk/drivers/hid/hid-apple.c @@ -390,6 +390,10 @@ static void apple_remove(struct hid_device *hdev) } static const struct hid_device_id apple_devices[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL), + .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4), + .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE), .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, diff --git a/trunk/drivers/hid/hid-appleir.c b/trunk/drivers/hid/hid-appleir.c deleted file mode 100644 index a42e6a394c5e..000000000000 --- a/trunk/drivers/hid/hid-appleir.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - * HID driver for the apple ir device - * - * Original driver written by James McKenzie - * Ported to recent 2.6 kernel versions by Greg Kroah-Hartman - * Updated to support newer remotes by Bastien Nocera - * Ported to HID subsystem by Benjamin Tissoires - * - * Copyright (C) 2006 James McKenzie - * Copyright (C) 2008 Greg Kroah-Hartman - * Copyright (C) 2008 Novell Inc. - * Copyright (C) 2010, 2012 Bastien Nocera - * Copyright (C) 2013 Benjamin Tissoires - * Copyright (C) 2013 Red Hat Inc. All Rights Reserved - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include "hid-ids.h" - -MODULE_AUTHOR("James McKenzie"); -MODULE_AUTHOR("Benjamin Tissoires "); -MODULE_DESCRIPTION("HID Apple IR remote controls"); -MODULE_LICENSE("GPL"); - -#define KEY_MASK 0x0F -#define TWO_PACKETS_MASK 0x40 - -/* - * James McKenzie has two devices both of which report the following - * 25 87 ee 83 0a + - * 25 87 ee 83 0c - - * 25 87 ee 83 09 << - * 25 87 ee 83 06 >> - * 25 87 ee 83 05 >" - * 25 87 ee 83 03 menu - * 26 00 00 00 00 for key repeat - */ - -/* - * Thomas Glanzmann reports the following responses - * 25 87 ee ca 0b + - * 25 87 ee ca 0d - - * 25 87 ee ca 08 << - * 25 87 ee ca 07 >> - * 25 87 ee ca 04 >" - * 25 87 ee ca 02 menu - * 26 00 00 00 00 for key repeat - * - * He also observes the following event sometimes - * sent after a key is release, which I interpret - * as a flat battery message - * 25 87 e0 ca 06 flat battery - */ - -/* - * Alexandre Karpenko reports the following responses for Device ID 0x8242 - * 25 87 ee 47 0b + - * 25 87 ee 47 0d - - * 25 87 ee 47 08 << - * 25 87 ee 47 07 >> - * 25 87 ee 47 04 >" - * 25 87 ee 47 02 menu - * 26 87 ee 47 ** for key repeat (** is the code of the key being held) - */ - -/* - * Bastien Nocera's remote - * 25 87 ee 91 5f followed by - * 25 87 ee 91 05 gives you >" - * - * 25 87 ee 91 5c followed by - * 25 87 ee 91 05 gives you the middle button - */ - -/* - * Fabien Andre's remote - * 25 87 ee a3 5e followed by - * 25 87 ee a3 04 gives you >" - * - * 25 87 ee a3 5d followed by - * 25 87 ee a3 04 gives you the middle button - */ - -static const unsigned short appleir_key_table[] = { - KEY_RESERVED, - KEY_MENU, - KEY_PLAYPAUSE, - KEY_FORWARD, - KEY_BACK, - KEY_VOLUMEUP, - KEY_VOLUMEDOWN, - KEY_RESERVED, - KEY_RESERVED, - KEY_RESERVED, - KEY_RESERVED, - KEY_RESERVED, - KEY_RESERVED, - KEY_RESERVED, - KEY_ENTER, - KEY_PLAYPAUSE, - KEY_RESERVED, -}; - -struct appleir { - struct input_dev *input_dev; - struct hid_device *hid; - unsigned short keymap[ARRAY_SIZE(appleir_key_table)]; - struct timer_list key_up_timer; /* timer for key up */ - spinlock_t lock; /* protects .current_key */ - int current_key; /* the currently pressed key */ - int prev_key_idx; /* key index in a 2 packets message */ -}; - -static int get_key(int data) -{ - /* - * The key is coded accross bits 2..9: - * - * 0x00 or 0x01 ( ) key: 0 -> KEY_RESERVED - * 0x02 or 0x03 ( menu ) key: 1 -> KEY_MENU - * 0x04 or 0x05 ( >" ) key: 2 -> KEY_PLAYPAUSE - * 0x06 or 0x07 ( >> ) key: 3 -> KEY_FORWARD - * 0x08 or 0x09 ( << ) key: 4 -> KEY_BACK - * 0x0a or 0x0b ( + ) key: 5 -> KEY_VOLUMEUP - * 0x0c or 0x0d ( - ) key: 6 -> KEY_VOLUMEDOWN - * 0x0e or 0x0f ( ) key: 7 -> KEY_RESERVED - * 0x50 or 0x51 ( ) key: 8 -> KEY_RESERVED - * 0x52 or 0x53 ( ) key: 9 -> KEY_RESERVED - * 0x54 or 0x55 ( ) key: 10 -> KEY_RESERVED - * 0x56 or 0x57 ( ) key: 11 -> KEY_RESERVED - * 0x58 or 0x59 ( ) key: 12 -> KEY_RESERVED - * 0x5a or 0x5b ( ) key: 13 -> KEY_RESERVED - * 0x5c or 0x5d ( middle ) key: 14 -> KEY_ENTER - * 0x5e or 0x5f ( >" ) key: 15 -> KEY_PLAYPAUSE - * - * Packets starting with 0x5 are part of a two-packets message, - * we notify the caller by sending a negative value. - */ - int key = (data >> 1) & KEY_MASK; - - if ((data & TWO_PACKETS_MASK)) - /* Part of a 2 packets-command */ - key = -key; - - return key; -} - -static void key_up(struct hid_device *hid, struct appleir *appleir, int key) -{ - input_report_key(appleir->input_dev, key, 0); - input_sync(appleir->input_dev); -} - -static void key_down(struct hid_device *hid, struct appleir *appleir, int key) -{ - input_report_key(appleir->input_dev, key, 1); - input_sync(appleir->input_dev); -} - -static void battery_flat(struct appleir *appleir) -{ - dev_err(&appleir->input_dev->dev, "possible flat battery?\n"); -} - -static void key_up_tick(unsigned long data) -{ - struct appleir *appleir = (struct appleir *)data; - struct hid_device *hid = appleir->hid; - unsigned long flags; - - spin_lock_irqsave(&appleir->lock, flags); - if (appleir->current_key) { - key_up(hid, appleir, appleir->current_key); - appleir->current_key = 0; - } - spin_unlock_irqrestore(&appleir->lock, flags); -} - -static int appleir_raw_event(struct hid_device *hid, struct hid_report *report, - u8 *data, int len) -{ - struct appleir *appleir = hid_get_drvdata(hid); - static const u8 keydown[] = { 0x25, 0x87, 0xee }; - static const u8 keyrepeat[] = { 0x26, }; - static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 }; - unsigned long flags; - - if (len != 5) - goto out; - - if (!memcmp(data, keydown, sizeof(keydown))) { - int index; - - spin_lock_irqsave(&appleir->lock, flags); - /* - * If we already have a key down, take it up before marking - * this one down - */ - if (appleir->current_key) - key_up(hid, appleir, appleir->current_key); - - /* Handle dual packet commands */ - if (appleir->prev_key_idx > 0) - index = appleir->prev_key_idx; - else - index = get_key(data[4]); - - if (index >= 0) { - appleir->current_key = appleir->keymap[index]; - - key_down(hid, appleir, appleir->current_key); - /* - * Remote doesn't do key up, either pull them up, in - * the test above, or here set a timer which pulls - * them up after 1/8 s - */ - mod_timer(&appleir->key_up_timer, jiffies + HZ / 8); - appleir->prev_key_idx = 0; - } else - /* Remember key for next packet */ - appleir->prev_key_idx = -index; - spin_unlock_irqrestore(&appleir->lock, flags); - goto out; - } - - appleir->prev_key_idx = 0; - - if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) { - key_down(hid, appleir, appleir->current_key); - /* - * Remote doesn't do key up, either pull them up, in the test - * above, or here set a timer which pulls them up after 1/8 s - */ - mod_timer(&appleir->key_up_timer, jiffies + HZ / 8); - goto out; - } - - if (!memcmp(data, flatbattery, sizeof(flatbattery))) { - battery_flat(appleir); - /* Fall through */ - } - -out: - /* let hidraw and hiddev handle the report */ - return 0; -} - -static void appleir_input_configured(struct hid_device *hid, - struct hid_input *hidinput) -{ - struct input_dev *input_dev = hidinput->input; - struct appleir *appleir = hid_get_drvdata(hid); - int i; - - appleir->input_dev = input_dev; - - input_dev->keycode = appleir->keymap; - input_dev->keycodesize = sizeof(unsigned short); - input_dev->keycodemax = ARRAY_SIZE(appleir->keymap); - - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - - memcpy(appleir->keymap, appleir_key_table, sizeof(appleir->keymap)); - for (i = 0; i < ARRAY_SIZE(appleir_key_table); i++) - set_bit(appleir->keymap[i], input_dev->keybit); - clear_bit(KEY_RESERVED, input_dev->keybit); -} - -static int appleir_input_mapping(struct hid_device *hid, - struct hid_input *hi, struct hid_field *field, - struct hid_usage *usage, unsigned long **bit, int *max) -{ - return -1; -} - -static int appleir_probe(struct hid_device *hid, const struct hid_device_id *id) -{ - int ret; - struct appleir *appleir; - - appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL); - if (!appleir) { - ret = -ENOMEM; - goto allocfail; - } - - appleir->hid = hid; - - spin_lock_init(&appleir->lock); - setup_timer(&appleir->key_up_timer, - key_up_tick, (unsigned long) appleir); - - hid_set_drvdata(hid, appleir); - - ret = hid_parse(hid); - if (ret) { - hid_err(hid, "parse failed\n"); - goto fail; - } - - ret = hid_hw_start(hid, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE); - if (ret) { - hid_err(hid, "hw start failed\n"); - goto fail; - } - - return 0; -fail: - kfree(appleir); -allocfail: - return ret; -} - -static void appleir_remove(struct hid_device *hid) -{ - struct appleir *appleir = hid_get_drvdata(hid); - hid_hw_stop(hid); - del_timer_sync(&appleir->key_up_timer); - kfree(appleir); -} - -static const struct hid_device_id appleir_devices[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) }, - { } -}; -MODULE_DEVICE_TABLE(hid, appleir_devices); - -static struct hid_driver appleir_driver = { - .name = "appleir", - .id_table = appleir_devices, - .raw_event = appleir_raw_event, - .input_configured = appleir_input_configured, - .probe = appleir_probe, - .remove = appleir_remove, - .input_mapping = appleir_input_mapping, -}; -module_hid_driver(appleir_driver); diff --git a/trunk/drivers/hid/hid-core.c b/trunk/drivers/hid/hid-core.c index bf434a0f813f..f86dd9708ca5 100644 --- a/trunk/drivers/hid/hid-core.c +++ b/trunk/drivers/hid/hid-core.c @@ -1260,8 +1260,6 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i struct hid_report_enum *report_enum; struct hid_driver *hdrv; struct hid_report *report; - char *buf; - unsigned int i; int ret = 0; if (!hid) @@ -1284,28 +1282,9 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i } /* Avoid unnecessary overhead if debugfs is disabled */ - if (list_empty(&hid->debug_list)) - goto nomem; - - buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC); - - if (!buf) - goto nomem; - - /* dump the report */ - snprintf(buf, HID_DEBUG_BUFSIZE - 1, - "\nreport (size %u) (%snumbered) = ", size, report_enum->numbered ? "" : "un"); - hid_debug_event(hid, buf); - - for (i = 0; i < size; i++) { - snprintf(buf, HID_DEBUG_BUFSIZE - 1, - " %02x", data[i]); - hid_debug_event(hid, buf); - } - hid_debug_event(hid, "\n"); - kfree(buf); + if (!list_empty(&hid->debug_list)) + hid_dump_report(hid, type, data, size); -nomem: report = hid_get_report(report_enum, data); if (!report) { @@ -1502,6 +1481,8 @@ static const struct hid_device_id hid_have_special_driver[] = { { 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_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_MAGICMOUSE) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) }, @@ -1525,11 +1506,6 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, diff --git a/trunk/drivers/hid/hid-debug.c b/trunk/drivers/hid/hid-debug.c index 933fff0fff1f..094cbcfe1e1a 100644 --- a/trunk/drivers/hid/hid-debug.c +++ b/trunk/drivers/hid/hid-debug.c @@ -591,6 +591,36 @@ void hid_debug_event(struct hid_device *hdev, char *buf) } EXPORT_SYMBOL_GPL(hid_debug_event); +void hid_dump_report(struct hid_device *hid, int type, u8 *data, + int size) +{ + struct hid_report_enum *report_enum; + char *buf; + unsigned int i; + + buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC); + + if (!buf) + return; + + report_enum = hid->report_enum + type; + + /* dump the report */ + snprintf(buf, HID_DEBUG_BUFSIZE - 1, + "\nreport (size %u) (%snumbered) = ", size, + report_enum->numbered ? "" : "un"); + hid_debug_event(hid, buf); + + for (i = 0; i < size; i++) { + snprintf(buf, HID_DEBUG_BUFSIZE - 1, + " %02x", data[i]); + hid_debug_event(hid, buf); + } + hid_debug_event(hid, "\n"); + kfree(buf); +} +EXPORT_SYMBOL_GPL(hid_dump_report); + void hid_dump_input(struct hid_device *hdev, struct hid_usage *usage, __s32 value) { char *buf; diff --git a/trunk/drivers/hid/hid-ids.h b/trunk/drivers/hid/hid-ids.h index 68a73740ac99..5309fd5eb0eb 100644 --- a/trunk/drivers/hid/hid-ids.h +++ b/trunk/drivers/hid/hid-ids.h @@ -137,11 +137,8 @@ #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b -#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 -#define USB_DEVICE_ID_APPLE_IRCONTROL2 0x1440 -#define USB_DEVICE_ID_APPLE_IRCONTROL3 0x8241 +#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 -#define USB_DEVICE_ID_APPLE_IRCONTROL5 0x8243 #define USB_VENDOR_ID_ASUS 0x0486 #define USB_DEVICE_ID_ASUS_T91MT 0x0185 diff --git a/trunk/include/linux/hid-debug.h b/trunk/include/linux/hid-debug.h index 53744fa1c8b7..8663f216c563 100644 --- a/trunk/include/linux/hid-debug.h +++ b/trunk/include/linux/hid-debug.h @@ -22,11 +22,12 @@ * */ -#define HID_DEBUG_BUFSIZE 512 - #ifdef CONFIG_DEBUG_FS +#define HID_DEBUG_BUFSIZE 512 + void hid_dump_input(struct hid_device *, struct hid_usage *, __s32); +void hid_dump_report(struct hid_device *, int , u8 *, int); void hid_dump_device(struct hid_device *, struct seq_file *); void hid_dump_field(struct hid_field *, int, struct seq_file *); char *hid_resolv_usage(unsigned, struct seq_file *); @@ -50,6 +51,7 @@ struct hid_debug_list { #else #define hid_dump_input(a,b,c) do { } while (0) +#define hid_dump_report(a,b,c,d) do { } while (0) #define hid_dump_device(a,b) do { } while (0) #define hid_dump_field(a,b,c) do { } while (0) #define hid_resolv_usage(a,b) do { } while (0)