On some designs, the reset line could not be connected to the SoC reset
line, in this case, request the GPIO and ensure the chip gets reset.

Signed-off-by: Miquel Raynal <miquel.ray...@bootlin.com>

Changes since v4:
* This patch was part of a bigger series, sending it alone as other
  files seems to be in an acceptable state now.
* Changed the commit title with the prefix "tpm2: tis_spi:" to refer to
  the right file ("tpm:" is too generic now).
* Removed the #ifdef CONFIG_DM_GPIO/#endif couple around the
  <.../gpio.h> include.
* Changed the #ifdef CONFIG_DM_GPIO/#endif couple in the code by a
Changes since v3:
* Removed useless reset of rx_buf[0] in tpm_tis_spi_xfer().
* Changed the way spi_xfer return code is checked: error out on any
  value != 0 instead of just negative ones.
* Removed unused functions flagged __maybe_unused as well as well as the
  __maybe_unused flags themselves when not needed.
* Simplified the validity check of the GPIO as suggested.
* Updated the compatible property for the SPI modules (as well as the
  bindings docuementation) to be simply "tis,tpm2-spi" which should work
  with most compliant chips. Data is linked to this generic compatible
  in the TPM driver, other values may be added if needed in the future
  to fit other chips that would use different values than the current
  ones (used by Infineon SLB 9670 and ST ST33TPHF20 modules, for

 drivers/tpm/tpm2_tis_spi.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/tpm/tpm2_tis_spi.c b/drivers/tpm/tpm2_tis_spi.c
index 6a4d5284c9..2c4d714e01 100644
--- a/drivers/tpm/tpm2_tis_spi.c
+++ b/drivers/tpm/tpm2_tis_spi.c
@@ -24,6 +24,7 @@
 #include <linux/compiler.h>
 #include <linux/types.h>
 #include <linux/unaligned/be_byteshift.h>
+#include <asm-generic/gpio.h>
 #include "tpm_tis.h"
 #include "tpm_internal.h"
@@ -575,6 +576,21 @@ static int tpm_tis_spi_probe(struct udevice *dev)
        struct tpm_chip *chip = dev_get_priv(dev);
        int ret;
+               struct gpio_desc reset_gpio;
+               ret = gpio_request_by_name(dev, "gpio-reset", 0,
+                                          &reset_gpio, GPIOD_IS_OUT);
+               if (ret) {
+                       log(LOGC_NONE, LOGL_NOTICE, "%s: missing reset GPIO\n",
+                           __func__);
+               } else {
+                       dm_gpio_set_value(&reset_gpio, 0);
+                       mdelay(1);
+                       dm_gpio_set_value(&reset_gpio, 1);
+               }
+       }
        /* Ensure a minimum amount of time elapsed since reset of the TPM */

U-Boot mailing list

Reply via email to