Commit c10aa035 authored by Ian Abbott's avatar Ian Abbott Committed by Greg Kroah-Hartman

staging: comedi: amplc_dio200: use custom register access functions

Add custom functions to access hardware registers and call them instead
of calling `inb()` and `outb()` directly.  When additional cards are
supported by this driver requiring different register access methods,
the new functions will localize the register access differences to just
these functions.
Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2662a9b6
...@@ -474,6 +474,24 @@ static inline bool is_isa_board(const struct dio200_board *board) ...@@ -474,6 +474,24 @@ static inline bool is_isa_board(const struct dio200_board *board)
return DO_ISA && board->bustype == isa_bustype; return DO_ISA && board->bustype == isa_bustype;
} }
/*
* Read 8-bit register.
*/
static unsigned char dio200_read8(struct comedi_device *dev,
unsigned int offset)
{
return inb(dev->iobase + offset);
}
/*
* Write 8-bit register.
*/
static void dio200_write8(struct comedi_device *dev, unsigned int offset,
unsigned char val)
{
outb(val, dev->iobase + offset);
}
/* /*
* This function looks for a board matching the supplied PCI device. * This function looks for a board matching the supplied PCI device.
*/ */
...@@ -518,7 +536,7 @@ dio200_subdev_intr_insn_bits(struct comedi_device *dev, ...@@ -518,7 +536,7 @@ dio200_subdev_intr_insn_bits(struct comedi_device *dev,
if (layout->has_int_sce) { if (layout->has_int_sce) {
/* Just read the interrupt status register. */ /* Just read the interrupt status register. */
data[1] = inb(dev->iobase + subpriv->ofs) & subpriv->valid_isns; data[1] = dio200_read8(dev, subpriv->ofs) & subpriv->valid_isns;
} else { } else {
/* No interrupt status register. */ /* No interrupt status register. */
data[0] = 0; data[0] = 0;
...@@ -539,7 +557,7 @@ static void dio200_stop_intr(struct comedi_device *dev, ...@@ -539,7 +557,7 @@ static void dio200_stop_intr(struct comedi_device *dev,
subpriv->active = 0; subpriv->active = 0;
subpriv->enabled_isns = 0; subpriv->enabled_isns = 0;
if (layout->has_int_sce) if (layout->has_int_sce)
outb(0, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, 0);
} }
/* /*
...@@ -571,7 +589,7 @@ static int dio200_start_intr(struct comedi_device *dev, ...@@ -571,7 +589,7 @@ static int dio200_start_intr(struct comedi_device *dev,
/* Enable interrupt sources. */ /* Enable interrupt sources. */
subpriv->enabled_isns = isn_bits; subpriv->enabled_isns = isn_bits;
if (layout->has_int_sce) if (layout->has_int_sce)
outb(isn_bits, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, isn_bits);
} }
return retval; return retval;
...@@ -637,11 +655,11 @@ static int dio200_handle_read_intr(struct comedi_device *dev, ...@@ -637,11 +655,11 @@ static int dio200_handle_read_intr(struct comedi_device *dev,
* loop in case of misconfiguration. * loop in case of misconfiguration.
*/ */
cur_enabled = subpriv->enabled_isns; cur_enabled = subpriv->enabled_isns;
while ((intstat = (inb(dev->iobase + subpriv->ofs) & while ((intstat = (dio200_read8(dev, subpriv->ofs) &
subpriv->valid_isns & ~triggered)) != 0) { subpriv->valid_isns & ~triggered)) != 0) {
triggered |= intstat; triggered |= intstat;
cur_enabled &= ~triggered; cur_enabled &= ~triggered;
outb(cur_enabled, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, cur_enabled);
} }
} else { } else {
/* /*
...@@ -660,7 +678,7 @@ static int dio200_handle_read_intr(struct comedi_device *dev, ...@@ -660,7 +678,7 @@ static int dio200_handle_read_intr(struct comedi_device *dev,
*/ */
cur_enabled = subpriv->enabled_isns; cur_enabled = subpriv->enabled_isns;
if (layout->has_int_sce) if (layout->has_int_sce)
outb(cur_enabled, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, cur_enabled);
if (subpriv->active) { if (subpriv->active) {
/* /*
...@@ -882,7 +900,7 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s, ...@@ -882,7 +900,7 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s,
if (layout->has_int_sce) if (layout->has_int_sce)
/* Disable interrupt sources. */ /* Disable interrupt sources. */
outb(0, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, 0);
s->private = subpriv; s->private = subpriv;
s->type = COMEDI_SUBD_DI; s->type = COMEDI_SUBD_DI;
...@@ -951,10 +969,10 @@ dio200_subdev_8254_read_chan(struct comedi_device *dev, ...@@ -951,10 +969,10 @@ dio200_subdev_8254_read_chan(struct comedi_device *dev,
/* latch counter */ /* latch counter */
val = chan << 6; val = chan << 6;
outb(val, dev->iobase + subpriv->ofs + i8254_control_reg); dio200_write8(dev, subpriv->ofs + i8254_control_reg, val);
/* read lsb, msb */ /* read lsb, msb */
val = inb(dev->iobase + subpriv->ofs + chan); val = dio200_read8(dev, subpriv->ofs + chan);
val += inb(dev->iobase + subpriv->ofs + chan) << 8; val += dio200_read8(dev, subpriv->ofs + chan) << 8;
return val; return val;
} }
...@@ -969,8 +987,8 @@ dio200_subdev_8254_write_chan(struct comedi_device *dev, ...@@ -969,8 +987,8 @@ dio200_subdev_8254_write_chan(struct comedi_device *dev,
struct dio200_subdev_8254 *subpriv = s->private; struct dio200_subdev_8254 *subpriv = s->private;
/* write lsb, msb */ /* write lsb, msb */
outb(count & 0xff, dev->iobase + subpriv->ofs + chan); dio200_write8(dev, subpriv->ofs + chan, count & 0xff);
outb((count >> 8) & 0xff, dev->iobase + subpriv->ofs + chan); dio200_write8(dev, subpriv->ofs + chan, (count >> 8) & 0xff);
} }
/* /*
...@@ -987,7 +1005,7 @@ dio200_subdev_8254_set_mode(struct comedi_device *dev, ...@@ -987,7 +1005,7 @@ dio200_subdev_8254_set_mode(struct comedi_device *dev,
byte = chan << 6; byte = chan << 6;
byte |= 0x30; /* access order: lsb, msb */ byte |= 0x30; /* access order: lsb, msb */
byte |= (mode & 0xf); /* counter mode and BCD|binary */ byte |= (mode & 0xf); /* counter mode and BCD|binary */
outb(byte, dev->iobase + subpriv->ofs + i8254_control_reg); dio200_write8(dev, subpriv->ofs + i8254_control_reg, byte);
} }
/* /*
...@@ -1000,10 +1018,10 @@ dio200_subdev_8254_status(struct comedi_device *dev, ...@@ -1000,10 +1018,10 @@ dio200_subdev_8254_status(struct comedi_device *dev,
struct dio200_subdev_8254 *subpriv = s->private; struct dio200_subdev_8254 *subpriv = s->private;
/* latch status */ /* latch status */
outb(0xe0 | (2 << chan), dio200_write8(dev, subpriv->ofs + i8254_control_reg,
dev->iobase + subpriv->ofs + i8254_control_reg); 0xe0 | (2 << chan));
/* read status */ /* read status */
return inb(dev->iobase + subpriv->ofs + chan); return dio200_read8(dev, subpriv->ofs + chan);
} }
/* /*
...@@ -1064,7 +1082,7 @@ dio200_subdev_8254_set_gate_src(struct comedi_device *dev, ...@@ -1064,7 +1082,7 @@ dio200_subdev_8254_set_gate_src(struct comedi_device *dev,
subpriv->gate_src[counter_number] = gate_src; subpriv->gate_src[counter_number] = gate_src;
byte = GAT_SCE(subpriv->which, counter_number, gate_src); byte = GAT_SCE(subpriv->which, counter_number, gate_src);
outb(byte, dev->iobase + subpriv->gat_sce_ofs); dio200_write8(dev, subpriv->gat_sce_ofs, byte);
return 0; return 0;
} }
...@@ -1110,7 +1128,7 @@ dio200_subdev_8254_set_clock_src(struct comedi_device *dev, ...@@ -1110,7 +1128,7 @@ dio200_subdev_8254_set_clock_src(struct comedi_device *dev,
subpriv->clock_src[counter_number] = clock_src; subpriv->clock_src[counter_number] = clock_src;
byte = CLK_SCE(subpriv->which, counter_number, clock_src); byte = CLK_SCE(subpriv->which, counter_number, clock_src);
outb(byte, dev->iobase + subpriv->clk_sce_ofs); dio200_write8(dev, subpriv->clk_sce_ofs, byte);
return 0; return 0;
} }
...@@ -1276,7 +1294,7 @@ static void dio200_subdev_8255_set_dir(struct comedi_device *dev, ...@@ -1276,7 +1294,7 @@ static void dio200_subdev_8255_set_dir(struct comedi_device *dev,
config |= CR_C_LO_IO; config |= CR_C_LO_IO;
if (!(s->io_bits & 0xf00000)) if (!(s->io_bits & 0xf00000))
config |= CR_C_HI_IO; config |= CR_C_HI_IO;
outb(config, dev->iobase + subpriv->ofs + 3); dio200_write8(dev, subpriv->ofs + 3, config);
} }
/* /*
...@@ -1292,17 +1310,17 @@ static int dio200_subdev_8255_bits(struct comedi_device *dev, ...@@ -1292,17 +1310,17 @@ static int dio200_subdev_8255_bits(struct comedi_device *dev,
s->state &= ~data[0]; s->state &= ~data[0];
s->state |= (data[0] & data[1]); s->state |= (data[0] & data[1]);
if (data[0] & 0xff) if (data[0] & 0xff)
outb(s->state & 0xff, dev->iobase + subpriv->ofs); dio200_write8(dev, subpriv->ofs, s->state & 0xff);
if (data[0] & 0xff00) if (data[0] & 0xff00)
outb((s->state >> 8) & 0xff, dio200_write8(dev, subpriv->ofs + 1,
dev->iobase + subpriv->ofs + 1); (s->state >> 8) & 0xff);
if (data[0] & 0xff0000) if (data[0] & 0xff0000)
outb((s->state >> 16) & 0xff, dio200_write8(dev, subpriv->ofs + 2,
dev->iobase + subpriv->ofs + 2); (s->state >> 16) & 0xff);
} }
data[1] = inb(dev->iobase + subpriv->ofs); data[1] = dio200_read8(dev, subpriv->ofs);
data[1] |= inb(dev->iobase + subpriv->ofs + 1) << 8; data[1] |= dio200_read8(dev, subpriv->ofs + 1) << 8;
data[1] |= inb(dev->iobase + subpriv->ofs + 2) << 16; data[1] |= dio200_read8(dev, subpriv->ofs + 2) << 16;
return 2; return 2;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment