Re: [PATCH 1/2] spi: mtk_snor: add support for MTK SPI NOR controller

2021-01-18 Thread SkyLake Huang
On Tue, 2020-12-08 at 01:48 +0800, Jagan Teki wrote:
> On Fri, Nov 13, 2020 at 8:32 AM SkyLake Huang
>  wrote:
> >
> > From: "SkyLake.Huang" 
> >
> > This patch adds support for MTK SPI NOR controller, which you
> > can see on mt7622 & mt7629.
> >
> > This controller is designed only for SPI NOR. We can't adjust
> > its bus clock dynamically. Set clock in dts instead.
> >
> > Signed-off-by: SkyLake.Huang 
> > ---
> >  drivers/spi/Kconfig|   7 +
> >  drivers/spi/Makefile   |   1 +
> >  drivers/spi/mtk_snor.c | 597 +
> >  3 files changed, 605 insertions(+)
> >  create mode 100644 drivers/spi/mtk_snor.c
> >
> > diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> > index fae2040af8..670af450c1 100644
> > --- a/drivers/spi/Kconfig
> > +++ b/drivers/spi/Kconfig
> > @@ -174,6 +174,13 @@ config MT7621_SPI
> >   the SPI NOR flash on platforms embedding this Ralink / MediaTek
> >   SPI core, like MT7621/7628/7688.
> >
> > +config MTK_SNOR
> > +   bool "Mediatek SPI-NOR controller driver"
> > +   depends on SPI_MEM
> > +   help
> > + Enable the Mediatek SPINOR controller driver. This driver has
> > +  better read/write performance with NOR.
> > +
> >  config MTK_SNFI_SPI
> > bool "Mediatek SPI memory controller driver"
> > depends on SPI_MEM
> > diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
> > index ae4f2958f8..efe92f6b18 100644
> > --- a/drivers/spi/Makefile
> > +++ b/drivers/spi/Makefile
> > @@ -38,6 +38,7 @@ obj-$(CONFIG_MESON_SPIFC) += meson_spifc.o
> >  obj-$(CONFIG_MPC8XX_SPI) += mpc8xx_spi.o
> >  obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
> >  obj-$(CONFIG_MTK_SNFI_SPI) += mtk_snfi_spi.o
> > +obj-$(CONFIG_MTK_SNOR) += mtk_snor.o
> >  obj-$(CONFIG_MT7621_SPI) += mt7621_spi.o
> >  obj-$(CONFIG_MSCC_BB_SPI) += mscc_bb_spi.o
> >  obj-$(CONFIG_MVEBU_A3700_SPI) += mvebu_a3700_spi.o
> > diff --git a/drivers/spi/mtk_snor.c b/drivers/spi/mtk_snor.c
> > new file mode 100644
> > index 00..0a92f1c5a8
> > --- /dev/null
> > +++ b/drivers/spi/mtk_snor.c
> > @@ -0,0 +1,597 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +//
> > +// Mediatek SPI-NOR controller driver
> > +//
> > +// Copyright (C) 2020 SkyLake Huang 
> > +//
> > +// Some parts are based on drivers/spi/spi-mtk-nor.c of linux version
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#define DRIVER_NAME "mtk-spi-nor"
> > +
> > +#define MTK_NOR_REG_CMD0x00
> > +#define MTK_NOR_CMD_WRSR   BIT(5)
> > +#define MTK_NOR_CMD_WRITE  BIT(4)
> > +#define MTK_NOR_CMD_PROGRAMBIT(2)
> > +#define MTK_NOR_CMD_RDSR   BIT(1)
> > +#define MTK_NOR_CMD_READ   BIT(0)
> > +#define MTK_NOR_CMD_MASK   GENMASK(5, 0)
> > +
> > +#define MTK_NOR_REG_PRG_CNT0x04
> > +#define MTK_NOR_REG_RDSR   0x08
> > +#define MTK_NOR_REG_RDATA  0x0c
> > +
> > +#define MTK_NOR_REG_RADR0  0x10
> > +#define MTK_NOR_REG_RADR(n)(MTK_NOR_REG_RADR0 + 4 * (n))
> > +#define MTK_NOR_REG_RADR3  0xc8
> > +
> > +#define MTK_NOR_REG_WDATA  0x1c
> > +
> > +#define MTK_NOR_REG_PRGDATA0   0x20
> > +#define MTK_NOR_REG_PRGDATA(n) (MTK_NOR_REG_PRGDATA0 + 4 * (n))
> > +#define MTK_NOR_REG_PRGDATA_MAX5
> > +
> > +#define MTK_NOR_REG_SHIFT0 0x38
> > +#define MTK_NOR_REG_SHIFT(n)   (MTK_NOR_REG_SHIFT0 + 4 * (n))
> > +#define MTK_NOR_REG_SHIFT_MAX  9
> > +
> > +#define MTK_NOR_REG_CFG1   0x60
> > +#define MTK_NOR_FAST_READ  BIT(0)
> > +
> > +#define MTK_NOR_REG_CFG2   0x64
> > +#define MTK_NOR_WR_CUSTOM_OP_ENBIT(4)
> > +#define MTK_NOR_WR_BUF_EN  BIT(0)
> > +
> > +#define MTK_NOR_REG_PP_DATA0x98
> > +
> > +#define MTK_NOR_REG_IRQ_STAT   0xa8
> > +#define MTK_NOR_REG_IRQ_EN 0xac
> > +#define MTK_NOR_IRQ_DMABIT(7)
> > +#define MTK_NOR_IRQ_WRSR   BIT(5)
> > +#define MTK_NOR_IRQ_MASK   GENMASK(7, 0)
> > +
> > +#define MTK_NOR_REG_CFG3   0xb4
> > +#define MTK_NOR_DISABLE_WREN   BIT(7)
> > +#define MTK_NOR_DISABLE_SR_POLLBIT(5)
> > +
> > +#define MTK_NOR_REG_WP 0xc4
> > +#define MTK_NOR_ENABLE_SF_CMD  0x30
> > +
> > +#define MTK_NOR_REG_BUSCFG 0xcc
> > +#define MTK_NOR_4B_ADDRBIT(4)
> > +#define MTK_NOR_QUAD_ADDR  BIT(3)
> > +#define MTK_NOR_QUAD_READ  BIT(2)
> > +#define MTK_NOR_DUAL_ADDR  BIT(1)
> > +#define MTK_NOR_DUAL_READ  BIT(0)
> > +#define MTK_NOR_BUS_MODE_MASK 

