From: Dominik Brodowski <linux@dominikbrodowski.de>

as it's so late, let's add a compatibility layer which allows for
CardServices usage as long as !x86_64



 drivers/pcmcia/Kconfig         |    9 ++
 drivers/pcmcia/Makefile        |    2 
 drivers/pcmcia/pcmcia_compat.c |  163 +++++++++++++++++++++++++++++++++++++++++
 include/pcmcia/compat.h        |   27 ++++++
 include/pcmcia/cs.h            |    2 
 5 files changed, 203 insertions(+)

diff -puN drivers/pcmcia/Kconfig~CardServices-compatibility-layer drivers/pcmcia/Kconfig
--- 25/drivers/pcmcia/Kconfig~CardServices-compatibility-layer	2003-12-30 13:20:25.000000000 -0800
+++ 25-akpm/drivers/pcmcia/Kconfig	2003-12-30 13:20:25.000000000 -0800
@@ -26,6 +26,15 @@ config PCMCIA
 	  To compile this driver as modules, choose M here: the
 	  modules will be called pcmcia_core and ds.
 
+config PCMCIA_COMPAT
+	tristate "Compatibility layer for out-of-tree PCMCIA drivers"
+	depends on PCMCIA && !X86_64
+	help
+	  Say Y or M here if you need to use out-of-tree PCMCIA drivers
+	  which still use deprecated interfaces to the PCMCIA core.
+
+	  If unsure, choose M here.
+
 config YENTA
 	tristate "CardBus yenta-compatible bridge support"
 	depends on PCMCIA && PCI
diff -puN drivers/pcmcia/Makefile~CardServices-compatibility-layer drivers/pcmcia/Makefile
--- 25/drivers/pcmcia/Makefile~CardServices-compatibility-layer	2003-12-30 13:20:25.000000000 -0800
+++ 25-akpm/drivers/pcmcia/Makefile	2003-12-30 13:20:25.000000000 -0800
@@ -38,3 +38,5 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD)		+= sa
 sa1100_cs-$(CONFIG_SA1100_STORK)		+= sa1100_stork.o
 sa1100_cs-$(CONFIG_SA1100_TRIZEPS) 		+= sa1100_trizeps.o
 sa1100_cs-$(CONFIG_SA1100_YOPY)			+= sa1100_yopy.o
