Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / char / tpm / tpm_tis_core.c
index d66f51b..e3bf31b 100644 (file)
@@ -440,7 +440,6 @@ static int probe_itpm(struct tpm_chip *chip)
                0x00, 0x00, 0x00, 0xf1
        };
        size_t len = sizeof(cmd_getticks);
-       bool itpm;
        u16 vendor;
 
        rc = tpm_tis_read16(priv, TPM_DID_VID(0), &vendor);
@@ -451,8 +450,6 @@ static int probe_itpm(struct tpm_chip *chip)
        if (vendor != TPM_VID_INTEL)
                return 0;
 
-       itpm = false;
-
        rc = tpm_tis_send_data(chip, cmd_getticks, len);
        if (rc == 0)
                goto out;
@@ -460,8 +457,6 @@ static int probe_itpm(struct tpm_chip *chip)
        tpm_tis_ready(chip);
        release_locality(chip, priv->locality, 0);
 
-       itpm = true;
-
        rc = tpm_tis_send_data(chip, cmd_getticks, len);
        if (rc == 0) {
                dev_info(&chip->dev, "Detected an iTPM.\n");
@@ -526,6 +521,18 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
+{
+       const char *desc = "attempting to generate an interrupt";
+       u32 cap2;
+       cap_t cap;
+
+       if (chip->flags & TPM_CHIP_FLAG_TPM2)
+               return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+       else
+               return tpm_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc);
+}
+
 /* Register the IRQ and issue a command that will cause an interrupt. If an
  * irq is seen then leave the chip setup for IRQ operation, otherwise reverse
  * everything and leave in polling mode. Returns 0 on success.
@@ -575,10 +582,9 @@ static int tpm_tis_probe_irq_single(struct tpm_chip *chip, u32 intmask,
        /* Generate an interrupt by having the core call through to
         * tpm_tis_send
         */
-       if (chip->flags & TPM_CHIP_FLAG_TPM2)
-               tpm2_gen_interrupt(chip);
-       else
-               tpm_gen_interrupt(chip);
+       rc = tpm_tis_gen_interrupt(chip);
+       if (rc < 0)
+               return rc;
 
        /* tpm_tis_send will either confirm the interrupt is working or it
         * will call disable_irq which undoes all of the above.