Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 20 May 2010 17:33:06 +0000 (10:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 20 May 2010 17:33:06 +0000 (10:33 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (40 commits)
  Input: psmouse - small formatting changes to better follow coding style
  Input: synaptics - set dimensions as reported by firmware
  Input: elantech - relax signature checks
  Input: elantech - enforce common prefix on messages
  Input: wistron_btns - switch to using kmemdup()
  Input: usbtouchscreen - switch to using kmemdup()
  Input: do not force selecting i8042 on Moorestown
  Input: Documentation/sysrq.txt - update KEY_SYSRQ info
  Input: 88pm860x_onkey - remove invalid irq number assignment
  Input: i8042 - add a PNP entry to the aux device list
  Input: i8042 - add some extra PNP keyboard types
  Input: wm9712 - fix wm97xx_set_gpio() logic
  Input: add keypad driver for keys interfaced to TCA6416
  Input: remove obsolete {corgi,spitz,tosa}kbd.c
  Input: kbtab - do not advertise unsupported events
  Input: kbtab - simplify kbtab_disconnect()
  Input: kbtab - fix incorrect size parameter in usb_buffer_free
  Input: acecad - don't advertise mouse events
  Input: acecad - fix some formatting issues
  Input: acecad - simplify usb_acecad_disconnect()
  ...

Trivial conflict in Documentation/feature-removal-schedule.txt

1  2 
drivers/char/sysrq.c
drivers/input/touchscreen/Kconfig
kernel/sysctl.c

diff --combined drivers/char/sysrq.c
@@@ -1,7 -1,4 +1,4 @@@
- /* -*- linux-c -*-
-  *
-  *    $Id: sysrq.c,v 1.15 1998/08/23 14:56:41 mj Exp $
-  *
+ /*
   *    Linux Magic System Request Key Hacks
   *
   *    (c) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
@@@ -10,8 -7,13 +7,13 @@@
   *    (c) 2000 Crutcher Dunnavant <crutcher+kernel@datastacks.com>
   *    overhauled to use key registration
   *    based upon discusions in irc://irc.openprojects.net/#kernelnewbies
+  *
+  *    Copyright (c) 2010 Dmitry Torokhov
+  *    Input handler conversion
   */
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/sched.h>
  #include <linux/interrupt.h>
  #include <linux/mm.h>
  #include <linux/hrtimer.h>
  #include <linux/oom.h>
  #include <linux/slab.h>
+ #include <linux/input.h>
  
  #include <asm/ptrace.h>
  #include <asm/irq_regs.h>
  
  /* Whether we react on sysrq keys or just ignore them */
- int __read_mostly __sysrq_enabled = 1;
- static int __read_mostly sysrq_always_enabled;
+ static int __read_mostly sysrq_enabled = 1;
+ static bool __read_mostly sysrq_always_enabled;
  
int sysrq_on(void)
static bool sysrq_on(void)
  {
-       return __sysrq_enabled || sysrq_always_enabled;
+       return sysrq_enabled || sysrq_always_enabled;
  }
  
  /*
   * A value of 1 means 'all', other nonzero values are an op mask:
   */
- static inline int sysrq_on_mask(int mask)
+ static bool sysrq_on_mask(int mask)
  {
-       return sysrq_always_enabled || __sysrq_enabled == 1 ||
-                                               (__sysrq_enabled & mask);
+       return sysrq_always_enabled ||
+              sysrq_enabled == 1 ||
+              (sysrq_enabled & mask);
  }
  
  static int __init sysrq_always_enabled_setup(char *str)
  {
-       sysrq_always_enabled = 1;
-       printk(KERN_INFO "debug: sysrq always enabled.\n");
+       sysrq_always_enabled = true;
+       pr_info("sysrq always enabled.\n");
  
        return 1;
  }
@@@ -76,6 -79,7 +79,7 @@@ __setup("sysrq_always_enabled", sysrq_a
  static void sysrq_handle_loglevel(int key, struct tty_struct *tty)
  {
        int i;
        i = key - '0';
        console_loglevel = 7;
        printk("Loglevel set to %d\n", i);
@@@ -101,7 -105,7 +105,7 @@@ static struct sysrq_key_op sysrq_SAK_o
        .enable_mask    = SYSRQ_ENABLE_KEYBOARD,
  };
  #else
- #define sysrq_SAK_op (*(struct sysrq_key_op *)0)
+ #define sysrq_SAK_op (*(struct sysrq_key_op *)NULL)
  #endif
  
  #ifdef CONFIG_VT
@@@ -119,7 -123,7 +123,7 @@@ static struct sysrq_key_op sysrq_unraw_
        .enable_mask    = SYSRQ_ENABLE_KEYBOARD,
  };
  #else
- #define sysrq_unraw_op (*(struct sysrq_key_op *)0)
+ #define sysrq_unraw_op (*(struct sysrq_key_op *)NULL)
  #endif /* CONFIG_VT */
  
  static void sysrq_handle_crash(int key, struct tty_struct *tty)
@@@ -195,7 -199,7 +199,7 @@@ static struct sysrq_key_op sysrq_showlo
        .action_msg     = "Show Locks Held",
  };
  #else
- #define sysrq_showlocks_op (*(struct sysrq_key_op *)0)
+ #define sysrq_showlocks_op (*(struct sysrq_key_op *)NULL)
  #endif
  
  #ifdef CONFIG_SMP
@@@ -289,7 -293,7 +293,7 @@@ static struct sysrq_key_op sysrq_showst
  
  static void sysrq_ftrace_dump(int key, struct tty_struct *tty)
  {
 -      ftrace_dump();
 +      ftrace_dump(DUMP_ALL);
  }
  static struct sysrq_key_op sysrq_ftrace_dump_op = {
        .handler        = sysrq_ftrace_dump,
        .enable_mask    = SYSRQ_ENABLE_DUMP,
  };
  #else
- #define sysrq_ftrace_dump_op (*(struct sysrq_key_op *)0)
+ #define sysrq_ftrace_dump_op (*(struct sysrq_key_op *)NULL)
  #endif
  
  static void sysrq_handle_showmem(int key, struct tty_struct *tty)
@@@ -477,6 -481,7 +481,7 @@@ struct sysrq_key_op *__sysrq_get_key_op
        i = sysrq_key_table_key2index(key);
        if (i != -1)
                op_p = sysrq_key_table[i];
          return op_p;
  }
  
