|
@@ -2289,40 +2289,22 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
|
|
|
return type;
|
|
|
}
|
|
|
|
|
|
-/* module_text_address() isn't exported, and it's mostly a pointless
|
|
|
- test if this is a module _anyway_ -- they'd have to try _really_ hard
|
|
|
- to call us from in-kernel code if the core NAND support is modular. */
|
|
|
-#ifdef MODULE
|
|
|
-#define caller_is_module() (1)
|
|
|
-#else
|
|
|
-#define caller_is_module() \
|
|
|
- module_text_address((unsigned long)__builtin_return_address(0))
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
- * nand_scan - [NAND Interface] Scan for the NAND device
|
|
|
- * @mtd: MTD device structure
|
|
|
- * @maxchips: Number of chips to scan for
|
|
|
+ * nand_scan_ident - [NAND Interface] Scan for the NAND device
|
|
|
+ * @mtd: MTD device structure
|
|
|
+ * @maxchips: Number of chips to scan for
|
|
|
*
|
|
|
- * This fills out all the uninitialized function pointers
|
|
|
- * with the defaults.
|
|
|
- * The flash ID is read and the mtd/chip structures are
|
|
|
- * filled with the appropriate values.
|
|
|
- * The mtd->owner field must be set to the module of the caller
|
|
|
+ * This is the first phase of the normal nand_scan() function. It
|
|
|
+ * reads the flash ID and sets up MTD fields accordingly.
|
|
|
*
|
|
|
+ * The mtd->owner field must be set to the module of the caller.
|
|
|
*/
|
|
|
-int nand_scan(struct mtd_info *mtd, int maxchips)
|
|
|
+int nand_scan_ident(struct mtd_info *mtd, int maxchips)
|
|
|
{
|
|
|
int i, busw, nand_maf_id;
|
|
|
struct nand_chip *chip = mtd->priv;
|
|
|
struct nand_flash_dev *type;
|
|
|
|
|
|
- /* Many callers got this wrong, so check for it for a while... */
|
|
|
- if (!mtd->owner && caller_is_module()) {
|
|
|
- printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
|
|
|
- BUG();
|
|
|
- }
|
|
|
-
|
|
|
/* Get buswidth to select the correct functions */
|
|
|
busw = chip->options & NAND_BUSWIDTH_16;
|
|
|
/* Set the default functions */
|
|
@@ -2354,6 +2336,24 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
|
|
chip->numchips = i;
|
|
|
mtd->size = i * chip->chipsize;
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * nand_scan_tail - [NAND Interface] Scan for the NAND device
|
|
|
+ * @mtd: MTD device structure
|
|
|
+ * @maxchips: Number of chips to scan for
|
|
|
+ *
|
|
|
+ * This is the second phase of the normal nand_scan() function. It
|
|
|
+ * fills out all the uninitialized function pointers with the defaults
|
|
|
+ * and scans for a bad block table if appropriate.
|
|
|
+ */
|
|
|
+int nand_scan_tail(struct mtd_info *mtd)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ struct nand_chip *chip = mtd->priv;
|
|
|
+
|
|
|
/* Preset the internal oob write buffer */
|
|
|
memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize);
|
|
|
|
|
@@ -2504,6 +2504,44 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
|
|
return chip->scan_bbt(mtd);
|
|
|
}
|
|
|
|
|
|
+/* module_text_address() isn't exported, and it's mostly a pointless
|
|
|
+ test if this is a module _anyway_ -- they'd have to try _really_ hard
|
|
|
+ to call us from in-kernel code if the core NAND support is modular. */
|
|
|
+#ifdef MODULE
|
|
|
+#define caller_is_module() (1)
|
|
|
+#else
|
|
|
+#define caller_is_module() \
|
|
|
+ module_text_address((unsigned long)__builtin_return_address(0))
|
|
|
+#endif
|
|
|
+
|
|
|
+/**
|
|
|
+ * nand_scan - [NAND Interface] Scan for the NAND device
|
|
|
+ * @mtd: MTD device structure
|
|
|
+ * @maxchips: Number of chips to scan for
|
|
|
+ *
|
|
|
+ * This fills out all the uninitialized function pointers
|
|
|
+ * with the defaults.
|
|
|
+ * The flash ID is read and the mtd/chip structures are
|
|
|
+ * filled with the appropriate values.
|
|
|
+ * The mtd->owner field must be set to the module of the caller
|
|
|
+ *
|
|
|
+ */
|
|
|
+int nand_scan(struct mtd_info *mtd, int maxchips)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* Many callers got this wrong, so check for it for a while... */
|
|
|
+ if (!mtd->owner && caller_is_module()) {
|
|
|
+ printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = nand_scan_ident(mtd, maxchips);
|
|
|
+ if (!ret)
|
|
|
+ ret = nand_scan_tail(mtd);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* nand_release - [NAND Interface] Free resources held by the NAND device
|
|
|
* @mtd: MTD device structure
|
|
@@ -2524,6 +2562,8 @@ void nand_release(struct mtd_info *mtd)
|
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(nand_scan);
|
|
|
+EXPORT_SYMBOL_GPL(nand_scan_ident);
|
|
|
+EXPORT_SYMBOL_GPL(nand_scan_tail);
|
|
|
EXPORT_SYMBOL_GPL(nand_release);
|
|
|
|
|
|
static int __init nand_base_init(void)
|