[U-Boot] [PATCH 09/25] tpm: tpm_tis_i2c: Merge struct tpm_dev into tpm_chip

christophe.ricard christophe.ricard at gmail.com
Tue Aug 11 23:46:56 CEST 2015


Hi Simon,

As per my delivery tentative, don't you think driver specific data could 
be stored in a void *priv field in struct tpm_vendor_specific ?
This how we manage such information in Linux drivers.

Please have a look in tpm_private.h changes:
http://lists.denx.de/pipermail/u-boot/2015-August/222598.html

Best Regards
Christophe
On 11/08/2015 16:48, Simon Glass wrote:
> There are too many structures storing the same sort of information. Move the
> fields from struct tpm_dev into struct tpm_chip and remove the former
> struct.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   drivers/tpm/tpm_tis_i2c.c | 52 +++++++++++++----------------------------------
>   drivers/tpm/tpm_tis_i2c.h | 17 ++++++++++------
>   2 files changed, 25 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/tpm/tpm_tis_i2c.c b/drivers/tpm/tpm_tis_i2c.c
> index 3c4e6c5..70d21ca 100644
> --- a/drivers/tpm/tpm_tis_i2c.c
> +++ b/drivers/tpm/tpm_tis_i2c.c
> @@ -34,9 +34,6 @@
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> -/* Max buffer size supported by our tpm */
> -#define TPM_DEV_BUFSIZE		1260
> -
>   /* Max number of iterations after i2c NAK */
>   #define MAX_COUNT		3
>   
> @@ -78,12 +75,6 @@ enum tis_defaults {
>   #define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
>   #define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
>   
> -enum i2c_chip_type {
> -	SLB9635,
> -	SLB9645,
> -	UNKNOWN,
> -};
> -
>   static const char * const chip_name[] = {
>   	[SLB9635] = "slb9635tt",
>   	[SLB9645] = "slb9645tt",
> @@ -390,18 +381,8 @@ struct tpm {
>   	char inited;
>   } tpm;
>   
> -/* Global structure for tpm chip data */
>   static struct tpm_chip g_chip;
>   
> -/* Structure to store I2C TPM specific stuff */
> -struct tpm_dev {
> -	struct udevice *dev;
> -	u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)];  /* Max buffer size + addr */
> -	enum i2c_chip_type chip_type;
> -};
> -
> -static struct tpm_dev tpm_dev;
> -
>   /*
>    * iic_tpm_read() - read from TPM register
>    * @addr: register address to read from
> @@ -422,10 +403,10 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
>   	int count;
>   	uint32_t addrbuf = addr;
>   
> -	if ((tpm_dev.chip_type == SLB9635) || (tpm_dev.chip_type == UNKNOWN)) {
> +	if ((g_chip.chip_type == SLB9635) || (g_chip.chip_type == UNKNOWN)) {
>   		/* slb9635 protocol should work in both cases */
>   		for (count = 0; count < MAX_COUNT; count++) {
> -			rc = dm_i2c_write(tpm_dev.dev, 0, (uchar *)&addrbuf, 1);
> +			rc = dm_i2c_write(g_chip.dev, 0, (uchar *)&addrbuf, 1);
>   			if (rc == 0)
>   				break;  /* Success, break to skip sleep */
>   			udelay(SLEEP_DURATION);
> @@ -439,7 +420,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
>   		 */
>   		for (count = 0; count < MAX_COUNT; count++) {
>   			udelay(SLEEP_DURATION);
> -			rc = dm_i2c_read(tpm_dev.dev, 0, buffer, len);
> +			rc = dm_i2c_read(g_chip.dev, 0, buffer, len);
>   			if (rc == 0)
>   				break;  /* success, break to skip sleep */
>   		}
> @@ -452,7 +433,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
>   		 * be safe on the safe side.
>   		 */
>   		for (count = 0; count < MAX_COUNT; count++) {
> -			rc = dm_i2c_read(tpm_dev.dev, addr, buffer, len);
> +			rc = dm_i2c_read(g_chip.dev, addr, buffer, len);
>   			if (rc == 0)
>   				break;  /* break here to skip sleep */
>   			udelay(SLEEP_DURATION);
> @@ -474,7 +455,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
>   	int count;
>   
>   	for (count = 0; count < max_count; count++) {
> -		rc = dm_i2c_write(tpm_dev.dev, addr, buffer, len);
> +		rc = dm_i2c_write(g_chip.dev, addr, buffer, len);
>   		if (rc == 0)
>   			break;  /* Success, break to skip sleep */
>   		udelay(sleep_time);
> @@ -809,7 +790,7 @@ out_err:
>   	return rc;
>   }
>   
> -static enum i2c_chip_type tpm_vendor_chip_type(void)
> +static enum i2c_chip_type tpm_tis_i2c_chip_type(void)
>   {
>   #ifdef CONFIG_OF_CONTROL
>   	const void *blob = gd->fdt_blob;
> @@ -823,14 +804,14 @@ static enum i2c_chip_type tpm_vendor_chip_type(void)
>   	return UNKNOWN;
>   }
>   
> -int tpm_vendor_init(struct udevice *dev)
> +static int tpm_tis_i2c_init(struct udevice *dev)
>   {
>   	struct tpm_chip *chip = &g_chip;
>   	u32 vendor;
>   	u32 expected_did_vid;
>   
> -	tpm_dev.dev = dev;
> -	tpm_dev.chip_type = tpm_vendor_chip_type();
> +	g_chip.dev = dev;
> +	g_chip.chip_type = tpm_tis_i2c_chip_type();
>   	chip->is_open = 1;
>   
>   	/* Disable interrupts (not supported) */
> @@ -854,7 +835,7 @@ int tpm_vendor_init(struct udevice *dev)
>   		return -EIO;
>   	}
>   
> -	if (tpm_dev.chip_type == SLB9635) {
> +	if (g_chip.chip_type == SLB9635) {
>   		vendor = be32_to_cpu(vendor);
>   		expected_did_vid = TPM_TIS_I2C_DID_VID_9635;
>   	} else {
> @@ -862,13 +843,13 @@ int tpm_vendor_init(struct udevice *dev)
>   		expected_did_vid = TPM_TIS_I2C_DID_VID_9645;
>   	}
>   
> -	if (tpm_dev.chip_type != UNKNOWN && vendor != expected_did_vid) {
> +	if (g_chip.chip_type != UNKNOWN && vendor != expected_did_vid) {
>   		error("Vendor id did not match! ID was %08x\n", vendor);
>   		return -ENODEV;
>   	}
>   
>   	debug("1.2 TPM (chip type %s device-id 0x%X)\n",
> -	      chip_name[tpm_dev.chip_type], vendor >> 16);
> +	      chip_name[g_chip.chip_type], vendor >> 16);
>   
>   	/*
>   	 * A timeout query to TPM can be placed here.
> @@ -878,11 +859,6 @@ int tpm_vendor_init(struct udevice *dev)
>   	return 0;
>   }
>   
> -void tpm_vendor_cleanup(struct tpm_chip *chip)
> -{
> -	release_locality(chip, chip->locality, 1);
> -}
> -
>   /* Returns max number of milliseconds to wait */
>   static unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
>   		u32 ordinal)
> @@ -980,7 +956,7 @@ static int tpm_open_dev(struct udevice *dev)
>   	debug("%s: start\n", __func__);
>   	if (g_chip.is_open)
>   		return -EBUSY;
> -	rc = tpm_vendor_init(dev);
> +	rc = tpm_tis_i2c_init(dev);
>   	if (rc < 0)
>   		g_chip.is_open = 0;
>   	return rc;
> @@ -989,7 +965,7 @@ static int tpm_open_dev(struct udevice *dev)
>   static void tpm_close(void)
>   {
>   	if (g_chip.is_open) {
> -		tpm_vendor_cleanup(&g_chip);
> +		release_locality(&g_chip, g_chip.locality, 1);
>   		g_chip.is_open = 0;
>   	}
>   }
> diff --git a/drivers/tpm/tpm_tis_i2c.h b/drivers/tpm/tpm_tis_i2c.h
> index 2a4ad77..0fec464 100644
> --- a/drivers/tpm/tpm_tis_i2c.h
> +++ b/drivers/tpm/tpm_tis_i2c.h
> @@ -33,7 +33,14 @@ enum tpm_timeout {
>   #define TPM_RSP_SIZE_BYTE	2
>   #define TPM_RSP_RC_BYTE		6
>   
> -struct tpm_chip;
> +/* Max buffer size supported by our tpm */
> +#define TPM_DEV_BUFSIZE		1260
> +
> +enum i2c_chip_type {
> +	SLB9635,
> +	SLB9645,
> +	UNKNOWN,
> +};
>   
>   struct tpm_chip {
>   	int is_open;
> @@ -44,6 +51,9 @@ struct tpm_chip {
>   	int locality;
>   	unsigned long timeout_a, timeout_b, timeout_c, timeout_d;  /* msec */
>   	unsigned long duration[3];  /* msec */
> +	struct udevice *dev;
> +	u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)];  /* Max buffer size + addr */
> +	enum i2c_chip_type chip_type;
>   };
>   
>   struct tpm_input_header {
> @@ -102,9 +112,4 @@ struct tpm_cmd_t {
>   	union tpm_cmd_params params;
>   } __packed;
>   
> -struct udevice;
> -int tpm_vendor_init(struct udevice *dev);
> -
> -void tpm_vendor_cleanup(struct tpm_chip *chip);
> -
>   #endif



More information about the U-Boot mailing list