Commit 8e8b2706 authored by Miquel Raynal's avatar Miquel Raynal
Browse files

mtd: rawnand: Create a nand_chip operations structure



And move nand_chip hooks there.

While moving entries from one structure to the other, adapt the
documentation style.

Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Link: https://lore.kernel.org/linux-mtd/20200529111322.7184-4-miquel.raynal@bootlin.com
parent d1f3837a
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -3215,10 +3215,10 @@ static int nand_setup_read_retry(struct nand_chip *chip, int retry_mode)
	if (retry_mode >= chip->read_retries)
		return -EINVAL;

	if (!chip->setup_read_retry)
	if (!chip->ops.setup_read_retry)
		return -EOPNOTSUPP;

	return chip->setup_read_retry(chip, retry_mode);
	return chip->ops.setup_read_retry(chip, retry_mode);
}

static void nand_wait_readrdy(struct nand_chip *chip)
@@ -4462,8 +4462,8 @@ static int nand_suspend(struct mtd_info *mtd)
	int ret = 0;

	mutex_lock(&chip->lock);
	if (chip->suspend)
		ret = chip->suspend(chip);
	if (chip->ops.suspend)
		ret = chip->ops.suspend(chip);
	if (!ret)
		chip->suspended = 1;
	mutex_unlock(&chip->lock);
