Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh...
[pandora-kernel.git] / drivers / staging / comedi / drivers.c
index 44d6b62..4a29ed7 100644 (file)
 #include <linux/ioport.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
-#include "comedidev.h"
-#include "wrapper.h"
 #include <linux/highmem.h>     /* for SuSE brokenness */
 #include <linux/vmalloc.h>
 #include <linux/cdev.h>
 #include <linux/dma-mapping.h>
-
 #include <linux/io.h>
 #include <asm/system.h>
 
+#include "comedidev.h"
+#include "internal.h"
+
 static int postconfig(struct comedi_device *dev);
 static int insn_rw_emulate_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
@@ -54,16 +54,9 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
 static void *comedi_recognize(struct comedi_driver *driv, const char *name);
 static void comedi_report_boards(struct comedi_driver *driv);
 static int poll_invalid(struct comedi_device *dev, struct comedi_subdevice *s);
-int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
-                    unsigned long new_size);
 
 struct comedi_driver *comedi_drivers;
 
-int comedi_modprobe(int minor)
-{
-       return -EINVAL;
-}
-
 static void cleanup_device(struct comedi_device *dev)
 {
        int i;
@@ -84,7 +77,7 @@ static void cleanup_device(struct comedi_device *dev)
        }
        kfree(dev->private);
        dev->private = NULL;
-       dev->driver = 0;
+       dev->driver = NULL;
        dev->board_name = NULL;
        dev->board_ptr = NULL;
        dev->iobase = 0;
@@ -102,7 +95,8 @@ static void __comedi_device_detach(struct comedi_device *dev)
        if (dev->driver)
                dev->driver->detach(dev);
        else
-               printk("BUG: dev->driver=NULL in comedi_device_detach()\n");
+               printk(KERN_WARNING
+                      "BUG: dev->driver=NULL in comedi_device_detach()\n");
        cleanup_device(dev);
 }
 
@@ -124,7 +118,7 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        for (driv = comedi_drivers; driv; driv = driv->next) {
                if (!try_module_get(driv->module)) {
                        printk
-                           ("comedi: failed to increment module count, skipping\n");
+                           (KERN_INFO "comedi: failed to increment module count, skipping\n");
                        continue;
                }
                if (driv->num_names) {
@@ -139,7 +133,8 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                                continue;
                        }
                }
-               /* initialize dev->driver here so comedi_error() can be called from attach */
+               /* initialize dev->driver here so
+                * comedi_error() can be called from attach */
                dev->driver = driv;
                ret = driv->attach(dev, it);
                if (ret < 0) {
@@ -154,7 +149,8 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        /*  report valid board names before returning error */
        for (driv = comedi_drivers; driv; driv = driv->next) {
                if (!try_module_get(driv->module)) {
-                       printk("comedi: failed to increment module count\n");
+                       printk(KERN_INFO
+                              "comedi: failed to increment module count\n");
                        continue;
                }
                comedi_report_boards(driv);
@@ -172,7 +168,8 @@ attached:
        }
 
        if (!dev->board_name) {
-               printk("BUG: dev->board_name=<%p>\n", dev->board_name);
+               printk(KERN_WARNING "BUG: dev->board_name=<%p>\n",
+                      dev->board_name);
                dev->board_name = "BUG";
        }
        smp_wmb();
@@ -188,6 +185,7 @@ int comedi_driver_register(struct comedi_driver *driver)
 
        return 0;
 }
+EXPORT_SYMBOL(comedi_driver_register);
 
 int comedi_driver_unregister(struct comedi_driver *driver)
 {
@@ -208,7 +206,7 @@ int comedi_driver_unregister(struct comedi_driver *driver)
                if (dev->attached && dev->driver == driver) {
                        if (dev->use_count)
                                printk
-                                   ("BUG! detaching device with use_count=%d\n",
+                                   (KERN_WARNING "BUG! detaching device with use_count=%d\n",
                                     dev->use_count);
                        comedi_device_detach(dev);
                }
@@ -228,6 +226,7 @@ int comedi_driver_unregister(struct comedi_driver *driver)
        }
        return -EINVAL;
 }
