refactor: update SPI driver interface
Add a return value to .get_access() function to handle failure cases.
Add .release_access() function.
Signed-off-by: Matthew Ellis <Matthew.Ellis@arm.com>
Change-Id: Ie2c15d625b4821d11150a832626d5678c20a055c
diff --git a/include/transport/spi.h b/include/transport/spi.h
index 5cbf502..24845ed 100644
--- a/include/transport/spi.h
+++ b/include/transport/spi.h
@@ -2,7 +2,8 @@
#define SPI_TRANSPORT_H
struct spi_ops {
- void (*get_access)(void *ctx);
+ int (*get_access)(void *ctx);
+ void (*release_access)(void *ctx);
void (*start)(void *ctx);
void (*stop)(void *ctx);
int (*xfer)(void *ctx, unsigned int bytelen,
diff --git a/src/tpm2_fifo_spi.c b/src/tpm2_fifo_spi.c
index a72868c..3e59dfd 100644
--- a/src/tpm2_fifo_spi.c
+++ b/src/tpm2_fifo_spi.c
@@ -111,12 +111,20 @@
static void tpm2_spi_end_transaction(void)
{
tpm_spidev->ops->stop(tpm_spidev->priv);
+ tpm_spidev->ops->release_access(tpm_spidev->priv);
}
-static void tpm2_spi_init(void)
+static int tpm2_spi_init(void)
{
- tpm_spidev->ops->get_access(tpm_spidev->priv);
+ int rc;
+
+ rc = tpm_spidev->ops->get_access(tpm_spidev->priv);
+ if (rc != 0) {
+ tpm_last_transport_error = rc;
+ return TPM_ERR_TRANSFER;
+ }
tpm_spidev->ops->start(tpm_spidev->priv);
+ return 0;
}
static int tpm2_fifo_io(uint16_t tpm_reg, tpm_access_t access, uint8_t len,
@@ -124,8 +132,11 @@
{
int rc;
- tpm2_spi_init();
-
+ rc = tpm2_spi_init();
+ if (rc != 0) {
+ return rc;
+ }
+
rc = tpm2_spi_start_transaction(tpm_reg, access, len);
if (rc != 0) {
tpm2_spi_end_transaction();