]> git.karo-electronics.de Git - linux-beck.git/commitdiff
spi: fsl-espi: make better use of the RX FIFO
authorHeiner Kallweit <hkallweit1@gmail.com>
Thu, 27 Oct 2016 19:27:56 +0000 (21:27 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 28 Oct 2016 18:39:47 +0000 (19:39 +0100)
So far an interrupt is triggered whenever there's at least one byte
in the RX FIFO. This results in a unnecessarily high number of
interrupts.
Change this to generate an interrupt if
- RX FIFO is half full (except if all bytes to read fit into the
  RX FIFO anyway)
- end of transfer has been reached

This way the number of interrupts can be significantly reduced.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-espi.c

index a9593f9691ecf2980717e0dd48fa3c28196a1774..239f0362df613ce572956178d660f7eb4d7c0464 100644 (file)
 #define CSMODE_CG(x)           ((x) << 3)
 
 #define FSL_ESPI_FIFO_SIZE     32
+#define FSL_ESPI_RXTHR         15
 
 /* Default mode/csmode for eSPI controller */
-#define SPMODE_INIT_VAL (SPMODE_TXTHR(4) | SPMODE_RXTHR(3))
+#define SPMODE_INIT_VAL (SPMODE_TXTHR(4) | SPMODE_RXTHR(FSL_ESPI_RXTHR))
 #define CSMODE_INIT_VAL (CSMODE_POL_1 | CSMODE_BEF(0) \
                | CSMODE_AFT(0) | CSMODE_CG(1))
 
@@ -263,6 +264,7 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
 static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
 {
        struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
+       u32 mask;
        int ret;
 
        mpc8xxx_spi->rx_len = t->len;
@@ -277,8 +279,11 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
        fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPCOM,
                (SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
 
-       /* enable rx ints */
-       fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, SPIM_RNE);
+       /* enable interrupts */
+       mask = SPIM_DON;
+       if (mpc8xxx_spi->rx_len > FSL_ESPI_FIFO_SIZE)
+               mask |= SPIM_RXT;
+       fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, mask);
 
        /* Prevent filling the fifo from getting interrupted */
        spin_lock_irq(&mpc8xxx_spi->lock);