Commit da55809e authored by Miquel Raynal's avatar Miquel Raynal
Browse files

mtd: spinand: Add a ->configure_chip() hook



There is already a manufacturer hook, which is manufacturer specific but
not chip specific. We no longer have access to the actual NAND identity
at this stage so let's add a per-chip configuration hook to align the
chip configuration (if any) with the core's setting.

Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
parent d81ad9d7
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -1253,8 +1253,19 @@ static int spinand_id_detect(struct spinand_device *spinand)

static int spinand_manufacturer_init(struct spinand_device *spinand)
{
	if (spinand->manufacturer->ops->init)
		return spinand->manufacturer->ops->init(spinand);
	int ret;

	if (spinand->manufacturer->ops->init) {
		ret = spinand->manufacturer->ops->init(spinand);
		if (ret)
			return ret;
	}

	if (spinand->configure_chip) {
		ret = spinand->configure_chip(spinand);
		if (ret)
			return ret;
	}

	return 0;
}
@@ -1349,6 +1360,7 @@ int spinand_match_and_init(struct spinand_device *spinand,
		spinand->flags = table[i].flags;
		spinand->id.len = 1 + table[i].devid.len;
		spinand->select_target = table[i].select_target;
		spinand->configure_chip = table[i].configure_chip;
		spinand->set_cont_read = table[i].set_cont_read;
		spinand->fact_otp = &table[i].fact_otp;
		spinand->user_otp = &table[i].user_otp;
+7 −0
Original line number Diff line number Diff line
@@ -493,6 +493,7 @@ struct spinand_user_otp {
 * @op_variants.update_cache: variants of the update-cache operation
 * @select_target: function used to select a target/die. Required only for
 *		   multi-die chips
 * @configure_chip: Align the chip configuration with the core settings
 * @set_cont_read: enable/disable continuous cached reads
 * @fact_otp: SPI NAND factory OTP info.
 * @user_otp: SPI NAND user OTP info.
@@ -516,6 +517,7 @@ struct spinand_info {
	} op_variants;
	int (*select_target)(struct spinand_device *spinand,
			     unsigned int target);
	int (*configure_chip)(struct spinand_device *spinand);
	int (*set_cont_read)(struct spinand_device *spinand,
			     bool enable);
	struct spinand_fact_otp fact_otp;
@@ -548,6 +550,9 @@ struct spinand_info {
#define SPINAND_SELECT_TARGET(__func)					\
	.select_target = __func

#define SPINAND_CONFIGURE_CHIP(__configure_chip)			\
	.configure_chip = __configure_chip

#define SPINAND_CONT_READ(__set_cont_read)				\
	.set_cont_read = __set_cont_read

@@ -616,6 +621,7 @@ struct spinand_dirmap {
 *		passed in spi_mem_op be DMA-able, so we can't based the bufs on
 *		the stack
 * @manufacturer: SPI NAND manufacturer information
 * @configure_chip: Align the chip configuration with the core settings
 * @cont_read_possible: Field filled by the core once the whole system
 *		configuration is known to tell whether continuous reads are
 *		suitable to use or not in general with this chip/configuration.
@@ -656,6 +662,7 @@ struct spinand_device {
	const struct spinand_manufacturer *manufacturer;
	void *priv;

	int (*configure_chip)(struct spinand_device *spinand);
	bool cont_read_possible;
	int (*set_cont_read)(struct spinand_device *spinand,
			     bool enable);