From 3a238fc7844f93c799283d8b822178af9638ff0c Mon Sep 17 00:00:00 2001 From: Rui Miguel Silva Date: Mon, 16 May 2016 10:33:21 +0100 Subject: [PATCH] greybus: spi: add inprogress bit to xfer_flags 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 Reviewed-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/greybus_protocols.h | 1 + drivers/staging/greybus/spilib.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/staging/greybus/greybus_protocols.h b/drivers/staging/greybus/greybus_protocols.h index 0cddbb61e894..b98f02c93b1a 100644 --- a/drivers/staging/greybus/greybus_protocols.h +++ b/drivers/staging/greybus/greybus_protocols.h @@ -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 { diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c index 9eecbf391259..79ae044b78f3 100644 --- a/drivers/staging/greybus/spilib.c +++ b/drivers/staging/greybus/spilib.c @@ -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; } -- 2.39.5