Unverified Commit 2d7f3a08 authored by Michael Walle's avatar Michael Walle Committed by Tudor Ambarus
Browse files

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: default avatarMichael Walle <mwalle@kernel.org>
Link: https://lore.kernel.org/r/20230807-mtd-flash-info-db-rework-v3-13-e60548861b10@kernel.org


Signed-off-by: default avatarTudor Ambarus <tudor.ambarus@linaro.org>
parent 95c6e3d2
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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);
+26 −9
Original line number Diff line number Diff line
@@ -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),				\
+2 −2
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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;
+3 −3
Original line number Diff line number Diff line
@@ -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;