Skip to content

Commit c0abb86

Browse files
ambarusPratyush Yadav
authored andcommitted
mtd: spi-nor: Introduce templates for SPI NOR operations
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> Signed-off-by: Pratyush Yadav <p.yadav@ti.com> Acked-by: Michael Walle <michael@walle.cc> Acked-by: Pratyush Yadav <p.yadav@ti.com> Link: https://lore.kernel.org/r/20220420103427.47867-10-tudor.ambarus@microchip.com
1 parent 27ff0d3 commit c0abb86

5 files changed

Lines changed: 158 additions & 107 deletions

File tree

drivers/mtd/spi-nor/core.c

Lines changed: 18 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,7 @@ int spi_nor_write_enable(struct spi_nor *nor)
364364
int ret;
365365

366366
if (nor->spimem) {
367-
struct spi_mem_op op =
368-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0),
369-
SPI_MEM_OP_NO_ADDR,
370-
SPI_MEM_OP_NO_DUMMY,
371-
SPI_MEM_OP_NO_DATA);
367+
struct spi_mem_op op = SPI_NOR_WREN_OP;
372368

373369
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
374370

@@ -395,11 +391,7 @@ int spi_nor_write_disable(struct spi_nor *nor)
395391
int ret;
396392

397393
if (nor->spimem) {
398-
struct spi_mem_op op =
399-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0),
400-
SPI_MEM_OP_NO_ADDR,
401-
SPI_MEM_OP_NO_DUMMY,
402-
SPI_MEM_OP_NO_DATA);
394+
struct spi_mem_op op = SPI_NOR_WRDI_OP;
403395

404396
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
405397

@@ -459,11 +451,7 @@ int spi_nor_read_sr(struct spi_nor *nor, u8 *sr)
459451
int ret;
460452

461453
if (nor->spimem) {
462-
struct spi_mem_op op =
463-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0),
464-
SPI_MEM_OP_NO_ADDR,
465-
SPI_MEM_OP_NO_DUMMY,
466-
SPI_MEM_OP_DATA_IN(1, sr, 0));
454+
struct spi_mem_op op = SPI_NOR_RDSR_OP(sr);
467455

468456
if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
469457
op.addr.nbytes = nor->params->rdsr_addr_nbytes;
@@ -503,11 +491,7 @@ int spi_nor_read_cr(struct spi_nor *nor, u8 *cr)
503491
int ret;
504492

505493
if (nor->spimem) {
506-
struct spi_mem_op op =
507-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0),
508-
SPI_MEM_OP_NO_ADDR,
509-
SPI_MEM_OP_NO_DUMMY,
510-
SPI_MEM_OP_DATA_IN(1, cr, 0));
494+
struct spi_mem_op op = SPI_NOR_RDCR_OP(cr);
511495

512496
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
513497

@@ -536,14 +520,7 @@ int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable)
536520
int ret;
537521

538522
if (nor->spimem) {
539-
struct spi_mem_op op =
540-
SPI_MEM_OP(SPI_MEM_OP_CMD(enable ?
541-
SPINOR_OP_EN4B :
542-
SPINOR_OP_EX4B,
543-
0),
544-
SPI_MEM_OP_NO_ADDR,
545-
SPI_MEM_OP_NO_DUMMY,
546-
SPI_MEM_OP_NO_DATA);
523+
struct spi_mem_op op = SPI_NOR_EN4B_EX4B_OP(enable);
547524

548525
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
549526

@@ -577,11 +554,7 @@ static int spansion_set_4byte_addr_mode(struct spi_nor *nor, bool enable)
577554
nor->bouncebuf[0] = enable << 7;
578555

579556
if (nor->spimem) {
580-
struct spi_mem_op op =
581-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0),
582-
SPI_MEM_OP_NO_ADDR,
583-
SPI_MEM_OP_NO_DUMMY,
584-
SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
557+
struct spi_mem_op op = SPI_NOR_BRWR_OP(nor->bouncebuf);
585558

586559
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
587560

@@ -611,11 +584,7 @@ int spi_nor_write_ear(struct spi_nor *nor, u8 ear)
611584
nor->bouncebuf[0] = ear;
612585

613586
if (nor->spimem) {
614-
struct spi_mem_op op =
615-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0),
616-
SPI_MEM_OP_NO_ADDR,
617-
SPI_MEM_OP_NO_DUMMY,
618-
SPI_MEM_OP_DATA_OUT(1, nor->bouncebuf, 0));
587+
struct spi_mem_op op = SPI_NOR_WREAR_OP(nor->bouncebuf);
619588

