]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/pcmcia/cm4040_cs.c
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6-omap-h63xx.git] / drivers / char / pcmcia / cm4040_cs.c
index 97e32e7f84dccf43cb753ccf694636bac72b7afd..9b1ff7e8f896b9257163e6b32549b4cb455dc5f0 100644 (file)
@@ -65,7 +65,7 @@ static char *version =
 /* how often to poll for fifo status change */
 #define POLL_PERIOD                            msecs_to_jiffies(10)
 
-static void reader_release(dev_link_t *link);
+static void reader_release(struct pcmcia_device *link);
 
 static int major;
 static struct class *cmx_class;
@@ -87,7 +87,7 @@ struct reader_dev {
        struct timer_list       poll_timer;
 };
 
-static dev_link_t *dev_table[CM_MAX_DEV];
+static struct pcmcia_device *dev_table[CM_MAX_DEV];
 
 #ifndef PCMCIA_DEBUG
 #define        xoutb   outb
@@ -246,7 +246,7 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
                return -EAGAIN;
        }
 
-       if ((dev->p_dev->state & DEV_PRESENT)==0)
+       if (!pcmcia_dev_present(dev->p_dev))
                return -ENODEV;
 
        for (i = 0; i < 5; i++) {
@@ -351,7 +351,7 @@ static ssize_t cm4040_write(struct file *filp, const char __user *buf,
                return -EAGAIN;
        }
 
-       if ((dev->p_dev->state & DEV_PRESENT) == 0)
+       if (!pcmcia_dev_present(dev->p_dev))
                return -ENODEV;
 
        bytes_to_write = count;
@@ -445,14 +445,14 @@ static unsigned int cm4040_poll(struct file *filp, poll_table *wait)
 static int cm4040_open(struct inode *inode, struct file *filp)
 {
        struct reader_dev *dev;
-       dev_link_t *link;
+       struct pcmcia_device *link;
        int minor = iminor(inode);
 
        if (minor >= CM_MAX_DEV)
                return -ENODEV;
 
        link = dev_table[minor];
-       if (link == NULL || !(DEV_OK(link)))
+       if (link == NULL || !pcmcia_dev_present(link))
                return -ENODEV;
 
        if (link->open)
@@ -478,7 +478,7 @@ static int cm4040_open(struct inode *inode, struct file *filp)
 static int cm4040_close(struct inode *inode, struct file *filp)
 {
        struct reader_dev *dev = filp->private_data;
-       dev_link_t *link;
+       struct pcmcia_device *link;
        int minor = iminor(inode);
 
        DEBUGP(2, dev, "-> cm4040_close(maj/min=%d.%d)\n", imajor(inode),
@@ -500,7 +500,7 @@ static int cm4040_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static void cm4040_reader_release(dev_link_t *link)
+static void cm4040_reader_release(struct pcmcia_device *link)
 {
        struct reader_dev *dev = link->priv;
 
@@ -514,9 +514,8 @@ static void cm4040_reader_release(dev_link_t *link)
        return;
 }
 
-static void reader_config(dev_link_t *link, int devno)
+static int reader_config(struct pcmcia_device *link, int devno)
 {
-       client_handle_t handle;
        struct reader_dev *dev;
        tuple_t tuple;
        cisparse_t parse;
@@ -524,43 +523,22 @@ static void reader_config(dev_link_t *link, int devno)
        int fail_fn, fail_rc;
        int rc;
 
-       handle = link->handle;
-
-       tuple.DesiredTuple = CISTPL_CONFIG;
        tuple.Attributes = 0;
        tuple.TupleData = buf;
        tuple.TupleDataMax = sizeof(buf);
        tuple.TupleOffset = 0;
 
-       if ((fail_rc = pcmcia_get_first_tuple(handle, &tuple)) != CS_SUCCESS) {
-               fail_fn = GetFirstTuple;
-               goto cs_failed;
-       }
-       if ((fail_rc = pcmcia_get_tuple_data(handle, &tuple)) != CS_SUCCESS) {
-               fail_fn = GetTupleData;
-               goto cs_failed;
-       }
-       if ((fail_rc = pcmcia_parse_tuple(handle, &tuple, &parse))
-                                                       != CS_SUCCESS) {
-               fail_fn = ParseTuple;
-               goto cs_failed;
-       }
-
-       link->state |= DEV_CONFIG;
-       link->conf.ConfigBase = parse.config.base;
-       link->conf.Present = parse.config.rmask[0];
-
        link->io.BasePort2 = 0;
        link->io.NumPorts2 = 0;
        link->io.Attributes2 = 0;
        tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-       for (rc = pcmcia_get_first_tuple(handle, &tuple);
+       for (rc = pcmcia_get_first_tuple(link, &tuple);
             rc == CS_SUCCESS;
-            rc = pcmcia_get_next_tuple(handle, &tuple)) {
-               rc = pcmcia_get_tuple_data(handle, &tuple);
+            rc = pcmcia_get_next_tuple(link, &tuple)) {
+               rc = pcmcia_get_tuple_data(link, &tuple);
                if (rc != CS_SUCCESS)
                        continue;
-               rc = pcmcia_parse_tuple(handle, &tuple, &parse);
+               rc = pcmcia_parse_tuple(link, &tuple, &parse);
                if (rc != CS_SUCCESS)
                        continue;
 
@@ -578,13 +556,13 @@ static void reader_config(dev_link_t *link, int devno)
                        link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
                link->io.IOAddrLines = parse.cftable_entry.io.flags
                                                & CISTPL_IO_LINES_MASK;
-               rc = pcmcia_request_io(handle, &link->io);
+               rc = pcmcia_request_io(link, &link->io);
 
-               dev_printk(KERN_INFO, &handle_to_dev(handle), "foo");
+               dev_printk(KERN_INFO, &handle_to_dev(link), "foo");
                if (rc == CS_SUCCESS)
                        break;
                else
-                       dev_printk(KERN_INFO, &handle_to_dev(handle),
+                       dev_printk(KERN_INFO, &handle_to_dev(link),
                                   "pcmcia_request_io failed 0x%x\n", rc);
        }
        if (rc != CS_SUCCESS)
@@ -592,10 +570,10 @@ static void reader_config(dev_link_t *link, int devno)
 
        link->conf.IntType = 00000002;
 
-       if ((fail_rc = pcmcia_request_configuration(handle,&link->conf))
+       if ((fail_rc = pcmcia_request_configuration(link,&link->conf))
                                                                !=CS_SUCCESS) {
                fail_fn = RequestConfiguration;
-               dev_printk(KERN_INFO, &handle_to_dev(handle),
+               dev_printk(KERN_INFO, &handle_to_dev(link),
                           "pcmcia_request_configuration failed 0x%x\n",
                           fail_rc);
                goto cs_release;
@@ -605,34 +583,29 @@ static void reader_config(dev_link_t *link, int devno)
        sprintf(dev->node.dev_name, DEVICE_NAME "%d", devno);
        dev->node.major = major;
        dev->node.minor = devno;
-       dev->node.next = NULL;
-       link->dev_node = &dev->node;
-       link->state &= ~DEV_CONFIG_PENDING;
+       dev->node.next = &dev->node;
 
        DEBUGP(2, dev, "device " DEVICE_NAME "%d at 0x%.4x-0x%.4x\n", devno,
              link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1);
        DEBUGP(2, dev, "<- reader_config (succ)\n");
 
-       return;
+       return 0;
 
-cs_failed:
-       cs_error(handle, fail_fn, fail_rc);
 cs_release:
        reader_release(link);
-       link->state &= ~DEV_CONFIG_PENDING;
+       return -ENODEV;
 }
 
-static void reader_release(dev_link_t *link)
+static void reader_release(struct pcmcia_device *link)
 {
        cm4040_reader_release(link->priv);
-       pcmcia_disable_device(link->handle);
+       pcmcia_disable_device(link);
 }
 
-static int reader_attach(struct pcmcia_device *p_dev)
+static int reader_probe(struct pcmcia_device *link)
 {
        struct reader_dev *dev;
-       int i;
-       dev_link_t *link = dev_to_instance(p_dev);
+       int i, ret;
 
        for (i = 0; i < CM_MAX_DEV; i++) {
                if (dev_table[i] == NULL)
@@ -650,7 +623,7 @@ static int reader_attach(struct pcmcia_device *p_dev)
        dev->buffer_status = 0;
 
        link->priv = dev;
-       dev->p_dev = p_dev;
+       dev->p_dev = link;
 
        link->conf.IntType = INT_MEMORY_AND_IO;
        dev_table[i] = link;
@@ -662,8 +635,9 @@ static int reader_attach(struct pcmcia_device *p_dev)
        init_timer(&dev->poll_timer);
        dev->poll_timer.function = &cm4040_do_poll;
 
-       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
-       reader_config(link, i);
+       ret = reader_config(link, i);
+       if (ret)
+               return ret;
 
        class_device_create(cmx_class, NULL, MKDEV(major, i), NULL,
                            "cmx%d", i);
@@ -671,9 +645,8 @@ static int reader_attach(struct pcmcia_device *p_dev)
        return 0;
 }
 
-static void reader_detach(struct pcmcia_device *p_dev)
+static void reader_detach(struct pcmcia_device *link)
 {
-       dev_link_t *link = dev_to_instance(p_dev);
        struct reader_dev *dev = link->priv;
        int devno;
 
@@ -685,10 +658,7 @@ static void reader_detach(struct pcmcia_device *p_dev)
        if (devno == CM_MAX_DEV)
                return;
 
-       link->state &= ~DEV_PRESENT;
-
-       if (link->state & DEV_CONFIG)
-               reader_release(link);
+       reader_release(link);
 
        dev_table[devno] = NULL;
        kfree(dev);
@@ -698,7 +668,7 @@ static void reader_detach(struct pcmcia_device *p_dev)
        return;
 }
 
-static struct file_operations reader_fops = {
+static const struct file_operations reader_fops = {
        .owner          = THIS_MODULE,
        .read           = cm4040_read,
        .write          = cm4040_write,
@@ -720,7 +690,7 @@ static struct pcmcia_driver reader_driver = {
        .drv            = {
                .name   = "cm4040_cs",
        },
-       .probe          = reader_attach,
+       .probe          = reader_probe,
        .remove         = reader_detach,
        .id_table       = cm4040_ids,
 };
@@ -731,19 +701,22 @@ static int __init cm4040_init(void)
 
        printk(KERN_INFO "%s\n", version);
        cmx_class = class_create(THIS_MODULE, "cardman_4040");
-       if (!cmx_class)
-               return -1;
-
-       rc = pcmcia_register_driver(&reader_driver);
-       if (rc < 0)
-               return rc;
+       if (IS_ERR(cmx_class))
+               return PTR_ERR(cmx_class);
 
        major = register_chrdev(0, DEVICE_NAME, &reader_fops);
        if (major < 0) {
                printk(KERN_WARNING MODULE_NAME
                        ": could not get major number\n");
-               return -1;
+               return major;
        }
+
+       rc = pcmcia_register_driver(&reader_driver);
+       if (rc < 0) {
+               unregister_chrdev(major, DEVICE_NAME);
+               return rc;
+       }
+
        return 0;
 }