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

DRM has a soft dependency on AGP (it will use it if it's there).  Instead
of using inter_module_register et.  al, simply export the symbol from agp,
and use symbol_get() and symbol_put in DRM.



 25-akpm/drivers/char/agp/backend.c        |    7 ++-----
 25-akpm/drivers/char/drm/drm_agpsupport.h |    4 ++--
 25-akpm/include/linux/agp_backend.h       |    9 +++------
 3 files changed, 7 insertions(+), 13 deletions(-)

diff -puN drivers/char/agp/backend.c~drm-agp-module-dependency-fix drivers/char/agp/backend.c
--- 25/drivers/char/agp/backend.c~drm-agp-module-dependency-fix	Mon Nov  3 16:23:32 2003
+++ 25-akpm/drivers/char/agp/backend.c	Mon Nov  3 16:23:32 2003
@@ -214,7 +214,7 @@ static void agp_backend_cleanup(struct a
 				phys_to_virt(bridge->scratch_page_real));
 }
 
-static const drm_agp_t drm_agp = {
+const drm_agp_t drm_agp = {
 	&agp_free_memory,
 	&agp_allocate_memory,
 	&agp_bind_memory,
@@ -224,6 +224,7 @@ static const drm_agp_t drm_agp = {
 	&agp_backend_release,
 	&agp_copy_info
 };
+EXPORT_SYMBOL(drm_agp);
 
 /* XXX Kludge alert: agpgart isn't ready for multiple bridges yet */
 struct agp_bridge_data *agp_alloc_bridge(void)
@@ -274,9 +275,6 @@ int agp_add_bridge(struct agp_bridge_dat
 		goto frontend_err;
 	}
 
-	/* FIXME: What to do with this? */
-	inter_module_register("drm_agp", THIS_MODULE, &drm_agp);
-
 	agp_count++;
 	return 0;
 
@@ -295,7 +293,6 @@ void agp_remove_bridge(struct agp_bridge
 	bridge->type = NOT_SUPPORTED;
 	agp_frontend_cleanup();
 	agp_backend_cleanup(bridge);
-	inter_module_unregister("drm_agp");
 	agp_count--;
 	module_put(bridge->driver->owner);
 }
diff -puN drivers/char/drm/drm_agpsupport.h~drm-agp-module-dependency-fix drivers/char/drm/drm_agpsupport.h
--- 25/drivers/char/drm/drm_agpsupport.h~drm-agp-module-dependency-fix	Mon Nov  3 16:23:32 2003
+++ 25-akpm/drivers/char/drm/drm_agpsupport.h	Mon Nov  3 16:23:32 2003
@@ -37,8 +37,8 @@
 #if __REALLY_HAVE_AGP
 
 
-#define DRM_AGP_GET (drm_agp_t *)inter_module_get("drm_agp")
-#define DRM_AGP_PUT inter_module_put("drm_agp")
+#define DRM_AGP_GET symbol_get(agp_drm)
+#define DRM_AGP_PUT symbol_put(agp_drm)
 
 /**
  * Pointer to the drm_agp_t structure made available by the agpgart module.
diff -puN include/linux/agp_backend.h~drm-agp-module-dependency-fix include/linux/agp_backend.h
--- 25/include/linux/agp_backend.h~drm-agp-module-dependency-fix	Mon Nov  3 16:23:32 2003
+++ 25-akpm/include/linux/agp_backend.h	Mon Nov  3 16:23:32 2003
@@ -96,11 +96,7 @@ extern void agp_enable(u32);
 extern int agp_backend_acquire(void);
 extern void agp_backend_release(void);
 
-/*
- * Interface between drm and agp code.  When agp initializes, it makes
- * the below structure available via inter_module_register(), drm might
- * use it.  Keith Owens <kaos@ocs.com.au> 28 Oct 2000.
- */
+/* Interface between drm and agp code. */
 typedef struct {
 	void			(*free_memory)(struct agp_memory *);
 	struct agp_memory *	(*allocate_memory)(size_t, u32);
@@ -112,7 +108,8 @@ typedef struct {
 	int			(*copy_info)(struct agp_kern_info *);
 } drm_agp_t;
 
-extern const drm_agp_t *drm_agp_p;
+/* Used by drm. */
+extern const drm_agp_t agp_drm;
 
 #endif				/* __KERNEL__ */
 #endif				/* _AGP_BACKEND_H */

_
