Skip to content

Commit 2d7f3a0

Browse files
mwalleambarus
authored andcommitted
mtd: spi-nor: move the .id and .id_len into an own structure
Create a new structure to hold a flash ID and its length. The goal is to have a new macro SNOR_ID() which can have a flexible id length. This way we can get rid of all the individual INFOx() macros. Signed-off-by: Michael Walle <mwalle@kernel.org> Link: https://lore.kernel.org/r/20230807-mtd-flash-info-db-rework-v3-13-e60548861b10@kernel.org Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
1 parent 95c6e3d commit 2d7f3a0

5 files changed

Lines changed: 36 additions & 19 deletions

File tree

drivers/mtd/spi-nor/core.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,8 +2028,8 @@ static const struct flash_info *spi_nor_match_id(struct spi_nor *nor,
20282028
for (i = 0; i < ARRAY_SIZE(manufacturers); i++) {
20292029
for (j = 0; j < manufacturers[i]->nparts; j++) {
20302030
part = &manufacturers[i]->parts[j];
2031-
if (part->id_len &&
2032-
!memcmp(part->id, id, part->id_len)) {
2031+
if (part->id &&
2032+
!memcmp(part->id->bytes, id, part->id->len)) {
20332033
nor->manufacturer = manufacturers[i];
20342034
return part;
20352035
}
@@ -3370,7 +3370,7 @@ static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor,
33703370
* If caller has specified name of flash model that can normally be
33713371
* detected using JEDEC, let's verify it.
33723372
*/
3373-
if (name && info->id_len) {
3373+
if (name && info->id) {
33743374
const struct flash_info *jinfo;
33753375

33763376
jinfo = spi_nor_detect(nor);

drivers/mtd/spi-nor/core.h

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -446,12 +446,24 @@ struct spi_nor_fixups {
446446
int (*late_init)(struct spi_nor *nor);
447447
};
448448

449+
/**
450+
* struct spi_nor_id - SPI NOR flash ID.
451+
*
452+
* @bytes: the bytes returned by the flash when issuing command 9F. Typically,
453+
* the first byte is the manufacturer ID code (see JEP106) and the next
454+
* two bytes are a flash part specific ID.
455+
* @len: the number of bytes of ID.
456+
*/
457+
struct spi_nor_id {
458+
const u8 *bytes;
459+
u8 len;
460+
};
461+
449462
/**
450463
* struct flash_info - SPI NOR flash_info entry.
464+
* @id: pointer to struct spi_nor_id or NULL, which means "no ID" (mostly
465+
* older chips).
451466
* @name: the name of the flash.
452-
* @id: the flash's ID bytes. The first three bytes are the
453-
* JEDIC ID. JEDEC ID zero means "no ID" (mostly older chips).
454-
* @id_len: the number of bytes of ID.
455467
* @size: the size of the flash in bytes.
456468
* @sector_size: (optional) the size listed here is what works with
457469
* SPINOR_OP_SE, which isn't necessarily called a "sector" by
@@ -510,8 +522,7 @@ struct spi_nor_fixups {
510522
*/
511523
struct flash_info {
512524
char *name;
513-
u8 id[SPI_NOR_MAX_ID_LEN];
514-
u8 id_len;
525+
const struct spi_nor_id *id;
515526
size_t size;
516527
unsigned sector_size;
517528
u16 page_size;
@@ -554,12 +565,18 @@ struct flash_info {
554565
#define SPI_NOR_ID_3ITEMS(_id) ((_id) >> 16) & 0xff, SPI_NOR_ID_2ITEMS(_id)
555566

556567
#define SPI_NOR_ID(_jedec_id, _ext_id) \
557-
.id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_2ITEMS(_ext_id) }, \
558-
.id_len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))
568+
.id = &(const struct spi_nor_id){ \
569+
.bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id), \
570+
SPI_NOR_ID_2ITEMS(_ext_id) }, \
571+
.len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0)), \
572+
}
559573

560574
#define SPI_NOR_ID6(_jedec_id, _ext_id) \
561-
.id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_3ITEMS(_ext_id) }, \
562-
.id_len = 6
575+
.id = &(const struct spi_nor_id){ \
576+
.bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id), \
577+
SPI_NOR_ID_3ITEMS(_ext_id) }, \
578+
.len = 6, \
579+
}
563580

564581
#define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks) \
565582
.size = (_sector_size) * (_n_sectors), \

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
7878
return ret;
7979
}
8080

81-
if (memcmp(buf, nor->info->id, nor->info->id_len))
81+
if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
8282
return -EINVAL;
8383

8484
return 0;
@@ -114,7 +114,7 @@ static int micron_st_nor_octal_dtr_dis(struct spi_nor *nor)
114114
return ret;
115115
}
116116

117-
if (memcmp(buf, nor->info->id, nor->info->id_len))
117+
if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
118118
return -EINVAL;
119119

120120
return 0;

drivers/mtd/spi-nor/spansion.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
228228
return ret;
229229
}
230230

231-
if (memcmp(buf, nor->info->id, nor->info->id_len))
231+
if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
232232
return -EINVAL;
233233

234234
return 0;
@@ -272,7 +272,7 @@ static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
272272
return ret;
273273
}
274274

275-
if (memcmp(buf, nor->info->id, nor->info->id_len))
275+
if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
276276
return -EINVAL;
277277

278278
return 0;

drivers/mtd/spi-nor/sysfs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ static ssize_t jedec_id_show(struct device *dev,
3535
struct spi_device *spi = to_spi_device(dev);
3636
struct spi_mem *spimem = spi_get_drvdata(spi);
3737
struct spi_nor *nor = spi_mem_get_drvdata(spimem);
38-
const u8 *id = nor->info->id_len ? nor->info->id : nor->id;
39-
u8 id_len = nor->info->id_len ?: SPI_NOR_MAX_ID_LEN;
38+
const u8 *id = nor->info->id ? nor->info->id->bytes : nor->id;
39+
u8 id_len = nor->info->id ? nor->info->id->len : SPI_NOR_MAX_ID_LEN;
4040

4141
return sysfs_emit(buf, "%*phN\n", id_len, id);
4242
}
@@ -78,7 +78,7 @@ static umode_t spi_nor_sysfs_is_visible(struct kobject *kobj,
7878

7979
if (attr == &dev_attr_manufacturer.attr && !nor->manufacturer)
8080
return 0;
81-
if (attr == &dev_attr_jedec_id.attr && !nor->info->id_len && !nor->id)
81+
if (attr == &dev_attr_jedec_id.attr && !nor->info->id && !nor->id)
8282
return 0;
8383

8484
return 0444;

0 commit comments

Comments
 (0)