Re: [PATCH 1/2] spi: mtk_snor: add support for MTK SPI NOR controller

2020-12-07 Thread Jagan Teki
On Fri, Nov 13, 2020 at 8:32 AM SkyLake Huang
 wrote:
>
> From: "SkyLake.Huang" 
>
> This patch adds support for MTK SPI NOR controller, which you
> can see on mt7622 & mt7629.
>
> This controller is designed only for SPI NOR. We can't adjust
> its bus clock dynamically. Set clock in dts instead.
>
> Signed-off-by: SkyLake.Huang 
> ---
>  drivers/spi/Kconfig|   7 +
>  drivers/spi/Makefile   |   1 +
>  drivers/spi/mtk_snor.c | 597 +
>  3 files changed, 605 insertions(+)
>  create mode 100644 drivers/spi/mtk_snor.c
>
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index fae2040af8..670af450c1 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -174,6 +174,13 @@ config MT7621_SPI
>   the SPI NOR flash on platforms embedding this Ralink / MediaTek
>   SPI core, like MT7621/7628/7688.
>
> +config MTK_SNOR
> +   bool "Mediatek SPI-NOR controller driver"
> +   depends on SPI_MEM
> +   help
> + Enable the Mediatek SPINOR controller driver. This driver has
> +  better read/write performance with NOR.
> +
>  config MTK_SNFI_SPI
> bool "Mediatek SPI memory controller driver"
> depends on SPI_MEM
> diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
> index ae4f2958f8..efe92f6b18 100644
> --- a/drivers/spi/Makefile
> +++ b/drivers/spi/Makefile
> @@ -38,6 +38,7 @@ obj-$(CONFIG_MESON_SPIFC) += meson_spifc.o
>  obj-$(CONFIG_MPC8XX_SPI) += mpc8xx_spi.o
>  obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
>  obj-$(CONFIG_MTK_SNFI_SPI) += mtk_snfi_spi.o
> +obj-$(CONFIG_MTK_SNOR) += mtk_snor.o
>  obj-$(CONFIG_MT7621_SPI) += mt7621_spi.o
>  obj-$(CONFIG_MSCC_BB_SPI) += mscc_bb_spi.o
>  obj-$(CONFIG_MVEBU_A3700_SPI) += mvebu_a3700_spi.o
> diff --git a/drivers/spi/mtk_snor.c b/drivers/spi/mtk_snor.c
> new file mode 100644
> index 00..0a92f1c5a8
> --- /dev/null
> +++ b/drivers/spi/mtk_snor.c
> @@ -0,0 +1,597 @@
> +// SPDX-License-Identifier: GPL-2.0
> +//
> +// Mediatek SPI-NOR controller driver
> +//
> +// Copyright (C) 2020 SkyLake Huang 
> +//
> +// Some parts are based on drivers/spi/spi-mtk-nor.c of linux version
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define DRIVER_NAME "mtk-spi-nor"
> +
> +#define MTK_NOR_REG_CMD0x00
> +#define MTK_NOR_CMD_WRSR   BIT(5)
> +#define MTK_NOR_CMD_WRITE  BIT(4)
> +#define MTK_NOR_CMD_PROGRAMBIT(2)
> +#define MTK_NOR_CMD_RDSR   BIT(1)
> +#define MTK_NOR_CMD_READ   BIT(0)
> +#define MTK_NOR_CMD_MASK   GENMASK(5, 0)
> +
> +#define MTK_NOR_REG_PRG_CNT0x04
> +#define MTK_NOR_REG_RDSR   0x08
> +#define MTK_NOR_REG_RDATA  0x0c
> +
> +#define MTK_NOR_REG_RADR0  0x10
> +#define MTK_NOR_REG_RADR(n)(MTK_NOR_REG_RADR0 + 4 * (n))
> +#define MTK_NOR_REG_RADR3  0xc8
> +
> +#define MTK_NOR_REG_WDATA  0x1c
> +
> +#define MTK_NOR_REG_PRGDATA0   0x20
> +#define MTK_NOR_REG_PRGDATA(n) (MTK_NOR_REG_PRGDATA0 + 4 * (n))
> +#define MTK_NOR_REG_PRGDATA_MAX5
> +
> +#define MTK_NOR_REG_SHIFT0 0x38
> +#define MTK_NOR_REG_SHIFT(n)   (MTK_NOR_REG_SHIFT0 + 4 * (n))
> +#define MTK_NOR_REG_SHIFT_MAX  9
> +
> +#define MTK_NOR_REG_CFG1   0x60
> +#define MTK_NOR_FAST_READ  BIT(0)
> +
> +#define MTK_NOR_REG_CFG2   0x64
> +#define MTK_NOR_WR_CUSTOM_OP_ENBIT(4)
> +#define MTK_NOR_WR_BUF_EN  BIT(0)
> +
> +#define MTK_NOR_REG_PP_DATA0x98
> +
> +#define MTK_NOR_REG_IRQ_STAT   0xa8
> +#define MTK_NOR_REG_IRQ_EN 0xac
> +#define MTK_NOR_IRQ_DMABIT(7)
> +#define MTK_NOR_IRQ_WRSR   BIT(5)
> +#define MTK_NOR_IRQ_MASK   GENMASK(7, 0)
> +
> +#define MTK_NOR_REG_CFG3   0xb4
> +#define MTK_NOR_DISABLE_WREN   BIT(7)
> +#define MTK_NOR_DISABLE_SR_POLLBIT(5)
> +
> +#define MTK_NOR_REG_WP 0xc4
> +#define MTK_NOR_ENABLE_SF_CMD  0x30
> +
> +#define MTK_NOR_REG_BUSCFG 0xcc
> +#define MTK_NOR_4B_ADDRBIT(4)
> +#define MTK_NOR_QUAD_ADDR  BIT(3)
> +#define MTK_NOR_QUAD_READ  BIT(2)
> +#define MTK_NOR_DUAL_ADDR  BIT(1)
> +#define MTK_NOR_DUAL_READ  BIT(0)
> +#define MTK_NOR_BUS_MODE_MASK  GENMASK(4, 0)
> +
> +#define MTK_NOR_REG_DMA_CTL0x718
> +#define MTK_NOR_DMA_START  BIT(0)
> +
> +#define MTK_NOR_REG_DMA_FADR   0x71c
> +#define MTK_NOR_REG_DMA_DADR   0x720
> +#define MTK_NOR_REG_DMA_END_DADR   0x724
> +
> +#define MTK_NOR_PRG_MAX_SIZE   6
> +// 

