• Douglas Anderson's avatar
    spi: Avoid setting the chip select if we don't need to · d40f0b6f
    Douglas Anderson authored
    On some SPI controllers (like spi-geni-qcom) setting the chip select
    is a heavy operation.  For instance on spi-geni-qcom, with the current
    code, is was measured as taking upwards of 20 us.  Even on SPI
    controllers that aren't as heavy, setting the chip select is at least
    something like a MMIO operation over some peripheral bus which isn't
    as fast as a RAM access.
    
    While it would be good to find ways to mitigate problems like this in
    the drivers for those SPI controllers, it can also be noted that the
    SPI framework could also help out.  Specifically, in some situations,
    we can see the SPI framework calling the driver's set_cs() with the
    same parameter several times in a row.  This is specifically observed
    when looking at the way the Chrome OS EC SPI driver (cros_ec_spi)
    works but other drivers likely trip it to some extent.
    
    Let's solve this by caching the chip select state in the core and only
    calling into the controller if there was a change.  We check not only
    the "enable" state but also the chip select mode (active high or
    active low) since controllers may care about both the mode and the
    enable flag in their callback.
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Link: https://lore.kernel.org/r/20200629164103.1.Ied8e8ad8bbb2df7f947e3bc5ea1c315e041785a2@changeidSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    d40f0b6f
spi.c 111 KB