mtd: rawnand: Add support for manufacturer specific lock/unlock operation
authorMason Yang <masonccyang@mxic.com.tw>
Tue, 3 Mar 2020 07:21:21 +0000 (15:21 +0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 11 Mar 2020 15:17:55 +0000 (16:17 +0100)
Add nand_lock() & nand_unlock() for manufacturer specific lock & unlock
operation while the device supports Block Portection function.

Signed-off-by: Mason Yang <masonccyang@mxic.com.tw>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/1583220084-10890-2-git-send-email-masonccyang@mxic.com.tw
drivers/mtd/nand/raw/nand_base.c
include/linux/mtd/rawnand.h

index a3ed6c54963e63b07ccc759a03772af15b0d305b..a13b91aa3780eda5cbde446f30a142c4f0bba066 100644 (file)
@@ -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;
index 3c7c15aadceeb2555f5ffd095a58022420bb0e98..49ed50fb44abb4d3c1cf2d3a9a0008857a6a92f6 100644 (file)
@@ -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;