staging: comedi: drivers: use comedi_dio_update_state() for simple cases
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 30 Aug 2013 18:05:58 +0000 (11:05 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Sep 2013 14:47:40 +0000 (07:47 -0700)
Use comedi_dio_update_state() to handle the boilerplate code to update
the subdevice s->state for simple cases where the hardware is updated
when any channel is modified.

Also, fix a bug in the amplc_pc263 and amplc_pci263 drivers where the
current state is not returned in data[1].

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
40 files changed:
drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.c
drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.c
drivers/staging/comedi/drivers/addi_apci_1516.c
drivers/staging/comedi/drivers/addi_apci_2032.c
drivers/staging/comedi/drivers/addi_apci_2200.c
drivers/staging/comedi/drivers/addi_apci_3501.c
drivers/staging/comedi/drivers/addi_apci_3xxx.c
drivers/staging/comedi/drivers/adl_pci6208.c
drivers/staging/comedi/drivers/adl_pci7x3x.c
drivers/staging/comedi/drivers/adl_pci9111.c
drivers/staging/comedi/drivers/adl_pci9118.c
drivers/staging/comedi/drivers/adv_pci1710.c
drivers/staging/comedi/drivers/adv_pci1723.c
drivers/staging/comedi/drivers/adv_pci_dio.c
drivers/staging/comedi/drivers/aio_iiro_16.c
drivers/staging/comedi/drivers/amplc_pc263.c
drivers/staging/comedi/drivers/amplc_pci263.c
drivers/staging/comedi/drivers/cb_das16_cs.c
drivers/staging/comedi/drivers/cb_pcidas64.c
drivers/staging/comedi/drivers/contec_pci_dio.c
drivers/staging/comedi/drivers/das16.c
drivers/staging/comedi/drivers/das800.c
drivers/staging/comedi/drivers/dt2801.c
drivers/staging/comedi/drivers/dt2811.c
drivers/staging/comedi/drivers/dt282x.c
drivers/staging/comedi/drivers/dt3000.c
drivers/staging/comedi/drivers/dt9812.c
drivers/staging/comedi/drivers/dyna_pci10xx.c
drivers/staging/comedi/drivers/icp_multi.c
drivers/staging/comedi/drivers/multiq3.c
drivers/staging/comedi/drivers/ni_670x.c
drivers/staging/comedi/drivers/ni_at_ao.c
drivers/staging/comedi/drivers/ni_atmio16d.c
drivers/staging/comedi/drivers/ni_pcidio.c
drivers/staging/comedi/drivers/pcl812.c
drivers/staging/comedi/drivers/pcl818.c
drivers/staging/comedi/drivers/quatech_daqp_cs.c
drivers/staging/comedi/drivers/rtd520.c
drivers/staging/comedi/drivers/rti800.c
drivers/staging/comedi/drivers/s526.c

index e3cc429403c08c35df09f02286a1079df039f0c9..84668544f52d79927fa0b664fad3aca6313bd361 100644 (file)
@@ -260,18 +260,13 @@ static int apci1564_do_insn_bits(struct comedi_device *dev,
                                 unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        s->state = inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP +
                        APCI1564_DIGITAL_OP_RW);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP +
                        APCI1564_DIGITAL_OP_RW);
-       }
 
        data[1] = s->state;
 
index 32dce0329fd5a1ab10d8a0c64ff162c538858812..dc73d4d348ed4fa9eb94635e2614e18102939de5 100644 (file)
@@ -623,16 +623,11 @@ static int apci3200_do_insn_bits(struct comedi_device *dev,
                                 unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        s->state = inl(devpriv->i_IobaseAddon) & 0xf;
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, devpriv->i_IobaseAddon);
-       }
 
        data[1] = s->state;
 
