diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2012-11-06 20:33:35 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-11-12 08:36:23 +0100 |
commit | 45e9e0b1dc75c4d8a5a4f7d5bdcbd0723f1777f1 (patch) | |
tree | 1ad5829094e031208dda298bb821cd306df3c3ba /drivers/spi/atmel_spi.c | |
parent | bac41512cf0b27305cc1bc413569a8961bc1bc9b (diff) | |
download | barebox-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.c | 24 |
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; } |