
From: Rusty Russell <rusty@rustcorp.com.au>

Gets rid of inter_module from mtd drivers.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/mtd/chips/cfi_cmdset_0001.c |   18 ++++--------------
 25-akpm/drivers/mtd/chips/cfi_cmdset_0002.c |   20 +-------------------
 25-akpm/drivers/mtd/chips/cfi_cmdset_0020.c |   24 +-----------------------
 25-akpm/drivers/mtd/chips/gen_probe.c       |    8 ++++----
 25-akpm/drivers/mtd/devices/Makefile        |    7 -------
 25-akpm/drivers/mtd/devices/doc2000.c       |   15 +++------------
 25-akpm/drivers/mtd/devices/doc2001.c       |   15 +++------------
 25-akpm/drivers/mtd/devices/doc2001plus.c   |   13 +++----------
 25-akpm/drivers/mtd/devices/docprobe.c      |    4 ++--
 25-akpm/include/linux/mtd/cfi.h             |    1 -
 10 files changed, 21 insertions(+), 104 deletions(-)

diff -puN drivers/mtd/chips/cfi_cmdset_0001.c~remove-inter-module-mtd drivers/mtd/chips/cfi_cmdset_0001.c
--- 25/drivers/mtd/chips/cfi_cmdset_0001.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/chips/cfi_cmdset_0001.c	Fri Apr  8 17:19:28 2005
@@ -298,13 +298,6 @@ read_pri_intelext(struct map_info *map, 
 	return extp;
 }
 
