drivers/pcmcia/ricoh.h        |   13 +++-------
 drivers/pcmcia/ti113x.h       |   51 +++++++++++++++++-------------------------
 drivers/pcmcia/yenta_socket.c |   24 ++++++++++++++-----
 drivers/pcmcia/yenta_socket.h |    1 
 4 files changed, 43 insertions(+), 46 deletions(-)

diff -puN drivers/pcmcia/ricoh.h~yenta-20030817-3-sockinit drivers/pcmcia/ricoh.h
--- 25/drivers/pcmcia/ricoh.h~yenta-20030817-3-sockinit	2003-08-17 14:20:42.000000000 -0700
+++ 25-akpm/drivers/pcmcia/ricoh.h	2003-08-17 14:20:42.000000000 -0700
@@ -142,27 +142,22 @@ static void ricoh_zoom_video(struct pcmc
         config_writeb(socket, RL5C4XX_MISC_CONTROL, reg);
 }
 
-static void ricoh_set_zv(struct pcmcia_socket *sock)
+static void ricoh_set_zv(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
         if(socket->dev->vendor == PCI_VENDOR_ID_RICOH)
         {
                 switch(socket->dev->device)
                 {
                         /* There may be more .. */
 		case  PCI_DEVICE_ID_RICOH_RL5C478:
-			sock->zoom_video = ricoh_zoom_video;
+			socket->socket.zoom_video = ricoh_zoom_video;
 			break;  
                 }
         }
 }
 
-static int ricoh_init(struct pcmcia_socket *sock)
+static int ricoh_init(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-	yenta_init(sock);
-	ricoh_set_zv(sock);
-
 	config_writew(socket, RL5C4XX_MISC, rl_misc(socket));
 	config_writew(socket, RL5C4XX_16BIT_CTL, rl_ctl(socket));
 	config_writew(socket, RL5C4XX_16BIT_IO_0, rl_io(socket));
@@ -194,7 +189,7 @@ static int ricoh_override(struct yenta_s
 		rl_config(socket) |= RL5C4XX_CONFIG_PREFETCH;
 	}
 
-	socket->socket.ops->init = ricoh_init;
+	ricoh_set_zv(socket);
 
 	return 0;
 }
diff -puN drivers/pcmcia/ti113x.h~yenta-20030817-3-sockinit drivers/pcmcia/ti113x.h
--- 25/drivers/pcmcia/ti113x.h~yenta-20030817-3-sockinit	2003-08-17 14:20:42.000000000 -0700
+++ 25-akpm/drivers/pcmcia/ti113x.h	2003-08-17 14:20:42.000000000 -0700
@@ -136,6 +136,16 @@
 
 #ifdef CONFIG_CARDBUS
 
+/*
+ * Texas Instruments CardBus controller overrides.
+ */
+#define ti_sysctl(socket)	((socket)->private[0])
+#define ti_cardctl(socket)	((socket)->private[1])
+#define ti_devctl(socket)	((socket)->private[2])
+#define ti_diag(socket)		((socket)->private[3])
+#define ti_irqmux(socket)	((socket)->private[4])
+
+
 static int ti_intctl(struct yenta_socket *socket)
 {
 	u8 new, reg = exca_readb(socket, I365_INTCTL);
@@ -207,9 +217,8 @@ static void ti1250_zoom_video(struct pcm
 	config_writeb(socket, TI1250_MULTIMEDIA_CTL, reg);
 }
 
-static void ti_set_zv(struct pcmcia_socket *sock)
+static void ti_set_zv(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
 	if(socket->dev->vendor == PCI_VENDOR_ID_TI)
 	{
 		switch(socket->dev->device)
@@ -218,21 +227,18 @@ static void ti_set_zv(struct pcmcia_sock
 			case PCI_DEVICE_ID_TI_1220:
 			case PCI_DEVICE_ID_TI_1221:
 			case PCI_DEVICE_ID_TI_1225:
-				sock->zoom_video = ti_zoom_video;
+				socket->socket.zoom_video = ti_zoom_video;
 				break;	
 			case PCI_DEVICE_ID_TI_1250:
 			case PCI_DEVICE_ID_TI_1251A:
 			case PCI_DEVICE_ID_TI_1251B:
 			case PCI_DEVICE_ID_TI_1450:
-				sock->zoom_video = ti1250_zoom_video;
+				socket->socket.zoom_video = ti1250_zoom_video;
 		}
 	}
 }
-static int ti_init(struct pcmcia_socket *sock)
+static int ti_init(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-	yenta_init(sock);
-	ti_set_zv(sock);
 	ti_intctl(socket);
 	return 0;
 }
@@ -258,6 +264,8 @@ static int ti_override(struct yenta_sock
 	if (new != reg)
 		exca_writeb(socket, I365_INTCTL, new);
 
+	ti_set_zv(socket);
+
 #if 0
 	/*
 	 * If ISA interrupts don't work, then fall back to routing card
@@ -285,23 +293,11 @@ static int ti_override(struct yenta_sock
 	}
 #endif
 
-	socket->socket.ops->init = ti_init;
 	return 0;
 }
 
-#define ti_sysctl(socket)	((socket)->private[0])
-#define ti_cardctl(socket)	((socket)->private[1])
-#define ti_devctl(socket)	((socket)->private[2])
-#define ti_diag(socket)		((socket)->private[3])
-#define ti_irqmux(socket)	((socket)->private[4])
-
-
-static int ti113x_init(struct pcmcia_socket *sock)
+static int ti113x_init(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-	yenta_init(sock);
-	ti_set_zv(sock);
-
 	config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
 	config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
 	config_writeb(socket, TI113X_DEVICE_CONTROL, ti_devctl(socket));
@@ -318,16 +314,13 @@ static int ti113x_override(struct yenta_
 	ti_cardctl(socket) &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);
 	if (socket->cb_irq)
 		ti_cardctl(socket) |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ;
-	ti_override(socket);
-	socket->socket.ops->init = ti113x_init;
-	return 0;
+	return ti_override(socket);
 }
 
 
-static int ti1250_init(struct pcmcia_socket *sock)
+static int ti1250_init(struct yenta_socket *socket)
 {
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-	ti113x_init(sock);
+	ti113x_init(socket);
 	ti_irqmux(socket) = config_readl(socket, TI122X_IRQMUX);
 #if 0
 	ti_irqmux(socket) = (ti_irqmux(socket) & ~0x0f) | 0x02; /* route INTA */
@@ -348,9 +341,7 @@ static int ti1250_override(struct yenta_
 	ti_diag(socket) &= ~(TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ);
 	if (socket->cb_irq)
 		ti_diag(socket) |= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ;
-	ti113x_override(socket);
-	socket->socket.ops->init = ti1250_init;
-	return 0;
+	return ti113x_override(socket);
 }
 
 
diff -puN drivers/pcmcia/yenta_socket.c~yenta-20030817-3-sockinit drivers/pcmcia/yenta_socket.c
--- 25/drivers/pcmcia/yenta_socket.c~yenta-20030817-3-sockinit	2003-08-17 14:20:42.000000000 -0700
+++ 25-akpm/drivers/pcmcia/yenta_socket.c	2003-08-17 14:20:42.000000000 -0700
@@ -576,30 +576,35 @@ static void yenta_config_init(struct yen
 }
 
 /* Called at resume and initialization events */
-static int yenta_init(struct pcmcia_socket *sock)
+static int yenta_sock_init(struct pcmcia_socket *sock)
 {
 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+
 	yenta_config_init(socket);
 	yenta_clear_maps(socket);
 
-	/* Re-enable interrupts */
+	if (socket->type && socket->type->sock_init)
+		socket->type->sock_init(socket);
+
+	/* Re-enable CSC interrupts */
 	cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK);
+
 	return 0;
 }
 
-static int yenta_suspend(struct pcmcia_socket *sock)
+static int yenta_sock_suspend(struct pcmcia_socket *sock)
 {
 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
 
 	yenta_set_socket(sock, &dead_socket);
 
-	/* Disable interrupts */
+	/* Disable CSC interrupts */
 	cb_writel(socket, CB_SOCKET_MASK, 0x0);
 
 	/*
 	 * This does not work currently. The controller
 	 * loses too much information during D3 to come up
-	 * cleanly. We should probably fix yenta_init()
+	 * cleanly. We should probably fix yenta_sock_init()
 	 * to update all the critical registers, notably
 	 * the IO and MEM bridging region data.. That is
 	 * something that pci_set_power_state() should
@@ -758,8 +763,8 @@ static void yenta_close(struct pci_dev *
 
 
 static struct pccard_operations yenta_socket_operations = {
-	.init			= yenta_init,
-	.suspend		= yenta_suspend,
+	.init			= yenta_sock_init,
+	.suspend		= yenta_sock_suspend,
 	.get_status		= yenta_get_status,
 	.get_socket		= yenta_get_socket,
 	.set_socket		= yenta_set_socket,
@@ -787,18 +792,23 @@ enum {
 struct cardbus_type cardbus_type[] = {
 	[CARDBUS_TYPE_TI]	= {
 		.override	= ti_override,
+		.sock_init	= ti_init,
 	},
 	[CARDBUS_TYPE_TI113X]	= {
 		.override	= ti113x_override,
+		.sock_init	= ti113x_init,
 	},
 	[CARDBUS_TYPE_TI12XX]	= {
 		.override	= ti12xx_override,
+		.sock_init	= ti113x_init,
 	},
 	[CARDBUS_TYPE_TI1250]	= {
 		.override	= ti1250_override,
+		.sock_init	= ti1250_init,
 	},
 	[CARDBUS_TYPE_RICOH]	= {
 		.override	= ricoh_override,
+		.sock_init	= ricoh_init,
 	},
 };
 
diff -puN drivers/pcmcia/yenta_socket.h~yenta-20030817-3-sockinit drivers/pcmcia/yenta_socket.h
--- 25/drivers/pcmcia/yenta_socket.h~yenta-20030817-3-sockinit	2003-08-17 14:20:42.000000000 -0700
+++ 25-akpm/drivers/pcmcia/yenta_socket.h	2003-08-17 14:20:42.000000000 -0700
@@ -99,6 +99,7 @@ struct yenta_socket;
 
 struct cardbus_type {
 	int	(*override)(struct yenta_socket *);
+	int	(*sock_init)(struct yenta_socket *);
 };
 
 struct yenta_socket {

_