[MTD] Use symbol_request() in old DiskOnChip probe code to find actual driver

The previous code wouldn't work correctly on architectures which have a
non-empty MODULE_SYMBOL_PREFIX, and this version is neater if slightly
less optimal in the built-in case.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
David Woodhouse 2006-05-21 18:38:51 +01:00
parent 3d12c0c75d
commit ecde263130
1 changed files with 5 additions and 42 deletions

View File

@ -231,26 +231,9 @@ static inline int __init doccheck(void __iomem *potential, unsigned long physadr
static int docfound; static int docfound;
#ifdef CONFIG_MTD_DOC2000
extern void DoC2k_init(struct mtd_info *); extern void DoC2k_init(struct mtd_info *);
#define doc2k_initfunc (&DoC2k_init)
#else
#define doc2k_initfunc NULL
#endif
#ifdef CONFIG_MTD_DOC2001
extern void DoCMil_init(struct mtd_info *); extern void DoCMil_init(struct mtd_info *);
#define docmil_initfunc (&DoCMil_init)
#else
#define docmil_initfunc NULL
#endif
#ifdef CONFIG_MTD_DOC2001PLUS
extern void DoCMilPlus_init(struct mtd_info *); extern void DoCMilPlus_init(struct mtd_info *);
#define docmplus_initfunc (&DoCMilPlus_init)
#else
#define docmplus_initfunc NULL
#endif
static void __init DoC_Probe(unsigned long physadr) static void __init DoC_Probe(unsigned long physadr)
{ {
@ -260,8 +243,6 @@ static void __init DoC_Probe(unsigned long physadr)
int ChipID; int ChipID;
char namebuf[15]; char namebuf[15];
char *name = namebuf; char *name = namebuf;
char *im_funcname = NULL;
char *im_modname = NULL;
void (*initroutine)(struct mtd_info *) = NULL; void (*initroutine)(struct mtd_info *) = NULL;
docptr = ioremap(physadr, DOC_IOREMAP_LEN); docptr = ioremap(physadr, DOC_IOREMAP_LEN);
@ -299,48 +280,30 @@ static void __init DoC_Probe(unsigned long physadr)
switch(ChipID) { switch(ChipID) {
case DOC_ChipID_Doc2kTSOP: case DOC_ChipID_Doc2kTSOP:
name="2000 TSOP"; name="2000 TSOP";
im_funcname = "DoC2k_init"; initroutine = symbol_request(DoC2k_init);
im_modname = "doc2000";
initroutine = doc2k_initfunc;
break; break;
case DOC_ChipID_Doc2k: case DOC_ChipID_Doc2k:
name="2000"; name="2000";
im_funcname = "DoC2k_init"; initroutine = symbol_request(DoC2k_init);
im_modname = "doc2000";
initroutine = doc2k_initfunc;
break; break;
case DOC_ChipID_DocMil: case DOC_ChipID_DocMil:
name="Millennium"; name="Millennium";
#ifdef DOC_SINGLE_DRIVER #ifdef DOC_SINGLE_DRIVER
im_funcname = "DoC2k_init"; initroutine = symbol_request(DoC2k_init);
im_modname = "doc2000";
initroutine = doc2k_initfunc;
#else #else
im_funcname = "DoCMil_init"; initroutine = symbol_request(DoCMil_init);
im_modname = "doc2001";
initroutine = docmil_initfunc;
#endif /* DOC_SINGLE_DRIVER */ #endif /* DOC_SINGLE_DRIVER */
break; break;
case DOC_ChipID_DocMilPlus16: case DOC_ChipID_DocMilPlus16:
case DOC_ChipID_DocMilPlus32: case DOC_ChipID_DocMilPlus32:
name="MillenniumPlus"; name="MillenniumPlus";
im_funcname = "DoCMilPlus_init"; initroutine = symbol_request(DoCMilPlus_init);
im_modname = "doc2001plus";
initroutine = docmplus_initfunc;
break; break;
} }
#ifdef CONFIG_MODULES
if (im_funcname && !initroutine)
initroutine = __symbol_get(im_funcname);
if (im_funcname && !initroutine) {
request_module(im_modname);
initroutine = __symbol_get(im_funcname);
}
#endif
if (initroutine) { if (initroutine) {
(*initroutine)(mtd); (*initroutine)(mtd);
symbol_put_addr(initroutine); symbol_put_addr(initroutine);