video: omap: use BIT() and GENMASK() macros
[oweals/u-boot.git] / drivers / tpm / tpm_atmel_twi.c
index 2aa9381b11a5816d4e6178280a8b4c7df6052f25..2079ea913e4428d88e03a962c00e5a667aecbba5 100644 (file)
@@ -1,14 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2013 Guntermann & Drunck, GmbH
  *
- * Written by Dirk Eibach <eibach@gdsys.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
+ * Written by Dirk Eibach <dirk.eibach@gdsys.cc>
  */
 
 #include <common.h>
 #include <dm.h>
-#include <tpm.h>
+#include <tpm-v1.h>
 #include <i2c.h>
 #include <asm/unaligned.h>
 
@@ -81,14 +80,23 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
        print_buffer(0, (void *)sendbuf, 1, send_size, 0);
 #endif
 
+#ifndef CONFIG_DM_I2C
        res = i2c_write(0x29, 0, 0, (uchar *)sendbuf, send_size);
+#else
+       res = dm_i2c_write(dev, 0, sendbuf, send_size);
+#endif
        if (res) {
                printf("i2c_write returned %d\n", res);
                return -1;
        }
 
        start = get_timer(0);
-       while ((res = i2c_read(0x29, 0, 0, recvbuf, 10))) {
+#ifndef CONFIG_DM_I2C
+       while ((res = i2c_read(0x29, 0, 0, recvbuf, 10)))
+#else
+       while ((res = dm_i2c_read(dev, 0, recvbuf, 10)))
+#endif
+       {
                /* TODO Use TIS_TIMEOUT from tpm_tis_infineon.h */
                if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) {
                        puts("tpm timed out\n");
@@ -97,9 +105,23 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
                udelay(100);
        }
        if (!res) {
-               *recv_len = get_unaligned_be32(recvbuf + 2);
-               if (*recv_len > 10)
+               unsigned int hdr_recv_len;
+               hdr_recv_len = get_unaligned_be32(recvbuf + 2);
+               if (hdr_recv_len < 10) {
+                       puts("tpm response header too small\n");
+                       return -1;
+               } else if (hdr_recv_len > *recv_len) {
+                       puts("tpm response length is bigger than receive buffer\n");
+                       return -1;
+               } else {
+                       *recv_len = hdr_recv_len;
+#ifndef CONFIG_DM_I2C
                        res = i2c_read(0x29, 0, 0, recvbuf, *recv_len);
+#else
+                       res = dm_i2c_read(dev, 0, recvbuf, *recv_len);
+#endif
+
+               }
        }
        if (res) {
                printf("i2c_read returned %d (rlen=%d)\n", res, *recv_len);