tpm: drop 'base' from struct tpm_vendor_specific
authorJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Wed, 23 Mar 2016 06:16:09 +0000 (08:16 +0200)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Sat, 25 Jun 2016 14:26:35 +0000 (17:26 +0300)
Dropped the field 'base' from struct tpm_vendor_specific and migrated
it to the private structures of tpm_atmel and tpm_nsc.

Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Reviewed-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_atmel.c
drivers/char/tpm/tpm_atmel.h
drivers/char/tpm/tpm_nsc.c

index 6586b6aac23fe22ea2ad4ebb80d7bb3561142290..b9a5b258693275b3aa065dde334d03e726254f91 100644 (file)
@@ -132,7 +132,6 @@ struct tpm_chip;
 
 struct tpm_vendor_specific {
        void __iomem *iobase;           /* ioremapped address */
-       unsigned long base;             /* TPM base address */
 
        int irq;
 
index 0267d85875187e3be8cfa7f703f4c7c0a0265f6b..68d5c0991c5184a102db42e14d96c050314187d7 100644 (file)
@@ -141,8 +141,7 @@ static void atml_plat_remove(void)
        if (chip) {
                tpm_chip_unregister(chip);
                if (priv->have_region)
-                       atmel_release_region(chip->vendor.base,
-                                            priv->region_size);
+                       atmel_release_region(priv->base, priv->region_size);
                atmel_put_base_addr(chip->vendor.iobase);
                platform_device_unregister(pdev);
        }
@@ -191,6 +190,7 @@ static int __init init_atmel(void)
                goto err_unreg_dev;
        }
 
+       priv->base = base;
        priv->have_region = have_region;
        priv->region_size = region_size;
 
@@ -201,7 +201,6 @@ static int __init init_atmel(void)
        }
 
        chip->vendor.iobase = iobase;
-       chip->vendor.base = base;
        chip->vendor.priv = priv;
 
        rc = tpm_chip_register(chip);
index 3fd929de97391b8da10fd50f6ec18371770d179d..bced6780afe8ea8fdc6113994599e456cf7d1695 100644 (file)
 struct tpm_atmel_priv {
        int region_size;
        int have_region;
+       unsigned long base;
 };
 
+static inline struct tpm_atmel_priv *atmel_get_priv(struct tpm_chip *chip)
+{
+       return chip->vendor.priv;
+}
+
 #ifdef CONFIG_PPC64
 
 #include <asm/prom.h>
@@ -83,8 +89,9 @@ static void __iomem * atmel_get_base_addr(unsigned long *base, int *region_size)
        return ioremap(*base, *region_size);
 }
 #else
-#define atmel_getb(chip, offset) inb(chip->vendor->base + offset)
-#define atmel_putb(val, chip, offset) outb(val, chip->vendor->base + offset)
+#define atmel_getb(chip, offset) inb(atmel_get_priv(chip)->base + offset)
+#define atmel_putb(val, chip, offset) \
+       outb(val, atmel_get_priv(chip)->base + offset)
 #define atmel_request_region request_region
 #define atmel_release_region release_region
 /* Atmel definitions */
index 766370bed60c14a5c32e37661470c7e1f4c5f69c..07163a429fdf907f085ff2792176d7b6583e3ff3 100644 (file)
@@ -64,6 +64,16 @@ enum tpm_nsc_cmd_mode {
        NSC_COMMAND_EOC = 0x03,
        NSC_COMMAND_CANCEL = 0x22
 };
+
+struct tpm_nsc_priv {
+       unsigned long base;
+};
+
+static inline struct tpm_nsc_priv *nsc_get_priv(struct tpm_chip *chip)
+{
+       return chip->vendor.priv;
+}
+
 /*
  * Wait for a certain status to appear
  */
@@ -72,7 +82,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
        unsigned long stop;
 
        /* status immediately available check */
-       *data = inb(chip->vendor.base + NSC_STATUS);
+       *data = inb(nsc_get_priv(chip)->base + NSC_STATUS);
        if ((*data & mask) == val)
                return 0;
 
@@ -80,7 +90,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
        stop = jiffies + 10 * HZ;
        do {
                msleep(TPM_TIMEOUT);
-               *data = inb(chip->vendor.base + 1);
+               *data = inb(nsc_get_priv(chip)->base + 1);
                if ((*data & mask) == val)
                        return 0;
        }
@@ -95,9 +105,9 @@ static int nsc_wait_for_ready(struct tpm_chip *chip)
        unsigned long stop;
 
        /* status immediately available check */
-       status = inb(chip->vendor.base + NSC_STATUS);
+       status = inb(nsc_get_priv(chip)->base + NSC_STATUS);
        if (status & NSC_STATUS_OBF)
-               status = inb(chip->vendor.base + NSC_DATA);
+               status = inb(nsc_get_priv(chip)->base + NSC_DATA);
        if (status & NSC_STATUS_RDY)
                return 0;
 
@@ -105,9 +115,9 @@ static int nsc_wait_for_ready(struct tpm_chip *chip)
        stop = jiffies + 100;
        do {
                msleep(TPM_TIMEOUT);
-               status = inb(chip->vendor.base + NSC_STATUS);
+               status = inb(nsc_get_priv(chip)->base + NSC_STATUS);
                if (status & NSC_STATUS_OBF)
-                       status = inb(chip->vendor.base + NSC_DATA);
+                       status = inb(nsc_get_priv(chip)->base + NSC_DATA);
                if (status & NSC_STATUS_RDY)
                        return 0;
        }