index 08674c18cf429052648b932c59ea7792bd44a47d..9d1b1425c60b7c8ec41f574df4f733687820c688 100644 (file)
@@ -90,16 +90,10 @@ static int apci1516_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inw(dev->iobase + APCI1516_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + APCI1516_DO_REG);
-       }
 
        data[1] = s->state;
 
index 6b0ea16ff5467eeb3da5c76a9c8a9f2c9c705faa..c77ee8732d38fe158f974a29ff5f0f2921afc609 100644 (file)
@@ -57,16 +57,10 @@ static int apci2032_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + APCI2032_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + APCI2032_DO_REG);
-       }
 
        data[1] = s->state;
 
index 92ac8ece8494b1e1998ed545ea62f89fb9d793c5..7fb32e778d8ba5742565c3aaf508557dca385807 100644 (file)
@@ -50,16 +50,10 @@ static int apci2200_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inw(dev->iobase + APCI2200_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + APCI2200_DO_REG);
-       }
 
        data[1] = s->state;
 
index d9650ffb7d2f3e99603535b1cf091df0db8b8b54..6138440b919e86dc94ea6c80f06c6573c079bb0b 100644 (file)
@@ -161,16 +161,10 @@ static int apci3501_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + APCI3501_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + APCI3501_DO_REG);
-       }
 
        data[1] = s->state;
 
index cf5dd10eaf91daa71cb75ced4270c450d49d31de..fcec604bebf77814581bcd2a8a2a36f2061e021f 100644 (file)
@@ -664,16 +664,10 @@ static int apci3xxx_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + 48) & 0xf;
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + 48);
-       }
 
        data[1] = s->state;
 
index 28975061134b76ebfe34bff3316960a681ac45d1..60f1f5c9532d70d87def20edcf5cfc9ce3d80e95 100644 (file)
@@ -141,15 +141,8 @@ static int pci6208_do_insn_bits(struct comedi_device *dev,
                                struct comedi_insn *insn,
                                unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI6208_DIO);
-       }
 
        data[1] = s->state;
 
index 81b7203f824f15e7947b1f5783184171cdf10fc3..5617f5ca384a0bd8fd463c85dca28357bb025a2a 100644 (file)
@@ -112,21 +112,10 @@ static int adl_pci7x3x_do_insn_bits(struct comedi_device *dev,
                                    unsigned int *data)
 {
        unsigned long reg = (unsigned long)s->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + reg);
-       }
 
-       /*
-        * NOTE: The output register is not readable.
-        * This returned state will not be correct until all the
-        * outputs have been updated.
-        */
        data[1] = s->state;
 
        return insn->n;
index 78cea193504f3e772413298b25dca9bacb45a39b..89ca5078e8b36809a70903d369f0f2226ec1bef8 100644 (file)
@@ -813,15 +813,8 @@ static int pci9111_do_insn_bits(struct comedi_device *dev,
                                struct comedi_insn *insn,
                                unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI9111_DIO_REG);
-       }
 
        data[1] = s->state;
 
index 7d2cff3eab8515c2572d092ec2dbc05095c1bff0..f50dbea6724051cf3d143f8a7e115af98b907365 100644 (file)
@@ -671,13 +671,12 @@ static int pci9118_insn_bits_di(struct comedi_device *dev,
 
 static int pci9118_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)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outl(s->state & 0x0f, dev->iobase + PCI9118_DO);
-       }
+
        data[1] = s->state;
 
        return insn->n;
index fe087253c87046a5f1f4da819e50a46b37200beb..3dacfaeca4cbb16fcdab0c7fd7a079d50cee44f0 100644 (file)
@@ -544,18 +544,14 @@ static int pci171x_insn_bits_di(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pci171x_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)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI171x_DO);
-       }
+
        data[1] = s->state;
 
        return insn->n;
index b793d6987b843366654ac9935b0546ade9230f10..71321f75d0cdefb483e96f79447181f4633f97a0 100644 (file)
@@ -205,19 +205,16 @@ static int pci1723_dio_insn_config(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-  digital i/o bits read/write
-*/
 static int pci1723_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI1723_WRITE_DIGITAL_OUTPUT_CMD);