[PATCH 1/2] spi: mtk_snor: add support for MTK SPI NOR controller

2020-11-12 Thread SkyLake Huang
From: "SkyLake.Huang" 

This patch adds support for MTK SPI NOR controller, which you
can see on mt7622 & mt7629.

This controller is designed only for SPI NOR. We can't adjust
its bus clock dynamically. Set clock in dts instead.

Signed-off-by: SkyLake.Huang 
---
 drivers/spi/Kconfig|   7 +
 drivers/spi/Makefile   |   1 +
 drivers/spi/mtk_snor.c | 597 +
 3 files changed, 605 insertions(+)
 create mode 100644 drivers/spi/mtk_snor.c

diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index fae2040af8..670af450c1 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -174,6 +174,13 @@ config MT7621_SPI
  the SPI NOR flash on platforms embedding this Ralink / MediaTek
  SPI core, like MT7621/7628/7688.
 
+config MTK_SNOR
+   bool "Mediatek SPI-NOR controller driver"
+   depends on SPI_MEM
+   help
+ Enable the Mediatek SPINOR controller driver. This driver has
+  better read/write performance with NOR.
+
 config MTK_SNFI_SPI
bool "Mediatek SPI memory controller driver"
depends on SPI_MEM
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index ae4f2958f8..efe92f6b18 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -38,6 +38,7 @@ obj-$(CONFIG_MESON_SPIFC) += meson_spifc.o
 obj-$(CONFIG_MPC8XX_SPI) += mpc8xx_spi.o
 obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
 obj-$(CONFIG_MTK_SNFI_SPI) += mtk_snfi_spi.o
