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

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
Loading
Loading
Loading
Loading
+45 −27
Original line number Diff line number Diff line
@@ -474,6 +474,24 @@ static inline bool is_isa_board(const struct dio200_board *board)
	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.
 */
@@ -518,7 +536,7 @@ dio200_subdev_intr_insn_bits(struct comedi_device *dev,

	if (layout->has_int_sce) {
		/* 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 {
		/* No interrupt status register. */
		data[0] = 0;
@@ -539,7 +557,7 @@ static void dio200_stop_intr(struct comedi_device *dev,
	subpriv->active = 0;
	subpriv->enabled_isns = 0;
	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,
		/* Enable interrupt sources. */
		subpriv->enabled_isns = isn_bits;
		if (layout->has_int_sce)
			outb(isn_bits, dev->iobase + subpriv->ofs);
			dio200_write8(dev, subpriv->ofs, isn_bits);
	}

	return retval;
@@ -637,11 +655,11 @@ static int dio200_handle_read_intr(struct comedi_device *dev,
		 * loop in case of misconfiguration.
		 */
		cur_enabled = subpriv->enabled_isns;
		while ((intstat = (inb(dev->iobase + subpriv->ofs) &
		while ((intstat = (dio200_read8(dev, subpriv->ofs) &
				   subpriv->valid_isns & ~triggered)) != 0) {
			triggered |= intstat;
			cur_enabled &= ~triggered;
			outb(cur_enabled, dev->iobase + subpriv->ofs);
			dio200_write8(dev, subpriv->ofs, cur_enabled);
		}
	} else {
		/*
@@ -660,7 +678,7 @@ static int dio200_handle_read_intr(struct comedi_device *dev,
		 */
		cur_enabled = subpriv->enabled_isns;
		if (layout->has_int_sce)
			outb(cur_enabled, dev->iobase + subpriv->ofs);
			dio200_write8(dev, subpriv->ofs, cur_enabled);

		if (subpriv->active) {
			/*
@@ -882,7 +900,7 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s,

	if (layout->has_int_sce)
		/* Disable interrupt sources. */
		outb(0, dev->iobase + subpriv->ofs);
		dio200_write8(dev, subpriv->ofs, 0);

	s->private = subpriv;
	s->type = COMEDI_SUBD_DI;
@@ -951,10 +969,10 @@ dio200_subdev_8254_read_chan(struct comedi_device *dev,

	/* latch counter */
	val = chan << 6;
	outb(val, dev->iobase + subpriv->ofs + i8254_control_reg);
	dio200_write8(dev, subpriv->ofs + i8254_control_reg, val);
	/* read lsb, msb */
	val = inb(dev->iobase + subpriv->ofs + chan);
	val += inb(dev->iobase + subpriv->ofs + chan) << 8;
	val = dio200_read8(dev, subpriv->ofs + chan);
	val += dio200_read8(dev, subpriv->ofs + chan) << 8;
	return val;
}

@@ -969,8 +987,8 @@ dio200_subdev_8254_write_chan(struct comedi_device *dev,
	struct dio200_subdev_8254 *subpriv = s->private;

	/* write lsb, msb */
	outb(count & 0xff, dev->iobase + subpriv->ofs + chan);
	outb((count >> 8) & 0xff, dev->iobase + subpriv->ofs + chan);
	dio200_write8(dev, subpriv->ofs + chan, count & 0xff);
	dio200_write8(dev, subpriv->ofs + chan, (count >> 8) & 0xff);
}

/*
@@ -987,7 +1005,7 @@ dio200_subdev_8254_set_mode(struct comedi_device *dev,
	byte = chan << 6;
	byte |= 0x30;		/* access order: lsb, msb */
	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,
	struct dio200_subdev_8254 *subpriv = s->private;

	/* latch status */
	outb(0xe0 | (2 << chan),
	     dev->iobase + subpriv->ofs + i8254_control_reg);
	dio200_write8(dev, subpriv->ofs + i8254_control_reg,
		      0xe0 | (2 << chan));
	/* 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,

	subpriv->gate_src[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;
}
@@ -1110,7 +1128,7 @@ dio200_subdev_8254_set_clock_src(struct comedi_device *dev,

	subpriv->clock_src[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;
}
@@ -1276,7 +1294,7 @@ static void dio200_subdev_8255_set_dir(struct comedi_device *dev,
		config |= CR_C_LO_IO;
	if (!(s->io_bits & 0xf00000))
		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,
		s->state &= ~data[0];
		s->state |= (data[0] & data[1]);
		if (data[0] & 0xff)
			outb(s->state & 0xff, dev->iobase + subpriv->ofs);
			dio200_write8(dev, subpriv->ofs, s->state & 0xff);
		if (data[0] & 0xff00)
			outb((s->state >> 8) & 0xff,
			     dev->iobase + subpriv->ofs + 1);
			dio200_write8(dev, subpriv->ofs + 1,
				      (s->state >> 8) & 0xff);
		if (data[0] & 0xff0000)
			outb((s->state >> 16) & 0xff,
			     dev->iobase + subpriv->ofs + 2);
			dio200_write8(dev, subpriv->ofs + 2,
				      (s->state >> 16) & 0xff);
	}
	data[1] = inb(dev->iobase + subpriv->ofs);
	data[1] |= inb(dev->iobase + subpriv->ofs + 1) << 8;
	data[1] |= inb(dev->iobase + subpriv->ofs + 2) << 16;
	data[1] = dio200_read8(dev, subpriv->ofs);
	data[1] |= dio200_read8(dev, subpriv->ofs + 1) << 8;
	data[1] |= dio200_read8(dev, subpriv->ofs + 2) << 16;
	return 2;
}