[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