diff options
author | Simon Glass <sjg@chromium.org> | 2013-12-03 16:43:24 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2013-12-09 12:22:12 -0700 |
commit | 0efc02499f9131bd7e1689ebb8d626ef12387de4 (patch) | |
tree | d6b4296f983ebe381432d7db3b12e4368ec0efe9 /drivers/spi | |
parent | 7b3efc66996b6686ad393b706c323990afa31930 (diff) | |
download | u-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.c | 10 | ||||
-rw-r--r-- | drivers/spi/spi.c | 19 |
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 |