mfd: tps65010: Use IRQF_NO_AUTOEN flag in request_irq() to fix race
authorJinjie Ruan <ruanjinjie@huawei.com>
Thu, 12 Sep 2024 03:15:30 +0000 (11:15 +0800)
committerLee Jones <lee@kernel.org>
Wed, 16 Oct 2024 08:04:09 +0000 (09:04 +0100)
As the comment said, disable_irq() after request_irq() still has a
time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN
flag will disable IRQ auto-enable when request IRQ.

Fixes: 72cd799544f2 ("[PATCH] I2C: add i2c driver for TPS6501x")
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Link: https://lore.kernel.org/r/20240912031530.2211654-1-ruanjinjie@huawei.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/tps65010.c

index 2b91052..7103644 100644 (file)
@@ -544,17 +544,13 @@ static int tps65010_probe(struct i2c_client *client)
         */
        if (client->irq > 0) {
                status = request_irq(client->irq, tps65010_irq,
-                                    IRQF_TRIGGER_FALLING, DRIVER_NAME, tps);
+                                    IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN,
+                                    DRIVER_NAME, tps);
                if (status < 0) {
                        dev_dbg(&client->dev, "can't get IRQ %d, err %d\n",
                                        client->irq, status);
                        return status;
                }
-               /* annoying race here, ideally we'd have an option
-                * to claim the irq now and enable it later.
-                * FIXME genirq IRQF_NOAUTOEN now solves that ...
-                */
-               disable_irq(client->irq);
                set_bit(FLAG_IRQ_ENABLE, &tps->flags);
        } else
                dev_warn(&client->dev, "IRQ not configured!\n");