spi: rockchip: Support 64-location deep FIFOs
authorJon Lin <jon.lin@rock-chips.com>
Thu, 23 Jul 2020 00:43:55 +0000 (08:43 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 28 Jul 2020 16:29:31 +0000 (17:29 +0100)
The FIFO depth of SPI V2 is 64 instead of 32, add support for it.

Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
Tested-by: Emil Renner Berthing <kernel@esmil.dk>
Reviewed-by: Emil Renner Berthing <kernel@esmil.dk>
Link: https://lore.kernel.org/r/20200723004356.6390-2-jon.lin@rock-chips.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-rockchip.c

index 63593a5..a451dac 100644 (file)
@@ -39,8 +39,9 @@
 #define ROCKCHIP_SPI_RISR                      0x0034
 #define ROCKCHIP_SPI_ICR                       0x0038
 #define ROCKCHIP_SPI_DMACR                     0x003c
-#define ROCKCHIP_SPI_DMATDLR           0x0040
-#define ROCKCHIP_SPI_DMARDLR           0x0044
+#define ROCKCHIP_SPI_DMATDLR                   0x0040
+#define ROCKCHIP_SPI_DMARDLR                   0x0044
+#define ROCKCHIP_SPI_VERSION                   0x0048
 #define ROCKCHIP_SPI_TXDR                      0x0400
 #define ROCKCHIP_SPI_RXDR                      0x0800
 
 #define ROCKCHIP_SPI_MAX_TRANLEN               0xffff
 
 #define ROCKCHIP_SPI_MAX_CS_NUM                        2
+#define ROCKCHIP_SPI_VER2_TYPE1                        0x05EC0002
+#define ROCKCHIP_SPI_VER2_TYPE2                        0x00110002
 
 struct rockchip_spi {
        struct device *dev;
@@ -206,17 +209,17 @@ static inline void wait_for_idle(struct rockchip_spi *rs)
 
 static u32 get_fifo_len(struct rockchip_spi *rs)
 {
-       u32 fifo;
+       u32 ver;
 
-       for (fifo = 2; fifo < 32; fifo++) {
-               writel_relaxed(fifo, rs->regs + ROCKCHIP_SPI_TXFTLR);
-               if (fifo != readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFTLR))
-                       break;
-       }
-
-       writel_relaxed(0, rs->regs + ROCKCHIP_SPI_TXFTLR);
+       ver = readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION);
 
-       return (fifo == 31) ? 0 : fifo;
+       switch (ver) {
+       case ROCKCHIP_SPI_VER2_TYPE1:
+       case ROCKCHIP_SPI_VER2_TYPE2:
+               return 64;
+       default:
+               return 32;
+       }
 }
 
 static void rockchip_spi_set_cs(struct spi_device *spi, bool enable)