summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-03-22 09:53:49 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-25 11:42:59 -0700
commit463f930401024926eadf4c613a547f2eb41a2882 (patch)
tree43f6412da74fc03ba57e7a565a594224b308c51c
parent161ce6fa4b6c3538f104e51e101771a2abc72677 (diff)
staging: comedi: ni_labpc: introduce labpc_counter_set_mode()
Introduce labpc_counter_set_mode() which is a wrapper around the i8254_set_mode() helpers to program the 8254 timers. Use the new function instead of directly writing to the timer mode register with a "magic" number. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/comedi/drivers/ni_labpc.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index bc4f3e689952..ba9c97d29398 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -134,9 +134,6 @@
#define CMD4_ECLKRCV (1 << 4)
#define DIO_BASE_REG 0x10 /* R/W: 8255 DIO base reg */
#define COUNTER_A_BASE_REG 0x14 /* R/W: 8253 Counter A base reg */
-#define COUNTER_A_MODE_REG 0x17 /* W: 8253 Counter A mode reg */
-#define INIT_A0_BITS 0x14 /* (a0 mode 2) */
-#define INIT_A1_BITS 0x70 /* (a1 mode 0) */
#define COUNTER_B_BASE_REG 0x18 /* R/W: 8253 Counter B base reg */
#define CMD5_REG 0x1c /* W: Command 5 reg */
#define CMD5_WRTPRT (1 << 2)
@@ -292,6 +289,20 @@ static const int dma_buffer_size = 0xff00;
/* 2 bytes per sample */
static const int sample_size = 2;
+static int labpc_counter_set_mode(struct comedi_device *dev,
+ unsigned long base_address,
+ unsigned int counter_number,
+ unsigned int mode)
+{
+ const struct labpc_boardinfo *board = comedi_board(dev);
+
+ if (board->has_mmio)
+ return i8254_mm_set_mode((void __iomem *)base_address, 0,
+ counter_number, mode);
+ else
+ return i8254_set_mode(base_address, 0, counter_number, mode);
+}
+
static bool labpc_range_is_unipolar(struct comedi_subdevice *s,
unsigned int range)
{
@@ -446,11 +457,9 @@ static int labpc_ai_insn_read(struct comedi_device *dev,
devpriv->cmd4 |= CMD4_SEDIFF;
devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG);
- /*
- * initialize pacer counter output to make sure it doesn't
- * cause any problems
- */
- devpriv->write_byte(INIT_A0_BITS, dev->iobase + COUNTER_A_MODE_REG);
+ /* initialize pacer counter to prevent any problems */
+ labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
+ 0, I8254_MODE2);
labpc_clear_adc_fifo(dev);
@@ -896,12 +905,11 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
comedi_error(dev, "error loading counter a1");
return -1;
}
- } else /*
- * otherwise, just put a1 in mode 0
- * with no count to set its output low
- */
- devpriv->write_byte(INIT_A1_BITS,
- dev->iobase + COUNTER_A_MODE_REG);
+ } else {
+ /* just put counter a1 in mode 0 to set its output low */
+ labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
+ 1, I8254_MODE0);
+ }
#ifdef CONFIG_ISA_DMA_API
/* figure out what method we will use to transfer data */
@@ -968,9 +976,11 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
comedi_error(dev, "error loading counter a0");
return -1;
}
- } else
- devpriv->write_byte(INIT_A0_BITS,
- dev->iobase + COUNTER_A_MODE_REG);
+ } else {
+ /* initialize pacer counter to prevent any problems */
+ labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
+ 0, I8254_MODE2);
+ }
/* set up scan pacing */
if (labpc_ai_scan_period(cmd, mode)) {