-       }
+
        data[1] = inw(dev->iobase + PCI1723_READ_DIGITAL_INPUT_DATA);
+
        return insn->n;
 }
 
index f091fa0d304df6d54da515db639804faeb125a43..6bac665261f847c750299a9979bb140d7c83784c 100644 (file)
@@ -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;
index afe87cc897612c0508f0924088b65452533ad052..22b3dda135ff23a9b7ff351bba8c578227e90353 100644 (file)
@@ -45,9 +45,7 @@ static int aio_iiro_16_dio_insn_bits_write(struct comedi_device *dev,
                                           struct comedi_insn *insn,
                                           unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data)) {
                outb(s->state & 0xff, dev->iobase + AIO_IIRO_16_RELAY_0_7);
                outb((s->state >> 8) & 0xff,
                     dev->iobase + AIO_IIRO_16_RELAY_8_15);
index e7108045f5535969a695622697060a46c47a7e8b..5b4b5ab34e2e930869b854f0f7b4b2056b2dc526 100644 (file)
@@ -57,17 +57,16 @@ static const struct pc263_board pc263_boards[] = {
 
 static int pc263_do_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-               /* Write out the new digital output lines */
-               outb(s->state & 0xFF, dev->iobase);
-               outb(s->state >> 8, dev->iobase + 1);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase);
+               outb((s->state >> 8) & 0xff, dev->iobase + 1);
        }
+
+       data[1] = s->state;
+
        return insn->n;
 }
 
index 145bb48f618e9ab1516a8881f2c0f13c4bb795c2..4bd4ef8e88cd05dbf6453fb88f988196c5eb5174 100644 (file)
@@ -44,17 +44,16 @@ The state of the outputs can be read.
 
 static int pci263_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-               /* Write out the new digital output lines */
-               outb(s->state & 0xFF, dev->iobase);
-               outb(s->state >> 8, dev->iobase + 1);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase);
+               outb((s->state >> 8) & 0xff, dev->iobase + 1);
        }
+
+       data[1] = s->state;
+
        return insn->n;
 }
 
index 0ce93da70847c566fd328ae21ae80f258fade0f1..3e072955ea79d4b808c4137da8154d97061f3c32 100644 (file)
@@ -325,14 +325,11 @@ static int das16cs_ao_rinsn(struct comedi_device *dev,
 
 static int das16cs_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + DAS16CS_DIO);
-       }
 
        data[1] = inw(dev->iobase + DAS16CS_DIO);
 
index 388dbd7a5d27f2fa1c93b24f4f2342558f4b0b8c..e49743aed65de9987862bbbb9575db9a41cd14a7 100644 (file)
@@ -3490,18 +3490,15 @@ static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
        return insn->n;
 }
 
-static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
-                   struct comedi_insn *insn, unsigned int *data)
+static int do_wbits(struct comedi_device *dev,
+                   struct comedi_subdevice *s,
+                   struct comedi_insn *insn,
+                   unsigned int *data)
 {
        struct pcidas64_private *devpriv = dev->private;
 
-       data[0] &= 0xf;
-       /*  zero bits we are going to change */
-       s->state &= ~data[0];
-       /*  set new bits */
-       s->state |= data[0] & data[1];
-
-       writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
+       if (comedi_dio_update_state(s, data))
+               writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
 
        data[1] = s->state;
 
@@ -3526,14 +3523,14 @@ static int dio_60xx_config_insn(struct comedi_device *dev,
        return insn->n;
 }
 
-static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+static int dio_60xx_wbits(struct comedi_device *dev,
+                         struct comedi_subdevice *s,
+                         struct comedi_insn *insn,
+                         unsigned int *data)
 {
        struct pcidas64_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                writeb(s->state,
                       devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
        }
index e781716bf3555e9a93b3af8e7bb5a11ac12c35da..89836c0828d9cb08a8626cecbe9fd266bf38f9d2 100644 (file)
@@ -40,17 +40,11 @@ Configuration Options: not applicable, uses comedi PCI auto config
 
 static int contec_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PIO1616L_DO_REG);
-       }
 
        data[1] = s->state;
 
