Input: i8042 - allow insmod to succeed on devices without an i8042 controller
authorHans de Goede <hdegoede@redhat.com>
Tue, 27 Oct 2020 03:53:57 +0000 (20:53 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 27 Oct 2020 03:56:28 +0000 (20:56 -0700)
commitb1884583fcd17d6a1b1bba94bbb5826e6b5c6e17
treee8fda4e295dd4678743ff7f765bd74a13fc023d7
parent33b6c39e747c552fa770eecebd1776f1f4a222b1
Input: i8042 - allow insmod to succeed on devices without an i8042 controller

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: Marius Iacob <themariusus@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20201008112628.3979-2-hdegoede@redhat.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/serio/i8042.c