]> git.itanic.dy.fi Git - linux-stable/commitdiff
mtd: spi-nor: move the .id and .id_len into an own structure
authorMichael Walle <mwalle@kernel.org>
Fri, 8 Sep 2023 10:16:31 +0000 (12:16 +0200)
committerTudor Ambarus <tudor.ambarus@linaro.org>
Tue, 19 Sep 2023 15:57:50 +0000 (18:57 +0300)
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>
drivers/mtd/spi-nor/core.c
drivers/mtd/spi-nor/core.h
drivers/mtd/spi-nor/micron-st.c
drivers/mtd/spi-nor/spansion.c
drivers/mtd/spi-nor/sysfs.c

index 4ba1778eda4bab21af8c46d75d5ce4b9a41652be..80c340c7863a628f4826a7325f2eb9ff51898d93 100644 (file)
@@ -2028,8 +2028,8 @@ static const struct flash_info *spi_nor_match_id(struct spi_nor *nor,
        for (i = 0; i < ARRAY_SIZE(manufacturers); i++) {
                for (j = 0; j < manufacturers[i]->nparts; j++) {
                        part = &manufacturers[i]->parts[j];
-                       if (part->id_len &&
-                           !memcmp(part->id, id, part->id_len)) {
+                       if (part->id &&
+                           !memcmp(part->id->bytes, id, part->id->len)) {
                                nor->manufacturer = manufacturers[i];
                                return part;
                        }
@@ -3370,7 +3370,7 @@ static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor,
         * If caller has specified name of flash model that can normally be
         * detected using JEDEC, let's verify it.
         */
-       if (name && info->id_len) {
+       if (name && info->id) {
                const struct flash_info *jinfo;
 
                jinfo = spi_nor_detect(nor);
index b8226492bbd8a29132bbbc48e35f9fc29bdc4783..fc6c8ddedc2faa4349788b2102016a9735b5dbb5 100644 (file)
@@ -446,12 +446,24 @@ struct spi_nor_fixups {
        int (*late_init)(struct spi_nor *nor);
 };
 
+/**
+ * struct spi_nor_id - SPI NOR flash ID.
+ *
+ * @bytes: the bytes returned by the flash when issuing command 9F. Typically,
+ *         the first byte is the manufacturer ID code (see JEP106) and the next
+ *         two bytes are a flash part specific ID.
+ * @len:   the number of bytes of ID.
+ */
+struct spi_nor_id {
+       const u8 *bytes;
+       u8 len;
+};
+
 /**
  * struct flash_info - SPI NOR flash_info entry.
+ * @id:   pointer to struct spi_nor_id or NULL, which means "no ID" (mostly
+ *        older chips).
  * @name: the name of the flash.
- * @id:             the flash's ID bytes. The first three bytes are the
- *                  JEDIC ID. JEDEC ID zero means "no ID" (mostly older chips).
- * @id_len:         the number of bytes of ID.
  * @size:           the size of the flash in bytes.
  * @sector_size:    (optional) the size listed here is what works with
  *                  SPINOR_OP_SE, which isn't necessarily called a "sector" by
@@ -510,8 +522,7 @@ struct spi_nor_fixups {
  */
 struct flash_info {
        char *name;
-       u8 id[SPI_NOR_MAX_ID_LEN];
-       u8 id_len;
+       const struct spi_nor_id *id;
        size_t size;
        unsigned sector_size;
        u16 page_size;
@@ -554,12 +565,18 @@ struct flash_info {
 #define SPI_NOR_ID_3ITEMS(_id) ((_id) >> 16) & 0xff, SPI_NOR_ID_2ITEMS(_id)
 
 #define SPI_NOR_ID(_jedec_id, _ext_id)                                 \
-       .id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_2ITEMS(_ext_id) }, \
-       .id_len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))
+       .id = &(const struct spi_nor_id){                               \
+               .bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id),    \
+                                      SPI_NOR_ID_2ITEMS(_ext_id) },    \
+               .len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0)),    \
+       }
 
 #define SPI_NOR_ID6(_jedec_id, _ext_id)                                        \
-       .id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_3ITEMS(_ext_id) }, \
-       .id_len = 6
+       .id = &(const struct spi_nor_id){                               \
+               .bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id),    \
+                                      SPI_NOR_ID_3ITEMS(_ext_id) },    \
+               .len = 6,                                               \
+       }
 
 #define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks)           \
        .size = (_sector_size) * (_n_sectors),                          \
index 5406a3af2ce0c77f2ef2f94fa8b47045617dad56..229c951efcce6d38eb19ee1e9bbab84e0a1d01b8 100644 (file)
@@ -78,7 +78,7 @@ static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
                return ret;
        }
 
-       if (memcmp(buf, nor->info->id, nor->info->id_len))
+       if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
                return -EINVAL;
 
        return 0;
@@ -114,7 +114,7 @@ static int micron_st_nor_octal_dtr_dis(struct spi_nor *nor)
                return ret;
        }
 
-       if (memcmp(buf, nor->info->id, nor->info->id_len))
+       if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
                return -EINVAL;
 
        return 0;
index b6fcd56e270eb4fc43d76e8096231eb7756c3b28..f6e0569366b5b1fedc8985d129433a0ed935f010 100644 (file)
@@ -228,7 +228,7 @@ static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
                return ret;
        }
 
-       if (memcmp(buf, nor->info->id, nor->info->id_len))
+       if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
                return -EINVAL;
 
        return 0;
@@ -272,7 +272,7 @@ static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
                return ret;
        }
 
-       if (memcmp(buf, nor->info->id, nor->info->id_len))
+       if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
                return -EINVAL;
 
        return 0;
index c09bb832b3b9e68145eaacc5a3e7cf341a3b831f..2dfdc555a69faf6392e9deb6110b88a82968a507 100644 (file)
@@ -35,8 +35,8 @@ static ssize_t jedec_id_show(struct device *dev,
        struct spi_device *spi = to_spi_device(dev);
        struct spi_mem *spimem = spi_get_drvdata(spi);
        struct spi_nor *nor = spi_mem_get_drvdata(spimem);
-       const u8 *id = nor->info->id_len ? nor->info->id : nor->id;
-       u8 id_len = nor->info->id_len ?: SPI_NOR_MAX_ID_LEN;
+       const u8 *id = nor->info->id ? nor->info->id->bytes : nor->id;
+       u8 id_len = nor->info->id ? nor->info->id->len : SPI_NOR_MAX_ID_LEN;
 
        return sysfs_emit(buf, "%*phN\n", id_len, id);
 }
@@ -78,7 +78,7 @@ static umode_t spi_nor_sysfs_is_visible(struct kobject *kobj,
 
        if (attr == &dev_attr_manufacturer.attr && !nor->manufacturer)
                return 0;
-       if (attr == &dev_attr_jedec_id.attr && !nor->info->id_len && !nor->id)
+       if (attr == &dev_attr_jedec_id.attr && !nor->info->id && !nor->id)
                return 0;
 
        return 0444;