10 Jan, 2013

1 commit


09 Nov, 2012

1 commit

  • There is a demand from driver's writers to use managed devices framework
    for their drivers. Unfortunately up to this moment input devices did not
    provide support for managed devices and that lead to mixing two styles
    of resource management which usually introduced more bugs, such as
    manually unregistering input device but relying in devres to free
    interrupt handler which (unless device is properly shut off) can cause
    ISR to reference already freed memory.

    This change introduces devm_input_allocate_device() that will allocate
    managed instance of input device so that driver writers who prefer
    using devm_* framework do not have to mix 2 styles.

    Reviewed-by: Henrik Rydberg
    Reviewed-by: Tejun Heo
    Signed-off-by: Dmitry Torokhov

    Dmitry Torokhov
     

25 Oct, 2012

1 commit


09 Oct, 2012

1 commit

  • Extend the amount of character devices, such as eventX, mouseX and jsX,
    from a hard limit of 32 per input handler to about 1024 shared across
    all handlers.

    To be compatible with legacy installations input handlers will start
    creating char devices with minors in their legacy range, however once
    legacy range is exhausted they will start allocating minors from the
    dynamic range 256-1024.

    Reviewed-by: David Herrmann
    Signed-off-by: Dmitry Torokhov

    Dmitry Torokhov
     

02 Oct, 2012

1 commit


20 Sep, 2012

5 commits

  • On heavy event loads, such as a multitouch driver, the irqsoff latency
    can be as high as 250 us. By accumulating a frame worth of data
    before passing it on, the latency can be dramatically reduced. As a
    side effect, the special EV_SYN handling can be removed, since the
    frame is now atomic.

    This patch adds the events() handler callback and uses it if it
    exists. The latency is improved by 50 us even without the callback.

    Cc: Daniel Kurtz
    Tested-by: Benjamin Tissoires
    Tested-by: Ping Cheng
    Tested-by: Sedat Dilek
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     
  • Preparing to split event filtering and event passing, move the
    autorepeat function to the point where the event is actually passed.

    Tested-by: Benjamin Tissoires
    Tested-by: Ping Cheng
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     
  • For some EV_KEY types, sending a larger-than-one value causes the
    input state to oscillate. This patch makes sure this cannot happen,
    clearing up the autorepeat bypass logic in the process.

    Tested-by: Benjamin Tissoires
    Tested-by: Ping Cheng
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     
  • The events-per-packet estimate has so far been used by MT devices
    only. This patch adjusts the packet buffer size to also accomodate the
    KEY and MSC events. Keyboards normally send one or two keys at a
    time. MT devices normally send a number of button keys along with the
    MT information. The buffer size chosen here covers those cases, and
    matches the default buffer size in evdev. Since the input estimate is
    now preferred, remove the special input-mt estimate.

    Reviewed-and-tested-by: Ping Cheng
    Tested-by: Benjamin Tissoires
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     
  • Move all MT-related things to a separate place. This saves some
    bytes for non-mt input devices, and prepares for new MT features.

    Reviewed-and-tested-by: Benjamin Tissoires
    Tested-by: Ping Cheng
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     

22 Aug, 2012

1 commit


02 Feb, 2012

1 commit


04 Jan, 2012

1 commit


26 May, 2011

1 commit


12 May, 2011

1 commit


19 Apr, 2011

1 commit


19 Mar, 2011

1 commit


03 Feb, 2011

1 commit

  • This reverts commit 5fdbe44d033d059cc56c2803e6b4dbd8cb4e5e39.

    Apparently there exist userspace programs that expect to be able to
    "loop back" and distribute to readers events written into
    /dev/input/eventX and this change made for the benefit of SysRq
    handler broke them. Now that SysRq uses alternative method to suppress
    filtering of the events it re-injects we can safely revert this change.

    Reported-by: Kristen Carlson Accardi
    Cc: stable@kernel.org
    Signed-off-by: Dmitry Torokhov

    Dmitry Torokhov
     

01 Feb, 2011

1 commit


08 Jan, 2011

1 commit

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (58 commits)
    Input: wacom_w8001 - support pen or touch only devices
    Input: wacom_w8001 - use __set_bit to set keybits
    Input: bu21013_ts - fix misuse of logical operation in place of bitop
    Input: i8042 - add Acer Aspire 5100 to the Dritek list
    Input: wacom - add support for digitizer in Lenovo W700
    Input: psmouse - disable the synaptics extension on OLPC machines
    Input: psmouse - fix up Synaptics comment
    Input: synaptics - ignore bogus mt packet
    Input: synaptics - add multi-finger and semi-mt support
    Input: synaptics - report clickpad property
    input: mt: Document interface updates
    Input: fix double equality sign in uevent
    Input: introduce device properties
    hid: egalax: Add support for Wetab (726b)
    Input: include MT library as source for kerneldoc
    MAINTAINERS: Update input-mt entry
    hid: egalax: Add support for Samsung NB30 netbook
    hid: egalax: Document the new devices in Kconfig
    hid: egalax: Add support for Wetab
    hid: egalax: Convert to MT slots
    ...

    Fixed up trivial conflict in drivers/input/keyboard/Kconfig

    Linus Torvalds
     

