[U-Boot] [PATCH] spi: prevent overriding established bus settings
Marcin Wojtas
mw at semihalf.com
Thu Nov 21 09:29:49 UTC 2019
+ Simon
czw., 21 lis 2019 o 05:39 Marcin Wojtas <mw at 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 <mw at 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
>
>
More information about the U-Boot
mailing list