| From a29878553a9a7b4c06f93c7e383527cf014d4ceb Mon Sep 17 00:00:00 2001 |
| From: Tim Blechmann <tim@klingt.org> |
| Date: Tue, 22 Nov 2011 11:15:45 +0100 |
| Subject: ALSA: lx6464es - fix device communication via command bus |
| |
| From: Tim Blechmann <tim@klingt.org> |
| |
| commit a29878553a9a7b4c06f93c7e383527cf014d4ceb upstream. |
| |
| commit 6175ddf06b6172046a329e3abfd9c901a43efd2e 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> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/pci/lx6464es/lx_core.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| --- a/sound/pci/lx6464es/lx_core.c |
| +++ b/sound/pci/lx6464es/lx_core.c |
| @@ -80,8 +80,12 @@ unsigned long lx_dsp_reg_read(struct lx6 |
| |
| 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); |
| } |
| |
| |
| @@ -94,8 +98,12 @@ void lx_dsp_reg_write(struct lx6464es *c |
| 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); |
| } |
| |
| |