
Hi Vignesh,
Date: Wed, 13 Apr 2016 15:40:53 +0530
From: Vignesh R <vigneshr@ti.commailto:vigneshr@ti.com>
To: Jagan Teki <jteki@openedev.commailto:jteki@openedev.com>, Tom Rini <trini@konsulko.commailto:trini@konsulko.com>
Cc: u-boot@lists.denx.demailto:u-boot@lists.denx.de, Stefan Roese <sr@denx.demailto:sr@denx.de>
Subject: [U-Boot] [PATCH v3] dm: spi: Read default speed and mode
values from DT
Message-ID: <1460542253-10580-1-git-send-email-vigneshr@ti.commailto:1460542253-10580-1-git-send-email-vigneshr@ti.com>
Content-Type: text/plain
In case of DT boot, don't read default speed and mode for SPI from
CONFIG_*, instead read from DT node. This will make sure that boards
with multiple SPI/QSPI controllers can be probed at different
bus frequencies and SPI modes.
Signed-off-by: Vignesh R <vigneshr@ti.commailto:vigneshr@ti.com>
v3: Update commit message to mention SPI mode changes
v2: Initialize speed, mode to 0 instead of -1
cmd/sf.c | 2 ++
drivers/spi/spi-uclass.c | 8 ++++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/cmd/sf.c b/cmd/sf.c
index 42862d9d921a..286906c3a151 100644
--- a/cmd/sf.c
+++ b/cmd/sf.c
@@ -88,6 +88,8 @@ static int do_spi_flash_probe(int argc, char * const argv[])
#ifdef CONFIG_DM_SPI_FLASH
struct udevice *new, *bus_dev;
int ret;
/* In DM mode defaults will be taken from DT */
speed = 0, mode = 0;
#else
struct spi_flash *new;
#endif
diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c
index 5561f36762f9..5fb5630e2981 100644
--- a/drivers/spi/spi-uclass.c
+++ b/drivers/spi/spi-uclass.c
@@ -264,6 +264,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int
mode,
struct udevice **busp, struct spi_slave **devp)
{
struct udevice *bus, *dev;
struct dm_spi_slave_platdata *plat;
bool created = false;
int ret;
@@ -280,8 +281,6 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int
mode,
* SPI flash chip - we will bind to the correct driver.
*/
if (ret == -ENODEV && drv_name) {
struct dm_spi_slave_platdata *plat;
debug("%s: Binding new device '%s', busnum=%d, cs=%d,
driver=%s\n",
__func__, dev_name, busnum, cs, drv_name);
ret = device_bind_driver(bus, drv_name, dev_name, &dev);
@@ -308,6 +307,11 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int
mode,
slave->dev = dev;
}
plat = dev_get_parent_platdata(dev);
if (!speed) {
speed = plat->max_hz;
mode = plat->mode;
}
ret = spi_set_speed_mode(bus, speed, mode);
if (ret)
goto err;
--
I just doubt if spi_set_speed_mode() has really made a difference to the actual transfer. Seems that if the device is inactive, calling device_probe() would also call spi_set_speed_mode() and do the data transfer. Even if it's active, setting speed and mode for it again would not be necessary.
Regards, Qianyu