Use comedi_dio_insn_bits() to handle the boilerplate code to update
the subdevice s->state.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/ssv_dnp.c | 51 +++++++++++++-------------------
 1 file changed, 20 insertions(+), 31 deletions(-)

diff --git a/drivers/staging/comedi/drivers/ssv_dnp.c 
b/drivers/staging/comedi/drivers/ssv_dnp.c
index 11758a5..b79e691 100644
--- a/drivers/staging/comedi/drivers/ssv_dnp.c
+++ b/drivers/staging/comedi/drivers/ssv_dnp.c
@@ -46,51 +46,40 @@ Status: unknown
 #define PCMR  0xa3             /* Port C Mode Register                      */
 #define PCDR  0xa7             /* Port C Data Register                      */
 
-/* ------------------------------------------------------------------------- */
-/* The insn_bits interface allows packed reading/writing of DIO channels.    */
-/* The comedi core can convert between insn_bits and insn_read/write, so you */
-/* are able to use these instructions as well.                               */
-/* ------------------------------------------------------------------------- */
-
 static int dnp_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)
 {
-       /* The insn data is a mask in data[0] and the new data in data[1],   */
-       /* each channel cooresponding to a bit.                              */
-
-       /* Ports A and B are straight forward: each bit corresponds to an    */
-       /* output pin with the same order. Port C is different: bits 0...3   */
-       /* correspond to bits 4...7 of the output register (PCDR).           */
+       unsigned int val;
 
-       if (data[0]) {
+       /*
+        * Ports A and B are straight forward: each bit corresponds to an
+        * output pin with the same order. Port C is different: bits 0...3
+        * correspond to bits 4...7 of the output register (PCDR).
+        */
+       outb(PADR, CSCIR);
+       s->state = inb(CSCDR);
+       outb(PBDR, CSCIR);
+       s->state |= (inb(CSCDR) << 8);
+       outb(PCDR, CSCIR);
+       val = inb(CSCDR);
+       s->state |= ((val & 0xf0) << 12);
 
+       if (comedi_dio_insn_bits(dev, s, insn, data)) {
                outb(PADR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) (data[0] & 0x0000FF))
-                    | (u8) (data[1] & 0x0000FF), CSCDR);
+               outb(s->state & 0xff, CSCDR);
 
                outb(PBDR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) ((data[0] & 0x00FF00) >> 8))
-                    | (u8) ((data[1] & 0x00FF00) >> 8), CSCDR);
+               outb((s->state >> 8) & 0xff, CSCDR);
 
                outb(PCDR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) ((data[0] & 0x0F0000) >> 12))
-                    | (u8) ((data[1] & 0x0F0000) >> 12), CSCDR);
+               outb(((val & 0x0f) | (s->state >> 12)) & 0xff, CSCDR);
        }
 
-       /* on return, data[1] contains the value of the digital input lines. */
-       outb(PADR, CSCIR);
-       data[0] = inb(CSCDR);
-       outb(PBDR, CSCIR);
-       data[0] += inb(CSCDR) << 8;
-       outb(PCDR, CSCIR);
-       data[0] += ((inb(CSCDR) & 0xF0) << 12);
+       data[0] = s->state;
 
        return insn->n;
-
 }
 
 static int dnp_dio_insn_config(struct comedi_device *dev,
-- 
1.8.3.2

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to