All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Walle <michael@walle.cc>
To: Tudor Ambarus <tudor.ambarus@microchip.com>
Cc: p.yadav@ti.com, miquel.raynal@bootlin.com, richard@nod.at,
	vigneshr@ti.com, linux-mtd@lists.infradead.org,
	linux-kernel@vger.kernel.org, nicolas.ferre@microchip.com
Subject: Re: [PATCH v3 9/9] mtd: spi-nor: Introduce templates for SPI NOR operations
Date: Tue, 19 Apr 2022 13:45:31 +0200	[thread overview]
Message-ID: <d912d9834a219162ef46efad7d332ef3@walle.cc> (raw)
In-Reply-To: <20220411091033.98754-10-tudor.ambarus@microchip.com>

Am 2022-04-11 11:10, schrieb Tudor Ambarus:
> Clean the op declaration and hide the details of each op. With this it
> results a cleanner, easier to read code. No functional change expected.
> 
> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>

I haven't gone through all of it.

Acked-by: Michael Walle <michael@walle.cc>

> ---
> v3: new patch taken from, no changes
> https://lore.kernel.org/lkml/20220304093011.198173-1-tudor.ambarus@microchip.com/
> 
>  drivers/mtd/spi-nor/core.c      | 101 ++++++-------------------------
>  drivers/mtd/spi-nor/core.h      | 102 ++++++++++++++++++++++++++++++++
>  drivers/mtd/spi-nor/micron-st.c |  24 ++++----
>  drivers/mtd/spi-nor/spansion.c  |  26 +++++---
>  drivers/mtd/spi-nor/xilinx.c    |  12 ++--
>  5 files changed, 158 insertions(+), 107 deletions(-)
> 
> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
> index 42794328d3b6..fe853532204c 100644
> --- a/drivers/mtd/spi-nor/core.c
> +++ b/drivers/mtd/spi-nor/core.c
> @@ -359,11 +359,7 @@ int spi_nor_write_enable(struct spi_nor *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_WREN_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -390,11 +386,7 @@ int spi_nor_write_disable(struct spi_nor *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_WRDI_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -454,11 +446,7 @@ int spi_nor_read_sr(struct spi_nor *nor, u8 *sr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr, 0));
> +		struct spi_mem_op op = SPI_NOR_RDSR_OP(sr);
> 
>  		if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
>  			op.addr.nbytes = nor->params->rdsr_addr_nbytes;
> @@ -498,11 +486,7 @@ int spi_nor_read_cr(struct spi_nor *nor, u8 *cr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, cr, 0));
> +		struct spi_mem_op op = SPI_NOR_RDCR_OP(cr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -531,14 +515,7 @@ int spi_nor_set_4byte_addr_mode(struct spi_nor
> *nor, bool enable)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(enable ?
> -						  SPINOR_OP_EN4B :
> -						  SPINOR_OP_EX4B,
> -						  0),
> -				  SPI_MEM_OP_NO_ADDR,
> -				  SPI_MEM_OP_NO_DUMMY,
> -				  SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_EN4B_EX4B_OP(enable);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -572,11 +549,7 @@ static int spansion_set_4byte_addr_mode(struct
> spi_nor *nor, bool enable)
>  	nor->bouncebuf[0] = enable << 7;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
> +		struct spi_mem_op op = SPI_NOR_BRWR_OP(nor->bouncebuf);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -606,11 +579,7 @@ int spi_nor_write_ear(struct spi_nor *nor, u8 ear)
>  	nor->bouncebuf[0] = ear;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
> +		struct spi_mem_op op = SPI_NOR_WREAR_OP(nor->bouncebuf);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -721,11 +690,7 @@ int spi_nor_global_block_unlock(struct spi_nor 
> *nor)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_GBULK_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -760,11 +725,7 @@ int spi_nor_write_sr(struct spi_nor *nor, const
> u8 *sr, size_t len)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(len, sr, 0));
> +		struct spi_mem_op op = SPI_NOR_WRSR_OP(sr, len);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -964,11 +925,7 @@ static int spi_nor_write_sr2(struct spi_nor *nor,
> const u8 *sr2)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, sr2, 0));
> +		struct spi_mem_op op = SPI_NOR_WRSR2_OP(sr2);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -1000,11 +957,7 @@ static int spi_nor_read_sr2(struct spi_nor *nor, 
> u8 *sr2)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr2, 0));
> +		struct spi_mem_op op = SPI_NOR_RDSR2_OP(sr2);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -1033,11 +986,7 @@ static int spi_nor_erase_chip(struct spi_nor 
> *nor)
>  	dev_dbg(nor->dev, " %lldKiB\n", (long long)(nor->mtd.size >> 10));
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_CHIP_ERASE_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
> 
> @@ -1179,10 +1128,8 @@ int spi_nor_erase_sector(struct spi_nor *nor, 
> u32 addr)
> 
>  	if (nor->spimem) {
>  		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 0),
> -				   SPI_MEM_OP_ADDR(nor->addr_width, addr, 0),
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +			SPI_NOR_SECTOR_ERASE_OP(nor->erase_opcode,
> +						nor->addr_width, addr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
> 
> @@ -1978,10 +1925,7 @@ static int spi_nor_spimem_check_op(struct 
> spi_nor *nor,
>  static int spi_nor_spimem_check_readop(struct spi_nor *nor,
>  				       const struct spi_nor_read_command *read)
>  {
> -	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(read->opcode, 0),
> -					  SPI_MEM_OP_ADDR(3, 0, 0),
> -					  SPI_MEM_OP_DUMMY(1, 0),
> -					  SPI_MEM_OP_DATA_IN(2, NULL, 0));
> +	struct spi_mem_op op = SPI_NOR_READ_OP(read->opcode);
> 
>  	spi_nor_spimem_setup_op(nor, &op, read->proto);
> 
> @@ -2004,10 +1948,7 @@ static int spi_nor_spimem_check_readop(struct
> spi_nor *nor,
>  static int spi_nor_spimem_check_pp(struct spi_nor *nor,
>  				   const struct spi_nor_pp_command *pp)
>  {
> -	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(pp->opcode, 0),
> -					  SPI_MEM_OP_ADDR(3, 0, 0),
> -					  SPI_MEM_OP_NO_DUMMY,
> -					  SPI_MEM_OP_DATA_OUT(2, NULL, 0));
> +	struct spi_mem_op op = SPI_NOR_PP_OP(pp->opcode);
> 
>  	spi_nor_spimem_setup_op(nor, &op, pp->proto);
> 
> @@ -2831,10 +2772,7 @@ static void spi_nor_soft_reset(struct spi_nor 
> *nor)
>  	struct spi_mem_op op;
>  	int ret;
> 
> -	op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 
> 0),
> -			SPI_MEM_OP_NO_DUMMY,
> -			SPI_MEM_OP_NO_ADDR,
> -			SPI_MEM_OP_NO_DATA);
> +	op = (struct spi_mem_op)SPINOR_SRSTEN_OP;
> 
>  	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -2844,10 +2782,7 @@ static void spi_nor_soft_reset(struct spi_nor 
> *nor)
>  		return;
>  	}
> 
> -	op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),
> -			SPI_MEM_OP_NO_DUMMY,
> -			SPI_MEM_OP_NO_ADDR,
> -			SPI_MEM_OP_NO_DATA);
> +	op = (struct spi_mem_op)SPINOR_SRST_OP;
> 
>  	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
> index 7c704475946d..8b7e597fd38c 100644
> --- a/drivers/mtd/spi-nor/core.h
> +++ b/drivers/mtd/spi-nor/core.h
> @@ -18,6 +18,108 @@
>  		   SPI_MEM_OP_DUMMY(ndummy, 0),				\
>  		   SPI_MEM_OP_DATA_IN(len, buf, 0))
> 
> +#define SPI_NOR_WREN_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_WRDI_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_RDSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPI_NOR_WRSR_OP(buf, len)					\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(len, buf, 0))
> +
> +#define SPI_NOR_RDSR2_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_WRSR2_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_RDCR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPI_NOR_EN4B_EX4B_OP(enable)					\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B, 
> 0),	\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_BRWR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_WREAR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_GBULK_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_CHIP_ERASE_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0),		\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_SECTOR_ERASE_OP(opcode, addr_width, addr)		\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(addr_width, addr, 0),		\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_READ_OP(opcode)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(3, 0, 0),				\
> +		   SPI_MEM_OP_DUMMY(1, 0),				\
> +		   SPI_MEM_OP_DATA_IN(2, NULL, 0))
> +
> +#define SPI_NOR_PP_OP(opcode)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(3, 0, 0),				\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(2, NULL, 0))
> +
> +#define SPINOR_SRSTEN_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPINOR_SRST_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  enum spi_nor_option_flags {
>  	SNOR_F_HAS_SR_TB	= BIT(0),
>  	SNOR_F_NO_OP_CHIP_ERASE	= BIT(1),
> diff --git a/drivers/mtd/spi-nor/micron-st.c 
> b/drivers/mtd/spi-nor/micron-st.c
> index a447762c0d78..26b9a1c2309d 100644
> --- a/drivers/mtd/spi-nor/micron-st.c
> +++ b/drivers/mtd/spi-nor/micron-st.c
> @@ -35,6 +35,18 @@
>  		   SPI_MEM_OP_NO_DUMMY,					\
>  		   SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
> 
> +#define MICRON_ST_RDFSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define MICRON_ST_CLFSR_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
>  {
>  	struct spi_mem_op op;
> @@ -324,11 +336,7 @@ static int micron_st_nor_read_fsr(struct spi_nor
> *nor, u8 *fsr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, fsr, 0));
> +		struct spi_mem_op op = MICRON_ST_RDFSR_OP(fsr);
> 
>  		if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
>  			op.addr.nbytes = nor->params->rdsr_addr_nbytes;
> @@ -363,11 +371,7 @@ static void micron_st_nor_clear_fsr(struct spi_nor 
> *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = MICRON_ST_CLFSR_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/spansion.c 
> b/drivers/mtd/spi-nor/spansion.c
> index 35d8edb515a3..952db7af6932 100644
> --- a/drivers/mtd/spi-nor/spansion.c
> +++ b/drivers/mtd/spi-nor/spansion.c
> @@ -30,6 +30,18 @@
>  		   SPI_MEM_OP_NO_DUMMY,					\
>  		   SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
> 
> +#define CYPRESS_NOR_RD_ANY_REG_OP(naddr, addr, buf)			\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0),		\
> +		   SPI_MEM_OP_ADDR(naddr, addr, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPANSION_CLSR_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
>  {
>  	struct spi_mem_op op;
> @@ -165,12 +177,12 @@ static int s28hs512t_post_bfpt_fixup(struct 
> spi_nor *nor,
>  	 * CFR3V[4] and set the correct size.
>  	 */
>  	struct spi_mem_op op =
> -		SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 1),
> -			   SPI_MEM_OP_ADDR(3, SPINOR_REG_CYPRESS_CFR3V, 1),
> -			   SPI_MEM_OP_NO_DUMMY,
> -			   SPI_MEM_OP_DATA_IN(1, nor->bouncebuf, 1));
> +		CYPRESS_NOR_RD_ANY_REG_OP(3, SPINOR_REG_CYPRESS_CFR3V,
> +					  nor->bouncebuf);
>  	int ret;
> 
> +	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> +
>  	ret = spi_mem_exec_op(nor->spimem, &op);
>  	if (ret)
>  		return ret;
> @@ -320,11 +332,7 @@ static void spansion_nor_clear_sr(struct spi_nor 
> *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPANSION_CLSR_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/xilinx.c 
> b/drivers/mtd/spi-nor/xilinx.c
> index 9459ac2609dc..1d2f5db047bd 100644
> --- a/drivers/mtd/spi-nor/xilinx.c
> +++ b/drivers/mtd/spi-nor/xilinx.c
> @@ -15,6 +15,12 @@
>  #define XSR_PAGESIZE		BIT(0)	/* Page size in Po2 or Linear */
>  #define XSR_RDY			BIT(7)	/* Ready */
> 
> +#define XILINX_RDSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(XILINX_OP_RDSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
>  #define S3AN_INFO(_jedec_id, _n_sectors, _page_size)			\
>  		.id = {							\
>  			((_jedec_id) >> 16) & 0xff,			\
> @@ -72,11 +78,7 @@ static int xilinx_nor_read_sr(struct spi_nor *nor, 
> u8 *sr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(XILINX_OP_RDSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr, 0));
> +		struct spi_mem_op op = XILINX_RDSR_OP(sr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);

-- 
-michael

WARNING: multiple messages have this Message-ID (diff)
From: Michael Walle <michael@walle.cc>
To: Tudor Ambarus <tudor.ambarus@microchip.com>
Cc: p.yadav@ti.com, miquel.raynal@bootlin.com, richard@nod.at,
	vigneshr@ti.com, linux-mtd@lists.infradead.org,
	linux-kernel@vger.kernel.org, nicolas.ferre@microchip.com
Subject: Re: [PATCH v3 9/9] mtd: spi-nor: Introduce templates for SPI NOR operations
Date: Tue, 19 Apr 2022 13:45:31 +0200	[thread overview]
Message-ID: <d912d9834a219162ef46efad7d332ef3@walle.cc> (raw)
In-Reply-To: <20220411091033.98754-10-tudor.ambarus@microchip.com>

Am 2022-04-11 11:10, schrieb Tudor Ambarus:
> Clean the op declaration and hide the details of each op. With this it
> results a cleanner, easier to read code. No functional change expected.
> 
> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>

I haven't gone through all of it.

Acked-by: Michael Walle <michael@walle.cc>

> ---
> v3: new patch taken from, no changes
> https://lore.kernel.org/lkml/20220304093011.198173-1-tudor.ambarus@microchip.com/
> 
>  drivers/mtd/spi-nor/core.c      | 101 ++++++-------------------------
>  drivers/mtd/spi-nor/core.h      | 102 ++++++++++++++++++++++++++++++++
>  drivers/mtd/spi-nor/micron-st.c |  24 ++++----
>  drivers/mtd/spi-nor/spansion.c  |  26 +++++---
>  drivers/mtd/spi-nor/xilinx.c    |  12 ++--
>  5 files changed, 158 insertions(+), 107 deletions(-)
> 
> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
> index 42794328d3b6..fe853532204c 100644
> --- a/drivers/mtd/spi-nor/core.c
> +++ b/drivers/mtd/spi-nor/core.c
> @@ -359,11 +359,7 @@ int spi_nor_write_enable(struct spi_nor *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_WREN_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -390,11 +386,7 @@ int spi_nor_write_disable(struct spi_nor *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_WRDI_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -454,11 +446,7 @@ int spi_nor_read_sr(struct spi_nor *nor, u8 *sr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr, 0));
> +		struct spi_mem_op op = SPI_NOR_RDSR_OP(sr);
> 
>  		if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
>  			op.addr.nbytes = nor->params->rdsr_addr_nbytes;
> @@ -498,11 +486,7 @@ int spi_nor_read_cr(struct spi_nor *nor, u8 *cr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, cr, 0));
> +		struct spi_mem_op op = SPI_NOR_RDCR_OP(cr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -531,14 +515,7 @@ int spi_nor_set_4byte_addr_mode(struct spi_nor
> *nor, bool enable)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(enable ?
> -						  SPINOR_OP_EN4B :
> -						  SPINOR_OP_EX4B,
> -						  0),
> -				  SPI_MEM_OP_NO_ADDR,
> -				  SPI_MEM_OP_NO_DUMMY,
> -				  SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_EN4B_EX4B_OP(enable);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -572,11 +549,7 @@ static int spansion_set_4byte_addr_mode(struct
> spi_nor *nor, bool enable)
>  	nor->bouncebuf[0] = enable << 7;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
> +		struct spi_mem_op op = SPI_NOR_BRWR_OP(nor->bouncebuf);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -606,11 +579,7 @@ int spi_nor_write_ear(struct spi_nor *nor, u8 ear)
>  	nor->bouncebuf[0] = ear;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
> +		struct spi_mem_op op = SPI_NOR_WREAR_OP(nor->bouncebuf);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -721,11 +690,7 @@ int spi_nor_global_block_unlock(struct spi_nor 
> *nor)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_GBULK_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -760,11 +725,7 @@ int spi_nor_write_sr(struct spi_nor *nor, const
> u8 *sr, size_t len)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(len, sr, 0));
> +		struct spi_mem_op op = SPI_NOR_WRSR_OP(sr, len);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -964,11 +925,7 @@ static int spi_nor_write_sr2(struct spi_nor *nor,
> const u8 *sr2)
>  		return ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_OUT(1, sr2, 0));
> +		struct spi_mem_op op = SPI_NOR_WRSR2_OP(sr2);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -1000,11 +957,7 @@ static int spi_nor_read_sr2(struct spi_nor *nor, 
> u8 *sr2)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr2, 0));
> +		struct spi_mem_op op = SPI_NOR_RDSR2_OP(sr2);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -1033,11 +986,7 @@ static int spi_nor_erase_chip(struct spi_nor 
> *nor)
>  	dev_dbg(nor->dev, " %lldKiB\n", (long long)(nor->mtd.size >> 10));
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPI_NOR_CHIP_ERASE_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
> 
> @@ -1179,10 +1128,8 @@ int spi_nor_erase_sector(struct spi_nor *nor, 
> u32 addr)
> 
>  	if (nor->spimem) {
>  		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 0),
> -				   SPI_MEM_OP_ADDR(nor->addr_width, addr, 0),
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +			SPI_NOR_SECTOR_ERASE_OP(nor->erase_opcode,
> +						nor->addr_width, addr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
> 
> @@ -1978,10 +1925,7 @@ static int spi_nor_spimem_check_op(struct 
> spi_nor *nor,
>  static int spi_nor_spimem_check_readop(struct spi_nor *nor,
>  				       const struct spi_nor_read_command *read)
>  {
> -	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(read->opcode, 0),
> -					  SPI_MEM_OP_ADDR(3, 0, 0),
> -					  SPI_MEM_OP_DUMMY(1, 0),
> -					  SPI_MEM_OP_DATA_IN(2, NULL, 0));
> +	struct spi_mem_op op = SPI_NOR_READ_OP(read->opcode);
> 
>  	spi_nor_spimem_setup_op(nor, &op, read->proto);
> 
> @@ -2004,10 +1948,7 @@ static int spi_nor_spimem_check_readop(struct
> spi_nor *nor,
>  static int spi_nor_spimem_check_pp(struct spi_nor *nor,
>  				   const struct spi_nor_pp_command *pp)
>  {
> -	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(pp->opcode, 0),
> -					  SPI_MEM_OP_ADDR(3, 0, 0),
> -					  SPI_MEM_OP_NO_DUMMY,
> -					  SPI_MEM_OP_DATA_OUT(2, NULL, 0));
> +	struct spi_mem_op op = SPI_NOR_PP_OP(pp->opcode);
> 
>  	spi_nor_spimem_setup_op(nor, &op, pp->proto);
> 
> @@ -2831,10 +2772,7 @@ static void spi_nor_soft_reset(struct spi_nor 
> *nor)
>  	struct spi_mem_op op;
>  	int ret;
> 
> -	op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 
> 0),
> -			SPI_MEM_OP_NO_DUMMY,
> -			SPI_MEM_OP_NO_ADDR,
> -			SPI_MEM_OP_NO_DATA);
> +	op = (struct spi_mem_op)SPINOR_SRSTEN_OP;
> 
>  	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> @@ -2844,10 +2782,7 @@ static void spi_nor_soft_reset(struct spi_nor 
> *nor)
>  		return;
>  	}
> 
> -	op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),
> -			SPI_MEM_OP_NO_DUMMY,
> -			SPI_MEM_OP_NO_ADDR,
> -			SPI_MEM_OP_NO_DATA);
> +	op = (struct spi_mem_op)SPINOR_SRST_OP;
> 
>  	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
> index 7c704475946d..8b7e597fd38c 100644
> --- a/drivers/mtd/spi-nor/core.h
> +++ b/drivers/mtd/spi-nor/core.h
> @@ -18,6 +18,108 @@
>  		   SPI_MEM_OP_DUMMY(ndummy, 0),				\
>  		   SPI_MEM_OP_DATA_IN(len, buf, 0))
> 
> +#define SPI_NOR_WREN_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_WRDI_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_RDSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPI_NOR_WRSR_OP(buf, len)					\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(len, buf, 0))
> +
> +#define SPI_NOR_RDSR2_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_WRSR2_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_RDCR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPI_NOR_EN4B_EX4B_OP(enable)					\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B, 
> 0),	\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_BRWR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_WREAR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(1, buf, 0))
> +
> +#define SPI_NOR_GBULK_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_CHIP_ERASE_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0),		\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_SECTOR_ERASE_OP(opcode, addr_width, addr)		\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(addr_width, addr, 0),		\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPI_NOR_READ_OP(opcode)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(3, 0, 0),				\
> +		   SPI_MEM_OP_DUMMY(1, 0),				\
> +		   SPI_MEM_OP_DATA_IN(2, NULL, 0))
> +
> +#define SPI_NOR_PP_OP(opcode)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0),				\
> +		   SPI_MEM_OP_ADDR(3, 0, 0),				\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_OUT(2, NULL, 0))
> +
> +#define SPINOR_SRSTEN_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
> +#define SPINOR_SRST_OP							\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  enum spi_nor_option_flags {
>  	SNOR_F_HAS_SR_TB	= BIT(0),
>  	SNOR_F_NO_OP_CHIP_ERASE	= BIT(1),
> diff --git a/drivers/mtd/spi-nor/micron-st.c 
> b/drivers/mtd/spi-nor/micron-st.c
> index a447762c0d78..26b9a1c2309d 100644
> --- a/drivers/mtd/spi-nor/micron-st.c
> +++ b/drivers/mtd/spi-nor/micron-st.c
> @@ -35,6 +35,18 @@
>  		   SPI_MEM_OP_NO_DUMMY,					\
>  		   SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
> 
> +#define MICRON_ST_RDFSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define MICRON_ST_CLFSR_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
>  {
>  	struct spi_mem_op op;
> @@ -324,11 +336,7 @@ static int micron_st_nor_read_fsr(struct spi_nor
> *nor, u8 *fsr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, fsr, 0));
> +		struct spi_mem_op op = MICRON_ST_RDFSR_OP(fsr);
> 
>  		if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
>  			op.addr.nbytes = nor->params->rdsr_addr_nbytes;
> @@ -363,11 +371,7 @@ static void micron_st_nor_clear_fsr(struct spi_nor 
> *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = MICRON_ST_CLFSR_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/spansion.c 
> b/drivers/mtd/spi-nor/spansion.c
> index 35d8edb515a3..952db7af6932 100644
> --- a/drivers/mtd/spi-nor/spansion.c
> +++ b/drivers/mtd/spi-nor/spansion.c
> @@ -30,6 +30,18 @@
>  		   SPI_MEM_OP_NO_DUMMY,					\
>  		   SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
> 
> +#define CYPRESS_NOR_RD_ANY_REG_OP(naddr, addr, buf)			\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0),		\
> +		   SPI_MEM_OP_ADDR(naddr, addr, 0),			\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
> +#define SPANSION_CLSR_OP						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_NO_DATA)
> +
>  static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
>  {
>  	struct spi_mem_op op;
> @@ -165,12 +177,12 @@ static int s28hs512t_post_bfpt_fixup(struct 
> spi_nor *nor,
>  	 * CFR3V[4] and set the correct size.
>  	 */
>  	struct spi_mem_op op =
> -		SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 1),
> -			   SPI_MEM_OP_ADDR(3, SPINOR_REG_CYPRESS_CFR3V, 1),
> -			   SPI_MEM_OP_NO_DUMMY,
> -			   SPI_MEM_OP_DATA_IN(1, nor->bouncebuf, 1));
> +		CYPRESS_NOR_RD_ANY_REG_OP(3, SPINOR_REG_CYPRESS_CFR3V,
> +					  nor->bouncebuf);
>  	int ret;
> 
> +	spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> +
>  	ret = spi_mem_exec_op(nor->spimem, &op);
>  	if (ret)
>  		return ret;
> @@ -320,11 +332,7 @@ static void spansion_nor_clear_sr(struct spi_nor 
> *nor)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_NO_DATA);
> +		struct spi_mem_op op = SPANSION_CLSR_OP;
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> 
> diff --git a/drivers/mtd/spi-nor/xilinx.c 
> b/drivers/mtd/spi-nor/xilinx.c
> index 9459ac2609dc..1d2f5db047bd 100644
> --- a/drivers/mtd/spi-nor/xilinx.c
> +++ b/drivers/mtd/spi-nor/xilinx.c
> @@ -15,6 +15,12 @@
>  #define XSR_PAGESIZE		BIT(0)	/* Page size in Po2 or Linear */
>  #define XSR_RDY			BIT(7)	/* Ready */
> 
> +#define XILINX_RDSR_OP(buf)						\
> +	SPI_MEM_OP(SPI_MEM_OP_CMD(XILINX_OP_RDSR, 0),			\
> +		   SPI_MEM_OP_NO_ADDR,					\
> +		   SPI_MEM_OP_NO_DUMMY,					\
> +		   SPI_MEM_OP_DATA_IN(1, buf, 0))
> +
>  #define S3AN_INFO(_jedec_id, _n_sectors, _page_size)			\
>  		.id = {							\
>  			((_jedec_id) >> 16) & 0xff,			\
> @@ -72,11 +78,7 @@ static int xilinx_nor_read_sr(struct spi_nor *nor, 
> u8 *sr)
>  	int ret;
> 
>  	if (nor->spimem) {
> -		struct spi_mem_op op =
> -			SPI_MEM_OP(SPI_MEM_OP_CMD(XILINX_OP_RDSR, 0),
> -				   SPI_MEM_OP_NO_ADDR,
> -				   SPI_MEM_OP_NO_DUMMY,
> -				   SPI_MEM_OP_DATA_IN(1, sr, 0));
> +		struct spi_mem_op op = XILINX_RDSR_OP(sr);
> 
>  		spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);

-- 
-michael

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2022-04-19 11:45 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-11  9:10 [PATCH v3 0/9] mtd: spi-nor: Rework Octal DTR methods Tudor Ambarus
2022-04-11  9:10 ` Tudor Ambarus
2022-04-11  9:10 ` [PATCH v3 1/9] mtd: spi-nor: Rename method, s/spi_nor_match_id/spi_nor_match_name Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-11  9:10 ` [PATCH v3 2/9] mtd: spi-nor: Introduce spi_nor_match_id() Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-11  9:10 ` [PATCH v3 3/9] mtd: spi-nor: core: Use auto-detection only once Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 10:18   ` Michael Walle
2022-04-19 10:18     ` Michael Walle
2022-04-11  9:10 ` [PATCH v3 4/9] mtd: spi-nor: core: Introduce method for RDID op Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:10   ` Michael Walle
2022-04-19 11:10     ` Michael Walle
2022-04-11  9:10 ` [PATCH v3 5/9] mtd: spi-nor: manufacturers: Use spi_nor_read_id() core method Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:14   ` Michael Walle
2022-04-19 11:14     ` Michael Walle
2022-04-11  9:10 ` [PATCH v3 6/9] mtd: spi-nor: core: Add helpers to read/write any register Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:19   ` Michael Walle
2022-04-19 11:19     ` Michael Walle
2022-04-19 11:46     ` Michael Walle
2022-04-19 11:46       ` Michael Walle
2022-04-19 12:08       ` Tudor.Ambarus
2022-04-19 12:08         ` Tudor.Ambarus
2022-04-19 12:32         ` Pratyush Yadav
2022-04-19 12:32           ` Pratyush Yadav
2022-04-19 12:46           ` Michael Walle
2022-04-19 12:46             ` Michael Walle
2022-04-19 12:56             ` Tudor.Ambarus
2022-04-19 12:56               ` Tudor.Ambarus
2022-04-20  4:34               ` Pratyush Yadav
2022-04-20  4:34                 ` Pratyush Yadav
2022-04-20  5:20                 ` Takahiro Kuwano
2022-04-20  5:20                   ` Takahiro Kuwano
2022-04-20  5:25                 ` Tudor.Ambarus
2022-04-20  5:25                   ` Tudor.Ambarus
2022-04-19 13:02           ` Tudor.Ambarus
2022-04-19 13:02             ` Tudor.Ambarus
2022-04-19 12:59     ` Tudor.Ambarus
2022-04-19 12:59       ` Tudor.Ambarus
2022-04-11  9:10 ` [PATCH v3 7/9] mtd: spi-nor: micron-st: Rework spi_nor_micron_octal_dtr_enable() Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:43   ` Michael Walle
2022-04-19 11:43     ` Michael Walle
2022-04-11  9:10 ` [PATCH v3 8/9] mtd: spi-nor: spansion: Rework spi_nor_cypress_octal_dtr_enable() Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:44   ` Michael Walle
2022-04-19 11:44     ` Michael Walle
2022-04-11  9:10 ` [PATCH v3 9/9] mtd: spi-nor: Introduce templates for SPI NOR operations Tudor Ambarus
2022-04-11  9:10   ` Tudor Ambarus
2022-04-19 11:45   ` Michael Walle [this message]
2022-04-19 11:45     ` Michael Walle
2022-04-20  7:49     ` Pratyush Yadav
2022-04-20  7:49       ` Pratyush Yadav

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d912d9834a219162ef46efad7d332ef3@walle.cc \
    --to=michael@walle.cc \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=nicolas.ferre@microchip.com \
    --cc=p.yadav@ti.com \
    --cc=richard@nod.at \
    --cc=tudor.ambarus@microchip.com \
    --cc=vigneshr@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.