All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] spi: rspi: Fix handling of QSPI code when transmit and receive
@ 2019-04-05  5:59 Nguyen An Hoan
  2019-04-09  9:21 ` Hoan
  0 siblings, 1 reply; 2+ messages in thread
From: Nguyen An Hoan @ 2019-04-05  5:59 UTC (permalink / raw)
  To: linux-renesas-soc, broonie, geert+renesas
  Cc: linux-spi, kuninori.morimoto.gx, magnus.damm,
	yoshihiro.shimoda.uh, h-inayoshi, na-hoan, cv-dong

From: Hoan Nguyen An <na-hoan@jinso.co.jp>

Process handling QSPI when transmit/receive at qspi_trigger_transfer_out_in() as follows:
Setting the trigger, is the number of bytes in the FIFO buffer to determine
when there is an interrupt. Then check if the value of triggering number is
32bits (4 bytes) or 1bytes, there will be corresponding processing
(if (n == QSPI_BUFFER_SIZE statement))
Handling (if (n == QSPI_BUFFER_SIZE) esle) this is unnecessary, we only need to
calculate triggering number to reduce the number of interrupts that occur
if the data is larger than 32 bits (4bytes), while the transfer to handle
that call to rspi_pio_transfer() is not necessary. The code will become
confusing and difficult to read.
The same with handling in qspi_transfer_out()/qspi_transfer_in().

Signed-off-by: Hoan Nguyen An <na-hoan@jinso.co.jp>
---
 drivers/spi/spi-rspi.c | 71 ++++++++++++++++++++------------------------------
 1 file changed, 28 insertions(+), 43 deletions(-)

diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
index 3be8fbe..15f5723 100644
--- a/drivers/spi/spi-rspi.c
+++ b/drivers/spi/spi-rspi.c
@@ -739,27 +739,22 @@ static int qspi_trigger_transfer_out_in(struct rspi_data *rspi, const u8 *tx,
 	while (len > 0) {
 		n = qspi_set_send_trigger(rspi, len);
 		qspi_set_receive_trigger(rspi, len);
-		if (n == QSPI_BUFFER_SIZE) {
-			ret = rspi_wait_for_tx_empty(rspi);
-			if (ret < 0) {
-				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
-				return ret;
-			}
-			for (i = 0; i < n; i++)
-				rspi_write_data(rspi, *tx++);
+		ret = rspi_wait_for_tx_empty(rspi);
+		if (ret < 0) {
+			dev_err(&rspi->ctlr->dev, "transmit timeout\n");
+			return ret;
+		}
+		for (i = 0; i < n; i++)
+			rspi_write_data(rspi, *tx++);
 
-			ret = rspi_wait_for_rx_full(rspi);
-			if (ret < 0) {
-				dev_err(&rspi->ctlr->dev, "receive timeout\n");
-				return ret;
-			}
-			for (i = 0; i < n; i++)
-				*rx++ = rspi_read_data(rspi);
-		} else {
-			ret = rspi_pio_transfer(rspi, tx, rx, n);
-			if (ret < 0)
-				return ret;
+		ret = rspi_wait_for_rx_full(rspi);
+		if (ret < 0) {
+			dev_err(&rspi->ctlr->dev, "receive timeout\n");
+			return ret;
 		}
+		for (i = 0; i < n; i++)
+			*rx++ = rspi_read_data(rspi);
+
 		len -= n;
 	}
 
@@ -796,19 +791,14 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
 
 	while (n > 0) {
 		len = qspi_set_send_trigger(rspi, n);
-		if (len == QSPI_BUFFER_SIZE) {
-			ret = rspi_wait_for_tx_empty(rspi);
-			if (ret < 0) {
-				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
-				return ret;
-			}
-			for (i = 0; i < len; i++)
-				rspi_write_data(rspi, *tx++);
-		} else {
-			ret = rspi_pio_transfer(rspi, tx, NULL, len);
-			if (ret < 0)
-				return ret;
+		ret = rspi_wait_for_tx_empty(rspi);
+		if (ret < 0) {
+			dev_err(&rspi->ctlr->dev, "transmit timeout\n");
+			return ret;
 		}
+		for (i = 0; i < len; i++)
+			rspi_write_data(rspi, *tx++);
+
 		n -= len;
 	}
 
@@ -833,19 +823,14 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
 
 	while (n > 0) {
 		len = qspi_set_receive_trigger(rspi, n);
-		if (len == QSPI_BUFFER_SIZE) {
-			ret = rspi_wait_for_rx_full(rspi);
-			if (ret < 0) {
-				dev_err(&rspi->ctlr->dev, "receive timeout\n");
-				return ret;
-			}
-			for (i = 0; i < len; i++)
-				*rx++ = rspi_read_data(rspi);
-		} else {
-			ret = rspi_pio_transfer(rspi, NULL, rx, len);
-			if (ret < 0)
-				return ret;
+		ret = rspi_wait_for_rx_full(rspi);
+		if (ret < 0) {
+			dev_err(&rspi->ctlr->dev, "receive timeout\n");
+			return ret;
 		}
+		for (i = 0; i < len; i++)
+			*rx++ = rspi_read_data(rspi);
+
 		n -= len;
 	}
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] spi: rspi: Fix handling of QSPI code when transmit and receive
  2019-04-05  5:59 [PATCH] spi: rspi: Fix handling of QSPI code when transmit and receive Nguyen An Hoan
@ 2019-04-09  9:21 ` Hoan
  0 siblings, 0 replies; 2+ messages in thread
