Commit 863e07c9 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: das16m1: don't calc pacer divisors twice



The analog input async command can use the pacer for the convert_src. The
(*do_cmdtest) calculates the divisors when validating the cmd argument.

There is no reason to recalc the divisors in the (*do_cmd). Just use the
values from the private data.

Refactor das16m1_set_pacer() to use the i8254_set_mode() and i8254_write()
helpers instead of i8254_load(). This allows us to use the I8254_* defines
when setting the mode to clarify the code.

Tidy up das16m1_cmd_exec() a bit. The pacer only needs to be set when the
convert_src is TRIG_TIMER.

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 33eafb77
Loading
Loading
Loading
Loading
+14 −27
Original line number Diff line number Diff line
@@ -254,26 +254,16 @@ static int das16m1_cmd_test(struct comedi_device *dev,
	return 0;
}

/* This function takes a time in nanoseconds and sets the     *
 * 2 pacer clocks to the closest frequency possible. It also  *
 * returns the actual sampling period.                        */
static unsigned int das16m1_set_pacer(struct comedi_device *dev,
				      unsigned int ns, int rounding_flags)
static void das16m1_set_pacer(struct comedi_device *dev)
{
	struct das16m1_private_struct *devpriv = dev->private;
	unsigned long timer_base = dev->iobase + DAS16M1_8254_SECOND;

	i8253_cascade_ns_to_timer_2div(I8254_OSC_BASE_10MHZ,
				       &devpriv->divisor1,
				       &devpriv->divisor2,
				       &ns, rounding_flags);
	i8254_set_mode(timer_base, 0, 1, I8254_MODE2 | I8254_BINARY);
	i8254_set_mode(timer_base, 0, 2, I8254_MODE2 | I8254_BINARY);

	/* Write the values of ctr1 and ctr2 into counters 1 and 2 */
	i8254_load(dev->iobase + DAS16M1_8254_SECOND, 0, 1, devpriv->divisor1,
		   2);
	i8254_load(dev->iobase + DAS16M1_8254_SECOND, 0, 2, devpriv->divisor2,
		   2);

	return ns;
	i8254_write(timer_base, 0, 1, devpriv->divisor1);
	i8254_write(timer_base, 0, 2, devpriv->divisor2);
}

static int das16m1_cmd_exec(struct comedi_device *dev,
@@ -307,10 +297,14 @@ static int das16m1_cmd_exec(struct comedi_device *dev,
		outb(byte, dev->iobase + DAS16M1_QUEUE_DATA);
	}

	/* set counter mode and counts */
	cmd->convert_arg =
	    das16m1_set_pacer(dev, cmd->convert_arg,
			      cmd->flags & TRIG_ROUND_MASK);
	/* enable interrupts and set internal pacer counter mode and counts */
	devpriv->control_state &= ~PACER_MASK;
	if (cmd->convert_src == TRIG_TIMER) {
		das16m1_set_pacer(dev);
		devpriv->control_state |= INT_PACER;
	} else {	/* TRIG_EXT */
		devpriv->control_state |= EXT_PACER;
	}

	/*  set control & status register */
	byte = 0;
@@ -323,13 +317,6 @@ static int das16m1_cmd_exec(struct comedi_device *dev,
	/* clear interrupt bit */
	outb(0, dev->iobase + DAS16M1_CLEAR_INTR);

	/* enable interrupts and internal pacer */
	devpriv->control_state &= ~PACER_MASK;
	if (cmd->convert_src == TRIG_TIMER)
		devpriv->control_state |= INT_PACER;
	else
		devpriv->control_state |= EXT_PACER;

	devpriv->control_state |= INTE;
	outb(devpriv->control_state, dev->iobase + DAS16M1_INTR_CONTROL);