620589
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
621590

@@ -726,11 +695,7 @@ int spi_nor_global_block_unlock(struct spi_nor *nor)
726695
return ret;
727696

728697
if (nor->spimem) {
729-
struct spi_mem_op op =
730-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0),
731-
SPI_MEM_OP_NO_ADDR,
732-
SPI_MEM_OP_NO_DUMMY,
733-
SPI_MEM_OP_NO_DATA);
698+
struct spi_mem_op op = SPI_NOR_GBULK_OP;
734699

735700
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
736701

@@ -765,11 +730,7 @@ int spi_nor_write_sr(struct spi_nor *nor, const u8 *sr, size_t len)
765730
return ret;
766731

767732
if (nor->spimem) {
768-
struct spi_mem_op op =
769-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0),
770-
SPI_MEM_OP_NO_ADDR,
771-
SPI_MEM_OP_NO_DUMMY,
772-
SPI_MEM_OP_DATA_OUT(len, sr, 0));
733+
struct spi_mem_op op = SPI_NOR_WRSR_OP(sr, len);
773734

774735
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
775736

@@ -978,11 +939,7 @@ static int spi_nor_write_sr2(struct spi_nor *nor, const u8 *sr2)
978939
return ret;
979940

980941
if (nor->spimem) {
981-
struct spi_mem_op op =
982-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0),
983-
SPI_MEM_OP_NO_ADDR,
984-
SPI_MEM_OP_NO_DUMMY,
985-
SPI_MEM_OP_DATA_OUT(1, sr2, 0));
942+
struct spi_mem_op op = SPI_NOR_WRSR2_OP(sr2);
986943

987944
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
988945

@@ -1014,11 +971,7 @@ static int spi_nor_read_sr2(struct spi_nor *nor, u8 *sr2)
1014971
int ret;
1015972

1016973
if (nor->spimem) {
1017-
struct spi_mem_op op =
1018-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0),
1019-
SPI_MEM_OP_NO_ADDR,
1020-
SPI_MEM_OP_NO_DUMMY,
1021-
SPI_MEM_OP_DATA_IN(1, sr2, 0));
974+
struct spi_mem_op op = SPI_NOR_RDSR2_OP(sr2);
1022975

1023976
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
1024977

@@ -1047,11 +1000,7 @@ static int spi_nor_erase_chip(struct spi_nor *nor)
10471000
dev_dbg(nor->dev, " %lldKiB\n", (long long)(nor->mtd.size >> 10));
10481001

10491002
if (nor->spimem) {
1050-
struct spi_mem_op op =
1051-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0),
1052-
SPI_MEM_OP_NO_ADDR,
1053-
SPI_MEM_OP_NO_DUMMY,
1054-
SPI_MEM_OP_NO_DATA);
1003+
struct spi_mem_op op = SPI_NOR_CHIP_ERASE_OP;
10551004

10561005
spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
10571006

@@ -1193,10 +1142,8 @@ int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
11931142

11941143
if (nor->spimem) {
11951144
struct spi_mem_op op =
1196-
SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 0),
1197-
SPI_MEM_OP_ADDR(nor->addr_width, addr, 0),
1198-
SPI_MEM_OP_NO_DUMMY,
1199-
SPI_MEM_OP_NO_DATA);
1145+
SPI_NOR_SECTOR_ERASE_OP(nor->erase_opcode,
1146+
nor->addr_width, addr);
12001147

12011148
spi_nor_spimem_setup_op(nor, &op, nor->write_proto);
12021149

