brcm63xx: enable dual rx/tx spi support for hsspi
should improve flash access times. Should be harmless to gnerally enable regardless if a flash supporting dual reads is attached. In doubt, spi-nor will just fall back to serial reads. Signed-off-by: Jonas Gorski <jogo@openwrt.org> SVN-Revision: 46725
This commit is contained in:
parent
7a68c31a81
commit
77a70a0716
3 changed files with 74 additions and 4 deletions
|
@ -0,0 +1,68 @@
|
||||||
|
From 61dc388f577b6f984797949f32c30021d9ea73dc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Sun, 23 Aug 2015 12:16:02 +0200
|
||||||
|
Subject: [PATCH V2] spi/bcm63xx-hsspi: add support for dual spi read/write
|
||||||
|
|
||||||
|
Add support for dual read/writes on spi-bcm63xx-hsspi. This has been
|
||||||
|
tested with a s25fl129p1 dual read capable spi flash, with a nice speed
|
||||||
|
improvement:
|
||||||
|
|
||||||
|
serial read:
|
||||||
|
|
||||||
|
root@OpenWrt:/# time dd if=/dev/mtd4 of=/dev/null bs=8192
|
||||||
|
2032+0 records in
|
||||||
|
2032+0 records out
|
||||||
|
real 0m 4.39s
|
||||||
|
user 0m 0.00s
|
||||||
|
sys 0m 1.55s
|
||||||
|
|
||||||
|
dual read:
|
||||||
|
|
||||||
|
root@OpenWrt:/# time dd if=/dev/mtd4 of=/dev/null bs=8192
|
||||||
|
2032+0 records in
|
||||||
|
2032+0 records out
|
||||||
|
real 0m 3.09s
|
||||||
|
user 0m 0.00s
|
||||||
|
sys 0m 1.56s
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-bcm63xx-hsspi.c | 13 +++++++++----
|
||||||
|
1 file changed, 9 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-bcm63xx-hsspi.c
|
||||||
|
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
|
||||||
|
@@ -76,6 +76,7 @@
|
||||||
|
#define HSSPI_FIFO_REG(x) (0x200 + (x) * 0x200)
|
||||||
|
|
||||||
|
|
||||||
|
+#define HSSPI_OP_MULTIBIT BIT(11)
|
||||||
|
#define HSSPI_OP_CODE_SHIFT 13
|
||||||
|
#define HSSPI_OP_SLEEP (0 << HSSPI_OP_CODE_SHIFT)
|
||||||
|
#define HSSPI_OP_READ_WRITE (1 << HSSPI_OP_CODE_SHIFT)
|
||||||
|
@@ -171,9 +172,12 @@ static int bcm63xx_hsspi_do_txrx(struct
|
||||||
|
if (opcode != HSSPI_OP_READ)
|
||||||
|
step_size -= HSSPI_OPCODE_LEN;
|
||||||
|
|
||||||
|
- __raw_writel(0 << MODE_CTRL_PREPENDBYTE_CNT_SHIFT |
|
||||||
|
- 2 << MODE_CTRL_MULTIDATA_WR_STRT_SHIFT |
|
||||||
|
- 2 << MODE_CTRL_MULTIDATA_RD_STRT_SHIFT | 0xff,
|
||||||
|
+ if ((opcode == HSSPI_OP_READ && t->rx_nbits == SPI_NBITS_DUAL) ||
|
||||||
|
+ (opcode == HSSPI_OP_WRITE && t->tx_nbits == SPI_NBITS_DUAL))
|
||||||
|
+ opcode |= HSSPI_OP_MULTIBIT;
|
||||||
|
+
|
||||||
|
+ __raw_writel(1 << MODE_CTRL_MULTIDATA_WR_SIZE_SHIFT |
|
||||||
|
+ 1 << MODE_CTRL_MULTIDATA_RD_SIZE_SHIFT | 0xff,
|
||||||
|
bs->regs + HSSPI_PROFILE_MODE_CTRL_REG(chip_select));
|
||||||
|
|
||||||
|
while (pending > 0) {
|
||||||
|
@@ -374,7 +378,8 @@ static int bcm63xx_hsspi_probe(struct pl
|
||||||
|
master->num_chipselect = 8;
|
||||||
|
master->setup = bcm63xx_hsspi_setup;
|
||||||
|
master->transfer_one_message = bcm63xx_hsspi_transfer_one;
|
||||||
|
- master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
|
||||||
|
+ master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH |
|
||||||
|
+ SPI_RX_DUAL | SPI_TX_DUAL;
|
||||||
|
master->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||||
|
master->auto_runtime_pm = true;
|
||||||
|
|
|
@ -5,7 +5,7 @@ Subject: [PATCH 29/60] MIPS: BCM63XX: Register SPI flash if present
|
||||||
|
|
||||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
||||||
---
|
---
|
||||||
arch/mips/bcm63xx/dev-flash.c | 33 +++++++++++++++++++-
|
arch/mips/bcm63xx/dev-flash.c | 35 +++++++++++++++++++-
|
||||||
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 2 +
|
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 2 +
|
||||||
2 files changed, 33 insertions(+), 2 deletions(-)
|
2 files changed, 33 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
@ -95,15 +95,17 @@ Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
||||||
if (val & STRAPBUS_63268_BOOT_SEL_SERIAL)
|
if (val & STRAPBUS_63268_BOOT_SEL_SERIAL)
|
||||||
return BCM63XX_FLASH_TYPE_SERIAL;
|
return BCM63XX_FLASH_TYPE_SERIAL;
|
||||||
else
|
else
|
||||||
@@ -195,8 +232,15 @@ int __init bcm63xx_flash_register(void)
|
@@ -195,8 +232,17 @@ int __init bcm63xx_flash_register(void)
|
||||||
|
|
||||||
return platform_device_register(&mtd_dev);
|
return platform_device_register(&mtd_dev);
|
||||||
case BCM63XX_FLASH_TYPE_SERIAL:
|
case BCM63XX_FLASH_TYPE_SERIAL:
|
||||||
- pr_warn("unsupported serial flash detected\n");
|
- pr_warn("unsupported serial flash detected\n");
|
||||||
- return -ENODEV;
|
- return -ENODEV;
|
||||||
+ if (BCMCPU_IS_6318() || BCMCPU_IS_6328() || BCMCPU_IS_6362() ||
|
+ if (BCMCPU_IS_6318() || BCMCPU_IS_6328() || BCMCPU_IS_6362() ||
|
||||||
+ BCMCPU_IS_63268())
|
+ BCMCPU_IS_63268()) {
|
||||||
+ bcm63xx_spi_flash_info[0].bus_num = 1;
|
+ bcm63xx_spi_flash_info[0].bus_num = 1;
|
||||||
|
+ bcm63xx_spi_flash_info[0].mode = SPI_RX_DUAL;
|
||||||
|
+ }
|
||||||
+
|
+
|
||||||
+ if (BCMCPU_IS_6358() || BCMCPU_IS_6368())
|
+ if (BCMCPU_IS_6358() || BCMCPU_IS_6368())
|
||||||
+ bcm63xx_flash_data.max_transfer_len = SPI_6358_MSG_DATA_SIZE;
|
+ bcm63xx_flash_data.max_transfer_len = SPI_6358_MSG_DATA_SIZE;
|
||||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
|
||||||
--- a/arch/mips/bcm63xx/dev-flash.c
|
--- a/arch/mips/bcm63xx/dev-flash.c
|
||||||
+++ b/arch/mips/bcm63xx/dev-flash.c
|
+++ b/arch/mips/bcm63xx/dev-flash.c
|
||||||
@@ -250,3 +250,8 @@ int __init bcm63xx_flash_register(void)
|
@@ -252,3 +252,8 @@ int __init bcm63xx_flash_register(void)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue