diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/dt2801.c')
-rw-r--r-- | drivers/staging/comedi/drivers/dt2801.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/drivers/staging/comedi/drivers/dt2801.c b/drivers/staging/comedi/drivers/dt2801.c index ad8ba0be4878..e97386343a0e 100644 --- a/drivers/staging/comedi/drivers/dt2801.c +++ b/drivers/staging/comedi/drivers/dt2801.c @@ -207,9 +207,7 @@ static const struct dt2801_board boardtypes[] = { }; struct dt2801_private { - const struct comedi_lrange *dac_range_types[2]; - unsigned int ao_readback[2]; }; /* These are the low-level routines: @@ -309,7 +307,7 @@ static int dt2801_wait_for_ready(struct comedi_device *dev) return -ETIME; } -static int dt2801_writecmd(struct comedi_device *dev, int command) +static void dt2801_writecmd(struct comedi_device *dev, int command) { int stat; @@ -323,8 +321,6 @@ static int dt2801_writecmd(struct comedi_device *dev, int command) if (!(stat & DT_S_READY)) dev_dbg(dev->class_dev, "!ready in %s, ignoring\n", __func__); outb_p(command, dev->iobase + DT2801_CMD); - - return 0; } static int dt2801_reset(struct comedi_device *dev) @@ -380,7 +376,7 @@ static int probe_number_of_ai_chans(struct comedi_device *dev) int data; for (n_chans = 0; n_chans < 16; n_chans++) { - stat = dt2801_writecmd(dev, DT_C_READ_ADIM); + dt2801_writecmd(dev, DT_C_READ_ADIM); dt2801_writedata(dev, 0); dt2801_writedata(dev, n_chans); stat = dt2801_readdata2(dev, &data); @@ -451,7 +447,7 @@ static int dt2801_ai_insn_read(struct comedi_device *dev, int i; for (i = 0; i < insn->n; i++) { - stat = dt2801_writecmd(dev, DT_C_READ_ADIM); + dt2801_writecmd(dev, DT_C_READ_ADIM); dt2801_writedata(dev, CR_RANGE(insn->chanspec)); dt2801_writedata(dev, CR_CHAN(insn->chanspec)); stat = dt2801_readdata2(dev, &d); @@ -465,28 +461,18 @@ static int dt2801_ai_insn_read(struct comedi_device *dev, return i; } -static int dt2801_ao_insn_read(struct comedi_device *dev, - struct comedi_subdevice *s, - struct comedi_insn *insn, unsigned int *data) -{ - struct dt2801_private *devpriv = dev->private; - - data[0] = devpriv->ao_readback[CR_CHAN(insn->chanspec)]; - - return 1; -} - static int dt2801_ao_insn_write(struct comedi_device *dev, struct comedi_subdevice *s, - struct comedi_insn *insn, unsigned int *data) + struct comedi_insn *insn, + unsigned int *data) { - struct dt2801_private *devpriv = dev->private; + unsigned int chan = CR_CHAN(insn->chanspec); dt2801_writecmd(dev, DT_C_WRITE_DAIM); - dt2801_writedata(dev, CR_CHAN(insn->chanspec)); + dt2801_writedata(dev, chan); dt2801_writedata2(dev, data[0]); - devpriv->ao_readback[CR_CHAN(insn->chanspec)] = data[0]; + s->readback[chan] = data[0]; return 1; } @@ -571,7 +557,7 @@ static int dt2801_attach(struct comedi_device *dev, struct comedi_devconfig *it) havetype: dev->board_ptr = boardtypes + type; - board = comedi_board(dev); + board = dev->board_ptr; n_ai_chans = probe_number_of_ai_chans(dev); @@ -610,8 +596,12 @@ havetype: s->range_table_list = devpriv->dac_range_types; devpriv->dac_range_types[0] = dac_range_lkup(it->options[4]); devpriv->dac_range_types[1] = dac_range_lkup(it->options[5]); - s->insn_read = dt2801_ao_insn_read; s->insn_write = dt2801_ao_insn_write; + s->insn_read = comedi_readback_insn_read; + + ret = comedi_alloc_subdev_readback(s); + if (ret) + return ret; s = &dev->subdevices[2]; /* 1st digital subdevice */ |