From: Hoan @ 2019-04-09  9:21 UTC (permalink / raw)
  To: linux-renesas-soc, broonie, geert+renesas
  Cc: linux-spi, kuninori.morimoto.gx, magnus.damm,
	yoshihiro.shimoda.uh, h-inayoshi, cv-dong

Dear every one,

On 2019/04/05 14:59, Nguyen An Hoan wrote:
> From: Hoan Nguyen An <na-hoan@jinso.co.jp>
>
> Process handling QSPI when transmit/receive at qspi_trigger_transfer_out_in() as follows:
> Setting the trigger, is the number of bytes in the FIFO buffer to determine
> when there is an interrupt. Then check if the value of triggering number is
> 32bits (4 bytes) or 1bytes, there will be corresponding processing
> (if (n == QSPI_BUFFER_SIZE statement))
> Handling (if (n == QSPI_BUFFER_SIZE) esle) this is unnecessary, we only need to
> calculate triggering number to reduce the number of interrupts that occur
> if the data is larger than 32 bits (4bytes), while the transfer to handle
> that call to rspi_pio_transfer() is not necessary. The code will become
> confusing and difficult to read.
> The same with handling in qspi_transfer_out()/qspi_transfer_in().
There is a bit of confusion here (in a hurry) for the explanation of 
this patch.
QSPI has a buffer of 32 bytes, so a maximum of 32 bytes will be 
transmitted/received.

And so will be explained again as follows:

Process handling QSPI when transmit/receive at 
qspi_trigger_transfer_out_in() as follows:
Setting the trigger, is the number of bytes in the FIFO buffer to determine
when there is an interrupt. Then check if the value of triggering number is
32-bytes or 1-byte, there will be corresponding processing
(if (n == QSPI_BUFFER_SIZE statement))
Handling (if (n == QSPI_BUFFER_SIZE) esle) this is unnecessary, we only 
need to
calculate triggering number to reduce the number of interrupts that occur
if the data is larger than 32-bytes, while the transfer to handle
that call to rspi_pio_transfer() is not necessary. The code will become
confusing and difficult to read.
The same with handling in qspi_transfer_out()/qspi_transfer_in().

Thank you!

Hoan.

