Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 570a3609 authored by Christophe Ricard's avatar Christophe Ricard Committed by Jarkko Sakkinen
Browse files

tpm: drop 'irq' from struct tpm_vendor_specific



Dropped the field 'irq' from struct tpm_vendor_specific and make it
available to the various private structures in the drivers using irqs.

A dedicated flag TPM_CHIP_FLAG_IRQ is added for the upper layers.

In st33zp24, struct st33zp24_dev declaration is moved to st33zp24.h in
order to make accessible irq from other phy's(i2c, spi).

In tpm_i2c_nuvoton, chip->vendor.priv is not directly allocated. We can
access irq field from priv_data in a cleaner way.

Signed-off-by: default avatarChristophe Ricard <christophe-h.ricard@st.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent 4eea703c
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -73,14 +73,6 @@ enum tis_defaults {
	TIS_LONG_TIMEOUT = 2000,
};

struct st33zp24_dev {
	struct tpm_chip *chip;
	void *phy_id;
	const struct st33zp24_phy_ops *ops;
	u32 intrs;
	int io_lpcpd;
};

/*
 * clear_interruption clear the pending interrupt.
 * @param: tpm_dev, the tpm device device.
@@ -288,10 +280,10 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,

	stop = jiffies + timeout;

	if (chip->vendor.irq) {
	if (chip->flags & TPM_CHIP_FLAG_IRQ) {
		cur_intrs = tpm_dev->intrs;
		clear_interruption(tpm_dev);
		enable_irq(chip->vendor.irq);
		enable_irq(tpm_dev->irq);

		do {
			if (ret == -ERESTARTSYS && freezing(current))
@@ -314,7 +306,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
			}
		} while (ret == -ERESTARTSYS && freezing(current));

		disable_irq_nosync(chip->vendor.irq);
		disable_irq_nosync(tpm_dev->irq);

	} else {
		do {
@@ -376,7 +368,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)

	tpm_dev->intrs++;
	wake_up_interruptible(&chip->vendor.read_queue);
	disable_irq_nosync(chip->vendor.irq);
	disable_irq_nosync(tpm_dev->irq);

	return IRQ_HANDLED;
} /* tpm_ioserirq_handler() */
@@ -456,7 +448,7 @@ static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf,
	if (ret < 0)
		goto out_err;

	if (chip->vendor.irq) {
	if (chip->flags & TPM_CHIP_FLAG_IRQ) {
		ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));

		ret = wait_for_stat(chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
@@ -611,9 +603,10 @@ int st33zp24_probe(void *phy_id, const struct st33zp24_phy_ops *ops,
		if (ret < 0)
			goto _tpm_clean_answer;

		chip->vendor.irq = irq;
		tpm_dev->irq = irq;
		chip->flags |= TPM_CHIP_FLAG_IRQ;

		disable_irq_nosync(chip->vendor.irq);
		disable_irq_nosync(tpm_dev->irq);

		tpm_gen_interrupt(chip);
	}
+10 −0
Original line number Diff line number Diff line
@@ -21,6 +21,16 @@
#define TPM_WRITE_DIRECTION             0x80
#define TPM_BUFSIZE                     2048

struct st33zp24_dev {
	struct tpm_chip *chip;
	void *phy_id;
	const struct st33zp24_phy_ops *ops;
	int irq;
	u32 intrs;
	int io_lpcpd;
};


struct st33zp24_phy_ops {
	int (*send)(void *phy_id, u8 tpm_register, u8 *tpm_data, int tpm_size);
	int (*recv)(void *phy_id, u8 tpm_register, u8 *tpm_data, int tpm_size);
+2 −2
Original line number Diff line number Diff line
@@ -359,7 +359,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
		goto out;
	}

	if (chip->vendor.irq)
	if (chip->flags & TPM_CHIP_FLAG_IRQ)
		goto out_recv;

	if (chip->flags & TPM_CHIP_FLAG_TPM2)
@@ -890,7 +890,7 @@ int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,

	stop = jiffies + timeout;

	if (chip->vendor.irq) {
	if (chip->flags & TPM_CHIP_FLAG_IRQ) {
again:
		timeout = stop - jiffies;
		if ((long)timeout <= 0)
+1 −2
Original line number Diff line number Diff line
@@ -131,8 +131,6 @@ enum tpm2_startup_types {
struct tpm_chip;

struct tpm_vendor_specific {
	int irq;

	int locality;
	unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
	bool timeout_adjusted;
@@ -154,6 +152,7 @@ struct tpm_vendor_specific {
enum tpm_chip_flags {
	TPM_CHIP_FLAG_REGISTERED	= BIT(0),
	TPM_CHIP_FLAG_TPM2		= BIT(1),
	TPM_CHIP_FLAG_IRQ		= BIT(2),
};

struct tpm_chip {
+0 −1
Original line number Diff line number Diff line
@@ -173,7 +173,6 @@ static int i2c_atmel_probe(struct i2c_client *client,
	chip->vendor.timeout_b = msecs_to_jiffies(TPM_I2C_LONG_TIMEOUT);
	chip->vendor.timeout_c = msecs_to_jiffies(TPM_I2C_SHORT_TIMEOUT);
	chip->vendor.timeout_d = msecs_to_jiffies(TPM_I2C_SHORT_TIMEOUT);
	chip->vendor.irq = 0;

	/* There is no known way to probe for this device, and all version
	 * information seems to be read via TPM commands. Thus we rely on the
Loading