There is no sense in waiting for RX data in dw_reader function:
there is no chance that RX data will appear in RX FIFO if
RX FIFO is empty after previous TX write in dw_writer function.
So get rid of this waiting. After that we can get rid of dw_reader
return value and make it returning void. After that we can get rid
of dw_reader return value check in poll_transfer function.

With these changes we're getting closer to Linux DW SPI driver.

Signed-off-by: Eugeniy Paltsev <eugeniy.palt...@synopsys.com>
---
Changes v1->v2:
 * None.

 drivers/spi/designware_spi.c | 26 ++++----------------------
 1 file changed, 4 insertions(+), 22 deletions(-)

diff --git a/drivers/spi/designware_spi.c b/drivers/spi/designware_spi.c
index 3296441606..b51242c862 100644
--- a/drivers/spi/designware_spi.c
+++ b/drivers/spi/designware_spi.c
@@ -286,28 +286,16 @@ static void dw_writer(struct dw_spi_priv *priv)
        }
 }
 
-static int dw_reader(struct dw_spi_priv *priv)
+static void dw_reader(struct dw_spi_priv *priv)
 {
-       unsigned start = get_timer(0);
-       u32 max;
+       u32 max = rx_max(priv);
        u16 rxw;
 
-       /* Wait for rx data to be ready */
-       while (rx_max(priv) == 0) {
-               if (get_timer(start) > RX_TIMEOUT)
-                       return -ETIMEDOUT;
-       }
-
-       max = rx_max(priv);
-
        while (max--) {
                rxw = dw_readw(priv, DW_SPI_DR);
                debug("%s: rx=0x%02x\n", __func__, rxw);
 
-               /*
-                * Care about rx only if the transfer's original "rx" is
-                * not null
-                */
+               /* Care about rx if the transfer's original "rx" is not null */
                if (priv->rx_end - priv->len) {
                        if (priv->bits_per_word == 8)
                                *(u8 *)(priv->rx) = rxw;
@@ -316,19 +304,13 @@ static int dw_reader(struct dw_spi_priv *priv)
                }
                priv->rx += priv->bits_per_word >> 3;
        }
-
-       return 0;
 }
 
 static int poll_transfer(struct dw_spi_priv *priv)
 {
-       int ret;
-
        do {
                dw_writer(priv);
-               ret = dw_reader(priv);
-               if (ret < 0)
-                       return ret;
+               dw_reader(priv);
        } while (priv->rx_end > priv->rx);
 
        return 0;
-- 
2.14.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to