@@ -4481,8 +4481,8 @@ static void nand_resume(struct mtd_info *mtd)

	mutex_lock(&chip->lock);
	if (chip->suspended) {
		if (chip->resume)
			chip->resume(chip);
		if (chip->ops.resume)
			chip->ops.resume(chip);
		chip->suspended = 0;
	} else {
		pr_err("%s called for a chip which is not in suspended state\n",
@@ -4511,10 +4511,10 @@ static int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
	struct nand_chip *chip = mtd_to_nand(mtd);

	if (!chip->lock_area)
	if (!chip->ops.lock_area)
		return -ENOTSUPP;

	return chip->lock_area(chip, ofs, len);
	return chip->ops.lock_area(chip, ofs, len);
}

/**
@@ -4527,10 +4527,10 @@ static int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
	struct nand_chip *chip = mtd_to_nand(mtd);

	if (!chip->unlock_area)
	if (!chip->ops.unlock_area)
		return -ENOTSUPP;

	return chip->unlock_area(chip, ofs, len);
	return chip->ops.unlock_area(chip, ofs, len);
}

/* Set default functions */
+1 −1
Original line number Diff line number Diff line
@@ -337,7 +337,7 @@ static int hynix_mlc_1xnm_rr_init(struct nand_chip *chip,
	rr->nregs = nregs;
	rr->regs = hynix_1xnm_mlc_read_retry_regs;
	hynix->read_retry = rr;
	chip->setup_read_retry = hynix_nand_setup_read_retry;
	chip->ops.setup_read_retry = hynix_nand_setup_read_retry;
	chip->read_retries = nmodes;

out:
+5 −5
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ static void macronix_nand_onfi_init(struct nand_chip *chip)
		return;

	chip->read_retries = MACRONIX_NUM_READ_RETRY_MODES;
	chip->setup_read_retry = macronix_nand_setup_read_retry;
	chip->ops.setup_read_retry = macronix_nand_setup_read_retry;

	if (p->supports_set_get_features) {
		bitmap_set(p->set_feature_list,
@@ -242,8 +242,8 @@ static void macronix_nand_block_protection_support(struct nand_chip *chip)
	bitmap_set(chip->parameters.set_feature_list,
		   ONFI_FEATURE_ADDR_MXIC_PROTECTION, 1);

	chip->lock_area = mxic_nand_lock;
	chip->unlock_area = mxic_nand_unlock;
	chip->ops.lock_area = mxic_nand_lock;
	chip->ops.unlock_area = mxic_nand_unlock;
}

static int nand_power_down_op(struct nand_chip *chip)
@@ -312,8 +312,8 @@ static void macronix_nand_deep_power_down_support(struct nand_chip *chip)
	if (i < 0)
		return;

	chip->suspend = mxic_nand_suspend;
	chip->resume = mxic_nand_resume;
	chip->ops.suspend = mxic_nand_suspend;
	chip->ops.resume = mxic_nand_resume;
}

static int macronix_nand_init(struct nand_chip *chip)
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ static int micron_nand_onfi_init(struct nand_chip *chip)
		struct nand_onfi_vendor_micron *micron = (void *)p->onfi->vendor;

		chip->read_retries = micron->read_retry_options;
		chip->setup_read_retry = micron_nand_setup_read_retry;
		chip->ops.setup_read_retry = micron_nand_setup_read_retry;
	}

	if (p->supports_set_get_features) {
+18 −14
Original line number Diff line number Diff line
@@ -1027,16 +1027,31 @@ struct nand_legacy {
	struct nand_controller dummy_controller;
};

/**
 * struct nand_chip_ops - NAND chip operations
 * @suspend: Suspend operation
 * @resume: Resume operation
 * @lock_area: Lock operation
 * @unlock_area: Unlock operation
 * @setup_read_retry: Set the read-retry mode (mostly needed for MLC NANDs)
 */
struct nand_chip_ops {
	int (*suspend)(struct nand_chip *chip);
	void (*resume)(struct nand_chip *chip);
	int (*lock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
	int (*unlock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
	int (*setup_read_retry)(struct nand_chip *chip, int retry_mode);
};

/**
 * struct nand_chip - NAND Private Flash Chip Data
 * @base:		Inherit from the generic NAND device
 * @ops:		NAND chip operations
 * @legacy:		All legacy fields/hooks. If you develop a new driver,
 *			don't even try to use any of these fields/hooks, and if
 *			you're modifying an existing driver that is using those
 *			fields/hooks, you should consider reworking the driver
 *			avoid using them.
 * @setup_read_retry:	[FLASHSPECIFIC] flash (vendor) specific function for
 *			setting the read-retry mode. Mostly needed for MLC NAND.
 * @ecc:		[BOARDSPECIFIC] ECC control structure
 * @buf_align:		minimum buffer alignment required by a platform
 * @oob_poi:		"poison value buffer," used for laying out OOB data
@@ -1081,8 +1096,6 @@ struct nand_legacy {
 * @lock:		lock protecting the suspended field. Also used to
 *			serialize accesses to the NAND device.
 * @suspended:		set to 1 when the device is suspended, 0 when it's not.
 * @suspend:		[REPLACEABLE] specific NAND device suspend operation
 * @resume:		[REPLACEABLE] specific NAND device resume operation
 * @bbt:		[INTERN] bad block table pointer
 * @bbt_td:		[REPLACEABLE] bad block table descriptor for flash
 *			lookup.
@@ -1096,17 +1109,13 @@ struct nand_legacy {
 * @manufacturer:	[INTERN] Contains manufacturer information
 * @manufacturer.desc:	[INTERN] Contains manufacturer's description
 * @manufacturer.priv:	[INTERN] Contains manufacturer private information
 * @lock_area:		[REPLACEABLE] specific NAND chip lock operation
 * @unlock_area:	[REPLACEABLE] specific NAND chip unlock operation
 */

struct nand_chip {
	struct nand_device base;

	struct nand_chip_ops ops;
	struct nand_legacy legacy;

	int (*setup_read_retry)(struct nand_chip *chip, int retry_mode);

	unsigned int options;
	unsigned int bbt_options;

@@ -1138,8 +1147,6 @@ struct nand_chip {

	struct mutex lock;
	unsigned int suspended : 1;
	int (*suspend)(struct nand_chip *chip);
	void (*resume)(struct nand_chip *chip);

	u8 *oob_poi;
	struct nand_controller *controller;
@@ -1159,9 +1166,6 @@ struct nand_chip {
		const struct nand_manufacturer *desc;
		void *priv;
	} manufacturer;

	int (*lock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
	int (*unlock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
};

extern const struct mtd_ooblayout_ops nand_ooblayout_sp_ops;