summaryrefslogtreecommitdiffstats
path: root/drivers/spi/atmel_spi.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2012-11-06 20:33:35 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-11-12 08:36:23 +0100
commit45e9e0b1dc75c4d8a5a4f7d5bdcbd0723f1777f1 (patch)
tree1ad5829094e031208dda298bb821cd306df3c3ba /drivers/spi/atmel_spi.c
parentbac41512cf0b27305cc1bc413569a8961bc1bc9b (diff)
downloadbarebox-45e9e0b1dc75c4d8a5a4f7d5bdcbd0723f1777f1.tar.gz
barebox-45e9e0b1dc75c4d8a5a4f7d5bdcbd0723f1777f1.tar.xz
atmel_spi: add cs change support
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/spi/atmel_spi.c')
-rw-r--r--drivers/spi/atmel_spi.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index ee0c4b40fe..793933eefb 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -320,6 +320,7 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *mesg)
struct spi_master *master = spi->master;
struct atmel_spi *as = to_atmel_spi(master);
struct spi_transfer *t = NULL;
+ unsigned int cs_change;
mesg->actual_length = 0;
@@ -335,15 +336,34 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *mesg)
cs_activate(as, spi);
+ cs_change = 0;
+
list_for_each_entry(t, &mesg->transfers, transfer_list) {
+ if (cs_change) {
+ udelay(1);
+ cs_deactivate(as, spi);
+ udelay(1);
+ cs_activate(as, spi);
+ }
+
+ cs_change = t->cs_change;
+
ret = atmel_spi_do_xfer(spi, as, t);
if (ret < 0)
- goto out;
+ goto err;
mesg->actual_length += ret;
+
+ if (cs_change)
+ cs_activate(as, spi);
}
-out:
+ if (!cs_change)
+ cs_deactivate(as, spi);
+
+ return 0;
+
+err:
cs_deactivate(as, spi);
return ret;
}