From: Dominik Brodowski <linux@dominikbrodowski.de>

validate_mem() does only make sense for !SS_CAP_STATIC_MAP sockets. Therefore,
re-direct validate_mem() calls only for those. The newly added redirection 
layer will allow for a "library" module named "rsrc_nonstatic" which contains 
the resource database handling code, and it will only need to be loaded for 
the drivers which need it.

Signed-off-by: Dominik Brodowski <linux@brodo.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/pcmcia/cs.c          |    6 +++++-
 25-akpm/drivers/pcmcia/cs_internal.h |    2 ++
 25-akpm/drivers/pcmcia/rsrc_mgr.c    |   17 ++++++++++++++++-
 25-akpm/include/pcmcia/ss.h          |    5 +++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff -puN drivers/pcmcia/cs.c~pcmcia-validate_mem-only-for-non-statically-mapped-sockets drivers/pcmcia/cs.c
--- 25/drivers/pcmcia/cs.c~pcmcia-validate_mem-only-for-non-statically-mapped-sockets	Fri Dec 17 15:25:06 2004
+++ 25-akpm/drivers/pcmcia/cs.c	Fri Dec 17 15:25:06 2004
@@ -250,7 +250,11 @@ int pcmcia_register_socket(struct pcmcia
 	socket->cis_mem.flags = 0;
 	socket->cis_mem.speed = cis_speed;
 
-	/* init resource database */
+	/* init resource handling */
+	if (socket->features & SS_CAP_STATIC_MAP)
+		socket->resource_ops = &pccard_static_ops;
+	else
+		socket->resource_ops = &pccard_nonstatic_ops;
 	socket->mem_db.next = &socket->mem_db;
 	socket->io_db.next = &socket->io_db;
 
diff -puN drivers/pcmcia/cs_internal.h~pcmcia-validate_mem-only-for-non-statically-mapped-sockets drivers/pcmcia/cs_internal.h
--- 25/drivers/pcmcia/cs_internal.h~pcmcia-validate_mem-only-for-non-statically-mapped-sockets	Fri Dec 17 15:25:06 2004
+++ 25-akpm/drivers/pcmcia/cs_internal.h	Fri Dec 17 15:25:06 2004
@@ -144,6 +144,8 @@ int try_irq(u_int Attributes, int irq, i
 void undo_irq(u_int Attributes, int irq);
 int adjust_resource_info(client_handle_t handle, adjust_t *adj);
 void release_resource_db(struct pcmcia_socket *s);
+extern struct pccard_resource_ops pccard_static_ops;
+extern struct pccard_resource_ops pccard_nonstatic_ops;
 
 /* In socket_sysfs.c */
 extern struct class_interface pccard_sysfs_interface;
diff -puN drivers/pcmcia/rsrc_mgr.c~pcmcia-validate_mem-only-for-non-statically-mapped-sockets drivers/pcmcia/rsrc_mgr.c
--- 25/drivers/pcmcia/rsrc_mgr.c~pcmcia-validate_mem-only-for-non-statically-mapped-sockets	Fri Dec 17 15:25:06 2004
+++ 25-akpm/drivers/pcmcia/rsrc_mgr.c	Fri Dec 17 15:25:06 2004
@@ -473,11 +473,12 @@ static void validate_mem(struct pcmcia_s
 
 #endif /* CONFIG_PCMCIA_PROBE */
 
+
 /*
  * Locking note: this is the only place where we take
  * both rsrc_sem and skt_sem.
  */
-void pcmcia_validate_mem(struct pcmcia_socket *s)
+static void pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
 {
 	if (probe_mem) {
 		unsigned int probe_mask;
@@ -503,6 +504,11 @@ void pcmcia_validate_mem(struct pcmcia_s
 	}
 }
 
+void pcmcia_validate_mem(struct pcmcia_socket *s)
+{
+	if (s->resource_ops->validate_mem)
+		s->resource_ops->validate_mem(s);
+}
 EXPORT_SYMBOL(pcmcia_validate_mem);
 
 struct pcmcia_align_data {
@@ -981,3 +987,12 @@ void release_resource_db(struct pcmcia_s
 	kfree(p);
     }
 }
+
+
+struct pccard_resource_ops pccard_static_ops = {
+	.validate_mem = NULL,
+};
+
+struct pccard_resource_ops pccard_nonstatic_ops = {
+	.validate_mem = pcmcia_nonstatic_validate_mem,
+};
diff -puN include/pcmcia/ss.h~pcmcia-validate_mem-only-for-non-statically-mapped-sockets include/pcmcia/ss.h
--- 25/include/pcmcia/ss.h~pcmcia-validate_mem-only-for-non-statically-mapped-sockets	Fri Dec 17 15:25:06 2004
+++ 25-akpm/include/pcmcia/ss.h	Fri Dec 17 15:25:06 2004
@@ -115,6 +115,10 @@ struct pccard_operations {
 	int (*set_mem_map)(struct pcmcia_socket *sock, struct pccard_mem_map *mem);
 };
 
+struct pccard_resource_ops {
+	void	(*validate_mem) (struct pcmcia_socket *s);
+};
+
 /*
  *  Calls to set up low-level "Socket Services" drivers
  */
@@ -194,6 +198,7 @@ struct pcmcia_socket {
 
 	/* socket operations */
 	struct pccard_operations *	ops;
+	struct pccard_resource_ops *	resource_ops;
 
 	/* Zoom video behaviour is so chip specific its not worth adding
 	   this to _ops */
_