Patchwork [U-Boot,2/7] sf: Add spi_flash_probe_fdt() to locate SPI by FDT node

login
register
mail settings
Submitter Simon Glass
Date Nov. 10, 2013, 2:37 a.m.
Message ID <1384051068-11659-2-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/290025/
State Superseded, archived
Delegated to: Simon Glass
Headers show

Comments

Simon Glass - Nov. 10, 2013, 2:37 a.m.
This allows us to put the SPI flash chip inside the SPI interface node,
with U-Boot finding the correct bus and chip select automatically.

This is part of a series of changes to enable 'cros_test swsync' which
is needed while flashrom EC support is missing.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
 drivers/mtd/spi/sf_probe.c | 23 +++++++++++++++++++----
 include/spi_flash.h        | 13 +++++++++++++
 2 files changed, 32 insertions(+), 4 deletions(-)

Patch

diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
index 5eb8ffe..f021e56 100644
--- a/drivers/mtd/spi/sf_probe.c
+++ b/drivers/mtd/spi/sf_probe.c
@@ -285,16 +285,13 @@  int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
 }
 #endif /* CONFIG_OF_CONTROL */
 
-struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
-		unsigned int max_hz, unsigned int spi_mode)
+static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi)
 {
-	struct spi_slave *spi;
 	struct spi_flash *flash = NULL;
 	u8 idcode[5];
 	int ret;
 
 	/* Setup spi_slave */
-	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
 	if (!spi) {
 		printf("SF: Failed to set up slave\n");
 		return NULL;
@@ -358,6 +355,24 @@  err_claim_bus:
 	return NULL;
 }
 
+struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
+		unsigned int max_hz, unsigned int spi_mode)
+{
+	struct spi_slave *spi;
+
+	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+	return spi_flash_probe_slave(spi);
+}
+
+struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
+				      int spi_node)
+{
+	struct spi_slave *spi;
+
+	spi = spi_setup_slave_fdt(blob, slave_node, spi_node);
+	return spi_flash_probe_slave(spi);
+}
+
 void spi_flash_free(struct spi_flash *flash)
 {
 	spi_free_slave(flash->spi);
diff --git a/include/spi_flash.h b/include/spi_flash.h
index 25ca8f1..afc3a58 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -67,6 +67,19 @@  struct spi_flash {
 
 struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 		unsigned int max_hz, unsigned int spi_mode);
+
+/**
+ * Set up a new SPI flash from an fdt node
+ *
+ * @param blob		Device tree blob
+ * @param slave_node	Pointer to this SPI slave node in the device tree
+ * @param spi_node	Cached pointer to the SPI interface this node belongs
+ *			to
+ * @return 0 if ok, -1 on error
+ */
+struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
+				      int spi_node);
+
 void spi_flash_free(struct spi_flash *flash);
 
 static inline int spi_flash_read(struct spi_flash *flash, u32 offset,