[coreboot-gerrit] Patch set updated for coreboot: spi: Get rid of rw flag in spi_slave structure

Furquan Shaikh (furquan@google.com) gerrit at coreboot.org
Fri Nov 18 00:34:31 CET 2016


Furquan Shaikh (furquan at google.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17462

-gerrit

commit b91e92a706bc7cc88db701e35008f643028c7a22
Author: Furquan Shaikh <furquan at chromium.org>
Date:   Thu Nov 17 15:13:03 2016 -0800

    spi: Get rid of rw flag in spi_slave structure
    
    RW flag was introduced to inform claim/release operations of SPI
    controller about whether the SPI operation to be performed involves
    read or write. This rw flag is not a property or attribute of the SPI
    slave or controller. It is a property of the SPI operation. Thus,
    instead of saving it in spi_slave structure pass it explicitly to
    spi_{claim,release}_bus functions so that the SPI controllers which care
    about that flag can use it.
    
    This rw flag seemed to have been used incorrectly in a lot of
    places (some SoCs seem to have assumed that the flag was a constant
    attribute of the controller). Thus, get rid of all these assignments and
    only pass the appropriate READ/WRITE flag depending upon operation to
    claim and release bus functions.
    
    BUG=None
    BRANCH=None
    TEST=All boards compile successfully using abuild.
    
    Change-Id: Idfc052e82ec15b6c9fa874cee7a61bd06e923fbf
    Signed-off-by: Furquan Shaikh <furquan at chromium.org>
---
 src/cpu/amd/pi/spi.c                          |  6 ++----
 src/drivers/spi/adesto.c                      |  5 ++---
 src/drivers/spi/amic.c                        |  5 ++---
 src/drivers/spi/atmel.c                       |  5 ++---
 src/drivers/spi/eon.c                         |  2 --
 src/drivers/spi/gigadevice.c                  |  2 --
 src/drivers/spi/macronix.c                    |  2 --
 src/drivers/spi/spansion.c                    |  2 --
 src/drivers/spi/spi_flash.c                   | 14 ++++++------
 src/drivers/spi/spiconsole.c                  |  2 +-
 src/drivers/spi/sst.c                         |  4 ----
 src/drivers/spi/stmicro.c                     |  4 ++--
 src/drivers/spi/tpm/tpm.c                     | 10 ++++-----
 src/drivers/spi/winbond.c                     |  2 --
 src/ec/google/chromeec/ec_spi.c               |  4 ++--
 src/include/spi-generic.h                     | 10 +++++----
 src/northbridge/amd/agesa/oem_s3.c            |  6 ++----
 src/northbridge/amd/amdmct/mct_ddr3/s3utils.c |  6 ++----
 src/soc/broadcom/cygnus/spi.c                 |  4 ++--
 src/soc/imgtec/pistachio/spi.c                |  5 ++---
 src/soc/intel/apollolake/spi.c                |  4 ++--
 src/soc/intel/baytrail/spi.c                  |  4 ++--
 src/soc/intel/braswell/spi.c                  |  4 ++--
 src/soc/intel/broadwell/spi.c                 |  4 ++--
 src/soc/intel/fsp_baytrail/spi.c              |  4 ++--
 src/soc/intel/fsp_broadwell_de/spi.c          |  4 ++--
 src/soc/intel/skylake/flash_controller.c      | 10 ++++-----
 src/soc/marvell/armada38x/spi.c               |  4 ++--
 src/soc/marvell/bg4cd/spi.c                   |  4 ++--
 src/soc/mediatek/mt8173/spi.c                 |  4 ++--
 src/soc/nvidia/tegra124/spi.c                 |  4 ++--
 src/soc/nvidia/tegra210/spi.c                 |  4 ++--
 src/soc/qualcomm/ipq40xx/spi.c                |  4 ++--
 src/soc/qualcomm/ipq806x/spi.c                |  4 ++--
 src/soc/rockchip/common/spi.c                 | 31 +++++++--------------------
 src/soc/samsung/exynos5420/spi.c              | 13 ++++++-----
 src/southbridge/amd/agesa/hudson/spi.c        |  8 +++----
 src/southbridge/amd/cimx/sb800/spi.c          |  8 +++----
 src/southbridge/amd/sb700/spi.c               |  4 ++--
 src/southbridge/amd/sb700/spi.h               |  4 ++--
 src/southbridge/intel/common/spi.c            |  9 ++++----
 src/southbridge/intel/fsp_rangeley/spi.c      |  4 ++--
 42 files changed, 103 insertions(+), 140 deletions(-)

diff --git a/src/cpu/amd/pi/spi.c b/src/cpu/amd/pi/spi.c
index f571805..f4c0c01 100644
--- a/src/cpu/amd/pi/spi.c
+++ b/src/cpu/amd/pi/spi.c
@@ -31,15 +31,13 @@ void spi_SaveS3info(u32 pos, u32 size, u8 *buf, u32 len)
 		return;
 	}
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_claim_bus(flash->spi);
+	spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 
 	flash->erase(flash, pos, size);
 	flash->write(flash, pos, sizeof(len), &len);
 	flash->write(flash, pos + sizeof(len), len, buf);
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 
 	return;
 }