index 1b0793f33b9f12742453d18ca5801601f87413b4..fc058f8e870209b5b482593afa80f8df6355afca 100644 (file)
@@ -952,15 +952,8 @@ static int das16_do_insn_bits(struct comedi_device *dev,
                              struct comedi_insn *insn,
                              unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outb(s->state, dev->iobase + DAS16_DIO_REG);
-       }
 
        data[1] = s->state;
 
index 11e16114e4e3150ccca1763f44107ee6e2238dad..b80dd0362ffcc2c61c2dcbce8a22645d772a43cc 100644 (file)
@@ -630,13 +630,9 @@ static int das800_do_insn_bits(struct comedi_device *dev,
                               unsigned int *data)
 {
        struct das800_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
        unsigned long irq_flags;
 
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
+       if (comedi_dio_update_state(s, data)) {
                devpriv->do_bits = s->state << 4;
 
                spin_lock_irqsave(&dev->spinlock, irq_flags);
index 38918a1198aa83cfbcc717f69be05c074b9bd7aa..1a2b0e4b1ea5c2d246a5e2e65186403c8c5d3bd3 100644 (file)
@@ -528,23 +528,23 @@ static int dt2801_ao_insn_write(struct comedi_device *dev,
 
 static int dt2801_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       int which = 0;
-
-       if (s == &dev->subdevices[3])
-               which = 1;
+       int which = (s == &dev->subdevices[3]) ? 1 : 0;
+       unsigned int val;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                dt2801_writecmd(dev, DT_C_WRITE_DIG);
                dt2801_writedata(dev, which);
                dt2801_writedata(dev, s->state);
        }
+
        dt2801_writecmd(dev, DT_C_READ_DIG);
        dt2801_writedata(dev, which);
-       dt2801_readdata(dev, data + 1);
+       dt2801_readdata(dev, &val);
+
+       data[1] = val;
 
        return insn->n;
 }
index a41a5716f3584fdbb488203b1c87b055fe5ae84f..0ca02fa7ba1b96e1a92edd97a81ca92a623bc711 100644 (file)
@@ -353,11 +353,11 @@ static int dt2811_di_insn_bits(struct comedi_device *dev,
 
 static int dt2811_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= data[0] & data[1];
-       outb(s->state, dev->iobase + DT2811_DIO);
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + DT2811_DIO);
 
        data[1] = s->state;
 
index da3ee859bdbcedd025708fa0af0ac434df241b26..e89126a15e53590988134bbbb1caac04ae02e497 100644 (file)
@@ -967,14 +967,12 @@ static int dt282x_ao_cancel(struct comedi_device *dev,
 
 static int dt282x_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + DT2821_DIODAT);
-       }
+
        data[1] = inw(dev->iobase + DT2821_DIODAT);
 
        return insn->n;
index 64ef87598b607deffe7b9a11999c753defbce126..fec911fc8d688137d5728170725f780b821184cb 100644 (file)
@@ -665,13 +665,12 @@ static int dt3k_dio_insn_config(struct comedi_device *dev,
 
 static int dt3k_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[1] & data[0];
+       if (comedi_dio_update_state(s, data))
                dt3k_writesingle(dev, SUBS_DOUT, 0, s->state);
-       }
+
        data[1] = dt3k_readsingle(dev, SUBS_DIN, 0, 0);
 
        return insn->n;
