aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/files/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ar71xx/files/drivers')
-rw-r--r--target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c4
-rw-r--r--target/linux/ar71xx/files/drivers/spi/spi-rb4xx-cpld.c105
-rw-r--r--target/linux/ar71xx/files/drivers/spi/spi-rb4xx.c83
3 files changed, 8 insertions, 184 deletions
diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c
index 5b9841b76b..981bfcf69d 100644
--- a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c
+++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c
@@ -107,7 +107,7 @@ static unsigned char rb4xx_nand_read_byte(struct mtd_info *mtd)
unsigned char data = 0;
int err;
- err = rb4xx_cpld_read(&data, NULL, 1);
+ err = rb4xx_cpld_read(&data, 1);
if (err) {
pr_err("rb4xx_nand: read data failed, err=%d\n", err);
data = 0xff;
@@ -131,7 +131,7 @@ static void rb4xx_nand_read_buf(struct mtd_info *mtd, unsigned char *buf,
{
int err;
- err = rb4xx_cpld_read(buf, NULL, len);
+ err = rb4xx_cpld_read(buf, len);
if (err)
pr_err("rb4xx_nand: read buf failed, err=%d\n", err);
}
diff --git a/target/linux/ar71xx/files/drivers/spi/spi-rb4xx-cpld.c b/target/linux/ar71xx/files/drivers/spi/spi-rb4xx-cpld.c
index a8d52825eb..f6ec350525 100644
--- a/target/linux/ar71xx/files/drivers/spi/spi-rb4xx-cpld.c
+++ b/target/linux/ar71xx/files/drivers/spi/spi-rb4xx-cpld.c
@@ -131,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] = {
@@ -205,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;
@@ -221,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] = {
{
@@ -263,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;
@@ -279,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);
diff --git a/target/linux/ar71xx/files/drivers/spi/spi-rb4xx.c b/target/linux/ar71xx/files/drivers/spi/spi-rb4xx.c
index 357fd41708..d8c71fb5a7 100644
--- a/target/linux/ar71xx/files/drivers/spi/spi-rb4xx.c
+++ b/target/linux/ar71xx/files/drivers/spi/spi-rb4xx.c
@@ -135,7 +135,6 @@ static void do_spi_byte_fast(void __iomem *base, unsigned char byte)
static int rb4xx_spi_txrx(void __iomem *base, struct spi_transfer *t)
{
- const unsigned char *rxv_ptr = NULL;
const unsigned char *tx_ptr = t->tx_buf;
unsigned char *rx_ptr = t->rx_buf;
unsigned i;
@@ -145,94 +144,21 @@ static int rb4xx_spi_txrx(void __iomem *base, struct spi_transfer *t)
(t->tx_buf ? 1 : 0),
(t->rx_buf ? 1 : 0));
- if (t->verify) {
- rxv_ptr = tx_ptr;
- tx_ptr = NULL;
- }
-
for (i = 0; i < t->len; ++i) {
unsigned char sdata = tx_ptr ? tx_ptr[i] : 0;
- if (t->fast_write)
+ if (t->tx_nbits == SPI_NBITS_DUAL)
do_spi_byte_fast(base, sdata);
else
do_spi_byte(base, sdata);
- if (rx_ptr) {
+ if (rx_ptr)
rx_ptr[i] = __raw_readl(base + AR71XX_SPI_REG_RDS) & 0xff;
- } else if (rxv_ptr) {
- unsigned char c = __raw_readl(base + AR71XX_SPI_REG_RDS);
- if (rxv_ptr[i] != c)
- return i;
- }
}
return i;
}
-static int rb4xx_spi_read_fast(struct rb4xx_spi *rbspi,
- struct spi_message *m)
-{
- struct spi_transfer *t;
- const unsigned char *tx_ptr;
- unsigned addr;
- void __iomem *base = rbspi->base;
-
- /* check for exactly two transfers */
- if (list_empty(&m->transfers) ||
- list_is_last(m->transfers.next, &m->transfers) ||
- !list_is_last(m->transfers.next->next, &m->transfers)) {
- return -1;
- }
-
- /* first transfer contains command and address */
- t = list_entry(m->transfers.next,
- struct spi_transfer, transfer_list);
-
- if (t->len != 5 || t->tx_buf == NULL)
- return -1;
-
- tx_ptr = t->tx_buf;
- if (tx_ptr[0] != CPLD_CMD_READ_FAST)
- return -1;
-
- addr = tx_ptr[1];
- addr = tx_ptr[2] | (addr << 8);
- addr = tx_ptr[3] | (addr << 8);
- addr += (unsigned) base;
-
- m->actual_length += t->len;
-
- /* second transfer contains data itself */
- t = list_entry(m->transfers.next->next,
- struct spi_transfer, transfer_list);
-
- if (t->tx_buf && !t->verify)
- return -1;
-
- __raw_writel(AR71XX_SPI_FS_GPIO, base + AR71XX_SPI_REG_FS);
- __raw_writel(rbspi->spi_ctrl_fread, base + AR71XX_SPI_REG_CTRL);
- __raw_writel(0, base + AR71XX_SPI_REG_FS);
-
- if (t->rx_buf) {
- memcpy(t->rx_buf, (const void *)addr, t->len);
- } else if (t->tx_buf) {
- unsigned char buf[t->len];
- memcpy(buf, (const void *)addr, t->len);
- if (memcmp(t->tx_buf, buf, t->len) != 0)
- m->status = -EMSGSIZE;
- }
- m->actual_length += t->len;
-
- if (rbspi->spi_ctrl_flash != rbspi->spi_ctrl_fread) {
- __raw_writel(AR71XX_SPI_FS_GPIO, base + AR71XX_SPI_REG_FS);
- __raw_writel(rbspi->spi_ctrl_flash, base + AR71XX_SPI_REG_CTRL);
- __raw_writel(0, base + AR71XX_SPI_REG_FS);
- }
-
- return 0;
-}
-
static int rb4xx_spi_msg(struct rb4xx_spi *rbspi, struct spi_message *m)
{
struct spi_transfer *t = NULL;
@@ -242,10 +168,6 @@ static int rb4xx_spi_msg(struct rb4xx_spi *rbspi, struct spi_message *m)
if (list_empty(&m->transfers))
return -1;
- if (m->fast_read)
- if (rb4xx_spi_read_fast(rbspi, m) == 0)
- return -1;
-
__raw_writel(AR71XX_SPI_FS_GPIO, base + AR71XX_SPI_REG_FS);
__raw_writel(SPI_CTRL_FASTEST, base + AR71XX_SPI_REG_CTRL);
do_spi_init(m->spi);
@@ -402,6 +324,7 @@ static int rb4xx_spi_probe(struct platform_device *pdev)
master->bus_num = 0;
master->num_chipselect = 3;
+ master->mode_bits = SPI_TX_DUAL;
master->setup = rb4xx_spi_setup;
master->transfer = rb4xx_spi_transfer;