diff options
-rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 7 | ||||
-rw-r--r-- | sound/pci/cs5535audio/cs5535audio.c | 34 | ||||
-rw-r--r-- | sound/pci/cs5535audio/cs5535audio.h | 10 | ||||
-rw-r--r-- | sound/pci/cs5535audio/cs5535audio_pcm.c | 57 |
4 files changed, 48 insertions, 60 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 2f27f391c7cc..23d1870d522f 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -410,6 +410,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
410 | 410 | ||
411 | The power-management is supported. | 411 | The power-management is supported. |
412 | 412 | ||
413 | Module snd-cs5535audio | ||
414 | ---------------------- | ||
415 | |||
416 | Module for multifunction CS5535 companion PCI device | ||
417 | |||
418 | Module supports up to 8 cards. | ||
419 | |||
413 | Module snd-dt019x | 420 | Module snd-dt019x |
414 | ----------------- | 421 | ----------------- |
415 | 422 | ||
diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index 920c857fc223..3f4379da4d26 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c | |||
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(pci, snd_cs5535audio_ids); | |||
55 | 55 | ||
56 | static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout) | 56 | static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout) |
57 | { | 57 | { |
58 | unsigned long tmp; | 58 | unsigned int tmp; |
59 | do { | 59 | do { |
60 | tmp = cs_readl(cs5535au, ACC_CODEC_CNTL); | 60 | tmp = cs_readl(cs5535au, ACC_CODEC_CNTL); |
61 | if (!(tmp & CMD_NEW)) | 61 | if (!(tmp & CMD_NEW)) |
@@ -69,11 +69,11 @@ static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout) | |||
69 | static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au, | 69 | static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au, |
70 | unsigned short reg) | 70 | unsigned short reg) |
71 | { | 71 | { |
72 | unsigned long regdata; | 72 | unsigned int regdata; |
73 | unsigned long timeout; | 73 | int timeout; |
74 | unsigned long val; | 74 | unsigned int val; |
75 | 75 | ||
76 | regdata = ((unsigned long) reg) << 24; | 76 | regdata = ((unsigned int) reg) << 24; |
77 | regdata |= ACC_CODEC_CNTL_RD_CMD; | 77 | regdata |= ACC_CODEC_CNTL_RD_CMD; |
78 | regdata |= CMD_NEW; | 78 | regdata |= CMD_NEW; |
79 | 79 | ||
@@ -83,24 +83,23 @@ static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au, | |||
83 | timeout = 50; | 83 | timeout = 50; |
84 | do { | 84 | do { |
85 | val = cs_readl(cs5535au, ACC_CODEC_STATUS); | 85 | val = cs_readl(cs5535au, ACC_CODEC_STATUS); |
86 | if ( (val & STS_NEW) && | 86 | if ((val & STS_NEW) && reg == (val >> 24)) |
87 | ((unsigned long) reg == ((0xFF000000 & val)>>24)) ) | ||
88 | break; | 87 | break; |
89 | msleep(10); | 88 | msleep(10); |
90 | } while (--timeout); | 89 | } while (--timeout); |
91 | if (!timeout) | 90 | if (!timeout) |
92 | snd_printk(KERN_ERR "Failure reading cs5535 codec\n"); | 91 | snd_printk(KERN_ERR "Failure reading cs5535 codec\n"); |
93 | 92 | ||
94 | return ((unsigned short) val); | 93 | return (unsigned short) val; |
95 | } | 94 | } |
96 | 95 | ||
97 | static void snd_cs5535audio_codec_write(cs5535audio_t *cs5535au, | 96 | static void snd_cs5535audio_codec_write(cs5535audio_t *cs5535au, |
98 | unsigned short reg, unsigned short val) | 97 | unsigned short reg, unsigned short val) |
99 | { | 98 | { |
100 | unsigned long regdata; | 99 | unsigned int regdata; |
101 | 100 | ||
102 | regdata = ((unsigned long) reg) << 24; | 101 | regdata = ((unsigned int) reg) << 24; |
103 | regdata |= (unsigned long) val; | 102 | regdata |= val; |
104 | regdata &= CMD_MASK; | 103 | regdata &= CMD_MASK; |
105 | regdata |= CMD_NEW; | 104 | regdata |= CMD_NEW; |
106 | regdata &= ACC_CODEC_CNTL_WR_CMD; | 105 | regdata &= ACC_CODEC_CNTL_WR_CMD; |
@@ -123,12 +122,6 @@ static unsigned short snd_cs5535audio_ac97_codec_read(ac97_t *ac97, | |||
123 | return snd_cs5535audio_codec_read(cs5535au, reg); | 122 | return snd_cs5535audio_codec_read(cs5535au, reg); |
124 | } | 123 | } |
125 | 124 | ||
126 | static void snd_cs5535audio_mixer_free_ac97(ac97_t *ac97) | ||
127 | { | ||
128 | cs5535audio_t *cs5535audio = ac97->private_data; | ||
129 | cs5535audio->ac97 = NULL; | ||
130 | } | ||
131 | |||
132 | static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au) | 125 | static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au) |
133 | { | 126 | { |
134 | snd_card_t *card = cs5535au->card; | 127 | snd_card_t *card = cs5535au->card; |
@@ -147,10 +140,9 @@ static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au) | |||
147 | ac97.scaps = AC97_SCAP_AUDIO|AC97_SCAP_SKIP_MODEM; | 140 | ac97.scaps = AC97_SCAP_AUDIO|AC97_SCAP_SKIP_MODEM; |
148 | ac97.private_data = cs5535au; | 141 | ac97.private_data = cs5535au; |
149 | ac97.pci = cs5535au->pci; | 142 | ac97.pci = cs5535au->pci; |
150 | ac97.private_free = snd_cs5535audio_mixer_free_ac97; | ||
151 | 143 | ||
152 | if ((err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97)) < 0) { | 144 | if ((err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97)) < 0) { |
153 | snd_printk("mixer failed\n"); | 145 | snd_printk(KERN_ERR "mixer failed\n"); |
154 | return err; | 146 | return err; |
155 | } | 147 | } |
156 | 148 | ||
@@ -201,8 +193,8 @@ static irqreturn_t snd_cs5535audio_interrupt(int irq, void *dev_id, | |||
201 | 193 | ||
202 | if (!acc_irq_stat) | 194 | if (!acc_irq_stat) |
203 | return IRQ_NONE; | 195 | return IRQ_NONE; |
204 | for (count=0; count < 10; count++) { | 196 | for (count = 0; count < 10; count++) { |
205 | if (acc_irq_stat & (1<<count)) { | 197 | if (acc_irq_stat & (1 << count)) { |
206 | switch (count) { | 198 | switch (count) { |
207 | case IRQ_STS: | 199 | case IRQ_STS: |
208 | cs_readl(cs5535au, ACC_GPIO_STATUS); | 200 | cs_readl(cs5535au, ACC_GPIO_STATUS); |
diff --git a/sound/pci/cs5535audio/cs5535audio.h b/sound/pci/cs5535audio/cs5535audio.h index e28177fb0991..774185e026d4 100644 --- a/sound/pci/cs5535audio/cs5535audio.h +++ b/sound/pci/cs5535audio/cs5535audio.h | |||
@@ -1,11 +1,11 @@ | |||
1 | #ifndef __SOUND_CS5535AUDIO_H | 1 | #ifndef __SOUND_CS5535AUDIO_H |
2 | #define __SOUND_CS5535AUDIO_H | 2 | #define __SOUND_CS5535AUDIO_H |
3 | 3 | ||
4 | #define cs_writel(cs5535au, reg, val) outl(val, (int) cs5535au->port + reg) | 4 | #define cs_writel(cs5535au, reg, val) outl(val, (cs5535au)->port + reg) |
5 | #define cs_writeb(cs5535au, reg, val) outb(val, (int) cs5535au->port + reg) | 5 | #define cs_writeb(cs5535au, reg, val) outb(val, (cs5535au)->port + reg) |
6 | #define cs_readl(cs5535au, reg) inl((unsigned short) (cs5535au->port + reg)) | 6 | #define cs_readl(cs5535au, reg) inl((cs5535au)->port + reg) |
7 | #define cs_readw(cs5535au, reg) inw((unsigned short) (cs5535au->port + reg)) | 7 | #define cs_readw(cs5535au, reg) inw((cs5535au)->port + reg) |
8 | #define cs_readb(cs5535au, reg) inb((unsigned short) (cs5535au->port + reg)) | 8 | #define cs_readb(cs5535au, reg) inb((cs5535au)->port + reg) |
9 | 9 | ||
10 | #define CS5535AUDIO_MAX_DESCRIPTORS 128 | 10 | #define CS5535AUDIO_MAX_DESCRIPTORS 128 |
11 | 11 | ||
diff --git a/sound/pci/cs5535audio/cs5535audio_pcm.c b/sound/pci/cs5535audio/cs5535audio_pcm.c index 5802ed9d57be..d32b23f202cd 100644 --- a/sound/pci/cs5535audio/cs5535audio_pcm.c +++ b/sound/pci/cs5535audio/cs5535audio_pcm.c | |||
@@ -150,8 +150,8 @@ static int cs5535audio_build_dma_packets(cs5535audio_t *cs5535au, | |||
150 | cs5535audio_dma_desc_t *desc = | 150 | cs5535audio_dma_desc_t *desc = |
151 | &((cs5535audio_dma_desc_t *) dma->desc_buf.area)[i]; | 151 | &((cs5535audio_dma_desc_t *) dma->desc_buf.area)[i]; |
152 | desc->addr = cpu_to_le32(addr); | 152 | desc->addr = cpu_to_le32(addr); |
153 | desc->size = period_bytes; | 153 | desc->size = cpu_to_le32(period_bytes); |
154 | desc->ctlreserved = PRD_EOP; | 154 | desc->ctlreserved = cpu_to_le32(PRD_EOP); |
155 | desc_addr += sizeof(cs5535audio_dma_desc_t); | 155 | desc_addr += sizeof(cs5535audio_dma_desc_t); |
156 | addr += period_bytes; | 156 | addr += period_bytes; |
157 | } | 157 | } |
@@ -159,7 +159,7 @@ static int cs5535audio_build_dma_packets(cs5535audio_t *cs5535au, | |||
159 | lastdesc = &((cs5535audio_dma_desc_t *) dma->desc_buf.area)[periods]; | 159 | lastdesc = &((cs5535audio_dma_desc_t *) dma->desc_buf.area)[periods]; |
160 | lastdesc->addr = cpu_to_le32((u32) dma->desc_buf.addr); | 160 | lastdesc->addr = cpu_to_le32((u32) dma->desc_buf.addr); |
161 | lastdesc->size = 0; | 161 | lastdesc->size = 0; |
162 | lastdesc->ctlreserved = PRD_JMP; | 162 | lastdesc->ctlreserved = cpu_to_le32(PRD_JMP); |
163 | jmpprd_addr = cpu_to_le32(lastdesc->addr + | 163 | jmpprd_addr = cpu_to_le32(lastdesc->addr + |
164 | (sizeof(cs5535audio_dma_desc_t)*periods)); | 164 | (sizeof(cs5535audio_dma_desc_t)*periods)); |
165 | 165 | ||
@@ -272,34 +272,29 @@ static int snd_cs5535audio_trigger(snd_pcm_substream_t *substream, int cmd) | |||
272 | { | 272 | { |
273 | cs5535audio_t *cs5535au = snd_pcm_substream_chip(substream); | 273 | cs5535audio_t *cs5535au = snd_pcm_substream_chip(substream); |
274 | cs5535audio_dma_t *dma = substream->runtime->private_data; | 274 | cs5535audio_dma_t *dma = substream->runtime->private_data; |
275 | int err = 0; | ||
275 | 276 | ||
277 | spin_lock(&cs5535au->reg_lock); | ||
276 | switch (cmd) { | 278 | switch (cmd) { |
277 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 279 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
278 | spin_lock_irq(&cs5535au->reg_lock); | 280 | dma->ops->pause_dma(cs5535au); |
279 | dma->ops->pause_dma(cs5535au); | 281 | break; |
280 | spin_unlock_irq(&cs5535au->reg_lock); | 282 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
281 | break; | 283 | dma->ops->enable_dma(cs5535au); |
282 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 284 | break; |
283 | spin_lock_irq(&cs5535au->reg_lock); | 285 | case SNDRV_PCM_TRIGGER_START: |
284 | dma->ops->enable_dma(cs5535au); | 286 | dma->ops->enable_dma(cs5535au); |
285 | spin_unlock_irq(&cs5535au->reg_lock); | 287 | break; |
286 | break; | 288 | case SNDRV_PCM_TRIGGER_STOP: |
287 | case SNDRV_PCM_TRIGGER_START: | 289 | dma->ops->disable_dma(cs5535au); |
288 | spin_lock_irq(&cs5535au->reg_lock); | 290 | break; |
289 | dma->ops->enable_dma(cs5535au); | 291 | default: |
290 | spin_unlock_irq(&cs5535au->reg_lock); | 292 | snd_printk(KERN_ERR "unhandled trigger\n"); |
291 | break; | 293 | err = -EINVAL; |
292 | case SNDRV_PCM_TRIGGER_STOP: | 294 | break; |
293 | spin_lock_irq(&cs5535au->reg_lock); | ||
294 | dma->ops->disable_dma(cs5535au); | ||
295 | spin_unlock_irq(&cs5535au->reg_lock); | ||
296 | break; | ||
297 | default: | ||
298 | snd_printk(KERN_ERR "unhandled trigger\n"); | ||
299 | return -EINVAL; | ||
300 | break; | ||
301 | } | 295 | } |
302 | return 0; | 296 | spin_unlock(&cs5535au->reg_lock); |
297 | return err; | ||
303 | } | 298 | } |
304 | 299 | ||
305 | static snd_pcm_uframes_t snd_cs5535audio_pcm_pointer(snd_pcm_substream_t | 300 | static snd_pcm_uframes_t snd_cs5535audio_pcm_pointer(snd_pcm_substream_t |
@@ -375,11 +370,6 @@ static snd_pcm_ops_t snd_cs5535audio_capture_ops = { | |||
375 | .pointer = snd_cs5535audio_pcm_pointer, | 370 | .pointer = snd_cs5535audio_pcm_pointer, |
376 | }; | 371 | }; |
377 | 372 | ||
378 | static void snd_cs5535audio_pcm_free(snd_pcm_t *pcm) | ||
379 | { | ||
380 | snd_pcm_lib_preallocate_free_for_all(pcm); | ||
381 | } | ||
382 | |||
383 | static cs5535audio_dma_ops_t snd_cs5535audio_playback_dma_ops = { | 373 | static cs5535audio_dma_ops_t snd_cs5535audio_playback_dma_ops = { |
384 | .type = CS5535AUDIO_DMA_PLAYBACK, | 374 | .type = CS5535AUDIO_DMA_PLAYBACK, |
385 | .enable_dma = cs5535audio_playback_enable_dma, | 375 | .enable_dma = cs5535audio_playback_enable_dma, |
@@ -417,7 +407,6 @@ int __devinit snd_cs5535audio_pcm(cs5535audio_t *cs5535au) | |||
417 | &snd_cs5535audio_capture_ops); | 407 | &snd_cs5535audio_capture_ops); |
418 | 408 | ||
419 | pcm->private_data = cs5535au; | 409 | pcm->private_data = cs5535au; |
420 | pcm->private_free = snd_cs5535audio_pcm_free; | ||
421 | pcm->info_flags = 0; | 410 | pcm->info_flags = 0; |
422 | strcpy(pcm->name, "CS5535 Audio"); | 411 | strcpy(pcm->name, "CS5535 Audio"); |
423 | 412 | ||