mtd: nand: Create a NAND reset function
authorSascha Hauer <s.hauer@pengutronix.de>
Thu, 15 Sep 2016 08:32:45 +0000 (10:32 +0200)
committerBoris Brezillon <boris.brezillon@free-electrons.com>
Fri, 23 Sep 2016 07:35:16 +0000 (09:35 +0200)
When NAND devices are resetted some initialization may have to be done,
like for example they have to be configured for the timing mode that
shall be used. To get a common place where this initialization can be
implemented create a nand_reset() function. This currently only issues
a NAND_CMD_RESET to the NAND device. The places issuing this command
manually are replaced with a call to nand_reset().

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
drivers/mtd/nand/nand_base.c
include/linux/mtd/nand.h

index 108adefcc8cc3f4c5c5860409e2397aab37cdeba..1a6310573ab486daaf1c72141f9d81e97abea86e 100644 (file)
@@ -947,6 +947,21 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
        return status;
 }
 
+/**
+ * nand_reset - Reset and initialize a NAND device
+ * @chip: The NAND chip
+ *
+ * Returns 0 for success or negative error code otherwise
+ */
+int nand_reset(struct nand_chip *chip)
+{
+       struct mtd_info *mtd = nand_to_mtd(chip);
+
+       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+
+       return 0;
+}
+
 /**
  * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks
  * @mtd: mtd info
@@ -1025,7 +1040,7 @@ int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
         * some operation can also clear the bit 7 of status register
         * eg. erase/program a locked block
         */
-       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       nand_reset(chip);
 
        /* Check, if it is write protected */
        if (nand_check_wp(mtd)) {
@@ -1084,7 +1099,7 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
         * some operation can also clear the bit 7 of status register
         * eg. erase/program a locked block
         */
-       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       nand_reset(chip);
 
        /* Check, if it is write protected */
        if (nand_check_wp(mtd)) {
@@ -2782,7 +2797,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
         * if we don't do this. I have no clue why, but I seem to have 'fixed'
         * it in the doc2000 driver in August 1999.  dwmw2.
         */
-       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       nand_reset(chip);
 
        /* Check, if it is write protected */
        if (nand_check_wp(mtd)) {
@@ -3822,7 +3837,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
         * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
         * after power-up.
         */
-       chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       nand_reset(chip);
 
        /* Send the command for reading device ID */
        chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
@@ -4163,7 +4178,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
        for (i = 1; i < maxchips; i++) {
                chip->select_chip(mtd, i);
                /* See comment in nand_get_flash_type for reset */
-               chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+               nand_reset(chip);
                /* Send the command for reading device ID */
                chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
                /* Read manufacturer and device IDs */
index 28c1833ad708ea9f2c5fed095063156d4479de4c..73ccbf6e057ceee5f204680dd71905dce2a43380 100644 (file)
@@ -1100,4 +1100,8 @@ int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, int page);
 /* Default read_oob syndrome implementation */
 int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
                           int page);
+
+/* Reset and initialize a NAND device */
+int nand_reset(struct nand_chip *chip);
+
 #endif /* __LINUX_MTD_NAND_H */