Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / das16.c
index f238a1fbccbf7ac246e2e8e441846ae88cf5a846..762b5a6eac5acc1b94f8552230158f0f4a51a55c 100644 (file)
@@ -393,6 +393,8 @@ struct das16_private_struct {
        struct timer_list timer;        /*  for timed interrupt */
        volatile short timer_running;
        volatile short timer_mode;      /*  true if using timer mode */
+
+       unsigned long extra_iobase;
 };
 
 static int das16_cmd_test(struct comedi_device *dev, struct comedi_subdevice *s,
@@ -876,7 +878,7 @@ static void das16_interrupt(struct comedi_device *dev)
        int num_bytes, residue;
        int buffer_index;
 
-       if (dev->attached == 0) {
+       if (!dev->attached) {
                comedi_error(dev, "premature interrupt");
                return;
        }
@@ -1079,13 +1081,11 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        struct comedi_subdevice *s;
        int ret;
        unsigned int irq;
-       unsigned long iobase;
        unsigned int dma_chan;
        int timer_mode;
        unsigned long flags;
        struct comedi_krange *user_ai_range, *user_ao_range;
 
-       iobase = it->options[0];
 #if 0
        irq = it->options[1];
        timer_mode = it->options[8];
@@ -1097,8 +1097,6 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        if (timer_mode)
                irq = 0;
 
-       printk(KERN_INFO "comedi%d: das16:", dev->minor);
-
        /*  check that clock setting is valid */
        if (it->options[3]) {
                if (it->options[3] != 0 &&
@@ -1116,39 +1114,26 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        dev->private = devpriv;
 
        if (board->size < 0x400) {
-               printk(" 0x%04lx-0x%04lx\n", iobase, iobase + board->size);
-               if (!request_region(iobase, board->size, "das16")) {
-                       printk(KERN_ERR " I/O port conflict\n");
-                       return -EIO;
-               }
+               ret = comedi_request_region(dev, it->options[0], board->size);
+               if (ret)
+                       return ret;
        } else {
-               printk(KERN_INFO " 0x%04lx-0x%04lx 0x%04lx-0x%04lx\n",
-                      iobase, iobase + 0x0f,
-                      iobase + 0x400,
-                      iobase + 0x400 + (board->size & 0x3ff));
-               if (!request_region(iobase, 0x10, "das16")) {
-                       printk(KERN_ERR " I/O port conflict:  0x%04lx-0x%04lx\n",
-                              iobase, iobase + 0x0f);
-                       return -EIO;
-               }
-               if (!request_region(iobase + 0x400, board->size & 0x3ff,
-                                   "das16")) {
-                       release_region(iobase, 0x10);
-                       printk(KERN_ERR " I/O port conflict:  0x%04lx-0x%04lx\n",
-                              iobase + 0x400,
-                              iobase + 0x400 + (board->size & 0x3ff));
-                       return -EIO;
-               }
+               ret = comedi_request_region(dev, it->options[0], 0x10);
+               if (ret)
+                       return ret;
+               /* Request an additional region for the 8255 */
+               ret = __comedi_request_region(dev, dev->iobase + 0x400,
+                                             board->size & 0x3ff);
+               if (ret)
+                       return ret;
+               devpriv->extra_iobase = dev->iobase + 0x400;
        }
 
-       dev->iobase = iobase;
-
        /*  probe id bits to make sure they are consistent */
        if (das16_probe(dev, it)) {
                printk(KERN_ERR " id bits do not match selected board, aborting\n");
                return -EINVAL;
        }
-       dev->board_name = board->name;
 
        /*  get master clock speed */
        if (board->size < 0x400) {
@@ -1162,7 +1147,8 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 
        /* now for the irq */
        if (irq > 1 && irq < 8) {
-               ret = request_irq(irq, das16_dma_interrupt, 0, "das16", dev);
+               ret = request_irq(irq, das16_dma_interrupt, 0,
+                                 dev->board_name, dev);
 
                if (ret < 0)
                        return ret;
@@ -1188,7 +1174,7 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                        if (devpriv->dma_buffer[i] == NULL)
                                return -ENOMEM;
                }
-               if (request_dma(dma_chan, "das16")) {
+               if (request_dma(dma_chan, dev->board_name)) {
                        printk(KERN_ERR " failed to allocate dma channel %i\n",
                               dma_chan);
                        return -EINVAL;
@@ -1353,8 +1339,7 @@ static void das16_detach(struct comedi_device *dev)
        struct das16_private_struct *devpriv = dev->private;
 
        das16_reset(dev);
-       if (dev->subdevices)
-               subdev_8255_cleanup(dev, &dev->subdevices[4]);
+       comedi_spriv_free(dev, 4);
        if (devpriv) {
                int i;
                for (i = 0; i < 2; i++) {
@@ -1369,17 +1354,9 @@ static void das16_detach(struct comedi_device *dev)
                kfree(devpriv->user_ai_range_table);
                kfree(devpriv->user_ao_range_table);
        }
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       if (dev->iobase) {
-               if (board->size < 0x400) {
-                       release_region(dev->iobase, board->size);
-               } else {
-                       release_region(dev->iobase, 0x10);
-                       release_region(dev->iobase + 0x400,
-                                      board->size & 0x3ff);
-               }
-       }
+       if (devpriv->extra_iobase)
+               release_region(devpriv->extra_iobase, board->size & 0x3ff);
+       comedi_legacy_detach(dev);
 }
 
 static const struct das16_board das16_boards[] = {