Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecde2631 authored by David Woodhouse's avatar David Woodhouse
Browse files

[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: default avatarDavid Woodhouse <dwmw2@infradead.org>
parent 3d12c0c7
Loading
Loading
Loading
Loading
+5 −42
Original line number Diff line number Diff line
@@ -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);