• Arnd Bergmann's avatar
    ideapad-laptop: add support for Yoga 3 ESC key · 74caab99
    Arnd Bergmann authored
    The ideapad-laptop handles most special keys on various Lenovo Laptops
    including the Yoga line. Unfortunately, the Yoga 3 11/13/14 models have
    one important exception, which is the Fn-ESC combination.
    
    On other Lenovo Laptops, this is FnLock, which switches the function keys
    between the primary (Mute, Vol down, Vol up, ...) and the secondary (F1,
    F2, F3, ...) behavior. On the new machines, FnLock is only available
    through BIOS setup (possibly through a yet-to-be-implemented feature
    in this driver) but not through Fn-ESC, but instead the ESC key itself
    switched between ESC and a "Paper Display" app for Windows.
    
    Unfortunately, that means that you can never have both ESC *and* the
    function keys working at the same time without needing to press Fn on
    one of them.
    As pointed out in the official Lenovo Forum by dozens of users, this
    makes the machine rather useless for any serious work [1].
    
    I have now studied the ACPI DSDT one more time and found the event
    that is generated for the ESC key. Unlike all other key events on this
    machine, it is actually a WMI, while the other ones are read from the
    embedded controller.
    
    I am now installing a WMI notifier that uses the event number from the
    WMI subsystem as the scancode. The only event number generated here is
    '128', and that fits in nicely with the two existing ranges of scancodes
    used by the EC: 0-15 for the 16-bit VPCCMD_R_VPC register, 16-17 for
    the VPCCMD_R_NOVO register and 64-67 for VPCCMD_R_SPECIAL_BUTTONS.
    
    The only sane way to handle this button (in absence of the Windows Paper
    Display driver) seems to be to have it emit KEY_ESC, so that is what
    I use as the default. Should any user ever want to overwrite the default,
    they can install their own keymap.
    
    To ensure that we can still build the driver without adding a CONFIG_WMI
    dependency, all new code is enclosed in #ifdef.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    
    [1] https://forums.lenovo.com/t5/Lenovo-Yoga-Series-Notebooks/YOGA-3-14-How-to-reclaim-my-Esc-key-and-permanently-disable/td-p/2070816Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
    74caab99
ideapad-laptop.c 24.7 KB