aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/sysrq.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-10-25 10:59:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-25 10:59:01 -0400
commit3a99c6319064af3f2e18eb929f638d555dbf7a62 (patch)
treee611927f41142123dc8efed7e07a3a91151edb01 /drivers/char/sysrq.c
parent1dfd166e93f98892aa4427069a23ed73259983c8 (diff)
parent49327ad2bbbaf1945d5ba431522201574219d150 (diff)
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 ...
Diffstat (limited to 'drivers/char/sysrq.c')
-rw-r--r--drivers/char/sysrq.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
index f3019f53e875..eaa5d3efa79d 100644
--- a/drivers/char/sysrq.c
+++ b/drivers/char/sysrq.c
@@ -566,10 +566,16 @@ static const unsigned char sysrq_xlate[KEY_MAX + 1] =
566static bool sysrq_down; 566static bool sysrq_down;
567static int sysrq_alt_use; 567static int sysrq_alt_use;
568static int sysrq_alt; 568static int sysrq_alt;
569static DEFINE_SPINLOCK(sysrq_event_lock);
569 570
570static bool sysrq_filter(struct input_handle *handle, unsigned int type, 571static bool sysrq_filter(struct input_handle *handle, unsigned int type,
571 unsigned int code, int value) 572 unsigned int code, int value)
572{ 573{
574 bool suppress;
575
576 /* We are called with interrupts disabled, just take the lock */
577 spin_lock(&sysrq_event_lock);
578
573 if (type != EV_KEY) 579 if (type != EV_KEY)
574 goto out; 580 goto out;
575 581
@@ -601,7 +607,10 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
601 } 607 }
602 608
603out: 609out:
604 return sysrq_down; 610 suppress = sysrq_down;
611 spin_unlock(&sysrq_event_lock);
612
613 return suppress;
605} 614}
606 615
607static int sysrq_connect(struct input_handler *handler, 616static int sysrq_connect(struct input_handler *handler,
@@ -652,8 +661,8 @@ static void sysrq_disconnect(struct input_handle *handle)
652} 661}
653 662
654/* 663/*
655 * We are matching on KEY_LEFTALT insteard of KEY_SYSRQ because not all 664 * We are matching on KEY_LEFTALT instead of KEY_SYSRQ because not all
656 * keyboards have SysRq ikey predefined and so user may add it to keymap 665 * keyboards have SysRq key predefined and so user may add it to keymap
657 * later, but we expect all such keyboards to have left alt. 666 * later, but we expect all such keyboards to have left alt.
658 */ 667 */
659static const struct input_device_id sysrq_ids[] = { 668static const struct input_device_id sysrq_ids[] = {