index b5e6f33dc217c4493f595ddedc82e86a3b5b2ee1..64565d4c902db881226ff339103e96264a1ac266 100644 (file)
@@ -580,15 +580,8 @@ static int dt9812_do_insn_bits(struct comedi_device *dev,
                               struct comedi_insn *insn,
                               unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                dt9812_digital_out(dev, s->state);
-       }
 
        data[1] = s->state;
 
index fd525f499f2a2db47d16eef9a9f07b780cc00690..f2a9f1c2f3b6dfe2ffa563a53c466ac7bd7fd987 100644 (file)
@@ -147,33 +147,23 @@ static int dyna_pci10xx_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/* digital output bit interface */
 static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev,
-                             struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                                    struct comedi_subdevice *s,
+                                    struct comedi_insn *insn,
+                                    unsigned int *data)
 {
        struct dyna_pci10xx_private *devpriv = dev->private;
 
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit.
-        * s->state contains the previous write data
-        */
        mutex_lock(&devpriv->mutex);
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                smp_mb();
                outw_p(s->state, devpriv->BADR3);
                udelay(10);
        }
 
-       /*
-        * On return, data[1] contains the value of the digital
-        * input and output lines. We just return the software copy of the
-        * output values if it was a purely digital output subdevice.
-        */
        data[1] = s->state;
        mutex_unlock(&devpriv->mutex);
+
        return insn->n;
 }
 
index 17f9c066546977f31c3af795b532cc431e7f0703..15d87187b59088bda192f47622e1f50b317e8411 100644 (file)
@@ -348,18 +348,13 @@ static int icp_multi_insn_bits_di(struct comedi_device *dev,
 
 static int icp_multi_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)
 {
        struct icp_multi_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-
-               printk(KERN_DEBUG "Digital outputs = %4x \n", s->state);
-
+       if (comedi_dio_update_state(s, data))
                writew(s->state, devpriv->io_addr + ICP_MULTI_DO);
-       }
 
        data[1] = readw(devpriv->io_addr + ICP_MULTI_DI);
 
index 9d75ea4e201bcb553cc5cb75b38b759d0fe87e65..3ca755eca285dd129741640c7153f7a0413dcfe8 100644 (file)
@@ -163,11 +163,11 @@ static int multiq3_di_insn_bits(struct comedi_device *dev,
 
 static int multiq3_do_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= (data[0] & data[1]);
-       outw(s->state, dev->iobase + MULTIQ3_DIGOUT_PORT);
+       if (comedi_dio_update_state(s, data))
+               outw(s->state, dev->iobase + MULTIQ3_DIGOUT_PORT);
 
        data[1] = s->state;
 
index e2926ce3fb24be9799e1ce2fe949992dfacc17c3..e4414cf110e7e3a72e049d48d0c00c32a7e7d6c6 100644 (file)
@@ -136,20 +136,15 @@ static int ni_670x_ao_rinsn(struct comedi_device *dev,
 
 static int ni_670x_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
        struct ni_670x_private *devpriv = dev->private;
        void __iomem *io_addr = devpriv->mite->daq_io_addr +
                                        DIO_PORT0_DATA_OFFSET;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                writel(s->state, io_addr);
-       }
 
        data[1] = readl(io_addr);
 
index b9122fd835e1e714cec811c43d2c6c1a51675e9e..4e4b227e091f9cb108bc2dc6215f8839f8628a4a 100644 (file)
@@ -233,13 +233,11 @@ static int atao_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
 
 static int atao_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + ATAO_DOUT);
-       }
 
        data[1] = inw(dev->iobase + ATAO_DIN);
 
index bb3491f5ad21c993c916ab827cfe74dffa05ad41..a9f7d40d6db24ed32f8efcd07bef5e4ce94160f6 100644 (file)
@@ -558,13 +558,12 @@ static int atmio16d_ao_insn_write(struct comedi_device *dev,
 
 static int atmio16d_dio_insn_bits(struct comedi_device *dev,
                                  struct comedi_subdevice *s,
-                                 struct comedi_insn *insn, unsigned int *data)
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] | data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + MIO_16_DIG_OUT_REG);
-       }
+
        data[1] = inw(dev->iobase + MIO_16_DIG_IN_REG);
 
        return insn->n;
