summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Serbinenko <phcoder@gmail.com>2014-01-18 17:45:32 +0100
committerVladimir Serbinenko <phcoder@gmail.com>2014-01-23 20:42:08 +0100
commite23bd0e3c4e4ec8fddf8b2bc6aa6fa398781fcd1 (patch)
treef07861a6b3871c52d811488fb80e7e919cec239c
parente33d6cac96a3cc0fce313a6a19d20cb2561d057f (diff)
SPI: Add API for programmer-specific flashing.
Change-Id: I7a2f5b9ae74458b5ed6271b1c27842c61546dcd2 Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: http://review.coreboot.org/4712 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
-rw-r--r--src/drivers/spi/spi_flash.c15
-rw-r--r--src/include/spi-generic.h2
2 files changed, 17 insertions, 0 deletions
diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c
index d1a95046db..ada4f3a42b 100644
--- a/src/drivers/spi/spi_flash.c
+++ b/src/drivers/spi/spi_flash.c
@@ -267,6 +267,13 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
goto err_claim_bus;
}
+ if (spi->force_programmer_specific && spi->programmer_specific_probe) {
+ flash = spi->programmer_specific_probe (spi);
+ if (!flash)
+ goto err_read_id;
+ goto flash_detected;
+ }
+
/* Read the ID codes */
ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
if (ret)
@@ -295,11 +302,19 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
break;
}
+ if (!flash && spi->programmer_specific_probe) {
+#if CONFIG_SMM_TSEG && defined(__SMM__)
+ /* Need to relocate this function */
+ tseg_relocate((void **)&spi->programmer_specific_probe);
+#endif
+ flash = spi->programmer_specific_probe (spi);
+ }
if (!flash) {
printk(BIOS_WARNING, "SF: Unsupported manufacturer %02x\n", *idp);
goto err_manufacturer_probe;
}
+flash_detected:
#if CONFIG_SMM_TSEG && defined(__SMM__)
/* Ensure flash handlers are valid for TSEG */
tseg_relocate((void **)&flash->read);
diff --git a/src/include/spi-generic.h b/src/include/spi-generic.h
index d252c32ab0..6cdb87a7e7 100644
--- a/src/include/spi-generic.h
+++ b/src/include/spi-generic.h
@@ -64,6 +64,8 @@ struct spi_slave {
unsigned int bus;
unsigned int cs;
unsigned int rw;
+ int force_programmer_specific;
+ struct spi_flash * (*programmer_specific_probe) (struct spi_slave *spi);
};
/*-----------------------------------------------------------------------