aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/nand/nand_base.c90
-rw-r--r--include/linux/mtd/nand.h5
2 files changed, 70 insertions, 25 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 8da8862d0548..492ff9d1a35c 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2289,40 +2289,22 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
2289 return type; 2289 return type;
2290} 2290}
2291 2291
2292/* module_text_address() isn't exported, and it's mostly a pointless
2293 test if this is a module _anyway_ -- they'd have to try _really_ hard
2294 to call us from in-kernel code if the core NAND support is modular. */
2295#ifdef MODULE
2296#define caller_is_module() (1)
2297#else
2298#define caller_is_module() \
2299 module_text_address((unsigned long)__builtin_return_address(0))
2300#endif
2301
2302/** 2292/**
2303 * nand_scan - [NAND Interface] Scan for the NAND device 2293 * nand_scan_ident - [NAND Interface] Scan for the NAND device
2304 * @mtd: MTD device structure 2294 * @mtd: MTD device structure
2305 * @maxchips: Number of chips to scan for 2295 * @maxchips: Number of chips to scan for
2306 * 2296 *
2307 * This fills out all the uninitialized function pointers 2297 * This is the first phase of the normal nand_scan() function. It
2308 * with the defaults. 2298 * reads the flash ID and sets up MTD fields accordingly.
2309 * The flash ID is read and the mtd/chip structures are
2310 * filled with the appropriate values.
2311 * The mtd->owner field must be set to the module of the caller
2312 * 2299 *
2300 * The mtd->owner field must be set to the module of the caller.
2313 */ 2301 */
2314int nand_scan(struct mtd_info *mtd, int maxchips) 2302int nand_scan_ident(struct mtd_info *mtd, int maxchips)
2315{ 2303{
2316 int i, busw, nand_maf_id; 2304 int i, busw, nand_maf_id;
2317 struct nand_chip *chip = mtd->priv; 2305 struct nand_chip *chip = mtd->priv;
2318 struct nand_flash_dev *type; 2306 struct nand_flash_dev *type;
2319 2307
2320 /* Many callers got this wrong, so check for it for a while... */
2321 if (!mtd->owner && caller_is_module()) {
2322 printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
2323 BUG();
2324 }
2325
2326 /* Get buswidth to select the correct functions */ 2308 /* Get buswidth to select the correct functions */
2327 busw = chip->options & NAND_BUSWIDTH_16; 2309 busw = chip->options & NAND_BUSWIDTH_16;
2328 /* Set the default functions */ 2310 /* Set the default functions */
@@ -2354,6 +2336,24 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
2354 chip->numchips = i; 2336 chip->numchips = i;
2355 mtd->size = i * chip->chipsize; 2337 mtd->size = i * chip->chipsize;
2356 2338
2339 return 0;
2340}
2341
2342
2343/**
2344 * nand_scan_tail - [NAND Interface] Scan for the NAND device
2345 * @mtd: MTD device structure
2346 * @maxchips: Number of chips to scan for
2347 *
2348 * This is the second phase of the normal nand_scan() function. It
2349 * fills out all the uninitialized function pointers with the defaults
2350 * and scans for a bad block table if appropriate.
2351 */
2352int nand_scan_tail(struct mtd_info *mtd)
2353{
2354 int i;
2355 struct nand_chip *chip = mtd->priv;
2356
2357 /* Preset the internal oob write buffer */ 2357 /* Preset the internal oob write buffer */
2358 memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize); 2358 memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize);
2359 2359
@@ -2504,6 +2504,44 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
2504 return chip->scan_bbt(mtd); 2504 return chip->scan_bbt(mtd);
2505} 2505}
2506 2506
2507/* module_text_address() isn't exported, and it's mostly a pointless
2508 test if this is a module _anyway_ -- they'd have to try _really_ hard
2509 to call us from in-kernel code if the core NAND support is modular. */
2510#ifdef MODULE
2511#define caller_is_module() (1)
2512#else
2513#define caller_is_module() \
2514 module_text_address((unsigned long)__builtin_return_address(0))
2515#endif
2516
2517/**
2518 * nand_scan - [NAND Interface] Scan for the NAND device
2519 * @mtd: MTD device structure
2520 * @maxchips: Number of chips to scan for
2521 *
2522 * This fills out all the uninitialized function pointers
2523 * with the defaults.
2524 * The flash ID is read and the mtd/chip structures are
2525 * filled with the appropriate values.
2526 * The mtd->owner field must be set to the module of the caller
2527 *
2528 */
2529int nand_scan(struct mtd_info *mtd, int maxchips)
2530{
2531 int ret;
2532
2533 /* Many callers got this wrong, so check for it for a while... */
2534 if (!mtd->owner && caller_is_module()) {
2535 printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
2536 BUG();
2537 }
2538
2539 ret = nand_scan_ident(mtd, maxchips);
2540 if (!ret)
2541 ret = nand_scan_tail(mtd);
2542 return ret;
2543}
2544
2507/** 2545/**
2508 * nand_release - [NAND Interface] Free resources held by the NAND device 2546 * nand_release - [NAND Interface] Free resources held by the NAND device
2509 * @mtd: MTD device structure 2547 * @mtd: MTD device structure
@@ -2524,6 +2562,8 @@ void nand_release(struct mtd_info *mtd)
2524} 2562}
2525 2563
2526EXPORT_SYMBOL_GPL(nand_scan); 2564EXPORT_SYMBOL_GPL(nand_scan);
2565EXPORT_SYMBOL_GPL(nand_scan_ident);
2566EXPORT_SYMBOL_GPL(nand_scan_tail);
2527EXPORT_SYMBOL_GPL(nand_release); 2567EXPORT_SYMBOL_GPL(nand_release);
2528 2568
2529static int __init nand_base_init(void) 2569static int __init nand_base_init(void)
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 0b4cd2fa64aa..88d690d79d77 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -27,6 +27,11 @@
27struct mtd_info; 27struct mtd_info;
28/* Scan and identify a NAND device */ 28/* Scan and identify a NAND device */
29extern int nand_scan (struct mtd_info *mtd, int max_chips); 29extern int nand_scan (struct mtd_info *mtd, int max_chips);
30/* Separate phases of nand_scan(), allowing board driver to intervene
31 * and override command or ECC setup according to flash type */
32extern int nand_scan_ident(struct mtd_info *mtd, int max_chips);
33extern int nand_scan_tail(struct mtd_info *mtd);
34
30/* Free resources held by the NAND device */ 35/* Free resources held by the NAND device */
31extern void nand_release (struct mtd_info *mtd); 36extern void nand_release (struct mtd_info *mtd);
32 37