From: Dominik Brodowski 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 + * + * + * The initial developer of the original code is David A. Hinds + * . 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 +#include +#include + +#define IN_CARD_SERVICES +#include +#include +#include +#include +#include +#include +#include +#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 "); +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 + * + * + * The initial developer of the original code is David A. Hinds + * . 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 + /* For AccessConfigurationRegister */ typedef struct conf_reg_t { u_char Function; _