diff options
author | Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> | 2018-03-22 13:50:45 +0300 |
---|---|---|
committer | Jagan Teki <jagan@amarulasolutions.com> | 2018-03-22 23:01:35 +0530 |
commit | d3d8aaec7401703079f296a6460fe649fb06581b (patch) | |
tree | e70695efb27fae09b46e6f334186b1c4ad62b223 /drivers/spi | |
parent | fc282c7bcb6a622ce1a0cf82c55654dec5bcb0cd (diff) | |
download | u-boot-d3d8aaec7401703079f296a6460fe649fb06581b.zip u-boot-d3d8aaec7401703079f296a6460fe649fb06581b.tar.gz u-boot-d3d8aaec7401703079f296a6460fe649fb06581b.tar.bz2 |
DW SPI: refactor poll_transfer functions
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.Paltsev@synopsys.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/designware_spi.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/drivers/spi/designware_spi.c b/drivers/spi/designware_spi.c index 3296441..b51242c 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; |