ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / sound / pci / emu10k1 / emupcm.c
1 /*
2  *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
3  *                   Creative Labs, Inc.
4  *  Routines for control of EMU10K1 chips / PCM routines
5  *
6  *  BUGS:
7  *    --
8  *
9  *  TODO:
10  *    --
11  *
12  *   This program is free software; you can redistribute it and/or modify
13  *   it under the terms of the GNU General Public License as published by
14  *   the Free Software Foundation; either version 2 of the License, or
15  *   (at your option) any later version.
16  *
17  *   This program is distributed in the hope that it will be useful,
18  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *   GNU General Public License for more details.
21  *
22  *   You should have received a copy of the GNU General Public License
23  *   along with this program; if not, write to the Free Software
24  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
25  *
26  */
27
28 #include <sound/driver.h>
29 #include <linux/pci.h>
30 #include <linux/delay.h>
31 #include <linux/slab.h>
32 #include <linux/time.h>
33 #include <linux/init.h>
34 #include <sound/core.h>
35 #include <sound/emu10k1.h>
36
37 #define chip_t emu10k1_t
38
39 static void snd_emu10k1_pcm_interrupt(emu10k1_t *emu, emu10k1_voice_t *voice)
40 {
41         emu10k1_pcm_t *epcm;
42
43         if ((epcm = voice->epcm) == NULL)
44                 return;
45         if (epcm->substream == NULL)
46                 return;
47 #if 0
48         printk("IRQ: position = 0x%x, period = 0x%x, size = 0x%x\n",
49                         epcm->substream->runtime->hw->pointer(emu, epcm->substream),
50                         snd_pcm_lib_period_bytes(epcm->substream),
51                         snd_pcm_lib_buffer_bytes(epcm->substream));
52 #endif
53         snd_pcm_period_elapsed(epcm->substream);
54 }
55
56 static void snd_emu10k1_pcm_ac97adc_interrupt(emu10k1_t *emu, unsigned int status)
57 {
58 #if 0
59         if (status & IPR_ADCBUFHALFFULL) {
60                 if (emu->pcm_capture_substream->runtime->mode == SNDRV_PCM_MODE_FRAME)
61                         return;
62         }
63 #endif
64         snd_pcm_period_elapsed(emu->pcm_capture_substream);
65 }
66
67 static void snd_emu10k1_pcm_ac97mic_interrupt(emu10k1_t *emu, unsigned int status)
68 {
69 #if 0
70         if (status & IPR_MICBUFHALFFULL) {
71                 if (emu->pcm_capture_mic_substream->runtime->mode == SNDRV_PCM_MODE_FRAME)
72                         return;
73         }
74 #endif
75         snd_pcm_period_elapsed(emu->pcm_capture_mic_substream);
76 }
77
78 static void snd_emu10k1_pcm_efx_interrupt(emu10k1_t *emu, unsigned int status)
79 {
80 #if 0
81         if (status & IPR_EFXBUFHALFFULL) {
82                 if (emu->pcm_capture_efx_substream->runtime->mode == SNDRV_PCM_MODE_FRAME)
83                         return;
84         }
85 #endif
86         snd_pcm_period_elapsed(emu->pcm_capture_efx_substream);
87 }
88
89 static int snd_emu10k1_pcm_channel_alloc(emu10k1_pcm_t * epcm, int voices)
90 {
91         int err;
92
93         if (epcm->voices[1] != NULL && voices < 2) {
94                 snd_emu10k1_voice_free(epcm->emu, epcm->voices[1]);
95                 epcm->voices[1] = NULL;
96         }
97         if (voices == 1 && epcm->voices[0] != NULL)
98                 return 0;               /* already allocated */
99         if (voices == 2 && epcm->voices[0] != NULL && epcm->voices[1] != NULL)
100                 return 0;
101         if (voices > 1) {
102                 if (epcm->voices[0] != NULL && epcm->voices[1] == NULL) {
103                         snd_emu10k1_voice_free(epcm->emu, epcm->voices[0]);
104                         epcm->voices[0] = NULL;
105                 }
106         }
107         err = snd_emu10k1_voice_alloc(epcm->emu, EMU10K1_PCM, voices > 1, &epcm->voices[0]);
108         if (err < 0)
109                 return err;
110         epcm->voices[0]->epcm = epcm;
111         if (voices > 1) {
112                 epcm->voices[1] = &epcm->emu->voices[epcm->voices[0]->number + 1];
113                 epcm->voices[1]->epcm = epcm;
114         }
115         if (epcm->extra == NULL) {
116                 err = snd_emu10k1_voice_alloc(epcm->emu, EMU10K1_PCM, 0, &epcm->extra);
117                 if (err < 0) {
118                         // printk("pcm_channel_alloc: failed extra: voices=%d, frame=%d\n", voices, frame);
119                         snd_emu10k1_voice_free(epcm->emu, epcm->voices[0]);
120                         epcm->voices[0] = NULL;
121                         if (epcm->voices[1])
122                                 snd_emu10k1_voice_free(epcm->emu, epcm->voices[1]);
123                         epcm->voices[1] = NULL;
124                         return err;
125                 }
126                 epcm->extra->epcm = epcm;
127                 epcm->extra->interrupt = snd_emu10k1_pcm_interrupt;
128         }
129         return 0;
130 }
131
132 static unsigned int capture_period_sizes[31] = {
133         384,    448,    512,    640,
134         384*2,  448*2,  512*2,  640*2,
135         384*4,  448*4,  512*4,  640*4,
136         384*8,  448*8,  512*8,  640*8,
137         384*16, 448*16, 512*16, 640*16,
138         384*32, 448*32, 512*32, 640*32,
139         384*64, 448*64, 512*64, 640*64,
140         384*128,448*128,512*128
141 };
142
143 static snd_pcm_hw_constraint_list_t hw_constraints_capture_period_sizes = {
144         .count = 31,
145         .list = capture_period_sizes,
146         .mask = 0
147 };
148
149 static unsigned int capture_rates[8] = {
150         8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000
151 };
152
153 static snd_pcm_hw_constraint_list_t hw_constraints_capture_rates = {
154         .count = 8,
155         .list = capture_rates,
156         .mask = 0
157 };
158
159 static unsigned int snd_emu10k1_capture_rate_reg(unsigned int rate)
160 {
161         switch (rate) {
162         case 8000:      return ADCCR_SAMPLERATE_8;
163         case 11025:     return ADCCR_SAMPLERATE_11;
164         case 16000:     return ADCCR_SAMPLERATE_16;
165         case 22050:     return ADCCR_SAMPLERATE_22;
166         case 24000:     return ADCCR_SAMPLERATE_24;
167         case 32000:     return ADCCR_SAMPLERATE_32;
168         case 44100:     return ADCCR_SAMPLERATE_44;
169         case 48000:     return ADCCR_SAMPLERATE_48;
170         default:
171                         snd_BUG();
172                         return ADCCR_SAMPLERATE_8;
173         }
174 }
175
176 static unsigned int snd_emu10k1_audigy_capture_rate_reg(unsigned int rate)
177 {
178         switch (rate) {
179         case 8000:      return A_ADCCR_SAMPLERATE_8;
180         case 11025:     return A_ADCCR_SAMPLERATE_11;
181         case 12000:     return A_ADCCR_SAMPLERATE_12; /* really supported? */
182         case 16000:     return ADCCR_SAMPLERATE_16;
183         case 22050:     return ADCCR_SAMPLERATE_22;
184         case 24000:     return ADCCR_SAMPLERATE_24;
185         case 32000:     return ADCCR_SAMPLERATE_32;
186         case 44100:     return ADCCR_SAMPLERATE_44;
187         case 48000:     return ADCCR_SAMPLERATE_48;
188         default:
189                         snd_BUG();
190                         return A_ADCCR_SAMPLERATE_8;
191         }
192 }
193
194 static unsigned int emu10k1_calc_pitch_target(unsigned int rate)
195 {
196         unsigned int pitch_target;
197
198         pitch_target = (rate << 8) / 375;
199         pitch_target = (pitch_target >> 1) + (pitch_target & 1);
200         return pitch_target;
201 }
202
203 #define PITCH_48000 0x00004000
204 #define PITCH_96000 0x00008000
205 #define PITCH_85000 0x00007155
206 #define PITCH_80726 0x00006ba2
207 #define PITCH_67882 0x00005a82
208 #define PITCH_57081 0x00004c1c
209
210 static unsigned int emu10k1_select_interprom(unsigned int pitch_target)
211 {
212         if (pitch_target == PITCH_48000)
213                 return CCCA_INTERPROM_0;
214         else if (pitch_target < PITCH_48000)
215                 return CCCA_INTERPROM_1;
216         else if (pitch_target >= PITCH_96000)
217                 return CCCA_INTERPROM_0;
218         else if (pitch_target >= PITCH_85000)
219                 return CCCA_INTERPROM_6;
220         else if (pitch_target >= PITCH_80726)
221                 return CCCA_INTERPROM_5;
222         else if (pitch_target >= PITCH_67882)
223                 return CCCA_INTERPROM_4;
224         else if (pitch_target >= PITCH_57081)
225                 return CCCA_INTERPROM_3;
226         else  
227                 return CCCA_INTERPROM_2;
228 }
229
230
231 static void snd_emu10k1_pcm_init_voice(emu10k1_t *emu,
232                                        int master, int extra,
233                                        emu10k1_voice_t *evoice,
234                                        unsigned int start_addr,
235                                        unsigned int end_addr)
236 {
237         snd_pcm_substream_t *substream = evoice->epcm->substream;
238         snd_pcm_runtime_t *runtime = substream->runtime;
239         emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[substream->number];
240         unsigned int silent_page, tmp;
241         int voice, stereo, w_16;
242         unsigned char attn, send_amount[8];
243         unsigned char send_routing[8];
244         unsigned long flags;
245         unsigned int pitch_target;
246
247         voice = evoice->number;
248         stereo = runtime->channels == 2;
249         w_16 = snd_pcm_format_width(runtime->format) == 16;
250
251         if (!extra && stereo) {
252                 start_addr >>= 1;
253                 end_addr >>= 1;
254         }
255         if (w_16) {
256                 start_addr >>= 1;
257                 end_addr >>= 1;
258         }
259
260         spin_lock_irqsave(&emu->reg_lock, flags);
261
262         /* volume parameters */
263         if (extra) {
264                 attn = 0;
265                 memset(send_routing, 0, sizeof(send_routing));
266                 send_routing[0] = 0;
267                 send_routing[1] = 1;
268                 send_routing[2] = 2;
269                 send_routing[3] = 3;
270                 memset(send_amount, 0, sizeof(send_amount));
271         } else {
272                 tmp = stereo ? (master ? 1 : 2) : 0;
273                 memcpy(send_routing, &mix->send_routing[tmp][0], 8);
274                 memcpy(send_amount, &mix->send_volume[tmp][0], 8);
275         }
276
277         if (master) {
278                 unsigned int ccis = stereo ? 28 : 30;
279                 if (w_16)
280                         ccis *= 2;
281                 evoice->epcm->ccca_start_addr = start_addr + ccis;
282                 if (extra) {
283                         start_addr += ccis;
284                         end_addr += ccis;
285                 }
286                 if (stereo && !extra) {
287                         snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK);
288                         snd_emu10k1_ptr_write(emu, CPF, (voice + 1), CPF_STEREO_MASK);
289                 } else {
290                         snd_emu10k1_ptr_write(emu, CPF, voice, 0);
291                 }
292         }
293
294         // setup routing
295         if (emu->audigy) {
296                 snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
297                                       ((unsigned int)send_routing[3] << 24) |
298                                       ((unsigned int)send_routing[2] << 16) |
299                                       ((unsigned int)send_routing[1] << 8) |
300                                       (unsigned int)send_routing[0]);
301                 snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
302                                       ((unsigned int)send_routing[7] << 24) |
303                                       ((unsigned int)send_routing[6] << 16) |
304                                       ((unsigned int)send_routing[5] << 8) |
305                                       (unsigned int)send_routing[4]);
306                 snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice,
307                                       ((unsigned int)send_amount[4] << 24) |
308                                       ((unsigned int)send_amount[5] << 16) |
309                                       ((unsigned int)send_amount[6] << 8) |
310                                       (unsigned int)send_amount[7]);
311         } else
312                 snd_emu10k1_ptr_write(emu, FXRT, voice,
313                                       snd_emu10k1_compose_send_routing(send_routing));
314         // Stop CA
315         // Assumption that PT is already 0 so no harm overwriting
316         snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
317         snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
318         snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
319         pitch_target = emu10k1_calc_pitch_target(runtime->rate);
320         snd_emu10k1_ptr_write(emu, CCCA, voice, evoice->epcm->ccca_start_addr |
321                               emu10k1_select_interprom(pitch_target) |
322                               (w_16 ? 0 : CCCA_8BITSELECT));
323         // Clear filter delay memory
324         snd_emu10k1_ptr_write(emu, Z1, voice, 0);
325         snd_emu10k1_ptr_write(emu, Z2, voice, 0);
326         // invalidate maps
327         silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK;
328         snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
329         snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
330         // modulation envelope
331         snd_emu10k1_ptr_write(emu, CVCF, voice, 0xffff);
332         snd_emu10k1_ptr_write(emu, VTFT, voice, 0xffff);
333         snd_emu10k1_ptr_write(emu, ATKHLDM, voice, 0);
334         snd_emu10k1_ptr_write(emu, DCYSUSM, voice, 0x007f);
335         snd_emu10k1_ptr_write(emu, LFOVAL1, voice, 0x8000);
336         snd_emu10k1_ptr_write(emu, LFOVAL2, voice, 0x8000);
337         snd_emu10k1_ptr_write(emu, FMMOD, voice, 0);
338         snd_emu10k1_ptr_write(emu, TREMFRQ, voice, 0);
339         snd_emu10k1_ptr_write(emu, FM2FRQ2, voice, 0);
340         snd_emu10k1_ptr_write(emu, ENVVAL, voice, 0x8000);
341         // volume envelope
342         snd_emu10k1_ptr_write(emu, ATKHLDV, voice, 0x7f7f);
343         snd_emu10k1_ptr_write(emu, ENVVOL, voice, 0x0000);
344         // filter envelope
345         snd_emu10k1_ptr_write(emu, PEFE_FILTERAMOUNT, voice, 0x7f);
346         // pitch envelope
347         snd_emu10k1_ptr_write(emu, PEFE_PITCHAMOUNT, voice, 0);
348
349         spin_unlock_irqrestore(&emu->reg_lock, flags);
350 }
351
352 static int snd_emu10k1_playback_hw_params(snd_pcm_substream_t * substream,
353                                           snd_pcm_hw_params_t * hw_params)
354 {
355         emu10k1_t *emu = snd_pcm_substream_chip(substream);
356         snd_pcm_runtime_t *runtime = substream->runtime;
357         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
358         int err;
359
360         if ((err = snd_emu10k1_pcm_channel_alloc(epcm, params_channels(hw_params))) < 0)
361                 return err;
362         if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0)
363                 return err;
364         if (err > 0) {  /* change */
365                 snd_util_memblk_t *memblk;
366                 if (epcm->memblk != NULL)
367                         snd_emu10k1_free_pages(emu, epcm->memblk);
368                 memblk = snd_emu10k1_alloc_pages(emu, substream);
369                 if ((epcm->memblk = memblk) == NULL || ((emu10k1_memblk_t *)memblk)->mapped_page < 0) {
370                         epcm->start_addr = 0;
371                         return -ENOMEM;
372                 }
373                 epcm->start_addr = ((emu10k1_memblk_t *)memblk)->mapped_page << PAGE_SHIFT;
374         }
375         return 0;
376 }
377
378 static int snd_emu10k1_playback_hw_free(snd_pcm_substream_t * substream)
379 {
380         emu10k1_t *emu = snd_pcm_substream_chip(substream);
381         snd_pcm_runtime_t *runtime = substream->runtime;
382         emu10k1_pcm_t *epcm;
383
384         if (runtime->private_data == NULL)
385                 return 0;
386         epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
387         if (epcm->extra) {
388                 snd_emu10k1_voice_free(epcm->emu, epcm->extra);
389                 epcm->extra = NULL;
390         }
391         if (epcm->voices[1]) {
392                 snd_emu10k1_voice_free(epcm->emu, epcm->voices[1]);
393                 epcm->voices[1] = NULL;
394         }
395         if (epcm->voices[0]) {
396                 snd_emu10k1_voice_free(epcm->emu, epcm->voices[0]);
397                 epcm->voices[0] = NULL;
398         }
399         if (epcm->memblk) {
400                 snd_emu10k1_free_pages(emu, epcm->memblk);
401                 epcm->memblk = NULL;
402                 epcm->start_addr = 0;
403         }
404         snd_pcm_lib_free_pages(substream);
405         return 0;
406 }
407
408 static int snd_emu10k1_playback_prepare(snd_pcm_substream_t * substream)
409 {
410         emu10k1_t *emu = snd_pcm_substream_chip(substream);
411         snd_pcm_runtime_t *runtime = substream->runtime;
412         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
413         unsigned int start_addr, end_addr;
414
415         start_addr = epcm->start_addr;
416         end_addr = snd_pcm_lib_period_bytes(substream);
417         if (runtime->channels == 2)
418                 end_addr >>= 1;
419         end_addr += start_addr;
420         snd_emu10k1_pcm_init_voice(emu, 1, 1, epcm->extra,
421                                    start_addr, end_addr);
422         end_addr = epcm->start_addr + snd_pcm_lib_buffer_bytes(substream);
423         snd_emu10k1_pcm_init_voice(emu, 1, 0, epcm->voices[0],
424                                    start_addr, end_addr);
425         if (epcm->voices[1])
426                 snd_emu10k1_pcm_init_voice(emu, 0, 0, epcm->voices[1],
427                                            start_addr, end_addr);
428         return 0;
429 }
430
431 static int snd_emu10k1_capture_hw_params(snd_pcm_substream_t * substream,
432                                          snd_pcm_hw_params_t * hw_params)
433 {
434         return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
435 }
436
437 static int snd_emu10k1_capture_hw_free(snd_pcm_substream_t * substream)
438 {
439         return snd_pcm_lib_free_pages(substream);
440 }
441
442 static int snd_emu10k1_capture_prepare(snd_pcm_substream_t * substream)
443 {
444         emu10k1_t *emu = snd_pcm_substream_chip(substream);
445         snd_pcm_runtime_t *runtime = substream->runtime;
446         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
447         int idx;
448
449         snd_emu10k1_ptr_write(emu, epcm->capture_bs_reg, 0, 0);
450         switch (epcm->type) {
451         case CAPTURE_AC97ADC:
452                 snd_emu10k1_ptr_write(emu, ADCCR, 0, 0);
453                 break;
454         case CAPTURE_EFX:
455                 snd_emu10k1_ptr_write(emu, FXWC, 0, 0);
456                 break;
457         default:
458                 break;
459         }       
460         snd_emu10k1_ptr_write(emu, epcm->capture_ba_reg, 0, runtime->dma_addr);
461         epcm->capture_bufsize = snd_pcm_lib_buffer_bytes(substream);
462         epcm->capture_bs_val = 0;
463         for (idx = 0; idx < 31; idx++) {
464                 if (capture_period_sizes[idx] == epcm->capture_bufsize) {
465                         epcm->capture_bs_val = idx + 1;
466                         break;
467                 }
468         }
469         if (epcm->capture_bs_val == 0) {
470                 snd_BUG();
471                 epcm->capture_bs_val++;
472         }
473         if (epcm->type == CAPTURE_AC97ADC) {
474                 epcm->capture_cr_val = emu->audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE;
475                 if (runtime->channels > 1)
476                         epcm->capture_cr_val |= emu->audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE;
477                 epcm->capture_cr_val |= emu->audigy ?
478                         snd_emu10k1_audigy_capture_rate_reg(runtime->rate) :
479                         snd_emu10k1_capture_rate_reg(runtime->rate);
480         }
481         return 0;
482 }
483
484 static void snd_emu10k1_playback_invalidate_cache(emu10k1_t *emu, emu10k1_voice_t *evoice)
485 {
486         snd_pcm_runtime_t *runtime;
487         unsigned int voice, i, ccis, cra = 64, cs, sample;
488
489         if (evoice == NULL)
490                 return;
491         runtime = evoice->epcm->substream->runtime;
492         voice = evoice->number;
493         sample = snd_pcm_format_width(runtime->format) == 16 ? 0 : 0x80808080;
494         if (runtime->channels > 1) {
495                 ccis = 28;
496                 cs = 4;
497         } else {
498                 ccis = 30;
499                 cs = 2;
500         }
501         if (sample == 0)        /* 16-bit */
502                 ccis *= 2;
503         for (i = 0; i < cs; i++)
504                 snd_emu10k1_ptr_write(emu, CD0 + i, voice, sample);
505         // reset cache
506         snd_emu10k1_ptr_write(emu, CCR_CACHEINVALIDSIZE, voice, 0);
507         snd_emu10k1_ptr_write(emu, CCR_READADDRESS, voice, cra);
508         if (runtime->channels > 1) {
509                 snd_emu10k1_ptr_write(emu, CCR_CACHEINVALIDSIZE, voice + 1, 0);
510                 snd_emu10k1_ptr_write(emu, CCR_READADDRESS, voice + 1, cra);
511         }
512         // fill cache
513         snd_emu10k1_ptr_write(emu, CCR_CACHEINVALIDSIZE, voice, ccis);
514 }
515
516 static void snd_emu10k1_playback_trigger_voice(emu10k1_t *emu, emu10k1_voice_t *evoice, int master, int extra)
517 {
518         snd_pcm_substream_t *substream;
519         snd_pcm_runtime_t *runtime;
520         emu10k1_pcm_mixer_t *mix;
521         unsigned int voice, pitch, pitch_target, tmp;
522         unsigned int attn;
523
524         if (evoice == NULL)     /* skip second voice for mono */
525                 return;
526         substream = evoice->epcm->substream;
527         runtime = substream->runtime;
528         mix = &emu->pcm_mixer[substream->number];
529         voice = evoice->number;
530         pitch = snd_emu10k1_rate_to_pitch(runtime->rate) >> 8;
531         pitch_target = emu10k1_calc_pitch_target(runtime->rate);
532         attn = extra ? 0 : 0x00ff;
533         tmp = runtime->channels == 2 ? (master ? 1 : 2) : 0;
534         snd_emu10k1_ptr_write(emu, IFATN, voice, attn);
535         snd_emu10k1_ptr_write(emu, VTFT, voice, (mix->attn[tmp] << 16) | 0xffff);
536         snd_emu10k1_ptr_write(emu, CVCF, voice, (mix->attn[tmp] << 16) | 0xffff);
537         snd_emu10k1_voice_clear_loop_stop(emu, voice);          
538         if (extra)
539                 snd_emu10k1_voice_intr_enable(emu, voice);
540         snd_emu10k1_ptr_write(emu, DCYSUSV, voice, 0x7f7f);
541         snd_emu10k1_ptr_write(emu, PTRX_PITCHTARGET, voice, pitch_target);
542         if (master)
543                 snd_emu10k1_ptr_write(emu, CPF_CURRENTPITCH, voice, pitch_target);
544         snd_emu10k1_ptr_write(emu, IP, voice, pitch);
545 }
546
547 static void snd_emu10k1_playback_stop_voice(emu10k1_t *emu, emu10k1_voice_t *evoice)
548 {
549         unsigned int voice;
550
551         if (evoice == NULL)
552                 return;
553         voice = evoice->number;
554         snd_emu10k1_voice_intr_disable(emu, voice);
555         snd_emu10k1_ptr_write(emu, PTRX_PITCHTARGET, voice, 0);
556         snd_emu10k1_ptr_write(emu, CPF_CURRENTPITCH, voice, 0);
557         snd_emu10k1_ptr_write(emu, IFATN, voice, 0xffff);
558         snd_emu10k1_ptr_write(emu, VTFT, voice, 0xffff);
559         snd_emu10k1_ptr_write(emu, CVCF, voice, 0xffff);
560         snd_emu10k1_ptr_write(emu, IP, voice, 0);
561 }
562
563 static int snd_emu10k1_playback_trigger(snd_pcm_substream_t * substream,
564                                         int cmd)
565 {
566         emu10k1_t *emu = snd_pcm_substream_chip(substream);
567         snd_pcm_runtime_t *runtime = substream->runtime;
568         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
569         unsigned long flags;
570         int result = 0;
571
572         // printk("trigger - emu10k1 = 0x%x, cmd = %i, pointer = %i\n", (int)emu, cmd, substream->ops->pointer(substream));
573         spin_lock_irqsave(&emu->reg_lock, flags);
574         switch (cmd) {
575         case SNDRV_PCM_TRIGGER_START:
576                 snd_emu10k1_playback_invalidate_cache(emu, epcm->extra);        /* do we need this? */
577                 snd_emu10k1_playback_invalidate_cache(emu, epcm->voices[0]);
578                 /* follow thru */
579         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
580                 snd_emu10k1_playback_trigger_voice(emu, epcm->voices[0], 1, 0);
581                 snd_emu10k1_playback_trigger_voice(emu, epcm->voices[1], 0, 0);
582                 snd_emu10k1_playback_trigger_voice(emu, epcm->extra, 1, 1);
583                 epcm->running = 1;
584                 break;
585         case SNDRV_PCM_TRIGGER_STOP:
586         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
587                 epcm->running = 0;
588                 snd_emu10k1_playback_stop_voice(emu, epcm->voices[0]);
589                 snd_emu10k1_playback_stop_voice(emu, epcm->voices[1]);
590                 snd_emu10k1_playback_stop_voice(emu, epcm->extra);
591                 break;
592         default:
593                 result = -EINVAL;
594                 break;
595         }
596         spin_unlock_irqrestore(&emu->reg_lock, flags);
597         return result;
598 }
599
600 static int snd_emu10k1_capture_trigger(snd_pcm_substream_t * substream,
601                                        int cmd)
602 {
603         emu10k1_t *emu = snd_pcm_substream_chip(substream);
604         snd_pcm_runtime_t *runtime = substream->runtime;
605         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
606         unsigned long flags;
607         int result = 0;
608
609         // printk("trigger - emu10k1 = %p, cmd = %i, pointer = %i\n", emu, cmd, substream->ops->pointer(substream));
610         spin_lock_irqsave(&emu->reg_lock, flags);
611         switch (cmd) {
612         case SNDRV_PCM_TRIGGER_START:
613                 outl(epcm->capture_ipr, emu->port + IPR);
614                 snd_emu10k1_intr_enable(emu, epcm->capture_inte);
615                 // printk("adccr = 0x%x, adcbs = 0x%x\n", epcm->adccr, epcm->adcbs);
616                 switch (epcm->type) {
617                 case CAPTURE_AC97ADC:
618                         snd_emu10k1_ptr_write(emu, ADCCR, 0, epcm->capture_cr_val);
619                         break;
620                 case CAPTURE_EFX:
621                         snd_emu10k1_ptr_write(emu, FXWC, 0, epcm->capture_cr_val);
622                         break;
623                 default:        
624                         break;
625                 }
626                 snd_emu10k1_ptr_write(emu, epcm->capture_bs_reg, 0, epcm->capture_bs_val);
627                 epcm->running = 1;
628                 epcm->first_ptr = 1;
629                 break;
630         case SNDRV_PCM_TRIGGER_STOP:
631                 epcm->running = 0;
632                 snd_emu10k1_intr_disable(emu, epcm->capture_inte);
633                 outl(epcm->capture_ipr, emu->port + IPR);
634                 snd_emu10k1_ptr_write(emu, epcm->capture_bs_reg, 0, 0);
635                 switch (epcm->type) {
636                 case CAPTURE_AC97ADC:
637                         snd_emu10k1_ptr_write(emu, ADCCR, 0, 0);
638                         break;
639                 case CAPTURE_EFX:
640                         snd_emu10k1_ptr_write(emu, FXWC, 0, 0);
641                         break;
642                 default:
643                         break;
644                 }
645                 break;
646         default:
647                 result = -EINVAL;
648         }
649         spin_unlock_irqrestore(&emu->reg_lock, flags);
650         return result;
651 }
652
653 static snd_pcm_uframes_t snd_emu10k1_playback_pointer(snd_pcm_substream_t * substream)
654 {
655         emu10k1_t *emu = snd_pcm_substream_chip(substream);
656         snd_pcm_runtime_t *runtime = substream->runtime;
657         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
658         unsigned int ptr;
659
660         if (!epcm->running)
661                 return 0;
662         ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->voices[0]->number) & 0x00ffffff;
663 #if 0   /* Perex's code */
664         ptr += runtime->buffer_size;
665         ptr -= epcm->ccca_start_addr;
666         ptr %= runtime->buffer_size;
667 #else   /* EMU10K1 Open Source code from Creative */
668         if (ptr < epcm->ccca_start_addr)
669                 ptr += runtime->buffer_size - epcm->ccca_start_addr;
670         else {
671                 ptr -= epcm->ccca_start_addr;
672                 if (ptr >= runtime->buffer_size)
673                         ptr -= runtime->buffer_size;
674         }
675 #endif
676         // printk("ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", ptr, runtime->buffer_size, runtime->period_size);
677         return ptr;
678 }
679
680 static snd_pcm_uframes_t snd_emu10k1_capture_pointer(snd_pcm_substream_t * substream)
681 {
682         emu10k1_t *emu = snd_pcm_substream_chip(substream);
683         snd_pcm_runtime_t *runtime = substream->runtime;
684         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return -ENXIO);
685         unsigned int ptr;
686
687         if (!epcm->running)
688                 return 0;
689         if (epcm->first_ptr) {
690                 udelay(50);     // hack, it takes awhile until capture is started
691                 epcm->first_ptr = 0;
692         }
693         ptr = snd_emu10k1_ptr_read(emu, epcm->capture_idx_reg, 0) & 0x0000ffff;
694         return bytes_to_frames(runtime, ptr);
695 }
696
697 /*
698  *  Playback support device description
699  */
700
701 static snd_pcm_hardware_t snd_emu10k1_playback =
702 {
703         .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
704                                  SNDRV_PCM_INFO_BLOCK_TRANSFER |
705                                  SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_PAUSE),
706         .formats =              SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
707         .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
708         .rate_min =             4000,
709         .rate_max =             48000,
710         .channels_min =         1,
711         .channels_max =         2,
712         .buffer_bytes_max =     (128*1024),
713         .period_bytes_min =     64,
714         .period_bytes_max =     (128*1024),
715         .periods_min =          1,
716         .periods_max =          1024,
717         .fifo_size =            0,
718 };
719
720 /*
721  *  Capture support device description
722  */
723
724 static snd_pcm_hardware_t snd_emu10k1_capture =
725 {
726         .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
727                                  SNDRV_PCM_INFO_BLOCK_TRANSFER |
728                                  SNDRV_PCM_INFO_MMAP_VALID),
729         .formats =              SNDRV_PCM_FMTBIT_S16_LE,
730         .rates =                SNDRV_PCM_RATE_8000_48000,
731         .rate_min =             8000,
732         .rate_max =             48000,
733         .channels_min =         1,
734         .channels_max =         2,
735         .buffer_bytes_max =     (64*1024),
736         .period_bytes_min =     384,
737         .period_bytes_max =     (64*1024),
738         .periods_min =          2,
739         .periods_max =          2,
740         .fifo_size =            0,
741 };
742
743 /*
744  *
745  */
746
747 static void snd_emu10k1_pcm_mixer_notify1(emu10k1_t *emu, snd_kcontrol_t *kctl, int idx, int activate)
748 {
749         snd_ctl_elem_id_t id;
750
751         snd_runtime_check(kctl != NULL, return);
752         if (activate)
753                 kctl->vd[idx].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
754         else
755                 kctl->vd[idx].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
756         snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
757                        SNDRV_CTL_EVENT_MASK_INFO,
758                        snd_ctl_build_ioff(&id, kctl, idx));
759 }
760
761 static void snd_emu10k1_pcm_mixer_notify(emu10k1_t *emu, int idx, int activate)
762 {
763         snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_send_routing, idx, activate);
764         snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_send_volume, idx, activate);
765         snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_attn, idx, activate);
766 }
767
768 static void snd_emu10k1_pcm_free_substream(snd_pcm_runtime_t *runtime)
769 {
770         emu10k1_pcm_t *epcm = snd_magic_cast(emu10k1_pcm_t, runtime->private_data, return);
771
772         if (epcm)
773                 snd_magic_kfree(epcm);
774 }
775
776 static int snd_emu10k1_playback_open(snd_pcm_substream_t * substream)
777 {
778         emu10k1_t *emu = snd_pcm_substream_chip(substream);
779         emu10k1_pcm_t *epcm;
780         emu10k1_pcm_mixer_t *mix;
781         snd_pcm_runtime_t *runtime = substream->runtime;
782         int i, err;
783
784         epcm = snd_magic_kcalloc(emu10k1_pcm_t, 0, GFP_KERNEL);
785         if (epcm == NULL)
786                 return -ENOMEM;
787         epcm->emu = emu;
788         epcm->type = PLAYBACK_EMUVOICE;
789         epcm->substream = substream;
790         runtime->private_data = epcm;
791         runtime->private_free = snd_emu10k1_pcm_free_substream;
792         runtime->hw = snd_emu10k1_playback;
793         if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) {
794                 snd_magic_kfree(epcm);
795                 return err;
796         }
797         if ((err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 256, UINT_MAX)) < 0) {
798                 snd_magic_kfree(epcm);
799                 return err;
800         }
801         mix = &emu->pcm_mixer[substream->number];
802         for (i = 0; i < 4; i++)
803                 mix->send_routing[0][i] = mix->send_routing[1][i] = mix->send_routing[2][i] = i;
804         memset(&mix->send_volume, 0, sizeof(mix->send_volume));
805         mix->send_volume[0][0] = mix->send_volume[0][1] =
806         mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
807         mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
808         mix->epcm = epcm;
809         snd_emu10k1_pcm_mixer_notify(emu, substream->number, 1);
810         return 0;
811 }
812
813 static int snd_emu10k1_playback_close(snd_pcm_substream_t * substream)
814 {
815         emu10k1_t *emu = snd_pcm_substream_chip(substream);
816         emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[substream->number];
817
818         mix->epcm = NULL;
819         snd_emu10k1_pcm_mixer_notify(emu, substream->number, 0);
820         return 0;
821 }
822
823 static int snd_emu10k1_capture_open(snd_pcm_substream_t * substream)
824 {
825         emu10k1_t *emu = snd_pcm_substream_chip(substream);
826         snd_pcm_runtime_t *runtime = substream->runtime;
827         emu10k1_pcm_t *epcm;
828
829         epcm = snd_magic_kcalloc(emu10k1_pcm_t, 0, GFP_KERNEL);
830         if (epcm == NULL)
831                 return -ENOMEM;
832         epcm->emu = emu;
833         epcm->type = CAPTURE_AC97ADC;
834         epcm->substream = substream;
835         epcm->capture_ipr = IPR_ADCBUFFULL|IPR_ADCBUFHALFFULL;
836         epcm->capture_inte = INTE_ADCBUFENABLE;
837         epcm->capture_ba_reg = ADCBA;
838         epcm->capture_bs_reg = ADCBS;
839         epcm->capture_idx_reg = emu->audigy ? A_ADCIDX : ADCIDX;
840         runtime->private_data = epcm;
841         runtime->private_free = snd_emu10k1_pcm_free_substream;
842         runtime->hw = snd_emu10k1_capture;
843         emu->capture_interrupt = snd_emu10k1_pcm_ac97adc_interrupt;
844         emu->pcm_capture_substream = substream;
845         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &hw_constraints_capture_period_sizes);
846         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_capture_rates);
847         return 0;
848 }
849
850 static int snd_emu10k1_capture_close(snd_pcm_substream_t * substream)
851 {
852         emu10k1_t *emu = snd_pcm_substream_chip(substream);
853
854         emu->capture_interrupt = NULL;
855         emu->pcm_capture_substream = NULL;
856         return 0;
857 }
858
859 static int snd_emu10k1_capture_mic_open(snd_pcm_substream_t * substream)
860 {
861         emu10k1_t *emu = snd_pcm_substream_chip(substream);
862         emu10k1_pcm_t *epcm;
863         snd_pcm_runtime_t *runtime = substream->runtime;
864
865         epcm = snd_magic_kcalloc(emu10k1_pcm_t, 0, GFP_KERNEL);
866         if (epcm == NULL)
867                 return -ENOMEM;
868         epcm->emu = emu;
869         epcm->type = CAPTURE_AC97MIC;
870         epcm->substream = substream;
871         epcm->capture_ipr = IPR_MICBUFFULL|IPR_MICBUFHALFFULL;
872         epcm->capture_inte = INTE_MICBUFENABLE;
873         epcm->capture_ba_reg = MICBA;
874         epcm->capture_bs_reg = MICBS;
875         epcm->capture_idx_reg = emu->audigy ? A_MICIDX : MICIDX;
876         substream->runtime->private_data = epcm;
877         substream->runtime->private_free = snd_emu10k1_pcm_free_substream;
878         runtime->hw = snd_emu10k1_capture;
879         runtime->hw.rates = SNDRV_PCM_RATE_8000;
880         runtime->hw.rate_min = runtime->hw.rate_max = 8000;
881         runtime->hw.channels_min = 1;
882         emu->capture_mic_interrupt = snd_emu10k1_pcm_ac97mic_interrupt;
883         emu->pcm_capture_mic_substream = substream;
884         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &hw_constraints_capture_period_sizes);
885         return 0;
886 }
887
888 static int snd_emu10k1_capture_mic_close(snd_pcm_substream_t * substream)
889 {
890         emu10k1_t *emu = snd_pcm_substream_chip(substream);
891
892         emu->capture_interrupt = NULL;
893         emu->pcm_capture_mic_substream = NULL;
894         return 0;
895 }
896
897 static int snd_emu10k1_capture_efx_open(snd_pcm_substream_t * substream)
898 {
899         emu10k1_t *emu = snd_pcm_substream_chip(substream);
900         emu10k1_pcm_t *epcm;
901         snd_pcm_runtime_t *runtime = substream->runtime;
902         unsigned long flags;
903         int nefx = emu->audigy ? 64 : 32;
904         int idx;
905
906         epcm = snd_magic_kcalloc(emu10k1_pcm_t, 0, GFP_KERNEL);
907         if (epcm == NULL)
908                 return -ENOMEM;
909         epcm->emu = emu;
910         epcm->type = CAPTURE_EFX;
911         epcm->substream = substream;
912         epcm->capture_ipr = IPR_EFXBUFFULL|IPR_EFXBUFHALFFULL;
913         epcm->capture_inte = INTE_EFXBUFENABLE;
914         epcm->capture_ba_reg = FXBA;
915         epcm->capture_bs_reg = FXBS;
916         epcm->capture_idx_reg = FXIDX;
917         substream->runtime->private_data = epcm;
918         substream->runtime->private_free = snd_emu10k1_pcm_free_substream;
919         runtime->hw = snd_emu10k1_capture;
920         runtime->hw.rates = SNDRV_PCM_RATE_48000;
921         runtime->hw.rate_min = runtime->hw.rate_max = 48000;
922         spin_lock_irqsave(&emu->reg_lock, flags);
923         runtime->hw.channels_min = runtime->hw.channels_max = 0;
924         for (idx = 0; idx < nefx; idx++) {
925                 if (emu->efx_voices_mask[idx/32] & (1 << (idx%32))) {
926                         runtime->hw.channels_min++;
927                         runtime->hw.channels_max++;
928                 }
929         }
930         epcm->capture_cr_val = emu->efx_voices_mask[0];
931         epcm->capture_cr_val2 = emu->efx_voices_mask[1];
932         spin_unlock_irqrestore(&emu->reg_lock, flags);
933         emu->capture_efx_interrupt = snd_emu10k1_pcm_efx_interrupt;
934         emu->pcm_capture_efx_substream = substream;
935         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &hw_constraints_capture_period_sizes);
936         return 0;
937 }
938
939 static int snd_emu10k1_capture_efx_close(snd_pcm_substream_t * substream)
940 {
941         emu10k1_t *emu = snd_pcm_substream_chip(substream);
942
943         emu->capture_interrupt = NULL;
944         emu->pcm_capture_efx_substream = NULL;
945         return 0;
946 }
947
948 static snd_pcm_ops_t snd_emu10k1_playback_ops = {
949         .open =                 snd_emu10k1_playback_open,
950         .close =                snd_emu10k1_playback_close,
951         .ioctl =                snd_pcm_lib_ioctl,
952         .hw_params =            snd_emu10k1_playback_hw_params,
953         .hw_free =              snd_emu10k1_playback_hw_free,
954         .prepare =              snd_emu10k1_playback_prepare,
955         .trigger =              snd_emu10k1_playback_trigger,
956         .pointer =              snd_emu10k1_playback_pointer,
957         .page =                 snd_pcm_sgbuf_ops_page,
958 };
959
960 static snd_pcm_ops_t snd_emu10k1_capture_ops = {
961         .open =                 snd_emu10k1_capture_open,
962         .close =                snd_emu10k1_capture_close,
963         .ioctl =                snd_pcm_lib_ioctl,
964         .hw_params =            snd_emu10k1_capture_hw_params,
965         .hw_free =              snd_emu10k1_capture_hw_free,
966         .prepare =              snd_emu10k1_capture_prepare,
967         .trigger =              snd_emu10k1_capture_trigger,
968         .pointer =              snd_emu10k1_capture_pointer,
969 };
970
971 static void snd_emu10k1_pcm_free(snd_pcm_t *pcm)
972 {
973         emu10k1_t *emu = snd_magic_cast(emu10k1_t, pcm->private_data, return);
974         emu->pcm = NULL;
975         snd_pcm_lib_preallocate_free_for_all(pcm);
976 }
977
978 int __devinit snd_emu10k1_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm)
979 {
980         snd_pcm_t *pcm;
981         snd_pcm_substream_t *substream;
982         int err;
983
984         if (rpcm)
985                 *rpcm = NULL;
986
987         if ((err = snd_pcm_new(emu->card, "emu10k1", device, 32, 1, &pcm)) < 0)
988                 return err;
989
990         pcm->private_data = emu;
991         pcm->private_free = snd_emu10k1_pcm_free;
992
993         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_emu10k1_playback_ops);
994         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_emu10k1_capture_ops);
995
996         pcm->info_flags = 0;
997         pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
998         strcpy(pcm->name, "EMU10K1");
999         emu->pcm = pcm;
1000
1001         for (substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; substream; substream = substream->next)
1002                 if ((err = snd_pcm_lib_preallocate_pages(substream, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(emu->pci), 64*1024, 64*1024)) < 0)
1003                         return err;
1004
1005         for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; substream; substream = substream->next)
1006                 snd_pcm_lib_preallocate_pages(substream, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), 64*1024, 64*1024);
1007
1008         if (rpcm)
1009                 *rpcm = pcm;
1010
1011         return 0;
1012 }
1013
1014 static snd_pcm_ops_t snd_emu10k1_capture_mic_ops = {
1015         .open =                 snd_emu10k1_capture_mic_open,
1016         .close =                snd_emu10k1_capture_mic_close,
1017         .ioctl =                snd_pcm_lib_ioctl,
1018         .hw_params =            snd_emu10k1_capture_hw_params,
1019         .hw_free =              snd_emu10k1_capture_hw_free,
1020         .prepare =              snd_emu10k1_capture_prepare,
1021         .trigger =              snd_emu10k1_capture_trigger,
1022         .pointer =              snd_emu10k1_capture_pointer,
1023 };
1024
1025 static void snd_emu10k1_pcm_mic_free(snd_pcm_t *pcm)
1026 {
1027         emu10k1_t *emu = snd_magic_cast(emu10k1_t, pcm->private_data, return);
1028         emu->pcm_mic = NULL;
1029         snd_pcm_lib_preallocate_free_for_all(pcm);
1030 }
1031
1032 int __devinit snd_emu10k1_pcm_mic(emu10k1_t * emu, int device, snd_pcm_t ** rpcm)
1033 {
1034         snd_pcm_t *pcm;
1035         int err;
1036
1037         if (rpcm)
1038                 *rpcm = NULL;
1039
1040         if ((err = snd_pcm_new(emu->card, "emu10k1 mic", device, 0, 1, &pcm)) < 0)
1041                 return err;
1042
1043         pcm->private_data = emu;
1044         pcm->private_free = snd_emu10k1_pcm_mic_free;
1045
1046         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_emu10k1_capture_mic_ops);
1047
1048         pcm->info_flags = 0;
1049         strcpy(pcm->name, "EMU10K1 MIC");
1050         emu->pcm_mic = pcm;
1051
1052         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), 64*1024, 64*1024);
1053
1054         if (rpcm)
1055                 *rpcm = pcm;
1056         return 0;
1057 }
1058
1059 static int snd_emu10k1_pcm_efx_voices_mask_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1060 {
1061         emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
1062         int nefx = emu->audigy ? 64 : 32;
1063         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1064         uinfo->count = nefx;
1065         uinfo->value.integer.min = 0;
1066         uinfo->value.integer.max = 1;
1067         return 0;
1068 }
1069
1070 static int snd_emu10k1_pcm_efx_voices_mask_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1071 {
1072         emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
1073         unsigned long flags;
1074         int nefx = emu->audigy ? 64 : 32;
1075         int idx;
1076         
1077         spin_lock_irqsave(&emu->reg_lock, flags);
1078         for (idx = 0; idx < nefx; idx++)
1079                 ucontrol->value.integer.value[idx] = (emu->efx_voices_mask[idx / 32] & (1 << (idx % 32))) ? 1 : 0;
1080         spin_unlock_irqrestore(&emu->reg_lock, flags);
1081         return 0;
1082 }
1083
1084 static int snd_emu10k1_pcm_efx_voices_mask_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1085 {
1086         emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
1087         unsigned long flags;
1088         unsigned int nval[2], bits;
1089         int nefx = emu->audigy ? 64 : 32;
1090         int change, idx;
1091         
1092         nval[0] = nval[1] = 0;
1093         for (idx = 0, bits = 0; idx < nefx; idx++)
1094                 if (ucontrol->value.integer.value[idx]) {
1095                         nval[idx / 32] |= 1 << (idx % 32);
1096                         bits++;
1097                 }
1098         if (bits != 1 && bits != 2 && bits != 4 && bits != 8)
1099                 return -EINVAL;
1100         spin_lock_irqsave(&emu->reg_lock, flags);
1101         change = (nval[0] != emu->efx_voices_mask[0]) ||
1102                 (nval[1] != emu->efx_voices_mask[1]);
1103         emu->efx_voices_mask[0] = nval[0];
1104         emu->efx_voices_mask[1] = nval[1];
1105         spin_unlock_irqrestore(&emu->reg_lock, flags);
1106         return change;
1107 }
1108
1109 static snd_kcontrol_new_t snd_emu10k1_pcm_efx_voices_mask = {
1110         .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1111         .name = "EFX voices mask",
1112         .info = snd_emu10k1_pcm_efx_voices_mask_info,
1113         .get = snd_emu10k1_pcm_efx_voices_mask_get,
1114         .put = snd_emu10k1_pcm_efx_voices_mask_put
1115 };
1116
1117 static snd_pcm_ops_t snd_emu10k1_capture_efx_ops = {
1118         .open =                 snd_emu10k1_capture_efx_open,
1119         .close =                snd_emu10k1_capture_efx_close,
1120         .ioctl =                snd_pcm_lib_ioctl,
1121         .hw_params =            snd_emu10k1_capture_hw_params,
1122         .hw_free =              snd_emu10k1_capture_hw_free,
1123         .prepare =              snd_emu10k1_capture_prepare,
1124         .trigger =              snd_emu10k1_capture_trigger,
1125         .pointer =              snd_emu10k1_capture_pointer,
1126 };
1127
1128 static void snd_emu10k1_pcm_efx_free(snd_pcm_t *pcm)
1129 {
1130         emu10k1_t *emu = snd_magic_cast(emu10k1_t, pcm->private_data, return);
1131         emu->pcm_efx = NULL;
1132         snd_pcm_lib_preallocate_free_for_all(pcm);
1133 }
1134
1135 int __devinit snd_emu10k1_pcm_efx(emu10k1_t * emu, int device, snd_pcm_t ** rpcm)
1136 {
1137         snd_pcm_t *pcm;
1138         int err;
1139
1140         if (rpcm)
1141                 *rpcm = NULL;
1142
1143         if ((err = snd_pcm_new(emu->card, "emu10k1 efx", device, 0, 1, &pcm)) < 0)
1144                 return err;
1145
1146         pcm->private_data = emu;
1147         pcm->private_free = snd_emu10k1_pcm_efx_free;
1148
1149         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_emu10k1_capture_efx_ops);
1150
1151         pcm->info_flags = 0;
1152         strcpy(pcm->name, "EMU10K1 EFX");
1153         emu->pcm_efx = pcm;
1154         if (rpcm)
1155                 *rpcm = pcm;
1156
1157         emu->efx_voices_mask[0] = FXWC_DEFAULTROUTE_C | FXWC_DEFAULTROUTE_A;
1158         emu->efx_voices_mask[1] = 0;
1159         snd_ctl_add(emu->card, snd_ctl_new1(&snd_emu10k1_pcm_efx_voices_mask, emu));
1160
1161         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), 64*1024, 64*1024);
1162
1163         return 0;
1164 }