From c4a247d26228b2506fcb1c5cac2302a22e91219e Mon Sep 17 00:00:00 2001 From: Rik Faith Date: Wed, 21 Feb 2001 16:06:10 +0000 Subject: Add Linux 2.2.x support for stubs --- linux-core/drm_stub.c | 13 ++++++++++--- linux/compat-pre24.h | 1 + linux/drm_stub.h | 13 ++++++++++--- linux/stubsupport-pre24.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 linux/stubsupport-pre24.h diff --git a/linux-core/drm_stub.c b/linux-core/drm_stub.c index a6a39d86..bc958796 100644 --- a/linux-core/drm_stub.c +++ b/linux-core/drm_stub.c @@ -31,6 +31,10 @@ #define __NO_VERSION__ #include "drmP.h" +#if LINUX_VERSION_CODE < 0x020400 +#include "stubsupport-pre24.h" +#endif + #define DRM_STUB_MAXCARDS 16 /* Enough for one machine */ static struct drm_stub_list { @@ -120,10 +124,13 @@ static int DRM(stub_putminor)(int minor) int DRM(stub_register)(const char *name, struct file_operations *fops, drm_device_t *dev) { - if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) { - /* Already registered */ - struct drm_stub_info *i; + struct drm_stub_info *i = NULL; + + if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) i = (struct drm_stub_info *)inter_module_get("drm"); + + if (i) { + /* Already registered */ DRM(stub_info).info_register = i->info_register; DRM(stub_info).info_unregister = i->info_unregister; } else { diff --git a/linux/compat-pre24.h b/linux/compat-pre24.h index f6dae008..0ad96b12 100644 --- a/linux/compat-pre24.h +++ b/linux/compat-pre24.h @@ -45,6 +45,7 @@ /* This is a hack that only works for this code base -- because we always call this with dev->tq.* */ +#undef INIT_LIST_HEAD #define INIT_LIST_HEAD(pointer) dev->tq.next = NULL #endif diff --git a/linux/drm_stub.h b/linux/drm_stub.h index a6a39d86..bc958796 100644 --- a/linux/drm_stub.h +++ b/linux/drm_stub.h @@ -31,6 +31,10 @@ #define __NO_VERSION__ #include "drmP.h" +#if LINUX_VERSION_CODE < 0x020400 +#include "stubsupport-pre24.h" +#endif + #define DRM_STUB_MAXCARDS 16 /* Enough for one machine */ static struct drm_stub_list { @@ -120,10 +124,13 @@ static int DRM(stub_putminor)(int minor) int DRM(stub_register)(const char *name, struct file_operations *fops, drm_device_t *dev) { - if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) { - /* Already registered */ - struct drm_stub_info *i; + struct drm_stub_info *i = NULL; + + if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) i = (struct drm_stub_info *)inter_module_get("drm"); + + if (i) { + /* Already registered */ DRM(stub_info).info_register = i->info_register; DRM(stub_info).info_unregister = i->info_unregister; } else { diff --git a/linux/stubsupport-pre24.h b/linux/stubsupport-pre24.h new file mode 100644 index 00000000..f5046f7f --- /dev/null +++ b/linux/stubsupport-pre24.h @@ -0,0 +1,44 @@ +/* stubsupport.h -- -*- linux-c -*- + * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org + * + * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * + */ + +#ifndef _STUBSUPPORT_PRE24_H_ +#define _STUBSUPPORT_PRE24_H_ +struct drm_stub_info *DRM(_stub_pointer) = NULL; +#define inter_module_put(x) +#define inter_module_unregister(x) +#define inter_module_get(x) DRM(_stub_pointer) +#define inter_module_register(x,y,z) do { DRM(_stub_pointer) = z; } while (0) + + /* This is a kludge for backward compatibility + that is only useful in DRM(stub_open) */ +#define fops_put(fops) MOD_DEC_USE_COUNT +#define fops_get(fops) (fops); MOD_INC_USE_COUNT + +#endif -- cgit v1.2.3