]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
AT91/AVR32: atmel_spi.c: flush RDR before next SPI transaction
authorReinhard Meyer <u-boot@emk-elektronik.de>
Mon, 9 Aug 2010 11:37:59 +0000 (13:37 +0200)
committerReinhard Meyer <u-boot@emk-elektronik.de>
Fri, 3 Sep 2010 09:22:25 +0000 (11:22 +0200)
Signed-off-by: Reinhard Meyer <u-boot@emk-elektronik.de>
drivers/spi/atmel_spi.c

index 317c0b41b6fbc6636303ef3a4196a63f16fa05bc..d0de9319684650989e987c3f0bb037035c0d6715 100644 (file)
@@ -43,7 +43,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
        u32                     csrx;
        void                    *regs;
 
-       if (cs > 3 || !spi_cs_is_valid(bus, cs))
+       if (!spi_cs_is_valid(bus, cs))
                return NULL;
 
        switch (bus) {
@@ -168,8 +168,17 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
         * somewhat quirky, and it doesn't really buy us much anyway
         * in the context of U-Boot.
         */
-       if (flags & SPI_XFER_BEGIN)
+       if (flags & SPI_XFER_BEGIN) {
                spi_cs_activate(slave);
+               /*
+                * sometimes the RDR is not empty when we get here,
+                * in theory that should not happen, but it DOES happen.
+                * Read it here to be on the safe side.
+                * That also clears the OVRES flag. Required if the
+                * following loop exits due to OVRES!
+                */
+               spi_readl(as, RDR);
+       }
 
        for (len_tx = 0, len_rx = 0; len_rx < len; ) {
                status = spi_readl(as, SR);