tpm, tpm_tis: Disable interrupts if tpm_tis_probe_irq() failed
authorLino Sanfilippo <l.sanfilippo@kunbus.com>
Thu, 24 Nov 2022 13:55:27 +0000 (14:55 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:06 +0000 (23:03 +0900)
[ Upstream commit 6d789ad726950e612a7f31044260337237c5b490 ]

Both functions tpm_tis_probe_irq_single() and tpm_tis_probe_irq() may setup
the interrupts and then return with an error. This case is indicated by a
missing TPM_CHIP_FLAG_IRQ flag in chip->flags.
Currently the interrupt setup is only undone if tpm_tis_probe_irq_single()
fails. Undo the setup also if tpm_tis_probe_irq() fails.

Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
Tested-by: Michael Niewöhner <linux@mniewoehner.de>
Tested-by: Jarkko Sakkinen <jarkko@kernel.org>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
Stable-dep-of: 955df4f87760 ("tpm, tpm_tis: Claim locality when interrupts are reenabled on resume")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/char/tpm/tpm_tis_core.c

index a2cbf9b..4e6075d 100644 (file)
@@ -1087,21 +1087,21 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
                        goto out_err;
                }
 
-               if (irq) {
+               if (irq)
                        tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED,
                                                 irq);
-                       if (!(chip->flags & TPM_CHIP_FLAG_IRQ)) {
-                               dev_err(&chip->dev, FW_BUG
+               else
+                       tpm_tis_probe_irq(chip, intmask);
+
+               if (!(chip->flags & TPM_CHIP_FLAG_IRQ)) {
+                       dev_err(&chip->dev, FW_BUG
                                        "TPM interrupt not working, polling instead\n");
 
-                               rc = request_locality(chip, 0);
-                               if (rc < 0)
-                                       goto out_err;
-                               disable_interrupts(chip);
-                               release_locality(chip, 0);
-                       }
-               } else {
-                       tpm_tis_probe_irq(chip, intmask);
+                       rc = request_locality(chip, 0);
+                       if (rc < 0)
+                               goto out_err;
+                       disable_interrupts(chip);
+                       release_locality(chip, 0);
                }
        }