+obj-$(CONFIG_MTK_SNOR) += mtk_snor.o
 obj-$(CONFIG_MT7621_SPI) += mt7621_spi.o
 obj-$(CONFIG_MSCC_BB_SPI) += mscc_bb_spi.o
 obj-$(CONFIG_MVEBU_A3700_SPI) += mvebu_a3700_spi.o
diff --git a/drivers/spi/mtk_snor.c b/drivers/spi/mtk_snor.c
new file mode 100644
index 00..0a92f1c5a8
--- /dev/null
+++ b/drivers/spi/mtk_snor.c
@@ -0,0 +1,597 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Mediatek SPI-NOR controller driver
+//
+// Copyright (C) 2020 SkyLake Huang 
+//
+// Some parts are based on drivers/spi/spi-mtk-nor.c of linux version
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DRIVER_NAME "mtk-spi-nor"
+
+#define MTK_NOR_REG_CMD0x00
+#define MTK_NOR_CMD_WRSR   BIT(5)
+#define MTK_NOR_CMD_WRITE  BIT(4)
+#define MTK_NOR_CMD_PROGRAMBIT(2)
+#define MTK_NOR_CMD_RDSR   BIT(1)
+#define MTK_NOR_CMD_READ   BIT(0)
+#define MTK_NOR_CMD_MASK   GENMASK(5, 0)
+
+#define MTK_NOR_REG_PRG_CNT0x04
+#define MTK_NOR_REG_RDSR   0x08
+#define MTK_NOR_REG_RDATA  0x0c
+
+#define MTK_NOR_REG_RADR0  0x10
+#define MTK_NOR_REG_RADR(n)(MTK_NOR_REG_RADR0 + 4 * (n))
+#define MTK_NOR_REG_RADR3  0xc8
+
+#define MTK_NOR_REG_WDATA  0x1c
+
+#define MTK_NOR_REG_PRGDATA0   0x20
+#define MTK_NOR_REG_PRGDATA(n) (MTK_NOR_REG_PRGDATA0 + 4 * (n))
+#define MTK_NOR_REG_PRGDATA_MAX5
+
+#define MTK_NOR_REG_SHIFT0 0x38
+#define MTK_NOR_REG_SHIFT(n)   (MTK_NOR_REG_SHIFT0 + 4 * (n))
+#define MTK_NOR_REG_SHIFT_MAX  9
+
+#define MTK_NOR_REG_CFG1   0x60
+#define MTK_NOR_FAST_READ  BIT(0)
+
+#define MTK_NOR_REG_CFG2   0x64
+#define MTK_NOR_WR_CUSTOM_OP_ENBIT(4)
+#define MTK_NOR_WR_BUF_EN  BIT(0)
+
+#define MTK_NOR_REG_PP_DATA0x98
+
+#define MTK_NOR_REG_IRQ_STAT   0xa8
+#define MTK_NOR_REG_IRQ_EN 0xac
+#define MTK_NOR_IRQ_DMABIT(7)
+#define MTK_NOR_IRQ_WRSR   BIT(5)
+#define MTK_NOR_IRQ_MASK   GENMASK(7, 0)
+
+#define MTK_NOR_REG_CFG3   0xb4
+#define MTK_NOR_DISABLE_WREN   BIT(7)
+#define MTK_NOR_DISABLE_SR_POLLBIT(5)
+
+#define MTK_NOR_REG_WP 0xc4
+#define MTK_NOR_ENABLE_SF_CMD  0x30
+
+#define MTK_NOR_REG_BUSCFG 0xcc
+#define MTK_NOR_4B_ADDRBIT(4)
+#define MTK_NOR_QUAD_ADDR  BIT(3)
+#define MTK_NOR_QUAD_READ  BIT(2)
+#define MTK_NOR_DUAL_ADDR  BIT(1)
+#define MTK_NOR_DUAL_READ  BIT(0)
+#define MTK_NOR_BUS_MODE_MASK  GENMASK(4, 0)
+
+#define MTK_NOR_REG_DMA_CTL0x718
+#define MTK_NOR_DMA_START  BIT(0)
+
+#define MTK_NOR_REG_DMA_FADR   0x71c
+#define MTK_NOR_REG_DMA_DADR   0x720
+#define MTK_NOR_REG_DMA_END_DADR   0x724
+
+#define MTK_NOR_PRG_MAX_SIZE   6
+// Reading DMA src/dst addresses have to be 16-byte aligned
+#define MTK_NOR_DMA_ALIGN  16
+#define MTK_NOR_DMA_ALIGN_MASK (MTK_NOR_DMA_ALIGN - 1)
+// and we allocate a bounce buffer if destination address isn't aligned.
+#define MTK_NOR_BOUNCE_BUF_SIZEPAGE_SIZE
+
+// Buffered page program can do one 128-byte