diff options
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); }; /*----------------------------------------------------------------------- |