On 13-02-27 08:10 AM, Ian Abbott wrote: > Commit 4c4bc25d0fa6beaf054c0b4c3b324487f266c820 upstream. Both queued for 2.6.34.x -- I also put back Greg's sign off lines as per what was in the upstream versions. Paul. -- > > 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@xxxxxxxxx> > --- > Applies to 2.6.34.x longterm/stable kernel. > --- > drivers/staging/comedi/drivers/ni_labpc.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c > index 3f4fbfe..8c22926 100644 > --- a/drivers/staging/comedi/drivers/ni_labpc.c > +++ b/drivers/staging/comedi/drivers/ni_labpc.c > @@ -1223,7 +1223,9 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) > 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]; > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html