diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/das16.c')
-rw-r--r-- | drivers/staging/comedi/drivers/das16.c | 67 |
1 files changed, 22 insertions, 45 deletions
diff --git a/drivers/staging/comedi/drivers/das16.c b/drivers/staging/comedi/drivers/das16.c index f238a1fbccb..762b5a6eac5 100644 --- a/drivers/staging/comedi/drivers/das16.c +++ b/drivers/staging/comedi/drivers/das16.c @@ -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[] = { |