spi: dw: Force set K210 fifo length to 31
authorDamien Le Moal <damien.lemoal@opensource.wdc.com>
Tue, 1 Mar 2022 10:35:43 +0000 (10:35 +0000)
committerLeo Yu-Chi Liang <ycliang@andestech.com>
Tue, 15 Mar 2022 09:43:11 +0000 (17:43 +0800)
The Canaan Kendryte K210 SoC DW apb_ssi v4 spi controller is documented
to have a 32 word deep TX and RX FIFO, which spi_hw_init() detects.
However, when the RX FIFO is filled up to 32 entries (RXFLR = 32), an
RX FIFO overrun error occurs. Avoid this problem by force setting
fifo_len to 31.

Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Reviewed-by: Sean Anderson <seanga2@gmail.com>
drivers/spi/designware_spi.c

index 9200efc..f9b19a5 100644 (file)
@@ -194,6 +194,20 @@ static int dw_spi_apb_init(struct udevice *bus, struct dw_spi_priv *priv)
        return 0;
 }
 
+static int dw_spi_apb_k210_init(struct udevice *bus, struct dw_spi_priv *priv)
+{
+       /*
+        * The Canaan Kendryte K210 SoC DW apb_ssi v4 spi controller is
+        * documented to have a 32 word deep TX and RX FIFO, which
+        * spi_hw_init() detects. However, when the RX FIFO is filled up to
+        * 32 entries (RXFLR = 32), an RX FIFO overrun error occurs. Avoid
+        * this problem by force setting fifo_len to 31.
+        */
+       priv->fifo_len = 31;
+
+       return dw_spi_apb_init(bus, priv);
+}
+
 static int dw_spi_dwc_init(struct udevice *bus, struct dw_spi_priv *priv)
 {
        priv->max_xfer = 32;
@@ -758,7 +772,7 @@ static const struct udevice_id dw_spi_ids[] = {
         */
        { .compatible = "altr,socfpga-spi", .data = (ulong)dw_spi_apb_init },
        { .compatible = "altr,socfpga-arria10-spi", .data = (ulong)dw_spi_apb_init },
-       { .compatible = "canaan,k210-spi", .data = (ulong)dw_spi_apb_init },
+       { .compatible = "canaan,k210-spi", .data = (ulong)dw_spi_apb_k210_init},
        { .compatible = "canaan,k210-ssi", .data = (ulong)dw_spi_dwc_init },
        { .compatible = "intel,stratix10-spi", .data = (ulong)dw_spi_apb_init },
        { .compatible = "intel,agilex-spi", .data = (ulong)dw_spi_apb_init },