> Signed-off-by: Hoan Nguyen An <na-hoan@jinso.co.jp>
> ---
>   drivers/spi/spi-rspi.c | 71 ++++++++++++++++++++------------------------------
>   1 file changed, 28 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
> index 3be8fbe..15f5723 100644
> --- a/drivers/spi/spi-rspi.c
> +++ b/drivers/spi/spi-rspi.c
> @@ -739,27 +739,22 @@ static int qspi_trigger_transfer_out_in(struct rspi_data *rspi, const u8 *tx,
>   	while (len > 0) {
>   		n = qspi_set_send_trigger(rspi, len);
>   		qspi_set_receive_trigger(rspi, len);
> -		if (n == QSPI_BUFFER_SIZE) {
> -			ret = rspi_wait_for_tx_empty(rspi);
> -			if (ret < 0) {
> -				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
> -				return ret;
> -			}
> -			for (i = 0; i < n; i++)
> -				rspi_write_data(rspi, *tx++);
> +		ret = rspi_wait_for_tx_empty(rspi);
> +		if (ret < 0) {
> +			dev_err(&rspi->ctlr->dev, "transmit timeout\n");
> +			return ret;
> +		}
> +		for (i = 0; i < n; i++)
> +			rspi_write_data(rspi, *tx++);
>   
> -			ret = rspi_wait_for_rx_full(rspi);
> -			if (ret < 0) {
> -				dev_err(&rspi->ctlr->dev, "receive timeout\n");
> -				return ret;
> -			}
> -			for (i = 0; i < n; i++)
> -				*rx++ = rspi_read_data(rspi);
> -		} else {
> -			ret = rspi_pio_transfer(rspi, tx, rx, n);
> -			if (ret < 0)
> -				return ret;
> +		ret = rspi_wait_for_rx_full(rspi);
> +		if (ret < 0) {
> +			dev_err(&rspi->ctlr->dev, "receive timeout\n");
> +			return ret;
>   		}
> +		for (i = 0; i < n; i++)
> +			*rx++ = rspi_read_data(rspi);
> +
>   		len -= n;
>   	}
>   
> @@ -796,19 +791,14 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
>   
>   	while (n > 0) {
>   		len = qspi_set_send_trigger(rspi, n);
> -		if (len == QSPI_BUFFER_SIZE) {
> -			ret = rspi_wait_for_tx_empty(rspi);
> -			if (ret < 0) {
> -				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
> -				return ret;
> -			}
> -			for (i = 0; i < len; i++)
> -				rspi_write_data(rspi, *tx++);
> -		} else {
> -			ret = rspi_pio_transfer(rspi, tx, NULL, len);
> -			if (ret < 0)
> -				return ret;
> +		ret = rspi_wait_for_tx_empty(rspi);
> +		if (ret < 0) {
> +			dev_err(&rspi->ctlr->dev, "transmit timeout\n");
> +			return ret;
>   		}
> +		for (i = 0; i < len; i++)
> +			rspi_write_data(rspi, *tx++);
> +
>   		n -= len;
>   	}
>   
> @@ -833,19 +823,14 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
>   
>   	while (n > 0) {
>   		len = qspi_set_receive_trigger(rspi, n);
> -		if (len == QSPI_BUFFER_SIZE) {
> -			ret = rspi_wait_for_rx_full(rspi);
> -			if (ret < 0) {
> -				dev_err(&rspi->ctlr->dev, "receive timeout\n");
> -				return ret;
> -			}
> -			for (i = 0; i < len; i++)
> -				*rx++ = rspi_read_data(rspi);
> -		} else {
> -			ret = rspi_pio_transfer(rspi, NULL, rx, len);
> -			if (ret < 0)
> -				return ret;
> +		ret = rspi_wait_for_rx_full(rspi);
> +		if (ret < 0) {
> +			dev_err(&rspi->ctlr->dev, "receive timeout\n");
> +			return ret;
>   		}
> +		for (i = 0; i < len; i++)
> +			*rx++ = rspi_read_data(rspi);
> +
>   		n -= len;
>   	}
>   

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-04-09  9:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-05  5:59 [PATCH] spi: rspi: Fix handling of QSPI code when transmit and receive Nguyen An Hoan
2019-04-09  9:21 ` Hoan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.