| From 0f150b08e4f8d7743b5edecbe5885d10fdc83512 Mon Sep 17 00:00:00 2001 |
| From: Mans Rullgard <mans@mansr.com> |
| Date: Fri, 18 Oct 2019 17:35:04 +0200 |
| Subject: [PATCH] spi: atmel: fix handling of cs_change set on non-last xfer |
| |
| commit fed8d8c7a6dc2a76d7764842853d81c770b0788e upstream. |
| |
| The driver does the wrong thing when cs_change is set on a non-last |
| xfer in a message. When cs_change is set, the driver deactivates the |
| CS and leaves it off until a later xfer again has cs_change set whereas |
| it should be briefly toggling CS off and on again. |
| |
| This patch brings the behaviour of the driver back in line with the |
| documentation and common sense. The delay of 10 us is the same as is |
| used by the default spi_transfer_one_message() function in spi.c. |
| [gregory: rebased on for-5.5 from spi tree] |
| Fixes: 8090d6d1a415 ("spi: atmel: Refactor spi-atmel to use SPI framework queue") |
| Signed-off-by: Mans Rullgard <mans@mansr.com> |
| Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> |
| Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com> |
| Link: https://lore.kernel.org/r/20191018153504.4249-1-gregory.clement@bootlin.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c |
| index 6a4540ba65ba..b80692cfd4b9 100644 |
| --- a/drivers/spi/spi-atmel.c |
| +++ b/drivers/spi/spi-atmel.c |
| @@ -301,7 +301,6 @@ struct atmel_spi { |
| bool use_cs_gpios; |
| |
| bool keep_cs; |
| - bool cs_active; |
| |
| u32 fifo_size; |
| }; |
| @@ -1373,11 +1372,9 @@ static int atmel_spi_one_transfer(struct spi_master *master, |
| &msg->transfers)) { |
| as->keep_cs = true; |
| } else { |
| - as->cs_active = !as->cs_active; |
| - if (as->cs_active) |
| - cs_activate(as, msg->spi); |
| - else |
| - cs_deactivate(as, msg->spi); |
| + cs_deactivate(as, msg->spi); |
| + udelay(10); |
| + cs_activate(as, msg->spi); |
| } |
| } |
| |
| @@ -1400,7 +1397,6 @@ static int atmel_spi_transfer_one_message(struct spi_master *master, |
| atmel_spi_lock(as); |
| cs_activate(as, spi); |
| |
| - as->cs_active = true; |
| as->keep_cs = false; |
| |
| msg->status = 0; |
| -- |
| 2.7.4 |
| |