• Serge Semin's avatar
    spi: dw: Add memory operations support · 6423207e
    Serge Semin authored
    Aside from the synchronous Tx-Rx mode, which has been utilized to create
    the normal SPI transfers in the framework of the DW SSI driver, DW SPI
    controller supports Tx-only and EEPROM-read modes. The former one just
    enables the controller to transmit all the data from the Tx FIFO ignoring
    anything retrieved from the MISO lane. The later mode is so called
    write-then-read operation: DW SPI controller first pushes out all the data
    from the Tx FIFO, after that it'll automatically receive as much data as
    has been specified by means of the CTRLR1 register. Both of those modes
    can be used to implement the memory operations supported by the SPI-memory
    subsystem.
    
    The memory operation implementation is pretty much straightforward, except
    a few peculiarities we have had to take into account to make things
    working. Since DW SPI controller doesn't provide a way to directly set and
    clear the native CS lane level, but instead automatically de-asserts it
    when a transfer going on, we have to make sure the Tx FIFO isn't empty
    during entire Tx procedure. In addition we also need to read data from the
    Rx FIFO as fast as possible to prevent it' overflow with automatically
    fetched incoming traffic. The denoted peculiarities get to cause even more
    problems if DW SSI controller is equipped with relatively small FIFO and
    is connected to a relatively slow system bus (APB) (with respect to the
    SPI bus speed). In order to workaround the problems for as much as it's
    possible, the memory operation execution procedure collects all the Tx
    data into a single buffer and disables the local IRQs to speed the
    write-then-optionally-read method up.
    
    Note the provided memory operations are utilized by default only if
    a glue driver hasn't provided a custom version of ones and this is not
    a DW APB SSI controller with fixed automatic CS toggle functionality.
    Co-developed-by: default avatarRamil Zaripov <Ramil.Zaripov@baikalelectronics.ru>
    Signed-off-by: default avatarRamil Zaripov <Ramil.Zaripov@baikalelectronics.ru>
    Signed-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
    Link: https://lore.kernel.org/r/20201007235511.4935-18-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    6423207e
spi-dw.h 7.5 KB