mirror of https://gitee.com/openkylin/linux.git
[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:
parent
3d12c0c75d
commit
ecde263130
|
@ -231,26 +231,9 @@ static inline int __init doccheck(void __iomem *potential, unsigned long physadr
|
|||
|
||||
static int docfound;
|
||||
|
||||
#ifdef CONFIG_MTD_DOC2000
|
||||
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 *);
|
||||
#define docmil_initfunc (&DoCMil_init)
|
||||
#else
|
||||
#define docmil_initfunc NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MTD_DOC2001PLUS
|
||||
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)
|
||||
{
|
||||
|
@ -260,8 +243,6 @@ static void __init DoC_Probe(unsigned long physadr)
|
|||
int ChipID;
|
||||
char namebuf[15];
|
||||
char *name = namebuf;
|
||||
char *im_funcname = NULL;
|
||||
char *im_modname = NULL;
|
||||
void (*initroutine)(struct mtd_info *) = NULL;
|
||||
|
||||
docptr = ioremap(physadr, DOC_IOREMAP_LEN);
|
||||
|
@ -299,48 +280,30 @@ static void __init DoC_Probe(unsigned long physadr)
|
|||
switch(ChipID) {
|
||||
case DOC_ChipID_Doc2kTSOP:
|
||||
name="2000 TSOP";
|
||||
im_funcname = "DoC2k_init";
|
||||
im_modname = "doc2000";
|
||||
initroutine = doc2k_initfunc;
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
break;
|
||||
|
||||
case DOC_ChipID_Doc2k:
|
||||
name="2000";
|
||||
im_funcname = "DoC2k_init";
|
||||
im_modname = "doc2000";
|
||||
initroutine = doc2k_initfunc;
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMil:
|
||||
name="Millennium";
|
||||
#ifdef DOC_SINGLE_DRIVER
|
||||
im_funcname = "DoC2k_init";
|
||||
im_modname = "doc2000";
|
||||
initroutine = doc2k_initfunc;
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
#else
|
||||
im_funcname = "DoCMil_init";
|
||||
im_modname = "doc2001";
|
||||
initroutine = docmil_initfunc;
|
||||
initroutine = symbol_request(DoCMil_init);
|
||||
#endif /* DOC_SINGLE_DRIVER */
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMilPlus16:
|
||||
case DOC_ChipID_DocMilPlus32:
|
||||
name="MillenniumPlus";
|
||||
im_funcname = "DoCMilPlus_init";
|
||||
im_modname = "doc2001plus";
|
||||
initroutine = docmplus_initfunc;
|
||||
initroutine = symbol_request(DoCMilPlus_init);
|
||||
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) {
|
||||
(*initroutine)(mtd);
|
||||
symbol_put_addr(initroutine);
|
||||
|
|
Loading…
Reference in New Issue