+
+obj-$(CONFIG_PCMCIA_COMPAT)			+= pcmcia_compat.o
diff -puN /dev/null drivers/pcmcia/pcmcia_compat.c
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ 25-akpm/drivers/pcmcia/pcmcia_compat.c	2003-12-30 13:20:25.000000000 -0800
@@ -0,0 +1,163 @@
+/*
+ * drivers/pcmcia/pcmcia_compat.c - compatibility layer for 2.4. PCMCIA drivers
+ *
+ *
+ *  Copyright (C) 2003        Dominik Brodowski <linux@brodo.de>
+ *
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#define IN_CARD_SERVICES
+#include <pcmcia/version.h>
+#include <pcmcia/cs_types.h>
+#include <pcmcia/ss.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/bulkmem.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include "cs_internal.h"
+
+/* CardServices -- removed in 2.6.0-mm2 */
+
+int __deprecated CardServices(int func, void *a1, void *a2, void *a3)
+{
+	switch (func) {
+	case AccessConfigurationRegister:
+		return pcmcia_access_configuration_register(a1, a2); break;
+	case AdjustResourceInfo:
+		return pcmcia_adjust_resource_info(a1, a2); break;
+	case CheckEraseQueue:
+		return pcmcia_check_erase_queue(a1); break;
+	case CloseMemory:
+		return pcmcia_close_memory(a1); break;
+	case CopyMemory:
+		return pcmcia_copy_memory(a1, a2); break;
+	case DeregisterClient:
+		return pcmcia_deregister_client(a1); break;
+	case DeregisterEraseQueue:
+		return pcmcia_deregister_erase_queue(a1); break;
+	case GetFirstClient:
+		return pcmcia_get_first_client(a1, a2); break;
+	case GetCardServicesInfo:
+		return pcmcia_get_card_services_info(a1); break;
+	case GetConfigurationInfo:
+		return pcmcia_get_configuration_info(a1, a2); break;
+	case GetNextClient:
+		return pcmcia_get_next_client(a1, a2); break;
+	case GetFirstRegion:
+		return pcmcia_get_first_region(a1, a2); break;
+	case GetFirstTuple:
+		return pcmcia_get_first_tuple(a1, a2); break;
+	case GetNextRegion:
+		return pcmcia_get_next_region(a1, a2); break;
+	case GetNextTuple:
+		return pcmcia_get_next_tuple(a1, a2); break;
+	case GetStatus:
+		return pcmcia_get_status(a1, a2); break;
+	case GetTupleData:
+		return pcmcia_get_tuple_data(a1, a2); break;
+	case MapMemPage:
+		return pcmcia_map_mem_page(a1, a2); break;
+	case ModifyConfiguration:
+		return pcmcia_modify_configuration(a1, a2); break;
+	case ModifyWindow:
+		return pcmcia_modify_window(a1, a2); break;
+	case OpenMemory:
+	{
+		memory_handle_t m;
+		int ret = pcmcia_open_memory(a1, a2, &m);
+		*(memory_handle_t *)a1 = m;
+		return ret;
+	}
+        break;
+	case ParseTuple:
+		return pcmcia_parse_tuple(a1, a2, a3); break;
+	case ReadMemory:
+		return pcmcia_read_memory(a1, a2, a3); break;
+	case RegisterClient:
+		return pcmcia_register_client(a1, a2); break;
+	case RegisterEraseQueue:
+	{
+		eraseq_handle_t w;
+		int ret = pcmcia_register_erase_queue(a1, a2, &w);
+		*(eraseq_handle_t *)a1 = w;
+		return  ret;
+	}
+        break;
+	case RegisterMTD:
+		return pcmcia_register_mtd(a1, a2); break;
+	case ReleaseConfiguration:
+		return pcmcia_release_configuration(a1); break;
+	case ReleaseIO:
+		return pcmcia_release_io(a1, a2); break;
+	case ReleaseIRQ:
+		return pcmcia_release_irq(a1, a2); break;
+	case ReleaseWindow:
+		return pcmcia_release_window(a1); break;
+	case RequestConfiguration:
+		return pcmcia_request_configuration(a1, a2); break;
+	case RequestIO:
+		return pcmcia_request_io(a1, a2); break;
+	case RequestIRQ:
+		return pcmcia_request_irq(a1, a2); break;
+	case RequestWindow:
+	{
+		window_handle_t w;
+		int ret = pcmcia_request_window(a1, a2, &w);
+		*(window_handle_t *)a1 = w;
+		return  ret;
+	}
+        break;
+	case ResetCard:
+		return pcmcia_reset_card(a1, a2); break;
+	case SetEventMask:
+		return pcmcia_set_event_mask(a1, a2); break;
+	case ValidateCIS:
+		return pcmcia_validate_cis(a1, a2); break;
+	case WriteMemory:
+		return pcmcia_write_memory(a1, a2, a3); break;
+	case BindDevice:
+		return pcmcia_bind_device(a1); break;
+	case BindMTD:
+		return pcmcia_bind_mtd(a1); break;
+	case ReportError:
+		return pcmcia_report_error(a1, a2); break;
+	case SuspendCard:
+		return pcmcia_suspend_card(a1, a2); break;
+	case ResumeCard:
+		return pcmcia_resume_card(a1, a2); break;
+	case EjectCard:
+		return pcmcia_eject_card(a1, a2); break;
+	case InsertCard:
+		return pcmcia_insert_card(a1, a2); break;
+	case ReplaceCIS:
+		return pcmcia_replace_cis(a1, a2); break;
+	case GetFirstWindow:
+		return pcmcia_get_first_window(a1, a2); break;
+	case GetNextWindow:
+		return pcmcia_get_next_window(a1, a2); break;
+	case GetMemPage:
+		return pcmcia_get_mem_page(a1, a2); break;
+	default:
+		return CS_UNSUPPORTED_FUNCTION; break;
+    }
+
+} /* CardServices */
+EXPORT_SYMBOL(CardServices);
+
+
+MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
+MODULE_DESCRIPTION("2.4. PCMCIA drivers compatibility layer");
+MODULE_LICENSE("GPL");
diff -puN /dev/null include/pcmcia/compat.h
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ 25-akpm/include/pcmcia/compat.h	2003-12-30 13:20:25.000000000 -0800
@@ -0,0 +1,27 @@
+/*
+ * include/pcmcia/pcmcia_compat.c - compatibility layer for 2.4. PCMCIA drivers
+ *
+ *
+ *  Copyright (C) 2003        Dominik Brodowski <linux@brodo.de>
+ *
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef _LINUX_PCMCIA_COMPAT_H
+#define _LINUX_PCMCIA_COMPAT_H
+
+#ifndef IN_CARD_SERVICES /* avoids "deprecated" messages on EXPORT_SYMBOL */
+
+extern int __deprecated CardServices(int func, ...);
+
+#endif
+
+#endif /* _LINUX_PCMCIA_COMPAT_H */
diff -puN include/pcmcia/cs.h~CardServices-compatibility-layer include/pcmcia/cs.h
--- 25/include/pcmcia/cs.h~CardServices-compatibility-layer	2003-12-30 13:20:25.000000000 -0800
+++ 25-akpm/include/pcmcia/cs.h	2003-12-30 13:20:25.000000000 -0800
@@ -30,6 +30,8 @@
 #ifndef _LINUX_CS_H
 #define _LINUX_CS_H
 
+#include <pcmcia/compat.h>
+
 /* For AccessConfigurationRegister */
 typedef struct conf_reg_t {
     u_char	Function;

_