diff --git a/src/drivers/spi/adesto.c b/src/drivers/spi/adesto.c
index fdde90f..78be0ba 100644
--- a/src/drivers/spi/adesto.c
+++ b/src/drivers/spi/adesto.c
@@ -92,8 +92,7 @@ static int adesto_write(struct spi_flash *flash,
 	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	ret = spi_claim_bus(flash->spi);
+	ret = spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 	if (ret) {
 		printk(BIOS_WARNING, "SF: Unable to claim SPI bus\n");
 		return ret;
@@ -141,7 +140,7 @@ static int adesto_write(struct spi_flash *flash,
 	ret = 0;
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/drivers/spi/amic.c b/src/drivers/spi/amic.c
index e5f6672..7e4d6c1 100644
--- a/src/drivers/spi/amic.c
+++ b/src/drivers/spi/amic.c
@@ -74,8 +74,7 @@ static int amic_write(struct spi_flash *flash,
 	page_size = 1 << amic->params->l2_page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	ret = spi_claim_bus(flash->spi);
+	ret = spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 	if (ret) {
 		printk(BIOS_WARNING, "SF: Unable to claim SPI bus\n");
 		return ret;
@@ -123,7 +122,7 @@ static int amic_write(struct spi_flash *flash,
 	ret = 0;
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/drivers/spi/atmel.c b/src/drivers/spi/atmel.c
index 0286e09..04b87c5 100644
--- a/src/drivers/spi/atmel.c
+++ b/src/drivers/spi/atmel.c
@@ -119,8 +119,7 @@ static int atmel_write(struct spi_flash *flash,
 	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	ret = spi_claim_bus(flash->spi);
+	ret = spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 	if (ret) {
 		printk(BIOS_WARNING, "SF: Unable to claim SPI bus\n");
 		return ret;
@@ -168,7 +167,7 @@ static int atmel_write(struct spi_flash *flash,
 	ret = 0;
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/drivers/spi/eon.c b/src/drivers/spi/eon.c
index 923b0a5..f3204b5 100644
--- a/src/drivers/spi/eon.c
+++ b/src/drivers/spi/eon.c
@@ -89,8 +89,6 @@ static int eon_write(struct spi_flash *flash,
 	page_size = 1 << eon->params->page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
 		chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
diff --git a/src/drivers/spi/gigadevice.c b/src/drivers/spi/gigadevice.c
index 780cc82..6137053 100644
--- a/src/drivers/spi/gigadevice.c
+++ b/src/drivers/spi/gigadevice.c
@@ -132,8 +132,6 @@ static int gigadevice_write(struct spi_flash *flash, u32 offset,
 	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
 		chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
diff --git a/src/drivers/spi/macronix.c b/src/drivers/spi/macronix.c
index 09cb80c..99cffd7 100644
--- a/src/drivers/spi/macronix.c
+++ b/src/drivers/spi/macronix.c
@@ -159,8 +159,6 @@ static int macronix_write(struct spi_flash *flash,
 	page_size = mcx->params->page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
 		chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
diff --git a/src/drivers/spi/spansion.c b/src/drivers/spi/spansion.c
index fc6cef9..61351b8 100644
--- a/src/drivers/spi/spansion.c
+++ b/src/drivers/spi/spansion.c
@@ -214,8 +214,6 @@ static int spansion_write(struct spi_flash *flash,
 	page_addr = offset / page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
 
diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c
index 6006420..a00ff02 100644
--- a/src/drivers/spi/spi_flash.c
+++ b/src/drivers/spi/spi_flash.c
@@ -50,8 +50,14 @@ static int do_spi_flash_cmd(struct spi_slave *spi, const void *dout,
 		unsigned int bytes_out, void *din, unsigned int bytes_in)
 {
 	int ret = 1;
+	int rw = 0;
 
-	if (spi_claim_bus(spi))
+	if (dout && bytes_out)
+		rw |= SPI_WRITE_FLAG;
+	if (din && bytes_in)
+		rw |= SPI_READ_FLAG;
+
+	if (spi_claim_bus(spi, rw))
 		return ret;
 
 #if CONFIG_SPI_ATOMIC_SEQUENCING == 1
@@ -71,7 +77,7 @@ static int do_spi_flash_cmd(struct spi_slave *spi, const void *dout,
 
 	ret = 0;
 done:
-	spi_release_bus(spi);
+	spi_release_bus(spi, rw);
 	return ret;
 }
 
@@ -207,8 +213,6 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
 		return -1;
 	}
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	cmd[0] = flash->erase_cmd;
 	start = offset;
 	end = start + len;
@@ -325,8 +329,6 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs)
 		return NULL;
 	}
 
-	spi->rw = SPI_READ_FLAG;
-
 	if (spi->force_programmer_specific && spi->programmer_specific_probe) {
 		flash = spi->programmer_specific_probe (spi);
 		if (!flash)
diff --git a/src/drivers/spi/spiconsole.c b/src/drivers/spi/spiconsole.c
index a2a1eff..5383716 100644
--- a/src/drivers/spi/spiconsole.c
+++ b/src/drivers/spi/spiconsole.c
@@ -54,7 +54,7 @@ void spiconsole_tx_byte(unsigned char c) {
 	if (c == '\n' || (sizeof(struct em100_msg_header) +
 			msg.header.msg_length == spi_crop_chunk(0,
 			MAX_MSG_LENGTH))) {
-		struct spi_slave spi = {.rw = SPI_READ_FLAG};
+		struct spi_slave spi;
 
 		spi_xfer(&spi, &msg, sizeof(struct em100_msg_header) +
 				msg.header.msg_length, NULL, 0);
diff --git a/src/drivers/spi/sst.c b/src/drivers/spi/sst.c
index 87c1c5b..338345c 100644
--- a/src/drivers/spi/sst.c
+++ b/src/drivers/spi/sst.c
@@ -170,8 +170,6 @@ sst_write_256(struct spi_flash *flash, u32 offset, size_t len, const void *buf)
 	page_size = 256;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	/* If the data is not word aligned, write out leading single byte */
 	actual = offset % 2;
 	if (actual) {
@@ -241,8 +239,6 @@ sst_write_ai(struct spi_flash *flash, u32 offset, size_t len, const void *buf)
 	int ret = 0;
 	u8 cmd[4];
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	/* If the data is not word aligned, write out leading single byte */
 	actual = offset % 2;
 	if (actual) {
diff --git a/src/drivers/spi/stmicro.c b/src/drivers/spi/stmicro.c
index 6ab601c..6fb3737 100644
--- a/src/drivers/spi/stmicro.c
+++ b/src/drivers/spi/stmicro.c
@@ -188,7 +188,7 @@ static int stmicro_write(struct spi_flash *flash,
 	page_size = stm->params->page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
+	spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
@@ -232,7 +232,7 @@ static int stmicro_write(struct spi_flash *flash,
 	ret = 0;
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/drivers/spi/tpm/tpm.c b/src/drivers/spi/tpm/tpm.c
index 9651ea8..e2d5ca4 100644
--- a/src/drivers/spi/tpm/tpm.c
+++ b/src/drivers/spi/tpm/tpm.c
@@ -37,8 +37,8 @@
 /* SPI Interface descriptor used by the driver. */
 struct tpm_spi_if {
 	struct spi_slave *slave;
-	int (*cs_assert)(struct spi_slave *slave);
-	void (*cs_deassert)(struct spi_slave *slave);
+	int (*cs_assert)(struct spi_slave *slave, int rw);
+	void (*cs_deassert)(struct spi_slave *slave, int rw);
 	int  (*xfer)(struct spi_slave *slave, const void *dout,
 		     unsigned bytesout, void *din,
 		     unsigned bytesin);
@@ -130,7 +130,7 @@ static void start_transaction(int read_write, size_t bytes, unsigned addr)
 		header.body[i + 1] = (addr >> (8 * (2 - i))) & 0xff;
 
 	/* CS assert wakes up the slave. */
-	tpm_if.cs_assert(tpm_if.slave);
+	tpm_if.cs_assert(tpm_if.slave, SPI_READ_FLAG | SPI_WRITE_FLAG);
 
 	/*
 	 * The TCG TPM over SPI specification introduces the notion of SPI
@@ -251,7 +251,7 @@ static int tpm2_write_reg(unsigned reg_number, const void *buffer, size_t bytes)
 	trace_dump("W", reg_number, bytes, buffer, 0);
 	start_transaction(false, bytes, reg_number);
 	write_bytes(buffer, bytes);
-	tpm_if.cs_deassert(tpm_if.slave);
+	tpm_if.cs_deassert(tpm_if.slave, SPI_READ_FLAG | SPI_WRITE_FLAG);
 	return 1;
 }
 
@@ -266,7 +266,7 @@ static int tpm2_read_reg(unsigned reg_number, void *buffer, size_t bytes)
 {
 	start_transaction(true, bytes, reg_number);
 	read_bytes(buffer, bytes);
-	tpm_if.cs_deassert(tpm_if.slave);
+	tpm_if.cs_deassert(tpm_if.slave, SPI_READ_FLAG | SPI_WRITE_FLAG);
 	trace_dump("R", reg_number, bytes, buffer, 0);
 	return 1;
 }
diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c
index defb8a5..bbec69d 100644
--- a/src/drivers/spi/winbond.c
+++ b/src/drivers/spi/winbond.c
@@ -150,8 +150,6 @@ static int winbond_write(struct spi_flash *flash,
 	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	for (actual = 0; actual < len; actual += chunk_len) {
 		chunk_len = min(len - actual, page_size - byte_addr);
 		chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
diff --git a/src/ec/google/chromeec/ec_spi.c b/src/ec/google/chromeec/ec_spi.c
index a0049c6..1f68118 100644
--- a/src/ec/google/chromeec/ec_spi.c
+++ b/src/ec/google/chromeec/ec_spi.c
@@ -53,7 +53,7 @@ static int crosec_spi_io(size_t req_size, size_t resp_size, void *context)
 
 	while (!stopwatch_expired(&cs_cooldown_sw))
 		/* Wait minimum delay between CS assertions. */;
-	spi_claim_bus(slave);
+	spi_claim_bus(slave, SPI_WRITE_FLAG | SPI_READ_FLAG);
 
 	 /* Allow EC to ramp up clock after being awaken.
 	  * See chrome-os-partner:32223 for more details. */
@@ -94,7 +94,7 @@ static int crosec_spi_io(size_t req_size, size_t resp_size, void *context)
 	}
 
 out:
-	spi_release_bus(slave);
+	spi_release_bus(slave, SPI_WRITE_FLAG | SPI_READ_FLAG);
 	stopwatch_init_usecs_expire(&cs_cooldown_sw, cs_cooldown_us);
 	return ret;
 }
diff --git a/src/include/spi-generic.h b/src/include/spi-generic.h
index 9097f48..497e332 100644
--- a/src/include/spi-generic.h
+++ b/src/include/spi-generic.h
@@ -34,7 +34,6 @@
  *
  *   bus:	ID of the bus that the slave is attached to.
  *   cs:	ID of the chip select connected to the slave.
- *   rw: 	Read or Write flag
  *   max_transfer_size: maximum amount of bytes which can be sent in a single
  *              read or write transaction, usually this is a controller
  *              property, kept in the slave structure for convenience. Zero in
@@ -43,7 +42,6 @@
 struct spi_slave {
 	unsigned int	bus;
 	unsigned int	cs;
-	unsigned int	rw;
 	unsigned int	max_transfer_size;
 	int force_programmer_specific;
 	struct spi_flash * (*programmer_specific_probe) (struct spi_slave *spi);
@@ -81,11 +79,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs);
  * the bus in between.
  *
  *   slave:	The SPI slave
+ *   rw:	Read/write flag indicating operation that will be performed
+ *              after claiming bus
  *
  * Returns: 0 if the bus was claimed successfully, or a negative value
  * if it wasn't.
  */
-int spi_claim_bus(struct spi_slave *slave);
+int spi_claim_bus(struct spi_slave *slave, int rw);
 
 /*-----------------------------------------------------------------------
  * Release the SPI bus
@@ -95,8 +95,10 @@ int spi_claim_bus(struct spi_slave *slave);
  * appropriate.
  *
  *   slave:	The SPI slave
+ *   rw:	Read/write flag indicating operation that was performed after
+ *              claiming bus
  */
-void spi_release_bus(struct spi_slave *slave);
+void spi_release_bus(struct spi_slave *slave, int rw);
 
 /*-----------------------------------------------------------------------
  * SPI transfer
diff --git a/src/northbridge/amd/agesa/oem_s3.c b/src/northbridge/amd/agesa/oem_s3.c
index fcf8ada..68c10d3 100644
--- a/src/northbridge/amd/agesa/oem_s3.c
+++ b/src/northbridge/amd/agesa/oem_s3.c
@@ -97,15 +97,13 @@ static int spi_SaveS3info(u32 pos, u32 size, u8 *buf, u32 len)
 	if (!flash)
 		return -1;
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_claim_bus(flash->spi);
+	spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 
 	flash->erase(flash, pos, size);
 	flash->write(flash, pos, sizeof(len), &len);
 	flash->write(flash, pos + sizeof(len), len, buf);
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return 0;
 #else
 	return -1;
diff --git a/src/northbridge/amd/amdmct/mct_ddr3/s3utils.c b/src/northbridge/amd/amdmct/mct_ddr3/s3utils.c
index 97cadcb..1fc9bf7 100644
--- a/src/northbridge/amd/amdmct/mct_ddr3/s3utils.c
+++ b/src/northbridge/amd/amdmct/mct_ddr3/s3utils.c
@@ -1141,8 +1141,7 @@ int8_t save_mct_information_to_nvram(void)
 	}
 
 	/* Set up SPI flash access */
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_claim_bus(flash->spi);
+	spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 
 	/* Erase and write data structure */
 	flash->erase(flash, s3nv_offset, CONFIG_S3_DATA_SIZE);
@@ -1152,8 +1151,7 @@ int8_t save_mct_information_to_nvram(void)
 	free(persistent_data);
 
 	/* Tear down SPI flash access */
-	flash->spi->rw = SPI_WRITE_FLAG;
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 
 	/* Allow training bypass if DIMM configuration is unchanged on next boot */
 	nvram = 1;
diff --git a/src/soc/broadcom/cygnus/spi.c b/src/soc/broadcom/cygnus/spi.c
index d7c0a8d..76b9a73 100644
--- a/src/soc/broadcom/cygnus/spi.c
+++ b/src/soc/broadcom/cygnus/spi.c
@@ -156,7 +156,7 @@ static int mspi_enable(struct qspi_priv *priv)
 	return 0;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct qspi_priv *priv = to_qspi_slave(slave);
 
@@ -175,7 +175,7 @@ int spi_claim_bus(struct spi_slave *slave)
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct qspi_priv *priv = to_qspi_slave(slave);
 
diff --git a/src/soc/imgtec/pistachio/spi.c b/src/soc/imgtec/pistachio/spi.c
index f38607c..d6842f9 100644
--- a/src/soc/imgtec/pistachio/spi.c
+++ b/src/soc/imgtec/pistachio/spi.c
@@ -444,7 +444,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 	img_slave->base = base;
 	slave->bus = bus;
 	slave->cs = cs;
-	slave->rw = SPI_READ_FLAG | SPI_WRITE_FLAG;
 	slave->max_transfer_size = IMGTEC_SPI_MAX_TRANSFER_SIZE;
 
 	device_parameters->bitrate = 64;
@@ -460,7 +459,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 }
 
 /* Claim the bus and prepare it for communication */
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	int ret;
 	struct img_spi_slave *img_slave;
@@ -491,7 +490,7 @@ int spi_claim_bus(struct spi_slave *slave)
 }
 
 /* Release the SPI bus */
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct img_spi_slave *img_slave;
 
diff --git a/src/soc/intel/apollolake/spi.c b/src/soc/intel/apollolake/spi.c
index d60176a..13ec626 100644
--- a/src/soc/intel/apollolake/spi.c
+++ b/src/soc/intel/apollolake/spi.c
@@ -213,13 +213,13 @@ void spi_init(void)
 	pci_write_config32(ctx->pci_dev, SPIBAR_BIOS_CONTROL, bios_ctl);
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* There's nothing we need to to here. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* No magic needed here. */
 }
diff --git a/src/soc/intel/baytrail/spi.c b/src/soc/intel/baytrail/spi.c
index ffe6198..c2d0875 100644
--- a/src/soc/intel/baytrail/spi.c
+++ b/src/soc/intel/baytrail/spi.c
@@ -316,13 +316,13 @@ static void spi_init_cb(void *unused)
 
 BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_ENTRY, spi_init_cb, NULL);
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
diff --git a/src/soc/intel/braswell/spi.c b/src/soc/intel/braswell/spi.c
index 01fe773..02f2ce8 100644
--- a/src/soc/intel/braswell/spi.c
+++ b/src/soc/intel/braswell/spi.c
@@ -295,13 +295,13 @@ static void spi_init_cb(void *unused)
 
 BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_ENTRY, spi_init_cb, NULL);
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
diff --git a/src/soc/intel/broadwell/spi.c b/src/soc/intel/broadwell/spi.c
index e07b425..6fe1d50 100644
--- a/src/soc/intel/broadwell/spi.c
+++ b/src/soc/intel/broadwell/spi.c
@@ -312,13 +312,13 @@ static void spi_init_cb(void *unused)
 
 BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_ENTRY, spi_init_cb, NULL);
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
diff --git a/src/soc/intel/fsp_baytrail/spi.c b/src/soc/intel/fsp_baytrail/spi.c
index 374e7f6..46d9528 100644
--- a/src/soc/intel/fsp_baytrail/spi.c
+++ b/src/soc/intel/fsp_baytrail/spi.c
@@ -296,13 +296,13 @@ void spi_init(void)
 	cntlr.preop = &ich9_spi->preop;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
diff --git a/src/soc/intel/fsp_broadwell_de/spi.c b/src/soc/intel/fsp_broadwell_de/spi.c
index 116001f..f2d840c 100644
--- a/src/soc/intel/fsp_broadwell_de/spi.c
+++ b/src/soc/intel/fsp_broadwell_de/spi.c
@@ -312,13 +312,13 @@ void spi_init(void)
 	pci_write_config_byte(dev, 0xdc, bios_cntl | 0x1);
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
diff --git a/src/soc/intel/skylake/flash_controller.c b/src/soc/intel/skylake/flash_controller.c
index 56c7c69..64a65f3 100644
--- a/src/soc/intel/skylake/flash_controller.c
+++ b/src/soc/intel/skylake/flash_controller.c
@@ -170,13 +170,13 @@ void spi_init(void)
 	pci_write_config_byte(dev, SPIBAR_BIOS_CNTL, bios_cntl);
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by PCH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by PCH automatically. */
 }
@@ -192,11 +192,11 @@ int pch_hwseq_erase(struct spi_flash *flash, u32 offset, size_t len)
 		return -1;
 	}
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-
 	start = offset;
 	end = start + len;
 
+	spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
+
 	while (offset < end) {
 		if (spi_do_operation(HSFC_FCYCLE_4KE, offset, 0, 5000)) {
 			printk(BIOS_ERR, "SF: Erase failed at %x\n", offset);
@@ -211,7 +211,7 @@ int pch_hwseq_erase(struct spi_flash *flash, u32 offset, size_t len)
 		len, start);
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/soc/marvell/armada38x/spi.c b/src/soc/marvell/armada38x/spi.c
index 6a0e062..e58c670 100644
--- a/src/soc/marvell/armada38x/spi.c
+++ b/src/soc/marvell/armada38x/spi.c
@@ -454,14 +454,14 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 	return slave;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	mv_spi_cs_set(slave->bus, slave->cs);
 	mv_spi_cs_assert(slave->bus);
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	mv_spi_cs_deassert(slave->bus);
 }
diff --git a/src/soc/marvell/bg4cd/spi.c b/src/soc/marvell/bg4cd/spi.c
index 53f46c7..9ff2ba5 100644
--- a/src/soc/marvell/bg4cd/spi.c
+++ b/src/soc/marvell/bg4cd/spi.c
@@ -20,12 +20,12 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 	return NULL;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 }
 
diff --git a/src/soc/mediatek/mt8173/spi.c b/src/soc/mediatek/mt8173/spi.c
index c35b1fc..cbed7dd 100644
--- a/src/soc/mediatek/mt8173/spi.c
+++ b/src/soc/mediatek/mt8173/spi.c
@@ -181,7 +181,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 	};
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct mtk_spi_bus *mtk_slave = to_mtk_spi(slave);
 	struct mtk_spi_regs *regs = mtk_slave->regs;
@@ -300,7 +300,7 @@ int spi_xfer(struct spi_slave *slave, const void *dout, unsigned int bytes_out,
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct mtk_spi_bus *mtk_slave = to_mtk_spi(slave);
 	struct mtk_spi_regs *regs = mtk_slave->regs;
diff --git a/src/soc/nvidia/tegra124/spi.c b/src/soc/nvidia/tegra124/spi.c
index d5be4a6..92f76fb 100644
--- a/src/soc/nvidia/tegra124/spi.c
+++ b/src/soc/nvidia/tegra124/spi.c
@@ -209,7 +209,7 @@ static unsigned int tegra_spi_speed(unsigned int bus)
 	return 50000000;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct tegra_spi_regs *regs = to_tegra_spi(slave->bus)->regs;
 	u32 val;
@@ -232,7 +232,7 @@ int spi_claim_bus(struct spi_slave *slave)
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct tegra_spi_regs *regs = to_tegra_spi(slave->bus)->regs;
 	u32 val;
diff --git a/src/soc/nvidia/tegra210/spi.c b/src/soc/nvidia/tegra210/spi.c
index b01289c..8e70b58 100644
--- a/src/soc/nvidia/tegra210/spi.c
+++ b/src/soc/nvidia/tegra210/spi.c
@@ -208,7 +208,7 @@ static struct tegra_spi_channel * const to_tegra_spi(int bus) {
 	return &tegra_spi_channels[bus - 1];
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct tegra_spi_regs *regs = to_tegra_spi(slave->bus)->regs;
 	u32 val;
@@ -231,7 +231,7 @@ int spi_claim_bus(struct spi_slave *slave)
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct tegra_spi_regs *regs = to_tegra_spi(slave->bus)->regs;
 	u32 val;
diff --git a/src/soc/qualcomm/ipq40xx/spi.c b/src/soc/qualcomm/ipq40xx/spi.c
index 8d39f77..ea4d371 100644
--- a/src/soc/qualcomm/ipq40xx/spi.c
+++ b/src/soc/qualcomm/ipq40xx/spi.c
@@ -319,7 +319,7 @@ static int spi_hw_init(struct ipq_spi_slave *ds)
 	return SUCCESS;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct ipq_spi_slave *ds = to_ipq_spi(slave);
 	unsigned int ret;
@@ -331,7 +331,7 @@ int spi_claim_bus(struct spi_slave *slave)
 	return SUCCESS;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct ipq_spi_slave *ds = to_ipq_spi(slave);
 
diff --git a/src/soc/qualcomm/ipq806x/spi.c b/src/soc/qualcomm/ipq806x/spi.c
index 4a35313..9126beb 100644
--- a/src/soc/qualcomm/ipq806x/spi.c
+++ b/src/soc/qualcomm/ipq806x/spi.c
@@ -617,7 +617,7 @@ static int spi_hw_init(struct ipq_spi_slave *ds)
 	return SUCCESS;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct ipq_spi_slave *ds = to_ipq_spi(slave);
 	unsigned int ret;
@@ -640,7 +640,7 @@ int spi_claim_bus(struct spi_slave *slave)
 	return SUCCESS;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct ipq_spi_slave *ds = to_ipq_spi(slave);
 
diff --git a/src/soc/rockchip/common/spi.c b/src/soc/rockchip/common/spi.c
index 57e9ca1..63f45d4 100644
--- a/src/soc/rockchip/common/spi.c
+++ b/src/soc/rockchip/common/spi.c
@@ -37,45 +37,30 @@ struct rockchip_spi_slave {
 
 static struct rockchip_spi_slave rockchip_spi_slaves[] = {
 	{
-	 .slave = {
-		   .bus = 0,
-		   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG,
-		   },
+	 .slave = { .bus = 0, },
 	 .regs = (void *)SPI0_BASE,
 	},
 	{
-	 .slave = {.bus = 1, .rw = SPI_READ_FLAG,},
+	 .slave = { .bus = 1, },
 	 .regs = (void *)SPI1_BASE,
 	},
 	{
-	 .slave = {
-		   .bus = 2,
-		   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG,
-		   },
+	 .slave = { .bus = 2, },
 	 .regs = (void *)SPI2_BASE,
 	},
 #ifdef SPI3_BASE
 	{
-	 .slave = {
-		   .bus = 3,
-		   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG,
-		   },
+	 .slave = { .bus = 3, },
 	 .regs = (void *)SPI3_BASE,
 	},
 #ifdef SPI4_BASE
 	{
-	 .slave = {
-		   .bus = 4,
-		   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG,
-		   },
+	 .slave = { .bus = 4, },
 	 .regs = (void *)SPI4_BASE,
 	},
 #ifdef SPI5_BASE
 	{
-	 .slave = {
-		   .bus = 5,
-		   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG,
-		   },
+	 .slave = { .bus = 5, },
 	 .regs = (void *)SPI5_BASE,
 	},
 #endif
@@ -172,13 +157,13 @@ void rockchip_spi_set_sample_delay(unsigned int bus, unsigned int delay_ns)
 			rsd << SPI_RXDSD_OFFSET);
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	spi_cs_activate(slave);
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	spi_cs_deactivate(slave);
 }
diff --git a/src/soc/samsung/exynos5420/spi.c b/src/soc/samsung/exynos5420/spi.c
index 589809d..3f36783 100644
--- a/src/soc/samsung/exynos5420/spi.c
+++ b/src/soc/samsung/exynos5420/spi.c
@@ -48,13 +48,12 @@ static struct exynos_spi_slave exynos_spi_slaves[3] = {
 	},
 	// SPI 1
 	{
-		.slave = { .bus = 1, .rw = SPI_READ_FLAG, },
+		.slave = { .bus = 1, },
 		.regs = (void *)EXYNOS5_SPI1_BASE,
 	},
 	// SPI 2
 	{
-		.slave = { .bus = 2,
-			   .rw = SPI_READ_FLAG | SPI_WRITE_FLAG, },
+		.slave = { .bus = 2, },
 		.regs = (void *)EXYNOS5_SPI2_BASE,
 	},
 };
@@ -129,7 +128,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
 	return &eslave->slave;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	struct exynos_spi *regs = to_exynos_spi(slave)->regs;
 	// TODO(hungte) Add some delay if too many transactions happen at once.
@@ -214,7 +213,7 @@ int spi_xfer(struct spi_slave *slave, const void *dout, unsigned int bytes_out,
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	struct exynos_spi *regs = to_exynos_spi(slave)->regs;
 	setbits_le32(&regs->cs_reg, SPI_SLAVE_SIG_INACT);
@@ -225,7 +224,7 @@ static int exynos_spi_read(struct spi_slave *slave, void *dest, uint32_t len,
 {
 	struct exynos_spi *regs = to_exynos_spi(slave)->regs;
 	u32 command;
-	spi_claim_bus(slave);
+	spi_claim_bus(slave, SPI_READ_FLAG);
 
 	// Send address.
 	ASSERT(off < (1 << 24));
@@ -234,7 +233,7 @@ static int exynos_spi_read(struct spi_slave *slave, void *dest, uint32_t len,
 
 	// Read the data.
 	spi_transfer(regs, dest, NULL, len);
-	spi_release_bus(slave);
+	spi_release_bus(slave, SPI_READ_FLAG);
 
 	return len;
 }
diff --git a/src/southbridge/amd/agesa/hudson/spi.c b/src/southbridge/amd/agesa/hudson/spi.c
index 31160bd..fde5b7a 100644
--- a/src/southbridge/amd/agesa/hudson/spi.c
+++ b/src/southbridge/amd/agesa/hudson/spi.c
@@ -149,11 +149,11 @@ int spi_xfer(struct spi_slave *slave, const void *dout,
 
 	return 0;
 }
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 #if IS_ENABLED (CONFIG_HUDSON_IMC_FWM)
 
-	if (slave->rw == SPI_WRITE_FLAG) {
+	if (rw == SPI_WRITE_FLAG) {
 		bus_claimed++;
 		if (bus_claimed == 1)
 			ImcSleep(NULL);
@@ -163,11 +163,11 @@ int spi_claim_bus(struct spi_slave *slave)
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 #if IS_ENABLED (CONFIG_HUDSON_IMC_FWM)
 
-	if (slave->rw == SPI_WRITE_FLAG)  {
+	if (rw == SPI_WRITE_FLAG)  {
 		bus_claimed--;
 		if (bus_claimed <= 0) {
 			bus_claimed = 0;
diff --git a/src/southbridge/amd/cimx/sb800/spi.c b/src/southbridge/amd/cimx/sb800/spi.c
index f689892..3b4ca47 100644
--- a/src/southbridge/amd/cimx/sb800/spi.c
+++ b/src/southbridge/amd/cimx/sb800/spi.c
@@ -144,11 +144,11 @@ static void ImcWakeup(void)
 }
 #endif
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 #if IS_ENABLED (CONFIG_SB800_IMC_FWM)
 
-	if (slave->rw == SPI_WRITE_FLAG) {
+	if (rw == SPI_WRITE_FLAG) {
 		bus_claimed++;
 		if (bus_claimed == 1)
 			ImcSleep();
@@ -158,11 +158,11 @@ int spi_claim_bus(struct spi_slave *slave)
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 #if IS_ENABLED (CONFIG_SB800_IMC_FWM)
 
-	if (slave->rw == SPI_WRITE_FLAG)  {
+	if (rw == SPI_WRITE_FLAG)  {
 		bus_claimed--;
 		if (bus_claimed <= 0) {
 			bus_claimed = 0;
diff --git a/src/southbridge/amd/sb700/spi.c b/src/southbridge/amd/sb700/spi.c
index fa316f1..d22a96e 100644
--- a/src/southbridge/amd/sb700/spi.c
+++ b/src/southbridge/amd/sb700/spi.c
@@ -65,13 +65,13 @@ static void execute_command(void)
 		(read8((void *)(spibar+3)) & 0x80));
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled internally by the SB700 */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled internally by the SB700 */
 }
diff --git a/src/southbridge/amd/sb700/spi.h b/src/southbridge/amd/sb700/spi.h
index ed5b858..f202c12 100644
--- a/src/southbridge/amd/sb700/spi.h
+++ b/src/southbridge/amd/sb700/spi.h
@@ -13,5 +13,5 @@
  * GNU General Public License for more details.
  */
 
-int spi_claim_bus(struct spi_slave *slave);
-void spi_release_bus(struct spi_slave *slave);
+int spi_claim_bus(struct spi_slave *slave, int rw);
+void spi_release_bus(struct spi_slave *slave, int rw);
diff --git a/src/southbridge/intel/common/spi.c b/src/southbridge/intel/common/spi.c
index 1ab151b..0ed3224 100644
--- a/src/southbridge/intel/common/spi.c
+++ b/src/southbridge/intel/common/spi.c
@@ -360,13 +360,13 @@ static void spi_init_cb(void *unused)
 
 BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_ENTRY, spi_init_cb, NULL);
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }
@@ -750,8 +750,7 @@ static int ich_hwseq_erase(struct spi_flash *flash, u32 offset, size_t len)
 		return -1;
 	}
 
-	flash->spi->rw = SPI_WRITE_FLAG;
-	ret = spi_claim_bus(flash->spi);
+	ret = spi_claim_bus(flash->spi, SPI_WRITE_FLAG);
 	if (ret) {
 		printk(BIOS_ERR, "SF: Unable to claim SPI bus\n");
 		return ret;
@@ -784,7 +783,7 @@ static int ich_hwseq_erase(struct spi_flash *flash, u32 offset, size_t len)
 	printk(BIOS_DEBUG, "SF: Successfully erased %zu bytes @ %#x\n", len, start);
 
 out:
-	spi_release_bus(flash->spi);
+	spi_release_bus(flash->spi, SPI_WRITE_FLAG);
 	return ret;
 }
 
diff --git a/src/southbridge/intel/fsp_rangeley/spi.c b/src/southbridge/intel/fsp_rangeley/spi.c
index 007c612..45e5185 100644
--- a/src/southbridge/intel/fsp_rangeley/spi.c
+++ b/src/southbridge/intel/fsp_rangeley/spi.c
@@ -428,13 +428,13 @@ void spi_init(void)
 	}
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int spi_claim_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 	return 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void spi_release_bus(struct spi_slave *slave, int rw)
 {
 	/* Handled by ICH automatically. */
 }



More information about the coreboot-gerrit mailing list