Lines Matching +full:pcm +full:- +full:clock +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
27 static const DECLARE_TLV_DB_SCALE(db_scale_output_gain, -12800, 100, 1);
38 if (chip->fw_cache[fw_index]) { in get_firmware()
39 dev_dbg(chip->card->dev, in get_firmware()
42 *fw_entry = chip->fw_cache[fw_index]; in get_firmware()
47 dev_dbg(chip->card->dev, in get_firmware()
50 err = request_firmware(fw_entry, name, &chip->pci->dev); in get_firmware()
52 dev_err(chip->card->dev, in get_firmware()
56 chip->fw_cache[fw_index] = *fw_entry; in get_firmware()
67 dev_dbg(chip->card->dev, "firmware not released (kept in cache)\n"); in free_firmware()
81 if (chip->fw_cache[i]) { in free_firmware_cache()
82 release_firmware(chip->fw_cache[i]); in free_firmware_cache()
83 dev_dbg(chip->card->dev, "release_firmware(%d)\n", i); in free_firmware_cache()
92 PCM interface
97 struct audiopipe *pipe = runtime->private_data; in audiopipe_free()
99 if (pipe->sgpage.area) in audiopipe_free()
100 snd_dma_free_pages(&pipe->sgpage); in audiopipe_free()
118 if (c->min == 2) { in hw_rule_capture_format_by_channels()
124 if (c->min > 2) { in hw_rule_capture_format_by_channels()
145 if (f->bits[0] == SNDRV_PCM_FMTBIT_S32_BE) { in hw_rule_capture_channels_by_format()
156 if (f->bits[0] == SNDRV_PCM_FMTBIT_U8) { in hw_rule_capture_channels_by_format()
181 if (c->min > 2) { in hw_rule_playback_format_by_channels()
186 } else if (c->max == 1) in hw_rule_playback_format_by_channels()
190 else if (c->min == 2 && c->max == 2) in hw_rule_playback_format_by_channels()
214 fmask = f->bits[0] + ((u64)f->bits[1] << 32); in hw_rule_playback_channels_by_format()
240 sample rate only if there is only one pcm device open. */
246 struct echoaudio *chip = rule->private; in hw_rule_sample_rate()
250 mutex_lock(&chip->mode_mutex); in hw_rule_sample_rate()
252 if (chip->can_set_rate) { in hw_rule_sample_rate()
256 fixed.min = fixed.max = chip->sample_rate; in hw_rule_sample_rate()
260 mutex_unlock(&chip->mode_mutex); in hw_rule_sample_rate()
274 return -EAGAIN; in pcm_open()
277 runtime = substream->runtime; in pcm_open()
281 return -ENOMEM; in pcm_open()
282 pipe->index = -1; /* Not configured yet */ in pcm_open()
285 memcpy(&pipe->hw, &pcm_hardware_skel, sizeof(struct snd_pcm_hardware)); in pcm_open()
286 dev_dbg(chip->card->dev, "max_channels=%d\n", max_channels); in pcm_open()
287 pipe->constr.list = channels_list; in pcm_open()
288 pipe->constr.mask = 0; in pcm_open()
290 pipe->constr.count = i; in pcm_open()
291 if (pipe->hw.channels_max > max_channels) in pcm_open()
292 pipe->hw.channels_max = max_channels; in pcm_open()
293 if (chip->digital_mode == DIGITAL_MODE_ADAT) { in pcm_open()
294 pipe->hw.rate_max = 48000; in pcm_open()
295 pipe->hw.rates &= SNDRV_PCM_RATE_8000_48000; in pcm_open()
298 runtime->hw = pipe->hw; in pcm_open()
299 runtime->private_data = pipe; in pcm_open()
300 runtime->private_free = audiopipe_free; in pcm_open()
306 &pipe->constr); in pcm_open()
317 32-bytes-aligned. It's not a requirement, but it seems that IRQs are in pcm_open()
328 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_open()
331 SNDRV_PCM_HW_PARAM_RATE, -1); in pcm_open()
335 /* Allocate a page for the scatter-gather list */ in pcm_open()
337 &chip->pci->dev, in pcm_open()
338 PAGE_SIZE, &pipe->sgpage); in pcm_open()
340 dev_err(chip->card->dev, "s-g list allocation failed\n"); in pcm_open()
348 dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d", in pcm_open()
349 chip->opencount, chip->can_set_rate, chip->rate_set); in pcm_open()
351 chip->opencount++; in pcm_open()
352 if (chip->opencount > 1 && chip->rate_set) in pcm_open()
353 chip->can_set_rate = 0; in pcm_open()
366 num_analog_busses_in(chip) - substream->number); in pcm_analog_in_open()
369 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
372 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_analog_in_open()
375 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
378 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_analog_in_open()
397 err = pcm_open(substream, max_channels - substream->number); in pcm_analog_out_open()
400 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
404 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_analog_out_open()
407 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
411 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_analog_out_open()
427 max_channels = num_digital_busses_in(chip) - substream->number; in pcm_digital_in_open()
428 mutex_lock(&chip->mode_mutex); in pcm_digital_in_open()
429 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_in_open()
434 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_in_open()
439 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
442 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_digital_in_open()
445 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
448 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_digital_in_open()
453 mutex_unlock(&chip->mode_mutex); in pcm_digital_in_open()
466 max_channels = num_digital_busses_out(chip) - substream->number; in pcm_digital_out_open()
467 mutex_lock(&chip->mode_mutex); in pcm_digital_out_open()
468 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_out_open()
473 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_out_open()
478 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
482 -1); in pcm_digital_out_open()
485 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
489 -1); in pcm_digital_out_open()
494 mutex_unlock(&chip->mode_mutex); in pcm_digital_out_open()
512 mutex_lock(&chip->mode_mutex); in pcm_close()
514 dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d", in pcm_close()
515 chip->opencount, chip->can_set_rate, chip->rate_set); in pcm_close()
517 chip->opencount--; in pcm_close()
519 switch (chip->opencount) { in pcm_close()
521 chip->can_set_rate = 1; in pcm_close()
525 chip->rate_set = 0; in pcm_close()
529 mutex_unlock(&chip->mode_mutex); in pcm_close()
535 /* Channel allocation and scatter-gather list setup */
545 pipe = (struct audiopipe *) substream->runtime->private_data; in init_engine()
550 spin_lock_irq(&chip->lock); in init_engine()
551 if (pipe->index >= 0) { in init_engine()
552 dev_dbg(chip->card->dev, "hwp_ie free(%d)\n", pipe->index); in init_engine()
555 chip->substream[pipe->index] = NULL; in init_engine()
560 spin_unlock_irq(&chip->lock); in init_engine()
561 dev_err(chip->card->dev, "allocate_pipes(%d) err=%d\n", in init_engine()
565 spin_unlock_irq(&chip->lock); in init_engine()
566 dev_dbg(chip->card->dev, "allocate_pipes()=%d\n", pipe_index); in init_engine()
568 dev_dbg(chip->card->dev, in init_engine()
579 rest = params_buffer_bytes(hw_params) - offs; in init_engine()
583 if (rest <= edge - offs) { in init_engine()
590 edge - offs); in init_engine()
591 rest -= edge - offs; in init_engine()
605 * initialized before chip->substream in init_engine()
607 pipe->last_period = 0; in init_engine()
608 pipe->last_counter = 0; in init_engine()
609 pipe->position = 0; in init_engine()
611 chip->substream[pipe_index] = substream; in init_engine()
612 chip->rate_set = 1; in init_engine()
613 spin_lock_irq(&chip->lock); in init_engine()
614 set_sample_rate(chip, hw_params->rate_num / hw_params->rate_den); in init_engine()
615 spin_unlock_irq(&chip->lock); in init_engine()
627 substream->number, params_channels(hw_params)); in pcm_analog_in_hw_params()
635 return init_engine(substream, hw_params, substream->number, in pcm_analog_out_hw_params()
649 substream->number, params_channels(hw_params)); in pcm_digital_in_hw_params()
661 substream->number, params_channels(hw_params)); in pcm_digital_out_hw_params()
675 pipe = (struct audiopipe *) substream->runtime->private_data; in pcm_hw_free()
677 spin_lock_irq(&chip->lock); in pcm_hw_free()
678 if (pipe->index >= 0) { in pcm_hw_free()
679 dev_dbg(chip->card->dev, "pcm_hw_free(%d)\n", pipe->index); in pcm_hw_free()
681 chip->substream[pipe->index] = NULL; in pcm_hw_free()
682 pipe->index = -1; in pcm_hw_free()
684 spin_unlock_irq(&chip->lock); in pcm_hw_free()
694 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_prepare()
696 int pipe_index = ((struct audiopipe *)runtime->private_data)->index; in pcm_prepare()
698 dev_dbg(chip->card->dev, "Prepare rate=%d format=%d channels=%d\n", in pcm_prepare()
699 runtime->rate, runtime->format, runtime->channels); in pcm_prepare()
700 format.interleave = runtime->channels; in pcm_prepare()
703 switch (runtime->format) { in pcm_prepare()
720 dev_err(chip->card->dev, in pcm_prepare()
722 runtime->format); in pcm_prepare()
723 return -EINVAL; in pcm_prepare()
727 return -EINVAL; in pcm_prepare()
734 spin_lock_irq(&chip->lock); in pcm_prepare()
737 spin_unlock_irq(&chip->lock); in pcm_prepare()
738 return -EINVAL; in pcm_prepare()
742 spin_unlock_irq(&chip->lock); in pcm_prepare()
759 if (s == chip->substream[i]) { in pcm_trigger()
766 spin_lock(&chip->lock); in pcm_trigger()
773 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
774 switch (pipe->state) { in pcm_trigger()
776 pipe->last_period = 0; in pcm_trigger()
777 pipe->last_counter = 0; in pcm_trigger()
778 pipe->position = 0; in pcm_trigger()
779 *pipe->dma_counter = 0; in pcm_trigger()
782 pipe->state = PIPE_STATE_STARTED; in pcm_trigger()
790 chip->pipe_cyclic_mask); in pcm_trigger()
796 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
797 pipe->state = PIPE_STATE_STOPPED; in pcm_trigger()
805 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
806 pipe->state = PIPE_STATE_PAUSED; in pcm_trigger()
812 err = -EINVAL; in pcm_trigger()
814 spin_unlock(&chip->lock); in pcm_trigger()
822 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_pointer()
823 struct audiopipe *pipe = runtime->private_data; in pcm_pointer()
831 counter = le32_to_cpu(*pipe->dma_counter); /* presumed atomic */ in pcm_pointer()
833 step = counter - pipe->last_counter; /* handles wrapping */ in pcm_pointer()
834 pipe->last_counter = counter; in pcm_pointer()
840 pipe->position += step; in pcm_pointer()
841 pipe->position %= frames_to_bytes(runtime, runtime->buffer_size); /* wrap */ in pcm_pointer()
843 return bytes_to_frames(runtime, pipe->position); in pcm_pointer()
848 /* pcm *_ops structures */
895 static void snd_echo_preallocate_pages(struct snd_pcm *pcm, struct device *dev) in snd_echo_preallocate_pages() argument
901 for (ss = pcm->streams[stream].substream; ss; ss = ss->next) in snd_echo_preallocate_pages()
904 ss->number ? 0 : 128<<10, in snd_echo_preallocate_pages()
910 /*<--snd_echo_probe() */
913 struct snd_pcm *pcm; in snd_echo_new_pcm() local
917 /* This card has a Vmixer, that is there is no direct mapping from PCM in snd_echo_new_pcm()
923 /* PCM#0 Virtual outputs and analog inputs */ in snd_echo_new_pcm()
924 err = snd_pcm_new(chip->card, "PCM", 0, num_pipes_out(chip), in snd_echo_new_pcm()
925 num_analog_busses_in(chip), &pcm); in snd_echo_new_pcm()
928 pcm->private_data = chip; in snd_echo_new_pcm()
929 chip->analog_pcm = pcm; in snd_echo_new_pcm()
930 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
931 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops); in snd_echo_new_pcm()
932 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops); in snd_echo_new_pcm()
933 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
936 /* PCM#1 Digital inputs, no outputs */ in snd_echo_new_pcm()
937 err = snd_pcm_new(chip->card, "Digital PCM", 1, 0, in snd_echo_new_pcm()
938 num_digital_busses_in(chip), &pcm); in snd_echo_new_pcm()
941 pcm->private_data = chip; in snd_echo_new_pcm()
942 chip->digital_pcm = pcm; in snd_echo_new_pcm()
943 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
944 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops); in snd_echo_new_pcm()
945 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
953 register two PCM devices: */ in snd_echo_new_pcm()
955 /* PCM#0 Analog i/o */ in snd_echo_new_pcm()
956 err = snd_pcm_new(chip->card, "Analog PCM", 0, in snd_echo_new_pcm()
958 num_analog_busses_in(chip), &pcm); 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()
964 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops); in snd_echo_new_pcm()
965 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops); in snd_echo_new_pcm()
966 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
969 /* PCM#1 Digital i/o */ in snd_echo_new_pcm()
970 err = snd_pcm_new(chip->card, "Digital PCM", 1, in snd_echo_new_pcm()
972 num_digital_busses_in(chip), &pcm); in snd_echo_new_pcm()
975 pcm->private_data = chip; in snd_echo_new_pcm()
976 chip->digital_pcm = pcm; in snd_echo_new_pcm()
977 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
978 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &digital_playback_ops); in snd_echo_new_pcm()
979 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops); in snd_echo_new_pcm()
980 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
997 /******************* PCM output volume *******************/
1004 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_output_gain_info()
1005 uinfo->count = num_busses_out(chip); in snd_echo_output_gain_info()
1006 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_output_gain_info()
1007 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_output_gain_info()
1019 ucontrol->value.integer.value[c] = chip->output_gain[c]; in snd_echo_output_gain_get()
1031 spin_lock_irq(&chip->lock); in snd_echo_output_gain_put()
1033 gain = ucontrol->value.integer.value[c]; in snd_echo_output_gain_put()
1037 if (chip->output_gain[c] != gain) { in snd_echo_output_gain_put()
1044 spin_unlock_irq(&chip->lock); in snd_echo_output_gain_put()
1049 /* On the Mia this one controls the line-out volume */
1062 .name = "PCM Playback Volume",
1085 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_input_gain_info()
1086 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_gain_info()
1087 uinfo->value.integer.min = ECHOGAIN_MININP; in snd_echo_input_gain_info()
1088 uinfo->value.integer.max = ECHOGAIN_MAXINP; in snd_echo_input_gain_info()
1100 ucontrol->value.integer.value[c] = chip->input_gain[c]; in snd_echo_input_gain_get()
1112 spin_lock_irq(&chip->lock); in snd_echo_input_gain_put()
1114 gain = ucontrol->value.integer.value[c]; in snd_echo_input_gain_put()
1118 if (chip->input_gain[c] != gain) { in snd_echo_input_gain_put()
1125 spin_unlock_irq(&chip->lock); in snd_echo_input_gain_put()
1129 static const DECLARE_TLV_DB_SCALE(db_scale_input_gain, -2500, 50, 0);
1147 /************ Analog output nominal level (+4dBu / -10dBV) ***************/
1154 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_output_nominal_info()
1155 uinfo->count = num_analog_busses_out(chip); in snd_echo_output_nominal_info()
1156 uinfo->value.integer.min = 0; in snd_echo_output_nominal_info()
1157 uinfo->value.integer.max = 1; in snd_echo_output_nominal_info()
1169 ucontrol->value.integer.value[c] = chip->nominal_level[c]; in snd_echo_output_nominal_get()
1181 spin_lock_irq(&chip->lock); in snd_echo_output_nominal_put()
1183 if (chip->nominal_level[c] != ucontrol->value.integer.value[c]) { in snd_echo_output_nominal_put()
1185 ucontrol->value.integer.value[c]); in snd_echo_output_nominal_put()
1191 spin_unlock_irq(&chip->lock); in snd_echo_output_nominal_put()
1196 .name = "Line Playback Switch (-10dBV)",
1209 /*************** Analog input nominal level (+4dBu / -10dBV) ***************/
1216 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_input_nominal_info()
1217 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_nominal_info()
1218 uinfo->value.integer.min = 0; in snd_echo_input_nominal_info()
1219 uinfo->value.integer.max = 1; in snd_echo_input_nominal_info()
1231 ucontrol->value.integer.value[c] = in snd_echo_input_nominal_get()
1232 chip->nominal_level[bx_analog_in(chip) + c]; in snd_echo_input_nominal_get()
1244 spin_lock_irq(&chip->lock); in snd_echo_input_nominal_put()
1246 if (chip->nominal_level[bx_analog_in(chip) + c] != in snd_echo_input_nominal_put()
1247 ucontrol->value.integer.value[c]) { in snd_echo_input_nominal_put()
1249 ucontrol->value.integer.value[c]); in snd_echo_input_nominal_put()
1257 spin_unlock_irq(&chip->lock); in snd_echo_input_nominal_put()
1262 .name = "Line Capture Switch (-10dBV)",
1279 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_mixer_info()
1280 uinfo->count = 1; in snd_echo_mixer_info()
1281 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_mixer_info()
1282 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_mixer_info()
1290 unsigned int out = ucontrol->id.index / num_busses_in(chip); in snd_echo_mixer_get()
1291 unsigned int in = ucontrol->id.index % num_busses_in(chip); in snd_echo_mixer_get()
1294 return -EINVAL; in snd_echo_mixer_get()
1296 ucontrol->value.integer.value[0] = chip->monitor_gain[out][in]; in snd_echo_mixer_get()
1309 out = ucontrol->id.index / num_busses_in(chip); in snd_echo_mixer_put()
1310 in = ucontrol->id.index % num_busses_in(chip); in snd_echo_mixer_put()
1312 return -EINVAL; in snd_echo_mixer_put()
1313 gain = ucontrol->value.integer.value[0]; in snd_echo_mixer_put()
1315 return -EINVAL; in snd_echo_mixer_put()
1316 if (chip->monitor_gain[out][in] != gain) { in snd_echo_mixer_put()
1317 spin_lock_irq(&chip->lock); in snd_echo_mixer_put()
1320 spin_unlock_irq(&chip->lock); in snd_echo_mixer_put()
1346 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vmixer_info()
1347 uinfo->count = 1; in snd_echo_vmixer_info()
1348 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vmixer_info()
1349 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_vmixer_info()
1359 ucontrol->value.integer.value[0] = in snd_echo_vmixer_get()
1360 chip->vmixer_gain[ucontrol->id.index / num_pipes_out(chip)] in snd_echo_vmixer_get()
1361 [ucontrol->id.index % num_pipes_out(chip)]; in snd_echo_vmixer_get()
1374 out = ucontrol->id.index / num_pipes_out(chip); in snd_echo_vmixer_put()
1375 vch = ucontrol->id.index % num_pipes_out(chip); in snd_echo_vmixer_put()
1376 gain = ucontrol->value.integer.value[0]; in snd_echo_vmixer_put()
1378 return -EINVAL; in snd_echo_vmixer_put()
1379 if (chip->vmixer_gain[out][vch] != ucontrol->value.integer.value[0]) { in snd_echo_vmixer_put()
1380 spin_lock_irq(&chip->lock); in snd_echo_vmixer_put()
1381 set_vmixer_gain(chip, out, vch, ucontrol->value.integer.value[0]); in snd_echo_vmixer_put()
1383 spin_unlock_irq(&chip->lock); in snd_echo_vmixer_put()
1405 /******************* Digital mode switch *******************/
1416 return snd_ctl_enum_info(uinfo, 1, chip->num_digital_modes, names); in snd_echo_digital_mode_info()
1423 int i, mode; in snd_echo_digital_mode_get() local
1426 mode = chip->digital_mode; in snd_echo_digital_mode_get()
1427 for (i = chip->num_digital_modes - 1; i >= 0; i--) in snd_echo_digital_mode_get()
1428 if (mode == chip->digital_mode_list[i]) { in snd_echo_digital_mode_get()
1429 ucontrol->value.enumerated.item[0] = i; in snd_echo_digital_mode_get()
1445 emode = ucontrol->value.enumerated.item[0]; in snd_echo_digital_mode_put()
1446 if (emode >= chip->num_digital_modes) in snd_echo_digital_mode_put()
1447 return -EINVAL; in snd_echo_digital_mode_put()
1448 dmode = chip->digital_mode_list[emode]; in snd_echo_digital_mode_put()
1450 if (dmode != chip->digital_mode) { in snd_echo_digital_mode_put()
1453 mutex_lock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1455 /* Do not allow the user to change the digital mode when a pcm in snd_echo_digital_mode_put()
1458 if (chip->opencount) { in snd_echo_digital_mode_put()
1459 changed = -EAGAIN; in snd_echo_digital_mode_put()
1462 /* If we had to change the clock source, report it */ in snd_echo_digital_mode_put()
1463 if (changed > 0 && chip->clock_src_ctl) { in snd_echo_digital_mode_put()
1464 snd_ctl_notify(chip->card, in snd_echo_digital_mode_put()
1466 &chip->clock_src_ctl->id); in snd_echo_digital_mode_put()
1467 dev_dbg(chip->card->dev, in snd_echo_digital_mode_put()
1473 mutex_unlock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1479 .name = "Digital mode Switch",
1492 /******************* S/PDIF mode switch *******************/
1507 ucontrol->value.enumerated.item[0] = !!chip->professional_spdif; in snd_echo_spdif_mode_get()
1515 int mode; in snd_echo_spdif_mode_put() local
1518 mode = !!ucontrol->value.enumerated.item[0]; in snd_echo_spdif_mode_put()
1519 if (mode != chip->professional_spdif) { in snd_echo_spdif_mode_put()
1520 spin_lock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1521 set_professional_spdif(chip, mode); in snd_echo_spdif_mode_put()
1522 spin_unlock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1529 .name = "S/PDIF mode Switch",
1542 /******************* Select input clock source *******************/
1553 return snd_ctl_enum_info(uinfo, 1, chip->num_clock_sources, names); in snd_echo_clock_source_info()
1560 int i, clock; in snd_echo_clock_source_get() local
1563 clock = chip->input_clock; in snd_echo_clock_source_get()
1565 for (i = 0; i < chip->num_clock_sources; i++) in snd_echo_clock_source_get()
1566 if (clock == chip->clock_source_list[i]) in snd_echo_clock_source_get()
1567 ucontrol->value.enumerated.item[0] = i; in snd_echo_clock_source_get()
1581 eclock = ucontrol->value.enumerated.item[0]; in snd_echo_clock_source_put()
1582 if (eclock >= chip->input_clock_types) in snd_echo_clock_source_put()
1583 return -EINVAL; in snd_echo_clock_source_put()
1584 dclock = chip->clock_source_list[eclock]; in snd_echo_clock_source_put()
1585 if (chip->input_clock != dclock) { in snd_echo_clock_source_put()
1586 mutex_lock(&chip->mode_mutex); in snd_echo_clock_source_put()
1587 spin_lock_irq(&chip->lock); in snd_echo_clock_source_put()
1591 spin_unlock_irq(&chip->lock); in snd_echo_clock_source_put()
1592 mutex_unlock(&chip->mode_mutex); in snd_echo_clock_source_put()
1596 dev_dbg(chip->card->dev, in snd_echo_clock_source_put()
1603 .name = "Sample Clock Source",
1624 ucontrol->value.integer.value[0] = chip->phantom_power; in snd_echo_phantom_power_get()
1634 power = !!ucontrol->value.integer.value[0]; in snd_echo_phantom_power_put()
1635 if (chip->phantom_power != power) { in snd_echo_phantom_power_put()
1636 spin_lock_irq(&chip->lock); in snd_echo_phantom_power_put()
1638 spin_unlock_irq(&chip->lock); in snd_echo_phantom_power_put()
1667 ucontrol->value.integer.value[0] = chip->digital_in_automute; in snd_echo_automute_get()
1677 automute = !!ucontrol->value.integer.value[0]; in snd_echo_automute_put()
1678 if (chip->digital_in_automute != automute) { in snd_echo_automute_put()
1679 spin_lock_irq(&chip->lock); in snd_echo_automute_put()
1681 spin_unlock_irq(&chip->lock); in snd_echo_automute_put()
1700 /******************* VU-meters switch *******************/
1709 spin_lock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1710 set_meters_on(chip, ucontrol->value.integer.value[0]); in snd_echo_vumeters_switch_put()
1711 spin_unlock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1716 .name = "VU-meters Switch",
1725 /***** Read VU-meters (input, output, analog and digital together) *****/
1729 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vumeters_info()
1730 uinfo->count = 96; in snd_echo_vumeters_info()
1731 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vumeters_info()
1732 uinfo->value.integer.max = 0; in snd_echo_vumeters_info()
1742 get_audio_meters(chip, ucontrol->value.integer.value); in snd_echo_vumeters_get()
1747 .name = "VU-meters",
1759 /*** Channels info - it exports informations about the number of channels ***/
1763 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_channels_info_info()
1764 uinfo->count = 6; in snd_echo_channels_info_info()
1765 uinfo->value.integer.min = 0; in snd_echo_channels_info_info()
1766 uinfo->value.integer.max = 1 << ECHO_CLOCK_NUMBER; in snd_echo_channels_info_info()
1777 ucontrol->value.integer.value[0] = num_busses_in(chip); in snd_echo_channels_info_get()
1778 ucontrol->value.integer.value[1] = num_analog_busses_in(chip); in snd_echo_channels_info_get()
1779 ucontrol->value.integer.value[2] = num_busses_out(chip); in snd_echo_channels_info_get()
1780 ucontrol->value.integer.value[3] = num_analog_busses_out(chip); in snd_echo_channels_info_get()
1781 ucontrol->value.integer.value[4] = num_pipes_out(chip); in snd_echo_channels_info_get()
1786 src = chip->num_clock_sources - 1; in snd_echo_channels_info_get()
1787 for (bit = ECHO_CLOCK_NUMBER - 1; bit >= 0; bit--) in snd_echo_channels_info_get()
1789 for (; src >= 0; src--) in snd_echo_channels_info_get()
1790 if (bit == chip->clock_source_list[src]) { in snd_echo_channels_info_get()
1794 ucontrol->value.integer.value[5] = clocks; in snd_echo_channels_info_get()
1815 * Don't make any updates to state; PCM core handles this with the
1822 struct snd_pcm_runtime *runtime = substream->runtime; in period_has_elapsed()
1823 struct audiopipe *pipe = runtime->private_data; in period_has_elapsed()
1827 if (pipe->state != PIPE_STATE_STARTED) in period_has_elapsed()
1830 period_bytes = frames_to_bytes(runtime, runtime->period_size); in period_has_elapsed()
1832 counter = le32_to_cpu(*pipe->dma_counter); /* presumed atomic */ in period_has_elapsed()
1834 step = counter - pipe->last_period; /* handles wrapping */ in period_has_elapsed()
1835 step -= step % period_bytes; /* acknowledge whole periods only */ in period_has_elapsed()
1840 pipe->last_period += step; /* used exclusively by us */ in period_has_elapsed()
1849 spin_lock(&chip->lock); in snd_echo_interrupt()
1852 spin_unlock(&chip->lock); in snd_echo_interrupt()
1860 substream = chip->substream[ss]; in snd_echo_interrupt()
1862 spin_unlock(&chip->lock); in snd_echo_interrupt()
1864 spin_lock(&chip->lock); in snd_echo_interrupt()
1867 spin_unlock(&chip->lock); in snd_echo_interrupt()
1870 if (st > 0 && chip->midi_in) { in snd_echo_interrupt()
1871 snd_rawmidi_receive(chip->midi_in, chip->midi_buffer, st); in snd_echo_interrupt()
1872 dev_dbg(chip->card->dev, "rawmidi_iread=%d\n", st); in snd_echo_interrupt()
1887 struct echoaudio *chip = card->private_data; in snd_echo_free()
1889 if (chip->comm_page) in snd_echo_free()
1892 if (chip->irq >= 0) in snd_echo_free()
1893 free_irq(chip->irq, chip); in snd_echo_free()
1899 /* <--snd_echo_probe() */
1903 struct echoaudio *chip = card->private_data; in snd_echo_create()
1915 spin_lock_init(&chip->lock); in snd_echo_create()
1916 chip->card = card; in snd_echo_create()
1917 chip->pci = pci; in snd_echo_create()
1918 chip->irq = -1; in snd_echo_create()
1919 chip->opencount = 0; in snd_echo_create()
1920 mutex_init(&chip->mode_mutex); in snd_echo_create()
1921 chip->can_set_rate = 1; in snd_echo_create()
1928 chip->dsp_registers_phys = pci_resource_start(pci, 0); in snd_echo_create()
1933 chip->dsp_registers = devm_ioremap(&pci->dev, chip->dsp_registers_phys, sz); in snd_echo_create()
1934 if (!chip->dsp_registers) { in snd_echo_create()
1935 dev_err(chip->card->dev, "ioremap failed\n"); in snd_echo_create()
1936 return -ENOMEM; in snd_echo_create()
1939 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_create()
1941 dev_err(chip->card->dev, "cannot grab irq\n"); in snd_echo_create()
1942 return -EBUSY; in snd_echo_create()
1944 chip->irq = pci->irq; in snd_echo_create()
1945 card->sync_irq = chip->irq; in snd_echo_create()
1946 dev_dbg(card->dev, "pci=%p irq=%d subdev=%04x Init hardware...\n", in snd_echo_create()
1947 chip->pci, chip->irq, chip->pci->subsystem_device); in snd_echo_create()
1949 card->private_free = snd_echo_free; in snd_echo_create()
1951 /* Create the DSP comm page - this is the area of memory used for most in snd_echo_create()
1953 chip->commpage_dma_buf = in snd_echo_create()
1954 snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, in snd_echo_create()
1956 if (!chip->commpage_dma_buf) in snd_echo_create()
1957 return -ENOMEM; in snd_echo_create()
1958 chip->comm_page_phys = chip->commpage_dma_buf->addr; in snd_echo_create()
1959 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf->area; in snd_echo_create()
1961 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_create()
1965 dev_err(card->dev, "init_hw err=%d\n", err); in snd_echo_create()
1984 return -ENODEV; in __snd_echo_probe()
1987 return -ENOENT; in __snd_echo_probe()
1991 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in __snd_echo_probe()
1995 chip = card->private_data; in __snd_echo_probe()
2001 strcpy(card->driver, "Echo_" ECHOCARD_NAME); in __snd_echo_probe()
2002 strcpy(card->shortname, chip->card_name); in __snd_echo_probe()
2005 if (pci_id->device == 0x3410) in __snd_echo_probe()
2008 sprintf(card->longname, "%s rev.%d (DSP%s) at 0x%lx irq %i", in __snd_echo_probe()
2009 card->shortname, pci_id->subdevice & 0x000f, dsp, in __snd_echo_probe()
2010 chip->dsp_registers_phys, chip->irq); in __snd_echo_probe()
2014 dev_err(chip->card->dev, "new pcm error %d\n", err); in __snd_echo_probe()
2019 if (chip->has_midi) { /* Some Mia's do not have midi */ in __snd_echo_probe()
2022 dev_err(chip->card->dev, "new midi error %d\n", err); in __snd_echo_probe()
2030 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip)); in __snd_echo_probe()
2034 err = snd_ctl_add(chip->card, in __snd_echo_probe()
2040 err = snd_ctl_add(chip->card, in __snd_echo_probe()
2047 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip)); in __snd_echo_probe()
2053 if (!chip->hasnt_input_nominal_level) { in __snd_echo_probe()
2054 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip)); in __snd_echo_probe()
2061 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip)); in __snd_echo_probe()
2066 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip)); in __snd_echo_probe()
2070 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip)); in __snd_echo_probe()
2076 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip)); in __snd_echo_probe()
2082 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip)); in __snd_echo_probe()
2087 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip)); in __snd_echo_probe()
2093 chip->num_digital_modes = 0; in __snd_echo_probe()
2095 if (chip->digital_modes & (1 << i)) in __snd_echo_probe()
2096 chip->digital_mode_list[chip->num_digital_modes++] = i; in __snd_echo_probe()
2098 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip)); in __snd_echo_probe()
2104 /* Creates a list of available clock sources */ in __snd_echo_probe()
2105 chip->num_clock_sources = 0; in __snd_echo_probe()
2107 if (chip->input_clock_types & (1 << i)) in __snd_echo_probe()
2108 chip->clock_source_list[chip->num_clock_sources++] = i; in __snd_echo_probe()
2110 if (chip->num_clock_sources > 1) { in __snd_echo_probe()
2111 chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip); in __snd_echo_probe()
2112 err = snd_ctl_add(chip->card, chip->clock_src_ctl); in __snd_echo_probe()
2119 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip)); in __snd_echo_probe()
2125 if (chip->has_phantom_power) { in __snd_echo_probe()
2126 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip)); in __snd_echo_probe()
2135 dev_info(card->dev, "Card registered: %s\n", card->longname); in __snd_echo_probe()
2145 return snd_card_free_on_error(&pci->dev, __snd_echo_probe(pci, pci_id)); in snd_echo_probe()
2157 if (chip->midi_out) in snd_echo_suspend()
2158 snd_echo_midi_output_trigger(chip->midi_out, 0); in snd_echo_suspend()
2160 spin_lock_irq(&chip->lock); in snd_echo_suspend()
2162 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2163 return -EIO; in snd_echo_suspend()
2167 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2168 return -EIO; in snd_echo_suspend()
2170 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2172 chip->dsp_code = NULL; in snd_echo_suspend()
2173 free_irq(chip->irq, chip); in snd_echo_suspend()
2174 chip->irq = -1; in snd_echo_suspend()
2175 chip->card->sync_irq = -1; in snd_echo_suspend()
2189 commpage = chip->comm_page; in snd_echo_resume()
2192 return -ENOMEM; in snd_echo_resume()
2194 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_resume()
2201 /* Temporarily set chip->pipe_alloc_mask=0 otherwise in snd_echo_resume()
2204 pipe_alloc_mask = chip->pipe_alloc_mask; in snd_echo_resume()
2205 chip->pipe_alloc_mask = 0; in snd_echo_resume()
2207 chip->pipe_alloc_mask = pipe_alloc_mask; in snd_echo_resume()
2213 memcpy(&commpage->audio_format, &commpage_bak->audio_format, in snd_echo_resume()
2214 sizeof(commpage->audio_format)); in snd_echo_resume()
2215 memcpy(&commpage->sglist_addr, &commpage_bak->sglist_addr, in snd_echo_resume()
2216 sizeof(commpage->sglist_addr)); in snd_echo_resume()
2217 memcpy(&commpage->midi_output, &commpage_bak->midi_output, in snd_echo_resume()
2218 sizeof(commpage->midi_output)); in snd_echo_resume()
2221 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_resume()
2223 dev_err(chip->card->dev, "cannot grab irq\n"); in snd_echo_resume()
2224 return -EBUSY; in snd_echo_resume()
2226 chip->irq = pci->irq; in snd_echo_resume()
2227 chip->card->sync_irq = chip->irq; in snd_echo_resume()
2228 dev_dbg(dev, "resume irq=%d\n", chip->irq); in snd_echo_resume()
2231 if (chip->midi_input_enabled) in snd_echo_resume()
2233 if (chip->midi_out) in snd_echo_resume()
2234 snd_echo_midi_output_trigger(chip->midi_out, 1); in snd_echo_resume()