diff mbox series

[4/7] spi: dw: Force set K210 fifo length to 31

Message ID 20220215161611.1563067-5-Niklas.Cassel@wdc.com
State Superseded
Delegated to: Andes
Headers show
Series canaan k210 SoC fixes | expand

Commit Message

Niklas Cassel Feb. 15, 2022, 4:16 p.m. UTC
From: Damien Le Moal <damien.lemoal@opensource.wdc.com>

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>
---
 drivers/spi/designware_spi.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Sean Anderson Feb. 25, 2022, 5:17 a.m. UTC | #1
On 2/15/22 11:16 AM, Niklas Cassel wrote:
> From: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> 
> 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>
> ---
>   drivers/spi/designware_spi.c | 16 +++++++++++++++-
>   1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/spi/designware_spi.c b/drivers/spi/designware_spi.c
> index 9200efced9..f9b19a5ea4 100644
> --- a/drivers/spi/designware_spi.c
> +++ b/drivers/spi/designware_spi.c
> @@ -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 },
> 

Reviewed-by: Sean Anderson <seanga2@gmail.com>
diff mbox series

Patch

diff --git a/drivers/spi/designware_spi.c b/drivers/spi/designware_spi.c
index 9200efced9..f9b19a5ea4 100644
--- a/drivers/spi/designware_spi.c
+++ b/drivers/spi/designware_spi.c
@@ -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 },