Lines Matching +full:clock +full:- +full:output +full:- +full:names
3 * Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
39 static const DECLARE_TLV_DB_SCALE(db_scale_output_gain, -12800, 100, 1);
50 if (chip->fw_cache[fw_index]) { in get_firmware()
52 *fw_entry = chip->fw_cache[fw_index]; in get_firmware()
64 chip->fw_cache[fw_index] = *fw_entry; in get_firmware()
89 if (chip->fw_cache[i]) { in free_firmware_cache()
90 release_firmware(chip->fw_cache[i]); in free_firmware_cache()
106 struct audiopipe *pipe = runtime->private_data; in audiopipe_free()
108 if (pipe->sgpage.area) in audiopipe_free()
109 snd_dma_free_pages(&pipe->sgpage); in audiopipe_free()
127 if (c->min == 2) { in hw_rule_capture_format_by_channels()
133 if (c->min > 2) { in hw_rule_capture_format_by_channels()
154 if (f->bits[0] == SNDRV_PCM_FMTBIT_S32_BE) { in hw_rule_capture_channels_by_format()
165 if (f->bits[0] == SNDRV_PCM_FMTBIT_U8) { in hw_rule_capture_channels_by_format()
190 if (c->min > 2) { in hw_rule_playback_format_by_channels()
195 } else if (c->max == 1) in hw_rule_playback_format_by_channels()
199 else if (c->min == 2 && c->max == 2) in hw_rule_playback_format_by_channels()
223 fmask = f->bits[0] + ((u64)f->bits[1] << 32); in hw_rule_playback_channels_by_format()
255 struct echoaudio *chip = rule->private; in hw_rule_sample_rate()
258 if (!chip->can_set_rate) { in hw_rule_sample_rate()
260 fixed.min = fixed.max = chip->sample_rate; in hw_rule_sample_rate()
276 return -EAGAIN; in pcm_open()
279 runtime = substream->runtime; in pcm_open()
283 return -ENOMEM; in pcm_open()
284 pipe->index = -1; /* Not configured yet */ in pcm_open()
287 memcpy(&pipe->hw, &pcm_hardware_skel, sizeof(struct snd_pcm_hardware)); in pcm_open()
289 pipe->constr.list = channels_list; in pcm_open()
290 pipe->constr.mask = 0; in pcm_open()
292 pipe->constr.count = i; in pcm_open()
293 if (pipe->hw.channels_max > max_channels) in pcm_open()
294 pipe->hw.channels_max = max_channels; in pcm_open()
295 if (chip->digital_mode == DIGITAL_MODE_ADAT) { in pcm_open()
296 pipe->hw.rate_max = 48000; in pcm_open()
297 pipe->hw.rates &= SNDRV_PCM_RATE_8000_48000; in pcm_open()
300 runtime->hw = pipe->hw; in pcm_open()
301 runtime->private_data = pipe; in pcm_open()
302 runtime->private_free = audiopipe_free; in pcm_open()
308 &pipe->constr)) < 0) in pcm_open()
317 32-bytes-aligned. It's not a requirement, but it seems that IRQs are in pcm_open()
328 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_open()
331 SNDRV_PCM_HW_PARAM_RATE, -1)) < 0) in pcm_open()
334 /* Finally allocate a page for the scatter-gather list */ in pcm_open()
336 snd_dma_pci_data(chip->pci), in pcm_open()
337 PAGE_SIZE, &pipe->sgpage)) < 0) { in pcm_open()
338 DE_HWP(("s-g list allocation failed\n")); in pcm_open()
353 if ((err = pcm_open(substream, num_analog_busses_in(chip) - in pcm_analog_in_open()
354 substream->number)) < 0) in pcm_analog_in_open()
356 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
359 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0) in pcm_analog_in_open()
361 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
364 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0) in pcm_analog_in_open()
366 atomic_inc(&chip->opencount); in pcm_analog_in_open()
367 if (atomic_read(&chip->opencount) > 1 && chip->rate_set) in pcm_analog_in_open()
368 chip->can_set_rate=0; in pcm_analog_in_open()
370 chip->can_set_rate, atomic_read(&chip->opencount), in pcm_analog_in_open()
371 chip->sample_rate)); in pcm_analog_in_open()
388 if ((err = pcm_open(substream, max_channels - substream->number)) < 0) in pcm_analog_out_open()
390 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
394 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0) in pcm_analog_out_open()
396 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
400 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0) in pcm_analog_out_open()
402 atomic_inc(&chip->opencount); in pcm_analog_out_open()
403 if (atomic_read(&chip->opencount) > 1 && chip->rate_set) in pcm_analog_out_open()
404 chip->can_set_rate=0; in pcm_analog_out_open()
406 chip->can_set_rate, atomic_read(&chip->opencount), in pcm_analog_out_open()
407 chip->sample_rate)); in pcm_analog_out_open()
421 max_channels = num_digital_busses_in(chip) - substream->number; in pcm_digital_in_open()
422 mutex_lock(&chip->mode_mutex); in pcm_digital_in_open()
423 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_in_open()
428 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_in_open()
433 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
436 SNDRV_PCM_HW_PARAM_FORMAT, -1)) < 0) in pcm_digital_in_open()
438 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
441 SNDRV_PCM_HW_PARAM_CHANNELS, -1)) < 0) in pcm_digital_in_open()
444 atomic_inc(&chip->opencount); in pcm_digital_in_open()
445 if (atomic_read(&chip->opencount) > 1 && chip->rate_set) in pcm_digital_in_open()
446 chip->can_set_rate=0; in pcm_digital_in_open()
449 mutex_unlock(&chip->mode_mutex); in pcm_digital_in_open()
463 max_channels = num_digital_busses_out(chip) - substream->number; in pcm_digital_out_open()
464 mutex_lock(&chip->mode_mutex); in pcm_digital_out_open()
465 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_out_open()
470 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_out_open()
475 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
479 -1)) < 0) in pcm_digital_out_open()
481 if ((err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
485 -1)) < 0) in pcm_digital_out_open()
487 atomic_inc(&chip->opencount); in pcm_digital_out_open()
488 if (atomic_read(&chip->opencount) > 1 && chip->rate_set) in pcm_digital_out_open()
489 chip->can_set_rate=0; in pcm_digital_out_open()
491 mutex_unlock(&chip->mode_mutex); in pcm_digital_out_open()
511 atomic_dec(&chip->opencount); in pcm_close()
512 oc = atomic_read(&chip->opencount); in pcm_close()
514 chip->can_set_rate, chip->rate_set)); in pcm_close()
516 chip->can_set_rate = 1; in pcm_close()
518 chip->rate_set = 0; in pcm_close()
520 chip->can_set_rate,chip->rate_set)); in pcm_close()
527 /* Channel allocation and scatter-gather list setup */
537 pipe = (struct audiopipe *) substream->runtime->private_data; in init_engine()
542 spin_lock_irq(&chip->lock); in init_engine()
543 if (pipe->index >= 0) { in init_engine()
544 DE_HWP(("hwp_ie free(%d)\n", pipe->index)); in init_engine()
547 chip->substream[pipe->index] = NULL; in init_engine()
552 spin_unlock_irq(&chip->lock); in init_engine()
557 spin_unlock_irq(&chip->lock); in init_engine()
567 spin_lock_irq(&chip->lock); in init_engine()
569 spin_unlock_irq(&chip->lock); in init_engine()
570 pipe->index = -1; in init_engine()
580 rest = params_buffer_bytes(hw_params) - offs; in init_engine()
584 if (rest <= edge - offs) { in init_engine()
591 edge - offs); in init_engine()
592 rest -= edge - offs; in init_engine()
606 * initialized before chip->substream in init_engine()
608 chip->last_period[pipe_index] = 0; in init_engine()
609 pipe->last_counter = 0; in init_engine()
610 pipe->position = 0; in init_engine()
612 chip->substream[pipe_index] = substream; in init_engine()
613 chip->rate_set = 1; in init_engine()
614 spin_lock_irq(&chip->lock); in init_engine()
615 set_sample_rate(chip, hw_params->rate_num / hw_params->rate_den); in init_engine()
616 spin_unlock_irq(&chip->lock); in init_engine()
629 substream->number, params_channels(hw_params)); in pcm_analog_in_hw_params()
637 return init_engine(substream, hw_params, substream->number, in pcm_analog_out_hw_params()
651 substream->number, params_channels(hw_params)); in pcm_digital_in_hw_params()
663 substream->number, params_channels(hw_params)); in pcm_digital_out_hw_params()
677 pipe = (struct audiopipe *) substream->runtime->private_data; in pcm_hw_free()
679 spin_lock_irq(&chip->lock); in pcm_hw_free()
680 if (pipe->index >= 0) { in pcm_hw_free()
681 DE_HWP(("pcm_hw_free(%d)\n", pipe->index)); in pcm_hw_free()
683 chip->substream[pipe->index] = NULL; in pcm_hw_free()
684 pipe->index = -1; in pcm_hw_free()
686 spin_unlock_irq(&chip->lock); in pcm_hw_free()
698 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_prepare()
700 int pipe_index = ((struct audiopipe *)runtime->private_data)->index; in pcm_prepare()
703 runtime->rate, runtime->format, runtime->channels)); in pcm_prepare()
704 format.interleave = runtime->channels; in pcm_prepare()
707 switch (runtime->format) { in pcm_prepare()
724 runtime->format)); in pcm_prepare()
725 return -EINVAL; in pcm_prepare()
729 return -EINVAL; in pcm_prepare()
731 return -EINVAL; in pcm_prepare()
741 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_trigger()
742 struct audiopipe *pipe = runtime->private_data; in pcm_trigger()
749 if (s == chip->substream[i]) { in pcm_trigger()
756 spin_lock(&chip->lock); in pcm_trigger()
765 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
766 switch (pipe->state) { in pcm_trigger()
768 chip->last_period[i] = 0; in pcm_trigger()
769 pipe->last_counter = 0; in pcm_trigger()
770 pipe->position = 0; in pcm_trigger()
771 *pipe->dma_counter = 0; in pcm_trigger()
773 pipe->state = PIPE_STATE_STARTED; in pcm_trigger()
781 chip->pipe_cyclic_mask); in pcm_trigger()
789 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
790 pipe->state = PIPE_STATE_STOPPED; in pcm_trigger()
799 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
800 pipe->state = PIPE_STATE_PAUSED; in pcm_trigger()
806 err = -EINVAL; in pcm_trigger()
808 spin_unlock(&chip->lock); in pcm_trigger()
816 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_pointer()
817 struct audiopipe *pipe = runtime->private_data; in pcm_pointer()
820 cnt = le32_to_cpu(*pipe->dma_counter); in pcm_pointer()
821 pipe->position += cnt - pipe->last_counter; in pcm_pointer()
822 pipe->last_counter = cnt; in pcm_pointer()
823 bufsize = substream->runtime->buffer_size; in pcm_pointer()
824 pos = bytes_to_frames(substream->runtime, pipe->position); in pcm_pointer()
827 pipe->position -= frames_to_bytes(substream->runtime, bufsize); in pcm_pointer()
828 pos -= bufsize; in pcm_pointer()
896 for (ss = pcm->streams[stream].substream; ss; ss = ss->next) { in snd_echo_preallocate_pages()
899 ss->number ? 0 : 128<<10, in snd_echo_preallocate_pages()
909 /*<--snd_echo_probe() */
919 output, thus it makes no sense to keep analog and digital outputs in snd_echo_new_pcm()
923 if ((err = snd_pcm_new(chip->card, "PCM", 0, num_pipes_out(chip), in snd_echo_new_pcm()
926 pcm->private_data = chip; in snd_echo_new_pcm()
927 chip->analog_pcm = pcm; in snd_echo_new_pcm()
928 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
931 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0) in snd_echo_new_pcm()
937 if ((err = snd_pcm_new(chip->card, "Digital PCM", 1, 0, in snd_echo_new_pcm()
940 pcm->private_data = chip; in snd_echo_new_pcm()
941 chip->digital_pcm = pcm; in snd_echo_new_pcm()
942 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
944 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0) in snd_echo_new_pcm()
957 if ((err = snd_pcm_new(chip->card, "Analog PCM", 0, in snd_echo_new_pcm()
961 pcm->private_data = chip; in snd_echo_new_pcm()
962 chip->analog_pcm = pcm; in snd_echo_new_pcm()
963 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
966 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0) in snd_echo_new_pcm()
972 if ((err = snd_pcm_new(chip->card, "Digital PCM", 1, in snd_echo_new_pcm()
976 pcm->private_data = chip; in snd_echo_new_pcm()
977 chip->digital_pcm = pcm; in snd_echo_new_pcm()
978 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
981 if ((err = snd_echo_preallocate_pages(pcm, snd_dma_pci_data(chip->pci))) < 0) in snd_echo_new_pcm()
1000 /******************* PCM output volume *******************/
1007 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_output_gain_info()
1008 uinfo->count = num_busses_out(chip); in snd_echo_output_gain_info()
1009 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_output_gain_info()
1010 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_output_gain_info()
1022 ucontrol->value.integer.value[c] = chip->output_gain[c]; in snd_echo_output_gain_get()
1034 spin_lock_irq(&chip->lock); in snd_echo_output_gain_put()
1036 gain = ucontrol->value.integer.value[c]; in snd_echo_output_gain_put()
1040 if (chip->output_gain[c] != gain) { in snd_echo_output_gain_put()
1047 spin_unlock_irq(&chip->lock); in snd_echo_output_gain_put()
1052 /* On the Mia this one controls the line-out volume */
1088 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_input_gain_info()
1089 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_gain_info()
1090 uinfo->value.integer.min = ECHOGAIN_MININP; in snd_echo_input_gain_info()
1091 uinfo->value.integer.max = ECHOGAIN_MAXINP; in snd_echo_input_gain_info()
1103 ucontrol->value.integer.value[c] = chip->input_gain[c]; in snd_echo_input_gain_get()
1115 spin_lock_irq(&chip->lock); in snd_echo_input_gain_put()
1117 gain = ucontrol->value.integer.value[c]; in snd_echo_input_gain_put()
1121 if (chip->input_gain[c] != gain) { in snd_echo_input_gain_put()
1128 spin_unlock_irq(&chip->lock); in snd_echo_input_gain_put()
1132 static const DECLARE_TLV_DB_SCALE(db_scale_input_gain, -2500, 50, 0);
1150 /************ Analog output nominal level (+4dBu / -10dBV) ***************/
1157 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_output_nominal_info()
1158 uinfo->count = num_analog_busses_out(chip); in snd_echo_output_nominal_info()
1159 uinfo->value.integer.min = 0; in snd_echo_output_nominal_info()
1160 uinfo->value.integer.max = 1; in snd_echo_output_nominal_info()
1172 ucontrol->value.integer.value[c] = chip->nominal_level[c]; in snd_echo_output_nominal_get()
1184 spin_lock_irq(&chip->lock); in snd_echo_output_nominal_put()
1186 if (chip->nominal_level[c] != ucontrol->value.integer.value[c]) { in snd_echo_output_nominal_put()
1188 ucontrol->value.integer.value[c]); in snd_echo_output_nominal_put()
1194 spin_unlock_irq(&chip->lock); in snd_echo_output_nominal_put()
1199 .name = "Line Playback Switch (-10dBV)",
1212 /*************** Analog input nominal level (+4dBu / -10dBV) ***************/
1219 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_input_nominal_info()
1220 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_nominal_info()
1221 uinfo->value.integer.min = 0; in snd_echo_input_nominal_info()
1222 uinfo->value.integer.max = 1; in snd_echo_input_nominal_info()
1234 ucontrol->value.integer.value[c] = in snd_echo_input_nominal_get()
1235 chip->nominal_level[bx_analog_in(chip) + c]; in snd_echo_input_nominal_get()
1247 spin_lock_irq(&chip->lock); in snd_echo_input_nominal_put()
1249 if (chip->nominal_level[bx_analog_in(chip) + c] != in snd_echo_input_nominal_put()
1250 ucontrol->value.integer.value[c]) { in snd_echo_input_nominal_put()
1252 ucontrol->value.integer.value[c]); in snd_echo_input_nominal_put()
1257 update_output_line_level(chip); /* "Output" is not a mistake in snd_echo_input_nominal_put()
1260 spin_unlock_irq(&chip->lock); in snd_echo_input_nominal_put()
1265 .name = "Line Capture Switch (-10dBV)",
1285 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_mixer_info()
1286 uinfo->count = 1; in snd_echo_mixer_info()
1287 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_mixer_info()
1288 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_mixer_info()
1289 uinfo->dimen.d[0] = num_busses_out(chip); in snd_echo_mixer_info()
1290 uinfo->dimen.d[1] = num_busses_in(chip); in snd_echo_mixer_info()
1300 ucontrol->value.integer.value[0] = in snd_echo_mixer_get()
1301 chip->monitor_gain[ucontrol->id.index / num_busses_in(chip)] in snd_echo_mixer_get()
1302 [ucontrol->id.index % num_busses_in(chip)]; in snd_echo_mixer_get()
1315 out = ucontrol->id.index / num_busses_in(chip); in snd_echo_mixer_put()
1316 in = ucontrol->id.index % num_busses_in(chip); in snd_echo_mixer_put()
1317 gain = ucontrol->value.integer.value[0]; in snd_echo_mixer_put()
1319 return -EINVAL; in snd_echo_mixer_put()
1320 if (chip->monitor_gain[out][in] != gain) { in snd_echo_mixer_put()
1321 spin_lock_irq(&chip->lock); in snd_echo_mixer_put()
1324 spin_unlock_irq(&chip->lock); in snd_echo_mixer_put()
1353 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vmixer_info()
1354 uinfo->count = 1; in snd_echo_vmixer_info()
1355 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vmixer_info()
1356 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_vmixer_info()
1357 uinfo->dimen.d[0] = num_busses_out(chip); in snd_echo_vmixer_info()
1358 uinfo->dimen.d[1] = num_pipes_out(chip); in snd_echo_vmixer_info()
1368 ucontrol->value.integer.value[0] = in snd_echo_vmixer_get()
1369 chip->vmixer_gain[ucontrol->id.index / num_pipes_out(chip)] in snd_echo_vmixer_get()
1370 [ucontrol->id.index % num_pipes_out(chip)]; in snd_echo_vmixer_get()
1383 out = ucontrol->id.index / num_pipes_out(chip); in snd_echo_vmixer_put()
1384 vch = ucontrol->id.index % num_pipes_out(chip); in snd_echo_vmixer_put()
1385 gain = ucontrol->value.integer.value[0]; in snd_echo_vmixer_put()
1387 return -EINVAL; in snd_echo_vmixer_put()
1388 if (chip->vmixer_gain[out][vch] != ucontrol->value.integer.value[0]) { in snd_echo_vmixer_put()
1389 spin_lock_irq(&chip->lock); in snd_echo_vmixer_put()
1390 set_vmixer_gain(chip, out, vch, ucontrol->value.integer.value[0]); in snd_echo_vmixer_put()
1392 spin_unlock_irq(&chip->lock); in snd_echo_vmixer_put()
1418 static char *names[4] = { in snd_echo_digital_mode_info() local
1425 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in snd_echo_digital_mode_info()
1426 uinfo->value.enumerated.items = chip->num_digital_modes; in snd_echo_digital_mode_info()
1427 uinfo->count = 1; in snd_echo_digital_mode_info()
1428 if (uinfo->value.enumerated.item >= chip->num_digital_modes) in snd_echo_digital_mode_info()
1429 uinfo->value.enumerated.item = chip->num_digital_modes - 1; in snd_echo_digital_mode_info()
1430 strcpy(uinfo->value.enumerated.name, names[ in snd_echo_digital_mode_info()
1431 chip->digital_mode_list[uinfo->value.enumerated.item]]); in snd_echo_digital_mode_info()
1442 mode = chip->digital_mode; in snd_echo_digital_mode_get()
1443 for (i = chip->num_digital_modes - 1; i >= 0; i--) in snd_echo_digital_mode_get()
1444 if (mode == chip->digital_mode_list[i]) { in snd_echo_digital_mode_get()
1445 ucontrol->value.enumerated.item[0] = i; in snd_echo_digital_mode_get()
1461 emode = ucontrol->value.enumerated.item[0]; in snd_echo_digital_mode_put()
1462 if (emode >= chip->num_digital_modes) in snd_echo_digital_mode_put()
1463 return -EINVAL; in snd_echo_digital_mode_put()
1464 dmode = chip->digital_mode_list[emode]; in snd_echo_digital_mode_put()
1466 if (dmode != chip->digital_mode) { in snd_echo_digital_mode_put()
1469 mutex_lock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1474 if (atomic_read(&chip->opencount)) { in snd_echo_digital_mode_put()
1475 changed = -EAGAIN; in snd_echo_digital_mode_put()
1478 /* If we had to change the clock source, report it */ in snd_echo_digital_mode_put()
1479 if (changed > 0 && chip->clock_src_ctl) { in snd_echo_digital_mode_put()
1480 snd_ctl_notify(chip->card, in snd_echo_digital_mode_put()
1482 &chip->clock_src_ctl->id); in snd_echo_digital_mode_put()
1488 mutex_unlock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1511 static char *names[2] = {"Consumer", "Professional"}; in snd_echo_spdif_mode_info() local
1513 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in snd_echo_spdif_mode_info()
1514 uinfo->value.enumerated.items = 2; in snd_echo_spdif_mode_info()
1515 uinfo->count = 1; in snd_echo_spdif_mode_info()
1516 if (uinfo->value.enumerated.item) in snd_echo_spdif_mode_info()
1517 uinfo->value.enumerated.item = 1; in snd_echo_spdif_mode_info()
1518 strcpy(uinfo->value.enumerated.name, in snd_echo_spdif_mode_info()
1519 names[uinfo->value.enumerated.item]); in snd_echo_spdif_mode_info()
1529 ucontrol->value.enumerated.item[0] = !!chip->professional_spdif; in snd_echo_spdif_mode_get()
1540 mode = !!ucontrol->value.enumerated.item[0]; in snd_echo_spdif_mode_put()
1541 if (mode != chip->professional_spdif) { in snd_echo_spdif_mode_put()
1542 spin_lock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1544 spin_unlock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1564 /******************* Select input clock source *******************/
1568 static char *names[8] = { in snd_echo_clock_source_info() local
1575 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in snd_echo_clock_source_info()
1576 uinfo->value.enumerated.items = chip->num_clock_sources; in snd_echo_clock_source_info()
1577 uinfo->count = 1; in snd_echo_clock_source_info()
1578 if (uinfo->value.enumerated.item >= chip->num_clock_sources) in snd_echo_clock_source_info()
1579 uinfo->value.enumerated.item = chip->num_clock_sources - 1; in snd_echo_clock_source_info()
1580 strcpy(uinfo->value.enumerated.name, names[ in snd_echo_clock_source_info()
1581 chip->clock_source_list[uinfo->value.enumerated.item]]); in snd_echo_clock_source_info()
1589 int i, clock; in snd_echo_clock_source_get() local
1592 clock = chip->input_clock; in snd_echo_clock_source_get()
1594 for (i = 0; i < chip->num_clock_sources; i++) in snd_echo_clock_source_get()
1595 if (clock == chip->clock_source_list[i]) in snd_echo_clock_source_get()
1596 ucontrol->value.enumerated.item[0] = i; in snd_echo_clock_source_get()
1610 eclock = ucontrol->value.enumerated.item[0]; in snd_echo_clock_source_put()
1611 if (eclock >= chip->input_clock_types) in snd_echo_clock_source_put()
1612 return -EINVAL; in snd_echo_clock_source_put()
1613 dclock = chip->clock_source_list[eclock]; in snd_echo_clock_source_put()
1614 if (chip->input_clock != dclock) { in snd_echo_clock_source_put()
1615 mutex_lock(&chip->mode_mutex); in snd_echo_clock_source_put()
1616 spin_lock_irq(&chip->lock); in snd_echo_clock_source_put()
1619 spin_unlock_irq(&chip->lock); in snd_echo_clock_source_put()
1620 mutex_unlock(&chip->mode_mutex); in snd_echo_clock_source_put()
1630 .name = "Sample Clock Source",
1651 ucontrol->value.integer.value[0] = chip->phantom_power; in snd_echo_phantom_power_get()
1661 power = !!ucontrol->value.integer.value[0]; in snd_echo_phantom_power_put()
1662 if (chip->phantom_power != power) { in snd_echo_phantom_power_put()
1663 spin_lock_irq(&chip->lock); in snd_echo_phantom_power_put()
1665 spin_unlock_irq(&chip->lock); in snd_echo_phantom_power_put()
1694 ucontrol->value.integer.value[0] = chip->digital_in_automute; in snd_echo_automute_get()
1704 automute = !!ucontrol->value.integer.value[0]; in snd_echo_automute_put()
1705 if (chip->digital_in_automute != automute) { in snd_echo_automute_put()
1706 spin_lock_irq(&chip->lock); in snd_echo_automute_put()
1708 spin_unlock_irq(&chip->lock); in snd_echo_automute_put()
1727 /******************* VU-meters switch *******************/
1736 spin_lock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1737 set_meters_on(chip, ucontrol->value.integer.value[0]); in snd_echo_vumeters_switch_put()
1738 spin_unlock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1743 .name = "VU-meters Switch",
1752 /***** Read VU-meters (input, output, analog and digital together) *****/
1759 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vumeters_info()
1760 uinfo->count = 96; in snd_echo_vumeters_info()
1761 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vumeters_info()
1762 uinfo->value.integer.max = 0; in snd_echo_vumeters_info()
1764 uinfo->dimen.d[0] = 3; /* Out, In, Virt */ in snd_echo_vumeters_info()
1766 uinfo->dimen.d[0] = 2; /* Out, In */ in snd_echo_vumeters_info()
1768 uinfo->dimen.d[1] = 16; /* 16 channels */ in snd_echo_vumeters_info()
1769 uinfo->dimen.d[2] = 2; /* 0=level, 1=peak */ in snd_echo_vumeters_info()
1779 get_audio_meters(chip, ucontrol->value.integer.value); in snd_echo_vumeters_get()
1784 .name = "VU-meters",
1796 /*** Channels info - it exports informations about the number of channels ***/
1803 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_channels_info_info()
1804 uinfo->count = 6; in snd_echo_channels_info_info()
1805 uinfo->value.integer.min = 0; in snd_echo_channels_info_info()
1806 uinfo->value.integer.max = 1 << ECHO_CLOCK_NUMBER; in snd_echo_channels_info_info()
1817 ucontrol->value.integer.value[0] = num_busses_in(chip); in snd_echo_channels_info_get()
1818 ucontrol->value.integer.value[1] = num_analog_busses_in(chip); in snd_echo_channels_info_get()
1819 ucontrol->value.integer.value[2] = num_busses_out(chip); in snd_echo_channels_info_get()
1820 ucontrol->value.integer.value[3] = num_analog_busses_out(chip); in snd_echo_channels_info_get()
1821 ucontrol->value.integer.value[4] = num_pipes_out(chip); in snd_echo_channels_info_get()
1826 src = chip->num_clock_sources - 1; in snd_echo_channels_info_get()
1827 for (bit = ECHO_CLOCK_NUMBER - 1; bit >= 0; bit--) in snd_echo_channels_info_get()
1829 for (; src >= 0; src--) in snd_echo_channels_info_get()
1830 if (bit == chip->clock_source_list[src]) { in snd_echo_channels_info_get()
1834 ucontrol->value.integer.value[5] = clocks; in snd_echo_channels_info_get()
1860 spin_lock(&chip->lock); in snd_echo_interrupt()
1863 spin_unlock(&chip->lock); in snd_echo_interrupt()
1869 substream = chip->substream[ss]; in snd_echo_interrupt()
1870 if (substream && ((struct audiopipe *)substream->runtime-> in snd_echo_interrupt()
1871 private_data)->state == PIPE_STATE_STARTED) { in snd_echo_interrupt()
1873 substream->runtime->period_size; in snd_echo_interrupt()
1874 if (period != chip->last_period[ss]) { in snd_echo_interrupt()
1875 chip->last_period[ss] = period; in snd_echo_interrupt()
1876 spin_unlock(&chip->lock); in snd_echo_interrupt()
1878 spin_lock(&chip->lock); in snd_echo_interrupt()
1882 spin_unlock(&chip->lock); in snd_echo_interrupt()
1885 if (st > 0 && chip->midi_in) { in snd_echo_interrupt()
1886 snd_rawmidi_receive(chip->midi_in, chip->midi_buffer, st); in snd_echo_interrupt()
1903 if (chip->comm_page) in snd_echo_free()
1907 if (chip->irq >= 0) in snd_echo_free()
1908 free_irq(chip->irq, chip); in snd_echo_free()
1910 if (chip->comm_page) in snd_echo_free()
1911 snd_dma_free_pages(&chip->commpage_dma_buf); in snd_echo_free()
1913 if (chip->dsp_registers) in snd_echo_free()
1914 iounmap(chip->dsp_registers); in snd_echo_free()
1916 if (chip->iores) in snd_echo_free()
1917 release_and_free_resource(chip->iores); in snd_echo_free()
1921 pci_disable_device(chip->pci); in snd_echo_free()
1934 struct echoaudio *chip = device->device_data; in snd_echo_dev_free()
1942 /* <--snd_echo_probe() */
1967 return -ENOMEM; in snd_echo_create()
1970 spin_lock_init(&chip->lock); in snd_echo_create()
1971 chip->card = card; in snd_echo_create()
1972 chip->pci = pci; in snd_echo_create()
1973 chip->irq = -1; in snd_echo_create()
1974 atomic_set(&chip->opencount, 0); in snd_echo_create()
1975 mutex_init(&chip->mode_mutex); in snd_echo_create()
1976 chip->can_set_rate = 1; in snd_echo_create()
1985 chip->dsp_registers_phys = pci_resource_start(pci, 0); in snd_echo_create()
1990 if ((chip->iores = request_mem_region(chip->dsp_registers_phys, sz, in snd_echo_create()
1994 return -EBUSY; in snd_echo_create()
1996 chip->dsp_registers = (volatile u32 __iomem *) in snd_echo_create()
1997 ioremap_nocache(chip->dsp_registers_phys, sz); in snd_echo_create()
1999 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_create()
2003 return -EBUSY; in snd_echo_create()
2005 chip->irq = pci->irq; in snd_echo_create()
2007 chip->pci, chip->irq, chip->pci->subsystem_device)); in snd_echo_create()
2009 /* Create the DSP comm page - this is the area of memory used for most in snd_echo_create()
2011 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), in snd_echo_create()
2013 &chip->commpage_dma_buf) < 0) { in snd_echo_create()
2016 return -ENOMEM; in snd_echo_create()
2018 chip->comm_page_phys = chip->commpage_dma_buf.addr; in snd_echo_create()
2019 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf.area; in snd_echo_create()
2021 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_create()
2053 return -ENODEV; in snd_echo_probe()
2056 return -ENOENT; in snd_echo_probe()
2065 snd_card_set_dev(card, &pci->dev); in snd_echo_probe()
2073 strcpy(card->driver, "Echo_" ECHOCARD_NAME); in snd_echo_probe()
2074 strcpy(card->shortname, chip->card_name); in snd_echo_probe()
2077 if (pci_id->device == 0x3410) in snd_echo_probe()
2080 sprintf(card->longname, "%s rev.%d (DSP%s) at 0x%lx irq %i", in snd_echo_probe()
2081 card->shortname, pci_id->subdevice & 0x000f, dsp, in snd_echo_probe()
2082 chip->dsp_registers_phys, chip->irq); in snd_echo_probe()
2091 if (chip->has_midi) { /* Some Mia's do not have midi */ in snd_echo_probe()
2102 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip))) < 0) in snd_echo_probe()
2105 err = snd_ctl_add(chip->card, in snd_echo_probe()
2111 err = snd_ctl_add(chip->card, in snd_echo_probe()
2118 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip))) < 0) in snd_echo_probe()
2123 if (!chip->hasnt_input_nominal_level) in snd_echo_probe()
2124 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip))) < 0) in snd_echo_probe()
2129 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip))) < 0) in snd_echo_probe()
2133 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip))) < 0) in snd_echo_probe()
2136 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip))) < 0) in snd_echo_probe()
2141 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip))) < 0) in snd_echo_probe()
2146 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip))) < 0) in snd_echo_probe()
2150 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip))) < 0) in snd_echo_probe()
2155 chip->num_digital_modes = 0; in snd_echo_probe()
2157 if (chip->digital_modes & (1 << i)) in snd_echo_probe()
2158 chip->digital_mode_list[chip->num_digital_modes++] = i; in snd_echo_probe()
2160 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip))) < 0) in snd_echo_probe()
2165 /* Creates a list of available clock sources */ in snd_echo_probe()
2166 chip->num_clock_sources = 0; in snd_echo_probe()
2168 if (chip->input_clock_types & (1 << i)) in snd_echo_probe()
2169 chip->clock_source_list[chip->num_clock_sources++] = i; in snd_echo_probe()
2171 if (chip->num_clock_sources > 1) { in snd_echo_probe()
2172 chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip); in snd_echo_probe()
2173 if ((err = snd_ctl_add(chip->card, chip->clock_src_ctl)) < 0) in snd_echo_probe()
2179 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip))) < 0) in snd_echo_probe()
2184 if (chip->has_phantom_power) in snd_echo_probe()
2185 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip))) < 0) in snd_echo_probe()
2192 snd_printk(KERN_INFO "Card registered: %s\n", card->longname); in snd_echo_probe()
2213 snd_pcm_suspend_all(chip->analog_pcm); in snd_echo_suspend()
2214 snd_pcm_suspend_all(chip->digital_pcm); in snd_echo_suspend()
2218 if (chip->midi_out) in snd_echo_suspend()
2219 snd_echo_midi_output_trigger(chip->midi_out, 0); in snd_echo_suspend()
2221 spin_lock_irq(&chip->lock); in snd_echo_suspend()
2223 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2224 return -EIO; in snd_echo_suspend()
2228 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2229 return -EIO; in snd_echo_suspend()
2231 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2233 chip->dsp_code = NULL; in snd_echo_suspend()
2234 free_irq(chip->irq, chip); in snd_echo_suspend()
2235 chip->irq = -1; in snd_echo_suspend()
2256 return -ENOMEM; in snd_echo_resume()
2257 commpage = chip->comm_page; in snd_echo_resume()
2260 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_resume()
2269 /* Temporarily set chip->pipe_alloc_mask=0 otherwise in snd_echo_resume()
2272 pipe_alloc_mask = chip->pipe_alloc_mask; in snd_echo_resume()
2273 chip->pipe_alloc_mask = 0; in snd_echo_resume()
2275 chip->pipe_alloc_mask = pipe_alloc_mask; in snd_echo_resume()
2282 memcpy(&commpage->audio_format, &commpage_bak->audio_format, in snd_echo_resume()
2283 sizeof(commpage->audio_format)); in snd_echo_resume()
2284 memcpy(&commpage->sglist_addr, &commpage_bak->sglist_addr, in snd_echo_resume()
2285 sizeof(commpage->sglist_addr)); in snd_echo_resume()
2286 memcpy(&commpage->midi_output, &commpage_bak->midi_output, in snd_echo_resume()
2287 sizeof(commpage->midi_output)); in snd_echo_resume()
2290 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_resume()
2294 return -EBUSY; in snd_echo_resume()
2296 chip->irq = pci->irq; in snd_echo_resume()
2297 DE_INIT(("resume irq=%d\n", chip->irq)); in snd_echo_resume()
2300 if (chip->midi_input_enabled) in snd_echo_resume()
2302 if (chip->midi_out) in snd_echo_resume()
2303 snd_echo_midi_output_trigger(chip->midi_out, 1); in snd_echo_resume()
2320 snd_card_free(chip->card); in snd_echo_remove()