index fad81bc97b6e090d87b1391349bf4c8ad3a4dcd9..b6283a8a7cd488a4e1ba41733ff84ded1311c4f9 100644 (file)
@@ -657,15 +657,14 @@ static int ni_pcidio_insn_config(struct comedi_device *dev,
 
 static int ni_pcidio_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
        struct nidio96_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                writel(s->state, devpriv->mite->daq_io_addr + Port_IO(0));
-       }
+
        data[1] = readl(devpriv->mite->daq_io_addr + Port_IO(0));
 
        return insn->n;
index 03a098900d34eca1acdda953983c3004f8f59cca..2b10a95251bdf179e70c809f5a39efebec096baf 100644 (file)
@@ -509,19 +509,16 @@ static int pcl812_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pcl812_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data)) {
                outb(s->state & 0xff, dev->iobase + PCL812_DO_LO);
                outb((s->state >> 8), dev->iobase + PCL812_DO_HI);
        }
+
        data[1] = s->state;
 
        return insn->n;
index a52ba82ff0e4a10adbdebf1508b73b1d7967c132..33cd4aae884ebc5e0a1969c19537c0dc2dc8e2f3 100644 (file)
@@ -418,21 +418,15 @@ static int pcl818_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-   DIGITAL OUTPUT MODE0, 818 cards
-
-   only one sample per call is supported
-*/
 static int pcl818_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= (data[0] & data[1]);
-
-       outb(s->state & 0xff, dev->iobase + PCL818_DO_LO);
-       outb((s->state >> 8), dev->iobase + PCL818_DO_HI);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase + PCL818_DO_LO);
+               outb((s->state >> 8), dev->iobase + PCL818_DO_HI);
+       }
 
        data[1] = s->state;
 
index 9775d3622a6266a51da709d951dbb6ae60e415d1..ece3031711eb484a07b2307b67c855102b9852da 100644 (file)
@@ -690,18 +690,12 @@ static int daqp_do_insn_bits(struct comedi_device *dev,
                             unsigned int *data)
 {
        struct daqp_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        if (devpriv->stop)
                return -EIO;
 
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outb(s->state, dev->iobase + DAQP_DIGITAL_IO);
-       }
 
        data[1] = s->state;
 
index 93c980c62a23a96ded07673231cf216e85055f2e..3ec6632949bd3d003f66ee20a3dd454ac9501d37 100644 (file)
@@ -1217,15 +1217,9 @@ static int rtd_dio_insn_bits(struct comedi_device *dev,
                             unsigned int *data)
 {
        struct rtd_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                writew(s->state & 0xff, devpriv->las0 + LAS0_DIO0);
-       }
 
        data[1] = readw(devpriv->las0 + LAS0_DIO0) & 0xff;
 
index cbb4ba5b852a1fdf43b44a0c2b7dacd2092f8c60..e1f3671ac056095982922ff3697832f9ded54dbf 100644 (file)
@@ -267,13 +267,7 @@ static int rti800_do_insn_bits(struct comedi_device *dev,
                               struct comedi_insn *insn,
                               unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data)) {
                /* Outputs are inverted... */
                outb(s->state ^ 0xff, dev->iobase + RTI800_DO);
        }
index d629463b85a2ae38ba7c97d8329633ce606b7c1c..9950f59b1192c99dc471265027dbb2a9fd26fc4a 100644 (file)
@@ -499,14 +499,11 @@ static int s526_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
 
 static int s526_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + REG_DIO);
-       }
 
        data[1] = inw(dev->iobase + REG_DIO) & 0xff;
 
This page took 0.047185 seconds and 5 git commands to generate.