staging: comedi: hwdrv_apci3501: refactor apci3501_config_insn_timer()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 12 Aug 2015 20:25:42 +0000 (13:25 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 15 Aug 2015 01:36:17 +0000 (18:36 -0700)
The handling for the watchdog and timer modes is very similar. Refactor
this function to use a common code path for both modes.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c

index 47c6bc1..e5209eb 100644 (file)
@@ -22,55 +22,42 @@ static int apci3501_config_insn_timer(struct comedi_device *dev,
                                      unsigned int *data)
 {
        struct apci3501_private *devpriv = dev->private;
-       unsigned int ctrl = 0;
+       unsigned int ctrl;
+
+       if (data[0] != ADDIDATA_WATCHDOG &&
+           data[0] != ADDIDATA_TIMER)
+               return -EINVAL;
 
        devpriv->tsk_Current = current;
-       if (data[0] == ADDIDATA_WATCHDOG) {
-
-               devpriv->timer_mode = ADDIDATA_WATCHDOG;
-               /* Disable the watchdog */
-               outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
-
-               if (data[1] == 1) {
-                       /* Enable TIMER int & DISABLE ALL THE OTHER int SOURCES */
-                       outl(0x02, dev->iobase + APCI3501_TIMER_CTRL_REG);
-               } else {
-                       /* disable Timer interrupt */
-                       outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
-               }
 
-               outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
-               outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
+       devpriv->timer_mode = data[0];
 
-               /* Set the mode (e2->e0) */
+       /* first, disable the watchdog or stop the timer */
+       if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
+               ctrl = 0;
+       } else {
                ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
-               ctrl |= 0xfff819e0;
-               outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
+               ctrl &= 0xfffff9fe;
        }
+       outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
 
-       else if (data[0] == ADDIDATA_TIMER) {
-               /* First Stop The Timer */
-               ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
-               ctrl &= 0xfffff9fe;
-               outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
-               devpriv->timer_mode = ADDIDATA_TIMER;
-               if (data[1] == 1) {
-                       /* Enable TIMER int & DISABLE ALL THE OTHER int SOURCES */
-                       outl(0x02, dev->iobase + APCI3501_TIMER_CTRL_REG);
-               } else {
-                       /* disable Timer interrupt */
-                       outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
-               }
+       /* enable/disable the timer interrupt */
+       ctrl = (data[1] == 1) ? 0x2 : 0;
+       outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
 
-               outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
-               outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
+       outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
+       outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
 
+       ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
+       if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
+               /* Set the mode (e2->e0) NOTE: this doesn't look correct */
+               ctrl |= 0xfff819e0;
+       } else {
                /* mode 2 */
-               ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
                ctrl &= 0xfff719e2;
                ctrl |= (2 << 13) | 0x10;
-               outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
        }
+       outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
 
        return insn->n;
 }