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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
  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@xxxxxxxxx>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux