dm: spi: Avoid setting the speed with every transfer
authorSimon Glass <sjg@chromium.org>
Tue, 17 Feb 2015 22:29:35 +0000 (15:29 -0700)
committerSimon Glass <sjg@chromium.org>
Wed, 6 May 2015 02:58:18 +0000 (20:58 -0600)
Only set the speed if it has changed from last time. Since the speed will
be 0 when the device is probed it will always be changed on the first
transfer after the device is probed.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/spi/spi-uclass.c
include/spi.h

index 83fe8e0d69ae9d8d6972f99a72e4294fa4aa0848..737ae64052acace832e332ba16ea69e3ddc8adc6 100644 (file)
@@ -63,9 +63,12 @@ int spi_claim_bus(struct spi_slave *slave)
        }
        if (!speed)
                speed = 100000;
-       ret = spi_set_speed_mode(bus, speed, slave->mode);
-       if (ret)
-               return ret;
+       if (speed != slave->speed) {
+               ret = spi_set_speed_mode(bus, speed, slave->mode);
+               if (ret)
+                       return ret;
+               slave->speed = speed;
+       }
 
        return ops->claim_bus ? ops->claim_bus(dev) : 0;
 }
index 9495ca53c9b6649acd7e04879261eb40c4344d8e..3f198f8749771bc899fcbae2ae6e60bcd026d542 100644 (file)
@@ -100,6 +100,8 @@ struct dm_spi_slave_platdata {
  * @dev:               SPI slave device
  * @max_hz:            Maximum speed for this slave
  * @mode:              SPI mode to use for this slave (see SPI mode flags)
+ * @speed:             Current bus speed. This is 0 until the bus is first
+ *                     claimed.
  * @bus:               ID of the bus that the slave is attached to. For
  *                     driver model this is the sequence number of the SPI
  *                     bus (bus->seq) so does not need to be stored
@@ -117,6 +119,7 @@ struct spi_slave {
 #ifdef CONFIG_DM_SPI
        struct udevice *dev;    /* struct spi_slave is dev->parentdata */
        uint max_hz;
+       uint speed;
        uint mode;
 #else
        unsigned int bus;