diff options
author | Han Xu <han.xu@nxp.com> | 2018-05-24 16:06:22 -0500 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | 031e2dc35b58666b43a31d4b1a8937b7ea85d8a9 (patch) | |
tree | 92217696d738e2aa80aebb3d9206628238c6f162 | |
parent | e51811558d2c0a14ebf4043695186b484170e79c (diff) |
MLK-18396-2: mtd: fsl-flexspi: enable FSPI on i.MX8MM
Enable FlexSPI driver on i.MX8MM EVK.
Signed-off-by: Han Xu <han.xu@nxp.com>
-rw-r--r-- | drivers/mtd/spi-nor/fsl-flexspi.c | 36 | ||||
-rw-r--r-- | drivers/mtd/spi-nor/spi-nor.c | 1 |
2 files changed, 28 insertions, 9 deletions
diff --git a/drivers/mtd/spi-nor/fsl-flexspi.c b/drivers/mtd/spi-nor/fsl-flexspi.c index 3ee9f44d06a6..c563f43c1c8d 100644 --- a/drivers/mtd/spi-nor/fsl-flexspi.c +++ b/drivers/mtd/spi-nor/fsl-flexspi.c @@ -410,6 +410,7 @@ enum fsl_flexspi_devtype { FSL_FLEXSPI_IMX8QM, FSL_FLEXSPI_IMX8QXP, + FSL_FLEXSPI_IMX8MM, }; struct fsl_flexspi_devtype_data { @@ -422,8 +423,7 @@ struct fsl_flexspi_devtype_data { static struct fsl_flexspi_devtype_data imx8qm_data = { .devtype = FSL_FLEXSPI_IMX8QM, - /* .rxfifo = 1024, */ - .rxfifo = 128, + .rxfifo = 1024, .txfifo = 1024, .ahb_buf_size = 2048, .driver_data = 0, @@ -431,8 +431,15 @@ static struct fsl_flexspi_devtype_data imx8qm_data = { static struct fsl_flexspi_devtype_data imx8qxp_data = { .devtype = FSL_FLEXSPI_IMX8QXP, - /* .rxfifo = 1024, */ - .rxfifo = 128, + .rxfifo = 1024, + .txfifo = 1024, + .ahb_buf_size = 2048, + .driver_data = 0, +}; + +static struct fsl_flexspi_devtype_data imx8mm_data = { + .devtype = FSL_FLEXSPI_IMX8MM, + .rxfifo = 1024, .txfifo = 1024, .ahb_buf_size = 2048, .driver_data = 0, @@ -492,7 +499,6 @@ static irqreturn_t fsl_flexspi_irq_handler(int irq, void *dev_id) static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) { void __iomem *base = flex->iobase; - int rxfifo = flex->devtype_data->rxfifo; struct spi_nor *nor = &flex->nor[0]; u8 addrlen = (nor->addr_width == 3) ? ADDR24BIT : ADDR32BIT; u32 lut_base; @@ -510,6 +516,16 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) op = nor->read_opcode; dm = nor->read_dummy; + /* Normal read */ + if (op == SPINOR_OP_READ) { + writel(LUT0(CMD, PAD1, op) | + LUT1(ADDR, PAD1, addrlen), + base + FLEXSPI_LUT(lut_base)); + + writel(LUT0(FSL_READ, PAD1, 0), + base + FLEXSPI_LUT(lut_base + 1)); + } + /* Octal DDR read */ if (op == SPINOR_OP_READ_1_1_8_D) { writel(LUT0(CMD, PAD1, op) | @@ -517,7 +533,7 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) base + FLEXSPI_LUT(lut_base)); writel(LUT0(DUMMY_DDR, PAD8, dm * 2) - | LUT1(READ_DDR, PAD8, rxfifo), + | LUT1(READ_DDR, PAD8, 0), base + FLEXSPI_LUT(lut_base + 1)); } @@ -529,7 +545,7 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) base + FLEXSPI_LUT(lut_base)); writel(LUT0(DUMMY, PAD1, dm) | - LUT1(FSL_READ, PAD4, rxfifo), + LUT1(FSL_READ, PAD4, 0), base + FLEXSPI_LUT(lut_base + 1)); } else { dev_err(nor->dev, "Unsupported opcode : 0x%.2x\n", op); @@ -546,7 +562,7 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) | LUT1(DUMMY, PAD1, dm), base + FLEXSPI_LUT(lut_base + 1)); - writel(LUT0(READ_DDR, PAD4, rxfifo) + writel(LUT0(READ_DDR, PAD4, 0) | LUT1(JMP_ON_CS, PAD1, 0), base + FLEXSPI_LUT(lut_base + 2)); } else if (op == SPINOR_OP_READ_1_1_4_D) { @@ -556,7 +572,7 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex) base + FLEXSPI_LUT(lut_base)); writel(LUT0(DUMMY, PAD1, dm) - | LUT1(READ_DDR, PAD4, rxfifo), + | LUT1(READ_DDR, PAD4, 0), base + FLEXSPI_LUT(lut_base + 1)); writel(LUT0(JMP_ON_CS, PAD1, 0), @@ -642,6 +658,7 @@ static int fsl_flexspi_get_seqid(struct fsl_flexspi *flex, u8 cmd) case SPINOR_OP_READ4_1_1_4: case SPINOR_OP_READ_1_1_4: case SPINOR_OP_READ4: + case SPINOR_OP_READ: return SEQID_QUAD_READ; case SPINOR_OP_WREN: return SEQID_WREN; @@ -1163,6 +1180,7 @@ static void fsl_flexspi_unprep(struct spi_nor *nor, enum spi_nor_ops ops) static const struct of_device_id fsl_flexspi_dt_ids[] = { { .compatible = "fsl,imx8qm-flexspi", .data = (void *)&imx8qm_data, }, { .compatible = "fsl,imx8qxp-flexspi", .data = (void *)&imx8qxp_data, }, + { .compatible = "fsl,imx8mm-flexspi", .data = (void *)&imx8mm_data, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, fsl_flexspi_dt_ids); diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index f24bdb19bcf9..d0bb9c1a7b1e 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -905,6 +905,7 @@ static const struct flash_info spi_nor_ids[] = { { "n25q064", INFO(0x20ba17, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_QUAD_READ) }, { "n25q064a", INFO(0x20bb17, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_QUAD_READ) }, { "n25q128a11", INFO(0x20bb18, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) }, + { "mt25qu256", INFO(0x20bb19, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_DDR_QUAD_READ) }, { "n25q128a13", INFO(0x20ba18, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) }, { "n25q256a", INFO(0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_DDR_QUAD_READ) }, { "n25q512a", INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) }, |