diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/addi_apci_3xxx.c')
-rw-r--r-- | drivers/staging/comedi/drivers/addi_apci_3xxx.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c b/drivers/staging/comedi/drivers/addi_apci_3xxx.c index 0f0c7fa5daa3..a296bd5b2c0c 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c +++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c @@ -472,7 +472,7 @@ static int apci3xxx_ai_insn_read(struct comedi_device *dev, static int apci3xxx_ai_ns_to_timer(struct comedi_device *dev, unsigned int *ns, unsigned int flags) { - const struct apci3xxx_boardinfo *board = comedi_board(dev); + const struct apci3xxx_boardinfo *board = dev->board_ptr; struct apci3xxx_private *devpriv = dev->private; unsigned int base; unsigned int timer; @@ -496,15 +496,15 @@ static int apci3xxx_ai_ns_to_timer(struct comedi_device *dev, break; } - switch (flags & TRIG_ROUND_MASK) { - case TRIG_ROUND_NEAREST: + switch (flags & CMDF_ROUND_MASK) { + case CMDF_ROUND_NEAREST: default: timer = (*ns + base / 2) / base; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: timer = *ns / base; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: timer = (*ns + base - 1) / base; break; } @@ -523,7 +523,7 @@ static int apci3xxx_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { - const struct apci3xxx_boardinfo *board = comedi_board(dev); + const struct apci3xxx_boardinfo *board = dev->board_ptr; int err = 0; unsigned int arg; @@ -628,16 +628,20 @@ static int apci3xxx_ao_insn_write(struct comedi_device *dev, int i; for (i = 0; i < insn->n; i++) { + unsigned int val = data[i]; + /* Set the range selection */ writel(range, dev->mmio + 96); /* Write the analog value to the selected channel */ - writel((data[i] << 8) | chan, dev->mmio + 100); + writel((val << 8) | chan, dev->mmio + 100); /* Wait the end of transfer */ ret = comedi_timeout(dev, s, insn, apci3xxx_ao_eoc, 0); if (ret) return ret; + + s->readback[chan] = val; } return insn->n; @@ -850,6 +854,11 @@ static int apci3xxx_auto_attach(struct comedi_device *dev, s->maxdata = 0x0fff; s->range_table = &apci3xxx_ao_range; s->insn_write = apci3xxx_ao_insn_write; + s->insn_read = comedi_readback_insn_read; + + ret = comedi_alloc_subdev_readback(s); + if (ret) + return ret; subdev++; } @@ -901,17 +910,9 @@ static int apci3xxx_auto_attach(struct comedi_device *dev, static void apci3xxx_detach(struct comedi_device *dev) { - struct apci3xxx_private *devpriv = dev->private; - - if (devpriv) { - if (dev->iobase) - apci3xxx_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); - } - comedi_pci_disable(dev); + if (dev->iobase) + apci3xxx_reset(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci3xxx_driver = { |