]> git.karo-electronics.de Git - linux-beck.git/commitdiff
greybus: spi: add inprogress bit to xfer_flags
authorRui Miguel Silva <rui.silva@linaro.org>
Mon, 16 May 2016 09:33:21 +0000 (10:33 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 17 May 2016 03:02:58 +0000 (20:02 -0700)
When a SPI transfer needs to be split by more than one greybus spi
transfer operation, we need to indicate it so the controller can handle
the chip select lines correctly.

Add a new bit to indicate it, GB_SPI_XFER_INPROGRESS, and create an
helper function to calculate when the transfer is done. As we need this
information also in other places.

Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/greybus_protocols.h
drivers/staging/greybus/spilib.c

index 0cddbb61e894cb52acf09238a3cbc1f1c0872e42..b98f02c93b1a1f81909e4d44025f8091a86edf29 100644 (file)
@@ -879,6 +879,7 @@ struct gb_spi_transfer {
        __u8            xfer_flags;
 #define GB_SPI_XFER_READ       0x01
 #define GB_SPI_XFER_WRITE      0x02
+#define GB_SPI_XFER_INPROGRESS 0x04
 } __packed;
 
 struct gb_spi_transfer_request {
index 9eecbf391259a72d69dea3e612e53e330f4ed409..79ae044b78f30e22eb7751c5b389ecc34421f7c2 100644 (file)
@@ -102,6 +102,17 @@ static void clean_xfer_state(struct gb_spilib *spi)
        spi->op_timeout = 0;
 }
 
+static bool is_last_xfer_done(struct gb_spilib *spi)
+{
+       struct spi_transfer *last_xfer = spi->last_xfer;
+
+       if ((spi->tx_xfer_offset + spi->last_xfer_size == last_xfer->len) ||
+           (spi->rx_xfer_offset + spi->last_xfer_size == last_xfer->len))
+               return true;
+
+       return false;
+}
+
 static int setup_next_xfer(struct gb_spilib *spi, struct spi_message *msg)
 {
        struct spi_transfer *last_xfer = spi->last_xfer;
@@ -113,8 +124,7 @@ static int setup_next_xfer(struct gb_spilib *spi, struct spi_message *msg)
         * if we transferred all content of the last transfer, reset values and
         * check if this was the last transfer in the message
         */
-       if ((spi->tx_xfer_offset + spi->last_xfer_size == last_xfer->len) ||
-           (spi->rx_xfer_offset + spi->last_xfer_size == last_xfer->len)) {
+       if (is_last_xfer_done(spi)) {
                spi->tx_xfer_offset = 0;
                spi->rx_xfer_offset = 0;
                spi->op_timeout = 0;
@@ -265,6 +275,8 @@ static struct gb_operation *gb_spi_operation_create(struct gb_spilib *spi,
                        gb_xfer->xfer_flags |= GB_SPI_XFER_READ;
 
                if (xfer == spi->last_xfer) {
+                       if (!is_last_xfer_done(spi))
+                               gb_xfer->xfer_flags |= GB_SPI_XFER_INPROGRESS;
                        msg->state = GB_SPI_STATE_OP_DONE;
                        continue;
                }