Home | History | Annotate | Download | only in tpm
      1 // SPDX-License-Identifier: GPL-2.0
      2 /*
      3  * Copyright (C) 2011 Infineon Technologies
      4  *
      5  * Authors:
      6  * Peter Huewe <huewe.external (at) infineon.com>
      7  *
      8  * Description:
      9  * Device driver for TCG/TCPA TPM (trusted platform module).
     10  * Specifications at www.trustedcomputinggroup.org
     11  *
     12  * This device driver implements the TPM interface as defined in
     13  * the TCG TPM Interface Spec version 1.2, revision 1.0 and the
     14  * Infineon I2C Protocol Stack Specification v0.20.
     15  *
     16  * It is based on the Linux kernel driver tpm.c from Leendert van
     17  * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall.
     18  *
     19  * Version: 2.1.1
     20  */
     21 
     22 #include <common.h>
     23 #include <dm.h>
     24 #include <fdtdec.h>
     25 #include <i2c.h>
     26 #include <tpm-v1.h>
     27 #include <linux/errno.h>
     28 #include <linux/compiler.h>
     29 #include <linux/types.h>
     30 #include <linux/unaligned/be_byteshift.h>
     31 
     32 #include "tpm_tis.h"
     33 #include "tpm_internal.h"
     34 
     35 enum i2c_chip_type {
     36 	SLB9635,
     37 	SLB9645,
     38 	UNKNOWN,
     39 };
     40 
     41 /* expected value for DIDVID register */
     42 #define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
     43 #define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
     44 
     45 static const char * const chip_name[] = {
     46 	[SLB9635] = "slb9635tt",
     47 	[SLB9645] = "slb9645tt",
     48 	[UNKNOWN] = "unknown/fallback to slb9635",
     49 };
     50 
     51 #define	TPM_ACCESS(l)			(0x0000 | ((l) << 4))
     52 #define	TPM_STS(l)			(0x0001 | ((l) << 4))
     53 #define	TPM_DATA_FIFO(l)		(0x0005 | ((l) << 4))
     54 #define	TPM_DID_VID(l)			(0x0006 | ((l) << 4))
     55 
     56 /*
     57  * tpm_tis_i2c_read() - read from TPM register
     58  * @addr: register address to read from
     59  * @buffer: provided by caller
     60  * @len: number of bytes to read
     61  *
     62  * Read len bytes from TPM register and put them into
     63  * buffer (little-endian format, i.e. first byte is put into buffer[0]).
     64  *
     65  * NOTE: TPM is big-endian for multi-byte values. Multi-byte
     66  * values have to be swapped.
     67  *
     68  * Return -EIO on error, 0 on success.
     69  */
     70 static int tpm_tis_i2c_read(struct udevice *dev, u8 addr, u8 *buffer,
     71 			    size_t len)
     72 {
     73 	struct tpm_chip *chip = dev_get_priv(dev);
     74 	int rc;
     75 	int count;
     76 	uint32_t addrbuf = addr;
     77 
     78 	if ((chip->chip_type == SLB9635) || (chip->chip_type == UNKNOWN)) {
     79 		/* slb9635 protocol should work in both cases */
     80 		for (count = 0; count < MAX_COUNT; count++) {
     81 			rc = dm_i2c_write(dev, 0, (uchar *)&addrbuf, 1);
     82 			if (rc == 0)
     83 				break;  /* Success, break to skip sleep */
     84 			udelay(SLEEP_DURATION_US);
     85 		}
     86 		if (rc)
     87 			return rc;
     88 
     89 		/* After the TPM has successfully received the register address
     90 		 * it needs some time, thus we're sleeping here again, before
     91 		 * retrieving the data
     92 		 */
     93 		for (count = 0; count < MAX_COUNT; count++) {
     94 			udelay(SLEEP_DURATION_US);
     95 			rc = dm_i2c_read(dev, 0, buffer, len);
     96 			if (rc == 0)
     97 				break;  /* success, break to skip sleep */
     98 		}
     99 	} else {
    100 		/*
    101 		 * Use a combined read for newer chips.
    102 		 * Unfortunately the smbus functions are not suitable due to
    103 		 * the 32 byte limit of the smbus.
    104 		 * Retries should usually not be needed, but are kept just to
    105 		 * be safe on the safe side.
    106 		 */
    107 		for (count = 0; count < MAX_COUNT; count++) {
    108 			rc = dm_i2c_read(dev, addr, buffer, len);
    109 			if (rc == 0)
    110 				break;  /* break here to skip sleep */
    111 			udelay(SLEEP_DURATION_US);
    112 		}
    113 	}
    114 
    115 	/* Take care of 'guard time' */
    116 	udelay(SLEEP_DURATION_US);
    117 	if (rc)
    118 		return rc;
    119 
    120 	return 0;
    121 }
    122 
    123 static int tpm_tis_i2c_write_generic(struct udevice *dev, u8 addr,
    124 				     const u8 *buffer, size_t len,
    125 				     unsigned int sleep_time_us, u8 max_count)
    126 {
    127 	struct tpm_chip_priv *priv = dev_get_uclass_priv(dev);
    128 	struct tpm_chip *chip = dev_get_priv(dev);
    129 	int rc = 0;
    130 	int count;
    131 
    132 	if (chip->chip_type == SLB9635) {
    133 		/* Prepare send buffer to include the address */
    134 		priv->buf[0] = addr;
    135 		memcpy(&(priv->buf[1]), buffer, len);
    136 		buffer = priv->buf;
    137 		len++;
    138 		addr = 0;
    139 	}
    140 
    141 	for (count = 0; count < max_count; count++) {
    142 		rc = dm_i2c_write(dev, addr, buffer, len);
    143 		if (rc == 0)
    144 			break;  /* Success, break to skip sleep */
    145 		udelay(sleep_time_us);
    146 	}
    147 
    148 	/* take care of 'guard time' */
    149 	udelay(sleep_time_us);
    150 	if (rc)
    151 		return rc;
    152 
    153 	return 0;
    154 }
    155 
    156 /*
    157  * tpm_tis_i2c_write() - write to TPM register
    158  * @addr: register address to write to
    159  * @buffer: containing data to be written
    160  * @len: number of bytes to write
    161  *
    162  * Write len bytes from provided buffer to TPM register (little
    163  * endian format, i.e. buffer[0] is written as first byte).
    164  *
    165  * NOTE: TPM is big-endian for multi-byte values. Multi-byte
    166  * values have to be swapped.
    167  *
    168  * NOTE: use this function instead of the tpm_tis_i2c_write_generic function.
    169  *
    170  * Return -EIO on error, 0 on success
    171  */
    172 static int tpm_tis_i2c_write(struct udevice *dev, u8 addr, const u8 *buffer,
    173 			     size_t len)
    174 {
    175 	return tpm_tis_i2c_write_generic(dev, addr, buffer, len,
    176 					 SLEEP_DURATION_US, MAX_COUNT);
    177 }
    178 
    179 /*
    180  * This function is needed especially for the cleanup situation after
    181  * sending TPM_READY
    182  */
    183 static int tpm_tis_i2c_write_long(struct udevice *dev, u8 addr, u8 *buffer,
    184 				  size_t len)
    185 {
    186 	return tpm_tis_i2c_write_generic(dev, addr, buffer, len,
    187 					 SLEEP_DURATION_LONG_US,
    188 					 MAX_COUNT_LONG);
    189 }
    190 
    191 static int tpm_tis_i2c_check_locality(struct udevice *dev, int loc)
    192 {
    193 	const u8 mask = TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID;
    194 	struct tpm_chip *chip = dev_get_priv(dev);
    195 	u8 buf;
    196 	int rc;
    197 
    198 	rc = tpm_tis_i2c_read(dev, TPM_ACCESS(loc), &buf, 1);
    199 	if (rc < 0)
    200 		return rc;
    201 
    202 	if ((buf & mask) == mask) {
    203 		chip->locality = loc;
    204 		return loc;
    205 	}
    206 
    207 	return -ENOENT;
    208 }
    209 
    210 static void tpm_tis_i2c_release_locality(struct udevice *dev, int loc,
    211 					 int force)
    212 {
    213 	const u8 mask = TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID;
    214 	u8 buf;
    215 
    216 	if (tpm_tis_i2c_read(dev, TPM_ACCESS(loc), &buf, 1) < 0)
    217 		return;
    218 
    219 	if (force || (buf & mask) == mask) {
    220 		buf = TPM_ACCESS_ACTIVE_LOCALITY;
    221 		tpm_tis_i2c_write(dev, TPM_ACCESS(loc), &buf, 1);
    222 	}
    223 }
    224 
    225 static int tpm_tis_i2c_request_locality(struct udevice *dev, int loc)
    226 {
    227 	struct tpm_chip *chip = dev_get_priv(dev);
    228 	unsigned long start, stop;
    229 	u8 buf = TPM_ACCESS_REQUEST_USE;
    230 	int rc;
    231 
    232 	rc = tpm_tis_i2c_check_locality(dev, loc);
    233 	if (rc >= 0) {
    234 		debug("%s: Already have locality\n", __func__);
    235 		return loc;  /* We already have the locality */
    236 	} else if (rc != -ENOENT) {
    237 		debug("%s: Failed to get locality: %d\n", __func__, rc);
    238 		return rc;
    239 	}
    240 
    241 	rc = tpm_tis_i2c_write(dev, TPM_ACCESS(loc), &buf, 1);
    242 	if (rc) {
    243 		debug("%s: Failed to write to TPM: %d\n", __func__, rc);
    244 		return rc;
    245 	}
    246 
    247 	/* Wait for burstcount */
    248 	start = get_timer(0);
    249 	stop = chip->timeout_a;
    250 	do {
    251 		rc = tpm_tis_i2c_check_locality(dev, loc);
    252 		if (rc >= 0) {
    253 			debug("%s: Have locality\n", __func__);
    254 			return loc;
    255 		} else if (rc != -ENOENT) {
    256 			debug("%s: Failed to get locality: %d\n", __func__, rc);
    257 			return rc;
    258 		}
    259 		mdelay(TPM_TIMEOUT_MS);
    260 	} while (get_timer(start) < stop);
    261 	debug("%s: Timeout getting locality: %d\n", __func__, rc);
    262 
    263 	return rc;
    264 }
    265 
    266 static u8 tpm_tis_i2c_status(struct udevice *dev)
    267 {
    268 	struct tpm_chip *chip = dev_get_priv(dev);
    269 	/* NOTE: Since i2c read may fail, return 0 in this case --> time-out */
    270 	u8 buf;
    271 
    272 	if (tpm_tis_i2c_read(dev, TPM_STS(chip->locality), &buf, 1) < 0)
    273 		return 0;
    274 	else
    275 		return buf;
    276 }
    277 
    278 static int tpm_tis_i2c_ready(struct udevice *dev)
    279 {
    280 	struct tpm_chip *chip = dev_get_priv(dev);
    281 	int rc;
    282 
    283 	/* This causes the current command to be aborted */
    284 	u8 buf = TPM_STS_COMMAND_READY;
    285 
    286 	debug("%s\n", __func__);
    287 	rc = tpm_tis_i2c_write_long(dev, TPM_STS(chip->locality), &buf, 1);
    288 	if (rc)
    289 		debug("%s: rc=%d\n", __func__, rc);
    290 
    291 	return rc;
    292 }
    293 
    294 static ssize_t tpm_tis_i2c_get_burstcount(struct udevice *dev)
    295 {
    296 	struct tpm_chip *chip = dev_get_priv(dev);
    297 	unsigned long start, stop;
    298 	ssize_t burstcnt;
    299 	u8 addr, buf[3];
    300 
    301 	/* Wait for burstcount */
    302 	/* XXX: Which timeout value? Spec has 2 answers (c & d) */
    303 	start = get_timer(0);
    304 	stop = chip->timeout_d;
    305 	do {
    306 		/* Note: STS is little endian */
    307 		addr = TPM_STS(chip->locality) + 1;
    308 		if (tpm_tis_i2c_read(dev, addr, buf, 3) < 0)
    309 			burstcnt = 0;
    310 		else
    311 			burstcnt = (buf[2] << 16) + (buf[1] << 8) + buf[0];
    312 
    313 		if (burstcnt)
    314 			return burstcnt;
    315 		mdelay(TPM_TIMEOUT_MS);
    316 	} while (get_timer(start) < stop);
    317 
    318 	return -EBUSY;
    319 }
    320 
    321 static int tpm_tis_i2c_wait_for_stat(struct udevice *dev, u8 mask,
    322 				     unsigned long timeout, int *status)
    323 {
    324 	unsigned long start, stop;
    325 
    326 	/* Check current status */
    327 	*status = tpm_tis_i2c_status(dev);
    328 	if ((*status & mask) == mask)
    329 		return 0;
    330 
    331 	start = get_timer(0);
    332 	stop = timeout;
    333 	do {
    334 		mdelay(TPM_TIMEOUT_MS);
    335 		*status = tpm_tis_i2c_status(dev);
    336 		if ((*status & mask) == mask)
    337 			return 0;
    338 	} while (get_timer(start) < stop);
    339 
    340 	return -ETIMEDOUT;
    341 }
    342 
    343 static int tpm_tis_i2c_recv_data(struct udevice *dev, u8 *buf, size_t count)
    344 {
    345 	struct tpm_chip *chip = dev_get_priv(dev);
    346 	size_t size = 0;
    347 	ssize_t burstcnt;
    348 	int rc;
    349 
    350 	while (size < count) {
    351 		burstcnt = tpm_tis_i2c_get_burstcount(dev);
    352 
    353 		/* burstcount < 0 -> tpm is busy */
    354 		if (burstcnt < 0)
    355 			return burstcnt;
    356 
    357 		/* Limit received data to max left */
    358 		if (burstcnt > (count - size))
    359 			burstcnt = count - size;
    360 
    361 		rc = tpm_tis_i2c_read(dev, TPM_DATA_FIFO(chip->locality),
    362 				      &(buf[size]), burstcnt);
    363 		if (rc == 0)
    364 			size += burstcnt;
    365 	}
    366 
    367 	return size;
    368 }
    369 
    370 static int tpm_tis_i2c_recv(struct udevice *dev, u8 *buf, size_t count)
    371 {
    372 	struct tpm_chip *chip = dev_get_priv(dev);
    373 	int size = 0;
    374 	int status;
    375 	unsigned int expected;
    376 	int rc;
    377 
    378 	status = tpm_tis_i2c_status(dev);
    379 	if (status == TPM_STS_COMMAND_READY)
    380 		return -EINTR;
    381 	if ((status & (TPM_STS_DATA_AVAIL | TPM_STS_VALID)) !=
    382 	    (TPM_STS_DATA_AVAIL | TPM_STS_VALID))
    383 		return -EAGAIN;
    384 
    385 	debug("...got it;\n");
    386 
    387 	/* Read first 10 bytes, including tag, paramsize, and result */
    388 	size = tpm_tis_i2c_recv_data(dev, buf, TPM_HEADER_SIZE);
    389 	if (size < TPM_HEADER_SIZE) {
    390 		debug("Unable to read header\n");
    391 		return size < 0 ? size : -EIO;
    392 	}
    393 
    394 	expected = get_unaligned_be32(buf + TPM_RSP_SIZE_BYTE);
    395 	if ((size_t)expected > count || (size_t)expected < TPM_HEADER_SIZE) {
    396 		debug("Error size=%x, expected=%x, count=%x\n", size, expected,
    397 		      count);
    398 		return -ENOSPC;
    399 	}
    400 
    401 	size += tpm_tis_i2c_recv_data(dev, &buf[TPM_HEADER_SIZE],
    402 				      expected - TPM_HEADER_SIZE);
    403 	if (size < expected) {
    404 		debug("Unable to read remainder of result\n");
    405 		return -ETIMEDOUT;
    406 	}
    407 
    408 	rc = tpm_tis_i2c_wait_for_stat(dev, TPM_STS_VALID, chip->timeout_c,
    409 				       &status);
    410 	if (rc)
    411 		return rc;
    412 	if (status & TPM_STS_DATA_AVAIL) {  /* Retry? */
    413 		debug("Error left over data\n");
    414 		return -EIO;
    415 	}
    416 
    417 	return size;
    418 }
    419 
    420 static int tpm_tis_i2c_send(struct udevice *dev, const u8 *buf, size_t len)
    421 {
    422 	struct tpm_chip *chip = dev_get_priv(dev);
    423 	int rc, status;
    424 	size_t burstcnt;
    425 	size_t count = 0;
    426 	int retry = 0;
    427 	u8 sts = TPM_STS_GO;
    428 
    429 	debug("%s: len=%d\n", __func__, len);
    430 	if (len > TPM_DEV_BUFSIZE)
    431 		return -E2BIG;  /* Command is too long for our tpm, sorry */
    432 
    433 	if (tpm_tis_i2c_request_locality(dev, 0) < 0)
    434 		return -EBUSY;
    435 
    436 	status = tpm_tis_i2c_status(dev);
    437 	if ((status & TPM_STS_COMMAND_READY) == 0) {
    438 		rc = tpm_tis_i2c_ready(dev);
    439 		if (rc)
    440 			return rc;
    441 		rc = tpm_tis_i2c_wait_for_stat(dev, TPM_STS_COMMAND_READY,
    442 					       chip->timeout_b, &status);
    443 		if (rc)
    444 			return rc;
    445 	}
    446 
    447 	burstcnt = tpm_tis_i2c_get_burstcount(dev);
    448 
    449 	/* burstcount < 0 -> tpm is busy */
    450 	if (burstcnt < 0)
    451 		return burstcnt;
    452 
    453 	while (count < len) {
    454 		udelay(300);
    455 		if (burstcnt > len - count)
    456 			burstcnt = len - count;
    457 
    458 #ifdef CONFIG_TPM_TIS_I2C_BURST_LIMITATION
    459 		if (retry && burstcnt > CONFIG_TPM_TIS_I2C_BURST_LIMITATION_LEN)
    460 			burstcnt = CONFIG_TPM_TIS_I2C_BURST_LIMITATION_LEN;
    461 #endif /* CONFIG_TPM_TIS_I2C_BURST_LIMITATION */
    462 
    463 		rc = tpm_tis_i2c_write(dev, TPM_DATA_FIFO(chip->locality),
    464 				       &(buf[count]), burstcnt);
    465 		if (rc == 0)
    466 			count += burstcnt;
    467 		else {
    468 			debug("%s: error\n", __func__);
    469 			if (retry++ > 10)
    470 				return -EIO;
    471 			rc = tpm_tis_i2c_wait_for_stat(dev, TPM_STS_VALID,
    472 						       chip->timeout_c,
    473 						       &status);
    474 			if (rc)
    475 				return rc;
    476 
    477 			if ((status & TPM_STS_DATA_EXPECT) == 0)
    478 				return -EIO;
    479 		}
    480 	}
    481 
    482 	/* Go and do it */
    483 	rc = tpm_tis_i2c_write(dev, TPM_STS(chip->locality), &sts, 1);
    484 	if (rc < 0)
    485 		return rc;
    486 	debug("%s: done, rc=%d\n", __func__, rc);
    487 
    488 	return len;
    489 }
    490 
    491 static int tpm_tis_i2c_cleanup(struct udevice *dev)
    492 {
    493 	struct tpm_chip *chip = dev_get_priv(dev);
    494 
    495 	tpm_tis_i2c_ready(dev);
    496 	/*
    497 	 * The TPM needs some time to clean up here,
    498 	 * so we sleep rather than keeping the bus busy
    499 	 */
    500 	mdelay(2);
    501 	tpm_tis_i2c_release_locality(dev, chip->locality, 0);
    502 
    503 	return 0;
    504 }
    505 
    506 static int tpm_tis_i2c_init(struct udevice *dev)
    507 {
    508 	struct tpm_chip *chip = dev_get_priv(dev);
    509 	u32 vendor;
    510 	u32 expected_did_vid;
    511 	int rc;
    512 
    513 	chip->is_open = 1;
    514 
    515 	/* Default timeouts - these could move to the device tree */
    516 	chip->timeout_a = TIS_SHORT_TIMEOUT_MS;
    517 	chip->timeout_b = TIS_LONG_TIMEOUT_MS;
    518 	chip->timeout_c = TIS_SHORT_TIMEOUT_MS;
    519 	chip->timeout_d = TIS_SHORT_TIMEOUT_MS;
    520 
    521 	rc = tpm_tis_i2c_request_locality(dev, 0);
    522 	if (rc < 0)
    523 		return rc;
    524 
    525 	/* Read four bytes from DID_VID register */
    526 	if (tpm_tis_i2c_read(dev, TPM_DID_VID(0), (uchar *)&vendor, 4) < 0) {
    527 		tpm_tis_i2c_release_locality(dev, 0, 1);
    528 		return -EIO;
    529 	}
    530 
    531 	if (chip->chip_type == SLB9635) {
    532 		vendor = be32_to_cpu(vendor);
    533 		expected_did_vid = TPM_TIS_I2C_DID_VID_9635;
    534 	} else {
    535 		/* device id and byte order has changed for newer i2c tpms */
    536 		expected_did_vid = TPM_TIS_I2C_DID_VID_9645;
    537 	}
    538 
    539 	if (chip->chip_type != UNKNOWN && vendor != expected_did_vid) {
    540 		pr_err("Vendor id did not match! ID was %08x\n", vendor);
    541 		return -ENODEV;
    542 	}
    543 
    544 	chip->vend_dev = vendor;
    545 	debug("1.2 TPM (chip type %s device-id 0x%X)\n",
    546 	      chip_name[chip->chip_type], vendor >> 16);
    547 
    548 	/*
    549 	 * A timeout query to TPM can be placed here.
    550 	 * Standard timeout values are used so far
    551 	 */
    552 
    553 	return 0;
    554 }
    555 
    556 static int tpm_tis_i2c_open(struct udevice *dev)
    557 {
    558 	struct tpm_chip *chip = dev_get_priv(dev);
    559 	int rc;
    560 
    561 	debug("%s: start\n", __func__);
    562 	if (chip->is_open)
    563 		return -EBUSY;
    564 	rc = tpm_tis_i2c_init(dev);
    565 	if (rc < 0)
    566 		chip->is_open = 0;
    567 
    568 	return rc;
    569 }
    570 
    571 static int tpm_tis_i2c_close(struct udevice *dev)
    572 {
    573 	struct tpm_chip *chip = dev_get_priv(dev);
    574 
    575 	if (chip->is_open) {
    576 		tpm_tis_i2c_release_locality(dev, chip->locality, 1);
    577 		chip->is_open = 0;
    578 		chip->vend_dev = 0;
    579 	}
    580 
    581 	return 0;
    582 }
    583 
    584 static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size)
    585 {
    586 	struct tpm_chip *chip = dev_get_priv(dev);
    587 
    588 	if (size < 50)
    589 		return -ENOSPC;
    590 
    591 	return snprintf(buf, size, "1.2 TPM (%s, chip type %s device-id 0x%x)",
    592 			chip->is_open ? "open" : "closed",
    593 			chip_name[chip->chip_type],
    594 			chip->vend_dev >> 16);
    595 }
    596 
    597 static int tpm_tis_i2c_probe(struct udevice *dev)
    598 {
    599 	struct tpm_chip_priv *uc_priv = dev_get_uclass_priv(dev);
    600 	struct tpm_chip *chip = dev_get_priv(dev);
    601 
    602 	chip->chip_type = dev_get_driver_data(dev);
    603 
    604 	/* TODO: These need to be checked and tuned */
    605 	uc_priv->duration_ms[TPM_SHORT] = TIS_SHORT_TIMEOUT_MS;
    606 	uc_priv->duration_ms[TPM_MEDIUM] = TIS_LONG_TIMEOUT_MS;
    607 	uc_priv->duration_ms[TPM_LONG] = TIS_LONG_TIMEOUT_MS;
    608 	uc_priv->retry_time_ms = TPM_TIMEOUT_MS;
    609 
    610 	return 0;
    611 }
    612 
    613 static const struct tpm_ops tpm_tis_i2c_ops = {
    614 	.open		= tpm_tis_i2c_open,
    615 	.close		= tpm_tis_i2c_close,
    616 	.get_desc	= tpm_tis_get_desc,
    617 	.send		= tpm_tis_i2c_send,
    618 	.recv		= tpm_tis_i2c_recv,
    619 	.cleanup	= tpm_tis_i2c_cleanup,
    620 };
    621 
    622 static const struct udevice_id tpm_tis_i2c_ids[] = {
    623 	{ .compatible = "infineon,slb9635tt", .data = SLB9635 },
    624 	{ .compatible = "infineon,slb9645tt", .data = SLB9645 },
    625 	{ }
    626 };
    627 
    628 U_BOOT_DRIVER(tpm_tis_i2c) = {
    629 	.name   = "tpm_tis_infineon",
    630 	.id     = UCLASS_TPM,
    631 	.of_match = tpm_tis_i2c_ids,
    632 	.ops    = &tpm_tis_i2c_ops,
    633 	.probe	= tpm_tis_i2c_probe,
    634 	.priv_auto_alloc_size = sizeof(struct tpm_chip),
    635 };
    636