diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/tpm/tpm.c | 2 | ||||
-rw-r--r-- | drivers/char/tpm/tpm_tis.c | 11 |
2 files changed, 11 insertions, 2 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index 47c2d2763456..f06bb37defb1 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | enum tpm_const { | 32 | enum tpm_const { |
33 | TPM_MINOR = 224, /* officially assigned */ | 33 | TPM_MINOR = 224, /* officially assigned */ |
34 | TPM_BUFSIZE = 2048, | 34 | TPM_BUFSIZE = 4096, |
35 | TPM_NUM_DEVICES = 256, | 35 | TPM_NUM_DEVICES = 256, |
36 | }; | 36 | }; |
37 | 37 | ||
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 0b73e4ec1add..2405f17b29dd 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
@@ -257,6 +257,10 @@ out: | |||
257 | return size; | 257 | return size; |
258 | } | 258 | } |
259 | 259 | ||
260 | static int itpm; | ||
261 | module_param(itpm, bool, 0444); | ||
262 | MODULE_PARM_DESC(itpm, "Force iTPM workarounds (found on some Lenovo laptops)"); | ||
263 | |||
260 | /* | 264 | /* |
261 | * If interrupts are used (signaled by an irq set in the vendor structure) | 265 | * If interrupts are used (signaled by an irq set in the vendor structure) |
262 | * tpm.c can skip polling for the data to be available as the interrupt is | 266 | * tpm.c can skip polling for the data to be available as the interrupt is |
@@ -293,7 +297,7 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len) | |||
293 | wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, | 297 | wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, |
294 | &chip->vendor.int_queue); | 298 | &chip->vendor.int_queue); |
295 | status = tpm_tis_status(chip); | 299 | status = tpm_tis_status(chip); |
296 | if ((status & TPM_STS_DATA_EXPECT) == 0) { | 300 | if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) { |
297 | rc = -EIO; | 301 | rc = -EIO; |
298 | goto out_err; | 302 | goto out_err; |
299 | } | 303 | } |
@@ -467,6 +471,10 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, | |||
467 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", | 471 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", |
468 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); | 472 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); |
469 | 473 | ||
474 | if (itpm) | ||
475 | dev_info(dev, "Intel iTPM workaround enabled\n"); | ||
476 | |||
477 | |||
470 | /* Figure out the capabilities */ | 478 | /* Figure out the capabilities */ |
471 | intfcaps = | 479 | intfcaps = |
472 | ioread32(chip->vendor.iobase + | 480 | ioread32(chip->vendor.iobase + |
@@ -629,6 +637,7 @@ static struct pnp_device_id tpm_pnp_tbl[] __devinitdata = { | |||
629 | {"", 0}, /* User Specified */ | 637 | {"", 0}, /* User Specified */ |
630 | {"", 0} /* Terminator */ | 638 | {"", 0} /* Terminator */ |
631 | }; | 639 | }; |
640 | MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl); | ||
632 | 641 | ||
633 | static __devexit void tpm_tis_pnp_remove(struct pnp_dev *dev) | 642 | static __devexit void tpm_tis_pnp_remove(struct pnp_dev *dev) |
634 | { | 643 | { |