summaryrefslogtreecommitdiff
path: root/src/drivers/spi/boot_device_rw_nommap.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@chromium.org>2017-05-15 14:35:15 -0700
committerFurquan Shaikh <furquan@google.com>2017-05-19 21:21:47 +0200
commit30221b45e02f0be8940debd8ad5690c77d6a97a6 (patch)
tree0771086cabe7259abef22d80a29377d2661bc795 /src/drivers/spi/boot_device_rw_nommap.c
parentfc1a123aa7392fe7900b466e6a6f089733fec1ee (diff)
downloadcoreboot-30221b45e02f0be8940debd8ad5690c77d6a97a6.tar.xz
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 <furquan@chromium.org> Reviewed-on: https://review.coreboot.org/19705 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/drivers/spi/boot_device_rw_nommap.c')
-rw-r--r--src/drivers/spi/boot_device_rw_nommap.c23
1 files changed, 15 insertions, 8 deletions
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 <boot_device.h>
#include <spi_flash.h>
#include <spi-generic.h>
+#include <stdint.h>
-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);
}