drivers/pcmcia/cs.c           |   21 ++++-----------------
 drivers/pcmcia/i82092.c       |   22 +++-------------------
 drivers/pcmcia/i82092aa.h     |    1 -
 drivers/pcmcia/i82365.c       |   20 +++-----------------
 drivers/pcmcia/sa11xx_core.c  |   35 ++---------------------------------
 drivers/pcmcia/sa11xx_core.h  |    2 --
 drivers/pcmcia/tcic.c         |   21 +++------------------
 drivers/pcmcia/yenta_socket.c |   15 ++-------------
 drivers/pcmcia/yenta_socket.h |    2 --
 include/pcmcia/ss.h           |    1 +
 10 files changed, 18 insertions(+), 122 deletions(-)

diff -puN drivers/pcmcia/cs.c~pcmcia-event-20030623-5 drivers/pcmcia/cs.c
--- 25/drivers/pcmcia/cs.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/cs.c	2003-06-26 18:39:53.000000000 -0700
@@ -231,11 +231,6 @@ static const lookup_t service_table[] = 
 
 ======================================================================*/
 
-static int register_callback(struct pcmcia_socket *s, void (*handler)(void *, unsigned int), void * info)
-{
-	return s->ss_entry->register_callback(s, handler, info);
-}
-
 static int get_socket_status(struct pcmcia_socket *s, int *val)
 {
 	return s->ss_entry->get_status(s, val);
@@ -356,6 +351,7 @@ static int pcmcia_add_socket(struct clas
 
 	wait_for_completion(&socket->thread_done);
 	BUG_ON(!socket->thread);
+	pcmcia_parse_events(socket, SS_DETECT);
 
 	return 0;
 }
@@ -872,16 +868,14 @@ static int pccardd(void *__skt)
 	complete_and_exit(&skt->thread_done, 0);
 }
 
-static void parse_events(void *info, u_int events)
+void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
 {
-	struct pcmcia_socket *s = info;
-
 	spin_lock(&s->thread_lock);
 	s->thread_events |= events;
 	spin_unlock(&s->thread_lock);
 
 	wake_up(&s->thread_wait);
-} /* parse_events */
+} /* pcmcia_parse_events */
 
 
 /*======================================================================
@@ -1142,9 +1136,6 @@ int pcmcia_deregister_client(client_hand
 	handle->event_handler = NULL;
     }
 
-    if (--s->real_clients == 0)
-        register_callback(s, NULL, NULL);
-    
     return CS_SUCCESS;
 } /* deregister_client */
 
