summaryrefslogtreecommitdiff
path: root/drivers/spi/mxc_spi.c
diff options
context:
space:
mode:
authorMagnus Lilja <lilja.magnus@gmail.com>2010-02-09 22:05:39 +0100
committerTom Rix <Tom.Rix@windriver.com>2010-02-12 12:31:54 -0600
commiteff536befd3efab538bba10bad07ecff63c9f470 (patch)
tree5df4b4407768e17c6aa1b73e6fd292991a7aec9a /drivers/spi/mxc_spi.c
parent39a9142203e610bf2b1a216085e374277fd28f9f (diff)
downloadu-boot-imx-eff536befd3efab538bba10bad07ecff63c9f470.zip
u-boot-imx-eff536befd3efab538bba10bad07ecff63c9f470.tar.gz
u-boot-imx-eff536befd3efab538bba10bad07ecff63c9f470.tar.bz2
SPI: Fix 32 bit transfers in mxc_spi.c
Commit f9b6a1575d9f1ca192e4cb60e547aa66f08baa3f, "i.MX31: fix SPI driver for shorter than 32 bit" broke 32 bit transfers. This patch makes single 32 bit transfer work again. Transfer lengths that are known not to work will abort and print an error message. Tested on i.MX31 Litekit and i.MX31 PDK using 32 bit transfers to the MC13783/ATLAS chip (using the 'date' command). Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
Diffstat (limited to 'drivers/spi/mxc_spi.c')
-rw-r--r--drivers/spi/mxc_spi.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
index fad9840..3a45200 100644
--- a/drivers/spi/mxc_spi.c
+++ b/drivers/spi/mxc_spi.c
@@ -131,6 +131,13 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
return 1;
}
+ /* This driver is currently partly broken, alert the user */
+ if (bitlen > 16 && (bitlen % 32)) {
+ printf("Error: SPI transfer with bitlen=%d is broken.\n",
+ bitlen);
+ return 1;
+ }
+
for (i = 0, in_l = (u32 *)din, out_l = (u32 *)dout;
i < n_blks;
i++, in_l++, out_l++, bitlen -= 32) {
@@ -142,6 +149,8 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
*(u8 *)din = data;
else if (bitlen < 17)
*(u16 *)din = data;
+ else
+ *in_l = data;
}
}