[PATCH] pcmcia: unify attach, EVENT_CARD_INSERTION handlers into one probe callback
[deliverable/linux.git] / drivers / char / pcmcia / cm4040_cs.c
index e08ab949c1168e717caa02a747eac6f42bdf5431..46eb371bf17e2294147ab2e016defa53d7a0d220 100644 (file)
@@ -65,7 +65,6 @@ static char *version =
 #define POLL_PERIOD                            msecs_to_jiffies(10)
 
 static void reader_release(dev_link_t *link);
-static void reader_detach(struct pcmcia_device *p_dev);
 
 static int major;
 
@@ -86,7 +85,6 @@ struct reader_dev {
        struct timer_list       poll_timer;
 };
 
-static dev_info_t dev_info = MODULE_NAME;
 static dev_link_t *dev_table[CM_MAX_DEV];
 
 #ifndef PCMCIA_DEBUG
@@ -629,39 +627,6 @@ cs_release:
        link->state &= ~DEV_CONFIG_PENDING;
 }
 
-static int reader_event(event_t event, int priority,
-                       event_callback_args_t *args)
-{
-       dev_link_t *link;
-       struct reader_dev *dev;
-       int devno;
-
-       link = args->client_data;
-       dev = link->priv;
-       DEBUGP(3, dev, "-> reader_event\n");
-       for (devno = 0; devno < CM_MAX_DEV; devno++) {
-               if (dev_table[devno] == link)
-                       break;
-       }
-       if (devno == CM_MAX_DEV)
-               return CS_BAD_ADAPTER;
-
-       switch (event) {
-               case CS_EVENT_CARD_INSERTION:
-                       DEBUGP(5, dev, "CS_EVENT_CARD_INSERTION\n");
-                       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
-                       reader_config(link, devno);
-                       break;
-
-               default:
-                       DEBUGP(5, dev, "reader_event: unknown event %.2x\n",
-                              event);
-                       break;
-       }
-       DEBUGP(3, dev, "<- reader_event\n");
-       return CS_SUCCESS;
-}
-
 static int reader_suspend(struct pcmcia_device *p_dev)
 {
        dev_link_t *link = dev_to_instance(p_dev);
@@ -691,11 +656,10 @@ static void reader_release(dev_link_t *link)
        pcmcia_release_io(link->handle, &link->io);
 }
 
-static dev_link_t *reader_attach(void)
+static int reader_attach(struct pcmcia_device *p_dev)
 {
        struct reader_dev *dev;
        dev_link_t *link;
-       client_reg_t client_reg;
        int i;
 
        for (i = 0; i < CM_MAX_DEV; i++) {
@@ -704,11 +668,11 @@ static dev_link_t *reader_attach(void)
        }
 
        if (i == CM_MAX_DEV)
-               return NULL;
+               return -ENODEV;
 
        dev = kzalloc(sizeof(struct reader_dev), GFP_KERNEL);
        if (dev == NULL)
-               return NULL;
+               return -ENOMEM;
 
        dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;
        dev->buffer_status = 0;
@@ -719,20 +683,6 @@ static dev_link_t *reader_attach(void)
        link->conf.IntType = INT_MEMORY_AND_IO;
        dev_table[i] = link;
 
-       client_reg.dev_info = &dev_info;
-       client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
-       client_reg.EventMask=
-               CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
-               CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
-               CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
-       client_reg.Version = 0x0210;
-       client_reg.event_callback_args.client_data = link;
-       i = pcmcia_register_client(&link->handle, &client_reg);
-       if (i) {
-               cs_error(link->handle, RegisterClient, i);
-               reader_detach(link->handle);
-               return NULL;
-       }
        init_waitqueue_head(&dev->devq);
        init_waitqueue_head(&dev->poll_wait);
        init_waitqueue_head(&dev->read_wait);
@@ -740,7 +690,13 @@ static dev_link_t *reader_attach(void)
        init_timer(&dev->poll_timer);
        dev->poll_timer.function = &cm4040_do_poll;
 
-       return link;
+       link->handle = p_dev;
+       p_dev->instance = link;
+
+       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+       reader_config(link, i);
+
+       return 0;
 }
 
 static void reader_detach(struct pcmcia_device *p_dev)
@@ -790,11 +746,10 @@ static struct pcmcia_driver reader_driver = {
        .drv            = {
                .name   = "cm4040_cs",
        },
-       .attach         = reader_attach,
+       .probe          = reader_attach,
        .remove         = reader_detach,
        .suspend        = reader_suspend,
        .resume         = reader_resume,
-       .event          = reader_event,
        .id_table       = cm4040_ids,
 };
 
This page took 0.026022 seconds and 5 git commands to generate.