summaryrefslogtreecommitdiff
path: root/drivers/mtd
diff options
context:
space:
mode:
authorHan Xu <han.xu@nxp.com>2018-06-22 11:31:48 -0500
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:33:12 +0800
commit074c0daeca0ad21ea32e75e29e05f7d4d7a64bb0 (patch)
treeffcea81e57eec9c5f2d949465b62eff72910c365 /drivers/mtd
parentb0e1908122defe9c1059aac23c9ca42db416fb16 (diff)
MLK-18669-2: mtd: flexspi: enable Quad DDR read for i.MX8MM FlexSPI Nor
i.MX8MM MEK only supports Quad mode for flexspi nor, enable the quad ddr mode for better performance. Signed-off-by: Han Xu <han.xu@nxp.com> (cherry picked from commit a0abea8ca8d493fc2861c84f1475c0eb388899ce)
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/fsl-flexspi.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/mtd/spi-nor/fsl-flexspi.c b/drivers/mtd/spi-nor/fsl-flexspi.c
index a5523eb830e2..a63650649350 100644
--- a/drivers/mtd/spi-nor/fsl-flexspi.c
+++ b/drivers/mtd/spi-nor/fsl-flexspi.c
@@ -32,6 +32,9 @@
#include <soc/imx8/sc/sci.h>
#include <linux/pm_runtime.h>
+/* Board only enabled up to Quad mode, not Octal*/
+#define FLEXSPI_QUIRK_QUAD_ONLY (1 << 0)
+
/* runtime pm timeout */
#define FSL_FLEXSPI_RPM_TIMEOUT 50 /* 50ms */
@@ -442,7 +445,7 @@ static struct fsl_flexspi_devtype_data imx8mm_data = {
.rxfifo = 1024,
.txfifo = 1024,
.ahb_buf_size = 2048,
- .driver_data = 0,
+ .driver_data = FLEXSPI_QUIRK_QUAD_ONLY,
};
#define FSL_FLEXSPI_MAX_CHIP 4
@@ -468,6 +471,11 @@ struct fsl_flexspi {
struct pm_qos_request pm_qos_req;
};
+static inline int fsl_flexspi_quad_only(struct fsl_flexspi *flex)
+{
+ return flex->devtype_data->driver_data & FLEXSPI_QUIRK_QUAD_ONLY;
+}
+
static inline void fsl_flexspi_unlock_lut(struct fsl_flexspi *flex)
{
writel(FLEXSPI_LUTKEY_VALUE, flex->iobase + FLEXSPI_LUTKEY);
@@ -556,11 +564,11 @@ static void fsl_flexspi_init_lut(struct fsl_flexspi *flex)
/* DDR Quad Fast Read */
} else if (op == SPINOR_OP_READ_1_1_4_D) {
/* read mode : 1-1-4, such as Micron N25Q256A. */
- writel(LUT0(CMD_DDR, PAD1, op) |
+ writel(LUT0(CMD, PAD1, op) |
LUT1(ADDR_DDR, PAD1, addrlen),
base + FLEXSPI_LUT(lut_base));
- writel(LUT0(DUMMY, PAD1, dm) |
+ writel(LUT0(DUMMY_DDR, PAD4, dm * 2) |
LUT1(READ_DDR, PAD4, 0),
base + FLEXSPI_LUT(lut_base + 1));
@@ -1302,7 +1310,8 @@ static int fsl_flexspi_probe(struct platform_device *pdev)
ret = of_property_read_u32(np, "spi-nor,ddr-quad-read-dummy",
&dummy);
if (!ret && dummy > 0)
- hwcaps.mask |= SNOR_HWCAPS_READ;
+ hwcaps.mask |= fsl_flexspi_quad_only(flex) ?
+ SNOR_HWCAPS_READ_1_1_4 :SNOR_HWCAPS_READ_1_8_8;
else
hwcaps.mask |= SNOR_HWCAPS_READ;