[U-Boot,v5] tpm2: tis_spi: add the possibility to reset the chip with a gpio

Message ID 20180516065916.29683-1-miquel.raynal@bootlin.com
State New
Delegated to: Tom Rini
Headers show
Series
  • [U-Boot,v5] tpm2: tis_spi: add the possibility to reset the chip with a gpio
Related show

Commit Message

Miquel Raynal May 16, 2018, 6:59 a.m.
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.raynal@bootlin.com>
---

Changes since v4:

Comments

Simon Glass May 16, 2018, 3:40 p.m. | #1
On 16 May 2018 at 16:59, Miquel Raynal <miquel.raynal@bootlin.com> wrote:
>
> 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.raynal@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
>   if (IS_ENABLED(CONFIG_DM_GPIO)).
>
> 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
>   instance).
>
>  drivers/tpm/tpm2_tis_spi.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

Patch

=================
* 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
  if (IS_ENABLED(CONFIG_DM_GPIO)).
  
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
  instance).

 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;
 
+	if (IS_ENABLED(CONFIG_DM_GPIO)) {
+		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 */
 	mdelay(drv_data->time_before_first_cmd_ms);