diff options
author | Vladimir Serbinenko <phcoder@gmail.com> | 2014-01-18 17:45:32 +0100 |
---|---|---|
committer | Vladimir Serbinenko <phcoder@gmail.com> | 2014-01-23 20:42:08 +0100 |
commit | e23bd0e3c4e4ec8fddf8b2bc6aa6fa398781fcd1 (patch) | |
tree | f07861a6b3871c52d811488fb80e7e919cec239c /src | |
parent | e33d6cac96a3cc0fce313a6a19d20cb2561d057f (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>
Diffstat (limited to 'src')
-rw-r--r-- | src/drivers/spi/spi_flash.c | 15 | ||||
-rw-r--r-- | src/include/spi-generic.h | 2 |
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); }; /*----------------------------------------------------------------------- |