Skip to content
  • Cyrille Pitchen's avatar
    spi: atmel: add support to FIFOs · 11f2764f
    Cyrille Pitchen authored and Mark Brown's avatar Mark Brown committed
    
    
    The latest SPI controllers embedded inside sama5d2x SoCs come with FIFOs.
    When FIFOs are enabled, they can either work in SINGLE data mode or
    MULTIPLE data mode. The selected mode depends on the configuration of the
    SPI controller (see below).
    
    In SINGLE data mode (or legacy mode), for a single I/O access, only one
    data can be read from the Receive Data Register (RDR) or written into the
    Transmit Data Register (TDR). On the other hand, in MULTIPLE data mode, up
    to 4 data can be read from the RDR or up 2 data can be written into the
    TDR in a single 32bit I/O access. So programmers should take good care of
    the width of the I/O access to read/write the right number of data. The
    exact number of read/written data depends on both the I/O access width and
    the data width (from 8 up to 16 bits).
    
    To enable the FIFO feature a "atmel,fifo-size" property must be set to
    provide the maximum number of data (not bytes) the RX and TX FIFOs can
    store. Hence a 32 data FIFO can always store up to 32 data unrelated with
    the actual data width.
    
    When FIFOs are enabled, the RX one is forced to operate in SINGLE data
    mode because this driver configures the spi controller as a master. In
    master mode only, the Received Data Register has an additionnal Peripheral
    Chip Select field, which prevents us from reading more than a single data
    at each register access.
    
    Besides, the TX FIFO operates in MULTIPLE data mode. However, even when a
    8bit data size is used, only two data by access could be written into the
    Transmit Data Register. Indeed the first data has to be written into the
    lowest 16 bits whereas the second data has to be written into the highest
    16 bits of the TDR. When DMA transfers are used to send data, we don't
    rework the transmit buffer to cope with this hardware limitation: the
    additional copies required to prepare a new input buffer suited to both
    the DMA controller and the spi controller would waste all the benefit of
    the DMA transfer. Instead, the DMA controller is configured to write only
    one data at time into the TDR.
    
    In pio mode, two data are written in the TDR in a single access.
    
    Signed-off-by: default avatarCyrille Pitchen <cyrille.pitchen@atmel.com>
    Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    11f2764f