staging: comedi: ni_labpc: introduce labpc_counter_set_mode()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 22 Mar 2013 16:53:49 +0000 (09:53 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Mar 2013 18:42:59 +0000 (11:42 -0700)
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>
drivers/staging/comedi/drivers/ni_labpc.c

index bc4f3e6..ba9c97d 100644 (file)
 #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)) {