|
@@ -448,45 +448,39 @@ static int pci_dio_insn_bits_di_w(struct comedi_device *dev,
|
|
|
return insn->n;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-==============================================================================
|
|
|
-*/
|
|
|
static int pci_dio_insn_bits_do_b(struct comedi_device *dev,
|
|
|
struct comedi_subdevice *s,
|
|
|
- struct comedi_insn *insn, unsigned int *data)
|
|
|
+ struct comedi_insn *insn,
|
|
|
+ unsigned int *data)
|
|
|
{
|
|
|
const struct diosubd_data *d = (const struct diosubd_data *)s->private;
|
|
|
int i;
|
|
|
|
|
|
- if (data[0]) {
|
|
|
- s->state &= ~data[0];
|
|
|
- s->state |= (data[0] & data[1]);
|
|
|
+ if (comedi_dio_update_state(s, data)) {
|
|
|
for (i = 0; i < d->regs; i++)
|
|
|
outb((s->state >> (8 * i)) & 0xff,
|
|
|
dev->iobase + d->addr + i);
|
|
|
}
|
|
|
+
|
|
|
data[1] = s->state;
|
|
|
|
|
|
return insn->n;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-==============================================================================
|
|
|
-*/
|
|
|
static int pci_dio_insn_bits_do_w(struct comedi_device *dev,
|
|
|
struct comedi_subdevice *s,
|
|
|
- struct comedi_insn *insn, unsigned int *data)
|
|
|
+ struct comedi_insn *insn,
|
|
|
+ unsigned int *data)
|
|
|
{
|
|
|
const struct diosubd_data *d = (const struct diosubd_data *)s->private;
|
|
|
int i;
|
|
|
|
|
|
- if (data[0]) {
|
|
|
- s->state &= ~data[0];
|
|
|
- s->state |= (data[0] & data[1]);
|
|
|
+ if (comedi_dio_update_state(s, data)) {
|
|
|
for (i = 0; i < d->regs; i++)
|
|
|
outw((s->state >> (16 * i)) & 0xffff,
|
|
|
dev->iobase + d->addr + 2 * i);
|
|
|
}
|
|
|
+
|
|
|
data[1] = s->state;
|
|
|
|
|
|
return insn->n;
|
|
@@ -641,12 +635,10 @@ static int pci1760_insn_bits_di(struct comedi_device *dev,
|
|
|
return insn->n;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-==============================================================================
|
|
|
-*/
|
|
|
static int pci1760_insn_bits_do(struct comedi_device *dev,
|
|
|
struct comedi_subdevice *s,
|
|
|
- struct comedi_insn *insn, unsigned int *data)
|
|
|
+ struct comedi_insn *insn,
|
|
|
+ unsigned int *data)
|
|
|
{
|
|
|
int ret;
|
|
|
unsigned char omb[4] = {
|
|
@@ -657,14 +649,13 @@ static int pci1760_insn_bits_do(struct comedi_device *dev,
|
|
|
};
|
|
|
unsigned char imb[4];
|
|
|
|
|
|
- if (data[0]) {
|
|
|
- s->state &= ~data[0];
|
|
|
- s->state |= (data[0] & data[1]);
|
|
|
+ if (comedi_dio_update_state(s, data)) {
|
|
|
omb[0] = s->state;
|
|
|
ret = pci1760_mbxrequest(dev, omb, imb);
|
|
|
if (!ret)
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
data[1] = s->state;
|
|
|
|
|
|
return insn->n;
|