| From abbotti@mev.co.uk Fri Mar 1 11:19:33 2013 |
| From: Ian Abbott <abbotti@mev.co.uk> |
| Date: Wed, 27 Feb 2013 12:52:46 +0000 |
| Subject: staging: comedi: ni_labpc: set up command4 register *after* command3 |
| To: stable@vger.kernel.org |
| Cc: Ian Abbott <abbotti@mev.co.uk> |
| Message-ID: <1361969566-32521-2-git-send-email-abbotti@mev.co.uk> |
| |
| From: Ian Abbott <abbotti@mev.co.uk> |
| |
| 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> |
| |
| --- |
| drivers/staging/comedi/drivers/ni_labpc.c | 31 +++++++++++++++--------------- |
| 1 file changed, 16 insertions(+), 15 deletions(-) |
| |
| --- a/drivers/staging/comedi/drivers/ni_labpc.c |
| +++ b/drivers/staging/comedi/drivers/ni_labpc.c |
| @@ -1282,21 +1282,6 @@ static int labpc_ai_cmd(struct comedi_de |
| 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); |
| @@ -1376,6 +1361,22 @@ static int labpc_ai_cmd(struct comedi_de |
| 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 acquisition */ |
| |
| /* command2 reg */ |