blob: da2065cd2c0d5c3ffd5783b98c90ebfbc4ee244c [file] [log] [blame]
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001/*
2 * ALSA driver for Echoaudio soundcards.
3 * Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19MODULE_AUTHOR("Giuliano Pochini <pochini@shiny.it>");
20MODULE_LICENSE("GPL v2");
21MODULE_DESCRIPTION("Echoaudio " ECHOCARD_NAME " soundcards driver");
22MODULE_SUPPORTED_DEVICE("{{Echoaudio," ECHOCARD_NAME "}}");
23MODULE_DEVICE_TABLE(pci, snd_echo_ids);
24
25static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
26static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
27static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
28
29module_param_array(index, int, NULL, 0444);
30MODULE_PARM_DESC(index, "Index value for " ECHOCARD_NAME " soundcard.");
31module_param_array(id, charp, NULL, 0444);
32MODULE_PARM_DESC(id, "ID string for " ECHOCARD_NAME " soundcard.");
33module_param_array(enable, bool, NULL, 0444);
34MODULE_PARM_DESC(enable, "Enable " ECHOCARD_NAME " soundcard.");
35
36static unsigned int channels_list[10] = {1, 2, 4, 6, 8, 10, 12, 14, 16, 999999};
Takashi Iwai0cb29ea2007-01-29 15:33:49 +010037static const DECLARE_TLV_DB_SCALE(db_scale_output_gain, -12800, 100, 1);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +020038
39static int get_firmware(const struct firmware **fw_entry,
40 const struct firmware *frm, struct echoaudio *chip)
41{
42 int err;
43 char name[30];
44 DE_ACT(("firmware requested: %s\n", frm->data));
45 snprintf(name, sizeof(name), "ea/%s", frm->data);
46 if ((err = request_firmware(fw_entry, name, pci_device(chip))) < 0)
47 snd_printk(KERN_ERR "get_firmware(): Firmware not available (%d)\n", err);
48 return err;
49}
50
51static void free_firmware(const struct firmware *fw_entry)
52{
53 release_firmware(fw_entry);
54 DE_ACT(("firmware released\n"));
55}
56
57
58
59/******************************************************************************
60 PCM interface
61******************************************************************************/
62
63static void audiopipe_free(struct snd_pcm_runtime *runtime)
64{
65 struct audiopipe *pipe = runtime->private_data;
66
67 if (pipe->sgpage.area)
68 snd_dma_free_pages(&pipe->sgpage);
69 kfree(pipe);
70}
71
72
73
74static int hw_rule_capture_format_by_channels(struct snd_pcm_hw_params *params,
75 struct snd_pcm_hw_rule *rule)
76{
77 struct snd_interval *c = hw_param_interval(params,
78 SNDRV_PCM_HW_PARAM_CHANNELS);
79 struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
80 struct snd_mask fmt;
81
82 snd_mask_any(&fmt);
83
84#ifndef ECHOCARD_HAS_STEREO_BIG_ENDIAN32
85 /* >=2 channels cannot be S32_BE */
86 if (c->min == 2) {
87 fmt.bits[0] &= ~SNDRV_PCM_FMTBIT_S32_BE;
88 return snd_mask_refine(f, &fmt);
89 }
90#endif
91 /* > 2 channels cannot be U8 and S32_BE */
92 if (c->min > 2) {
93 fmt.bits[0] &= ~(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_BE);
94 return snd_mask_refine(f, &fmt);
95 }
96 /* Mono is ok with any format */
97 return 0;
98}
99
100
101
102static int hw_rule_capture_channels_by_format(struct snd_pcm_hw_params *params,
103 struct snd_pcm_hw_rule *rule)
104{
105 struct snd_interval *c = hw_param_interval(params,
106 SNDRV_PCM_HW_PARAM_CHANNELS);
107 struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
108 struct snd_interval ch;
109
110 snd_interval_any(&ch);
111
112 /* S32_BE is mono (and stereo) only */
113 if (f->bits[0] == SNDRV_PCM_FMTBIT_S32_BE) {
114 ch.min = 1;
115#ifdef ECHOCARD_HAS_STEREO_BIG_ENDIAN32
116 ch.max = 2;
117#else
118 ch.max = 1;
119#endif
120 ch.integer = 1;
121 return snd_interval_refine(c, &ch);
122 }
123 /* U8 can be only mono or stereo */
124 if (f->bits[0] == SNDRV_PCM_FMTBIT_U8) {
125 ch.min = 1;
126 ch.max = 2;
127 ch.integer = 1;
128 return snd_interval_refine(c, &ch);
129 }
130 /* S16_LE, S24_3LE and S32_LE support any number of channels. */
131 return 0;
132}
133
134
135
136static int hw_rule_playback_format_by_channels(struct snd_pcm_hw_params *params,
137 struct snd_pcm_hw_rule *rule)
138{
139 struct snd_interval *c = hw_param_interval(params,
140 SNDRV_PCM_HW_PARAM_CHANNELS);
141 struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
142 struct snd_mask fmt;
143 u64 fmask;
144 snd_mask_any(&fmt);
145
146 fmask = fmt.bits[0] + ((u64)fmt.bits[1] << 32);
147
148 /* >2 channels must be S16_LE, S24_3LE or S32_LE */
149 if (c->min > 2) {
150 fmask &= SNDRV_PCM_FMTBIT_S16_LE |
151 SNDRV_PCM_FMTBIT_S24_3LE |
152 SNDRV_PCM_FMTBIT_S32_LE;
153 /* 1 channel must be S32_BE or S32_LE */
154 } else if (c->max == 1)
155 fmask &= SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE;
156#ifndef ECHOCARD_HAS_STEREO_BIG_ENDIAN32
157 /* 2 channels cannot be S32_BE */
158 else if (c->min == 2 && c->max == 2)
159 fmask &= ~SNDRV_PCM_FMTBIT_S32_BE;
160#endif
161 else
162 return 0;
163
164 fmt.bits[0] &= (u32)fmask;
165 fmt.bits[1] &= (u32)(fmask >> 32);
166 return snd_mask_refine(f, &fmt);
167}
168
169
170
171static int hw_rule_playback_channels_by_format(struct snd_pcm_hw_params *params,
172 struct snd_pcm_hw_rule *rule)
173{
174 struct snd_interval *c = hw_param_interval(params,
175 SNDRV_PCM_HW_PARAM_CHANNELS);
176 struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
177 struct snd_interval ch;
178 u64 fmask;
179
180 snd_interval_any(&ch);
181 ch.integer = 1;
182 fmask = f->bits[0] + ((u64)f->bits[1] << 32);
183
184 /* S32_BE is mono (and stereo) only */
185 if (fmask == SNDRV_PCM_FMTBIT_S32_BE) {
186 ch.min = 1;
187#ifdef ECHOCARD_HAS_STEREO_BIG_ENDIAN32
188 ch.max = 2;
189#else
190 ch.max = 1;
191#endif
192 /* U8 is stereo only */
193 } else if (fmask == SNDRV_PCM_FMTBIT_U8)
194 ch.min = ch.max = 2;
195 /* S16_LE and S24_3LE must be at least stereo */
196 else if (!(fmask & ~(SNDRV_PCM_FMTBIT_S16_LE |
197 SNDRV_PCM_FMTBIT_S24_3LE)))
198 ch.min = 2;
199 else
200 return 0;
201
202 return snd_interval_refine(c, &ch);
203}
204
205
206
207/* Since the sample rate is a global setting, do allow the user to change the
208sample rate only if there is only one pcm device open. */
209static int hw_rule_sample_rate(struct snd_pcm_hw_params *params,
210 struct snd_pcm_hw_rule *rule)
211{
212 struct snd_interval *rate = hw_param_interval(params,
213 SNDRV_PCM_HW_PARAM_RATE);
214 struct echoaudio *chip = rule->private;
215 struct snd_interval fixed;
216
217 if (!chip->can_set_rate) {
218 snd_interval_any(&fixed);
219 fixed.min = fixed.max = chip->sample_rate;
220 return snd_interval_refine(rate, &fixed);
221 }
222 return 0;
223}
224
225
226static int pcm_open(struct snd_pcm_substream *substream,
227 signed char max_channels)
228{
229 struct echoaudio *chip;
230 struct snd_pcm_runtime *runtime;
231 struct audiopipe *pipe;
232 int err, i;
233
234 if (max_channels <= 0)
235 return -EAGAIN;
236
237 chip = snd_pcm_substream_chip(substream);
238 runtime = substream->runtime;
239
Panagiotis Issaris59feddb2006-07-25 15:28:03 +0200240 pipe = kzalloc(sizeof(struct audiopipe), GFP_KERNEL);
241 if (!pipe)
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200242 return -ENOMEM;
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200243 pipe->index = -1; /* Not configured yet */
244
245 /* Set up hw capabilities and contraints */
246 memcpy(&pipe->hw, &pcm_hardware_skel, sizeof(struct snd_pcm_hardware));
247 DE_HWP(("max_channels=%d\n", max_channels));
248 pipe->constr.list = channels_list;
249 pipe->constr.mask = 0;
250 for (i = 0; channels_list[i] <= max_channels; i++);
251 pipe->constr.count = i;
252 if (pipe->hw.channels_max > max_channels)
253 pipe->hw.channels_max = max_channels;
254 if (chip->digital_mode == DIGITAL_MODE_ADAT) {
255 pipe->hw.rate_max = 48000;
256 pipe->hw.rates &= SNDRV_PCM_RATE_8000_48000;
257 }
258
259 runtime->hw = pipe->hw;
260 runtime->private_data = pipe;
261 runtime->private_free = audiopipe_free;
262 snd_pcm_set_sync(substream);
263
264 /* Only mono and any even number of channels are allowed */
265 if ((err = snd_pcm_hw_constraint_list(runtime, 0,
266 SNDRV_PCM_HW_PARAM_CHANNELS,
267 &pipe->constr)) < 0)
268 return err;
269
270 /* All periods should have the same size */
271 if ((err = snd_pcm_hw_constraint_integer(runtime,
272 SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
273 return err;
274
275 /* The hw accesses memory in chunks 32 frames long and they should be
276 32-bytes-aligned. It's not a requirement, but it seems that IRQs are
277 generated with a resolution of 32 frames. Thus we need the following */
278 if ((err = snd_pcm_hw_constraint_step(runtime, 0,
279 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
280 32)) < 0)
281 return err;
282 if ((err = snd_pcm_hw_constraint_step(runtime, 0,
283 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
284 32)) < 0)
285 return err;
286
287 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
288 SNDRV_PCM_HW_PARAM_RATE,
289 hw_rule_sample_rate, chip,
290 SNDRV_PCM_HW_PARAM_RATE, -1)) < 0)
291 return err;
292
293 /* Finally allocate a page for the scatter-gather list */
294 if ((err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
295 snd_dma_pci_data(chip->pci),
296 PAGE_SIZE, &pipe->sgpage)) < 0) {
297 DE_HWP(("s-g list allocation failed\n"));
298 return err;
299 }
300
301 return 0;
302}
303
304
305
306static int pcm_analog_in_open(struct snd_pcm_substream *substream)
307{
308 struct echoaudio *chip = snd_pcm_substream_chip(substream);
309 int err;
310
311 DE_ACT(("pcm_analog_in_open\n"));
312 if ((err = pcm_open(substream, num_analog_busses_in(chip) -
313 substream->number)) < 0)
314 return err;
315 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
316 SNDRV_PCM_HW_PARAM_CHANNELS,
317 hw_rule_capture_channels_by_format, NULL,
318 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0)
319 return err;
320 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
321 SNDRV_PCM_HW_PARAM_FORMAT,
322 hw_rule_capture_format_by_channels, NULL,
323 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0)
324 return err;
325 atomic_inc(&chip->opencount);
326 if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
327 chip->can_set_rate=0;
328 DE_HWP(("pcm_analog_in_open cs=%d oc=%d r=%d\n",
329 chip->can_set_rate, atomic_read(&chip->opencount),
330 chip->sample_rate));
331 return 0;
332}
333
334
335
336static int pcm_analog_out_open(struct snd_pcm_substream *substream)
337{
338 struct echoaudio *chip = snd_pcm_substream_chip(substream);
339 int max_channels, err;
340
341#ifdef ECHOCARD_HAS_VMIXER
342 max_channels = num_pipes_out(chip);
343#else
344 max_channels = num_analog_busses_out(chip);
345#endif
346 DE_ACT(("pcm_analog_out_open\n"));
347 if ((err = pcm_open(substream, max_channels - substream->number)) < 0)
348 return err;
349 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
350 SNDRV_PCM_HW_PARAM_CHANNELS,
351 hw_rule_playback_channels_by_format,
352 NULL,
353 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0)
354 return err;
355 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
356 SNDRV_PCM_HW_PARAM_FORMAT,
357 hw_rule_playback_format_by_channels,
358 NULL,
359 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0)
360 return err;
361 atomic_inc(&chip->opencount);
362 if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
363 chip->can_set_rate=0;
364 DE_HWP(("pcm_analog_out_open cs=%d oc=%d r=%d\n",
365 chip->can_set_rate, atomic_read(&chip->opencount),
366 chip->sample_rate));
367 return 0;
368}
369
370
371
372#ifdef ECHOCARD_HAS_DIGITAL_IO
373
374static int pcm_digital_in_open(struct snd_pcm_substream *substream)
375{
376 struct echoaudio *chip = snd_pcm_substream_chip(substream);
377 int err, max_channels;
378
379 DE_ACT(("pcm_digital_in_open\n"));
380 max_channels = num_digital_busses_in(chip) - substream->number;
Takashi Iwaibefceea2007-12-03 17:08:40 +0100381 mutex_lock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200382 if (chip->digital_mode == DIGITAL_MODE_ADAT)
383 err = pcm_open(substream, max_channels);
384 else /* If the card has ADAT, subtract the 6 channels
385 * that S/PDIF doesn't have
386 */
387 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT);
388
389 if (err < 0)
390 goto din_exit;
391
392 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
393 SNDRV_PCM_HW_PARAM_CHANNELS,
394 hw_rule_capture_channels_by_format, NULL,
395 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0)
396 goto din_exit;
397 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
398 SNDRV_PCM_HW_PARAM_FORMAT,
399 hw_rule_capture_format_by_channels, NULL,
400 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0)
401 goto din_exit;
402
403 atomic_inc(&chip->opencount);
404 if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
405 chip->can_set_rate=0;
406
407din_exit:
Takashi Iwaibefceea2007-12-03 17:08:40 +0100408 mutex_unlock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200409 return err;
410}
411
412
413
414#ifndef ECHOCARD_HAS_VMIXER /* See the note in snd_echo_new_pcm() */
415
416static int pcm_digital_out_open(struct snd_pcm_substream *substream)
417{
418 struct echoaudio *chip = snd_pcm_substream_chip(substream);
419 int err, max_channels;
420
421 DE_ACT(("pcm_digital_out_open\n"));
422 max_channels = num_digital_busses_out(chip) - substream->number;
Takashi Iwaibefceea2007-12-03 17:08:40 +0100423 mutex_lock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200424 if (chip->digital_mode == DIGITAL_MODE_ADAT)
425 err = pcm_open(substream, max_channels);
426 else /* If the card has ADAT, subtract the 6 channels
427 * that S/PDIF doesn't have
428 */
429 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT);
430
431 if (err < 0)
432 goto dout_exit;
433
434 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
435 SNDRV_PCM_HW_PARAM_CHANNELS,
436 hw_rule_playback_channels_by_format,
437 NULL, SNDRV_PCM_HW_PARAM_FORMAT,
438 -1)) < 0)
439 goto dout_exit;
440 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0,
441 SNDRV_PCM_HW_PARAM_FORMAT,
442 hw_rule_playback_format_by_channels,
443 NULL, SNDRV_PCM_HW_PARAM_CHANNELS,
444 -1)) < 0)
445 goto dout_exit;
446 atomic_inc(&chip->opencount);
447 if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
448 chip->can_set_rate=0;
449dout_exit:
Takashi Iwaibefceea2007-12-03 17:08:40 +0100450 mutex_unlock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200451 return err;
452}
453
454#endif /* !ECHOCARD_HAS_VMIXER */
455
456#endif /* ECHOCARD_HAS_DIGITAL_IO */
457
458
459
460static int pcm_close(struct snd_pcm_substream *substream)
461{
462 struct echoaudio *chip = snd_pcm_substream_chip(substream);
463 int oc;
464
465 /* Nothing to do here. Audio is already off and pipe will be
466 * freed by its callback
467 */
468 DE_ACT(("pcm_close\n"));
469
470 atomic_dec(&chip->opencount);
471 oc = atomic_read(&chip->opencount);
472 DE_ACT(("pcm_close oc=%d cs=%d rs=%d\n", oc,
473 chip->can_set_rate, chip->rate_set));
474 if (oc < 2)
475 chip->can_set_rate = 1;
476 if (oc == 0)
477 chip->rate_set = 0;
478 DE_ACT(("pcm_close2 oc=%d cs=%d rs=%d\n", oc,
479 chip->can_set_rate,chip->rate_set));
480
481 return 0;
482}
483
484
485
486/* Channel allocation and scatter-gather list setup */
487static int init_engine(struct snd_pcm_substream *substream,
488 struct snd_pcm_hw_params *hw_params,
489 int pipe_index, int interleave)
490{
491 struct echoaudio *chip;
492 int err, per, rest, page, edge, offs;
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200493 struct audiopipe *pipe;
494
495 chip = snd_pcm_substream_chip(substream);
496 pipe = (struct audiopipe *) substream->runtime->private_data;
497
498 /* Sets up che hardware. If it's already initialized, reset and
499 * redo with the new parameters
500 */
501 spin_lock_irq(&chip->lock);
502 if (pipe->index >= 0) {
503 DE_HWP(("hwp_ie free(%d)\n", pipe->index));
504 err = free_pipes(chip, pipe);
Takashi Iwaida3cec32008-08-08 17:12:14 +0200505 snd_BUG_ON(err);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200506 chip->substream[pipe->index] = NULL;
507 }
508
509 err = allocate_pipes(chip, pipe, pipe_index, interleave);
510 if (err < 0) {
511 spin_unlock_irq(&chip->lock);
512 DE_ACT((KERN_NOTICE "allocate_pipes(%d) err=%d\n",
513 pipe_index, err));
514 return err;
515 }
516 spin_unlock_irq(&chip->lock);
517 DE_ACT((KERN_NOTICE "allocate_pipes()=%d\n", pipe_index));
518
519 DE_HWP(("pcm_hw_params (bufsize=%dB periods=%d persize=%dB)\n",
520 params_buffer_bytes(hw_params), params_periods(hw_params),
521 params_period_bytes(hw_params)));
522 err = snd_pcm_lib_malloc_pages(substream,
523 params_buffer_bytes(hw_params));
524 if (err < 0) {
525 snd_printk(KERN_ERR "malloc_pages err=%d\n", err);
526 spin_lock_irq(&chip->lock);
527 free_pipes(chip, pipe);
528 spin_unlock_irq(&chip->lock);
529 pipe->index = -1;
530 return err;
531 }
532
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200533 sglist_init(chip, pipe);
534 edge = PAGE_SIZE;
535 for (offs = page = per = 0; offs < params_buffer_bytes(hw_params);
536 per++) {
537 rest = params_period_bytes(hw_params);
538 if (offs + rest > params_buffer_bytes(hw_params))
539 rest = params_buffer_bytes(hw_params) - offs;
540 while (rest) {
Takashi Iwai77a23f22008-08-21 13:00:13 +0200541 dma_addr_t addr;
542 addr = snd_pcm_sgbuf_get_addr(substream, offs);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200543 if (rest <= edge - offs) {
Takashi Iwai77a23f22008-08-21 13:00:13 +0200544 sglist_add_mapping(chip, pipe, addr, rest);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200545 sglist_add_irq(chip, pipe);
546 offs += rest;
547 rest = 0;
548 } else {
Takashi Iwai77a23f22008-08-21 13:00:13 +0200549 sglist_add_mapping(chip, pipe, addr,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200550 edge - offs);
551 rest -= edge - offs;
552 offs = edge;
553 }
554 if (offs == edge) {
555 edge += PAGE_SIZE;
556 page++;
557 }
558 }
559 }
560
561 /* Close the ring buffer */
562 sglist_wrap(chip, pipe);
563
564 /* This stuff is used by the irq handler, so it must be
565 * initialized before chip->substream
566 */
567 chip->last_period[pipe_index] = 0;
568 pipe->last_counter = 0;
569 pipe->position = 0;
570 smp_wmb();
571 chip->substream[pipe_index] = substream;
572 chip->rate_set = 1;
573 spin_lock_irq(&chip->lock);
574 set_sample_rate(chip, hw_params->rate_num / hw_params->rate_den);
575 spin_unlock_irq(&chip->lock);
576 DE_HWP(("pcm_hw_params ok\n"));
577 return 0;
578}
579
580
581
582static int pcm_analog_in_hw_params(struct snd_pcm_substream *substream,
583 struct snd_pcm_hw_params *hw_params)
584{
585 struct echoaudio *chip = snd_pcm_substream_chip(substream);
586
587 return init_engine(substream, hw_params, px_analog_in(chip) +
588 substream->number, params_channels(hw_params));
589}
590
591
592
593static int pcm_analog_out_hw_params(struct snd_pcm_substream *substream,
594 struct snd_pcm_hw_params *hw_params)
595{
596 return init_engine(substream, hw_params, substream->number,
597 params_channels(hw_params));
598}
599
600
601
602#ifdef ECHOCARD_HAS_DIGITAL_IO
603
604static int pcm_digital_in_hw_params(struct snd_pcm_substream *substream,
605 struct snd_pcm_hw_params *hw_params)
606{
607 struct echoaudio *chip = snd_pcm_substream_chip(substream);
608
609 return init_engine(substream, hw_params, px_digital_in(chip) +
610 substream->number, params_channels(hw_params));
611}
612
613
614
615#ifndef ECHOCARD_HAS_VMIXER /* See the note in snd_echo_new_pcm() */
616static int pcm_digital_out_hw_params(struct snd_pcm_substream *substream,
617 struct snd_pcm_hw_params *hw_params)
618{
619 struct echoaudio *chip = snd_pcm_substream_chip(substream);
620
621 return init_engine(substream, hw_params, px_digital_out(chip) +
622 substream->number, params_channels(hw_params));
623}
624#endif /* !ECHOCARD_HAS_VMIXER */
625
626#endif /* ECHOCARD_HAS_DIGITAL_IO */
627
628
629
630static int pcm_hw_free(struct snd_pcm_substream *substream)
631{
632 struct echoaudio *chip;
633 struct audiopipe *pipe;
634
635 chip = snd_pcm_substream_chip(substream);
636 pipe = (struct audiopipe *) substream->runtime->private_data;
637
638 spin_lock_irq(&chip->lock);
639 if (pipe->index >= 0) {
640 DE_HWP(("pcm_hw_free(%d)\n", pipe->index));
641 free_pipes(chip, pipe);
642 chip->substream[pipe->index] = NULL;
643 pipe->index = -1;
644 }
645 spin_unlock_irq(&chip->lock);
646
647 DE_HWP(("pcm_hw_freed\n"));
648 snd_pcm_lib_free_pages(substream);
649 return 0;
650}
651
652
653
654static int pcm_prepare(struct snd_pcm_substream *substream)
655{
656 struct echoaudio *chip = snd_pcm_substream_chip(substream);
657 struct snd_pcm_runtime *runtime = substream->runtime;
658 struct audioformat format;
659 int pipe_index = ((struct audiopipe *)runtime->private_data)->index;
660
661 DE_HWP(("Prepare rate=%d format=%d channels=%d\n",
662 runtime->rate, runtime->format, runtime->channels));
663 format.interleave = runtime->channels;
664 format.data_are_bigendian = 0;
665 format.mono_to_stereo = 0;
666 switch (runtime->format) {
667 case SNDRV_PCM_FORMAT_U8:
668 format.bits_per_sample = 8;
669 break;
670 case SNDRV_PCM_FORMAT_S16_LE:
671 format.bits_per_sample = 16;
672 break;
673 case SNDRV_PCM_FORMAT_S24_3LE:
674 format.bits_per_sample = 24;
675 break;
676 case SNDRV_PCM_FORMAT_S32_BE:
677 format.data_are_bigendian = 1;
678 case SNDRV_PCM_FORMAT_S32_LE:
679 format.bits_per_sample = 32;
680 break;
681 default:
682 DE_HWP(("Prepare error: unsupported format %d\n",
683 runtime->format));
684 return -EINVAL;
685 }
686
Takashi Iwaida3cec32008-08-08 17:12:14 +0200687 if (snd_BUG_ON(pipe_index >= px_num(chip)))
688 return -EINVAL;
689 if (snd_BUG_ON(!is_pipe_allocated(chip, pipe_index)))
690 return -EINVAL;
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200691 set_audio_format(chip, pipe_index, &format);
692 return 0;
693}
694
695
696
697static int pcm_trigger(struct snd_pcm_substream *substream, int cmd)
698{
699 struct echoaudio *chip = snd_pcm_substream_chip(substream);
700 struct snd_pcm_runtime *runtime = substream->runtime;
701 struct audiopipe *pipe = runtime->private_data;
702 int i, err;
703 u32 channelmask = 0;
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200704 struct snd_pcm_substream *s;
705
Takashi Iwaief991b92007-02-22 12:52:53 +0100706 snd_pcm_group_for_each_entry(s, substream) {
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200707 for (i = 0; i < DSP_MAXPIPES; i++) {
708 if (s == chip->substream[i]) {
709 channelmask |= 1 << i;
710 snd_pcm_trigger_done(s, substream);
711 }
712 }
713 }
714
715 spin_lock(&chip->lock);
716 switch (cmd) {
717 case SNDRV_PCM_TRIGGER_START:
718 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
719 DE_ACT(("pcm_trigger start\n"));
720 for (i = 0; i < DSP_MAXPIPES; i++) {
721 if (channelmask & (1 << i)) {
722 pipe = chip->substream[i]->runtime->private_data;
723 switch (pipe->state) {
724 case PIPE_STATE_STOPPED:
725 chip->last_period[i] = 0;
726 pipe->last_counter = 0;
727 pipe->position = 0;
728 *pipe->dma_counter = 0;
729 case PIPE_STATE_PAUSED:
730 pipe->state = PIPE_STATE_STARTED;
731 break;
732 case PIPE_STATE_STARTED:
733 break;
734 }
735 }
736 }
737 err = start_transport(chip, channelmask,
738 chip->pipe_cyclic_mask);
739 break;
740 case SNDRV_PCM_TRIGGER_STOP:
741 DE_ACT(("pcm_trigger stop\n"));
742 for (i = 0; i < DSP_MAXPIPES; i++) {
743 if (channelmask & (1 << i)) {
744 pipe = chip->substream[i]->runtime->private_data;
745 pipe->state = PIPE_STATE_STOPPED;
746 }
747 }
748 err = stop_transport(chip, channelmask);
749 break;
750 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
751 DE_ACT(("pcm_trigger pause\n"));
752 for (i = 0; i < DSP_MAXPIPES; i++) {
753 if (channelmask & (1 << i)) {
754 pipe = chip->substream[i]->runtime->private_data;
755 pipe->state = PIPE_STATE_PAUSED;
756 }
757 }
758 err = pause_transport(chip, channelmask);
759 break;
760 default:
761 err = -EINVAL;
762 }
763 spin_unlock(&chip->lock);
764 return err;
765}
766
767
768
769static snd_pcm_uframes_t pcm_pointer(struct snd_pcm_substream *substream)
770{
771 struct snd_pcm_runtime *runtime = substream->runtime;
772 struct audiopipe *pipe = runtime->private_data;
773 size_t cnt, bufsize, pos;
774
775 cnt = le32_to_cpu(*pipe->dma_counter);
776 pipe->position += cnt - pipe->last_counter;
777 pipe->last_counter = cnt;
778 bufsize = substream->runtime->buffer_size;
779 pos = bytes_to_frames(substream->runtime, pipe->position);
780
781 while (pos >= bufsize) {
782 pipe->position -= frames_to_bytes(substream->runtime, bufsize);
783 pos -= bufsize;
784 }
785 return pos;
786}
787
788
789
790/* pcm *_ops structures */
791static struct snd_pcm_ops analog_playback_ops = {
792 .open = pcm_analog_out_open,
793 .close = pcm_close,
794 .ioctl = snd_pcm_lib_ioctl,
795 .hw_params = pcm_analog_out_hw_params,
796 .hw_free = pcm_hw_free,
797 .prepare = pcm_prepare,
798 .trigger = pcm_trigger,
799 .pointer = pcm_pointer,
800 .page = snd_pcm_sgbuf_ops_page,
801};
802static struct snd_pcm_ops analog_capture_ops = {
803 .open = pcm_analog_in_open,
804 .close = pcm_close,
805 .ioctl = snd_pcm_lib_ioctl,
806 .hw_params = pcm_analog_in_hw_params,
807 .hw_free = pcm_hw_free,
808 .prepare = pcm_prepare,
809 .trigger = pcm_trigger,
810 .pointer = pcm_pointer,
811 .page = snd_pcm_sgbuf_ops_page,
812};
813#ifdef ECHOCARD_HAS_DIGITAL_IO
814#ifndef ECHOCARD_HAS_VMIXER
815static struct snd_pcm_ops digital_playback_ops = {
816 .open = pcm_digital_out_open,
817 .close = pcm_close,
818 .ioctl = snd_pcm_lib_ioctl,
819 .hw_params = pcm_digital_out_hw_params,
820 .hw_free = pcm_hw_free,
821 .prepare = pcm_prepare,
822 .trigger = pcm_trigger,
823 .pointer = pcm_pointer,
824 .page = snd_pcm_sgbuf_ops_page,
825};
826#endif /* !ECHOCARD_HAS_VMIXER */
827static struct snd_pcm_ops digital_capture_ops = {
828 .open = pcm_digital_in_open,
829 .close = pcm_close,
830 .ioctl = snd_pcm_lib_ioctl,
831 .hw_params = pcm_digital_in_hw_params,
832 .hw_free = pcm_hw_free,
833 .prepare = pcm_prepare,
834 .trigger = pcm_trigger,
835 .pointer = pcm_pointer,
836 .page = snd_pcm_sgbuf_ops_page,
837};
838#endif /* ECHOCARD_HAS_DIGITAL_IO */
839
840
841
842/* Preallocate memory only for the first substream because it's the most
843 * used one
844 */
845static int snd_echo_preallocate_pages(struct snd_pcm *pcm, struct device *dev)
846{
847 struct snd_pcm_substream *ss;
848 int stream, err;
849
850 for (stream = 0; stream < 2; stream++)
851 for (ss = pcm->streams[stream].substream; ss; ss = ss->next) {
852 err = snd_pcm_lib_preallocate_pages(ss, SNDRV_DMA_TYPE_DEV_SG,
853 dev,
854 ss->number ? 0 : 128<<10,
855 256<<10);
856 if (err < 0)
857 return err;
858 }
859 return 0;
860}
861
862
863
864/*<--snd_echo_probe() */
865static int __devinit snd_echo_new_pcm(struct echoaudio *chip)
866{
867 struct snd_pcm *pcm;
868 int err;
869
870#ifdef ECHOCARD_HAS_VMIXER
871 /* This card has a Vmixer, that is there is no direct mapping from PCM
872 streams to physical outputs. The user can mix the streams as he wishes
873 via control interface and it's possible to send any stream to any
874 output, thus it makes no sense to keep analog and digital outputs
875 separated */
876
877 /* PCM#0 Virtual outputs and analog inputs */
878 if ((err = snd_pcm_new(chip->card, "PCM", 0, num_pipes_out(chip),
879 num_analog_busses_in(chip), &pcm)) < 0)
880 return err;
881 pcm->private_data = chip;
882 chip->analog_pcm = pcm;
883 strcpy(pcm->name, chip->card->shortname);
884 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops);
885 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops);
886 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0)
887 return err;
888 DE_INIT(("Analog PCM ok\n"));
889
890#ifdef ECHOCARD_HAS_DIGITAL_IO
891 /* PCM#1 Digital inputs, no outputs */
892 if ((err = snd_pcm_new(chip->card, "Digital PCM", 1, 0,
893 num_digital_busses_in(chip), &pcm)) < 0)
894 return err;
895 pcm->private_data = chip;
896 chip->digital_pcm = pcm;
897 strcpy(pcm->name, chip->card->shortname);
898 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops);
899 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0)
900 return err;
901 DE_INIT(("Digital PCM ok\n"));
902#endif /* ECHOCARD_HAS_DIGITAL_IO */
903
904#else /* ECHOCARD_HAS_VMIXER */
905
906 /* The card can manage substreams formed by analog and digital channels
907 at the same time, but I prefer to keep analog and digital channels
908 separated, because that mixed thing is confusing and useless. So we
909 register two PCM devices: */
910
911 /* PCM#0 Analog i/o */
912 if ((err = snd_pcm_new(chip->card, "Analog PCM", 0,
913 num_analog_busses_out(chip),
914 num_analog_busses_in(chip), &pcm)) < 0)
915 return err;
916 pcm->private_data = chip;
917 chip->analog_pcm = pcm;
918 strcpy(pcm->name, chip->card->shortname);
919 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops);
920 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops);
921 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0)
922 return err;
923 DE_INIT(("Analog PCM ok\n"));
924
925#ifdef ECHOCARD_HAS_DIGITAL_IO
926 /* PCM#1 Digital i/o */
927 if ((err = snd_pcm_new(chip->card, "Digital PCM", 1,
928 num_digital_busses_out(chip),
929 num_digital_busses_in(chip), &pcm)) < 0)
930 return err;
931 pcm->private_data = chip;
932 chip->digital_pcm = pcm;
933 strcpy(pcm->name, chip->card->shortname);
934 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &digital_playback_ops);
935 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops);
936 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0)
937 return err;
938 DE_INIT(("Digital PCM ok\n"));
939#endif /* ECHOCARD_HAS_DIGITAL_IO */
940
941#endif /* ECHOCARD_HAS_VMIXER */
942
943 return 0;
944}
945
946
947
948
949/******************************************************************************
950 Control interface
951******************************************************************************/
952
Giuliano Pochini9f5d7902009-03-15 21:33:34 +0100953#ifndef ECHOCARD_HAS_VMIXER
954
Giuliano Pochinidd7b2542006-06-28 13:53:41 +0200955/******************* PCM output volume *******************/
956static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol,
957 struct snd_ctl_elem_info *uinfo)
958{
959 struct echoaudio *chip;
960
961 chip = snd_kcontrol_chip(kcontrol);
962 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
963 uinfo->count = num_busses_out(chip);
964 uinfo->value.integer.min = ECHOGAIN_MINOUT;
965 uinfo->value.integer.max = ECHOGAIN_MAXOUT;
966 return 0;
967}
968
969static int snd_echo_output_gain_get(struct snd_kcontrol *kcontrol,
970 struct snd_ctl_elem_value *ucontrol)
971{
972 struct echoaudio *chip;
973 int c;
974
975 chip = snd_kcontrol_chip(kcontrol);
976 for (c = 0; c < num_busses_out(chip); c++)
977 ucontrol->value.integer.value[c] = chip->output_gain[c];
978 return 0;
979}
980
981static int snd_echo_output_gain_put(struct snd_kcontrol *kcontrol,
982 struct snd_ctl_elem_value *ucontrol)
983{
984 struct echoaudio *chip;
985 int c, changed, gain;
986
987 changed = 0;
988 chip = snd_kcontrol_chip(kcontrol);
989 spin_lock_irq(&chip->lock);
990 for (c = 0; c < num_busses_out(chip); c++) {
991 gain = ucontrol->value.integer.value[c];
992 /* Ignore out of range values */
993 if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)
994 continue;
995 if (chip->output_gain[c] != gain) {
996 set_output_gain(chip, c, gain);
997 changed = 1;
998 }
999 }
1000 if (changed)
1001 update_output_line_level(chip);
1002 spin_unlock_irq(&chip->lock);
1003 return changed;
1004}
1005
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001006static struct snd_kcontrol_new snd_echo_pcm_output_gain __devinitdata = {
1007 .name = "PCM Playback Volume",
1008 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001009 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001010 .info = snd_echo_output_gain_info,
1011 .get = snd_echo_output_gain_get,
1012 .put = snd_echo_output_gain_put,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001013 .tlv = {.p = db_scale_output_gain},
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001014};
Giuliano Pochini9f5d7902009-03-15 21:33:34 +01001015
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001016#endif
1017
1018
1019
1020#ifdef ECHOCARD_HAS_INPUT_GAIN
1021
1022/******************* Analog input volume *******************/
1023static int snd_echo_input_gain_info(struct snd_kcontrol *kcontrol,
1024 struct snd_ctl_elem_info *uinfo)
1025{
1026 struct echoaudio *chip;
1027
1028 chip = snd_kcontrol_chip(kcontrol);
1029 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1030 uinfo->count = num_analog_busses_in(chip);
1031 uinfo->value.integer.min = ECHOGAIN_MININP;
1032 uinfo->value.integer.max = ECHOGAIN_MAXINP;
1033 return 0;
1034}
1035
1036static int snd_echo_input_gain_get(struct snd_kcontrol *kcontrol,
1037 struct snd_ctl_elem_value *ucontrol)
1038{
1039 struct echoaudio *chip;
1040 int c;
1041
1042 chip = snd_kcontrol_chip(kcontrol);
1043 for (c = 0; c < num_analog_busses_in(chip); c++)
1044 ucontrol->value.integer.value[c] = chip->input_gain[c];
1045 return 0;
1046}
1047
1048static int snd_echo_input_gain_put(struct snd_kcontrol *kcontrol,
1049 struct snd_ctl_elem_value *ucontrol)
1050{
1051 struct echoaudio *chip;
1052 int c, gain, changed;
1053
1054 changed = 0;
1055 chip = snd_kcontrol_chip(kcontrol);
1056 spin_lock_irq(&chip->lock);
1057 for (c = 0; c < num_analog_busses_in(chip); c++) {
1058 gain = ucontrol->value.integer.value[c];
1059 /* Ignore out of range values */
1060 if (gain < ECHOGAIN_MININP || gain > ECHOGAIN_MAXINP)
1061 continue;
1062 if (chip->input_gain[c] != gain) {
1063 set_input_gain(chip, c, gain);
1064 changed = 1;
1065 }
1066 }
1067 if (changed)
1068 update_input_line_level(chip);
1069 spin_unlock_irq(&chip->lock);
1070 return changed;
1071}
1072
Takashi Iwai0cb29ea2007-01-29 15:33:49 +01001073static const DECLARE_TLV_DB_SCALE(db_scale_input_gain, -2500, 50, 0);
Giuliano Pochini048b9452006-11-24 13:03:58 +01001074
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001075static struct snd_kcontrol_new snd_echo_line_input_gain __devinitdata = {
1076 .name = "Line Capture Volume",
1077 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001078 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001079 .info = snd_echo_input_gain_info,
1080 .get = snd_echo_input_gain_get,
1081 .put = snd_echo_input_gain_put,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001082 .tlv = {.p = db_scale_input_gain},
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001083};
1084
1085#endif /* ECHOCARD_HAS_INPUT_GAIN */
1086
1087
1088
1089#ifdef ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL
1090
1091/************ Analog output nominal level (+4dBu / -10dBV) ***************/
1092static int snd_echo_output_nominal_info (struct snd_kcontrol *kcontrol,
1093 struct snd_ctl_elem_info *uinfo)
1094{
1095 struct echoaudio *chip;
1096
1097 chip = snd_kcontrol_chip(kcontrol);
1098 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1099 uinfo->count = num_analog_busses_out(chip);
1100 uinfo->value.integer.min = 0;
1101 uinfo->value.integer.max = 1;
1102 return 0;
1103}
1104
1105static int snd_echo_output_nominal_get(struct snd_kcontrol *kcontrol,
1106 struct snd_ctl_elem_value *ucontrol)
1107{
1108 struct echoaudio *chip;
1109 int c;
1110
1111 chip = snd_kcontrol_chip(kcontrol);
1112 for (c = 0; c < num_analog_busses_out(chip); c++)
1113 ucontrol->value.integer.value[c] = chip->nominal_level[c];
1114 return 0;
1115}
1116
1117static int snd_echo_output_nominal_put(struct snd_kcontrol *kcontrol,
1118 struct snd_ctl_elem_value *ucontrol)
1119{
1120 struct echoaudio *chip;
1121 int c, changed;
1122
1123 changed = 0;
1124 chip = snd_kcontrol_chip(kcontrol);
1125 spin_lock_irq(&chip->lock);
1126 for (c = 0; c < num_analog_busses_out(chip); c++) {
1127 if (chip->nominal_level[c] != ucontrol->value.integer.value[c]) {
1128 set_nominal_level(chip, c,
1129 ucontrol->value.integer.value[c]);
1130 changed = 1;
1131 }
1132 }
1133 if (changed)
1134 update_output_line_level(chip);
1135 spin_unlock_irq(&chip->lock);
1136 return changed;
1137}
1138
1139static struct snd_kcontrol_new snd_echo_output_nominal_level __devinitdata = {
1140 .name = "Line Playback Switch (-10dBV)",
1141 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1142 .info = snd_echo_output_nominal_info,
1143 .get = snd_echo_output_nominal_get,
1144 .put = snd_echo_output_nominal_put,
1145};
1146
1147#endif /* ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL */
1148
1149
1150
1151#ifdef ECHOCARD_HAS_INPUT_NOMINAL_LEVEL
1152
1153/*************** Analog input nominal level (+4dBu / -10dBV) ***************/
1154static int snd_echo_input_nominal_info(struct snd_kcontrol *kcontrol,
1155 struct snd_ctl_elem_info *uinfo)
1156{
1157 struct echoaudio *chip;
1158
1159 chip = snd_kcontrol_chip(kcontrol);
1160 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1161 uinfo->count = num_analog_busses_in(chip);
1162 uinfo->value.integer.min = 0;
1163 uinfo->value.integer.max = 1;
1164 return 0;
1165}
1166
1167static int snd_echo_input_nominal_get(struct snd_kcontrol *kcontrol,
1168 struct snd_ctl_elem_value *ucontrol)
1169{
1170 struct echoaudio *chip;
1171 int c;
1172
1173 chip = snd_kcontrol_chip(kcontrol);
1174 for (c = 0; c < num_analog_busses_in(chip); c++)
1175 ucontrol->value.integer.value[c] =
1176 chip->nominal_level[bx_analog_in(chip) + c];
1177 return 0;
1178}
1179
1180static int snd_echo_input_nominal_put(struct snd_kcontrol *kcontrol,
1181 struct snd_ctl_elem_value *ucontrol)
1182{
1183 struct echoaudio *chip;
1184 int c, changed;
1185
1186 changed = 0;
1187 chip = snd_kcontrol_chip(kcontrol);
1188 spin_lock_irq(&chip->lock);
1189 for (c = 0; c < num_analog_busses_in(chip); c++) {
1190 if (chip->nominal_level[bx_analog_in(chip) + c] !=
1191 ucontrol->value.integer.value[c]) {
1192 set_nominal_level(chip, bx_analog_in(chip) + c,
1193 ucontrol->value.integer.value[c]);
1194 changed = 1;
1195 }
1196 }
1197 if (changed)
1198 update_output_line_level(chip); /* "Output" is not a mistake
1199 * here.
1200 */
1201 spin_unlock_irq(&chip->lock);
1202 return changed;
1203}
1204
1205static struct snd_kcontrol_new snd_echo_intput_nominal_level __devinitdata = {
1206 .name = "Line Capture Switch (-10dBV)",
1207 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1208 .info = snd_echo_input_nominal_info,
1209 .get = snd_echo_input_nominal_get,
1210 .put = snd_echo_input_nominal_put,
1211};
1212
1213#endif /* ECHOCARD_HAS_INPUT_NOMINAL_LEVEL */
1214
1215
1216
1217#ifdef ECHOCARD_HAS_MONITOR
1218
1219/******************* Monitor mixer *******************/
1220static int snd_echo_mixer_info(struct snd_kcontrol *kcontrol,
1221 struct snd_ctl_elem_info *uinfo)
1222{
1223 struct echoaudio *chip;
1224
1225 chip = snd_kcontrol_chip(kcontrol);
1226 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1227 uinfo->count = 1;
1228 uinfo->value.integer.min = ECHOGAIN_MINOUT;
1229 uinfo->value.integer.max = ECHOGAIN_MAXOUT;
1230 uinfo->dimen.d[0] = num_busses_out(chip);
1231 uinfo->dimen.d[1] = num_busses_in(chip);
1232 return 0;
1233}
1234
1235static int snd_echo_mixer_get(struct snd_kcontrol *kcontrol,
1236 struct snd_ctl_elem_value *ucontrol)
1237{
1238 struct echoaudio *chip;
1239
1240 chip = snd_kcontrol_chip(kcontrol);
1241 ucontrol->value.integer.value[0] =
1242 chip->monitor_gain[ucontrol->id.index / num_busses_in(chip)]
1243 [ucontrol->id.index % num_busses_in(chip)];
1244 return 0;
1245}
1246
1247static int snd_echo_mixer_put(struct snd_kcontrol *kcontrol,
1248 struct snd_ctl_elem_value *ucontrol)
1249{
1250 struct echoaudio *chip;
1251 int changed, gain;
1252 short out, in;
1253
1254 changed = 0;
1255 chip = snd_kcontrol_chip(kcontrol);
1256 out = ucontrol->id.index / num_busses_in(chip);
1257 in = ucontrol->id.index % num_busses_in(chip);
1258 gain = ucontrol->value.integer.value[0];
1259 if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)
1260 return -EINVAL;
1261 if (chip->monitor_gain[out][in] != gain) {
1262 spin_lock_irq(&chip->lock);
1263 set_monitor_gain(chip, out, in, gain);
1264 update_output_line_level(chip);
1265 spin_unlock_irq(&chip->lock);
1266 changed = 1;
1267 }
1268 return changed;
1269}
1270
1271static struct snd_kcontrol_new snd_echo_monitor_mixer __devinitdata = {
1272 .name = "Monitor Mixer Volume",
1273 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001274 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001275 .info = snd_echo_mixer_info,
1276 .get = snd_echo_mixer_get,
1277 .put = snd_echo_mixer_put,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001278 .tlv = {.p = db_scale_output_gain},
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001279};
1280
1281#endif /* ECHOCARD_HAS_MONITOR */
1282
1283
1284
1285#ifdef ECHOCARD_HAS_VMIXER
1286
1287/******************* Vmixer *******************/
1288static int snd_echo_vmixer_info(struct snd_kcontrol *kcontrol,
1289 struct snd_ctl_elem_info *uinfo)
1290{
1291 struct echoaudio *chip;
1292
1293 chip = snd_kcontrol_chip(kcontrol);
1294 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1295 uinfo->count = 1;
1296 uinfo->value.integer.min = ECHOGAIN_MINOUT;
1297 uinfo->value.integer.max = ECHOGAIN_MAXOUT;
1298 uinfo->dimen.d[0] = num_busses_out(chip);
1299 uinfo->dimen.d[1] = num_pipes_out(chip);
1300 return 0;
1301}
1302
1303static int snd_echo_vmixer_get(struct snd_kcontrol *kcontrol,
1304 struct snd_ctl_elem_value *ucontrol)
1305{
1306 struct echoaudio *chip;
1307
1308 chip = snd_kcontrol_chip(kcontrol);
1309 ucontrol->value.integer.value[0] =
1310 chip->vmixer_gain[ucontrol->id.index / num_pipes_out(chip)]
1311 [ucontrol->id.index % num_pipes_out(chip)];
1312 return 0;
1313}
1314
1315static int snd_echo_vmixer_put(struct snd_kcontrol *kcontrol,
1316 struct snd_ctl_elem_value *ucontrol)
1317{
1318 struct echoaudio *chip;
1319 int gain, changed;
1320 short vch, out;
1321
1322 changed = 0;
1323 chip = snd_kcontrol_chip(kcontrol);
1324 out = ucontrol->id.index / num_pipes_out(chip);
1325 vch = ucontrol->id.index % num_pipes_out(chip);
1326 gain = ucontrol->value.integer.value[0];
1327 if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)
1328 return -EINVAL;
1329 if (chip->vmixer_gain[out][vch] != ucontrol->value.integer.value[0]) {
1330 spin_lock_irq(&chip->lock);
1331 set_vmixer_gain(chip, out, vch, ucontrol->value.integer.value[0]);
1332 update_vmixer_level(chip);
1333 spin_unlock_irq(&chip->lock);
1334 changed = 1;
1335 }
1336 return changed;
1337}
1338
1339static struct snd_kcontrol_new snd_echo_vmixer __devinitdata = {
1340 .name = "VMixer Volume",
1341 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001342 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001343 .info = snd_echo_vmixer_info,
1344 .get = snd_echo_vmixer_get,
1345 .put = snd_echo_vmixer_put,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001346 .tlv = {.p = db_scale_output_gain},
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001347};
1348
1349#endif /* ECHOCARD_HAS_VMIXER */
1350
1351
1352
1353#ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH
1354
1355/******************* Digital mode switch *******************/
1356static int snd_echo_digital_mode_info(struct snd_kcontrol *kcontrol,
1357 struct snd_ctl_elem_info *uinfo)
1358{
1359 static char *names[4] = {
1360 "S/PDIF Coaxial", "S/PDIF Optical", "ADAT Optical",
1361 "S/PDIF Cdrom"
1362 };
1363 struct echoaudio *chip;
1364
1365 chip = snd_kcontrol_chip(kcontrol);
1366 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1367 uinfo->value.enumerated.items = chip->num_digital_modes;
1368 uinfo->count = 1;
1369 if (uinfo->value.enumerated.item >= chip->num_digital_modes)
1370 uinfo->value.enumerated.item = chip->num_digital_modes - 1;
1371 strcpy(uinfo->value.enumerated.name, names[
1372 chip->digital_mode_list[uinfo->value.enumerated.item]]);
1373 return 0;
1374}
1375
1376static int snd_echo_digital_mode_get(struct snd_kcontrol *kcontrol,
1377 struct snd_ctl_elem_value *ucontrol)
1378{
1379 struct echoaudio *chip;
1380 int i, mode;
1381
1382 chip = snd_kcontrol_chip(kcontrol);
1383 mode = chip->digital_mode;
1384 for (i = chip->num_digital_modes - 1; i >= 0; i--)
1385 if (mode == chip->digital_mode_list[i]) {
1386 ucontrol->value.enumerated.item[0] = i;
1387 break;
1388 }
1389 return 0;
1390}
1391
1392static int snd_echo_digital_mode_put(struct snd_kcontrol *kcontrol,
1393 struct snd_ctl_elem_value *ucontrol)
1394{
1395 struct echoaudio *chip;
1396 int changed;
1397 unsigned short emode, dmode;
1398
1399 changed = 0;
1400 chip = snd_kcontrol_chip(kcontrol);
1401
1402 emode = ucontrol->value.enumerated.item[0];
1403 if (emode >= chip->num_digital_modes)
1404 return -EINVAL;
1405 dmode = chip->digital_mode_list[emode];
1406
1407 if (dmode != chip->digital_mode) {
1408 /* mode_mutex is required to make this operation atomic wrt
1409 pcm_digital_*_open() and set_input_clock() functions. */
Takashi Iwaibefceea2007-12-03 17:08:40 +01001410 mutex_lock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001411
1412 /* Do not allow the user to change the digital mode when a pcm
1413 device is open because it also changes the number of channels
1414 and the allowed sample rates */
1415 if (atomic_read(&chip->opencount)) {
1416 changed = -EAGAIN;
1417 } else {
1418 changed = set_digital_mode(chip, dmode);
1419 /* If we had to change the clock source, report it */
1420 if (changed > 0 && chip->clock_src_ctl) {
1421 snd_ctl_notify(chip->card,
1422 SNDRV_CTL_EVENT_MASK_VALUE,
1423 &chip->clock_src_ctl->id);
1424 DE_ACT(("SDM() =%d\n", changed));
1425 }
1426 if (changed >= 0)
1427 changed = 1; /* No errors */
1428 }
Takashi Iwaibefceea2007-12-03 17:08:40 +01001429 mutex_unlock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001430 }
1431 return changed;
1432}
1433
1434static struct snd_kcontrol_new snd_echo_digital_mode_switch __devinitdata = {
1435 .name = "Digital mode Switch",
1436 .iface = SNDRV_CTL_ELEM_IFACE_CARD,
1437 .info = snd_echo_digital_mode_info,
1438 .get = snd_echo_digital_mode_get,
1439 .put = snd_echo_digital_mode_put,
1440};
1441
1442#endif /* ECHOCARD_HAS_DIGITAL_MODE_SWITCH */
1443
1444
1445
1446#ifdef ECHOCARD_HAS_DIGITAL_IO
1447
1448/******************* S/PDIF mode switch *******************/
1449static int snd_echo_spdif_mode_info(struct snd_kcontrol *kcontrol,
1450 struct snd_ctl_elem_info *uinfo)
1451{
1452 static char *names[2] = {"Consumer", "Professional"};
1453
1454 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1455 uinfo->value.enumerated.items = 2;
1456 uinfo->count = 1;
1457 if (uinfo->value.enumerated.item)
1458 uinfo->value.enumerated.item = 1;
1459 strcpy(uinfo->value.enumerated.name,
1460 names[uinfo->value.enumerated.item]);
1461 return 0;
1462}
1463
1464static int snd_echo_spdif_mode_get(struct snd_kcontrol *kcontrol,
1465 struct snd_ctl_elem_value *ucontrol)
1466{
1467 struct echoaudio *chip;
1468
1469 chip = snd_kcontrol_chip(kcontrol);
1470 ucontrol->value.enumerated.item[0] = !!chip->professional_spdif;
1471 return 0;
1472}
1473
1474static int snd_echo_spdif_mode_put(struct snd_kcontrol *kcontrol,
1475 struct snd_ctl_elem_value *ucontrol)
1476{
1477 struct echoaudio *chip;
1478 int mode;
1479
1480 chip = snd_kcontrol_chip(kcontrol);
1481 mode = !!ucontrol->value.enumerated.item[0];
1482 if (mode != chip->professional_spdif) {
1483 spin_lock_irq(&chip->lock);
1484 set_professional_spdif(chip, mode);
1485 spin_unlock_irq(&chip->lock);
1486 return 1;
1487 }
1488 return 0;
1489}
1490
1491static struct snd_kcontrol_new snd_echo_spdif_mode_switch __devinitdata = {
1492 .name = "S/PDIF mode Switch",
1493 .iface = SNDRV_CTL_ELEM_IFACE_CARD,
1494 .info = snd_echo_spdif_mode_info,
1495 .get = snd_echo_spdif_mode_get,
1496 .put = snd_echo_spdif_mode_put,
1497};
1498
1499#endif /* ECHOCARD_HAS_DIGITAL_IO */
1500
1501
1502
1503#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK
1504
1505/******************* Select input clock source *******************/
1506static int snd_echo_clock_source_info(struct snd_kcontrol *kcontrol,
1507 struct snd_ctl_elem_info *uinfo)
1508{
1509 static char *names[8] = {
1510 "Internal", "Word", "Super", "S/PDIF", "ADAT", "ESync",
1511 "ESync96", "MTC"
1512 };
1513 struct echoaudio *chip;
1514
1515 chip = snd_kcontrol_chip(kcontrol);
1516 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1517 uinfo->value.enumerated.items = chip->num_clock_sources;
1518 uinfo->count = 1;
1519 if (uinfo->value.enumerated.item >= chip->num_clock_sources)
1520 uinfo->value.enumerated.item = chip->num_clock_sources - 1;
1521 strcpy(uinfo->value.enumerated.name, names[
1522 chip->clock_source_list[uinfo->value.enumerated.item]]);
1523 return 0;
1524}
1525
1526static int snd_echo_clock_source_get(struct snd_kcontrol *kcontrol,
1527 struct snd_ctl_elem_value *ucontrol)
1528{
1529 struct echoaudio *chip;
1530 int i, clock;
1531
1532 chip = snd_kcontrol_chip(kcontrol);
1533 clock = chip->input_clock;
1534
1535 for (i = 0; i < chip->num_clock_sources; i++)
1536 if (clock == chip->clock_source_list[i])
1537 ucontrol->value.enumerated.item[0] = i;
1538
1539 return 0;
1540}
1541
1542static int snd_echo_clock_source_put(struct snd_kcontrol *kcontrol,
1543 struct snd_ctl_elem_value *ucontrol)
1544{
1545 struct echoaudio *chip;
1546 int changed;
1547 unsigned int eclock, dclock;
1548
1549 changed = 0;
1550 chip = snd_kcontrol_chip(kcontrol);
1551 eclock = ucontrol->value.enumerated.item[0];
1552 if (eclock >= chip->input_clock_types)
1553 return -EINVAL;
1554 dclock = chip->clock_source_list[eclock];
1555 if (chip->input_clock != dclock) {
Takashi Iwaibefceea2007-12-03 17:08:40 +01001556 mutex_lock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001557 spin_lock_irq(&chip->lock);
1558 if ((changed = set_input_clock(chip, dclock)) == 0)
1559 changed = 1; /* no errors */
1560 spin_unlock_irq(&chip->lock);
Takashi Iwaibefceea2007-12-03 17:08:40 +01001561 mutex_unlock(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001562 }
1563
1564 if (changed < 0)
1565 DE_ACT(("seticlk val%d err 0x%x\n", dclock, changed));
1566
1567 return changed;
1568}
1569
1570static struct snd_kcontrol_new snd_echo_clock_source_switch __devinitdata = {
1571 .name = "Sample Clock Source",
1572 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1573 .info = snd_echo_clock_source_info,
1574 .get = snd_echo_clock_source_get,
1575 .put = snd_echo_clock_source_put,
1576};
1577
1578#endif /* ECHOCARD_HAS_EXTERNAL_CLOCK */
1579
1580
1581
1582#ifdef ECHOCARD_HAS_PHANTOM_POWER
1583
1584/******************* Phantom power switch *******************/
Takashi Iwaia5ce8892007-07-23 15:42:26 +02001585#define snd_echo_phantom_power_info snd_ctl_boolean_mono_info
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001586
1587static int snd_echo_phantom_power_get(struct snd_kcontrol *kcontrol,
1588 struct snd_ctl_elem_value *ucontrol)
1589{
1590 struct echoaudio *chip = snd_kcontrol_chip(kcontrol);
1591
1592 ucontrol->value.integer.value[0] = chip->phantom_power;
1593 return 0;
1594}
1595
1596static int snd_echo_phantom_power_put(struct snd_kcontrol *kcontrol,
1597 struct snd_ctl_elem_value *ucontrol)
1598{
1599 struct echoaudio *chip = snd_kcontrol_chip(kcontrol);
1600 int power, changed = 0;
1601
1602 power = !!ucontrol->value.integer.value[0];
1603 if (chip->phantom_power != power) {
1604 spin_lock_irq(&chip->lock);
1605 changed = set_phantom_power(chip, power);
1606 spin_unlock_irq(&chip->lock);
1607 if (changed == 0)
1608 changed = 1; /* no errors */
1609 }
1610 return changed;
1611}
1612
1613static struct snd_kcontrol_new snd_echo_phantom_power_switch __devinitdata = {
1614 .name = "Phantom power Switch",
1615 .iface = SNDRV_CTL_ELEM_IFACE_CARD,
1616 .info = snd_echo_phantom_power_info,
1617 .get = snd_echo_phantom_power_get,
1618 .put = snd_echo_phantom_power_put,
1619};
1620
1621#endif /* ECHOCARD_HAS_PHANTOM_POWER */
1622
1623
1624
1625#ifdef ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE
1626
1627/******************* Digital input automute switch *******************/
Takashi Iwaia5ce8892007-07-23 15:42:26 +02001628#define snd_echo_automute_info snd_ctl_boolean_mono_info
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001629
1630static int snd_echo_automute_get(struct snd_kcontrol *kcontrol,
1631 struct snd_ctl_elem_value *ucontrol)
1632{
1633 struct echoaudio *chip = snd_kcontrol_chip(kcontrol);
1634
1635 ucontrol->value.integer.value[0] = chip->digital_in_automute;
1636 return 0;
1637}
1638
1639static int snd_echo_automute_put(struct snd_kcontrol *kcontrol,
1640 struct snd_ctl_elem_value *ucontrol)
1641{
1642 struct echoaudio *chip = snd_kcontrol_chip(kcontrol);
1643 int automute, changed = 0;
1644
1645 automute = !!ucontrol->value.integer.value[0];
1646 if (chip->digital_in_automute != automute) {
1647 spin_lock_irq(&chip->lock);
1648 changed = set_input_auto_mute(chip, automute);
1649 spin_unlock_irq(&chip->lock);
1650 if (changed == 0)
1651 changed = 1; /* no errors */
1652 }
1653 return changed;
1654}
1655
1656static struct snd_kcontrol_new snd_echo_automute_switch __devinitdata = {
1657 .name = "Digital Capture Switch (automute)",
1658 .iface = SNDRV_CTL_ELEM_IFACE_CARD,
1659 .info = snd_echo_automute_info,
1660 .get = snd_echo_automute_get,
1661 .put = snd_echo_automute_put,
1662};
1663
1664#endif /* ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE */
1665
1666
1667
1668/******************* VU-meters switch *******************/
Takashi Iwaia5ce8892007-07-23 15:42:26 +02001669#define snd_echo_vumeters_switch_info snd_ctl_boolean_mono_info
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001670
1671static int snd_echo_vumeters_switch_put(struct snd_kcontrol *kcontrol,
1672 struct snd_ctl_elem_value *ucontrol)
1673{
1674 struct echoaudio *chip;
1675
1676 chip = snd_kcontrol_chip(kcontrol);
1677 spin_lock_irq(&chip->lock);
1678 set_meters_on(chip, ucontrol->value.integer.value[0]);
1679 spin_unlock_irq(&chip->lock);
1680 return 1;
1681}
1682
1683static struct snd_kcontrol_new snd_echo_vumeters_switch __devinitdata = {
1684 .name = "VU-meters Switch",
1685 .iface = SNDRV_CTL_ELEM_IFACE_CARD,
1686 .access = SNDRV_CTL_ELEM_ACCESS_WRITE,
1687 .info = snd_echo_vumeters_switch_info,
1688 .put = snd_echo_vumeters_switch_put,
1689};
1690
1691
1692
1693/***** Read VU-meters (input, output, analog and digital together) *****/
1694static int snd_echo_vumeters_info(struct snd_kcontrol *kcontrol,
1695 struct snd_ctl_elem_info *uinfo)
1696{
1697 struct echoaudio *chip;
1698
1699 chip = snd_kcontrol_chip(kcontrol);
1700 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1701 uinfo->count = 96;
1702 uinfo->value.integer.min = ECHOGAIN_MINOUT;
1703 uinfo->value.integer.max = 0;
1704#ifdef ECHOCARD_HAS_VMIXER
1705 uinfo->dimen.d[0] = 3; /* Out, In, Virt */
1706#else
1707 uinfo->dimen.d[0] = 2; /* Out, In */
1708#endif
1709 uinfo->dimen.d[1] = 16; /* 16 channels */
1710 uinfo->dimen.d[2] = 2; /* 0=level, 1=peak */
1711 return 0;
1712}
1713
1714static int snd_echo_vumeters_get(struct snd_kcontrol *kcontrol,
1715 struct snd_ctl_elem_value *ucontrol)
1716{
1717 struct echoaudio *chip;
1718
1719 chip = snd_kcontrol_chip(kcontrol);
1720 get_audio_meters(chip, ucontrol->value.integer.value);
1721 return 0;
1722}
1723
1724static struct snd_kcontrol_new snd_echo_vumeters __devinitdata = {
1725 .name = "VU-meters",
1726 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001727 .access = SNDRV_CTL_ELEM_ACCESS_READ |
1728 SNDRV_CTL_ELEM_ACCESS_VOLATILE |
1729 SNDRV_CTL_ELEM_ACCESS_TLV_READ,
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001730 .info = snd_echo_vumeters_info,
1731 .get = snd_echo_vumeters_get,
Giuliano Pochini048b9452006-11-24 13:03:58 +01001732 .tlv = {.p = db_scale_output_gain},
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001733};
1734
1735
1736
1737/*** Channels info - it exports informations about the number of channels ***/
1738static int snd_echo_channels_info_info(struct snd_kcontrol *kcontrol,
1739 struct snd_ctl_elem_info *uinfo)
1740{
1741 struct echoaudio *chip;
1742
1743 chip = snd_kcontrol_chip(kcontrol);
1744 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1745 uinfo->count = 6;
1746 uinfo->value.integer.min = 0;
1747 uinfo->value.integer.max = 1 << ECHO_CLOCK_NUMBER;
1748 return 0;
1749}
1750
1751static int snd_echo_channels_info_get(struct snd_kcontrol *kcontrol,
1752 struct snd_ctl_elem_value *ucontrol)
1753{
1754 struct echoaudio *chip;
1755 int detected, clocks, bit, src;
1756
1757 chip = snd_kcontrol_chip(kcontrol);
1758 ucontrol->value.integer.value[0] = num_busses_in(chip);
1759 ucontrol->value.integer.value[1] = num_analog_busses_in(chip);
1760 ucontrol->value.integer.value[2] = num_busses_out(chip);
1761 ucontrol->value.integer.value[3] = num_analog_busses_out(chip);
1762 ucontrol->value.integer.value[4] = num_pipes_out(chip);
1763
1764 /* Compute the bitmask of the currently valid input clocks */
1765 detected = detect_input_clocks(chip);
1766 clocks = 0;
1767 src = chip->num_clock_sources - 1;
1768 for (bit = ECHO_CLOCK_NUMBER - 1; bit >= 0; bit--)
1769 if (detected & (1 << bit))
1770 for (; src >= 0; src--)
1771 if (bit == chip->clock_source_list[src]) {
1772 clocks |= 1 << src;
1773 break;
1774 }
1775 ucontrol->value.integer.value[5] = clocks;
1776
1777 return 0;
1778}
1779
1780static struct snd_kcontrol_new snd_echo_channels_info __devinitdata = {
1781 .name = "Channels info",
1782 .iface = SNDRV_CTL_ELEM_IFACE_HWDEP,
1783 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
1784 .info = snd_echo_channels_info_info,
1785 .get = snd_echo_channels_info_get,
1786};
1787
1788
1789
1790
1791/******************************************************************************
1792 IRQ Handler
1793******************************************************************************/
1794
David Howells7d12e782006-10-05 14:55:46 +01001795static irqreturn_t snd_echo_interrupt(int irq, void *dev_id)
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001796{
1797 struct echoaudio *chip = dev_id;
1798 struct snd_pcm_substream *substream;
1799 int period, ss, st;
1800
1801 spin_lock(&chip->lock);
1802 st = service_irq(chip);
1803 if (st < 0) {
1804 spin_unlock(&chip->lock);
1805 return IRQ_NONE;
1806 }
1807 /* The hardware doesn't tell us which substream caused the irq,
1808 thus we have to check all running substreams. */
1809 for (ss = 0; ss < DSP_MAXPIPES; ss++) {
1810 if ((substream = chip->substream[ss])) {
1811 period = pcm_pointer(substream) /
1812 substream->runtime->period_size;
1813 if (period != chip->last_period[ss]) {
1814 chip->last_period[ss] = period;
1815 spin_unlock(&chip->lock);
1816 snd_pcm_period_elapsed(substream);
1817 spin_lock(&chip->lock);
1818 }
1819 }
1820 }
1821 spin_unlock(&chip->lock);
1822
1823#ifdef ECHOCARD_HAS_MIDI
1824 if (st > 0 && chip->midi_in) {
1825 snd_rawmidi_receive(chip->midi_in, chip->midi_buffer, st);
1826 DE_MID(("rawmidi_iread=%d\n", st));
1827 }
1828#endif
1829 return IRQ_HANDLED;
1830}
1831
1832
1833
1834
1835/******************************************************************************
1836 Module construction / destruction
1837******************************************************************************/
1838
1839static int snd_echo_free(struct echoaudio *chip)
1840{
1841 DE_INIT(("Stop DSP...\n"));
Takashi Iwaiebf029d2008-04-22 17:28:11 +02001842 if (chip->comm_page)
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001843 rest_in_peace(chip);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001844 DE_INIT(("Stopped.\n"));
1845
1846 if (chip->irq >= 0)
Takashi Iwai437a5a42006-11-21 12:14:23 +01001847 free_irq(chip->irq, chip);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001848
Takashi Iwaiebf029d2008-04-22 17:28:11 +02001849 if (chip->comm_page)
1850 snd_dma_free_pages(&chip->commpage_dma_buf);
1851
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001852 if (chip->dsp_registers)
1853 iounmap(chip->dsp_registers);
1854
Takashi Iwai8caf7aa2006-06-28 16:39:36 +02001855 if (chip->iores)
1856 release_and_free_resource(chip->iores);
1857
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001858 DE_INIT(("MMIO freed.\n"));
1859
1860 pci_disable_device(chip->pci);
1861
1862 /* release chip data */
1863 kfree(chip);
1864 DE_INIT(("Chip freed.\n"));
1865 return 0;
1866}
1867
1868
1869
1870static int snd_echo_dev_free(struct snd_device *device)
1871{
1872 struct echoaudio *chip = device->device_data;
1873
1874 DE_INIT(("snd_echo_dev_free()...\n"));
1875 return snd_echo_free(chip);
1876}
1877
1878
1879
1880/* <--snd_echo_probe() */
1881static __devinit int snd_echo_create(struct snd_card *card,
1882 struct pci_dev *pci,
1883 struct echoaudio **rchip)
1884{
1885 struct echoaudio *chip;
1886 int err;
1887 size_t sz;
1888 static struct snd_device_ops ops = {
1889 .dev_free = snd_echo_dev_free,
1890 };
1891
1892 *rchip = NULL;
1893
1894 pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0xC0);
1895
1896 if ((err = pci_enable_device(pci)) < 0)
1897 return err;
1898 pci_set_master(pci);
1899
1900 /* allocate a chip-specific data */
1901 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1902 if (!chip) {
1903 pci_disable_device(pci);
1904 return -ENOMEM;
1905 }
1906 DE_INIT(("chip=%p\n", chip));
1907
1908 spin_lock_init(&chip->lock);
1909 chip->card = card;
1910 chip->pci = pci;
1911 chip->irq = -1;
1912
1913 /* PCI resource allocation */
1914 chip->dsp_registers_phys = pci_resource_start(pci, 0);
1915 sz = pci_resource_len(pci, 0);
1916 if (sz > PAGE_SIZE)
1917 sz = PAGE_SIZE; /* We map only the required part */
1918
1919 if ((chip->iores = request_mem_region(chip->dsp_registers_phys, sz,
1920 ECHOCARD_NAME)) == NULL) {
1921 snd_echo_free(chip);
1922 snd_printk(KERN_ERR "cannot get memory region\n");
1923 return -EBUSY;
1924 }
1925 chip->dsp_registers = (volatile u32 __iomem *)
1926 ioremap_nocache(chip->dsp_registers_phys, sz);
1927
Takashi Iwai437a5a42006-11-21 12:14:23 +01001928 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,
1929 ECHOCARD_NAME, chip)) {
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001930 snd_echo_free(chip);
1931 snd_printk(KERN_ERR "cannot grab irq\n");
1932 return -EBUSY;
1933 }
1934 chip->irq = pci->irq;
1935 DE_INIT(("pci=%p irq=%d subdev=%04x Init hardware...\n",
1936 chip->pci, chip->irq, chip->pci->subsystem_device));
1937
1938 /* Create the DSP comm page - this is the area of memory used for most
1939 of the communication with the DSP, which accesses it via bus mastering */
1940 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
1941 sizeof(struct comm_page),
1942 &chip->commpage_dma_buf) < 0) {
1943 snd_echo_free(chip);
1944 snd_printk(KERN_ERR "cannot allocate the comm page\n");
1945 return -ENOMEM;
1946 }
1947 chip->comm_page_phys = chip->commpage_dma_buf.addr;
1948 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf.area;
1949
1950 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);
1951 if (err) {
1952 DE_INIT(("init_hw err=%d\n", err));
1953 snd_echo_free(chip);
1954 return err;
1955 }
1956 DE_INIT(("Card init OK\n"));
1957
1958 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1959 snd_echo_free(chip);
1960 return err;
1961 }
1962 atomic_set(&chip->opencount, 0);
Takashi Iwaibefceea2007-12-03 17:08:40 +01001963 mutex_init(&chip->mode_mutex);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001964 chip->can_set_rate = 1;
1965 *rchip = chip;
1966 /* Init done ! */
1967 return 0;
1968}
1969
1970
1971
1972/* constructor */
1973static int __devinit snd_echo_probe(struct pci_dev *pci,
1974 const struct pci_device_id *pci_id)
1975{
1976 static int dev;
1977 struct snd_card *card;
1978 struct echoaudio *chip;
1979 char *dsp;
1980 int i, err;
1981
1982 if (dev >= SNDRV_CARDS)
1983 return -ENODEV;
1984 if (!enable[dev]) {
1985 dev++;
1986 return -ENOENT;
1987 }
1988
1989 DE_INIT(("Echoaudio driver starting...\n"));
1990 i = 0;
Takashi Iwaie58de7b2008-12-28 16:44:30 +01001991 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
1992 if (err < 0)
1993 return err;
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001994
Takashi Iwaic187c042007-02-19 15:27:33 +01001995 snd_card_set_dev(card, &pci->dev);
1996
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02001997 if ((err = snd_echo_create(card, pci, &chip)) < 0) {
1998 snd_card_free(card);
1999 return err;
2000 }
2001
2002 strcpy(card->driver, "Echo_" ECHOCARD_NAME);
2003 strcpy(card->shortname, chip->card_name);
2004
2005 dsp = "56301";
2006 if (pci_id->device == 0x3410)
2007 dsp = "56361";
2008
2009 sprintf(card->longname, "%s rev.%d (DSP%s) at 0x%lx irq %i",
2010 card->shortname, pci_id->subdevice & 0x000f, dsp,
2011 chip->dsp_registers_phys, chip->irq);
2012
2013 if ((err = snd_echo_new_pcm(chip)) < 0) {
2014 snd_printk(KERN_ERR "new pcm error %d\n", err);
2015 snd_card_free(card);
2016 return err;
2017 }
2018
2019#ifdef ECHOCARD_HAS_MIDI
2020 if (chip->has_midi) { /* Some Mia's do not have midi */
2021 if ((err = snd_echo_midi_create(card, chip)) < 0) {
2022 snd_printk(KERN_ERR "new midi error %d\n", err);
2023 snd_card_free(card);
2024 return err;
2025 }
2026 }
2027#endif
2028
2029#ifdef ECHOCARD_HAS_VMIXER
2030 snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip);
Giuliano Pochinidd7b2542006-06-28 13:53:41 +02002031 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0)
2032 goto ctl_error;
2033#else
2034 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_pcm_output_gain, chip))) < 0)
2035 goto ctl_error;
2036#endif
2037
2038#ifdef ECHOCARD_HAS_INPUT_GAIN
2039 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip))) < 0)
2040 goto ctl_error;
2041#endif
2042
2043#ifdef ECHOCARD_HAS_INPUT_NOMINAL_LEVEL
2044 if (!chip->hasnt_input_nominal_level)
2045 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip))) < 0)
2046 goto ctl_error;
2047#endif
2048
2049#ifdef ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL
2050 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip))) < 0)
2051 goto ctl_error;
2052#endif
2053
2054 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip))) < 0)
2055 goto ctl_error;
2056
2057 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip))) < 0)
2058 goto ctl_error;
2059
2060#ifdef ECHOCARD_HAS_MONITOR
2061 snd_echo_monitor_mixer.count = num_busses_in(chip) * num_busses_out(chip);
2062 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip))) < 0)
2063 goto ctl_error;
2064#endif
2065
2066#ifdef ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE
2067 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip))) < 0)
2068 goto ctl_error;
2069#endif
2070
2071 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip))) < 0)
2072 goto ctl_error;
2073
2074#ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH
2075 /* Creates a list of available digital modes */
2076 chip->num_digital_modes = 0;
2077 for (i = 0; i < 6; i++)
2078 if (chip->digital_modes & (1 << i))
2079 chip->digital_mode_list[chip->num_digital_modes++] = i;
2080
2081 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip))) < 0)
2082 goto ctl_error;
2083#endif /* ECHOCARD_HAS_DIGITAL_MODE_SWITCH */
2084
2085#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK
2086 /* Creates a list of available clock sources */
2087 chip->num_clock_sources = 0;
2088 for (i = 0; i < 10; i++)
2089 if (chip->input_clock_types & (1 << i))
2090 chip->clock_source_list[chip->num_clock_sources++] = i;
2091
2092 if (chip->num_clock_sources > 1) {
2093 chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip);
2094 if ((err = snd_ctl_add(chip->card, chip->clock_src_ctl)) < 0)
2095 goto ctl_error;
2096 }
2097#endif /* ECHOCARD_HAS_EXTERNAL_CLOCK */
2098
2099#ifdef ECHOCARD_HAS_DIGITAL_IO
2100 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip))) < 0)
2101 goto ctl_error;
2102#endif
2103
2104#ifdef ECHOCARD_HAS_PHANTOM_POWER
2105 if (chip->has_phantom_power)
2106 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip))) < 0)
2107 goto ctl_error;
2108#endif
2109
2110 if ((err = snd_card_register(card)) < 0) {
2111 snd_card_free(card);
2112 goto ctl_error;
2113 }
2114 snd_printk(KERN_INFO "Card registered: %s\n", card->longname);
2115
2116 pci_set_drvdata(pci, chip);
2117 dev++;
2118 return 0;
2119
2120ctl_error:
2121 snd_printk(KERN_ERR "new control error %d\n", err);
2122 snd_card_free(card);
2123 return err;
2124}
2125
2126
2127
2128static void __devexit snd_echo_remove(struct pci_dev *pci)
2129{
2130 struct echoaudio *chip;
2131
2132 chip = pci_get_drvdata(pci);
2133 if (chip)
2134 snd_card_free(chip->card);
2135 pci_set_drvdata(pci, NULL);
2136}
2137
2138
2139
2140/******************************************************************************
2141 Everything starts and ends here
2142******************************************************************************/
2143
2144/* pci_driver definition */
2145static struct pci_driver driver = {
2146 .name = "Echoaudio " ECHOCARD_NAME,
2147 .id_table = snd_echo_ids,
2148 .probe = snd_echo_probe,
2149 .remove = __devexit_p(snd_echo_remove),
2150};
2151
2152
2153
2154/* initialization of the module */
2155static int __init alsa_card_echo_init(void)
2156{
2157 return pci_register_driver(&driver);
2158}
2159
2160
2161
2162/* clean up the module */
2163static void __exit alsa_card_echo_exit(void)
2164{
2165 pci_unregister_driver(&driver);
2166}
2167
2168
2169module_init(alsa_card_echo_init)
2170module_exit(alsa_card_echo_exit)