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); _