+EXPORT_SYMBOL(comedi_driver_unregister);
 
 static int postconfig(struct comedi_device *dev)
 {
@@ -253,7 +252,8 @@ static int postconfig(struct comedi_device *dev)
                        async =
                            kzalloc(sizeof(struct comedi_async), GFP_KERNEL);
                        if (async == NULL) {
-                               printk("failed to allocate async struct\n");
+                               printk(KERN_INFO
+                                      "failed to allocate async struct\n");
                                return -ENOMEM;
                        }
                        init_waitqueue_head(&async->wait_head);
@@ -268,7 +268,7 @@ static int postconfig(struct comedi_device *dev)
                        async->prealloc_buf = NULL;
                        async->prealloc_bufsz = 0;
                        if (comedi_buf_alloc(dev, s, DEFAULT_BUF_SIZE) < 0) {
-                               printk("Buffer allocation failed\n");
+                               printk(KERN_INFO "Buffer allocation failed\n");
                                return -ENOMEM;
                        }
                        if (s->buf_change) {
@@ -303,8 +303,9 @@ static int postconfig(struct comedi_device *dev)
        return 0;
 }
 
-/*  generic recognize function for drivers that register their supported board names */
-void *comedi_recognize(struct comedi_driver *driv, const char *name)
+/* generic recognize function for drivers
+ * that register their supported board names */
+static void *comedi_recognize(struct comedi_driver *driv, const char *name)
 {
        unsigned i;
        const char *const *name_ptr = driv->board_name;
@@ -319,22 +320,22 @@ void *comedi_recognize(struct comedi_driver *driv, const char *name)
        return NULL;
 }
 
-void comedi_report_boards(struct comedi_driver *driv)
+static void comedi_report_boards(struct comedi_driver *driv)
 {
        unsigned int i;
        const char *const *name_ptr;
 
-       printk("comedi: valid board names for %s driver are:\n",
+       printk(KERN_INFO "comedi: valid board names for %s driver are:\n",
               driv->driver_name);
 
        name_ptr = driv->board_name;
        for (i = 0; i < driv->num_names; i++) {
-               printk(" %s\n", *name_ptr);
+               printk(KERN_INFO " %s\n", *name_ptr);
                name_ptr = (const char **)((char *)name_ptr + driv->offset);
        }
 
        if (driv->num_names == 0)
-               printk(" %s\n", driv->driver_name);
+               printk(KERN_INFO " %s\n", driv->driver_name);
 }
 
 static int poll_invalid(struct comedi_device *dev, struct comedi_subdevice *s)
@@ -371,8 +372,9 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
        if (insn->insn == INSN_WRITE) {
                if (!(s->subdev_flags & SDF_WRITABLE))
                        return -EINVAL;
-               new_data[0] = 1 << (chan - base_bitfield_channel);      /* mask */
-               new_data[1] = data[0] ? (1 << (chan - base_bitfield_channel)) : 0;      /* bits */
+               new_data[0] = 1 << (chan - base_bitfield_channel); /* mask */
+               new_data[1] = data[0] ? (1 << (chan - base_bitfield_channel))
+                             : 0; /* bits */
        }
 
        ret = s->insn_bits(dev, s, &new_insn, new_data);
@@ -440,9 +442,7 @@ int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
                unsigned i;
                for (i = 0; i < async->n_buf_pages; ++i) {
                        if (async->buf_page_list[i].virt_addr) {
-                               mem_map_unreserve(virt_to_page
-                                                 (async->buf_page_list[i].
-                                                  virt_addr));
+                               clear_bit(PG_reserved, &(virt_to_page(async->buf_page_list[i].virt_addr)->flags));
                                if (s->async_dma_dir != DMA_NONE) {
                                        dma_free_coherent(dev->hw_dev,
                                                          PAGE_SIZE,
@@ -495,12 +495,9 @@ int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
                                if (async->buf_page_list[i].virt_addr == NULL)
                                        break;
 
-                               mem_map_reserve(virt_to_page
-                                               (async->buf_page_list[i].
-                                                virt_addr));
-                               pages[i] =
-                                   virt_to_page(async->
-                                                buf_page_list[i].virt_addr);
+                               set_bit(PG_reserved,
+                                       &(virt_to_page(async->buf_page_list[i].virt_addr)->flags));
+                               pages[i] = virt_to_page(async->buf_page_list[i].virt_addr);
                        }
                }
                if (i == n_pages) {
@@ -517,9 +514,7 @@ int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
                                            NULL) {
                                                break;
                                        }
-                                       mem_map_unreserve(virt_to_page
-                                                         (async->buf_page_list
-                                                          [i].virt_addr));
+                                       clear_bit(PG_reserved, &(virt_to_page(async->buf_page_list[i].virt_addr)->flags));
                                        if (s->async_dma_dir != DMA_NONE) {
                                                dma_free_coherent(dev->hw_dev,
                                                                  PAGE_SIZE,
@@ -549,8 +544,8 @@ int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
 
 /* munging is applied to data by core as it passes between user
  * and kernel space */
-unsigned int comedi_buf_munge(struct comedi_async *async,
-                             unsigned int num_bytes)
+static unsigned int comedi_buf_munge(struct comedi_async *async,
+                                    unsigned int num_bytes)
 {
        struct comedi_subdevice *s = async->subdevice;
        unsigned int count = 0;
@@ -568,7 +563,8 @@ unsigned int comedi_buf_munge(struct comedi_async *async,
 
                block_size = num_bytes - count;
                if (block_size < 0) {
-                       printk("%s: %s: bug! block_size is negative\n",
+                       printk(KERN_WARNING
+                              "%s: %s: bug! block_size is negative\n",
                               __FILE__, __func__);
                        break;
                }
@@ -579,7 +575,8 @@ unsigned int comedi_buf_munge(struct comedi_async *async,
                s->munge(s->device, s, async->prealloc_buf + async->munge_ptr,
                         block_size, async->munge_chan);
 
-               smp_wmb();      /* barrier insures data is munged in buffer before munge_count is incremented */
+               smp_wmb();      /* barrier insures data is munged in buffer
+                                * before munge_count is incremented */
 
                async->munge_chan += block_size / num_sample_bytes;
                async->munge_chan %= async->cmd.chanlist_len;
@@ -626,6 +623,7 @@ unsigned int comedi_buf_write_alloc(struct comedi_async *async,
        smp_mb();
        return nbytes;
 }
+EXPORT_SYMBOL(comedi_buf_write_alloc);
 
 /* allocates nothing unless it can completely fulfill the request */
 unsigned int comedi_buf_write_alloc_strict(struct comedi_async *async,
@@ -649,7 +647,7 @@ unsigned comedi_buf_write_free(struct comedi_async *async, unsigned int nbytes)
        if ((int)(async->buf_write_count + nbytes -
                  async->buf_write_alloc_count) > 0) {
                printk
-                   ("comedi: attempted to write-free more bytes than have been write-allocated.\n");
+                   (KERN_INFO "comedi: attempted to write-free more bytes than have been write-allocated.\n");
                nbytes = async->buf_write_alloc_count - async->buf_write_count;
        }
        async->buf_write_count += nbytes;
@@ -660,6 +658,7 @@ unsigned comedi_buf_write_free(struct comedi_async *async, unsigned int nbytes)
 
        return nbytes;
 }
+EXPORT_SYMBOL(comedi_buf_write_free);
 
 /* allocates a chunk for the reader from filled (and munged) buffer space */
 unsigned comedi_buf_read_alloc(struct comedi_async *async, unsigned nbytes)
@@ -674,16 +673,18 @@ unsigned comedi_buf_read_alloc(struct comedi_async *async, unsigned nbytes)
        smp_rmb();
        return nbytes;
 }
+EXPORT_SYMBOL(comedi_buf_read_alloc);
 
 /* transfers control of a chunk from reader to free buffer space */
 unsigned comedi_buf_read_free(struct comedi_async *async, unsigned int nbytes)
 {
-       /*  barrier insures data has been read out of buffer before read count is incremented */
+       /* barrier insures data has been read out of
+        * buffer before read count is incremented */
        smp_mb();
        if ((int)(async->buf_read_count + nbytes -
                  async->buf_read_alloc_count) > 0) {
-               printk
-                   ("comedi: attempted to read-free more bytes than have been read-allocated.\n");
+               printk(KERN_INFO
+                      "comedi: attempted to read-free more bytes than have been read-allocated.\n");
                nbytes = async->buf_read_alloc_count - async->buf_read_count;
        }
        async->buf_read_count += nbytes;
@@ -691,6 +692,7 @@ unsigned comedi_buf_read_free(struct comedi_async *async, unsigned int nbytes)
        async->buf_read_ptr %= async->prealloc_bufsz;
        return nbytes;
 }
+EXPORT_SYMBOL(comedi_buf_read_free);
 
 void comedi_buf_memcpy_to(struct comedi_async *async, unsigned int offset,
                          const void *data, unsigned int num_bytes)
@@ -716,6 +718,7 @@ void comedi_buf_memcpy_to(struct comedi_async *async, unsigned int offset,
                write_ptr = 0;
        }
 }
+EXPORT_SYMBOL(comedi_buf_memcpy_to);
 
 void comedi_buf_memcpy_from(struct comedi_async *async, unsigned int offset,
                            void *dest, unsigned int nbytes)
@@ -742,6 +745,7 @@ void comedi_buf_memcpy_from(struct comedi_async *async, unsigned int offset,
                read_ptr = 0;
        }
 }
+EXPORT_SYMBOL(comedi_buf_memcpy_from);
 
 unsigned int comedi_buf_read_n_available(struct comedi_async *async)
 {
@@ -757,6 +761,7 @@ unsigned int comedi_buf_read_n_available(struct comedi_async *async)
        smp_rmb();
        return num_bytes;
 }
+EXPORT_SYMBOL(comedi_buf_read_n_available);
 
 int comedi_buf_get(struct comedi_async *async, short *x)
 {
@@ -769,6 +774,7 @@ int comedi_buf_get(struct comedi_async *async, short *x)
        comedi_buf_read_free(async, sizeof(short));
        return 1;
 }
+EXPORT_SYMBOL(comedi_buf_get);
 
 int comedi_buf_put(struct comedi_async *async, short x)
 {
@@ -782,6 +788,7 @@ int comedi_buf_put(struct comedi_async *async, short x)
        comedi_buf_write_free(async, sizeof(short));
        return 1;
 }
+EXPORT_SYMBOL(comedi_buf_put);
 
 void comedi_reset_async_buf(struct comedi_async *async)
 {
@@ -802,8 +809,9 @@ void comedi_reset_async_buf(struct comedi_async *async)
        async->events = 0;
 }
 
-int comedi_auto_config(struct device *hardware_device, const char *board_name,
-                      const int *options, unsigned num_options)
+static int comedi_auto_config(struct device *hardware_device,
+                             const char *board_name, const int *options,
+                             unsigned num_options)
 {
        struct comedi_devconfig it;
        int minor;
@@ -848,7 +856,7 @@ cleanup:
        return retval;
 }
 
-void comedi_auto_unconfig(struct device *hardware_device)
+static void comedi_auto_unconfig(struct device *hardware_device)
 {
        unsigned *minor = (unsigned *)dev_get_drvdata(hardware_device);
        if (minor == NULL)
@@ -873,20 +881,24 @@ int comedi_pci_auto_config(struct pci_dev *pcidev, const char *board_name)
        return comedi_auto_config(&pcidev->dev, board_name,
                                  options, ARRAY_SIZE(options));
 }
+EXPORT_SYMBOL_GPL(comedi_pci_auto_config);
 
 void comedi_pci_auto_unconfig(struct pci_dev *pcidev)
 {
        comedi_auto_unconfig(&pcidev->dev);
 }
+EXPORT_SYMBOL_GPL(comedi_pci_auto_unconfig);
 
 int comedi_usb_auto_config(struct usb_device *usbdev, const char *board_name)
 {
        BUG_ON(usbdev == NULL);
        return comedi_auto_config(&usbdev->dev, board_name, NULL, 0);
 }
+EXPORT_SYMBOL_GPL(comedi_usb_auto_config);
 
 void comedi_usb_auto_unconfig(struct usb_device *usbdev)
 {
        BUG_ON(usbdev == NULL);
        comedi_auto_unconfig(&usbdev->dev);
 }
+EXPORT_SYMBOL_GPL(comedi_usb_auto_unconfig);