diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h
index 2b267def9621d1041332db01327f62e48920539e..f889a44280f5d14214d43caeaf5d46111a525007 100644
--- a/drivers/pcmcia/cs_internal.h
+++ b/drivers/pcmcia/cs_internal.h
@@ -94,12 +94,6 @@ static inline void cs_socket_put(struct pcmcia_socket *skt)
 	}
 }
 
-#define CHECK_SOCKET(s) \
-    (((s) >= sockets) || (socket_table[s]->ops == NULL))
-
-#define SOCKET(h) (h->socket)
-#define CONFIG(h) (&SOCKET(h)->config[(h)->func])
-
 /* In cardbus.c */
 int cb_alloc(struct pcmcia_socket *s);
 void cb_free(struct pcmcia_socket *s);
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index a4333a82669fb82269a4a553ae3fec4c4541b9d7..5166f00cfe3a97779e972275030f88b50c63ad9a 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -399,6 +399,7 @@ static int pcmcia_device_probe(struct device * dev)
 			goto put_module;
 		}
 	}
+	p_dev->function_config = &s->config[p_dev->func];
 
 	ret = p_drv->probe(p_dev);
 	if (ret)
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index f58814519ebca6a4f55e5a76f83e001a895ecc1a..11a94d9a15fb5c632b76e6f4b18e0f92c54c5d85 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -372,9 +372,7 @@ int pccard_get_status(struct pcmcia_socket *s, unsigned int function,
 
 int pcmcia_get_status(client_handle_t handle, cs_status_t *status)
 {
-	struct pcmcia_socket *s;
-	s = SOCKET(handle);
-	return pccard_get_status(s, handle->func, status);
+	return pccard_get_status(handle->socket, handle->func, status);
 }
 EXPORT_SYMBOL(pcmcia_get_status);
 
@@ -422,7 +420,8 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
 	config_t *c;
 
 	s = p_dev->socket;
-	c = CONFIG(p_dev);
+	c = p_dev->function_config;
+
 	if (!(s->state & SOCKET_PRESENT))
 		return CS_NO_CARD;
 	if (!(c->state & CONFIG_LOCKED))
@@ -470,7 +469,7 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev)
 	p_dev->state &= ~CLIENT_CONFIG_LOCKED;
 
 	if (!(p_dev->state & CLIENT_STALE)) {
-		config_t *c = CONFIG(p_dev);
+		config_t *c = p_dev->function_config;
 		if (--(s->lock_count) == 0) {
 			s->socket.flags = SS_OUTPUT_ENA;   /* Is this correct? */
 			s->socket.Vpp = 0;
@@ -512,7 +511,7 @@ int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
 	p_dev->state &= ~CLIENT_IO_REQ;
 
 	if (!(p_dev->state & CLIENT_STALE)) {
-		config_t *c = CONFIG(p_dev);
+		config_t *c = p_dev->function_config;
 		if (c->state & CONFIG_LOCKED)
 			return CS_CONFIGURATION_LOCKED;
 		if ((c->io.BasePort1 != req->BasePort1) ||
@@ -540,7 +539,7 @@ int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
 	p_dev->state &= ~CLIENT_IRQ_REQ;
 
 	if (!(p_dev->state & CLIENT_STALE)) {
-		config_t *c = CONFIG(p_dev);
+		config_t *c= p_dev->function_config;
 		if (c->state & CONFIG_LOCKED)
 			return CS_CONFIGURATION_LOCKED;
 		if (c->irq.Attributes != req->Attributes)
@@ -610,7 +609,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
 
 	if (req->IntType & INT_CARDBUS)
 		return CS_UNSUPPORTED_MODE;
-	c = CONFIG(p_dev);
+	c = p_dev->function_config;
 	if (c->state & CONFIG_LOCKED)
 		return CS_CONFIGURATION_LOCKED;
 
@@ -730,7 +729,7 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
 
 	if (!req)
 		return CS_UNSUPPORTED_MODE;
-	c = CONFIG(p_dev);
+	c = p_dev->function_config;
 	if (c->state & CONFIG_LOCKED)
 		return CS_CONFIGURATION_LOCKED;
 	if (c->state & CONFIG_IO_REQ)
@@ -786,7 +785,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
 
 	if (!(s->state & SOCKET_PRESENT))
 		return CS_NO_CARD;
-	c = CONFIG(p_dev);
+	c = p_dev->function_config;
 	if (c->state & CONFIG_LOCKED)
 		return CS_CONFIGURATION_LOCKED;
 	if (c->state & CONFIG_IRQ_REQ)
diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h
index 8e2a96396478a0d6a1d522b78a52c2768581d0a1..ac11fb1e8d6949aa20dd6d3004b8ac666661cbe9 100644
--- a/include/pcmcia/ds.h
+++ b/include/pcmcia/ds.h
@@ -131,6 +131,7 @@ typedef struct dev_link_t {
 
 
 struct pcmcia_socket;
+struct config_t;
 
 struct pcmcia_driver {
 	int (*probe)		(struct pcmcia_device *dev);
@@ -160,6 +161,7 @@ struct pcmcia_device {
 	/* the hardware "function" device; certain subdevices can
 	 * share one hardware "function" device. */
 	u8			func;
+	struct config_t*	function_config;
 
 	struct list_head	socket_device_list;