aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2011-11-22 05:15:45 -0500
committerTakashi Iwai <tiwai@suse.de>2011-11-22 05:53:11 -0500
commita29878553a9a7b4c06f93c7e383527cf014d4ceb (patch)
tree8293c90710effa830249e8fde67472495cff9374 /sound
parentafd00d7235c1989d06d75cf8ac3d7722fcf2f394 (diff)
ALSA: lx6464es - fix device communication via command bus
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> Cc: <stable@kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/lx6464es/lx_core.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sound/pci/lx6464es/lx_core.c b/sound/pci/lx6464es/lx_core.c
index ad52f4187e4..8c3e7fcefd9 100644
--- a/sound/pci/lx6464es/lx_core.c
+++ b/sound/pci/lx6464es/lx_core.c
@@ -81,8 +81,12 @@ unsigned long lx_dsp_reg_read(struct lx6464es *chip, int port)
81static void lx_dsp_reg_readbuf(struct lx6464es *chip, int port, u32 *data, 81static void lx_dsp_reg_readbuf(struct lx6464es *chip, int port, u32 *data,
82 u32 len) 82 u32 len)
83{ 83{
84 void __iomem *address = lx_dsp_register(chip, port); 84 u32 __iomem *address = lx_dsp_register(chip, port);
85 memcpy_fromio(data, address, len*sizeof(u32)); 85 int i;
86
87 /* we cannot use memcpy_fromio */
88 for (i = 0; i != len; ++i)
89 data[i] = ioread32(address + i);
86} 90}
87 91
88 92
@@ -95,8 +99,12 @@ void lx_dsp_reg_write(struct lx6464es *chip, int port, unsigned data)
95static void lx_dsp_reg_writebuf(struct lx6464es *chip, int port, 99static void lx_dsp_reg_writebuf(struct lx6464es *chip, int port,
96 const u32 *data, u32 len) 100 const u32 *data, u32 len)
97{ 101{
98 void __iomem *address = lx_dsp_register(chip, port); 102 u32 __iomem *address = lx_dsp_register(chip, port);
99 memcpy_toio(address, data, len*sizeof(u32)); 103 int i;
104
105 /* we cannot use memcpy_to */
106 for (i = 0; i != len; ++i)
107 iowrite32(data[i], address + i);
100} 108}
101 109
102 110