[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:
@@ -2289,40 +2289,22 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
|
|||||||
return type;
|
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
|
* nand_scan_ident - [NAND Interface] Scan for the NAND device
|
||||||
* @mtd: MTD device structure
|
* @mtd: MTD device structure
|
||||||
* @maxchips: Number of chips to scan for
|
* @maxchips: Number of chips to scan for
|
||||||
*
|
*
|
||||||
* This fills out all the uninitialized function pointers
|
* This is the first phase of the normal nand_scan() function. It
|
||||||
* with the defaults.
|
* reads the flash ID and sets up MTD fields accordingly.
|
||||||
* 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
|
|
||||||
*
|
*
|
||||||
|
* 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;
|
int i, busw, nand_maf_id;
|
||||||
struct nand_chip *chip = mtd->priv;
|
struct nand_chip *chip = mtd->priv;
|
||||||
struct nand_flash_dev *type;
|
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 */
|
/* Get buswidth to select the correct functions */
|
||||||
busw = chip->options & NAND_BUSWIDTH_16;
|
busw = chip->options & NAND_BUSWIDTH_16;
|
||||||
/* Set the default functions */
|
/* Set the default functions */
|
||||||
@@ -2354,6 +2336,24 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
|||||||
chip->numchips = i;
|
chip->numchips = i;
|
||||||
mtd->size = i * chip->chipsize;
|
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 */
|
/* Preset the internal oob write buffer */
|
||||||
memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize);
|
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);
|
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
|
* nand_release - [NAND Interface] Free resources held by the NAND device
|
||||||
* @mtd: MTD device structure
|
* @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);
|
||||||
|
EXPORT_SYMBOL_GPL(nand_scan_ident);
|
||||||
|
EXPORT_SYMBOL_GPL(nand_scan_tail);
|
||||||
EXPORT_SYMBOL_GPL(nand_release);
|
EXPORT_SYMBOL_GPL(nand_release);
|
||||||
|
|
||||||
static int __init nand_base_init(void)
|
static int __init nand_base_init(void)
|
||||||
|
@@ -27,6 +27,11 @@
|
|||||||
struct mtd_info;
|
struct mtd_info;
|
||||||
/* Scan and identify a NAND device */
|
/* Scan and identify a NAND device */
|
||||||
extern int nand_scan (struct mtd_info *mtd, int max_chips);
|
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 */
|
/* Free resources held by the NAND device */
|
||||||
extern void nand_release (struct mtd_info *mtd);
|
extern void nand_release (struct mtd_info *mtd);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user