108 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
 | 
						|
Date: Fri, 29 Dec 2017 14:44:09 +0100
 | 
						|
Subject: [PATCH] spi: bcm53xx: simplify reading SPI data
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Type: text/plain; charset=UTF-8
 | 
						|
Content-Transfer-Encoding: 8bit
 | 
						|
 | 
						|
This commit makes transfer function use spi_transfer_is_last to
 | 
						|
determine if currently processed transfer is the last one. Thanks to
 | 
						|
that we finally set hardware registers properly and it makes controller
 | 
						|
behave the way it's expected to.
 | 
						|
 | 
						|
This allows simplifying read function which can now simply start reading
 | 
						|
from the slot 0 instead of the last saved offset. It has been
 | 
						|
successfully tested using spi_write_then_read.
 | 
						|
 | 
						|
Moreover this change fixes handling messages with two writing transfers.
 | 
						|
It's important for SPI flash devices as their drivers commonly use one
 | 
						|
transfer for a command and another one for data.
 | 
						|
 | 
						|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
 | 
						|
---
 | 
						|
 drivers/spi/spi-bcm53xx.c | 26 ++++++++++----------------
 | 
						|
 1 file changed, 10 insertions(+), 16 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/spi/spi-bcm53xx.c
 | 
						|
+++ b/drivers/spi/spi-bcm53xx.c
 | 
						|
@@ -27,8 +27,6 @@ struct bcm53xxspi {
 | 
						|
 	struct bcma_device *core;
 | 
						|
 	struct spi_master *master;
 | 
						|
 	void __iomem *mmio_base;
 | 
						|
-
 | 
						|
-	size_t read_offset;
 | 
						|
 	bool bspi;				/* Boot SPI mode with memory mapping */
 | 
						|
 };
 | 
						|
 
 | 
						|
@@ -172,8 +170,6 @@ static void bcm53xxspi_buf_write(struct
 | 
						|
 
 | 
						|
 	if (!cont)
 | 
						|
 		bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 0);
 | 
						|
-
 | 
						|
-	b53spi->read_offset = len;
 | 
						|
 }
 | 
						|
 
 | 
						|
 static void bcm53xxspi_buf_read(struct bcm53xxspi *b53spi, u8 *r_buf,
 | 
						|
@@ -182,10 +178,10 @@ static void bcm53xxspi_buf_read(struct b
 | 
						|
 	u32 tmp;
 | 
						|
 	int i;
 | 
						|
 
 | 
						|
-	for (i = 0; i < b53spi->read_offset + len; i++) {
 | 
						|
+	for (i = 0; i < len; i++) {
 | 
						|
 		tmp = B53SPI_CDRAM_CONT | B53SPI_CDRAM_PCS_DISABLE_ALL |
 | 
						|
 		      B53SPI_CDRAM_PCS_DSCK;
 | 
						|
-		if (!cont && i == b53spi->read_offset + len - 1)
 | 
						|
+		if (!cont && i == len - 1)
 | 
						|
 			tmp &= ~B53SPI_CDRAM_CONT;
 | 
						|
 		tmp &= ~0x1;
 | 
						|
 		/* Command Register File */
 | 
						|
@@ -194,8 +190,7 @@ static void bcm53xxspi_buf_read(struct b
 | 
						|
 
 | 
						|
 	/* Set queue pointers */
 | 
						|
 	bcm53xxspi_write(b53spi, B53SPI_MSPI_NEWQP, 0);
 | 
						|
-	bcm53xxspi_write(b53spi, B53SPI_MSPI_ENDQP,
 | 
						|
-			 b53spi->read_offset + len - 1);
 | 
						|
+	bcm53xxspi_write(b53spi, B53SPI_MSPI_ENDQP, len - 1);
 | 
						|
 
 | 
						|
 	if (cont)
 | 
						|
 		bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 1);
 | 
						|
@@ -214,13 +209,11 @@ static void bcm53xxspi_buf_read(struct b
 | 
						|
 		bcm53xxspi_write(b53spi, B53SPI_MSPI_WRITE_LOCK, 0);
 | 
						|
 
 | 
						|
 	for (i = 0; i < len; ++i) {
 | 
						|
-		int offset = b53spi->read_offset + i;
 | 
						|
+		u16 reg = B53SPI_MSPI_RXRAM + 4 * (1 + i * 2);
 | 
						|
 
 | 
						|
 		/* Data stored in the transmit register file LSB */
 | 
						|
-		r_buf[i] = (u8)bcm53xxspi_read(b53spi, B53SPI_MSPI_RXRAM + 4 * (1 + offset * 2));
 | 
						|
+		r_buf[i] = (u8)bcm53xxspi_read(b53spi, reg);
 | 
						|
 	}
 | 
						|
-
 | 
						|
-	b53spi->read_offset = 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
 static int bcm53xxspi_transfer_one(struct spi_master *master,
 | 
						|
@@ -238,7 +231,8 @@ static int bcm53xxspi_transfer_one(struc
 | 
						|
 		left = t->len;
 | 
						|
 		while (left) {
 | 
						|
 			size_t to_write = min_t(size_t, 16, left);
 | 
						|
-			bool cont = left - to_write > 0;
 | 
						|
+			bool cont = !spi_transfer_is_last(master, t) ||
 | 
						|
+				    left - to_write > 0;
 | 
						|
 
 | 
						|
 			bcm53xxspi_buf_write(b53spi, buf, to_write, cont);
 | 
						|
 			left -= to_write;
 | 
						|
@@ -250,9 +244,9 @@ static int bcm53xxspi_transfer_one(struc
 | 
						|
 		buf = (u8 *)t->rx_buf;
 | 
						|
 		left = t->len;
 | 
						|
 		while (left) {
 | 
						|
-			size_t to_read = min_t(size_t, 16 - b53spi->read_offset,
 | 
						|
-					       left);
 | 
						|
-			bool cont = left - to_read > 0;
 | 
						|
+			size_t to_read = min_t(size_t, 16, left);
 | 
						|
+			bool cont = !spi_transfer_is_last(master, t) ||
 | 
						|
+				    left - to_read > 0;
 | 
						|
 
 | 
						|
 			bcm53xxspi_buf_read(b53spi, buf, to_read, cont);
 | 
						|
 			left -= to_read;
 |