]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ALSA: lx6464es - fix device communication via command bus
authorTim Blechmann <tim@klingt.org>
Tue, 22 Nov 2011 10:15:45 +0000 (11:15 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Nov 2011 10:53:11 +0000 (11:53 +0100)
commit 12ad0a988986bc6580a56f3fd8038cf36b20f92b optimized the mem*io
functions that have been used to send commands to the device. these
optimizations somehow corrupted the communication with the lx6464es,
that resulted the device to be unusable with kernels after 2.6.33.

this patch emulates the memcpy_*_io functions via a loop to avoid these
problems.

Signed-off-by: Tim Blechmann <tim@klingt.org>
LKML-Reference: <4ECB5257.4040600@ladisch.de>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/lx6464es/lx_core.c

index ad52f4187e405d742af99b2369ec3116f8033720..8c3e7fcefd99c91c38d39f92fd0cae8323cee210 100644 (file)
@@ -81,8 +81,12 @@ unsigned long lx_dsp_reg_read(struct lx6464es *chip, int port)
 static void lx_dsp_reg_readbuf(struct lx6464es *chip, int port, u32 *data,
                               u32 len)
 {
-       void __iomem *address = lx_dsp_register(chip, port);
-       memcpy_fromio(data, address, len*sizeof(u32));
+       u32 __iomem *address = lx_dsp_register(chip, port);
+       int i;
+
+       /* we cannot use memcpy_fromio */
+       for (i = 0; i != len; ++i)
+               data[i] = ioread32(address + i);
 }
 
 
@@ -95,8 +99,12 @@ void lx_dsp_reg_write(struct lx6464es *chip, int port, unsigned data)
 static void lx_dsp_reg_writebuf(struct lx6464es *chip, int port,
                                const u32 *data, u32 len)
 {
-       void __iomem *address = lx_dsp_register(chip, port);
-       memcpy_toio(address, data, len*sizeof(u32));
+       u32 __iomem *address = lx_dsp_register(chip, port);
+       int i;
+
+       /* we cannot use memcpy_to */
+       for (i = 0; i != len; ++i)
+               iowrite32(data[i], address + i);
 }