* [PATCH 3.7 - 3.12] staging: comedi: adl_pci7x3x: fix digital output on PCI-7230
@ 2015-09-16 9:58 Ian Abbott
2015-09-16 19:38 ` Jiri Slaby
0 siblings, 1 reply; 2+ messages in thread
From: Ian Abbott @ 2015-09-16 9:58 UTC (permalink / raw)
To: stable; +Cc: Ian Abbott
commit ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e upstream
The "adl_pci7x3x" driver replaced the "adl_pci7230" and "adl_pci7432"
drivers in commits 8f567c373c4b ("staging: comedi: new adl_pci7x3x
driver") and 657f77d173d3 ("staging: comedi: remove adl_pci7230 and
adl_pci7432 drivers"). Although the new driver code agrees with the
user manuals for the respective boards, digital outputs stopped working
on the PCI-7230. This has 16 digital output channels and the previous
adl_pci7230 driver shifted the 16 bit output state left by 16 bits
before writing to the hardware register. The new adl_pci7x3x driver
doesn't do that. Fix it in `adl_pci7x3x_do_insn_bits()` by checking
for the special case of the subdevice having only 16 channels and
duplicating the 16 bit output state into both halves of the 32-bit
register. That should work both for what the board actually does and
for what the user manual says it should do.
Fixes: 8f567c373c4b ("staging: comedi: new adl_pci7x3x driver")
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/adl_pci7x3x.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/comedi/drivers/adl_pci7x3x.c b/drivers/staging/comedi/drivers/adl_pci7x3x.c
index 81b7203..c570ede 100644
--- a/drivers/staging/comedi/drivers/adl_pci7x3x.c
+++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c
@@ -116,10 +116,21 @@ static int adl_pci7x3x_do_insn_bits(struct comedi_device *dev,
unsigned int bits = data[1];
if (mask) {
+ unsigned int val;
+
s->state &= ~mask;
s->state |= (bits & mask);
-
- outl(s->state, dev->iobase + reg);
+ val = s->state;
+ if (s->n_chan == 16) {
+ /*
+ * It seems the PCI-7230 needs the 16-bit DO state
+ * to be shifted left by 16 bits before being written
+ * to the 32-bit register. Set the value in both
+ * halves of the register to be sure.
+ */
+ val |= val << 16;
+ }
+ outl(val, dev->iobase + reg);
}
/*
--
2.5.1
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH 3.7 - 3.12] staging: comedi: adl_pci7x3x: fix digital output on PCI-7230
2015-09-16 9:58 [PATCH 3.7 - 3.12] staging: comedi: adl_pci7x3x: fix digital output on PCI-7230 Ian Abbott
@ 2015-09-16 19:38 ` Jiri Slaby
0 siblings, 0 replies; 2+ messages in thread
From: Jiri Slaby @ 2015-09-16 19:38 UTC (permalink / raw)
To: Ian Abbott, stable
On 09/16/2015, 11:58 AM, Ian Abbott wrote:
> commit ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e upstream
>
> The "adl_pci7x3x" driver replaced the "adl_pci7230" and "adl_pci7432"
> drivers in commits 8f567c373c4b ("staging: comedi: new adl_pci7x3x
> driver") and 657f77d173d3 ("staging: comedi: remove adl_pci7230 and
> adl_pci7432 drivers"). Although the new driver code agrees with the
> user manuals for the respective boards, digital outputs stopped working
> on the PCI-7230. This has 16 digital output channels and the previous
> adl_pci7230 driver shifted the 16 bit output state left by 16 bits
> before writing to the hardware register. The new adl_pci7x3x driver
> doesn't do that. Fix it in `adl_pci7x3x_do_insn_bits()` by checking
> for the special case of the subdevice having only 16 channels and
> duplicating the 16 bit output state into both halves of the 32-bit
> register. That should work both for what the board actually does and
> for what the user manual says it should do.
>
> Fixes: 8f567c373c4b ("staging: comedi: new adl_pci7x3x driver")
> Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Applied to 3.12. Thanks.
> ---
> drivers/staging/comedi/drivers/adl_pci7x3x.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/staging/comedi/drivers/adl_pci7x3x.c b/drivers/staging/comedi/drivers/adl_pci7x3x.c
> index 81b7203..c570ede 100644
> --- a/drivers/staging/comedi/drivers/adl_pci7x3x.c
> +++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c
> @@ -116,10 +116,21 @@ static int adl_pci7x3x_do_insn_bits(struct comedi_device *dev,
> unsigned int bits = data[1];
>
> if (mask) {
> + unsigned int val;
> +
> s->state &= ~mask;
> s->state |= (bits & mask);
> -
> - outl(s->state, dev->iobase + reg);
> + val = s->state;
> + if (s->n_chan == 16) {
> + /*
> + * It seems the PCI-7230 needs the 16-bit DO state
> + * to be shifted left by 16 bits before being written
> + * to the 32-bit register. Set the value in both
> + * halves of the register to be sure.
> + */
> + val |= val << 16;
> + }
> + outl(val, dev->iobase + reg);
> }
>
> /*
>
--
js
suse labs
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-09-16 19:38 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-16 9:58 [PATCH 3.7 - 3.12] staging: comedi: adl_pci7x3x: fix digital output on PCI-7230 Ian Abbott
2015-09-16 19:38 ` Jiri Slaby
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.