@@@ -488,11 -493,7 +493,7 @@@ static void __sysrq_put_key_op(int key
                  sysrq_key_table[i] = op_p;
  }
  
- /*
-  * This is the non-locking version of handle_sysrq.  It must/can only be called
-  * by sysrq key handlers, as they are inside of the lock
-  */
- void __handle_sysrq(int key, struct tty_struct *tty, int check_mask)
+ static void __handle_sysrq(int key, struct tty_struct *tty, int check_mask)
  {
        struct sysrq_key_op *op_p;
        int orig_log_level;
        spin_unlock_irqrestore(&sysrq_key_table_lock, flags);
  }
  
- /*
-  * This function is called by the keyboard handler when SysRq is pressed
-  * and any other keycode arrives.
-  */
  void handle_sysrq(int key, struct tty_struct *tty)
  {
        if (sysrq_on())
  }
  EXPORT_SYMBOL(handle_sysrq);
  
+ #ifdef CONFIG_INPUT
+ /* Simple translation table for the SysRq keys */
+ static const unsigned char sysrq_xlate[KEY_MAX + 1] =
+         "\000\0331234567890-=\177\t"                    /* 0x00 - 0x0f */
+         "qwertyuiop[]\r\000as"                          /* 0x10 - 0x1f */
+         "dfghjkl;'`\000\\zxcv"                          /* 0x20 - 0x2f */
+         "bnm,./\000*\000 \000\201\202\203\204\205"      /* 0x30 - 0x3f */
+         "\206\207\210\211\212\000\000789-456+1"         /* 0x40 - 0x4f */
+         "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
+         "\r\000/";                                      /* 0x60 - 0x6f */
+ static bool sysrq_down;
+ static int sysrq_alt_use;
+ static int sysrq_alt;
+ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
+                        unsigned int code, int value)
+ {
+       if (type != EV_KEY)
+               goto out;
+       switch (code) {
+       case KEY_LEFTALT:
+       case KEY_RIGHTALT:
+               if (value)
+                       sysrq_alt = code;
+               else if (sysrq_down && code == sysrq_alt_use)
+                       sysrq_down = false;
+               break;
+       case KEY_SYSRQ:
+               if (value == 1 && sysrq_alt) {
+                       sysrq_down = true;
+                       sysrq_alt_use = sysrq_alt;
+               }
+               break;
+       default:
+               if (sysrq_down && value && value != 2)
+                       __handle_sysrq(sysrq_xlate[code], NULL, 1);
+               break;
+       }
+ out:
+       return sysrq_down;
+ }
+ static int sysrq_connect(struct input_handler *handler,
+                        struct input_dev *dev,
+                        const struct input_device_id *id)
+ {
+       struct input_handle *handle;
+       int error;
+       sysrq_down = false;
+       sysrq_alt = 0;
+       handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
+       if (!handle)
+               return -ENOMEM;
+       handle->dev = dev;
+       handle->handler = handler;
+       handle->name = "sysrq";
+       error = input_register_handle(handle);
+       if (error) {
+               pr_err("Failed to register input sysrq handler, error %d\n",
+                       error);
+               goto err_free;
+       }
+       error = input_open_device(handle);
+       if (error) {
+               pr_err("Failed to open input device, error %d\n", error);
+               goto err_unregister;
+       }
+       return 0;
+  err_unregister:
+       input_unregister_handle(handle);
+  err_free:
+       kfree(handle);
+       return error;
+ }
+ static void sysrq_disconnect(struct input_handle *handle)
+ {
+       input_close_device(handle);
+       input_unregister_handle(handle);
+       kfree(handle);
+ }
+ /*
+  * We are matching on KEY_LEFTALT insteard of KEY_SYSRQ because not all
+  * keyboards have SysRq ikey predefined and so user may add it to keymap
+  * later, but we expect all such keyboards to have left alt.
+  */
+ static const struct input_device_id sysrq_ids[] = {
+       {
+               .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
+                               INPUT_DEVICE_ID_MATCH_KEYBIT,
+               .evbit = { BIT_MASK(EV_KEY) },
+               .keybit = { BIT_MASK(KEY_LEFTALT) },
+       },
+       { },
+ };
+ static struct input_handler sysrq_handler = {
+       .filter         = sysrq_filter,
+       .connect        = sysrq_connect,
+       .disconnect     = sysrq_disconnect,
+       .name           = "sysrq",
+       .id_table       = sysrq_ids,
+ };
+ static bool sysrq_handler_registered;
+ static inline void sysrq_register_handler(void)
+ {
+       int error;
+       error = input_register_handler(&sysrq_handler);
+       if (error)
+               pr_err("Failed to register input handler, error %d", error);
+       else
+               sysrq_handler_registered = true;
+ }
+ static inline void sysrq_unregister_handler(void)
+ {
+       if (sysrq_handler_registered) {
+               input_unregister_handler(&sysrq_handler);
+               sysrq_handler_registered = false;
+       }
+ }
+ #else
+ static inline void sysrq_register_handler(void)
+ {
+ }
+ static inline void sysrq_unregister_handler(void)
+ {
+ }
+ #endif /* CONFIG_INPUT */
+ int sysrq_toggle_support(int enable_mask)
+ {
+       bool was_enabled = sysrq_on();
+       sysrq_enabled = enable_mask;
+       if (was_enabled != sysrq_on()) {
+               if (sysrq_on())
+                       sysrq_register_handler();
+               else
+                       sysrq_unregister_handler();
+       }
+       return 0;
+ }
  static int __sysrq_swap_key_ops(int key, struct sysrq_key_op *insert_op_p,
                                  struct sysrq_key_op *remove_op_p)
  {
        int retval;
        unsigned long flags;
  
@@@ -599,6 -763,7 +763,7 @@@ static ssize_t write_sysrq_trigger(stru
                        return -EFAULT;
                __handle_sysrq(c, NULL, 0);
        }
        return count;
  }
  
