Merge linux-stable 3.0.28 into android-3.0
[firefly-linux-kernel-4.4.55.git] / drivers / mtd / nand / nand_base.c
index 86f05f45780ab46b708e7671bbfc5d69540dd68b..15d71658b4f11fcaa9dd6e62da54ff503ef21dbe 100644 (file)
@@ -3222,6 +3222,44 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 }
 EXPORT_SYMBOL(nand_scan_ident);
 
+static void nand_panic_wait(struct mtd_info *mtd)
+{
+       struct nand_chip *chip = mtd->priv;
+       int i;
+
+       if (chip->state != FL_READY)
+               for (i = 0; i < 40; i++) {
+                       if (chip->dev_ready(mtd))
+                               break;
+                       mdelay(10);
+               }
+       chip->state = FL_READY;
+}
+
+static int nand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
+                           size_t *retlen, const u_char *buf)
+{
+       struct nand_chip *chip = mtd->priv;
+       int ret;
+
+       /* Do not allow reads past end of device */
+       if ((to + len) > mtd->size)
+               return -EINVAL;
+       if (!len)
+               return 0;
+
+       nand_panic_wait(mtd);
+
+       chip->ops.len = len;
+       chip->ops.datbuf = (uint8_t *)buf;
+       chip->ops.oobbuf = NULL;
+
+       ret = nand_do_write_ops(mtd, to, &chip->ops);
+
+       *retlen = chip->ops.retlen;
+       return ret;
+}
+
 
 /**
  * nand_scan_tail - [NAND Interface] Scan for the NAND device
@@ -3465,6 +3503,7 @@ int nand_scan_tail(struct mtd_info *mtd)
        mtd->panic_write = panic_nand_write;
        mtd->read_oob = nand_read_oob;
        mtd->write_oob = nand_write_oob;
+       mtd->panic_write = nand_panic_write;
        mtd->sync = nand_sync;
        mtd->lock = NULL;
        mtd->unlock = NULL;