Commit 92270086 authored by Mason Yang's avatar Mason Yang Committed by Miquel Raynal
Browse files

mtd: rawnand: Add support for manufacturer specific lock/unlock operation



Add nand_lock() & nand_unlock() for manufacturer specific lock & unlock
operation while the device supports Block Portection function.

Signed-off-by: default avatarMason Yang <masonccyang@mxic.com.tw>
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/1583220084-10890-2-git-send-email-masonccyang@mxic.com.tw
parent e015d72f
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -4365,6 +4365,38 @@ static void nand_shutdown(struct mtd_info *mtd)
	nand_suspend(mtd);
}

/**
 * nand_lock - [MTD Interface] Lock the NAND flash
 * @mtd: MTD device structure
 * @ofs: offset byte address
 * @len: number of bytes to lock (must be a multiple of block/page size)
 */
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)
		return -ENOTSUPP;

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

/**
 * nand_unlock - [MTD Interface] Unlock the NAND flash
 * @mtd: MTD device structure
 * @ofs: offset byte address
 * @len: number of bytes to unlock (must be a multiple of block/page size)
 */
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)
		return -ENOTSUPP;

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

/* Set default functions */
static void nand_set_defaults(struct nand_chip *chip)
{
@@ -5791,8 +5823,8 @@ static int nand_scan_tail(struct nand_chip *chip)
	mtd->_read_oob = nand_read_oob;
	mtd->_write_oob = nand_write_oob;
	mtd->_sync = nand_sync;
	mtd->_lock = NULL;
	mtd->_unlock = NULL;
	mtd->_lock = nand_lock;
	mtd->_unlock = nand_unlock;
	mtd->_suspend = nand_suspend;
	mtd->_resume = nand_resume;
	mtd->_reboot = nand_shutdown;
+5 −0
Original line number Diff line number Diff line
@@ -1077,6 +1077,8 @@ 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 {
@@ -1136,6 +1138,9 @@ 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;