07 Jan, 2011

1 commit


28 Dec, 2010

1 commit


20 Dec, 2010

2 commits

  • Looking at the uevent stream for input devices, all properties are on
    the form "A=B" except the bitmap values, which are on the form
    "A==B". This bug has been around at least since 2007, and the input
    uevent code has been untouched since. The recent addition of device
    properties suggests this is a good time for a remedy.

    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     
  • Today, userspace sets up an input device based on the data it emits.
    This is not always enough; a tablet and a touchscreen may emit exactly
    the same data, for instance, but the former should be set up with a
    pointer whereas the latter does not need to. Recently, a new type of
    touchpad has emerged where the buttons are under the pad, which
    changes logic without changing the emitted data. This patch introduces
    a new ioctl, EVIOCGPROP, which enables user access to a set of device
    properties useful during setup. The properties are given as a bitmap
    in the same fashion as the event types, and are also made available
    via sysfs, uevent and /proc/bus/input/devices.

    Acked-by: Ping Cheng
    Acked-by: Chase Douglas
    Acked-by: Dmitry Torokhov
    Signed-off-by: Henrik Rydberg

    Henrik Rydberg
     

17 Dec, 2010

1 commit


16 Dec, 2010

1 commit


01 Dec, 2010

1 commit


20 Nov, 2010

1 commit


19 Nov, 2010

1 commit


18 Nov, 2010

1 commit


11 Nov, 2010

1 commit

  • Sometimes input handlers (as opposed to input devices) have a need to
    inject (or re-inject) events back into input core. For example sysrq
    filter may want to inject previously suppressed Alt-SysRq so that user
    can take a screen print. In this case we do not want to pass such events
    back to the same same handler that injected them to avoid loops.

    Signed-off-by: Dmitry Torokhov

    Dmitry Torokhov
     

04 Nov, 2010

1 commit

  • KGDB, much like the resume process, needs to be able to mark all keys that
    were pressed at the time we dropped into the debuggers as "released", since
    it is unlikely that the keys stay pressed for the entire duration of the
    debug session.

    Also we need to make sure that input_reset_device() and input_dev_suspend()
    only attempt to change state of currenlt opened devices since closed devices
    may not be ready to accept IO requests.

    Tested-by: Jason Wessel
    Signed-off-by: Dmitry Torokhov

    Dmitry Torokhov
     

25 Oct, 2010

1 commit

  • * '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
    ...

    Linus Torvalds
     

15 Oct, 2010

