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();