[PATCH 17/22] staging: comedi: adv_pci1710: only calc the pacer divisors once

Ian Abbott abbotti at mev.co.uk
Thu Apr 24 11:15:18 UTC 2014


On 2014-04-24 00:07, H Hartley Sweeten wrote:
> When the cmd->convert_src == TRIG_TIMER the divisors needed to
> generate the pacer time are calculated in the (*do_cmdtest) to
> validate the cmd->convert_arg. The core always does the (*do_cmdtest)
> before the (*do_cmd) so there is no reason to recalc the divisors.
>
> Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
> Cc: Ian Abbott <abbotti at mev.co.uk>
> Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> ---
>   drivers/staging/comedi/drivers/adv_pci1710.c | 20 +++++++-------------
>   1 file changed, 7 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c
> index c1aa16a..99e3a30 100644
> --- a/drivers/staging/comedi/drivers/adv_pci1710.c
> +++ b/drivers/staging/comedi/drivers/adv_pci1710.c
> @@ -305,7 +305,8 @@ struct pci1710_private {
>   	unsigned char ai_et;
>   	unsigned int ai_et_CntrlReg;
>   	unsigned int ai_et_MuxVal;
> -	unsigned int ai_et_div1, ai_et_div2;
> +	unsigned int divisor1;
> +	unsigned int divisor2;
>   	unsigned int act_chanlist[32];	/*  list of scanned channel */
>   	unsigned char act_chanlist_len;	/*  len of scanlist */
>   	unsigned char act_chanlist_pos;	/*  actual position in MUX list */
> @@ -942,7 +943,7 @@ static irqreturn_t interrupt_service_pci1710(int irq, void *d)
>   		outw(devpriv->ai_et_MuxVal, dev->iobase + PCI171x_MUX);
>   		outw(devpriv->CntrlReg, dev->iobase + PCI171x_CONTROL);
>   		/*  start pacer */
> -		start_pacer(dev, 1, devpriv->ai_et_div1, devpriv->ai_et_div2);
> +		start_pacer(dev, 1, devpriv->divisor1, devpriv->divisor2);
>   		return IRQ_HANDLED;
>   	}
>
> @@ -958,7 +959,6 @@ static int pci171x_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
>   {
>   	struct pci1710_private *devpriv = dev->private;
>   	struct comedi_cmd *cmd = &s->async->cmd;
> -	unsigned int divisor1 = 0, divisor2 = 0;
>   	int mode;
>
>   	if (cmd->convert_src == TRIG_TIMER) {
> @@ -998,17 +998,11 @@ static int pci171x_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
>   		} else {
>   			devpriv->ai_et = 0;
>   		}
> -		i8253_cascade_ns_to_timer(devpriv->i8254_osc_base,
> -					  &divisor1, &divisor2,
> -					  &cmd->convert_arg,
> -					  cmd->flags);
>   		outw(devpriv->CntrlReg, dev->iobase + PCI171x_CONTROL);
>   		if (mode != 2) {
>   			/*  start pacer */
> -			start_pacer(dev, mode, divisor1, divisor2);
> -		} else {
> -			devpriv->ai_et_div1 = divisor1;
> -			devpriv->ai_et_div2 = divisor2;
> +			start_pacer(dev, mode,
> +				    devpriv->divisor1, devpriv->divisor2);
>   		}
>   		break;
>   	case 3:
> @@ -1031,7 +1025,6 @@ static int pci171x_ai_cmdtest(struct comedi_device *dev,
>   	struct pci1710_private *devpriv = dev->private;
>   	int err = 0;
>   	int tmp;
> -	unsigned int divisor1 = 0, divisor2 = 0;
>
>   	/* Step 1 : check if triggers are trivially valid */
>
> @@ -1081,7 +1074,8 @@ static int pci171x_ai_cmdtest(struct comedi_device *dev,
>   	if (cmd->convert_src == TRIG_TIMER) {
>   		tmp = cmd->convert_arg;
>   		i8253_cascade_ns_to_timer(devpriv->i8254_osc_base,
> -					  &divisor1, &divisor2,
> +					  &devpriv->divisor1,
> +					  &devpriv->divisor2,
>   					  &cmd->convert_arg, cmd->flags);
>   		if (cmd->convert_arg < this_board->ai_ns_min)
>   			cmd->convert_arg = this_board->ai_ns_min;
>

You can't modify private data in do_cmdtest that is also used by the 
actively running command.  So if you want to avoid the recalc, you'll 
need two new members and copy them to the old members in do_cmd.

-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti at mev.co.uk>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-


More information about the devel mailing list