From 26d837e0cd35c85ba0de7b7efd87667937dd1665 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 16 Oct 2007 23:26:46 -0700 Subject: [PATCH] tpm: pay attention to IRQ info from PNP If we discover the TIS TPM device via PNP, use the PNP IRQ information rather than probing for an IRQ. If PNP shows no IRQ, run the TPM in polling mode. Tested-by: Signed-off-by: Bjorn Helgaas Cc: Kylene Hall Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/char/tpm/tpm_tis.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 23fa18a6654c3..a8e808461377c 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c @@ -435,17 +435,12 @@ module_param(interrupts, bool, 0444); MODULE_PARM_DESC(interrupts, "Enable interrupts"); static int tpm_tis_init(struct device *dev, resource_size_t start, - resource_size_t len) + resource_size_t len, unsigned int irq) { u32 vendor, intfcaps, intmask; int rc, i; struct tpm_chip *chip; - if (!start) - start = TIS_MEM_BASE; - if (!len) - len = TIS_MEM_LEN; - if (!(chip = tpm_register_hardware(dev, &tpm_tis))) return -ENODEV; @@ -512,7 +507,9 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, iowrite32(intmask, chip->vendor.iobase + TPM_INT_ENABLE(chip->vendor.locality)); - if (interrupts) { + if (interrupts) + chip->vendor.irq = irq; + if (interrupts && !chip->vendor.irq) { chip->vendor.irq = ioread8(chip->vendor.iobase + TPM_INT_VECTOR(chip->vendor.locality)); @@ -597,10 +594,17 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, const struct pnp_device_id *pnp_id) { resource_size_t start, len; + unsigned int irq = 0; + start = pnp_mem_start(pnp_dev, 0); len = pnp_mem_len(pnp_dev, 0); - return tpm_tis_init(&pnp_dev->dev, start, len); + if (pnp_irq_valid(pnp_dev, 0)) + irq = pnp_irq(pnp_dev, 0); + else + interrupts = 0; + + return tpm_tis_init(&pnp_dev->dev, start, len, irq); } static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg) @@ -660,7 +664,7 @@ static int __init init_tis(void) return rc; if (IS_ERR(pdev=platform_device_register_simple("tpm_tis", -1, NULL, 0))) return PTR_ERR(pdev); - if((rc=tpm_tis_init(&pdev->dev, 0, 0)) != 0) { + if((rc=tpm_tis_init(&pdev->dev, TIS_MEM_BASE, TIS_MEM_LEN, 0)) != 0) { platform_device_unregister(pdev); driver_unregister(&tis_drv); } -- 2.39.5