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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:06 +0000 (23:03 +0900)
[ Upstream commit 955df4f87760b3bb2af253d3fbb12fb712b3ffa6 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/char/tpm/tpm_tis_core.c

index c5fef63c6179dd47620660c626c8a8b08f8e6d01..eecfbd7e9786768d79e9559ea44faaffa0155d68 100644 (file)
@@ -1191,28 +1191,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