Skip to contentSkip to conversation

spi: soft_spi: Support NULL din/dout buffers

PATCH New Andrew Ruder 2 participants 2 messages Oct 23, 2013 – Jan 8, 2014 SPI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 spi: soft_spi: Support NULL din/dout buffers

This mirrors the conventions used in other SPI drivers (kirkwood, davinci, atmel, et al) where the din/dout buffer can be NULL when the received/transmitted data isn't important. This reduces the need for allocating additional buffers when write-only/read-only functionality is needed.

In the din == NULL case, the received data is simply not stored. In the dout == NULL case, zeroes are transmitted.

---
 drivers/spi/soft_spi.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/spi/soft_spi.c +13 -5
index 5d22351..5fdd091 100644
@@ -137,9 +137,15 @@ int  spi_xfer(struct spi_slave *slave, unsigned int bitlen,
 		 * Check if it is time to work on a new byte.
 		 */
 		if((j % 8) == 0) {
-			tmpdout = *txd++;
+			if (txd) {
+				tmpdout = *txd++;
+			} else {
+				tmpdout = 0;
+			}
 			if(j != 0) {
-				*rxd++ = tmpdin;
+				if (rxd) {
+					*rxd++ = tmpdin;
+				}
 			}
 			tmpdin  = 0;
 		}
@@ -164,9 +170,11 @@ int  spi_xfer(struct spi_slave *slave, unsigned int bitlen,
 	 * bits over to left-justify them.  Then store the last byte
 	 * read in.
 	 */
-	if((bitlen % 8) != 0)
-		tmpdin <<= 8 - (bitlen % 8);
-	*rxd++ = tmpdin;
+	if (rxd) {
+		if((bitlen % 8) != 0)
+			tmpdin <<= 8 - (bitlen % 8);
+		*rxd++ = tmpdin;
+	}
 
 	if (flags & SPI_XFER_END)
 		spi_cs_deactivate(slave);
Signature · 1 line
1.8.4.rc3
#1 lore raw

PATCH 1/1 spi: soft_spi: Support NULL din/dout buffers

Hi Andrew Ruder,

Quoted 42 lines · Andrew Ruder

This mirrors the conventions used in other SPI drivers (kirkwood, davinci, atmel, et al) where the din/dout buffer can be NULL when the received/transmitted data isn't important. This reduces the need for allocating additional buffers when write-only/read-only functionality is needed.

In the din == NULL case, the received data is simply not stored. In the dout == NULL case, zeroes are transmitted.

---
 drivers/spi/soft_spi.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/spi/soft_spi.c +8 -4
index 5d22351..5fdd091 100644
@@ -137,9 +137,15 @@ int  spi_xfer(struct spi_slave *slave, unsigned int bitlen,
                 * Check if it is time to work on a new byte.
                 */
                if((j % 8) == 0) {
-                       tmpdout = *txd++;
+                       if (txd) {
+                               tmpdout = *txd++;
+                       } else {
+                               tmpdout = 0;
+                       }
                        if(j != 0) {
-                               *rxd++ = tmpdin;
+                               if (rxd) {
+                                       *rxd++ = tmpdin;
+                               }
                        }
                        tmpdin  = 0;
                }
@@ -164,9 +170,11 @@ int  spi_xfer(struct spi_slave *slave, unsigned int bitlen,
         * bits over to left-justify them.  Then store the last byte
         * read in.
         */
-       if((bitlen % 8) != 0)
-               tmpdin <<= 8 - (bitlen % 8);

drivers/spi/soft_spi.c int spi_xfer(struct spi_slave *slave, unsigned int bitlen,

Quoted 10 lines
drivers/spi/soft_spi.c +5 -2
-       *rxd++ = tmpdin;
+       if (rxd) {
+               if((bitlen % 8) != 0)
+                       tmpdin <<= 8 - (bitlen % 8);
+               *rxd++ = tmpdin;
+       }
 
        if (flags & SPI_XFER_END)
                spi_cs_deactivate(slave);
--

I'm not sure does this NULL buf config stuff will works all boards as you listed.
I guess ie the reason the earlier code doesn't have this.

Does this tested on your board? any possibility to test others too.

Jean-Christophe, any comments here!

Signature · 2 lines
Thanks,
Jagan.