summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/spi/eon.c2
-rw-r--r--src/drivers/spi/gigadevice.c2
-rw-r--r--src/drivers/spi/macronix.c2
-rw-r--r--src/drivers/spi/spansion.c2
-rw-r--r--src/drivers/spi/spi_flash.c6
-rw-r--r--src/drivers/spi/spi_flash_internal.h3
-rw-r--r--src/drivers/spi/sst.c2
-rw-r--r--src/drivers/spi/winbond.c2
-rw-r--r--src/include/spi_flash.h3
9 files changed, 24 insertions, 0 deletions
diff --git a/src/drivers/spi/eon.c b/src/drivers/spi/eon.c
index 004b62bc05..923b0a5601 100644
--- a/src/drivers/spi/eon.c
+++ b/src/drivers/spi/eon.c
@@ -168,11 +168,13 @@ struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode)
eon->flash.write = eon_write;
eon->flash.erase = spi_flash_cmd_erase;
+ eon->flash.status = spi_flash_cmd_status;
eon->flash.read = spi_flash_cmd_read_fast;
eon->flash.sector_size = params->page_size * params->pages_per_sector;
eon->flash.size = params->page_size * params->pages_per_sector
* params->nr_sectors;
eon->flash.erase_cmd = CMD_EN25_SE;
+ eon->flash.status_cmd = CMD_EN25_RDSR;
return &eon->flash;
}
diff --git a/src/drivers/spi/gigadevice.c b/src/drivers/spi/gigadevice.c
index 9686ee9871..7f86b2b747 100644
--- a/src/drivers/spi/gigadevice.c
+++ b/src/drivers/spi/gigadevice.c
@@ -222,6 +222,7 @@ struct spi_flash *spi_flash_probe_gigadevice(struct spi_slave *spi, u8 *idcode)
stm.flash.write = gigadevice_write;
stm.flash.erase = spi_flash_cmd_erase;
+ stm.flash.status = spi_flash_cmd_status;
#if CONFIG_SPI_FLASH_NO_FAST_READ
stm.flash.read = spi_flash_cmd_read_slow;
#else
@@ -233,6 +234,7 @@ struct spi_flash *spi_flash_probe_gigadevice(struct spi_slave *spi, u8 *idcode)
* params->sectors_per_block
* params->nr_blocks;
stm.flash.erase_cmd = CMD_GD25_SE;
+ stm.flash.status_cmd = CMD_GD25_RDSR;
return &stm.flash;
}
diff --git a/src/drivers/spi/macronix.c b/src/drivers/spi/macronix.c
index 8e514c27d0..21eff39ccc 100644
--- a/src/drivers/spi/macronix.c
+++ b/src/drivers/spi/macronix.c
@@ -242,6 +242,7 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
mcx->flash.write = macronix_write;
mcx->flash.erase = spi_flash_cmd_erase;
+ mcx->flash.status = spi_flash_cmd_status;
#if CONFIG_SPI_FLASH_NO_FAST_READ
mcx->flash.read = spi_flash_cmd_read_slow;
#else
@@ -251,6 +252,7 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
mcx->flash.size = mcx->flash.sector_size * params->sectors_per_block *
params->nr_blocks;
mcx->flash.erase_cmd = CMD_MX25XX_SE;
+ mcx->flash.status_cmd = CMD_MX25XX_RDSR;
return &mcx->flash;
}
diff --git a/src/drivers/spi/spansion.c b/src/drivers/spi/spansion.c
index 6dd703c7ce..a0a99f9daa 100644
--- a/src/drivers/spi/spansion.c
+++ b/src/drivers/spi/spansion.c
@@ -297,9 +297,11 @@ struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
spsn->flash.write = spansion_write;
spsn->flash.erase = spi_flash_cmd_erase;
spsn->flash.read = spi_flash_cmd_read_slow;
+ spsn->flash.status = spi_flash_cmd_status;
spsn->flash.sector_size = params->page_size * params->pages_per_sector;
spsn->flash.size = spsn->flash.sector_size * params->nr_sectors;
spsn->flash.erase_cmd = CMD_S25FLXX_SE;
+ spsn->flash.status_cmd = CMD_S25FLXX_RDSR;
return &spsn->flash;
}
diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c
index 8213e852be..d40f72a852 100644
--- a/src/drivers/spi/spi_flash.c
+++ b/src/drivers/spi/spi_flash.c
@@ -234,6 +234,11 @@ out:
return ret;
}
+int spi_flash_cmd_status(struct spi_flash *flash, u8 *reg)
+{
+ return spi_flash_cmd(flash->spi, flash->status_cmd, reg, sizeof(*reg));
+}
+
/*
* The following table holds all device probe functions
*
@@ -372,6 +377,7 @@ flash_detected:
tseg_relocate((void **)&flash->read);
tseg_relocate((void **)&flash->write);
tseg_relocate((void **)&flash->erase);
+ tseg_relocate((void **)&flash->status);
tseg_relocate((void **)&flash->name);
#endif
diff --git a/src/drivers/spi/spi_flash_internal.h b/src/drivers/spi/spi_flash_internal.h
index 6fe6c622b0..fec3dcc9cf 100644
--- a/src/drivers/spi/spi_flash_internal.h
+++ b/src/drivers/spi/spi_flash_internal.h
@@ -60,6 +60,9 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout);
/* Erase sectors. */
int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len);
+/* Read status register. */
+int spi_flash_cmd_status(struct spi_flash *flash, u8 *reg);
+
/* Manufacturer-specific probe functions */
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode);
struct spi_flash *spi_flash_probe_amic(struct spi_slave *spi, u8 *idcode);
diff --git a/src/drivers/spi/sst.c b/src/drivers/spi/sst.c
index ecd792d46b..aab654c641 100644
--- a/src/drivers/spi/sst.c
+++ b/src/drivers/spi/sst.c
@@ -259,10 +259,12 @@ spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode)
stm->flash.write = sst_write;
stm->flash.erase = spi_flash_cmd_erase;
+ stm->flash.status = spi_flash_cmd_status;
stm->flash.read = spi_flash_cmd_read_fast;
stm->flash.sector_size = SST_SECTOR_SIZE;
stm->flash.size = stm->flash.sector_size * params->nr_sectors;
stm->flash.erase_cmd = CMD_SST_SE;
+ stm->flash.status_cmd = CMD_SST_RDSR;
/* Flash powers up read-only, so clear BP# bits */
sst_unlock(&stm->flash);
diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c
index 18ef105134..c4abc3a24a 100644
--- a/src/drivers/spi/winbond.c
+++ b/src/drivers/spi/winbond.c
@@ -218,6 +218,7 @@ struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
stm.flash.write = winbond_write;
stm.flash.erase = spi_flash_cmd_erase;
+ stm.flash.status = spi_flash_cmd_status;
#if CONFIG_SPI_FLASH_NO_FAST_READ
stm.flash.read = spi_flash_cmd_read_slow;
#else
@@ -229,6 +230,7 @@ struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
* params->sectors_per_block
* params->nr_blocks;
stm.flash.erase_cmd = CMD_W25_SE;
+ stm.flash.status_cmd = CMD_W25_RDSR;
return &stm.flash;
}
diff --git a/src/include/spi_flash.h b/src/include/spi_flash.h
index cbb5919332..3865a53dcc 100644
--- a/src/include/spi_flash.h
+++ b/src/include/spi_flash.h
@@ -40,12 +40,15 @@ struct spi_flash {
u8 erase_cmd;
+ u8 status_cmd;
+
int (*read)(struct spi_flash *flash, u32 offset,
size_t len, void *buf);
int (*write)(struct spi_flash *flash, u32 offset,
size_t len, const void *buf);
int (*erase)(struct spi_flash *flash, u32 offset,
size_t len);
+ int (*status)(struct spi_flash *flash, u8 *reg);
};
struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs);