From: Ramuthevar Vadivel Murugan <vadivel.muruganx.ramuthe...@linux.intel.com>

On Intel's Lightning Mountain(LGM) SoC QSPI controller do not auto-poll.
This patch introduces to properly disable the auto-polling feature to
improve the performance of cadence-quadspi.

Signed-off-by: Ramuthevar Vadivel Murugan 
<vadivel.muruganx.ramuthe...@linux.intel.com>
---
 drivers/mtd/spi-nor/cadence-quadspi.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/mtd/spi-nor/cadence-quadspi.c 
b/drivers/mtd/spi-nor/cadence-quadspi.c
index 69fa13e95110..94aa40e868a1 100644
--- a/drivers/mtd/spi-nor/cadence-quadspi.c
+++ b/drivers/mtd/spi-nor/cadence-quadspi.c
@@ -134,6 +134,8 @@ struct cqspi_driver_platdata {
 #define CQSPI_REG_RD_INSTR_TYPE_DATA_MASK      0x3
 #define CQSPI_REG_RD_INSTR_DUMMY_MASK          0x1F
 
+#define CQSPI_REG_WR_COMPLETION_CTRL           0x38
+#define CQSPI_REG_WR_COMPLETION_DISABLE_AUTO_POLL      BIT(14)
 #define CQSPI_REG_WR_INSTR                     0x08
 #define CQSPI_REG_WR_INSTR_OPCODE_LSB          0
 #define CQSPI_REG_WR_INSTR_TYPE_ADDR_LSB       12
@@ -470,6 +472,18 @@ static int cqspi_command_write_addr(struct spi_nor *nor,
        return cqspi_exec_flash_cmd(cqspi, reg);
 }
 
+static int cqspi_disable_auto_poll(struct cqspi_st *cqspi)
+{
+       void __iomem *reg_base = cqspi->iobase;
+       unsigned int reg;
+
+       reg = readl(reg_base + CQSPI_REG_WR_COMPLETION_CTRL);
+       reg |= CQSPI_REG_WR_COMPLETION_DISABLE_AUTO_POLL;
+       writel(reg, reg_base + CQSPI_REG_WR_COMPLETION_CTRL);
+
+       return 0;
+}
+
 static int cqspi_read_setup(struct spi_nor *nor)
 {
        struct cqspi_flash_pdata *f_pdata = nor->priv;
@@ -507,6 +521,11 @@ static int cqspi_read_setup(struct spi_nor *nor)
        reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
        reg |= (nor->addr_width - 1);
        writel(reg, reg_base + CQSPI_REG_SIZE);
+
+       /* Disable auto-polling */
+       if (!f_pdata->use_direct_mode)
+               cqspi_disable_auto_poll(cqspi);
+
        return 0;
 }
 
@@ -631,6 +650,11 @@ static int cqspi_write_setup(struct spi_nor *nor)
        reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
        reg |= (nor->addr_width - 1);
        writel(reg, reg_base + CQSPI_REG_SIZE);
+
+       /* Disable auto-polling */
+       if (!f_pdata->use_direct_mode)
+               cqspi_disable_auto_poll(cqspi);
+
        return 0;
 }
 
-- 
2.11.0

Reply via email to