-/* This routine is made available to other mtd code via
- * inter_module_register.  It must only be accessed through
- * inter_module_get which will bump the use count of this module.  The
- * addresses passed back in cfi are valid as long as the use count of
- * this module is non-zero, i.e. between inter_module_get and
- * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
- */
 struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary)
 {
 	struct cfi_private *cfi = map->fldrv_priv;
@@ -2302,22 +2295,19 @@ static void cfi_intelext_destroy(struct 
 	kfree(mtd->eraseregions);
 }
 
-static char im_name_1[]="cfi_cmdset_0001";
-static char im_name_3[]="cfi_cmdset_0003";
-
 static int __init cfi_intelext_init(void)
 {
-	inter_module_register(im_name_1, THIS_MODULE, &cfi_cmdset_0001);
-	inter_module_register(im_name_3, THIS_MODULE, &cfi_cmdset_0001);
 	return 0;
 }
 
 static void __exit cfi_intelext_exit(void)
 {
-	inter_module_unregister(im_name_1);
-	inter_module_unregister(im_name_3);
 }
 
+struct mtd_info *cfi_cmdset_0003(struct map_info *map, int primary) __attribute__((alias("cfi_cmdset_0001")));
+EXPORT_SYMBOL(cfi_cmdset_0001);
+EXPORT_SYMBOL(cfi_cmdset_0003);
+
 module_init(cfi_intelext_init);
 module_exit(cfi_intelext_exit);
 
diff -puN drivers/mtd/chips/cfi_cmdset_0002.c~remove-inter-module-mtd drivers/mtd/chips/cfi_cmdset_0002.c
--- 25/drivers/mtd/chips/cfi_cmdset_0002.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/chips/cfi_cmdset_0002.c	Fri Apr  8 17:18:32 2005
@@ -1491,25 +1491,7 @@ static void cfi_amdstd_destroy(struct mt
 	kfree(mtd->eraseregions);
 }
 
-static char im_name[]="cfi_cmdset_0002";
-
-
-static int __init cfi_amdstd_init(void)
-{
-	inter_module_register(im_name, THIS_MODULE, &cfi_cmdset_0002);
-	return 0;
-}
-
-
-static void __exit cfi_amdstd_exit(void)
-{
-	inter_module_unregister(im_name);
-}
-
-
-module_init(cfi_amdstd_init);
-module_exit(cfi_amdstd_exit);
-
+EXPORT_SYMBOL(cfi_cmdset_0002);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Crossnet Co. <info@crossnet.co.jp> et al.");
 MODULE_DESCRIPTION("MTD chip driver for AMD/Fujitsu flash chips");
diff -puN drivers/mtd/chips/cfi_cmdset_0020.c~remove-inter-module-mtd drivers/mtd/chips/cfi_cmdset_0020.c
--- 25/drivers/mtd/chips/cfi_cmdset_0020.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/chips/cfi_cmdset_0020.c	Fri Apr  8 17:18:32 2005
@@ -106,13 +106,6 @@ static void cfi_tell_features(struct cfi
 }
 #endif
 
-/* This routine is made available to other mtd code via
- * inter_module_register.  It must only be accessed through
- * inter_module_get which will bump the use count of this module.  The
- * addresses passed back in cfi are valid as long as the use count of
- * this module is non-zero, i.e. between inter_module_get and
- * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
- */
 struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
 {
 	struct cfi_private *cfi = map->fldrv_priv;
@@ -152,6 +145,7 @@ struct mtd_info *cfi_cmdset_0020(struct 
 
 	return cfi_staa_setup(map);
 }
+EXPORT_SYMBOL(cfi_cmdset_0020);
 
 static struct mtd_info *cfi_staa_setup(struct map_info *map)
 {
@@ -1399,20 +1393,4 @@ static void cfi_staa_destroy(struct mtd_
 	kfree(cfi);
 }
 
-static char im_name[]="cfi_cmdset_0020";
-
-static int __init cfi_staa_init(void)
-{
-	inter_module_register(im_name, THIS_MODULE, &cfi_cmdset_0020);
-	return 0;
-}
-
-static void __exit cfi_staa_exit(void)
-{
-	inter_module_unregister(im_name);
-}
-
-module_init(cfi_staa_init);
-module_exit(cfi_staa_exit);
-
 MODULE_LICENSE("GPL");
diff -puN drivers/mtd/chips/gen_probe.c~remove-inter-module-mtd drivers/mtd/chips/gen_probe.c
--- 25/drivers/mtd/chips/gen_probe.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/chips/gen_probe.c	Fri Apr  8 17:18:32 2005
@@ -194,20 +194,20 @@ static inline struct mtd_info *cfi_cmdse
 {
 	struct cfi_private *cfi = map->fldrv_priv;
 	__u16 type = primary?cfi->cfiq->P_ID:cfi->cfiq->A_ID;
-#if defined(CONFIG_MODULES) && defined(HAVE_INTER_MODULE)
+#ifdef CONFIG_MODULES
 	char probename[32];
 	cfi_cmdset_fn_t *probe_function;
 
 	sprintf(probename, "cfi_cmdset_%4.4X", type);
-		
-	probe_function = inter_module_get_request(probename, probename);
 
+	probe_function = try_then_request_module(__symbol_get(probename),
+						 probename);
 	if (probe_function) {
 		struct mtd_info *mtd;
 
 		mtd = (*probe_function)(map, primary);
 		/* If it was happy, it'll have increased its own use count */
-		inter_module_put(probename);
+		__symbol_put(probename);
 		return mtd;
 	}
 #endif
diff -puN drivers/mtd/devices/doc2000.c~remove-inter-module-mtd drivers/mtd/devices/doc2000.c
--- 25/drivers/mtd/devices/doc2000.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/devices/doc2000.c	Fri Apr  8 17:18:32 2005
@@ -516,16 +516,7 @@ static int DoC2k_is_alias(struct DiskOnC
 	return retval;
 }
 
-static const char im_name[] = "DoC2k_init";
-
-/* This routine is made available to other mtd code via
- * inter_module_register.  It must only be accessed through
- * inter_module_get which will bump the use count of this module.  The
- * addresses passed back in mtd are valid as long as the use count of
- * this module is non-zero, i.e. between inter_module_get and
- * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
- */
-static void DoC2k_init(struct mtd_info *mtd)
+void DoC2k_init(struct mtd_info *mtd)
 {
 	struct DiskOnChip *this = mtd->priv;
 	struct DiskOnChip *old = NULL;
@@ -1278,7 +1269,6 @@ static int doc_erase(struct mtd_info *mt
 
 static int __init init_doc2000(void)
 {
-       inter_module_register(im_name, THIS_MODULE, &DoC2k_init);
        return 0;
 }
 
@@ -1297,9 +1287,10 @@ static void __exit cleanup_doc2000(void)
 		kfree(this->chips);
 		kfree(mtd);
 	}
-	inter_module_unregister(im_name);
 }
 
+EXPORT_SYMBOL(DoC2k_init);
+
 module_exit(cleanup_doc2000);
 module_init(init_doc2000);
 
diff -puN drivers/mtd/devices/doc2001.c~remove-inter-module-mtd drivers/mtd/devices/doc2001.c
--- 25/drivers/mtd/devices/doc2001.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/devices/doc2001.c	Fri Apr  8 17:18:32 2005
@@ -324,16 +324,7 @@ static int DoCMil_is_alias(struct DiskOn
 	return retval;
 }
 
-static const char im_name[] = "DoCMil_init";
-
-/* This routine is made available to other mtd code via
- * inter_module_register.  It must only be accessed through
- * inter_module_get which will bump the use count of this module.  The
- * addresses passed back in mtd are valid as long as the use count of
- * this module is non-zero, i.e. between inter_module_get and
- * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
- */
-static void DoCMil_init(struct mtd_info *mtd)
+void DoCMil_init(struct mtd_info *mtd)
 {
 	struct DiskOnChip *this = mtd->priv;
 	struct DiskOnChip *old = NULL;
@@ -858,7 +849,6 @@ int doc_erase (struct mtd_info *mtd, str
 
 static int __init init_doc2001(void)
 {
-	inter_module_register(im_name, THIS_MODULE, &DoCMil_init);
 	return 0;
 }
 
@@ -877,12 +867,13 @@ static void __exit cleanup_doc2001(void)
 		kfree(this->chips);
 		kfree(mtd);
 	}
-	inter_module_unregister(im_name);
 }
 
 module_exit(cleanup_doc2001);
 module_init(init_doc2001);
 
+EXPORT_SYMBOL(DoCMil_init);
+
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org> et al.");
 MODULE_DESCRIPTION("Alternative driver for DiskOnChip Millennium");
diff -puN drivers/mtd/devices/doc2001plus.c~remove-inter-module-mtd drivers/mtd/devices/doc2001plus.c
--- 25/drivers/mtd/devices/doc2001plus.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/devices/doc2001plus.c	Fri Apr  8 17:18:32 2005
@@ -447,16 +447,10 @@ static int DoCMilPlus_is_alias(struct Di
 	return retval;
 }
 
-static const char im_name[] = "DoCMilPlus_init";
-
 /* This routine is made available to other mtd code via
- * inter_module_register.  It must only be accessed through
- * inter_module_get which will bump the use count of this module.  The
- * addresses passed back in mtd are valid as long as the use count of
- * this module is non-zero, i.e. between inter_module_get and
- * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
+ * EXPORT_SYMBOL().
  */
-static void DoCMilPlus_init(struct mtd_info *mtd)
+void DoCMilPlus_init(struct mtd_info *mtd)
 {
 	struct DiskOnChip *this = mtd->priv;
 	struct DiskOnChip *old = NULL;
@@ -524,6 +518,7 @@ static void DoCMilPlus_init(struct mtd_i
 		return;
 	}
 }
+EXPORT_SYMBOL(DoCMilPlus_init);
 
 #if 0
 static int doc_dumpblk(struct mtd_info *mtd, loff_t from)
@@ -1124,7 +1119,6 @@ int doc_erase(struct mtd_info *mtd, stru
 
 static int __init init_doc2001plus(void)
 {
-	inter_module_register(im_name, THIS_MODULE, &DoCMilPlus_init);
 	return 0;
 }
 
@@ -1143,7 +1137,6 @@ static void __exit cleanup_doc2001plus(v
 		kfree(this->chips);
 		kfree(mtd);
 	}
-	inter_module_unregister(im_name);
 }
 
 module_exit(cleanup_doc2001plus);
diff -puN drivers/mtd/devices/docprobe.c~remove-inter-module-mtd drivers/mtd/devices/docprobe.c
--- 25/drivers/mtd/devices/docprobe.c~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/devices/docprobe.c	Fri Apr  8 17:18:32 2005
@@ -308,11 +308,11 @@ static void __init DoC_Probe(unsigned lo
 		}
 
 		if (im_funcname)
-			initroutine = inter_module_get_request(im_funcname, im_modname);
+			initroutine = try_then_request_module(__symbol_get(im_funcname), im_modname);
 
 		if (initroutine) {
 			(*initroutine)(mtd);
-			inter_module_put(im_funcname);
+			__symbol_put(im_funcname);
 			return;
 		}
 		printk(KERN_NOTICE "Cannot find driver for DiskOnChip %s at 0x%lX\n", name, physadr);
diff -puN drivers/mtd/devices/Makefile~remove-inter-module-mtd drivers/mtd/devices/Makefile
--- 25/drivers/mtd/devices/Makefile~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/drivers/mtd/devices/Makefile	Fri Apr  8 17:18:32 2005
@@ -3,13 +3,6 @@
 #
 # $Id: Makefile.common,v 1.7 2004/12/22 17:51:15 joern Exp $
 
-#                       *** BIG UGLY NOTE ***
-#
-# The removal of get_module_symbol() and replacement with
-# inter_module_register() et al has introduced a link order dependency
-# here where previously there was none.  We now have to ensure that
-# doc200[01].o are linked before docprobe.o
-
 obj-$(CONFIG_MTD_DOC2000)	+= doc2000.o
 obj-$(CONFIG_MTD_DOC2001)	+= doc2001.o
 obj-$(CONFIG_MTD_DOC2001PLUS)	+= doc2001plus.o
diff -puN include/linux/mtd/cfi.h~remove-inter-module-mtd include/linux/mtd/cfi.h
--- 25/include/linux/mtd/cfi.h~remove-inter-module-mtd	Fri Apr  8 17:18:32 2005
+++ 25-akpm/include/linux/mtd/cfi.h	Fri Apr  8 17:18:32 2005
@@ -235,7 +235,6 @@ struct cfi_private {
 	int mfr, id;
 	int numchips;
 	unsigned long chipshift; /* Because they're of the same type */
-	const char *im_name;	 /* inter_module name for cmdset_setup */
 	struct flchip chips[0];  /* per-chip data structure for each chip */
 };
 
_
