Hi, Any comments on the patch?
Best regards, Marcin czw., 21 lis 2019 o 10:29 Marcin Wojtas <m...@semihalf.com> napisał(a): > + Simon > > czw., 21 lis 2019 o 05:39 Marcin Wojtas <m...@semihalf.com> napisał(a): > >> The SPI stack relies on a proper bus speed/mode configuration >> by calling dm_spi_claim_bus(). However the hitherto code >> allowed to accidentally override those settings in >> the spi_get_bus_and_cs() routine. >> >> The initially established speed could be discarded by using >> the slave platdata, which turned out to be an issue on >> the platforms whose slave maximum supported frequency >> is not on par with the maximum frequency of the bus controller. >> >> This patch fixes above issue by configuring the bus from >> spi_get_bus_and_cs() only in case it was not done before. >> >> Signed-off-by: Marcin Wojtas <m...@semihalf.com> >> --- >> drivers/spi/spi-uclass.c | 20 +++++++++++--------- >> 1 file changed, 11 insertions(+), 9 deletions(-) >> >> diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c >> index 76c4b53..fcbe532 100644 >> --- a/drivers/spi/spi-uclass.c >> +++ b/drivers/spi/spi-uclass.c >> @@ -296,6 +296,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, >> int mode, >> { >> struct udevice *bus, *dev; >> struct dm_spi_slave_platdata *plat; >> + struct spi_slave *slave; >> bool created = false; >> int ret; >> >> @@ -351,19 +352,20 @@ int spi_get_bus_and_cs(int busnum, int cs, int >> speed, int mode, >> slave->dev = dev; >> } >> >> - plat = dev_get_parent_platdata(dev); >> + slave = dev_get_parent_priv(dev); >> >> - /* get speed and mode from platdata when available */ >> - if (plat->max_hz) { >> - speed = plat->max_hz; >> - mode = plat->mode; >> + /* >> + * In case the operation speed is not yet established by >> + * dm_spi_claim_bus() ensure the bus is configured properly. >> + */ >> + if (!slave->speed) { >> + ret = spi_claim_bus(slave); >> + if (ret) >> + goto err; >> } >> - ret = spi_set_speed_mode(bus, speed, mode); >> - if (ret) >> - goto err; >> >> *busp = bus; >> - *devp = dev_get_parent_priv(dev); >> + *devp = slave; >> debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); >> >> return 0; >> -- >> 2.7.4 >> >>