1. 13 Mar, 2019 1 commit
    • Trent Piepho's avatar
      spi: imx: stop buffer overflow in RX FIFO flush · c842749e
      Trent Piepho authored
      Commit 71abd290 ("spi: imx: Add support for SPI Slave mode") added
      an RX FIFO flush before start of a transfer.  In slave mode, the master
      may have sent more data than expected and this data will still be in the
      RX FIFO at the start of the next transfer, and so needs to be flushed.
      
      However, the code to do the flush was accidentally saving this data into
      the previous transfer's RX buffer, clobbering the contents of whatever
      followed that buffer.
      
      Change it to empty the FIFO and throw away the data.  Every one of the
      RX functions for the different eCSPI versions and modes reads the RX
      FIFO data using the same readl() call, so just use that, rather than
      using the spi_imx->rx function pointer and making sure all the different
      rx functions have a working "throw away" mode.
      
      There is another issue, which affects master mode when switching from
      DMA to PIO.  There can be extra data in the RX FIFO which triggers this
      flush code, causing memory corruption in the same manner.  I don't know
      why this data is unexpectedly in the FIFO.  It's likely there is a
      different bug or erratum responsible for that.  But regardless of that,
      I think this is proper fix the for bug at hand here.
      
      Fixes: 71abd290 ("spi: imx: Add support for SPI Slave mode")
      Cc: Jiada Wang <jiada_wang@mentor.com>
      Cc: Fabio Estevam <festevam@gmail.com>
      Cc: Stefan Agner <stefan@agner.ch>
      Cc: Shawn Guo <shawnguo@kernel.org>
      Signed-off-by: default avatarTrent Piepho <tpiepho@impinj.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      c842749e
  2. 11 Mar, 2019 1 commit
    • Chris Lesiak's avatar
      spi: Fix zero length xfer bug · 5442dcaa
      Chris Lesiak authored
      This fixes a bug for messages containing both zero length and
      unidirectional xfers.
      
      The function spi_map_msg will allocate dummy tx and/or rx buffers
      for use with unidirectional transfers when the hardware can only do
      a bidirectional transfer.  That dummy buffer will be used in place
      of a NULL buffer even when the xfer length is 0.
      
      Then in the function __spi_map_msg, if he hardware can dma,
      the zero length xfer will have spi_map_buf called on the dummy
      buffer.
      
      Eventually, __sg_alloc_table is called and returns -EINVAL
      because nents == 0.
      
      This fix prevents the error by not using the dummy buffer when
      the xfer length is zero.
      Signed-off-by: default avatarChris Lesiak <chris.lesiak@licor.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      5442dcaa
  3. 04 Mar, 2019 1 commit
  4. 22 Feb, 2019 2 commits
  5. 20 Feb, 2019 2 commits
  6. 19 Feb, 2019 2 commits
  7. 13 Feb, 2019 4 commits
  8. 12 Feb, 2019 3 commits
  9. 08 Feb, 2019 3 commits
  10. 06 Feb, 2019 14 commits
  11. 30 Jan, 2019 2 commits
    • Jonas Bonn's avatar
      spi-atmel: support inter-word delay · 473a78a7
      Jonas Bonn authored
      If the SPI slave requires an inter-word delay, configure the DLYBCT
      register accordingly.
      
      Tested on a SAMA5D2 board (derived from SAMA5D2-Xplained reference
      board).
      Signed-off-by: default avatarJonas Bonn <jonas@norrbonn.se>
      Acked-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
      CC: Nicolas Ferre <nicolas.ferre@microchip.com>
      CC: Mark Brown <broonie@kernel.org>
      CC: Alexandre Belloni <alexandre.belloni@bootlin.com>
      CC: Ludovic Desroches <ludovic.desroches@microchip.com>
      CC: linux-spi@vger.kernel.org
      CC: linux-arm-kernel@lists.infradead.org
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      473a78a7
    • Jonas Bonn's avatar
      spi: support inter-word delay requirement for devices · b7bb367a
      Jonas Bonn authored
      Some devices are slow and cannot keep up with the SPI bus and therefore
      require a short delay between words of the SPI transfer.
      
      The example of this that I'm looking at is a SAMA5D2 with a minimum SPI
      clock of 400kHz talking to an AVR-based SPI slave.  The AVR cannot put
      bytes on the bus fast enough to keep up with the SoC's SPI controller
      even at the lowest bus speed.
      
      This patch introduces the ability to specify a required inter-word
      delay for SPI devices.  It is up to the controller driver to configure
      itself accordingly in order to introduce the requested delay.
      
      Note that, for spi_transfer, there is already a field word_delay that
      provides similar functionality.  This field, however, is specified in
      clock cycles (and worse, SPI controller cycles, not SCK cycles); that
      makes this value dependent on the master clock instead of the device
      clock for which the delay is intended to provide some relief.  This
      patch leaves this old word_delay in place and provides a time-based
      word_delay_us alongside it; the new field fits in the struct padding
      so struct size is constant.  There is only one in-kernel user of the
      word_delay field and presumably that driver could be reworked to use
      the time-based value instead.
      
      The time-based delay is limited to 8 bits as these delays are intended
      to be short.  The SAMA5D2 that I've tested this on limits delays to a
      maximum of ~100us, which is already many word-transfer periods even at
      the minimum transfer speed supported by the controller.
      Signed-off-by: default avatarJonas Bonn <jonas@norrbonn.se>
      CC: Mark Brown <broonie@kernel.org>
      CC: Rob Herring <robh+dt@kernel.org>
      CC: Mark Rutland <mark.rutland@arm.com>
      CC: linux-spi@vger.kernel.org
      CC: devicetree@vger.kernel.org
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      b7bb367a
  12. 29 Jan, 2019 4 commits
  13. 28 Jan, 2019 1 commit