@@ -132,8 +142,9 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
                dev_err(&chip->dev, "F0 timeout\n");
                return -EIO;
        }
-       if ((data =
-            inb(chip->vendor.base + NSC_DATA)) != NSC_COMMAND_NORMAL) {
+
+       data = inb(nsc_get_priv(chip)->base + NSC_DATA);
+       if (data != NSC_COMMAND_NORMAL) {
                dev_err(&chip->dev, "not in normal mode (0x%x)\n",
                        data);
                return -EIO;
@@ -149,7 +160,7 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
                }
                if (data & NSC_STATUS_F0)
                        break;
-               *p = inb(chip->vendor.base + NSC_DATA);
+               *p = inb(nsc_get_priv(chip)->base + NSC_DATA);
        }
 
        if ((data & NSC_STATUS_F0) == 0 &&
@@ -157,7 +168,9 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
                dev_err(&chip->dev, "F0 not set\n");
                return -EIO;
        }
-       if ((data = inb(chip->vendor.base + NSC_DATA)) != NSC_COMMAND_EOC) {
+
+       data = inb(nsc_get_priv(chip)->base + NSC_DATA);
+       if (data != NSC_COMMAND_EOC) {
                dev_err(&chip->dev,
                        "expected end of command(0x%x)\n", data);
                return -EIO;
@@ -183,7 +196,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
         * fix it. Not sure why this is needed, we followed the flow
         * chart in the manual to the letter.
         */
-       outb(NSC_COMMAND_CANCEL, chip->vendor.base + NSC_COMMAND);
+       outb(NSC_COMMAND_CANCEL, nsc_get_priv(chip)->base + NSC_COMMAND);
 
        if (nsc_wait_for_ready(chip) != 0)
                return -EIO;
@@ -193,7 +206,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
                return -EIO;
        }
 
-       outb(NSC_COMMAND_NORMAL, chip->vendor.base + NSC_COMMAND);
+       outb(NSC_COMMAND_NORMAL, nsc_get_priv(chip)->base + NSC_COMMAND);
        if (wait_for_stat(chip, NSC_STATUS_IBR, NSC_STATUS_IBR, &data) < 0) {
                dev_err(&chip->dev, "IBR timeout\n");
                return -EIO;
@@ -205,26 +218,26 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
                                "IBF timeout (while writing data)\n");
                        return -EIO;
                }
-               outb(buf[i], chip->vendor.base + NSC_DATA);
+               outb(buf[i], nsc_get_priv(chip)->base + NSC_DATA);
        }
 
        if (wait_for_stat(chip, NSC_STATUS_IBF, 0, &data) < 0) {
                dev_err(&chip->dev, "IBF timeout\n");
                return -EIO;
        }
-       outb(NSC_COMMAND_EOC, chip->vendor.base + NSC_COMMAND);
+       outb(NSC_COMMAND_EOC, nsc_get_priv(chip)->base + NSC_COMMAND);
 
        return count;
 }
 
 static void tpm_nsc_cancel(struct tpm_chip *chip)
 {
-       outb(NSC_COMMAND_CANCEL, chip->vendor.base + NSC_COMMAND);
+       outb(NSC_COMMAND_CANCEL, nsc_get_priv(chip)->base + NSC_COMMAND);
 }
 
 static u8 tpm_nsc_status(struct tpm_chip *chip)
 {
-       return inb(chip->vendor.base + NSC_STATUS);
+       return inb(nsc_get_priv(chip)->base + NSC_STATUS);
 }
 
 static bool tpm_nsc_req_canceled(struct tpm_chip *chip, u8 status)
@@ -249,7 +262,7 @@ static void tpm_nsc_remove(struct device *dev)
        struct tpm_chip *chip = dev_get_drvdata(dev);
 
        tpm_chip_unregister(chip);
-       release_region(chip->vendor.base, 2);
+       release_region(nsc_get_priv(chip)->base, 2);
 }
 
 static SIMPLE_DEV_PM_OPS(tpm_nsc_pm, tpm_pm_suspend, tpm_pm_resume);
@@ -268,6 +281,7 @@ static int __init init_nsc(void)
        int nscAddrBase = TPM_ADDR;
        struct tpm_chip *chip;
        unsigned long base;
+       struct tpm_nsc_priv *priv;
 
        /* verify that it is a National part (SID) */
        if (tpm_read_index(TPM_ADDR, NSC_SID_INDEX) != 0xEF) {
@@ -301,6 +315,14 @@ static int __init init_nsc(void)
        if ((rc = platform_device_add(pdev)) < 0)
                goto err_put_dev;
 
+       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               rc = -ENOMEM;
+               goto err_del_dev;
+       }
+
+       priv->base = base;
+
        if (request_region(base, 2, "tpm_nsc0") == NULL ) {
                rc = -EBUSY;
                goto err_del_dev;
@@ -312,6 +334,8 @@ static int __init init_nsc(void)
                goto err_rel_reg;
        }
 
+       chip->vendor.priv = priv;
+
        rc = tpm_chip_register(chip);
        if (rc)
                goto err_rel_reg;
@@ -349,8 +373,6 @@ static int __init init_nsc(void)
                 "NSC TPM revision %d\n",
                 tpm_read_index(nscAddrBase, 0x27) & 0x1F);
 
-       chip->vendor.base = base;
-
        return 0;
 
 err_rel_reg: