diff options
| author | Ian Abbott <abbotti@mev.co.uk> | 2013-03-05 08:13:44 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-03-11 13:21:05 -0400 |
| commit | 564c526a1bed5e42b5cd52cfe1752c4296ef17a6 (patch) | |
| tree | ab9c61808ef49e5804eb58d50bd0b96d05ef68c1 | |
| parent | aa1e1234826e21197f818ca0abf519775ad4eb5c (diff) | |
staging: comedi: dt9812: use CR_CHAN() for channel number
As pointed out by Dan Carpenper in
<http://driverdev.linuxdriverproject.org/pipermail/devel/2013-February/036025.html>,
the dt9812 comedi driver's use of the `chanspec` member of `struct
comedi_insn` as a channel number is incorrect. Change it to use
`CR_CHAN(insn->chanspec)` as the channel number (where `insn` is a
pointer to the `struct comedi_insn` being processed).
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Cc: stable <stable@vger.kernel.org> # 3.8 onwards
Cc: Anders Blomdell <anders.blomdell@control.lth.se>
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
| -rw-r--r-- | drivers/staging/comedi/drivers/dt9812.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/staging/comedi/drivers/dt9812.c b/drivers/staging/comedi/drivers/dt9812.c index 192cf088f834..57b451904791 100644 --- a/drivers/staging/comedi/drivers/dt9812.c +++ b/drivers/staging/comedi/drivers/dt9812.c | |||
| @@ -947,12 +947,13 @@ static int dt9812_di_rinsn(struct comedi_device *dev, | |||
| 947 | unsigned int *data) | 947 | unsigned int *data) |
| 948 | { | 948 | { |
| 949 | struct comedi_dt9812 *devpriv = dev->private; | 949 | struct comedi_dt9812 *devpriv = dev->private; |
| 950 | unsigned int channel = CR_CHAN(insn->chanspec); | ||
| 950 | int n; | 951 | int n; |
| 951 | u8 bits = 0; | 952 | u8 bits = 0; |
| 952 | 953 | ||
| 953 | dt9812_digital_in(devpriv->slot, &bits); | 954 | dt9812_digital_in(devpriv->slot, &bits); |
| 954 | for (n = 0; n < insn->n; n++) | 955 | for (n = 0; n < insn->n; n++) |
| 955 | data[n] = ((1 << insn->chanspec) & bits) != 0; | 956 | data[n] = ((1 << channel) & bits) != 0; |
| 956 | return n; | 957 | return n; |
| 957 | } | 958 | } |
| 958 | 959 | ||
| @@ -961,12 +962,13 @@ static int dt9812_do_winsn(struct comedi_device *dev, | |||
| 961 | unsigned int *data) | 962 | unsigned int *data) |
| 962 | { | 963 | { |
| 963 | struct comedi_dt9812 *devpriv = dev->private; | 964 | struct comedi_dt9812 *devpriv = dev->private; |
| 965 | unsigned int channel = CR_CHAN(insn->chanspec); | ||
| 964 | int n; | 966 | int n; |
| 965 | u8 bits = 0; | 967 | u8 bits = 0; |
| 966 | 968 | ||
| 967 | dt9812_digital_out_shadow(devpriv->slot, &bits); | 969 | dt9812_digital_out_shadow(devpriv->slot, &bits); |
| 968 | for (n = 0; n < insn->n; n++) { | 970 | for (n = 0; n < insn->n; n++) { |
| 969 | u8 mask = 1 << insn->chanspec; | 971 | u8 mask = 1 << channel; |
| 970 | 972 | ||
| 971 | bits &= ~mask; | 973 | bits &= ~mask; |
| 972 | if (data[n]) | 974 | if (data[n]) |
| @@ -981,13 +983,13 @@ static int dt9812_ai_rinsn(struct comedi_device *dev, | |||
| 981 | unsigned int *data) | 983 | unsigned int *data) |
| 982 | { | 984 | { |
| 983 | struct comedi_dt9812 *devpriv = dev->private; | 985 | struct comedi_dt9812 *devpriv = dev->private; |
| 986 | unsigned int channel = CR_CHAN(insn->chanspec); | ||
| 984 | int n; | 987 | int n; |
| 985 | 988 | ||
| 986 | for (n = 0; n < insn->n; n++) { | 989 | for (n = 0; n < insn->n; n++) { |
| 987 | u16 value = 0; | 990 | u16 value = 0; |
| 988 | 991 | ||
| 989 | dt9812_analog_in(devpriv->slot, insn->chanspec, &value, | 992 | dt9812_analog_in(devpriv->slot, channel, &value, DT9812_GAIN_1); |
| 990 | DT9812_GAIN_1); | ||
| 991 | data[n] = value; | 993 | data[n] = value; |
| 992 | } | 994 | } |
| 993 | return n; | 995 | return n; |
| @@ -998,12 +1000,13 @@ static int dt9812_ao_rinsn(struct comedi_device *dev, | |||
| 998 | unsigned int *data) | 1000 | unsigned int *data) |
| 999 | { | 1001 | { |
| 1000 | struct comedi_dt9812 *devpriv = dev->private; | 1002 | struct comedi_dt9812 *devpriv = dev->private; |
| 1003 | unsigned int channel = CR_CHAN(insn->chanspec); | ||
| 1001 | int n; | 1004 | int n; |
| 1002 | u16 value; | 1005 | u16 value; |
| 1003 | 1006 | ||
| 1004 | for (n = 0; n < insn->n; n++) { | 1007 | for (n = 0; n < insn->n; n++) { |
| 1005 | value = 0; | 1008 | value = 0; |
| 1006 | dt9812_analog_out_shadow(devpriv->slot, insn->chanspec, &value); | 1009 | dt9812_analog_out_shadow(devpriv->slot, channel, &value); |
| 1007 | data[n] = value; | 1010 | data[n] = value; |
| 1008 | } | 1011 | } |
| 1009 | return n; | 1012 | return n; |
| @@ -1014,10 +1017,11 @@ static int dt9812_ao_winsn(struct comedi_device *dev, | |||
| 1014 | unsigned int *data) | 1017 | unsigned int *data) |
| 1015 | { | 1018 | { |
| 1016 | struct comedi_dt9812 *devpriv = dev->private; | 1019 | struct comedi_dt9812 *devpriv = dev->private; |
| 1020 | unsigned int channel = CR_CHAN(insn->chanspec); | ||
| 1017 | int n; | 1021 | int n; |
| 1018 | 1022 | ||
| 1019 | for (n = 0; n < insn->n; n++) | 1023 | for (n = 0; n < insn->n; n++) |
| 1020 | dt9812_analog_out(devpriv->slot, insn->chanspec, data[n]); | 1024 | dt9812_analog_out(devpriv->slot, channel, data[n]); |
| 1021 | return n; | 1025 | return n; |
| 1022 | } | 1026 | } |
| 1023 | 1027 | ||