@@ -1992,10 +1939,7 @@ static int spi_nor_spimem_check_op(struct spi_nor *nor,
19921939
static int spi_nor_spimem_check_readop(struct spi_nor *nor,
19931940
const struct spi_nor_read_command *read)
19941941
{
1995-
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(read->opcode, 0),
1996-
SPI_MEM_OP_ADDR(3, 0, 0),
1997-
SPI_MEM_OP_DUMMY(1, 0),
1998-
SPI_MEM_OP_DATA_IN(2, NULL, 0));
1942+
struct spi_mem_op op = SPI_NOR_READ_OP(read->opcode);
19991943

20001944
spi_nor_spimem_setup_op(nor, &op, read->proto);
20011945

@@ -2018,10 +1962,7 @@ static int spi_nor_spimem_check_readop(struct spi_nor *nor,
20181962
static int spi_nor_spimem_check_pp(struct spi_nor *nor,
20191963
const struct spi_nor_pp_command *pp)
20201964
{
2021-
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(pp->opcode, 0),
2022-
SPI_MEM_OP_ADDR(3, 0, 0),
2023-
SPI_MEM_OP_NO_DUMMY,
2024-
SPI_MEM_OP_DATA_OUT(2, NULL, 0));
1965+
struct spi_mem_op op = SPI_NOR_PP_OP(pp->opcode);
20251966

20261967
spi_nor_spimem_setup_op(nor, &op, pp->proto);
20271968

@@ -2845,10 +2786,7 @@ static void spi_nor_soft_reset(struct spi_nor *nor)
28452786
struct spi_mem_op op;
28462787
int ret;
28472788

2848-
op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 0),
2849-
SPI_MEM_OP_NO_DUMMY,
2850-
SPI_MEM_OP_NO_ADDR,
2851-
SPI_MEM_OP_NO_DATA);
2789+
op = (struct spi_mem_op)SPINOR_SRSTEN_OP;
28522790

28532791
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
28542792

@@ -2858,10 +2796,7 @@ static void spi_nor_soft_reset(struct spi_nor *nor)
28582796
return;
28592797
}
28602798

2861-
op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),
2862-
SPI_MEM_OP_NO_DUMMY,
2863-
SPI_MEM_OP_NO_ADDR,
2864-
SPI_MEM_OP_NO_DATA);
2799+
op = (struct spi_mem_op)SPINOR_SRST_OP;
28652800

28662801
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
28672802

drivers/mtd/spi-nor/core.h

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,108 @@
1818
SPI_MEM_OP_DUMMY(ndummy, 0), \
1919
SPI_MEM_OP_DATA_IN(len, buf, 0))
2020

