staging: comedi: me4000: fix 8254 timer programming
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 29 Apr 2014 19:59:53 +0000 (12:59 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 May 2014 00:06:34 +0000 (20:06 -0400)
As pointed out by Ian Abbott, the i8254_load() function does not
use the I8254_MODE* values to specify the "mode".

Refactor the 8254 timer programming to use the i8254_set_mode()
and i8254_write() helpers instead of i8254_load(). This allows
us to use the I8254_MODE* defines to clarify the code.

Also, use the CR_CHAN() macro to make sure the only the channel is
used in the insh->chanspec to specify the counter number.

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/me4000.c

index 5fc4850afb7437ef54bf0ada6de0b22d7071f09f..a08bc6ffad306ebb57f10e63fa152b7502ddd04e 100644 (file)
@@ -1352,6 +1352,7 @@ static int me4000_cnt_insn_config(struct comedi_device *dev,
                                  unsigned int *data)
 {
        struct me4000_info *info = dev->private;
+       unsigned int chan = CR_CHAN(insn->chanspec);
        int err;
 
        switch (data[0]) {
@@ -1359,16 +1360,17 @@ static int me4000_cnt_insn_config(struct comedi_device *dev,
                if (insn->n != 1)
                        return -EINVAL;
 
-               err = i8254_load(info->timer_regbase, 0, insn->chanspec, 0,
-                               I8254_MODE0 | I8254_BINARY);
+               err = i8254_set_mode(info->timer_regbase, 0, chan,
+                                    I8254_MODE0 | I8254_BINARY);
                if (err)
                        return err;
+               i8254_write(info->timer_regbase, 0, chan, 0);
                break;
        case GPCT_SET_OPERATION:
                if (insn->n != 2)
                        return -EINVAL;
 
-               err = i8254_set_mode(info->timer_regbase, 0, insn->chanspec,
+               err = i8254_set_mode(info->timer_regbase, 0, chan,
                                (data[1] << 1) | I8254_BINARY);
                if (err)
                        return err;