tpm, tpm_tis: Claim locality when interrupts are reenabled on resume
authorLino Sanfilippo <l.sanfilippo@kunbus.com>
Thu, 24 Nov 2022 13:55:36 +0000 (14:55 +0100)
committerJarkko Sakkinen <jarkko@kernel.org>
Mon, 24 Apr 2023 13:15:53 +0000 (16:15 +0300)
In tpm_tis_resume() make sure that the locality has been claimed when
tpm_tis_reenable_interrupts() is called. Otherwise the writings to the
register might not have any effect.

Fixes: 45baa1d1fa39 ("tpm_tis: Re-enable interrupts upon (S3) resume")
Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
Tested-by: Jarkko Sakkinen <jarkko@kernel.org>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
drivers/char/tpm/tpm_tis_core.c

index fda4ed6..dfb622a 100644 (file)
@@ -1225,28 +1225,27 @@ int tpm_tis_resume(struct device *dev)
        struct tpm_chip *chip = dev_get_drvdata(dev);
        int ret;
 
+       ret = tpm_tis_request_locality(chip, 0);
+       if (ret < 0)
+               return ret;
+
        if (chip->flags & TPM_CHIP_FLAG_IRQ)
                tpm_tis_reenable_interrupts(chip);
 
        ret = tpm_pm_resume(dev);
        if (ret)
-               return ret;
+               goto out;
 
        /*
         * TPM 1.2 requires self-test on resume. This function actually returns
         * an error code but for unknown reason it isn't handled.
         */
-       if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) {
-               ret = tpm_tis_request_locality(chip, 0);
-               if (ret < 0)
-                       return ret;
-
+       if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
                tpm1_do_selftest(chip);
+out:
+       tpm_tis_relinquish_locality(chip, 0);
 
-               tpm_tis_relinquish_locality(chip, 0);
-       }
-
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_resume);
 #endif