Commit e74e9899 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: ni_labpc: fix 8254 timer programming

As pointed out by Ian Abbott, the i8254_load() function does not
use the I8254_MODE* values to specify the "mode".

The labpc_counter_load() function in this driver is passed an
I8254_MODE* value so we need to use the i8254_set_mode() and
i8254_write() helpers instead of i8254_load() to program the
timers.

The calls to labpc_counter_load() will not fail so change the
return to void and remove all the unnecessary error handling.

Similarly, change the return type of labpc_counter_set_mode() to
void and remove the unnecessary error handling.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 52c9e62c
...@@ -171,32 +171,39 @@ static const struct labpc_boardinfo labpc_boards[] = { ...@@ -171,32 +171,39 @@ static const struct labpc_boardinfo labpc_boards[] = {
}; };
#endif #endif
static int labpc_counter_load(struct comedi_device *dev, static void labpc_counter_load(struct comedi_device *dev,
unsigned long base_address, unsigned long base_address,
unsigned int counter_number, unsigned int counter_number,
unsigned int count, unsigned int mode) unsigned int count,
unsigned int mode)
{ {
const struct labpc_boardinfo *board = comedi_board(dev); const struct labpc_boardinfo *board = comedi_board(dev);
if (board->has_mmio) if (board->has_mmio) {
return i8254_mm_load((void __iomem *)base_address, 0, void __iomem *mmio_base = (void __iomem *)base_address;
counter_number, count, mode);
else i8254_mm_set_mode(mmio_base, 0, counter_number, mode);
return i8254_load(base_address, 0, counter_number, count, mode); i8254_mm_write(mmio_base, 0, counter_number, count);
} else {
i8254_set_mode(base_address, 0, counter_number, mode);
i8254_write(base_address, 0, counter_number, count);
}
} }
static int labpc_counter_set_mode(struct comedi_device *dev, static void labpc_counter_set_mode(struct comedi_device *dev,
unsigned long base_address, unsigned long base_address,
unsigned int counter_number, unsigned int counter_number,
unsigned int mode) unsigned int mode)
{ {
const struct labpc_boardinfo *board = comedi_board(dev); const struct labpc_boardinfo *board = comedi_board(dev);
if (board->has_mmio) if (board->has_mmio) {
return i8254_mm_set_mode((void __iomem *)base_address, 0, void __iomem *mmio_base = (void __iomem *)base_address;
counter_number, mode);
else i8254_mm_set_mode(mmio_base, 0, counter_number, mode);
return i8254_set_mode(base_address, 0, counter_number, mode); } else {
i8254_set_mode(base_address, 0, counter_number, mode);
}
} }
static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s) static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
...@@ -349,10 +356,8 @@ static int labpc_ai_insn_read(struct comedi_device *dev, ...@@ -349,10 +356,8 @@ static int labpc_ai_insn_read(struct comedi_device *dev,
devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG); devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG);
/* initialize pacer counter to prevent any problems */ /* initialize pacer counter to prevent any problems */
ret = labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG, labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
0, I8254_MODE2); 0, I8254_MODE2);
if (ret)
return ret;
labpc_clear_adc_fifo(dev); labpc_clear_adc_fifo(dev);
...@@ -730,7 +735,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -730,7 +735,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
unsigned int aref = CR_AREF(chanspec); unsigned int aref = CR_AREF(chanspec);
enum transfer_type xfer; enum transfer_type xfer;
unsigned long flags; unsigned long flags;
int ret;
/* make sure board is disabled before setting up acquisition */ /* make sure board is disabled before setting up acquisition */
labpc_cancel(dev, s); labpc_cancel(dev, s);
...@@ -745,18 +749,13 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -745,18 +749,13 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
* load counter a1 with count of 3 * load counter a1 with count of 3
* (pc+ manual says this is minimum allowed) using mode 0 * (pc+ manual says this is minimum allowed) using mode 0
*/ */
ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG, labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
1, 3, I8254_MODE0); 1, 3, I8254_MODE0);
} else { } else {
/* just put counter a1 in mode 0 to set its output low */ /* just put counter a1 in mode 0 to set its output low */
ret = labpc_counter_set_mode(dev, labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
dev->iobase + COUNTER_A_BASE_REG,
1, I8254_MODE0); 1, I8254_MODE0);
} }
if (ret) {
comedi_error(dev, "error loading counter a1");
return ret;
}
/* figure out what method we will use to transfer data */ /* figure out what method we will use to transfer data */
if (labpc_have_dma_chan(dev) && if (labpc_have_dma_chan(dev) &&
...@@ -800,38 +799,25 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -800,38 +799,25 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
/* set up pacing */ /* set up pacing */
labpc_adc_timing(dev, cmd, mode); labpc_adc_timing(dev, cmd, mode);
/* load counter b0 in mode 3 */ /* load counter b0 in mode 3 */
ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG, labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
0, devpriv->divisor_b0, I8254_MODE3); 0, devpriv->divisor_b0, I8254_MODE3);
if (ret < 0) {
comedi_error(dev, "error loading counter b0");
return -1;
}
} }
/* set up conversion pacing */ /* set up conversion pacing */
if (labpc_ai_convert_period(cmd, mode)) { if (labpc_ai_convert_period(cmd, mode)) {
/* load counter a0 in mode 2 */ /* load counter a0 in mode 2 */
ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG, labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
0, devpriv->divisor_a0, I8254_MODE2); 0, devpriv->divisor_a0, I8254_MODE2);
} else { } else {
/* initialize pacer counter to prevent any problems */ /* initialize pacer counter to prevent any problems */
ret = labpc_counter_set_mode(dev, labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
dev->iobase + COUNTER_A_BASE_REG,
0, I8254_MODE2); 0, I8254_MODE2);
} }
if (ret) {
comedi_error(dev, "error loading counter a0");
return ret;
}
/* set up scan pacing */ /* set up scan pacing */
if (labpc_ai_scan_period(cmd, mode)) { if (labpc_ai_scan_period(cmd, mode)) {
/* load counter b1 in mode 2 */ /* load counter b1 in mode 2 */
ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG, labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
1, devpriv->divisor_b1, I8254_MODE2); 1, devpriv->divisor_b1, I8254_MODE2);
if (ret < 0) {
comedi_error(dev, "error loading counter b1");
return -1;
}
} }
labpc_clear_adc_fifo(dev); labpc_clear_adc_fifo(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment