From c6d545ec247507569ce1db5ea117058588ac4a95 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Wed, 13 Jun 2012 15:42:45 -0700 Subject: [PATCH] --- yaml --- r: 317367 b: refs/heads/master c: 459f299e5b1759644a6cde8328919b6e542fb9eb h: refs/heads/master i: 317365: 6e9ccda2a1ba21342527d7dc4640dff79d8f8d05 317363: dc5659733c0e739427aceaa228f957ba846d78d6 317359: 54ccc7ced0ed4efab0f827b31dd95625f88e10b6 v: v3 --- [refs] | 2 +- trunk/drivers/staging/comedi/drivers/8255.c | 44 +++++++++++++-------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 345e5caec9ef..768d79c2d60c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f218d9f57b472848da34beac3e8097b054dcb2fe +refs/heads/master: 459f299e5b1759644a6cde8328919b6e542fb9eb diff --git a/trunk/drivers/staging/comedi/drivers/8255.c b/trunk/drivers/staging/comedi/drivers/8255.c index 1f4b24c9ed85..da374dee9bc0 100644 --- a/trunk/drivers/staging/comedi/drivers/8255.c +++ b/trunk/drivers/staging/comedi/drivers/8255.c @@ -135,26 +135,38 @@ static int subdev_8255_insn(struct comedi_device *dev, { struct subdev_8255_private *spriv = s->private; unsigned long iobase = spriv->iobase; + unsigned int mask; + unsigned int bits; + unsigned int v; + + if (insn->n != 2) + return -EINVAL; - if (data[0]) { - s->state &= ~data[0]; - s->state |= (data[0] & data[1]); - - if (data[0] & 0xff) - spriv->io(1, _8255_DATA, s->state & 0xff, iobase); - if (data[0] & 0xff00) - spriv->io(1, _8255_DATA + 1, - (s->state >> 8) & 0xff, iobase); - if (data[0] & 0xff0000) - spriv->io(1, _8255_DATA + 2, - (s->state >> 16) & 0xff, iobase); + mask = data[0]; + bits = data[1]; + + if (mask) { + v = s->state; + v &= ~mask; + v |= (bits & mask); + + if (mask & 0xff) + spriv->io(1, _8255_DATA, v & 0xff, iobase); + if (mask & 0xff00) + spriv->io(1, _8255_DATA + 1, (v >> 8) & 0xff, iobase); + if (mask & 0xff0000) + spriv->io(1, _8255_DATA + 2, (v >> 16) & 0xff, iobase); + + s->state = v; } - data[1] = spriv->io(0, _8255_DATA, 0, iobase); - data[1] |= (spriv->io(0, _8255_DATA + 1, 0, iobase) << 8); - data[1] |= (spriv->io(0, _8255_DATA + 2, 0, iobase) << 16); + v = spriv->io(0, _8255_DATA, 0, iobase); + v |= (spriv->io(0, _8255_DATA + 1, 0, iobase) << 8); + v |= (spriv->io(0, _8255_DATA + 2, 0, iobase) << 16); + + data[1] = v; - return 2; + return insn->n; } static void do_config(struct comedi_device *dev, struct comedi_subdevice *s)