]> git.neil.brown.name Git - history.git/commitdiff
[PCMCIA] Allow socket drivers call pcmcia_parse_events directly.
authorRussell King <rmk@flint.arm.linux.org.uk>
Mon, 30 Jun 2003 22:23:42 +0000 (23:23 +0100)
committerRussell King <rmk@flint.arm.linux.org.uk>
Mon, 30 Jun 2003 22:23:42 +0000 (23:23 +0100)
Remove register_callback methods.  Instead, allow socket drivers
pass their events directly into cs.c via pcmcia_parse_events().

drivers/pcmcia/cs.c
drivers/pcmcia/i82092.c
drivers/pcmcia/i82092aa.h
drivers/pcmcia/i82365.c
drivers/pcmcia/sa11xx_core.c
drivers/pcmcia/sa11xx_core.h
drivers/pcmcia/tcic.c
drivers/pcmcia/yenta_socket.c
drivers/pcmcia/yenta_socket.h
include/pcmcia/ss.h

index 6e94e86be1bffd5134844b19a4a06f71014aa461..543656f239fff7b98e751bb7c1ad5f37d8f3ecd4 100644 (file)
@@ -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 class_device *class_dev)
 
        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_handle_t handle)
        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_t *handle, client_reg_t *req)
     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",
index e0cb759e412065985dca5a8582f55257b3497fb5..892dd1f77d01160e86bb98771c3f4ba1f611230a 100644 (file)
@@ -66,7 +66,6 @@ static struct pci_driver i82092aa_pci_drv = {
 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(int irq, void *dev, struct pt_regs *regs)
                        
                        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 pcmcia_socket *sock)
         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;
index 682d696dadf3e6bf8bc7afe82532861344890f0b..0cdd80a1e17e2e3783019ba28f7030cbe0c7e32e 100644 (file)
@@ -35,7 +35,6 @@ static int i82092aa_set_io_map(struct pcmcia_socket *socket, struct pccard_io_ma
 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
 
index 7bbaf46bfae6022ca6e20696bfe91d1bfb2fa0e4..5f607e37d65eda3343d877041412f5b28e2b69db 100644 (file)
@@ -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 irq, void *dev,
            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_long data)
 
 /*====================================================================*/
 
-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_socket *sock)
 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,
index de72c49c84d187a46ee8b6adcaff4a34949bb32c..1321ae4e6c54beb60208901c5d9cc9c84d0c70b1 100644 (file)
@@ -295,8 +295,8 @@ static void sa1100_pcmcia_task_handler(void *data)
                        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_interrupt(int irq, void *dev, struct pt_regs *r
        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, show_status, NULL);
 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,
index d9ca892bf3d245cac9431dfe04a7c28ec75eae44..089c18fcc6c520d6e49477cd59e4d1c900ab37d9 100644 (file)
@@ -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];
index 655aa0dbeda331454e9d903b758bb025d2ea05d5..06e9728f76fdebf3e05808c95fff16a0b0219d18 100644 (file)
@@ -116,8 +116,6 @@ static struct pccard_operations tcic_operations;
 
 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 irq, void *dev, struct pt_regs *regs)
            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_socket *sock)
 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,
index c8f193183ad25b2622c3d02807b6dbf796853a63..471f85666351b9cbc4fd203fd002f03f64c8e387 100644 (file)
@@ -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 *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,
index 276c53d2b78fff4d7a53b7266f8bdf58df8099d3..7241912cf98f1fc81c1c65e8caef9a8d1958ef3d 100644 (file)
@@ -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;
index d0c3f664d26b1e36f7fd837f5342aa2a35f56a0b..c0891855a0b10a93d4bae2c60aa156ccb79e1158 100644 (file)
@@ -235,6 +235,7 @@ struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr);
 
 
 
+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);