[PATCH] spi: prevent overriding established bus settings

Marcin Wojtas mw at semihalf.com
Wed Dec 11 08:18:37 CET 2019


Hi,

Any comments on the patch?

Best regards,
Marcin

czw., 21 lis 2019 o 10:29 Marcin Wojtas <mw at semihalf.com> napisał(a):

> + 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