@@@ -606,10 -771,28 +771,28 @@@ static const struct file_operations pro
        .write          = write_sysrq_trigger,
  };
  
+ static void sysrq_init_procfs(void)
+ {
+       if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
+                        &proc_sysrq_trigger_operations))
+               pr_err("Failed to register proc interface\n");
+ }
+ #else
+ static inline void sysrq_init_procfs(void)
+ {
+ }
+ #endif /* CONFIG_PROC_FS */
  static int __init sysrq_init(void)
  {
-       proc_create("sysrq-trigger", S_IWUSR, NULL, &proc_sysrq_trigger_operations);
+       sysrq_init_procfs();
+       if (sysrq_on())
+               sysrq_register_handler();
        return 0;
  }
  module_init(sysrq_init);
- #endif
@@@ -119,6 -119,18 +119,18 @@@ config TOUCHSCREEN_DYNAPR
          To compile this driver as a module, choose M here: the
          module will be called dynapro.
  
+ config TOUCHSCREEN_HAMPSHIRE
+       tristate "Hampshire serial touchscreen"
+       select SERIO
+       help
+         Say Y here if you have a Hampshire serial touchscreen connected to
+         your system.
+         If unsure, say N.
+         To compile this driver as a module, choose M here: the
+         module will be called hampshire.
  config TOUCHSCREEN_EETI
        tristate "EETI touchscreen panel support"
        depends on I2C
