• Hans de Goede's avatar
    Input: i8042 - allow insmod to succeed on devices without an i8042 controller · b1884583
    Hans de Goede authored
    The i8042 module exports several symbols which may be used by other
    modules.
    
    Before this commit it would refuse to load (when built as a module itself)
    on systems without an i8042 controller.
    
    This is a problem specifically for the asus-nb-wmi module. Many Asus
    laptops support the Asus WMI interface. Some of them have an i8042
    controller and need to use i8042_install_filter() to filter some kbd
    events. Other models do not have an i8042 controller (e.g. they use an
    USB attached kbd).
    
    Before this commit the asus-nb-wmi driver could not be loaded on Asus
    models without an i8042 controller, when the i8042 code was built as
    a module (as Arch Linux does) because the module_init function of the
    i8042 module would fail with -ENODEV and thus the i8042_install_filter
    symbol could not be loaded.
    
    This commit fixes this by exiting from module_init with a return code
    of 0 if no controller is found.  It also adds a i8042_present bool to
    make the module_exit function a no-op in this case and also adds a
    check for i8042_present to the exported i8042_command function.
    
    The latter i8042_present check should not really be necessary because
    when builtin that function can already be used on systems without
    an i8042 controller, but better safe then sorry.
    Reported-and-tested-by: default avatarMarius Iacob <themariusus@gmail.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20201008112628.3979-2-hdegoede@redhat.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
    b1884583
i8042.c 37.7 KB