summaryrefslogtreecommitdiff
path: root/drivers/mtd
diff options
context:
space:
mode:
authorHan Xu <han.xu@nxp.com>2018-05-24 16:06:22 -0500
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit031e2dc35b58666b43a31d4b1a8937b7ea85d8a9 (patch)
tree92217696d738e2aa80aebb3d9206628238c6f162 /drivers/mtd
parente51811558d2c0a14ebf4043695186b484170e79c (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>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/fsl-flexspi.c36
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c1
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) },