summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2013-12-03 16:43:24 -0700
committerSimon Glass <sjg@chromium.org>2013-12-09 12:22:12 -0700
commit0efc02499f9131bd7e1689ebb8d626ef12387de4 (patch)
treed6b4296f983ebe381432d7db3b12e4368ec0efe9 /drivers/spi
parent7b3efc66996b6686ad393b706c323990afa31930 (diff)
downloadu-boot-imx-0efc02499f9131bd7e1689ebb8d626ef12387de4.zip
u-boot-imx-0efc02499f9131bd7e1689ebb8d626ef12387de4.tar.gz
u-boot-imx-0efc02499f9131bd7e1689ebb8d626ef12387de4.tar.bz2
spi_flash: Add spi_flash_probe_fdt() to locate SPI by FDT node
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. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/exynos_spi.c10
-rw-r--r--drivers/spi/spi.c19
2 files changed, 24 insertions, 5 deletions
diff --git a/drivers/spi/exynos_spi.c b/drivers/spi/exynos_spi.c
index 699c57e..4d5def2 100644
--- a/drivers/spi/exynos_spi.c
+++ b/drivers/spi/exynos_spi.c
@@ -529,18 +529,18 @@ static int process_nodes(const void *blob, int node_list[], int count)
* @param node SPI peripheral node to use
* @return 0 if ok, -1 on error
*/
-struct spi_slave *spi_setup_slave_fdt(const void *blob, int node,
- unsigned int cs, unsigned int max_hz, unsigned int mode)
+struct spi_slave *spi_setup_slave_fdt(const void *blob, int slave_node,
+ int spi_node)
{
struct spi_bus *bus;
unsigned int i;
for (i = 0, bus = spi_bus; i < bus_count; i++, bus++) {
- if (bus->node == node)
- return spi_setup_slave(i, cs, max_hz, mode);
+ if (bus->node == spi_node)
+ return spi_base_setup_slave_fdt(blob, i, slave_node);
}
- debug("%s: Failed to find bus node %d\n", __func__, node);
+ debug("%s: Failed to find bus node %d\n", __func__, spi_node);
return NULL;
}
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index b76a26c..7ddea9b 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -5,6 +5,7 @@
*/
#include <common.h>
+#include <fdtdec.h>
#include <malloc.h>
#include <spi.h>
@@ -37,3 +38,21 @@ void *spi_do_alloc_slave(int offset, int size, unsigned int bus,
return ptr;
}
+
+#ifdef CONFIG_OF_SPI
+struct spi_slave *spi_base_setup_slave_fdt(const void *blob, int busnum,
+ int node)
+{
+ int cs, max_hz, mode = 0;
+
+ cs = fdtdec_get_int(blob, node, "reg", -1);
+ max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 100000);
+ if (fdtdec_get_bool(blob, node, "spi-cpol"))
+ mode |= SPI_CPOL;
+ if (fdtdec_get_bool(blob, node, "spi-cpha"))
+ mode |= SPI_CPHA;
+ if (fdtdec_get_bool(blob, node, "spi-cs-high"))
+ mode |= SPI_CS_HIGH;
+ return spi_setup_slave(busnum, cs, max_hz, mode);
+}
+#endif