diff options
author | Marek Vasut <marex@denx.de> | 2021-02-26 15:21:24 +0100 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-03-31 15:25:06 -0400 |
commit | fbffb32195464e6d4eab2e6daf944ccb210c1621 (patch) | |
tree | 4de574f72b7e61143d26b12abfdcae048b8b67e3 | |
parent | 43d3de544d123b9609b637e614c8e2872f1153fc (diff) | |
download | u-boot-fbffb32195464e6d4eab2e6daf944ccb210c1621.zip u-boot-fbffb32195464e6d4eab2e6daf944ccb210c1621.tar.gz u-boot-fbffb32195464e6d4eab2e6daf944ccb210c1621.tar.bz2 |
spi: Update speed/mode on changeWIP/31Mar2021
The spi_get_bus_and_cs() may be called on the same bus and chipselect
with different frequency or mode. This is valid usecase, but the code
fails to notify the controller of such a configuration change. Call
spi_set_speed_mode() in case bus frequency or bus mode changed to let
the controller update the configuration.
The problem can easily be triggered using the sspi command:
=> sspi 0:0@1000
=> sspi 0:0@2000
Without this patch, both transfers happen at 1000 Hz. With this patch,
the later transfer happens correctly at 2000 Hz.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Jagan Teki <jagan@amarulasolutions.com>
Cc: Patrick Delaunay <patrick.delaunay@st.com>
-rw-r--r-- | drivers/spi/spi-uclass.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c index 7155d4a..5617f66 100644 --- a/drivers/spi/spi-uclass.c +++ b/drivers/spi/spi-uclass.c @@ -405,12 +405,22 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode, goto err; } + /* In case bus frequency or mode changed, update it. */ + if ((speed && bus_data->speed && bus_data->speed != speed) || + (plat->mode != mode)) { + ret = spi_set_speed_mode(bus, speed, mode); + if (ret) + goto err_speed_mode; + } + *busp = bus; *devp = slave; log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); return 0; +err_speed_mode: + spi_release_bus(slave); err: log_debug("%s: Error path, created=%d, device '%s'\n", __func__, created, dev->name); |