aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/das16.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi/drivers/das16.c')
-rw-r--r--drivers/staging/comedi/drivers/das16.c67
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[] = {