mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (75 commits) Input: wacom - specify Cinitq supported tools Input: ab8500-ponkey - fix IRQ freeing in error path Input: adp5588-keys - use more obvious i2c_device_id name string Input: ad7877 - switch to using threaded IRQ Input: ad7877 - use attribute group to control visibility of attributes Input: serio - add support for PS2Mult multiplexer protocol Input: wacom - properly enable runtime PM Input: ad7877 - filter events where pressure is beyond the maximum Input: ad7877 - implement EV_KEY:BTN_TOUCH reporting Input: ad7877 - implement specified chip select behavior Input: hp680_ts_input - use cancel_delayed_work_sync() Input: mousedev - correct lockdep annotation Input: ads7846 - switch to using threaded IRQ Input: serio - support multiple child devices per single parent Input: synaptics - simplify pass-through port handling Input: add ROHM BU21013 touch panel controller support Input: omap4-keypad - wake-up on events & long presses Input: omap4-keypad - fix interrupt line configuration Input: omap4-keypad - SYSCONFIG register configuration Input: omap4-keypad - use platform device helpers ...
This commit is contained in:
commit
3a99c63190
75 changed files with 5781 additions and 1845 deletions
|
|
@ -1780,6 +1780,11 @@ static bool hid_ignore(struct hid_device *hdev)
|
|||
hdev->product <= USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST)
|
||||
return true;
|
||||
break;
|
||||
case USB_VENDOR_ID_HANWANG:
|
||||
if (hdev->product >= USB_DEVICE_ID_HANWANG_TABLET_FIRST &&
|
||||
hdev->product <= USB_DEVICE_ID_HANWANG_TABLET_LAST)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (hdev->type == HID_TYPE_USBMOUSE &&
|
||||
|
|
|
|||
|
|
@ -299,6 +299,10 @@
|
|||
#define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003
|
||||
#define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008
|
||||
|
||||
#define USB_VENDOR_ID_HANWANG 0x0b57
|
||||
#define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000
|
||||
#define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff
|
||||
|
||||
#define USB_VENDOR_ID_HAPP 0x078b
|
||||
#define USB_DEVICE_ID_UGCI_DRIVING 0x0010
|
||||
#define USB_DEVICE_ID_UGCI_FLYING 0x0020
|
||||
|
|
|
|||
|
|
@ -68,39 +68,52 @@ static const struct {
|
|||
#define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \
|
||||
&max, EV_KEY, (c))
|
||||
|
||||
static inline int match_scancode(unsigned int code, unsigned int scancode)
|
||||
static bool match_scancode(struct hid_usage *usage,
|
||||
unsigned int cur_idx, unsigned int scancode)
|
||||
{
|
||||
if (scancode == 0)
|
||||
return 1;
|
||||
|
||||
return (code & (HID_USAGE_PAGE | HID_USAGE)) == scancode;
|
||||
return (usage->hid & (HID_USAGE_PAGE | HID_USAGE)) == scancode;
|
||||
}
|
||||
|
||||
static inline int match_keycode(unsigned int code, unsigned int keycode)
|
||||
static bool match_keycode(struct hid_usage *usage,
|
||||
unsigned int cur_idx, unsigned int keycode)
|
||||
{
|
||||
if (keycode == 0)
|
||||
return 1;
|
||||
|
||||
return code == keycode;
|
||||
/*
|
||||
* We should exclude unmapped usages when doing lookup by keycode.
|
||||
*/
|
||||
return (usage->type == EV_KEY && usage->code == keycode);
|
||||
}
|
||||
|
||||
static bool match_index(struct hid_usage *usage,
|
||||
unsigned int cur_idx, unsigned int idx)
|
||||
{
|
||||
return cur_idx == idx;
|
||||
}
|
||||
|
||||
typedef bool (*hid_usage_cmp_t)(struct hid_usage *usage,
|
||||
unsigned int cur_idx, unsigned int val);
|
||||
|
||||
static struct hid_usage *hidinput_find_key(struct hid_device *hid,
|
||||
unsigned int scancode,
|
||||
unsigned int keycode)
|
||||
hid_usage_cmp_t match,
|
||||
unsigned int value,
|
||||
unsigned int *usage_idx)
|
||||
{
|
||||
int i, j, k;
|
||||
unsigned int i, j, k, cur_idx = 0;
|
||||
struct hid_report *report;
|
||||
struct hid_usage *usage;
|
||||
|
||||
for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
|
||||
list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
|
||||
for (i = 0; i < report->maxfield; i++) {
|
||||
for ( j = 0; j < report->field[i]->maxusage; j++) {
|
||||
for (j = 0; j < report->field[i]->maxusage; j++) {
|
||||
usage = report->field[i]->usage + j;
|
||||
if (usage->type == EV_KEY &&
|
||||
match_scancode(usage->hid, scancode) &&
|
||||
match_keycode(usage->code, keycode))
|
||||
return usage;
|
||||
if (usage->type == EV_KEY || usage->type == 0) {
|
||||
if (match(usage, cur_idx, value)) {
|
||||
if (usage_idx)
|
||||
*usage_idx = cur_idx;
|
||||
return usage;
|
||||
}
|
||||
cur_idx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -108,39 +121,68 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct hid_usage *hidinput_locate_usage(struct hid_device *hid,
|
||||
const struct input_keymap_entry *ke,
|
||||
unsigned int *index)
|
||||
{
|
||||
struct hid_usage *usage;
|
||||
unsigned int scancode;
|
||||
|
||||
if (ke->flags & INPUT_KEYMAP_BY_INDEX)
|
||||
usage = hidinput_find_key(hid, match_index, ke->index, index);
|
||||
else if (input_scancode_to_scalar(ke, &scancode) == 0)
|
||||
usage = hidinput_find_key(hid, match_scancode, scancode, index);
|
||||
else
|
||||
usage = NULL;
|
||||
|
||||
return usage;
|
||||
}
|
||||
|
||||
static int hidinput_getkeycode(struct input_dev *dev,
|
||||
unsigned int scancode, unsigned int *keycode)
|
||||
struct input_keymap_entry *ke)
|
||||
{
|
||||
struct hid_device *hid = input_get_drvdata(dev);
|
||||
struct hid_usage *usage;
|
||||
unsigned int scancode, index;
|
||||
|
||||
usage = hidinput_find_key(hid, scancode, 0);
|
||||
usage = hidinput_locate_usage(hid, ke, &index);
|
||||
if (usage) {
|
||||
*keycode = usage->code;
|
||||
ke->keycode = usage->type == EV_KEY ?
|
||||
usage->code : KEY_RESERVED;
|
||||
ke->index = index;
|
||||
scancode = usage->hid & (HID_USAGE_PAGE | HID_USAGE);
|
||||
ke->len = sizeof(scancode);
|
||||
memcpy(ke->scancode, &scancode, sizeof(scancode));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int hidinput_setkeycode(struct input_dev *dev,
|
||||
unsigned int scancode, unsigned int keycode)
|
||||
const struct input_keymap_entry *ke,
|
||||
unsigned int *old_keycode)
|
||||
{
|
||||
struct hid_device *hid = input_get_drvdata(dev);
|
||||
struct hid_usage *usage;
|
||||
int old_keycode;
|
||||
|
||||
usage = hidinput_find_key(hid, scancode, 0);
|
||||
usage = hidinput_locate_usage(hid, ke, NULL);
|
||||
if (usage) {
|
||||
old_keycode = usage->code;
|
||||
usage->code = keycode;
|
||||
*old_keycode = usage->type == EV_KEY ?
|
||||
usage->code : KEY_RESERVED;
|
||||
usage->code = ke->keycode;
|
||||
|
||||
clear_bit(old_keycode, dev->keybit);
|
||||
clear_bit(*old_keycode, dev->keybit);
|
||||
set_bit(usage->code, dev->keybit);
|
||||
dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n", keycode, scancode);
|
||||
/* Set the keybit for the old keycode if the old keycode is used
|
||||
* by another key */
|
||||
if (hidinput_find_key (hid, 0, old_keycode))
|
||||
set_bit(old_keycode, dev->keybit);
|
||||
dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n",
|
||||
usage->code, usage->hid);
|
||||
|
||||
/*
|
||||
* Set the keybit for the old keycode if the old keycode is used
|
||||
* by another key
|
||||
*/
|
||||
if (hidinput_find_key(hid, match_keycode, *old_keycode, NULL))
|
||||
set_bit(*old_keycode, dev->keybit);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -835,8 +877,8 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
|
|||
hid->ll_driver->hidinput_input_event;
|
||||
input_dev->open = hidinput_open;
|
||||
input_dev->close = hidinput_close;
|
||||
input_dev->setkeycode = hidinput_setkeycode;
|
||||
input_dev->getkeycode = hidinput_getkeycode;
|
||||
input_dev->setkeycode_new = hidinput_setkeycode;
|
||||
input_dev->getkeycode_new = hidinput_getkeycode;
|
||||
|
||||
input_dev->name = hid->name;
|
||||
input_dev->phys = hid->phys;
|
||||
|
|
|
|||
Loading…
Reference in a new issue