| From abbotti@mev.co.uk Fri Mar 1 11:18:44 2013 |
| From: Ian Abbott <abbotti@mev.co.uk> |
| Date: Wed, 27 Feb 2013 12:52:45 +0000 |
| Subject: staging: comedi: ni_labpc: correct differential channel sequence for AI commands |
| To: stable@vger.kernel.org |
| Cc: Ian Abbott <abbotti@mev.co.uk> |
| Message-ID: <1361969566-32521-1-git-send-email-abbotti@mev.co.uk> |
| |
| From: Ian Abbott <abbotti@mev.co.uk> |
| |
| Commit 4c4bc25d0fa6beaf054c0b4c3b324487f266c820 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 the setting of the channel bits for particular scanning modes |
| was incorrect for differential mode. (Only half the number of channels |
| are available in differential mode; comedi refers to them as channels 0, |
| 1, 2 and 3, but the hardware documentation refers to them as channels 0, |
| 2, 4 and 6.) In differential mode, the setting of the channel enable |
| bits in the command1 register should depend on whether the scan enable |
| bit is set. Effectively, we need to double the comedi channel number |
| when the scan enable bit is not set in differential mode. The scan |
| enable bit gets set when the AI scan mode is `MODE_MULT_CHAN_UP` or |
| `MODE_MULT_CHAN_DOWN`, and gets cleared when the AI scan mode is |
| `MODE_SINGLE_CHAN` or `MODE_SINGLE_CHAN_INTERVAL`. The existing test |
| for whether the comedi channel number needs to be doubled in |
| differential mode is incorrect in `labpc_ai_cmd()`. This patch corrects |
| the test. |
| |
| 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 | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/staging/comedi/drivers/ni_labpc.c |
| +++ b/drivers/staging/comedi/drivers/ni_labpc.c |
| @@ -1264,7 +1264,9 @@ static int labpc_ai_cmd(struct comedi_de |
| else |
| channel = CR_CHAN(cmd->chanlist[0]); |
| /* munge channel bits for differential / scan disabled mode */ |
| - if (labpc_ai_scan_mode(cmd) != MODE_SINGLE_CHAN && aref == AREF_DIFF) |
| + if ((labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN || |
| + labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN_INTERVAL) && |
| + aref == AREF_DIFF) |
| channel *= 2; |
| devpriv->command1_bits |= ADC_CHAN_BITS(channel); |
| devpriv->command1_bits |= thisboard->ai_range_code[range]; |