diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/das1800.c')
-rw-r--r-- | drivers/staging/comedi/drivers/das1800.c | 92 |
1 files changed, 28 insertions, 64 deletions
diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c index 7900f959555..abf7638a9f7 100644 --- a/drivers/staging/comedi/drivers/das1800.c +++ b/drivers/staging/comedi/drivers/das1800.c @@ -429,11 +429,6 @@ static const struct das1800_board das1800_boards[] = { }, }; -/* - * Useful for shorthand access to the particular board structure - */ -#define thisboard ((const struct das1800_board *)dev->board_ptr) - struct das1800_private { volatile unsigned int count; /* number of data points left to be taken */ unsigned int divisor1; /* value to load into board's counter 1 for timed conversions */ @@ -454,14 +449,6 @@ struct das1800_private { short ao_update_bits; /* remembers the last write to the 'update' dac */ }; -/* analog out range for boards with basic analog out */ -static const struct comedi_lrange range_ao_1 = { - 1, - { - RANGE(-10, 10), - } -}; - /* analog out range for 'ao' boards */ /* static const struct comedi_lrange range_ao_2 = { @@ -476,6 +463,8 @@ static const struct comedi_lrange range_ao_2 = { static inline uint16_t munge_bipolar_sample(const struct comedi_device *dev, uint16_t sample) { + const struct das1800_board *thisboard = comedi_board(dev); + sample += 1 << (thisboard->resolution - 1); return sample; } @@ -731,7 +720,7 @@ static irqreturn_t das1800_interrupt(int irq, void *d) struct comedi_device *dev = d; unsigned int status; - if (dev->attached == 0) { + if (!dev->attached) { comedi_error(dev, "premature interrupt"); return IRQ_HANDLED; } @@ -789,6 +778,7 @@ static int das1800_ai_do_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { + const struct das1800_board *thisboard = comedi_board(dev); struct das1800_private *devpriv = dev->private; int err = 0; unsigned int tmp_arg; @@ -1232,6 +1222,7 @@ static int das1800_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { + const struct das1800_board *thisboard = comedi_board(dev); int i, n; int chan, range, aref, chan_range; int timeout = 1000; @@ -1295,6 +1286,7 @@ static int das1800_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { + const struct das1800_board *thisboard = comedi_board(dev); struct das1800_private *devpriv = dev->private; int chan = CR_CHAN(insn->chanspec); /* int range = CR_RANGE(insn->chanspec); */ @@ -1516,46 +1508,23 @@ static int das1800_probe(struct comedi_device *dev) static int das1800_attach(struct comedi_device *dev, struct comedi_devconfig *it) { + const struct das1800_board *thisboard = comedi_board(dev); struct das1800_private *devpriv; struct comedi_subdevice *s; - unsigned long iobase = it->options[0]; unsigned int irq = it->options[1]; unsigned int dma0 = it->options[2]; unsigned int dma1 = it->options[3]; - unsigned long iobase2; int board; - int retval; + int ret; devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); if (!devpriv) return -ENOMEM; dev->private = devpriv; - printk(KERN_DEBUG "comedi%d: %s: io 0x%lx", dev->minor, - dev->driver->driver_name, iobase); - if (irq) { - printk(KERN_CONT ", irq %u", irq); - if (dma0) { - printk(KERN_CONT ", dma %u", dma0); - if (dma1) - printk(KERN_CONT " and %u", dma1); - } - } - printk(KERN_CONT "\n"); - - if (iobase == 0) { - dev_err(dev->class_dev, "io base address required\n"); - return -EINVAL; - } - - /* check if io addresses are available */ - if (!request_region(iobase, DAS1800_SIZE, dev->driver->driver_name)) { - printk - (" I/O port conflict: failed to allocate ports 0x%lx to 0x%lx\n", - iobase, iobase + DAS1800_SIZE - 1); - return -EIO; - } - dev->iobase = iobase; + ret = comedi_request_region(dev, it->options[0], DAS1800_SIZE); + if (ret) + return ret; board = das1800_probe(dev); if (board < 0) { @@ -1564,18 +1533,16 @@ static int das1800_attach(struct comedi_device *dev, } dev->board_ptr = das1800_boards + board; + thisboard = comedi_board(dev); dev->board_name = thisboard->name; /* if it is an 'ao' board with fancy analog out then we need extra io ports */ if (thisboard->ao_ability == 2) { - iobase2 = iobase + IOBASE2; - if (!request_region(iobase2, DAS1800_SIZE, - dev->driver->driver_name)) { - printk - (" I/O port conflict: failed to allocate ports 0x%lx to 0x%lx\n", - iobase2, iobase2 + DAS1800_SIZE - 1); - return -EIO; - } + unsigned long iobase2 = dev->iobase + IOBASE2; + + ret = __comedi_request_region(dev, iobase2, DAS1800_SIZE); + if (ret) + return ret; devpriv->iobase2 = iobase2; } @@ -1618,9 +1585,9 @@ static int das1800_attach(struct comedi_device *dev, break; } - retval = das1800_init_dma(dev, dma0, dma1); - if (retval < 0) - return retval; + ret = das1800_init_dma(dev, dma0, dma1); + if (ret < 0) + return ret; if (devpriv->ai_buf0 == NULL) { devpriv->ai_buf0 = @@ -1629,9 +1596,9 @@ static int das1800_attach(struct comedi_device *dev, return -ENOMEM; } - retval = comedi_alloc_subdevices(dev, 4); - if (retval) - return retval; + ret = comedi_alloc_subdevices(dev, 4); + if (ret) + return ret; /* analog input subdevice */ s = &dev->subdevices[0]; @@ -1657,7 +1624,7 @@ static int das1800_attach(struct comedi_device *dev, s->subdev_flags = SDF_WRITABLE; s->n_chan = thisboard->ao_n_chan; s->maxdata = (1 << thisboard->resolution) - 1; - s->range_table = &range_ao_1; + s->range_table = &range_bipolar10; s->insn_write = das1800_ao_winsn; } else { s->type = COMEDI_SUBD_UNUSED; @@ -1701,21 +1668,18 @@ static void das1800_detach(struct comedi_device *dev) { struct das1800_private *devpriv = dev->private; - if (dev->iobase) - release_region(dev->iobase, DAS1800_SIZE); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { - if (devpriv->iobase2) - release_region(devpriv->iobase2, DAS1800_SIZE); if (devpriv->dma0) free_dma(devpriv->dma0); if (devpriv->dma1) free_dma(devpriv->dma1); kfree(devpriv->ai_buf0); kfree(devpriv->ai_buf1); + if (devpriv->iobase2) + release_region(devpriv->iobase2, DAS1800_SIZE); } -}; + comedi_legacy_detach(dev); +} static struct comedi_driver das1800_driver = { .driver_name = "das1800", |