xref: /openbmc/linux/sound/pci/emu10k1/emumixer.c (revision 87c2ce3b)
1 /*
2  *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
3  *                   Takashi Iwai <tiwai@suse.de>
4  *                   Creative Labs, Inc.
5  *  Routines for control of EMU10K1 chips / mixer routines
6  *  Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com>
7  *
8  *  BUGS:
9  *    --
10  *
11  *  TODO:
12  *    --
13  *
14  *   This program is free software; you can redistribute it and/or modify
15  *   it under the terms of the GNU General Public License as published by
16  *   the Free Software Foundation; either version 2 of the License, or
17  *   (at your option) any later version.
18  *
19  *   This program is distributed in the hope that it will be useful,
20  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *   GNU General Public License for more details.
23  *
24  *   You should have received a copy of the GNU General Public License
25  *   along with this program; if not, write to the Free Software
26  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
27  *
28  */
29 
30 #include <sound/driver.h>
31 #include <linux/time.h>
32 #include <linux/init.h>
33 #include <sound/core.h>
34 #include <sound/emu10k1.h>
35 
36 #define AC97_ID_STAC9758	0x83847658
37 
38 static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
39 {
40 	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
41 	uinfo->count = 1;
42 	return 0;
43 }
44 
45 static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
46                                  struct snd_ctl_elem_value *ucontrol)
47 {
48 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
49 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
50 	unsigned long flags;
51 
52 	spin_lock_irqsave(&emu->reg_lock, flags);
53 	ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
54 	ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
55 	ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
56 	ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
57 	spin_unlock_irqrestore(&emu->reg_lock, flags);
58 	return 0;
59 }
60 
61 static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
62 				      struct snd_ctl_elem_value *ucontrol)
63 {
64 	ucontrol->value.iec958.status[0] = 0xff;
65 	ucontrol->value.iec958.status[1] = 0xff;
66 	ucontrol->value.iec958.status[2] = 0xff;
67 	ucontrol->value.iec958.status[3] = 0xff;
68 	return 0;
69 }
70 
71 #if 0
72 static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
73 {
74 	static char *texts[] = {"44100", "48000", "96000"};
75 
76 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
77 	uinfo->count = 1;
78 	uinfo->value.enumerated.items = 3;
79 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
80 		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
81 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
82 	return 0;
83 }
84 
85 static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
86                                  struct snd_ctl_elem_value *ucontrol)
87 {
88 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
89 	unsigned int tmp;
90 	unsigned long flags;
91 
92 
93 	spin_lock_irqsave(&emu->reg_lock, flags);
94 	tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
95 	switch (tmp & A_SPDIF_RATE_MASK) {
96 	case A_SPDIF_44100:
97 		ucontrol->value.enumerated.item[0] = 0;
98 		break;
99 	case A_SPDIF_48000:
100 		ucontrol->value.enumerated.item[0] = 1;
101 		break;
102 	case A_SPDIF_96000:
103 		ucontrol->value.enumerated.item[0] = 2;
104 		break;
105 	default:
106 		ucontrol->value.enumerated.item[0] = 1;
107 	}
108 	spin_unlock_irqrestore(&emu->reg_lock, flags);
109 	return 0;
110 }
111 
112 static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
113                                  struct snd_ctl_elem_value *ucontrol)
114 {
115 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
116 	int change;
117 	unsigned int reg, val, tmp;
118 	unsigned long flags;
119 
120 	switch(ucontrol->value.enumerated.item[0]) {
121 	case 0:
122 		val = A_SPDIF_44100;
123 		break;
124 	case 1:
125 		val = A_SPDIF_48000;
126 		break;
127 	case 2:
128 		val = A_SPDIF_96000;
129 		break;
130 	default:
131 		val = A_SPDIF_48000;
132 		break;
133 	}
134 
135 
136 	spin_lock_irqsave(&emu->reg_lock, flags);
137 	reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
138 	tmp = reg & ~A_SPDIF_RATE_MASK;
139 	tmp |= val;
140 	if ((change = (tmp != reg)))
141 		snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
142 	spin_unlock_irqrestore(&emu->reg_lock, flags);
143 	return change;
144 }
145 
146 static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
147 {
148 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
149 	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
150 	.name =         "Audigy SPDIF Output Sample Rate",
151 	.count =	1,
152 	.info =         snd_audigy_spdif_output_rate_info,
153 	.get =          snd_audigy_spdif_output_rate_get,
154 	.put =          snd_audigy_spdif_output_rate_put
155 };
156 #endif
157 
158 static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
159                                  struct snd_ctl_elem_value *ucontrol)
160 {
161 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
162 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
163 	int change;
164 	unsigned int val;
165 	unsigned long flags;
166 
167 	val = (ucontrol->value.iec958.status[0] << 0) |
168 	      (ucontrol->value.iec958.status[1] << 8) |
169 	      (ucontrol->value.iec958.status[2] << 16) |
170 	      (ucontrol->value.iec958.status[3] << 24);
171 	spin_lock_irqsave(&emu->reg_lock, flags);
172 	change = val != emu->spdif_bits[idx];
173 	if (change) {
174 		snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
175 		emu->spdif_bits[idx] = val;
176 	}
177 	spin_unlock_irqrestore(&emu->reg_lock, flags);
178 	return change;
179 }
180 
181 static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
182 {
183 	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
184 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
185 	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
186 	.count =	4,
187 	.info =         snd_emu10k1_spdif_info,
188 	.get =          snd_emu10k1_spdif_get_mask
189 };
190 
191 static struct snd_kcontrol_new snd_emu10k1_spdif_control =
192 {
193 	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
194 	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
195 	.count =	4,
196 	.info =         snd_emu10k1_spdif_info,
197 	.get =          snd_emu10k1_spdif_get,
198 	.put =          snd_emu10k1_spdif_put
199 };
200 
201 
202 static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
203 {
204 	if (emu->audigy) {
205 		snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
206 				      snd_emu10k1_compose_audigy_fxrt1(route));
207 		snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
208 				      snd_emu10k1_compose_audigy_fxrt2(route));
209 	} else {
210 		snd_emu10k1_ptr_write(emu, FXRT, voice,
211 				      snd_emu10k1_compose_send_routing(route));
212 	}
213 }
214 
215 static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
216 {
217 	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
218 	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
219 	snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
220 	snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
221 	if (emu->audigy) {
222 		unsigned int val = ((unsigned int)volume[4] << 24) |
223 			((unsigned int)volume[5] << 16) |
224 			((unsigned int)volume[6] << 8) |
225 			(unsigned int)volume[7];
226 		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
227 	}
228 }
229 
230 /* PCM stream controls */
231 
232 static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
233 {
234 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
235 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
236 	uinfo->count = emu->audigy ? 3*8 : 3*4;
237 	uinfo->value.integer.min = 0;
238 	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
239 	return 0;
240 }
241 
242 static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
243                                         struct snd_ctl_elem_value *ucontrol)
244 {
245 	unsigned long flags;
246 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
247 	struct snd_emu10k1_pcm_mixer *mix =
248 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
249 	int voice, idx;
250 	int num_efx = emu->audigy ? 8 : 4;
251 	int mask = emu->audigy ? 0x3f : 0x0f;
252 
253 	spin_lock_irqsave(&emu->reg_lock, flags);
254 	for (voice = 0; voice < 3; voice++)
255 		for (idx = 0; idx < num_efx; idx++)
256 			ucontrol->value.integer.value[(voice * num_efx) + idx] =
257 				mix->send_routing[voice][idx] & mask;
258 	spin_unlock_irqrestore(&emu->reg_lock, flags);
259 	return 0;
260 }
261 
262 static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
263                                         struct snd_ctl_elem_value *ucontrol)
264 {
265 	unsigned long flags;
266 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
267 	struct snd_emu10k1_pcm_mixer *mix =
268 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
269 	int change = 0, voice, idx, val;
270 	int num_efx = emu->audigy ? 8 : 4;
271 	int mask = emu->audigy ? 0x3f : 0x0f;
272 
273 	spin_lock_irqsave(&emu->reg_lock, flags);
274 	for (voice = 0; voice < 3; voice++)
275 		for (idx = 0; idx < num_efx; idx++) {
276 			val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
277 			if (mix->send_routing[voice][idx] != val) {
278 				mix->send_routing[voice][idx] = val;
279 				change = 1;
280 			}
281 		}
282 	if (change && mix->epcm) {
283 		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
284 			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
285 					    &mix->send_routing[1][0]);
286 			update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
287 					    &mix->send_routing[2][0]);
288 		} else if (mix->epcm->voices[0]) {
289 			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
290 					    &mix->send_routing[0][0]);
291 		}
292 	}
293 	spin_unlock_irqrestore(&emu->reg_lock, flags);
294 	return change;
295 }
296 
297 static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
298 {
299 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
300 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
301 	.name =         "EMU10K1 PCM Send Routing",
302 	.count =	32,
303 	.info =         snd_emu10k1_send_routing_info,
304 	.get =          snd_emu10k1_send_routing_get,
305 	.put =          snd_emu10k1_send_routing_put
306 };
307 
308 static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
309 {
310 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
311 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
312 	uinfo->count = emu->audigy ? 3*8 : 3*4;
313 	uinfo->value.integer.min = 0;
314 	uinfo->value.integer.max = 255;
315 	return 0;
316 }
317 
318 static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
319                                        struct snd_ctl_elem_value *ucontrol)
320 {
321 	unsigned long flags;
322 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
323 	struct snd_emu10k1_pcm_mixer *mix =
324 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
325 	int idx;
326 	int num_efx = emu->audigy ? 8 : 4;
327 
328 	spin_lock_irqsave(&emu->reg_lock, flags);
329 	for (idx = 0; idx < 3*num_efx; idx++)
330 		ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
331 	spin_unlock_irqrestore(&emu->reg_lock, flags);
332 	return 0;
333 }
334 
335 static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
336                                        struct snd_ctl_elem_value *ucontrol)
337 {
338 	unsigned long flags;
339 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
340 	struct snd_emu10k1_pcm_mixer *mix =
341 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
342 	int change = 0, idx, val;
343 	int num_efx = emu->audigy ? 8 : 4;
344 
345 	spin_lock_irqsave(&emu->reg_lock, flags);
346 	for (idx = 0; idx < 3*num_efx; idx++) {
347 		val = ucontrol->value.integer.value[idx] & 255;
348 		if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
349 			mix->send_volume[idx/num_efx][idx%num_efx] = val;
350 			change = 1;
351 		}
352 	}
353 	if (change && mix->epcm) {
354 		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
355 			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
356 						   &mix->send_volume[1][0]);
357 			update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
358 						   &mix->send_volume[2][0]);
359 		} else if (mix->epcm->voices[0]) {
360 			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
361 						   &mix->send_volume[0][0]);
362 		}
363 	}
364 	spin_unlock_irqrestore(&emu->reg_lock, flags);
365 	return change;
366 }
367 
368 static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
369 {
370 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
371 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
372 	.name =         "EMU10K1 PCM Send Volume",
373 	.count =	32,
374 	.info =         snd_emu10k1_send_volume_info,
375 	.get =          snd_emu10k1_send_volume_get,
376 	.put =          snd_emu10k1_send_volume_put
377 };
378 
379 static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
380 {
381 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
382 	uinfo->count = 3;
383 	uinfo->value.integer.min = 0;
384 	uinfo->value.integer.max = 0xffff;
385 	return 0;
386 }
387 
388 static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
389                                 struct snd_ctl_elem_value *ucontrol)
390 {
391 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
392 	struct snd_emu10k1_pcm_mixer *mix =
393 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
394 	unsigned long flags;
395 	int idx;
396 
397 	spin_lock_irqsave(&emu->reg_lock, flags);
398 	for (idx = 0; idx < 3; idx++)
399 		ucontrol->value.integer.value[idx] = mix->attn[idx];
400 	spin_unlock_irqrestore(&emu->reg_lock, flags);
401 	return 0;
402 }
403 
404 static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
405 				struct snd_ctl_elem_value *ucontrol)
406 {
407 	unsigned long flags;
408 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
409 	struct snd_emu10k1_pcm_mixer *mix =
410 		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
411 	int change = 0, idx, val;
412 
413 	spin_lock_irqsave(&emu->reg_lock, flags);
414 	for (idx = 0; idx < 3; idx++) {
415 		val = ucontrol->value.integer.value[idx] & 0xffff;
416 		if (mix->attn[idx] != val) {
417 			mix->attn[idx] = val;
418 			change = 1;
419 		}
420 	}
421 	if (change && mix->epcm) {
422 		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
423 			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
424 			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
425 		} else if (mix->epcm->voices[0]) {
426 			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
427 		}
428 	}
429 	spin_unlock_irqrestore(&emu->reg_lock, flags);
430 	return change;
431 }
432 
433 static struct snd_kcontrol_new snd_emu10k1_attn_control =
434 {
435 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
436 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
437 	.name =         "EMU10K1 PCM Volume",
438 	.count =	32,
439 	.info =         snd_emu10k1_attn_info,
440 	.get =          snd_emu10k1_attn_get,
441 	.put =          snd_emu10k1_attn_put
442 };
443 
444 /* Mutichannel PCM stream controls */
445 
446 static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
447 {
448 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
449 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
450 	uinfo->count = emu->audigy ? 8 : 4;
451 	uinfo->value.integer.min = 0;
452 	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
453 	return 0;
454 }
455 
456 static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
457                                         struct snd_ctl_elem_value *ucontrol)
458 {
459 	unsigned long flags;
460 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
461 	struct snd_emu10k1_pcm_mixer *mix =
462 		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
463 	int idx;
464 	int num_efx = emu->audigy ? 8 : 4;
465 	int mask = emu->audigy ? 0x3f : 0x0f;
466 
467 	spin_lock_irqsave(&emu->reg_lock, flags);
468 	for (idx = 0; idx < num_efx; idx++)
469 		ucontrol->value.integer.value[idx] =
470 			mix->send_routing[0][idx] & mask;
471 	spin_unlock_irqrestore(&emu->reg_lock, flags);
472 	return 0;
473 }
474 
475 static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
476                                         struct snd_ctl_elem_value *ucontrol)
477 {
478 	unsigned long flags;
479 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
480 	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
481 	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
482 	int change = 0, idx, val;
483 	int num_efx = emu->audigy ? 8 : 4;
484 	int mask = emu->audigy ? 0x3f : 0x0f;
485 
486 	spin_lock_irqsave(&emu->reg_lock, flags);
487 	for (idx = 0; idx < num_efx; idx++) {
488 		val = ucontrol->value.integer.value[idx] & mask;
489 		if (mix->send_routing[0][idx] != val) {
490 			mix->send_routing[0][idx] = val;
491 			change = 1;
492 		}
493 	}
494 
495 	if (change && mix->epcm) {
496 		if (mix->epcm->voices[ch]) {
497 			update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
498 					&mix->send_routing[0][0]);
499 		}
500 	}
501 	spin_unlock_irqrestore(&emu->reg_lock, flags);
502 	return change;
503 }
504 
505 static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
506 {
507 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
508 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
509 	.name =         "Multichannel PCM Send Routing",
510 	.count =	16,
511 	.info =         snd_emu10k1_efx_send_routing_info,
512 	.get =          snd_emu10k1_efx_send_routing_get,
513 	.put =          snd_emu10k1_efx_send_routing_put
514 };
515 
516 static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
517 {
518 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
519 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
520 	uinfo->count = emu->audigy ? 8 : 4;
521 	uinfo->value.integer.min = 0;
522 	uinfo->value.integer.max = 255;
523 	return 0;
524 }
525 
526 static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
527                                        struct snd_ctl_elem_value *ucontrol)
528 {
529 	unsigned long flags;
530 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
531 	struct snd_emu10k1_pcm_mixer *mix =
532 		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
533 	int idx;
534 	int num_efx = emu->audigy ? 8 : 4;
535 
536 	spin_lock_irqsave(&emu->reg_lock, flags);
537 	for (idx = 0; idx < num_efx; idx++)
538 		ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
539 	spin_unlock_irqrestore(&emu->reg_lock, flags);
540 	return 0;
541 }
542 
543 static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
544                                        struct snd_ctl_elem_value *ucontrol)
545 {
546 	unsigned long flags;
547 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
548 	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
549 	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
550 	int change = 0, idx, val;
551 	int num_efx = emu->audigy ? 8 : 4;
552 
553 	spin_lock_irqsave(&emu->reg_lock, flags);
554 	for (idx = 0; idx < num_efx; idx++) {
555 		val = ucontrol->value.integer.value[idx] & 255;
556 		if (mix->send_volume[0][idx] != val) {
557 			mix->send_volume[0][idx] = val;
558 			change = 1;
559 		}
560 	}
561 	if (change && mix->epcm) {
562 		if (mix->epcm->voices[ch]) {
563 			update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
564 						   &mix->send_volume[0][0]);
565 		}
566 	}
567 	spin_unlock_irqrestore(&emu->reg_lock, flags);
568 	return change;
569 }
570 
571 
572 static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
573 {
574 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
575 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
576 	.name =         "Multichannel PCM Send Volume",
577 	.count =	16,
578 	.info =         snd_emu10k1_efx_send_volume_info,
579 	.get =          snd_emu10k1_efx_send_volume_get,
580 	.put =          snd_emu10k1_efx_send_volume_put
581 };
582 
583 static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
584 {
585 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
586 	uinfo->count = 1;
587 	uinfo->value.integer.min = 0;
588 	uinfo->value.integer.max = 0xffff;
589 	return 0;
590 }
591 
592 static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
593                                 struct snd_ctl_elem_value *ucontrol)
594 {
595 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
596 	struct snd_emu10k1_pcm_mixer *mix =
597 		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
598 	unsigned long flags;
599 
600 	spin_lock_irqsave(&emu->reg_lock, flags);
601 	ucontrol->value.integer.value[0] = mix->attn[0];
602 	spin_unlock_irqrestore(&emu->reg_lock, flags);
603 	return 0;
604 }
605 
606 static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
607 				struct snd_ctl_elem_value *ucontrol)
608 {
609 	unsigned long flags;
610 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
611 	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
612 	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
613 	int change = 0, val;
614 
615 	spin_lock_irqsave(&emu->reg_lock, flags);
616 	val = ucontrol->value.integer.value[0] & 0xffff;
617 	if (mix->attn[0] != val) {
618 		mix->attn[0] = val;
619 		change = 1;
620 	}
621 	if (change && mix->epcm) {
622 		if (mix->epcm->voices[ch]) {
623 			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
624 		}
625 	}
626 	spin_unlock_irqrestore(&emu->reg_lock, flags);
627 	return change;
628 }
629 
630 static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
631 {
632 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
633 	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
634 	.name =         "Multichannel PCM Volume",
635 	.count =	16,
636 	.info =         snd_emu10k1_efx_attn_info,
637 	.get =          snd_emu10k1_efx_attn_get,
638 	.put =          snd_emu10k1_efx_attn_put
639 };
640 
641 static int snd_emu10k1_shared_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
642 {
643 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
644 	uinfo->count = 1;
645 	uinfo->value.integer.min = 0;
646 	uinfo->value.integer.max = 1;
647 	return 0;
648 }
649 
650 static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
651 					struct snd_ctl_elem_value *ucontrol)
652 {
653 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
654 
655 	if (emu->audigy)
656 		ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
657 	else
658 		ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
659 	return 0;
660 }
661 
662 static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
663 					struct snd_ctl_elem_value *ucontrol)
664 {
665 	unsigned long flags;
666 	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
667 	unsigned int reg, val;
668 	int change = 0;
669 
670 	spin_lock_irqsave(&emu->reg_lock, flags);
671 	if (emu->audigy) {
672 		reg = inl(emu->port + A_IOCFG);
673 		val = ucontrol->value.integer.value[0] ? A_IOCFG_GPOUT0 : 0;
674 		change = (reg & A_IOCFG_GPOUT0) != val;
675 		if (change) {
676 			reg &= ~A_IOCFG_GPOUT0;
677 			reg |= val;
678 			outl(reg | val, emu->port + A_IOCFG);
679 		}
680 	}
681 	reg = inl(emu->port + HCFG);
682 	val = ucontrol->value.integer.value[0] ? HCFG_GPOUT0 : 0;
683 	change |= (reg & HCFG_GPOUT0) != val;
684 	if (change) {
685 		reg &= ~HCFG_GPOUT0;
686 		reg |= val;
687 		outl(reg | val, emu->port + HCFG);
688 	}
689 	spin_unlock_irqrestore(&emu->reg_lock, flags);
690 	return change;
691 }
692 
693 static struct snd_kcontrol_new snd_emu10k1_shared_spdif __devinitdata =
694 {
695 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
696 	.name =		"SB Live Analog/Digital Output Jack",
697 	.info =		snd_emu10k1_shared_spdif_info,
698 	.get =		snd_emu10k1_shared_spdif_get,
699 	.put =		snd_emu10k1_shared_spdif_put
700 };
701 
702 static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata =
703 {
704 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
705 	.name =		"Audigy Analog/Digital Output Jack",
706 	.info =		snd_emu10k1_shared_spdif_info,
707 	.get =		snd_emu10k1_shared_spdif_get,
708 	.put =		snd_emu10k1_shared_spdif_put
709 };
710 
711 /*
712  */
713 static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
714 {
715 	struct snd_emu10k1 *emu = ac97->private_data;
716 	emu->ac97 = NULL;
717 }
718 
719 /*
720  */
721 static int remove_ctl(struct snd_card *card, const char *name)
722 {
723 	struct snd_ctl_elem_id id;
724 	memset(&id, 0, sizeof(id));
725 	strcpy(id.name, name);
726 	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
727 	return snd_ctl_remove_id(card, &id);
728 }
729 
730 static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
731 {
732 	struct snd_ctl_elem_id sid;
733 	memset(&sid, 0, sizeof(sid));
734 	strcpy(sid.name, name);
735 	sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
736 	return snd_ctl_find_id(card, &sid);
737 }
738 
739 static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
740 {
741 	struct snd_kcontrol *kctl = ctl_find(card, src);
742 	if (kctl) {
743 		strcpy(kctl->id.name, dst);
744 		return 0;
745 	}
746 	return -ENOENT;
747 }
748 
749 int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
750 				int pcm_device, int multi_device)
751 {
752 	int err, pcm;
753 	struct snd_kcontrol *kctl;
754 	struct snd_card *card = emu->card;
755 	char **c;
756 	static char *emu10k1_remove_ctls[] = {
757 		/* no AC97 mono, surround, center/lfe */
758 		"Master Mono Playback Switch",
759 		"Master Mono Playback Volume",
760 		"PCM Out Path & Mute",
761 		"Mono Output Select",
762 		"Surround Playback Switch",
763 		"Surround Playback Volume",
764 		"Center Playback Switch",
765 		"Center Playback Volume",
766 		"LFE Playback Switch",
767 		"LFE Playback Volume",
768 		NULL
769 	};
770 	static char *emu10k1_rename_ctls[] = {
771 		"Surround Digital Playback Volume", "Surround Playback Volume",
772 		"Center Digital Playback Volume", "Center Playback Volume",
773 		"LFE Digital Playback Volume", "LFE Playback Volume",
774 		NULL
775 	};
776 	static char *audigy_remove_ctls[] = {
777 		/* Master/PCM controls on ac97 of Audigy has no effect */
778 		"PCM Playback Switch",
779 		"PCM Playback Volume",
780 		"Master Mono Playback Switch",
781 		"Master Mono Playback Volume",
782 		"Master Playback Switch",
783 		"Master Playback Volume",
784 		"PCM Out Path & Mute",
785 		"Mono Output Select",
786 		/* remove unused AC97 capture controls */
787 		"Capture Source",
788 		"Capture Switch",
789 		"Capture Volume",
790 		"Mic Select",
791 		"Video Playback Switch",
792 		"Video Playback Volume",
793 		"Mic Playback Switch",
794 		"Mic Playback Volume",
795 		NULL
796 	};
797 	static char *audigy_rename_ctls[] = {
798 		/* use conventional names */
799 		"Wave Playback Volume", "PCM Playback Volume",
800 		/* "Wave Capture Volume", "PCM Capture Volume", */
801 		"Wave Master Playback Volume", "Master Playback Volume",
802 		"AMic Playback Volume", "Mic Playback Volume",
803 		NULL
804 	};
805 
806 	if (emu->card_capabilities->ac97_chip) {
807 		struct snd_ac97_bus *pbus;
808 		struct snd_ac97_template ac97;
809 		static struct snd_ac97_bus_ops ops = {
810 			.write = snd_emu10k1_ac97_write,
811 			.read = snd_emu10k1_ac97_read,
812 		};
813 
814 		if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
815 			return err;
816 		pbus->no_vra = 1; /* we don't need VRA */
817 
818 		memset(&ac97, 0, sizeof(ac97));
819 		ac97.private_data = emu;
820 		ac97.private_free = snd_emu10k1_mixer_free_ac97;
821 		ac97.scaps = AC97_SCAP_NO_SPDIF;
822 		if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
823 			if (emu->card_capabilities->ac97_chip == 1)
824 				return err;
825 			snd_printd(KERN_INFO "emu10k1: AC97 is optional on this board\n");
826 			snd_printd(KERN_INFO"          Proceeding without ac97 mixers...\n");
827 			snd_device_free(emu->card, pbus);
828 			goto no_ac97; /* FIXME: get rid of ugly gotos.. */
829 		}
830 		if (emu->audigy) {
831 			/* set master volume to 0 dB */
832 			snd_ac97_write(emu->ac97, AC97_MASTER, 0x0000);
833 			/* set capture source to mic */
834 			snd_ac97_write(emu->ac97, AC97_REC_SEL, 0x0000);
835 			c = audigy_remove_ctls;
836 		} else {
837 			/*
838 			 * Credits for cards based on STAC9758:
839 			 *   James Courtier-Dutton <James@superbug.demon.co.uk>
840 			 *   Voluspa <voluspa@comhem.se>
841 			 */
842 			if (emu->ac97->id == AC97_ID_STAC9758) {
843 				emu->rear_ac97 = 1;
844 				snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
845 			}
846 			/* remove unused AC97 controls */
847 			snd_ac97_write(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
848 			snd_ac97_write(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
849 			c = emu10k1_remove_ctls;
850 		}
851 		for (; *c; c++)
852 			remove_ctl(card, *c);
853 	} else {
854 	no_ac97:
855 		if (emu->card_capabilities->ecard)
856 			strcpy(emu->card->mixername, "EMU APS");
857 		else if (emu->audigy)
858 			strcpy(emu->card->mixername, "SB Audigy");
859 		else
860 			strcpy(emu->card->mixername, "Emu10k1");
861 	}
862 
863 	if (emu->audigy)
864 		c = audigy_rename_ctls;
865 	else
866 		c = emu10k1_rename_ctls;
867 	for (; *c; c += 2)
868 		rename_ctl(card, c[0], c[1]);
869 	if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
870 		rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
871 		rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
872 		rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
873 		rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
874 		remove_ctl(card, "Headphone Playback Switch");
875 		remove_ctl(card, "Headphone Playback Volume");
876 		remove_ctl(card, "3D Control - Center");
877 		remove_ctl(card, "3D Control - Depth");
878 		remove_ctl(card, "3D Control - Switch");
879 	}
880 	if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
881 		return -ENOMEM;
882 	kctl->id.device = pcm_device;
883 	if ((err = snd_ctl_add(card, kctl)))
884 		return err;
885 	if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
886 		return -ENOMEM;
887 	kctl->id.device = pcm_device;
888 	if ((err = snd_ctl_add(card, kctl)))
889 		return err;
890 	if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
891 		return -ENOMEM;
892 	kctl->id.device = pcm_device;
893 	if ((err = snd_ctl_add(card, kctl)))
894 		return err;
895 
896 	if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
897 		return -ENOMEM;
898 	kctl->id.device = multi_device;
899 	if ((err = snd_ctl_add(card, kctl)))
900 		return err;
901 
902 	if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
903 		return -ENOMEM;
904 	kctl->id.device = multi_device;
905 	if ((err = snd_ctl_add(card, kctl)))
906 		return err;
907 
908 	if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
909 		return -ENOMEM;
910 	kctl->id.device = multi_device;
911 	if ((err = snd_ctl_add(card, kctl)))
912 		return err;
913 
914 	/* initialize the routing and volume table for each pcm playback stream */
915 	for (pcm = 0; pcm < 32; pcm++) {
916 		struct snd_emu10k1_pcm_mixer *mix;
917 		int v;
918 
919 		mix = &emu->pcm_mixer[pcm];
920 		mix->epcm = NULL;
921 
922 		for (v = 0; v < 4; v++)
923 			mix->send_routing[0][v] =
924 				mix->send_routing[1][v] =
925 				mix->send_routing[2][v] = v;
926 
927 		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
928 		mix->send_volume[0][0] = mix->send_volume[0][1] =
929 		mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
930 
931 		mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
932 	}
933 
934 	/* initialize the routing and volume table for the multichannel playback stream */
935 	for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
936 		struct snd_emu10k1_pcm_mixer *mix;
937 		int v;
938 
939 		mix = &emu->efx_pcm_mixer[pcm];
940 		mix->epcm = NULL;
941 
942 		mix->send_routing[0][0] = pcm;
943 		mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
944 		for (v = 0; v < 2; v++)
945 			mix->send_routing[0][2+v] = 13+v;
946 		if (emu->audigy)
947 			for (v = 0; v < 4; v++)
948 				mix->send_routing[0][4+v] = 60+v;
949 
950 		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
951 		mix->send_volume[0][0]  = 255;
952 
953 		mix->attn[0] = 0xffff;
954 	}
955 
956 	if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
957 		/* sb live! and audigy */
958 		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
959 			return -ENOMEM;
960 		if (!emu->audigy)
961 			kctl->id.device = emu->pcm_efx->device;
962 		if ((err = snd_ctl_add(card, kctl)))
963 			return err;
964 		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
965 			return -ENOMEM;
966 		if (!emu->audigy)
967 			kctl->id.device = emu->pcm_efx->device;
968 		if ((err = snd_ctl_add(card, kctl)))
969 			return err;
970 	}
971 
972 	if ( emu->card_capabilities->emu1212m) {
973 		;  /* Disable the snd_audigy_spdif_shared_spdif */
974 	} else if (emu->audigy) {
975 		if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
976 			return -ENOMEM;
977 		if ((err = snd_ctl_add(card, kctl)))
978 			return err;
979 #if 0
980 		if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
981 			return -ENOMEM;
982 		if ((err = snd_ctl_add(card, kctl)))
983 			return err;
984 #endif
985 	} else if (! emu->card_capabilities->ecard) {
986 		/* sb live! */
987 		if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
988 			return -ENOMEM;
989 		if ((err = snd_ctl_add(card, kctl)))
990 			return err;
991 	}
992 	if (emu->card_capabilities->ca0151_chip) { /* P16V */
993 		if ((err = snd_p16v_mixer(emu)))
994 			return err;
995 	}
996 
997 	return 0;
998 }
999