]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform: arm64: thinkpad-t14s-ec: fix IRQ race condition
authorSebastian Reichel <sre@kernel.org>
Wed, 19 Nov 2025 00:41:40 +0000 (01:41 +0100)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 21 Nov 2025 17:05:25 +0000 (19:05 +0200)
Fix a race condition, that an input key related interrupt might be
triggered before the input handler has been registered, which results
in a NULL pointer dereference. This can happen if the user enables
the keyboard backlight shortly before the driver is being probed.

This fixes the following backtrace visible in dmesg:

Unable to handle kernel NULL pointer dereference at virtual address 00000000000000e0
...
Call trace:
 sparse_keymap_report_event+0x2c/0x978 [sparse_keymap] (P)
 t14s_ec_irq_handler+0x190/0x3e8 [lenovo_thinkpad_t14s]
 irq_thread_fn+0x30/0xb8
 irq_thread+0x18c/0x3b0
 kthread+0x148/0x228
 ret_from_fork+0x10/0x20

Fixes: 60b7ab6ce030 ("platform: arm64: thinkpad-t14s-ec: new driver")
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
Link: https://patch.msgid.link/20251119-thinkpad-t14s-ec-improvements-v2-1-441219857c02@kernel.org
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/arm64/lenovo-thinkpad-t14s.c

index 1d5d11adaf32066b2f7a8913bbed131c57aa6194..c1c01b977f2bd04160a180936d7cb59c977f122a 100644 (file)
@@ -557,12 +557,6 @@ static int t14s_ec_probe(struct i2c_client *client)
                return dev_err_probe(dev, PTR_ERR(ec->regmap),
                                     "Failed to init regmap\n");
 
-       ret = devm_request_threaded_irq(dev, client->irq, NULL,
-                                       t14s_ec_irq_handler,
-                                       IRQF_ONESHOT, dev_name(dev), ec);
-       if (ret < 0)
-               return dev_err_probe(dev, ret, "Failed to get IRQ\n");
-
        ret = t14s_leds_probe(ec);
        if (ret < 0)
                return ret;
@@ -579,6 +573,12 @@ static int t14s_ec_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
+       ret = devm_request_threaded_irq(dev, client->irq, NULL,
+                                       t14s_ec_irq_handler,
+                                       IRQF_ONESHOT, dev_name(dev), ec);
+       if (ret < 0)
+               return dev_err_probe(dev, ret, "Failed to get IRQ\n");
+
        /*
         * Disable wakeup support by default, because the driver currently does
         * not support masking any events and the laptop should not wake up when