Commit d371cbfc authored by Frank Li's avatar Frank Li Committed by Brian Norris

mtd: spi-nor: fsl-quadspi: add imx7d support

Support i.mx7d.
quadspi in i.mx7d increase rxfifo.
require fill at least 16byte to trigger data transfer.
Signed-off-by: default avatarFrank Li <Frank.Li@freescale.com>
Signed-off-by: default avatarHan Xu <han.xu@freescale.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 80d37724
...@@ -32,6 +32,11 @@ ...@@ -32,6 +32,11 @@
#define QUADSPI_QUIRK_SWAP_ENDIAN (1 << 0) #define QUADSPI_QUIRK_SWAP_ENDIAN (1 << 0)
/* Controller needs 4x internal clock */ /* Controller needs 4x internal clock */
#define QUADSPI_QUIRK_4X_INT_CLK (1 << 1) #define QUADSPI_QUIRK_4X_INT_CLK (1 << 1)
/*
* TKT253890, Controller needs driver to fill txfifo till 16 byte to
* trigger data transfer even though extern data will not transferred.
*/
#define QUADSPI_QUIRK_TKT253890 (1 << 2)
/* The registers */ /* The registers */
#define QUADSPI_MCR 0x00 #define QUADSPI_MCR 0x00
...@@ -202,6 +207,7 @@ ...@@ -202,6 +207,7 @@
enum fsl_qspi_devtype { enum fsl_qspi_devtype {
FSL_QUADSPI_VYBRID, FSL_QUADSPI_VYBRID,
FSL_QUADSPI_IMX6SX, FSL_QUADSPI_IMX6SX,
FSL_QUADSPI_IMX7D,
}; };
struct fsl_qspi_devtype_data { struct fsl_qspi_devtype_data {
...@@ -228,6 +234,15 @@ static struct fsl_qspi_devtype_data imx6sx_data = { ...@@ -228,6 +234,15 @@ static struct fsl_qspi_devtype_data imx6sx_data = {
.driver_data = QUADSPI_QUIRK_4X_INT_CLK, .driver_data = QUADSPI_QUIRK_4X_INT_CLK,
}; };
static struct fsl_qspi_devtype_data imx7d_data = {
.devtype = FSL_QUADSPI_IMX7D,
.rxfifo = 512,
.txfifo = 512,
.ahb_buf_size = 1024,
.driver_data = QUADSPI_QUIRK_TKT253890
| QUADSPI_QUIRK_4X_INT_CLK,
};
#define FSL_QSPI_MAX_CHIP 4 #define FSL_QSPI_MAX_CHIP 4
struct fsl_qspi { struct fsl_qspi {
struct mtd_info mtd[FSL_QSPI_MAX_CHIP]; struct mtd_info mtd[FSL_QSPI_MAX_CHIP];
...@@ -259,6 +274,11 @@ static inline int needs_4x_clock(struct fsl_qspi *q) ...@@ -259,6 +274,11 @@ static inline int needs_4x_clock(struct fsl_qspi *q)
return q->devtype_data->driver_data & QUADSPI_QUIRK_4X_INT_CLK; return q->devtype_data->driver_data & QUADSPI_QUIRK_4X_INT_CLK;
} }
static inline int needs_fill_txfifo(struct fsl_qspi *q)
{
return q->devtype_data->driver_data & QUADSPI_QUIRK_TKT253890;
}
/* /*
* An IC bug makes us to re-arrange the 32-bit data. * An IC bug makes us to re-arrange the 32-bit data.
* The following chips, such as IMX6SLX, have fixed this bug. * The following chips, such as IMX6SLX, have fixed this bug.
...@@ -560,6 +580,11 @@ static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor, ...@@ -560,6 +580,11 @@ static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor,
txbuf++; txbuf++;
} }
/* fill the TXFIFO upto 16 bytes for i.MX7d */
if (needs_fill_txfifo(q))
for (; i < 4; i++)
writel(tmp, q->iobase + QUADSPI_TBDR);
/* Trigger it */ /* Trigger it */
ret = fsl_qspi_runcmd(q, opcode, to, count); ret = fsl_qspi_runcmd(q, opcode, to, count);
...@@ -679,6 +704,7 @@ static int fsl_qspi_nor_setup_last(struct fsl_qspi *q) ...@@ -679,6 +704,7 @@ static int fsl_qspi_nor_setup_last(struct fsl_qspi *q)
static const struct of_device_id fsl_qspi_dt_ids[] = { static const struct of_device_id fsl_qspi_dt_ids[] = {
{ .compatible = "fsl,vf610-qspi", .data = (void *)&vybrid_data, }, { .compatible = "fsl,vf610-qspi", .data = (void *)&vybrid_data, },
{ .compatible = "fsl,imx6sx-qspi", .data = (void *)&imx6sx_data, }, { .compatible = "fsl,imx6sx-qspi", .data = (void *)&imx6sx_data, },
{ .compatible = "fsl,imx7d-qspi", .data = (void *)&imx7d_data, },
{ /* sentinel */ } { /* sentinel */ }
}; };
MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids); MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment