======================================================================*/
-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);
wait_for_completion(&socket->thread_done);
BUG_ON(!socket->thread);
+ pcmcia_parse_events(socket, SS_DETECT);
return 0;
}
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 */
/*======================================================================
handle->event_handler = NULL;
}
- if (--s->real_clients == 0)
- register_callback(s, NULL, NULL);
-
return CS_SUCCESS;
} /* deregister_client */
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;
EXPORT_SYMBOL(dead_socket);
EXPORT_SYMBOL(CardServices);
EXPORT_SYMBOL(MTDHelperEntry);
+EXPORT_SYMBOL(pcmcia_parse_events);
struct class pcmcia_socket_class = {
.name = "pcmcia_socket",
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,
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 */
};
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);
}
}
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;
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;
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
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;
*/
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);
}
}
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;
}
/*====================================================================*/
-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;
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,
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);
}
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()
* ^^^^^^^^^^^^^^^^^^^^^^^^^^
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,
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];
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;
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;
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);
}
}
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;
/*====================================================================*/
-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;
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,
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)
}
-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,
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;
+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);