--- /dev/null
+From 97f4289ad08cffe55de06d4ac4f89ac540450aee Mon Sep 17 00:00:00 2001
+From: H Hartley Sweeten <hsweeten@visionengravers.com>
+Date: Fri, 30 Aug 2013 11:05:58 -0700
+Subject: staging: comedi: drivers: use comedi_dio_update_state() for simple cases
+
+From: H Hartley Sweeten <hsweeten@visionengravers.com>
+
+commit 97f4289ad08cffe55de06d4ac4f89ac540450aee upstream.
+
+[Split from original patch subject: "staging: comedi: drivers: use
+comedi_dio_update_state() for simple cases"]
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/staging/comedi/drivers/amplc_pc263.c | 3 +++
+ drivers/staging/comedi/drivers/amplc_pci263.c | 3 +++
+ 2 files changed, 6 insertions(+)
+
+--- a/drivers/staging/comedi/drivers/amplc_pc263.c
++++ b/drivers/staging/comedi/drivers/amplc_pc263.c
+@@ -68,6 +68,9 @@ static int pc263_do_insn_bits(struct com
+ outb(s->state & 0xFF, dev->iobase);
+ outb(s->state >> 8, dev->iobase + 1);
+ }
++
++ data[1] = s->state;
++
+ return insn->n;
+ }
+
+--- a/drivers/staging/comedi/drivers/amplc_pci263.c
++++ b/drivers/staging/comedi/drivers/amplc_pci263.c
+@@ -55,6 +55,9 @@ static int pci263_do_insn_bits(struct co
+ outb(s->state & 0xFF, dev->iobase);
+ outb(s->state >> 8, dev->iobase + 1);
+ }
++
++ data[1] = s->state;
++
+ return insn->n;
+ }
+
--- /dev/null
+From f6b316bcd8c421acd6fa5a6e18b4c846ecb9d965 Mon Sep 17 00:00:00 2001
+From: H Hartley Sweeten <hsweeten@visionengravers.com>
+Date: Fri, 30 Aug 2013 11:08:50 -0700
+Subject: staging: comedi: ssv_dnp: use comedi_dio_update_state()
+
+From: H Hartley Sweeten <hsweeten@visionengravers.com>
+
+commit f6b316bcd8c421acd6fa5a6e18b4c846ecb9d965 upstream.
+
+Use comedi_dio_update_state() to handle the boilerplate code to update
+the subdevice s->state.
+
+Also, fix a bug where the state of the channels is returned in data[0].
+The comedi core expects it to be 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>
+
+---
+ drivers/staging/comedi/drivers/ssv_dnp.c | 48 ++++++++++++-------------------
+ 1 file changed, 20 insertions(+), 28 deletions(-)
+
+--- a/drivers/staging/comedi/drivers/ssv_dnp.c
++++ b/drivers/staging/comedi/drivers/ssv_dnp.c
+@@ -46,51 +46,43 @@ 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 mask;
++ 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).
++ */
+
++ mask = comedi_dio_update_state(s, data);
++ if (mask) {
+ 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);
++ val = inb(CSCDR) & 0x0f;
++ outb(((s->state >> 12) & 0xf0) | val, CSCDR);
+ }
+
+- /* on return, data[1] contains the value of the digital input lines. */
+ outb(PADR, CSCIR);
+- data[0] = inb(CSCDR);
++ val = inb(CSCDR);
+ outb(PBDR, CSCIR);
+- data[0] += inb(CSCDR) << 8;
++ val |= (inb(CSCDR) << 8);
+ outb(PCDR, CSCIR);
+- data[0] += ((inb(CSCDR) & 0xF0) << 12);
++ val |= ((inb(CSCDR) & 0xf0) << 12);
+
+- return insn->n;
++ data[1] = val;
+
++ return insn->n;
+ }
+
+ static int dnp_dio_insn_config(struct comedi_device *dev,