21+
#define SPI_NOR_WREN_OP \
22+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREN, 0), \
23+
SPI_MEM_OP_NO_ADDR, \
24+
SPI_MEM_OP_NO_DUMMY, \
25+
SPI_MEM_OP_NO_DATA)
26+
27+
#define SPI_NOR_WRDI_OP \
28+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRDI, 0), \
29+
SPI_MEM_OP_NO_ADDR, \
30+
SPI_MEM_OP_NO_DUMMY, \
31+
SPI_MEM_OP_NO_DATA)
32+
33+
#define SPI_NOR_RDSR_OP(buf) \
34+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 0), \
35+
SPI_MEM_OP_NO_ADDR, \
36+
SPI_MEM_OP_NO_DUMMY, \
37+
SPI_MEM_OP_DATA_IN(1, buf, 0))
38+
39+
#define SPI_NOR_WRSR_OP(buf, len) \
40+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 0), \
41+
SPI_MEM_OP_NO_ADDR, \
42+
SPI_MEM_OP_NO_DUMMY, \
43+
SPI_MEM_OP_DATA_OUT(len, buf, 0))
44+
45+
#define SPI_NOR_RDSR2_OP(buf) \
46+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR2, 0), \
47+
SPI_MEM_OP_NO_ADDR, \
48+
SPI_MEM_OP_NO_DUMMY, \
49+
SPI_MEM_OP_DATA_OUT(1, buf, 0))
50+
51+
#define SPI_NOR_WRSR2_OP(buf) \
52+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR2, 0), \
53+
SPI_MEM_OP_NO_ADDR, \
54+
SPI_MEM_OP_NO_DUMMY, \
55+
SPI_MEM_OP_DATA_OUT(1, buf, 0))
56+
57+
#define SPI_NOR_RDCR_OP(buf) \
58+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDCR, 0), \
59+
SPI_MEM_OP_NO_ADDR, \
60+
SPI_MEM_OP_NO_DUMMY, \
61+
SPI_MEM_OP_DATA_IN(1, buf, 0))
62+
63+
#define SPI_NOR_EN4B_EX4B_OP(enable) \
64+
SPI_MEM_OP(SPI_MEM_OP_CMD(enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B, 0), \
65+
SPI_MEM_OP_NO_ADDR, \
66+
SPI_MEM_OP_NO_DUMMY, \
67+
SPI_MEM_OP_NO_DATA)
68+
69+
#define SPI_NOR_BRWR_OP(buf) \
70+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_BRWR, 0), \
71+
SPI_MEM_OP_NO_ADDR, \
72+
SPI_MEM_OP_NO_DUMMY, \
73+
SPI_MEM_OP_DATA_OUT(1, buf, 0))
74+
75+
#define SPI_NOR_WREAR_OP(buf) \
76+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WREAR, 0), \
77+
SPI_MEM_OP_NO_ADDR, \
78+
SPI_MEM_OP_NO_DUMMY, \
79+
SPI_MEM_OP_DATA_OUT(1, buf, 0))
80+
81+
#define SPI_NOR_GBULK_OP \
82+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_GBULK, 0), \
83+
SPI_MEM_OP_NO_ADDR, \
84+
SPI_MEM_OP_NO_DUMMY, \
85+
SPI_MEM_OP_NO_DATA)
86+
87+
#define SPI_NOR_CHIP_ERASE_OP \
88+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CHIP_ERASE, 0), \
89+
SPI_MEM_OP_NO_ADDR, \
90+
SPI_MEM_OP_NO_DUMMY, \
91+
SPI_MEM_OP_NO_DATA)
92+
93+
#define SPI_NOR_SECTOR_ERASE_OP(opcode, addr_width, addr) \
94+
SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0), \
95+
SPI_MEM_OP_ADDR(addr_width, addr, 0), \
96+
SPI_MEM_OP_NO_DUMMY, \
97+
SPI_MEM_OP_NO_DATA)
98+
99+
#define SPI_NOR_READ_OP(opcode) \
100+
SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0), \
101+
SPI_MEM_OP_ADDR(3, 0, 0), \
102+
SPI_MEM_OP_DUMMY(1, 0), \
103+
SPI_MEM_OP_DATA_IN(2, NULL, 0))
104+
105+
#define SPI_NOR_PP_OP(opcode) \
106+
SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0), \
107+
SPI_MEM_OP_ADDR(3, 0, 0), \
108+
SPI_MEM_OP_NO_DUMMY, \
109+
SPI_MEM_OP_DATA_OUT(2, NULL, 0))
110+
111+
#define SPINOR_SRSTEN_OP \
112+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 0), \
113+
SPI_MEM_OP_NO_DUMMY, \
114+
SPI_MEM_OP_NO_ADDR, \
115+
SPI_MEM_OP_NO_DATA)
116+
117+
#define SPINOR_SRST_OP \
118+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0), \
119+
SPI_MEM_OP_NO_DUMMY, \
120+
SPI_MEM_OP_NO_ADDR, \
121+
SPI_MEM_OP_NO_DATA)
122+
21123
enum spi_nor_option_flags {
22124
SNOR_F_HAS_SR_TB = BIT(0),
23125
SNOR_F_NO_OP_CHIP_ERASE = BIT(1),

drivers/mtd/spi-nor/micron-st.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@
3535
SPI_MEM_OP_NO_DUMMY, \
3636
SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
3737

38+
#define MICRON_ST_RDFSR_OP(buf) \
39+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0), \
40+
SPI_MEM_OP_NO_ADDR, \
41+
SPI_MEM_OP_NO_DUMMY, \
42+
SPI_MEM_OP_DATA_IN(1, buf, 0))
43+
44+
#define MICRON_ST_CLFSR_OP \
45+
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0), \
46+
SPI_MEM_OP_NO_ADDR, \
47+
SPI_MEM_OP_NO_DUMMY, \
48+
SPI_MEM_OP_NO_DATA)
49+
3850
static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
3951
{
4052
struct spi_mem_op op;
@@ -324,11 +336,7 @@ static int micron_st_nor_read_fsr(struct spi_nor *nor, u8 *fsr)
324336
int ret;
325337

326338
if (nor->spimem) {
327-
struct spi_mem_op op =
328-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 0),
329-
SPI_MEM_OP_NO_ADDR,
330-
SPI_MEM_OP_NO_DUMMY,
331-
SPI_MEM_OP_DATA_IN(1, fsr, 0));
339+
struct spi_mem_op op = MICRON_ST_RDFSR_OP(fsr);
332340

333341
if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
334342
op.addr.nbytes = nor->params->rdsr_addr_nbytes;
@@ -363,11 +371,7 @@ static void micron_st_nor_clear_fsr(struct spi_nor *nor)
363371
int ret;
364372

365373
if (nor->spimem) {
366-
struct spi_mem_op op =
367-
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLFSR, 0),
368-
SPI_MEM_OP_NO_ADDR,
369-
SPI_MEM_OP_NO_DUMMY,
370-
SPI_MEM_OP_NO_DATA);
374+
struct spi_mem_op op = MICRON_ST_CLFSR_OP;
371375

372376
spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
373377

0 commit comments

Comments
 (0)