Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 317367
b: refs/heads/master
c: 459f299
h: refs/heads/master
i:
  317365: 6e9ccda
  317363: dc56597
  317359: 54ccc7c
v: v3
  • Loading branch information
H Hartley Sweeten authored and Greg Kroah-Hartman committed Jun 14, 2012
1 parent 303fff8 commit c6d545e
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f218d9f57b472848da34beac3e8097b054dcb2fe
refs/heads/master: 459f299e5b1759644a6cde8328919b6e542fb9eb
44 changes: 28 additions & 16 deletions trunk/drivers/staging/comedi/drivers/8255.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit c6d545e

Please sign in to comment.