[MTD] Fix module refcounting in NAND board drivers.
The _board_ driver needs to be mtd->owner, and it in turn pins the nand.ko module. Fix them all to actually do that, and fix nand.ko not to overwrite it -- and also to check that the caller sets it, if the caller is a module. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
4f678a58d3
commit
552d920518
|
@ -345,6 +345,7 @@ int __init au1xxx_nand_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
au1550_mtd->priv = this;
|
||||
au1550_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* disable interrupts */
|
||||
au_writel(au_readl(MEM_STNDCTL) & ~(1 << 8), MEM_STNDCTL);
|
||||
|
|
|
@ -154,6 +154,7 @@ int __init autcpu12_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
autcpu12_mtd->priv = this;
|
||||
autcpu12_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* Set address of NAND IO lines */
|
||||
this->IO_ADDR_R = autcpu12_fio_base;
|
||||
|
|
|
@ -223,6 +223,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
new_mtd->priv = this;
|
||||
new_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* map physical address */
|
||||
this->IO_ADDR_R = this->IO_ADDR_W = ioremap(adr, 4096);
|
||||
|
@ -255,7 +256,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
|
|||
goto out_ior;
|
||||
}
|
||||
|
||||
new_mtd->owner = THIS_MODULE;
|
||||
cs553x_mtd[cs] = new_mtd;
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -148,6 +148,7 @@ static int __init ep7312_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
ep7312_mtd->priv = this;
|
||||
ep7312_mtd->owner = THIS_MODULE;
|
||||
|
||||
/*
|
||||
* Set GPIO Port B control register so that the pins are configured
|
||||
|
|
|
@ -135,6 +135,7 @@ static int __init h1910_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
h1910_nand_mtd->priv = this;
|
||||
h1910_nand_mtd->owner = THIS_MODULE;
|
||||
|
||||
/*
|
||||
* Enable VPEN
|
||||
|
|
|
@ -69,6 +69,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
|
@ -2316,11 +2317,12 @@ static void nand_resume(struct mtd_info *mtd)
|
|||
* @mtd: MTD device structure
|
||||
* @maxchips: Number of chips to scan for
|
||||
*
|
||||
* This fills out all the not initialized function pointers
|
||||
* 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. Buffers are allocated if
|
||||
* they are not provided by the board driver
|
||||
* The mtd->owner field must be set to the module of the caller
|
||||
*
|
||||
*/
|
||||
int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
|
@ -2328,6 +2330,16 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
|||
int i, nand_maf_id, nand_dev_id, busw, maf_id;
|
||||
struct nand_chip *this = mtd->priv;
|
||||
|
||||
/* module_text_address() isn't exported. But if _this_ is a module,
|
||||
it's a fairly safe bet that its caller is a module too... and
|
||||
that means the call to module_text_address() gets optimised out
|
||||
without having to resort to ifdefs */
|
||||
if (!mtd->owner && (THIS_MODULE ||
|
||||
module_text_address((unsigned long)__builtin_return_address(0)))) {
|
||||
printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* Get buswidth to select the correct functions */
|
||||
busw = this->options & NAND_BUSWIDTH_16;
|
||||
|
||||
|
@ -2676,8 +2688,6 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
|||
/* and make the autooob the default one */
|
||||
memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo));
|
||||
|
||||
mtd->owner = THIS_MODULE;
|
||||
|
||||
/* Check, if we should skip the bad block table scan */
|
||||
if (this->options & NAND_SKIP_BBTSCAN)
|
||||
return 0;
|
||||
|
|
|
@ -1546,6 +1546,8 @@ static int __init ns_init_module(void)
|
|||
chip->options |= NAND_BUSWIDTH_16;
|
||||
}
|
||||
|
||||
nsmtd->owner = THIS_MODULE;
|
||||
|
||||
if ((retval = nand_scan(nsmtd, 1)) != 0) {
|
||||
NS_ERR("can't register NAND Simulator\n");
|
||||
if (retval > 0)
|
||||
|
|
|
@ -221,6 +221,7 @@ static int __init ppchameleonevb_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
ppchameleon_mtd->priv = this;
|
||||
ppchameleon_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* Initialize GPIOs */
|
||||
/* Pin mapping for NAND chip */
|
||||
|
|
|
@ -538,6 +538,7 @@ int __init rtc_from4_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
rtc_from4_mtd->priv = this;
|
||||
rtc_from4_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* set area 5 as PCMCIA mode to clear the spec of tDH(Data hold time;9ns min) */
|
||||
bcr1 = *SH77X9_BCR1 & ~0x0002;
|
||||
|
|
|
@ -516,6 +516,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
|
|||
|
||||
nmtd->info = info;
|
||||
nmtd->mtd.priv = chip;
|
||||
nmtd->mtd.owner = THIS_MODULE;
|
||||
nmtd->set = set;
|
||||
|
||||
if (hardware_ecc) {
|
||||
|
|
|
@ -185,6 +185,7 @@ int __init sharpsl_nand_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
sharpsl_mtd->priv = this;
|
||||
sharpsl_mtd->owner = THIS_MODULE;
|
||||
|
||||
/*
|
||||
* PXA initialize
|
||||
|
|
|
@ -121,6 +121,7 @@ int __init spia_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
spia_mtd->priv = this;
|
||||
spia_mtd->owner = THIS_MODULE;
|
||||
|
||||
/*
|
||||
* Set GPIO Port E control register so that the pins are configured
|
||||
|
|
|
@ -137,6 +137,7 @@ int __init toto_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
toto_mtd->priv = this;
|
||||
toto_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* Set address of NAND IO lines */
|
||||
this->IO_ADDR_R = toto_io_base;
|
||||
|
|
|
@ -147,6 +147,7 @@ static int __init ts7250_init(void)
|
|||
|
||||
/* Link the private data with the MTD structure */
|
||||
ts7250_mtd->priv = this;
|
||||
ts7250_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* insert callbacks */
|
||||
this->IO_ADDR_R = (void *)TS72XX_NAND_DATA_VIRT_BASE;
|
||||
|
|
Loading…
Reference in New Issue