From 30221b45e02f0be8940debd8ad5690c77d6a97a6 Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Mon, 15 May 2017 14:35:15 -0700 Subject: drivers/spi/spi_flash: Pass in flash structure to fill in probe Instead of making all SPI drivers allocate space for a spi_flash structure and fill it in, udpate the API to allow callers to pass in a spi_flash structure that can be filled by the flash drivers as required. This also cleans up the interface so that the callers can maintain and free the space for spi_flash structure as required. BUG=b:38330715 Change-Id: If6f1b403731466525c4690777d9b32ce778eb563 Signed-off-by: Furquan Shaikh Reviewed-on: https://review.coreboot.org/19705 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/drivers/spi/boot_device_rw_nommap.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'src/drivers/spi/boot_device_rw_nommap.c') diff --git a/src/drivers/spi/boot_device_rw_nommap.c b/src/drivers/spi/boot_device_rw_nommap.c index e7d9b9a944..64d81c5b00 100644 --- a/src/drivers/spi/boot_device_rw_nommap.c +++ b/src/drivers/spi/boot_device_rw_nommap.c @@ -17,13 +17,15 @@ #include #include #include +#include -static struct spi_flash *sfg CAR_GLOBAL; +static struct spi_flash sfg CAR_GLOBAL; +static bool sfg_init_done CAR_GLOBAL; static ssize_t spi_readat(const struct region_device *rd, void *b, size_t offset, size_t size) { - struct spi_flash *sf = car_get_var(sfg); + struct spi_flash *sf = car_get_var_ptr(&sfg); if (sf == NULL) return -1; @@ -37,7 +39,7 @@ static ssize_t spi_readat(const struct region_device *rd, void *b, static ssize_t spi_writeat(const struct region_device *rd, const void *b, size_t offset, size_t size) { - struct spi_flash *sf = car_get_var(sfg); + struct spi_flash *sf = car_get_var_ptr(&sfg); if (sf == NULL) return -1; @@ -51,7 +53,7 @@ static ssize_t spi_writeat(const struct region_device *rd, const void *b, static ssize_t spi_eraseat(const struct region_device *rd, size_t offset, size_t size) { - struct spi_flash *sf = car_get_var(sfg); + struct spi_flash *sf = car_get_var_ptr(&sfg); if (sf == NULL) return -1; @@ -76,13 +78,14 @@ static void boot_device_rw_init(void) const int bus = CONFIG_BOOT_DEVICE_SPI_FLASH_BUS; const int cs = 0; - if (car_get_var(sfg) != NULL) + if (car_get_var(sfg_init_done) == true) return; /* Ensure any necessary setup is performed by the drivers. */ spi_init(); - car_set_var(sfg, spi_flash_probe(bus, cs)); + if (!spi_flash_probe(bus, cs, car_get_var_ptr(&sfg))) + car_set_var(sfg_init_done, true); } const struct region_device *boot_device_rw(void) @@ -90,7 +93,7 @@ const struct region_device *boot_device_rw(void) /* Probe for the SPI flash device if not already done. */ boot_device_rw_init(); - if (car_get_var(sfg) == NULL) + if (car_get_var(sfg_init_done) != true) return NULL; return &spi_rw; @@ -99,5 +102,9 @@ const struct region_device *boot_device_rw(void) const struct spi_flash *boot_device_spi_flash(void) { boot_device_rw_init(); - return car_get_var(sfg); + + if (car_get_var(sfg_init_done) != true) + return NULL; + + return car_get_var_ptr(&sfg); } -- cgit v1.2.3