From: Rusty Russell 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 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 */ _