[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