mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-27 23:20:26 +09:00
spi: Update speed/mode on change
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@foss.st.com>
This commit is contained in:
parent
605cbcb0a4
commit
e2e95e5e25
@ -391,6 +391,8 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
|
|||||||
} else if (ret) {
|
} else if (ret) {
|
||||||
dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret);
|
dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
} else if (dev) {
|
||||||
|
plat = dev_get_parent_plat(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!device_active(dev)) {
|
if (!device_active(dev)) {
|
||||||
@ -416,12 +418,22 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* In case bus frequency or mode changed, update it. */
|
||||||
|
if ((speed && bus_data->speed && bus_data->speed != speed) ||
|
||||||
|
(plat && plat->mode != mode)) {
|
||||||
|
ret = spi_set_speed_mode(bus, speed, mode);
|
||||||
|
if (ret)
|
||||||
|
goto err_speed_mode;
|
||||||
|
}
|
||||||
|
|
||||||
*busp = bus;
|
*busp = bus;
|
||||||
*devp = slave;
|
*devp = slave;
|
||||||
log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp);
|
log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_speed_mode:
|
||||||
|
spi_release_bus(slave);
|
||||||
err:
|
err:
|
||||||
log_debug("%s: Error path, created=%d, device '%s'\n", __func__,
|
log_debug("%s: Error path, created=%d, device '%s'\n", __func__,
|
||||||
created, dev->name);
|
created, dev->name);
|
||||||
|
Loading…
Reference in New Issue
Block a user