summaryrefslogtreecommitdiff
path: root/drivers/mtd
diff options
context:
space:
mode:
authorHan Xu <han.xu@nxp.com>2017-06-05 16:19:39 -0500
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit926ef66fb54ce931949a7e3a2e7b5c0a7aee57f9 (patch)
treebd6a568d44ab30b6e8b01ef6782fdc2c08f0362f /drivers/mtd
parenta3070cdcc4df33e176e191da967342c80d9fcdd4 (diff)
MLK-15052-3: mtd: spi-nor: enable octal read mode in spi framework
Enhanced spi-nor framework to support octal read mode Signed-off-by: Han Xu <han.xu@nxp.com> Acked-by: Frank Li <frank.li@nxp.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 0b6134f48d66..76087e80ceb0 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -77,6 +77,7 @@ struct flash_info {
* SPI_NOR_HAS_LOCK.
*/
#define SPI_NOR_DDR_QUAD_READ BIT(10) /* Flash supports DDR Quad Read */
+#define SPI_NOR_DDR_OCTAL_READ BIT(11) /* Flash supports DDR Octal Read */
};
#define JEDEC_MFR(info) ((info)->id[0])
@@ -149,6 +150,7 @@ static inline int spi_nor_read_dummy_cycles(struct spi_nor *nor)
{
switch (nor->flash_read) {
case SPI_NOR_DDR_QUAD:
+ case SPI_NOR_DDR_OCTAL:
{
struct device_node *np = spi_nor_get_flash_node(nor);
u32 dummy;
@@ -161,11 +163,13 @@ static inline int spi_nor_read_dummy_cycles(struct spi_nor *nor)
*/
if (!of_property_read_u32(np, "spi-nor,ddr-quad-read-dummy",
&dummy))
+ pr_err("DUMMY CYCLE : %d !!!\n", dummy);
return dummy;
}
case SPI_NOR_FAST:
case SPI_NOR_DUAL:
case SPI_NOR_QUAD:
+ case SPI_NOR_OCTAL:
return 8;
case SPI_NOR_NORMAL:
return 0;
@@ -907,6 +911,7 @@ static const struct flash_info spi_nor_ids[] = {
{ "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
{ "n25q00", INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
{ "n25q00a", INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
+ {"mt35xu512aba", INFO(0x2c5b1a, 0, 128 * 1024, 512, SECT_4K | SPI_NOR_DDR_OCTAL_READ) },
/* PMC */
{ "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) },
@@ -1486,8 +1491,11 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
if (info->flags & SPI_NOR_NO_FR)
nor->flash_read = SPI_NOR_NORMAL;
- /* DDR Quad/Quad/Dual-read mode takes precedence over fast/normal */
- if (mode == SPI_NOR_DDR_QUAD && info->flags & SPI_NOR_DDR_QUAD_READ) {
+ /* DDR Octal/Quad/Dual-read mode takes precedence over fast/normal */
+ if (mode == SPI_NOR_DDR_OCTAL && info->flags & SPI_NOR_DDR_OCTAL_READ) {
+ nor->flash_read = SPI_NOR_DDR_OCTAL;
+ } else if (mode == SPI_NOR_DDR_QUAD &&
+ info->flags & SPI_NOR_DDR_QUAD_READ) {
ret = set_ddr_quad_mode(nor, info);
if (ret) {
dev_err(dev, "DDR quad mode not supported\n");
@@ -1507,6 +1515,9 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
/* Default commands */
switch (nor->flash_read) {
+ case SPI_NOR_DDR_OCTAL:
+ nor->read_opcode = SPINOR_OP_READ_1_1_8_D;
+ break;
case SPI_NOR_DDR_QUAD:
if (JEDEC_MFR(info) == CFI_MFR_AMD) { /* Spansion */
nor->read_opcode = SPINOR_OP_READ_1_4_4_D;
@@ -1546,6 +1557,10 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
if (JEDEC_MFR(info) == SNOR_MFR_SPANSION) {
/* Dedicated 4-byte command set */
switch (nor->flash_read) {
+ case SPI_NOR_DDR_OCTAL:
+ case SPI_NOR_OCTAL:
+ nor->read_opcode = SPINOR_OP_READ_1_1_8_D;
+ break;
case SPI_NOR_DDR_QUAD:
nor->read_opcode = SPINOR_OP_READ4_1_4_4_D;
break;