diff options
author | Fredrik Ternerot <fredrik.ternerot@axis.com> | 2018-11-13 07:46:32 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-11-13 13:05:49 -0500 |
commit | c0b07605f1a0285d50596c0243adfa00e3043293 (patch) | |
tree | ef849f0e61125303fa025b24c97f6442490db371 /drivers | |
parent | 82391856191878bb0047259817ab32f88438aa33 (diff) |
spi: pl022: Handle cs_change for last transfer
Do not deselect cs when cs_change is set for the last transfer in the
message. In this case, cs_change indicates that cs should stay selected
until the next transfer.
Signed-off-by: Fredrik Ternerot <fredrikt@axis.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/spi/spi-pl022.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 6120e6abcd96..0c793e31d60f 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
@@ -861,11 +861,10 @@ static void dma_callback(void *data) | |||
861 | 861 | ||
862 | /* Update total bytes transferred */ | 862 | /* Update total bytes transferred */ |
863 | msg->actual_length += pl022->cur_transfer->len; | 863 | msg->actual_length += pl022->cur_transfer->len; |
864 | if (pl022->cur_transfer->cs_change) | ||
865 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
866 | |||
867 | /* Move to next transfer */ | 864 | /* Move to next transfer */ |
868 | msg->state = next_transfer(pl022); | 865 | msg->state = next_transfer(pl022); |
866 | if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change) | ||
867 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
869 | tasklet_schedule(&pl022->pump_transfers); | 868 | tasklet_schedule(&pl022->pump_transfers); |
870 | } | 869 | } |
871 | 870 | ||
@@ -1333,10 +1332,10 @@ static irqreturn_t pl022_interrupt_handler(int irq, void *dev_id) | |||
1333 | } | 1332 | } |
1334 | /* Update total bytes transferred */ | 1333 | /* Update total bytes transferred */ |
1335 | msg->actual_length += pl022->cur_transfer->len; | 1334 | msg->actual_length += pl022->cur_transfer->len; |
1336 | if (pl022->cur_transfer->cs_change) | ||
1337 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
1338 | /* Move to next transfer */ | 1335 | /* Move to next transfer */ |
1339 | msg->state = next_transfer(pl022); | 1336 | msg->state = next_transfer(pl022); |
1337 | if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change) | ||
1338 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
1340 | tasklet_schedule(&pl022->pump_transfers); | 1339 | tasklet_schedule(&pl022->pump_transfers); |
1341 | return IRQ_HANDLED; | 1340 | return IRQ_HANDLED; |
1342 | } | 1341 | } |
@@ -1544,10 +1543,11 @@ static void do_polling_transfer(struct pl022 *pl022) | |||
1544 | 1543 | ||
1545 | /* Update total byte transferred */ | 1544 | /* Update total byte transferred */ |
1546 | message->actual_length += pl022->cur_transfer->len; | 1545 | message->actual_length += pl022->cur_transfer->len; |
1547 | if (pl022->cur_transfer->cs_change) | ||
1548 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
1549 | /* Move to next transfer */ | 1546 | /* Move to next transfer */ |
1550 | message->state = next_transfer(pl022); | 1547 | message->state = next_transfer(pl022); |
1548 | if (message->state != STATE_DONE | ||
1549 | && pl022->cur_transfer->cs_change) | ||
1550 | pl022_cs_control(pl022, SSP_CHIP_DESELECT); | ||
1551 | } | 1551 | } |
1552 | out: | 1552 | out: |
1553 | /* Handle end of message */ | 1553 | /* Handle end of message */ |