@@@ -142,8 -154,8 +154,8 @@@ config TOUCHSCREEN_FUJITS
          module will be called fujitsu-ts.
  
  config TOUCHSCREEN_S3C2410
 -      tristate "Samsung S3C2410 touchscreen input driver"
 -      depends on ARCH_S3C2410
 +      tristate "Samsung S3C2410/generic touchscreen input driver"
 +      depends on ARCH_S3C2410 || SAMSUNG_DEV_TS
        select S3C24XX_ADC
        help
          Say Y here if you have the s3c2410 touchscreen.
diff --combined kernel/sysctl.c
@@@ -163,6 -163,27 +163,27 @@@ static int proc_taint(struct ctl_table 
                               void __user *buffer, size_t *lenp, loff_t *ppos);
  #endif
  
+ #ifdef CONFIG_MAGIC_SYSRQ
+ static int __sysrq_enabled; /* Note: sysrq code ises it's own private copy */
+ static int sysrq_sysctl_handler(ctl_table *table, int write,
+                               void __user *buffer, size_t *lenp,
+                               loff_t *ppos)
+ {
+       int error;
+       error = proc_dointvec(table, write, buffer, lenp, ppos);
+       if (error)
+               return error;
+       if (write)
+               sysrq_toggle_support(__sysrq_enabled);
+       return 0;
+ }
+ #endif
  static struct ctl_table root_table[];
  static struct ctl_table_root sysctl_table_root;
  static struct ctl_table_header root_table_header = {
@@@ -567,7 -588,7 +588,7 @@@ static struct ctl_table kern_table[] = 
                .data           = &__sysrq_enabled,
                .maxlen         = sizeof (int),
                .mode           = 0644,
-               .proc_handler   = proc_dointvec,
+               .proc_handler   = sysrq_sysctl_handler,
        },
  #endif
  #ifdef CONFIG_PROC_SYSCTL
  #endif
        {
                .procname       = "userprocess_debug",
 -              .data           = &sysctl_userprocess_debug,
 +              .data           = &show_unhandled_signals,
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
@@@ -1431,8 -1452,7 +1452,8 @@@ static struct ctl_table fs_table[] = 
  };
  
  static struct ctl_table debug_table[] = {
 -#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC)
 +#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) || \
 +    defined(CONFIG_S390)
        {
                .procname       = "exception-trace",
                .data           = &show_unhandled_signals,