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: Input: serio/gameport - use 'long' system workqueue Input: synaptics - document 0x0c query Input: tegra-kbc - add function keymap
This commit is contained in:
commit
57949e8006
|
@ -57,5 +57,6 @@ struct tegra_kbc_platform_data {
|
||||||
const struct matrix_keymap_data *keymap_data;
|
const struct matrix_keymap_data *keymap_data;
|
||||||
|
|
||||||
bool wakeup;
|
bool wakeup;
|
||||||
|
bool use_fn_map;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -360,7 +360,7 @@ static int gameport_queue_event(void *object, struct module *owner,
|
||||||
event->owner = owner;
|
event->owner = owner;
|
||||||
|
|
||||||
list_add_tail(&event->node, &gameport_event_list);
|
list_add_tail(&event->node, &gameport_event_list);
|
||||||
schedule_work(&gameport_event_work);
|
queue_work(system_long_wq, &gameport_event_work);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&gameport_event_lock, flags);
|
spin_unlock_irqrestore(&gameport_event_lock, flags);
|
||||||
|
|
|
@ -71,8 +71,9 @@ struct tegra_kbc {
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
unsigned int repoll_dly;
|
unsigned int repoll_dly;
|
||||||
unsigned long cp_dly_jiffies;
|
unsigned long cp_dly_jiffies;
|
||||||
|
bool use_fn_map;
|
||||||
const struct tegra_kbc_platform_data *pdata;
|
const struct tegra_kbc_platform_data *pdata;
|
||||||
unsigned short keycode[KBC_MAX_KEY];
|
unsigned short keycode[KBC_MAX_KEY * 2];
|
||||||
unsigned short current_keys[KBC_MAX_KPENT];
|
unsigned short current_keys[KBC_MAX_KPENT];
|
||||||
unsigned int num_pressed_keys;
|
unsigned int num_pressed_keys;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
|
@ -178,6 +179,40 @@ static const u32 tegra_kbc_default_keymap[] = {
|
||||||
KEY(15, 5, KEY_F2),
|
KEY(15, 5, KEY_F2),
|
||||||
KEY(15, 6, KEY_CAPSLOCK),
|
KEY(15, 6, KEY_CAPSLOCK),
|
||||||
KEY(15, 7, KEY_F6),
|
KEY(15, 7, KEY_F6),
|
||||||
|
|
||||||
|
/* Software Handled Function Keys */
|
||||||
|
KEY(20, 0, KEY_KP7),
|
||||||
|
|
||||||
|
KEY(21, 0, KEY_KP9),
|
||||||
|
KEY(21, 1, KEY_KP8),
|
||||||
|
KEY(21, 2, KEY_KP4),
|
||||||
|
KEY(21, 4, KEY_KP1),
|
||||||
|
|
||||||
|
KEY(22, 1, KEY_KPSLASH),
|
||||||
|
KEY(22, 2, KEY_KP6),
|
||||||
|
KEY(22, 3, KEY_KP5),
|
||||||
|
KEY(22, 4, KEY_KP3),
|
||||||
|
KEY(22, 5, KEY_KP2),
|
||||||
|
KEY(22, 7, KEY_KP0),
|
||||||
|
|
||||||
|
KEY(27, 1, KEY_KPASTERISK),
|
||||||
|
KEY(27, 3, KEY_KPMINUS),
|
||||||
|
KEY(27, 4, KEY_KPPLUS),
|
||||||
|
KEY(27, 5, KEY_KPDOT),
|
||||||
|
|
||||||
|
KEY(28, 5, KEY_VOLUMEUP),
|
||||||
|
|
||||||
|
KEY(29, 3, KEY_HOME),
|
||||||
|
KEY(29, 4, KEY_END),
|
||||||
|
KEY(29, 5, KEY_BRIGHTNESSDOWN),
|
||||||
|
KEY(29, 6, KEY_VOLUMEDOWN),
|
||||||
|
KEY(29, 7, KEY_BRIGHTNESSUP),
|
||||||
|
|
||||||
|
KEY(30, 0, KEY_NUMLOCK),
|
||||||
|
KEY(30, 1, KEY_SCROLLLOCK),
|
||||||
|
KEY(30, 2, KEY_MUTE),
|
||||||
|
|
||||||
|
KEY(31, 4, KEY_HELP),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct matrix_keymap_data tegra_kbc_default_keymap_data = {
|
static const struct matrix_keymap_data tegra_kbc_default_keymap_data = {
|
||||||
|
@ -224,6 +259,7 @@ static void tegra_kbc_report_keys(struct tegra_kbc *kbc)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int num_down = 0;
|
unsigned int num_down = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
bool fn_keypress = false;
|
||||||
|
|
||||||
spin_lock_irqsave(&kbc->lock, flags);
|
spin_lock_irqsave(&kbc->lock, flags);
|
||||||
for (i = 0; i < KBC_MAX_KPENT; i++) {
|
for (i = 0; i < KBC_MAX_KPENT; i++) {
|
||||||
|
@ -237,11 +273,28 @@ static void tegra_kbc_report_keys(struct tegra_kbc *kbc)
|
||||||
MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT);
|
MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT);
|
||||||
|
|
||||||
scancodes[num_down] = scancode;
|
scancodes[num_down] = scancode;
|
||||||
keycodes[num_down++] = kbc->keycode[scancode];
|
keycodes[num_down] = kbc->keycode[scancode];
|
||||||
|
/* If driver uses Fn map, do not report the Fn key. */
|
||||||
|
if ((keycodes[num_down] == KEY_FN) && kbc->use_fn_map)
|
||||||
|
fn_keypress = true;
|
||||||
|
else
|
||||||
|
num_down++;
|
||||||
}
|
}
|
||||||
|
|
||||||
val >>= 8;
|
val >>= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the platform uses Fn keymaps, translate keys on a Fn keypress.
|
||||||
|
* Function keycodes are KBC_MAX_KEY apart from the plain keycodes.
|
||||||
|
*/
|
||||||
|
if (fn_keypress) {
|
||||||
|
for (i = 0; i < num_down; i++) {
|
||||||
|
scancodes[i] += KBC_MAX_KEY;
|
||||||
|
keycodes[i] = kbc->keycode[scancodes[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&kbc->lock, flags);
|
spin_unlock_irqrestore(&kbc->lock, flags);
|
||||||
|
|
||||||
tegra_kbc_report_released_keys(kbc->idev,
|
tegra_kbc_report_released_keys(kbc->idev,
|
||||||
|
@ -594,8 +647,11 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
input_dev->keycode = kbc->keycode;
|
input_dev->keycode = kbc->keycode;
|
||||||
input_dev->keycodesize = sizeof(kbc->keycode[0]);
|
input_dev->keycodesize = sizeof(kbc->keycode[0]);
|
||||||
input_dev->keycodemax = ARRAY_SIZE(kbc->keycode);
|
input_dev->keycodemax = KBC_MAX_KEY;
|
||||||
|
if (pdata->use_fn_map)
|
||||||
|
input_dev->keycodemax *= 2;
|
||||||
|
|
||||||
|
kbc->use_fn_map = pdata->use_fn_map;
|
||||||
keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data;
|
keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data;
|
||||||
matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
|
matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
|
||||||
input_dev->keycode, input_dev->keybit);
|
input_dev->keycode, input_dev->keybit);
|
||||||
|
|
|
@ -51,6 +51,29 @@
|
||||||
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||||
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||||
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following describes response for the 0x0c query.
|
||||||
|
*
|
||||||
|
* byte mask name meaning
|
||||||
|
* ---- ---- ------- ------------
|
||||||
|
* 1 0x01 adjustable threshold capacitive button sensitivity
|
||||||
|
* can be adjusted
|
||||||
|
* 1 0x02 report max query 0x0d gives max coord reported
|
||||||
|
* 1 0x04 clearpad sensor is ClearPad product
|
||||||
|
* 1 0x08 advanced gesture not particularly meaningful
|
||||||
|
* 1 0x10 clickpad bit 0 1-button ClickPad
|
||||||
|
* 1 0x60 multifinger mode identifies firmware finger counting
|
||||||
|
* (not reporting!) algorithm.
|
||||||
|
* Not particularly meaningful
|
||||||
|
* 1 0x80 covered pad W clipped to 14, 15 == pad mostly covered
|
||||||
|
* 2 0x01 clickpad bit 1 2-button ClickPad
|
||||||
|
* 2 0x02 deluxe LED controls touchpad support LED commands
|
||||||
|
* ala multimedia control bar
|
||||||
|
* 2 0x04 reduced filtering firmware does less filtering on
|
||||||
|
* position data, driver should watch
|
||||||
|
* for noise.
|
||||||
|
*/
|
||||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
||||||
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
||||||
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
||||||
|
|
|
@ -299,7 +299,7 @@ static int serio_queue_event(void *object, struct module *owner,
|
||||||
event->owner = owner;
|
event->owner = owner;
|
||||||
|
|
||||||
list_add_tail(&event->node, &serio_event_list);
|
list_add_tail(&event->node, &serio_event_list);
|
||||||
schedule_work(&serio_event_work);
|
queue_work(system_long_wq, &serio_event_work);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&serio_event_lock, flags);
|
spin_unlock_irqrestore(&serio_event_lock, flags);
|
||||||
|
|
Loading…
Reference in a new issue