ar71xx: fix RB4xx CPLD SPI device mode setup
[openwrt/openwrt.git] / target / linux / ar71xx / files / drivers / spi / spi-rb4xx-cpld.c
index c0040a3e6a638ca01b8182cde671f9b3cae9904c..0534c7c37452c0ff903644803d7dc573c044fe77 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/types.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/device.h>
@@ -21,7 +22,7 @@
 #include <linux/gpio.h>
 #include <linux/slab.h>
 
-#include <asm/mach-ar71xx/rb4xx_cpld.h>
+#include <asm/mach-ath79/rb4xx_cpld.h>
 
 #define DRV_NAME       "spi-rb4xx-cpld"
 #define DRV_DESC       "RB4xx CPLD driver"
@@ -130,73 +131,7 @@ int rb4xx_cpld_change_cfg(unsigned mask, unsigned value)
 }
 EXPORT_SYMBOL_GPL(rb4xx_cpld_change_cfg);
 
-int rb4xx_cpld_read_from(unsigned addr, unsigned char *rx_buf,
-                        const unsigned char *verify_buf, unsigned count)
-{
-       const unsigned char cmd[5] = {
-               CPLD_CMD_READ_FAST,
-               (addr >> 16) & 0xff,
-               (addr >> 8) & 0xff,
-                addr & 0xff,
-                0
-       };
-       struct spi_transfer t[2] = {
-               {
-                       .tx_buf = &cmd,
-                       .len = 5,
-               },
-               {
-                       .tx_buf = verify_buf,
-                       .rx_buf = rx_buf,
-                       .len = count,
-                       .verify = (verify_buf != NULL),
-               },
-       };
-       struct spi_message m;
-
-       if (rb4xx_cpld == NULL)
-               return -ENODEV;
-
-       spi_message_init(&m);
-       m.fast_read = 1;
-       spi_message_add_tail(&t[0], &m);
-       spi_message_add_tail(&t[1], &m);
-       return spi_sync(rb4xx_cpld->spi, &m);
-}
-EXPORT_SYMBOL_GPL(rb4xx_cpld_read_from);
-
-#if 0
-int rb4xx_cpld_read(unsigned char *buf, unsigned char *verify_buf,
-                   unsigned count)
-{
-       struct spi_transfer t[2];
-       struct spi_message m;
-       unsigned char cmd[2];
-
-       if (rb4xx_cpld == NULL)
-               return -ENODEV;
-
-       spi_message_init(&m);
-       memset(&t, 0, sizeof(t));
-
-       /* send command */
-       t[0].tx_buf = cmd;
-       t[0].len = sizeof(cmd);
-       spi_message_add_tail(&t[0], &m);
-
-       cmd[0] = CPLD_CMD_READ_NAND;
-       cmd[1] = 0;
-
-       /* read data */
-       t[1].rx_buf = buf;
-       t[1].len = count;
-       spi_message_add_tail(&t[1], &m);
-
-       return spi_sync(rb4xx_cpld->spi, &m);
-}
-#else
-int rb4xx_cpld_read(unsigned char *rx_buf, const unsigned char *verify_buf,
-                   unsigned count)
+int rb4xx_cpld_read(unsigned char *rx_buf, unsigned count)
 {
        static const unsigned char cmd[2] = { CPLD_CMD_READ_NAND, 0 };
        struct spi_transfer t[2] = {
@@ -204,10 +139,8 @@ int rb4xx_cpld_read(unsigned char *rx_buf, const unsigned char *verify_buf,
                        .tx_buf = &cmd,
                        .len = 2,
                }, {
-                       .tx_buf = verify_buf,
                        .rx_buf = rx_buf,
                        .len = count,
-                       .verify = (verify_buf != NULL),
                },
        };
        struct spi_message m;
@@ -220,40 +153,10 @@ int rb4xx_cpld_read(unsigned char *rx_buf, const unsigned char *verify_buf,
        spi_message_add_tail(&t[1], &m);
        return spi_sync(rb4xx_cpld->spi, &m);
 }
-#endif
 EXPORT_SYMBOL_GPL(rb4xx_cpld_read);
 
 int rb4xx_cpld_write(const unsigned char *buf, unsigned count)
 {
-#if 0
-       struct spi_transfer t[3];
-       struct spi_message m;
-       unsigned char cmd[1];
-
-       if (rb4xx_cpld == NULL)
-               return -ENODEV;
-
-       memset(&t, 0, sizeof(t));
-       spi_message_init(&m);
-
-       /* send command */
-       t[0].tx_buf = cmd;
-       t[0].len = sizeof(cmd);
-       spi_message_add_tail(&t[0], &m);
-
-       cmd[0] = CPLD_CMD_WRITE_NAND;
-
-       /* write data */
-       t[1].tx_buf = buf;
-       t[1].len = count;
-       spi_message_add_tail(&t[1], &m);
-
-       /* send idle */
-       t[2].len = 1;
-       spi_message_add_tail(&t[2], &m);
-
-       return spi_sync(rb4xx_cpld->spi, &m);
-#else
        static const unsigned char cmd = CPLD_CMD_WRITE_NAND;
        struct spi_transfer t[3] = {
                {
@@ -262,10 +165,10 @@ int rb4xx_cpld_write(const unsigned char *buf, unsigned count)
                }, {
                        .tx_buf = buf,
                        .len = count,
-                       .fast_write = 1,
+                       .tx_nbits = SPI_NBITS_DUAL,
                }, {
                        .len = 1,
-                       .fast_write = 1,
+                       .tx_nbits = SPI_NBITS_DUAL,
                },
        };
        struct spi_message m;
@@ -278,7 +181,6 @@ int rb4xx_cpld_write(const unsigned char *buf, unsigned count)
        spi_message_add_tail(&t[1], &m);
        spi_message_add_tail(&t[2], &m);
        return spi_sync(rb4xx_cpld->spi, &m);
-#endif
 }
 EXPORT_SYMBOL_GPL(rb4xx_cpld_write);
 
@@ -355,7 +257,7 @@ static int rb4xx_cpld_gpio_init(struct rb4xx_cpld *cpld, unsigned int base)
        return err;
 }
 
-static int __devinit rb4xx_cpld_probe(struct spi_device *spi)
+static int rb4xx_cpld_probe(struct spi_device *spi)
 {
        struct rb4xx_cpld *cpld;
        struct rb4xx_cpld_platform_data *pdata;
@@ -377,7 +279,7 @@ static int __devinit rb4xx_cpld_probe(struct spi_device *spi)
        cpld->spi = spi_dev_get(spi);
        dev_set_drvdata(&spi->dev, cpld);
 
-       spi->mode = SPI_MODE_0;
+       spi->mode = SPI_MODE_0 | SPI_TX_DUAL;
        spi->bits_per_word = 8;
        err = spi_setup(spi);
        if (err) {
@@ -400,7 +302,7 @@ err_drvdata:
        return err;
 }
 
-static int __devexit rb4xx_cpld_remove(struct spi_device *spi)
+static int rb4xx_cpld_remove(struct spi_device *spi)
 {
        struct rb4xx_cpld *cpld;
 
@@ -419,7 +321,7 @@ static struct spi_driver rb4xx_cpld_driver = {
                .owner          = THIS_MODULE,
        },
        .probe          = rb4xx_cpld_probe,
-       .remove         = __devexit_p(rb4xx_cpld_remove),
+       .remove         = rb4xx_cpld_remove,
 };
 
 static int __init rb4xx_cpld_init(void)