]> git.karo-electronics.de Git - linux-beck.git/commitdiff
p54spi: fix incorrect access sequence to DMA_WRITE_CTRL in p54spi_spi_write_dma
authorMax Filippov <jcmvbkbc@gmail.com>
Sun, 17 May 2009 23:02:31 +0000 (03:02 +0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 20 May 2009 18:46:27 +0000 (14:46 -0400)
Host is not allowed to modify DMA_WRITE_CTRL register
if bit HOST_ALLOWED in it is not set. Wait for HOST_ALLOWED first.

Also get rid of timeout in p54spi_wait_bit as it's been playing
a role of workaround for such an incorrect register access.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/p54/p54spi.c

index 59a5e778bb08141fec3b8a5293ea473da38872ce..272b7e176afcccd695763acf5050e1374ca89fb2 100644 (file)
@@ -172,8 +172,6 @@ static int p54spi_wait_bit(struct p54s_priv *priv, u16 reg, __le32 bits)
                __le32 buffer = p54spi_read32(priv, reg);
                if ((buffer & bits) == bits)
                        return 1;
-
-               msleep(0);
        }
        return 0;
 }
@@ -181,9 +179,6 @@ static int p54spi_wait_bit(struct p54s_priv *priv, u16 reg, __le32 bits)
 static int p54spi_spi_write_dma(struct p54s_priv *priv, __le32 base,
                                const void *buf, size_t len)
 {
-       p54spi_write16(priv, SPI_ADRS_DMA_WRITE_CTRL,
-                      cpu_to_le16(SPI_DMA_WRITE_CTRL_ENABLE));
-
        if (!p54spi_wait_bit(priv, SPI_ADRS_DMA_WRITE_CTRL,
                             cpu_to_le32(HOST_ALLOWED))) {
                dev_err(&priv->spi->dev, "spi_write_dma not allowed "
@@ -191,6 +186,9 @@ static int p54spi_spi_write_dma(struct p54s_priv *priv, __le32 base,
                return -EAGAIN;
        }
 
+       p54spi_write16(priv, SPI_ADRS_DMA_WRITE_CTRL,
+                      cpu_to_le16(SPI_DMA_WRITE_CTRL_ENABLE));
+
        p54spi_write16(priv, SPI_ADRS_DMA_WRITE_LEN, cpu_to_le16(len));
        p54spi_write32(priv, SPI_ADRS_DMA_WRITE_BASE, base);
        p54spi_spi_write(priv, SPI_ADRS_DMA_DATA, buf, len);