Skip to content

Commit

Permalink
staging: comedi: das08: Support read-back of AO subdevice
Browse files Browse the repository at this point in the history
Stash the last value written to each AO channel in private data and
support the INSN_READ instruction to read it back.  Don't bother setting
the SDF_READABLE subdevice flag though as the hardware isn't really
readable - we're just faking it.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Ian Abbott authored and Greg Kroah-Hartman committed Sep 4, 2012
1 parent 8432eb3 commit f0ba1d6
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
20 changes: 19 additions & 1 deletion drivers/staging/comedi/drivers/das08.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ static void das08_ao_set_data(struct comedi_device *dev,
unsigned int chan, unsigned int data)
{
const struct das08_board_struct *thisboard = comedi_board(dev);
struct das08_private_struct *devpriv = dev->private;
unsigned char lsb;
unsigned char msb;

Expand All @@ -389,6 +390,7 @@ static void das08_ao_set_data(struct comedi_device *dev,
/* load DACs */
inb(dev->iobase + DAS08AO_AO_UPDATE);
}
devpriv->ao_readback[chan] = data;
}

static void das08_ao_initialize(struct comedi_device *dev,
Expand Down Expand Up @@ -417,6 +419,22 @@ static int das08_ao_winsn(struct comedi_device *dev,
return n;
}

static int das08_ao_rinsn(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
struct das08_private_struct *devpriv = dev->private;
unsigned int n;
unsigned int chan;

chan = CR_CHAN(insn->chanspec);

for (n = 0; n < insn->n; n++)
data[n] = devpriv->ao_readback[chan];

return n;
}

static void i8254_initialize(struct comedi_device *dev)
{
const struct das08_board_struct *thisboard = comedi_board(dev);
Expand Down Expand Up @@ -670,12 +688,12 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
/* ao */
if (thisboard->ao_nbits) {
s->type = COMEDI_SUBD_AO;
/* XXX lacks read-back insn */
s->subdev_flags = SDF_WRITABLE;
s->n_chan = 2;
s->maxdata = (1 << thisboard->ao_nbits) - 1;
s->range_table = &range_bipolar5;
s->insn_write = das08_ao_winsn;
s->insn_read = das08_ao_rinsn;
das08_ao_initialize(dev, s);
} else {
s->type = COMEDI_SUBD_UNUSED;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/comedi/drivers/das08.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ struct das08_private_struct {
unsigned int do_bits; /* bits for do register on boards with register dedicated to digital out only */
const unsigned int *pg_gainlist;
struct pci_dev *pdev; /* struct for pci-das08 */
unsigned int ao_readback[2]; /* assume 2 AO channels */
};

int das08_common_attach(struct comedi_device *dev, unsigned long iobase);
Expand Down

0 comments on commit f0ba1d6

Please sign in to comment.