| From 067c94ea8da1d140e9b567d07cf24e8eab634fe8 Mon Sep 17 00:00:00 2001 |
| From: Ian Abbott <abbotti@mev.co.uk> |
| Date: Fri, 1 Feb 2013 14:51:57 +0000 |
| Subject: [PATCH] staging: comedi: ni_labpc: set up command4 register *after* |
| command3 |
| |
| commit 22056e2b46246d97ff0f7c6e21a77b8daa07f02c upstream. |
| |
| Tuomas <tvainikk _at_ gmail _dot_ com> reported problems getting |
| meaningful output from a Lab-PC+ in differential mode for AI cmds, but |
| AI insn reads gave correct readings. He tracked it down to two |
| problems, one of which is addressed by this patch. |
| |
| It seems that writing to the command3 register after writing to the |
| command4 register in `labpc_ai_cmd()` messes up the differential |
| reference bit setting in the command4 register. Set up the command4 |
| register after the command3 register (as in `labpc_ai_rinsn()`) to avoid |
| the problem. |
| |
| Thanks to Tuomas for suggesting the fix. |
| |
| Signed-off-by: Ian Abbott <abbotti@mev.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c |
| index 9521b04..7a310e9 100644 |
| --- a/drivers/staging/comedi/drivers/ni_labpc.c |
| +++ b/drivers/staging/comedi/drivers/ni_labpc.c |
| @@ -1241,21 +1241,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) |
| devpriv->write_byte(devpriv->command1_bits, |
| dev->iobase + COMMAND1_REG); |
| } |
| - /* setup any external triggering/pacing (command4 register) */ |
| - devpriv->command4_bits = 0; |
| - if (cmd->convert_src != TRIG_EXT) |
| - devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT; |
| - /* XXX should discard first scan when using interval scanning |
| - * since manual says it is not synced with scan clock */ |
| - if (labpc_use_continuous_mode(cmd) == 0) { |
| - devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT; |
| - if (cmd->scan_begin_src == TRIG_EXT) |
| - devpriv->command4_bits |= EXT_SCAN_EN_BIT; |
| - } |
| - /* single-ended/differential */ |
| - if (aref == AREF_DIFF) |
| - devpriv->command4_bits |= ADC_DIFF_BIT; |
| - devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG); |
| |
| devpriv->write_byte(cmd->chanlist_len, |
| dev->iobase + INTERVAL_COUNT_REG); |
| @@ -1333,6 +1318,22 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) |
| devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT; |
| devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG); |
| |
| + /* setup any external triggering/pacing (command4 register) */ |
| + devpriv->command4_bits = 0; |
| + if (cmd->convert_src != TRIG_EXT) |
| + devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT; |
| + /* XXX should discard first scan when using interval scanning |
| + * since manual says it is not synced with scan clock */ |
| + if (labpc_use_continuous_mode(cmd) == 0) { |
| + devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT; |
| + if (cmd->scan_begin_src == TRIG_EXT) |
| + devpriv->command4_bits |= EXT_SCAN_EN_BIT; |
| + } |
| + /* single-ended/differential */ |
| + if (aref == AREF_DIFF) |
| + devpriv->command4_bits |= ADC_DIFF_BIT; |
| + devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG); |
| + |
| /* startup aquisition */ |
| |
| /* command2 reg */ |
| -- |
| 1.8.1.2 |
| |