@@ -1559,11 +1550,6 @@ int pcmcia_register_client(client_handle
     if (client == NULL)
 	return CS_OUT_OF_RESOURCE;
 
-    if (++s->real_clients == 1) {
-	register_callback(s, &parse_events, s);
-	parse_events(s, SS_DETECT);
-    }
-
     *handle = client;
     client->state &= ~CLIENT_UNBOUND;
     client->Socket = s;
@@ -2532,6 +2518,7 @@ EXPORT_SYMBOL(pcmcia_write_memory);
 EXPORT_SYMBOL(dead_socket);
 EXPORT_SYMBOL(CardServices);
 EXPORT_SYMBOL(MTDHelperEntry);
+EXPORT_SYMBOL(pcmcia_parse_events);
 
 struct class pcmcia_socket_class = {
 	.name = "pcmcia_socket",
diff -puN drivers/pcmcia/i82092aa.h~pcmcia-event-20030623-5 drivers/pcmcia/i82092aa.h
--- 25/drivers/pcmcia/i82092aa.h~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/i82092aa.h	2003-06-26 18:39:53.000000000 -0700
@@ -35,7 +35,6 @@ static int i82092aa_set_io_map(struct pc
 static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_map *mem);
 static int i82092aa_init(struct pcmcia_socket *socket);
 static int i82092aa_suspend(struct pcmcia_socket *socket);
-static int i82092aa_register_callback(struct pcmcia_socket *socket, void (*handler)(void *, unsigned int), void * info);
 
 #endif
 
diff -puN drivers/pcmcia/i82092.c~pcmcia-event-20030623-5 drivers/pcmcia/i82092.c
--- 25/drivers/pcmcia/i82092.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/i82092.c	2003-06-26 18:39:53.000000000 -0700
@@ -66,7 +66,6 @@ static struct pci_driver i82092aa_pci_dr
 static struct pccard_operations i82092aa_operations = {
 	.init 		 	= i82092aa_init,
 	.suspend	   	= i82092aa_suspend,
-	.register_callback 	= i82092aa_register_callback,
 	.get_status		= i82092aa_get_status,
 	.get_socket		= i82092aa_get_socket,
 	.set_socket		= i82092aa_set_socket,
@@ -86,10 +85,6 @@ struct socket_info {
 	
 	unsigned int pending_events; /* Pending events on this interface */
 	
-	void	(*handler)(void *info, u_int events); 
-				/* callback to the driver of the card */
-	void	*info;		/* to be passed to the handler */
-	
 	struct pcmcia_socket socket;
 	struct pci_dev *dev;	/* The PCI device for the socket */
 };
@@ -332,8 +327,8 @@ static void i82092aa_bh(void *dummy)
         for (i=0; i < socket_count; i++) {
         	events = xchg(&(sockets[i].pending_events),0);
         	printk("events = %x \n",events);
-                if (sockets[i].handler)
-                	sockets[i].handler(sockets[i].info, events);
+        	if (events)
+			pcmcia_parse_events(&sockets[i].socket, events);
 	}
 }
                                                                                                                                         
@@ -367,8 +362,7 @@ static irqreturn_t i82092aa_interrupt(in
 			
 			csc = indirect_read(i,I365_CSC); /* card status change register */
 			
-			if ((csc==0) ||  /* no events on this socket */
-			   (sockets[i].handler==NULL)) /* no way to handle events */
+			if (csc==0)  /* no events on this socket */
 			   	continue;
 			handled = 1;
 			events = 0;
@@ -475,16 +469,6 @@ static int i82092aa_suspend(struct pcmci
         return retval;
 }
        
-static int i82092aa_register_callback(struct pcmcia_socket *socket, void (*handler)(void *, unsigned int), void * info)
-{
-	unsigned int sock = container_of(socket, struct socket_info, socket)->number;
-	enter("i82092aa_register_callback");
-	sockets[sock].handler = handler;
-        sockets[sock].info = info;
-	leave("i82092aa_register_callback");
-	return 0;
-} /* i82092aa_register_callback */
-                                        
 static int i82092aa_get_status(struct pcmcia_socket *socket, u_int *value)
 {
 	unsigned int sock = container_of(socket, struct socket_info, socket)->number;
diff -puN drivers/pcmcia/i82365.c~pcmcia-event-20030623-5 drivers/pcmcia/i82365.c
--- 25/drivers/pcmcia/i82365.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/i82365.c	2003-06-26 18:39:53.000000000 -0700
@@ -164,8 +164,6 @@ struct i82365_socket {
     ioaddr_t		ioaddr;
     u_short		psock;
     u_char		cs_irq, intr;
-    void		(*handler)(void *info, u_int events);
-    void		*info;
     union {
 	cirrus_state_t		cirrus;
 	vg46x_state_t		vg46x;
@@ -883,8 +881,8 @@ static void pcic_bh(void *dummy)
 		*/
 		if (events & SS_DETECT) 
 			mdelay(4);
-		if (socket[i].handler)
-			socket[i].handler(socket[i].info, events);
+		if (events)
+			pcmcia_parse_events(&socket[i].socket, events);
 	}
 }
 
@@ -911,8 +909,7 @@ static irqreturn_t pcic_interrupt(int ir
 	    handled = 1;
 	    ISA_LOCK(i, flags);
 	    csc = i365_get(i, I365_CSC);
-	    if ((csc == 0) || (!socket[i].handler) ||
-		(i365_get(i, I365_IDENT) & 0x70)) {
+	    if ((csc == 0) || (i365_get(i, I365_IDENT) & 0x70)) {
 		ISA_UNLOCK(i, flags);
 		continue;
 	    }
@@ -968,16 +965,6 @@ static void pcic_interrupt_wrapper(u_lon
 
 /*====================================================================*/
 
-static int pcic_register_callback(struct pcmcia_socket *s, void (*handler)(void *, unsigned int), void * info)
-{
-    unsigned int sock = container_of(s, struct i82365_socket, socket)->number;
-    socket[sock].handler = handler;
-    socket[sock].info = info;
-    return 0;
-} /* pcic_register_callback */
-
-/*====================================================================*/
-
 static int i365_get_status(u_short sock, u_int *value)
 {
     u_int status;
@@ -1402,7 +1389,6 @@ static int pcic_suspend(struct pcmcia_so
 static struct pccard_operations pcic_operations = {
 	.init			= pcic_init,
 	.suspend		= pcic_suspend,
-	.register_callback	= pcic_register_callback,
 	.get_status		= pcic_get_status,
 	.get_socket		= pcic_get_socket,
 	.set_socket		= pcic_set_socket,
diff -puN drivers/pcmcia/sa11xx_core.c~pcmcia-event-20030623-5 drivers/pcmcia/sa11xx_core.c
--- 25/drivers/pcmcia/sa11xx_core.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/sa11xx_core.c	2003-06-26 18:39:53.000000000 -0700
@@ -295,8 +295,8 @@ static void sa1100_pcmcia_task_handler(v
 			events & SS_BATWARN ? "BATWARN " : "",
 			events & SS_STSCHG  ? "STSCHG "  : "");
 
-		if (events && skt->handler != NULL)
-			skt->handler(skt->handler_info, events);
+		if (events)
+			pcmcia_parse_events(&skt->socket, events);
 	} while (events);
 }
 
@@ -335,36 +335,6 @@ static irqreturn_t sa1100_pcmcia_interru
 	return IRQ_HANDLED;
 }
 
-/* sa1100_pcmcia_register_callback()
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Implements the register_callback() operation for the in-kernel
- * PCMCIA service (formerly SS_RegisterCallback in Card Services). If 
- * the function pointer `handler' is not NULL, remember the callback 
- * location in the state for `sock', and increment the usage counter 
- * for the driver module. (The callback is invoked from the interrupt
- * service routine, sa1100_pcmcia_interrupt(), to notify Card Services
- * of interesting events.) Otherwise, clear the callback pointer in the
- * socket state and decrement the module usage count.
- *
- * Returns: 0
- */
-static int
-sa1100_pcmcia_register_callback(struct pcmcia_socket *sock,
-				void (*handler)(void *, unsigned int),
-				void *info)
-{
-	struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
-
-	if (handler) {
-		skt->handler_info = info;
-		skt->handler = handler;
-	} else {
-		skt->handler = NULL;
-	}
-
-	return 0;
-}
-
 
 /* sa1100_pcmcia_get_status()
  * ^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -654,7 +624,6 @@ static CLASS_DEVICE_ATTR(status, S_IRUGO
 static struct pccard_operations sa11xx_pcmcia_operations = {
 	.init			= sa1100_pcmcia_sock_init,
 	.suspend		= sa1100_pcmcia_suspend,
-	.register_callback	= sa1100_pcmcia_register_callback,
 	.get_status		= sa1100_pcmcia_get_status,
 	.get_socket		= sa1100_pcmcia_get_socket,
 	.set_socket		= sa1100_pcmcia_set_socket,
diff -puN drivers/pcmcia/sa11xx_core.h~pcmcia-event-20030623-5 drivers/pcmcia/sa11xx_core.h
--- 25/drivers/pcmcia/sa11xx_core.h~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/sa11xx_core.h	2003-06-26 18:39:53.000000000 -0700
@@ -59,8 +59,6 @@ struct sa1100_pcmcia_socket {
 
 	unsigned int		status;
 	socket_state_t		cs_state;
-	void			(*handler)(void *, unsigned int);
-	void			*handler_info;
 
 	unsigned short		spd_io[MAX_IO_WIN];
 	unsigned short		spd_mem[MAX_WIN];
diff -puN drivers/pcmcia/tcic.c~pcmcia-event-20030623-5 drivers/pcmcia/tcic.c
--- 25/drivers/pcmcia/tcic.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/tcic.c	2003-06-26 18:39:53.000000000 -0700
@@ -116,8 +116,6 @@ static struct pccard_operations tcic_ope
 
 struct tcic_socket {
     u_short	psock;
-    void	(*handler)(void *info, u_int events);
-    void	*info;
     u_char	last_sstat;
     u_char	id;
     struct pcmcia_socket	socket;
@@ -433,8 +431,6 @@ static int __init init_tcic(void)
     for (i = 0; i < sock; i++) {
 	if ((i == ignore) || is_active(i)) continue;
 	socket_table[sockets].psock = i;
-	socket_table[sockets].handler = NULL;
-	socket_table[sockets].info = NULL;
 	socket_table[sockets].id = get_tcic_id();
 
 	socket_table[sockets].socket.owner = THIS_MODULE;
@@ -572,8 +568,8 @@ static void tcic_bh(void *dummy)
 		events = pending_events[i];
 		pending_events[i] = 0;
 		spin_unlock_irq(&pending_event_lock);
-		if (socket_table[i].handler)
-			socket_table[i].handler(socket_table[i].info, events);
+		if (events)
+			pcmcia_parse_events(&socket_table[i].socket, events);
 	}
 }
 
@@ -606,7 +602,7 @@ static irqreturn_t tcic_interrupt(int ir
 	    tcic_setb(TCIC_ICSR, TCIC_ICSR_CLEAR);
 	    quick = 1;
 	}
-	if ((latch == 0) || (socket_table[psock].handler == NULL))
+	if (latch == 0)
 	    continue;
 	events = (latch & TCIC_SSTAT_CD) ? SS_DETECT : 0;
 	events |= (latch & TCIC_SSTAT_WP) ? SS_WRPROT : 0;
@@ -646,16 +642,6 @@ static void tcic_timer(u_long data)
 
 /*====================================================================*/
 
-static int tcic_register_callback(struct pcmcia_socket *sock, void (*handler)(void *, unsigned int), void * info)
-{
-    u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
-    socket_table[psock].handler = handler;
-    socket_table[psock].info = info;
-    return 0;
-} /* tcic_register_callback */
-
-/*====================================================================*/
-
 static int tcic_get_status(struct pcmcia_socket *sock, u_int *value)
 {
     u_short psock = container_of(sock, struct tcic_socket, socket)->psock;
@@ -918,7 +904,6 @@ static int tcic_suspend(struct pcmcia_so
 static struct pccard_operations tcic_operations = {
 	.init		   = tcic_init,
 	.suspend	   = tcic_suspend,
-	.register_callback = tcic_register_callback,
 	.get_status	   = tcic_get_status,
 	.get_socket	   = tcic_get_socket,
 	.set_socket	   = tcic_set_socket,
diff -puN drivers/pcmcia/yenta_socket.c~pcmcia-event-20030623-5 drivers/pcmcia/yenta_socket.c
--- 25/drivers/pcmcia/yenta_socket.c~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/yenta_socket.c	2003-06-26 18:39:53.000000000 -0700
@@ -429,8 +429,8 @@ static void yenta_bh(void *data)
 	events = socket->events;
 	socket->events = 0;
 	spin_unlock_irq(&socket->event_lock);
-	if (socket->handler)
-		socket->handler(socket->info, events);
+	if (events)
+		pcmcia_parse_events(&socket->socket, events);
 }
 
 static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
@@ -771,20 +771,9 @@ static void yenta_close(struct pci_dev *
 }
 
 
-static int yenta_register_callback(struct pcmcia_socket *sock, void (*handler)(void *, unsigned int), void * info)
-{
-	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-
-	socket->handler = handler;
-	socket->info = info;
-	return 0;
-}
-
-
 static struct pccard_operations yenta_socket_operations = {
 	.init			= yenta_init,
 	.suspend		= yenta_suspend,
-	.register_callback	= yenta_register_callback,
 	.get_status		= yenta_get_status,
 	.get_socket		= yenta_get_socket,
 	.set_socket		= yenta_set_socket,
diff -puN drivers/pcmcia/yenta_socket.h~pcmcia-event-20030623-5 drivers/pcmcia/yenta_socket.h
--- 25/drivers/pcmcia/yenta_socket.h~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/drivers/pcmcia/yenta_socket.h	2003-06-26 18:39:53.000000000 -0700
@@ -99,8 +99,6 @@ struct yenta_socket {
 	struct pci_dev *dev;
 	int cb_irq, io_irq;
 	void *base;
-	void (*handler)(void *, unsigned int);
-	void *info;
 	spinlock_t event_lock;
 	unsigned int events;
 	struct work_struct tq_task;
diff -puN include/pcmcia/ss.h~pcmcia-event-20030623-5 include/pcmcia/ss.h
--- 25/include/pcmcia/ss.h~pcmcia-event-20030623-5	2003-06-26 18:39:53.000000000 -0700
+++ 25-akpm/include/pcmcia/ss.h	2003-06-26 18:39:53.000000000 -0700
@@ -235,6 +235,7 @@ struct pcmcia_socket * pcmcia_get_socket
 
 
 
+extern void pcmcia_parse_events(struct pcmcia_socket *socket, unsigned int events);
 extern int pcmcia_register_socket(struct pcmcia_socket *socket);
 extern void pcmcia_unregister_socket(struct pcmcia_socket *socket);
 

_