mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
[MTD NAND] Split nand_scan() into two parts; allow board driver to intervene
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
4b648b0253
commit
3b85c3211e
@ -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)
|
||||
|
@ -27,6 +27,11 @@
|
||||
struct mtd_info;
|
||||
/* Scan and identify a NAND device */
|
||||
extern int nand_scan (struct mtd_info *mtd, int max_chips);
|
||||
/* Separate phases of nand_scan(), allowing board driver to intervene
|
||||
* and override command or ECC setup according to flash type */
|
||||
extern int nand_scan_ident(struct mtd_info *mtd, int max_chips);
|
||||
extern int nand_scan_tail(struct mtd_info *mtd);
|
||||
|
||||
/* Free resources held by the NAND device */
|
||||
extern void nand_release (struct mtd_info *mtd);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user