1 commit

  • All file_operations should get a .llseek operation so we can make
    nonseekable_open the default for future file operations without a
    .llseek pointer.

    The three cases that we can automatically detect are no_llseek, seq_lseek
    and default_llseek. For cases where we can we can automatically prove that
    the file offset is always ignored, we use noop_llseek, which maintains
    the current behavior of not returning an error from a seek.

    New drivers should normally not use noop_llseek but instead use no_llseek
    and call nonseekable_open at open time. Existing drivers can be converted
    to do the same when the maintainer knows for certain that no user code
    relies on calling seek on the device file.

    The generated code is often incorrectly indented and right now contains
    comments that clarify for each added line why a specific variant was
    chosen. In the version that gets submitted upstream, the comments will
    be gone and I will manually fix the indentation, because there does not
    seem to be a way to do that using coccinelle.

    Some amount of new code is currently sitting in linux-next that should get
    the same modifications, which I will do at the end of the merge window.

    Many thanks to Julia Lawall for helping me learn to write a semantic
    patch that does all this.

    ===== begin semantic patch =====
    // This adds an llseek= method to all file operations,
    // as a preparation for making no_llseek the default.
    //
    // The rules are
    // - use no_llseek explicitly if we do nonseekable_open
    // - use seq_lseek for sequential files
    // - use default_llseek if we know we access f_pos
    // - use noop_llseek if we know we don't access f_pos,
    // but we still want to allow users to call lseek
    //
    @ open1 exists @
    identifier nested_open;
    @@
    nested_open(...)
    {

    }

    @ open exists@
    identifier open_f;
    identifier i, f;
    identifier open1.nested_open;
    @@
    int open_f(struct inode *i, struct file *f)
    {

    }

    @ read disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {

    }

    @ read_no_fpos disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ write @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {

    }

    @ write_no_fpos @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ fops0 @
    identifier fops;
    @@
    struct file_operations fops = {
    ...
    };

    @ has_llseek depends on fops0 @
    identifier fops0.fops;
    identifier llseek_f;
    @@
    struct file_operations fops = {
    ...
    .llseek = llseek_f,
    ...
    };

    @ has_read depends on fops0 @
    identifier fops0.fops;
    identifier read_f;
    @@
    struct file_operations fops = {
    ...
    .read = read_f,
    ...
    };

    @ has_write depends on fops0 @
    identifier fops0.fops;
    identifier write_f;
    @@
    struct file_operations fops = {
    ...
    .write = write_f,
    ...
    };

    @ has_open depends on fops0 @
    identifier fops0.fops;
    identifier open_f;
    @@
    struct file_operations fops = {
    ...
    .open = open_f,
    ...
    };

    // use no_llseek if we call nonseekable_open
    ////////////////////////////////////////////
    @ nonseekable1 depends on !has_llseek && has_open @
    identifier fops0.fops;
    identifier nso ~= "nonseekable_open";
    @@
    struct file_operations fops = {
    ... .open = nso, ...
    +.llseek = no_llseek, /* nonseekable */
    };

    @ nonseekable2 depends on !has_llseek @
    identifier fops0.fops;
    identifier open.open_f;
    @@
    struct file_operations fops = {
    ... .open = open_f, ...
    +.llseek = no_llseek, /* open uses nonseekable */
    };

    // use seq_lseek for sequential files
    /////////////////////////////////////
    @ seq depends on !has_llseek @
    identifier fops0.fops;
    identifier sr ~= "seq_read";
    @@
    struct file_operations fops = {
    ... .read = sr, ...
    +.llseek = seq_lseek, /* we have seq_read */
    };

    // use default_llseek if there is a readdir
    ///////////////////////////////////////////
    @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier readdir_e;
    @@
    // any other fop is used that changes pos
    struct file_operations fops = {
    ... .readdir = readdir_e, ...
    +.llseek = default_llseek, /* readdir is present */
    };

    // use default_llseek if at least one of read/write touches f_pos
    /////////////////////////////////////////////////////////////////
    @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read.read_f;
    @@
    // read fops use offset
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = default_llseek, /* read accesses f_pos */
    };

    @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ... .write = write_f, ...
    + .llseek = default_llseek, /* write accesses f_pos */
    };

    // Use noop_llseek if neither read nor write accesses f_pos
    ///////////////////////////////////////////////////////////

    @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    identifier write_no_fpos.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ...
    .write = write_f,
    .read = read_f,
    ...
    +.llseek = noop_llseek, /* read and write both use no f_pos */
    };

    @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write_no_fpos.write_f;
    @@
    struct file_operations fops = {
    ... .write = write_f, ...
    +.llseek = noop_llseek, /* write uses no f_pos */
    };

    @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    @@
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = noop_llseek, /* read uses no f_pos */
    };

    @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    @@
    struct file_operations fops = {
    ...
    +.llseek = noop_llseek, /* no read or write fn */
    };
    ===== End semantic patch =====

    Signed-off-by: Arnd Bergmann
    Cc: Julia Lawall
    Cc: Christoph Hellwig

    Arnd Bergmann
     

10 Sep, 2010

1 commit

  • Several devices use a high number of bits for scancodes. One important
    group is the Remote Controllers. Some new protocols like RC-6 define a
    scancode space of 64 bits.

    The current EVIO[CS]GKEYCODE ioctls allow replace the scancode/keycode
    translation tables, but it is limited to up to 32 bits for scancode.

    Also, if userspace wants to clean the existing table, replacing it by
    a new one, it needs to run a loop calling the ioctls over the entire
    sparse scancode space.

    To solve those problems, this patch extends the ioctls to allow drivers
    handle scancodes up to 32 bytes long (the length could be extended in
    the future should such need arise) and allow userspace to query and set
    scancode to keycode mappings not only by scancode but also by index.

    Compatibility code were also added to handle the old format of
    EVIO[CS]GKEYCODE ioctls.

    Folded fixes by:
    - Dan Carpenter: locking fixes for the original implementation
    - Jarod Wilson: fix crash when setting keycode and wiring up get/set
    handlers in original implementation.
    - Dmitry Torokhov: rework to consolidate old and new scancode handling,
    provide options to act either by index or scancode.

    Signed-off-by: Mauro Carvalho Chehab
    Signed-off-by: Dan Carpenter
    Signed-off-by: Jarod Wilson
    Signed-off-by: Dmitry Torokhov

    Mauro Carvalho Chehab
     

06 Sep, 2010

1 commit


29 Aug, 2010

1 commit

  • For MT slots, the ABS_MT_TRACKING_ID determines whether a slot is in use,
    but currently leaves initialization up to the drivers. This patch sets the
    slot state to unused upon creation.

    Signed-off-by: Henrik Rydberg
    Signed-off-by: Dmitry Torokhov

    Henrik Rydberg
     

03 Aug, 2010

2 commits

  • As all callers are now changed to only use the input_abs_*() access
    helpers, switching over to dynamically allocated ABS information is
    easy. This reduces size of struct input_dev from 3152 to 1640 on
    64 bit architectures.

    Signed-off-by: Daniel Mack
    Signed-off-by: Dmitry Torokhov

    Daniel Mack
     
  • Change all call sites in drivers/input to not access the ABS axis
    information directly anymore. Make them use the access helpers instead.

    Also use input_set_abs_params() when possible.
    Did some code refactoring as I was on it.

    Signed-off-by: Daniel Mack
    Cc: Dmitry Torokhov
    Signed-off-by: Dmitry Torokhov

    Daniel Mack
     

16 Jul, 2010

1 commit