According to TCG PC Client Platform TPM Profile (PTP) Specification
only SPI mode 0 is supported. In order to ensure the SPI controller
supports the necessary settings, call spi_setup() and bail out
as soon as possible in error case.

This change should affect all supported TPM SPI devices, because
tpm_tis_spi_probe is either called direct or indirectly.

Signed-off-by: Stefan Wahren <[email protected]>
---
 drivers/char/tpm/tpm_tis_spi_main.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/char/tpm/tpm_tis_spi_main.c 
b/drivers/char/tpm/tpm_tis_spi_main.c
index 61b42c83ced8..e62d297b040e 100644
--- a/drivers/char/tpm/tpm_tis_spi_main.c
+++ b/drivers/char/tpm/tpm_tis_spi_main.c
@@ -248,6 +248,17 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data 
*data, u32 addr,
 int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
                     int irq, const struct tpm_tis_phy_ops *phy_ops)
 {
+       int ret;
+
+       spi->mode &= ~SPI_MODE_X_MASK;
+       spi->mode |= SPI_MODE_0;
+
+       ret = spi_setup(spi);
+       if (ret < 0) {
+               dev_err(&spi->dev, "SPI setup failed: %d\n", ret);
+               return ret;
+       }
+
        phy->iobuf = devm_kmalloc(&spi->dev, SPI_HDRSIZE + MAX_SPI_FRAMESIZE, 
GFP_KERNEL);
        if (!phy->iobuf)
                return -ENOMEM;
--
2.34.1


Reply via email to