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 <[email protected]>
27 static const DECLARE_TLV_DB_SCALE(db_scale_output_gain, -12800, 100, 1);
37 if (chip->fw_cache[fw_index]) { in get_firmware()
38 dev_dbg(chip->card->dev, in get_firmware()
41 *fw_entry = chip->fw_cache[fw_index]; in get_firmware()
45 dev_dbg(chip->card->dev, in get_firmware()
48 err = request_firmware(fw_entry, name, &chip->pci->dev); in get_firmware()
50 dev_err(chip->card->dev, in get_firmware()
53 chip->fw_cache[fw_index] = *fw_entry; in get_firmware()
62 dev_dbg(chip->card->dev, "firmware not released (kept in cache)\n"); in free_firmware()
72 if (chip->fw_cache[i]) { in free_firmware_cache()
73 release_firmware(chip->fw_cache[i]); in free_firmware_cache()
74 dev_dbg(chip->card->dev, "release_firmware(%d)\n", i); in free_firmware_cache()
81 PCM interface
86 struct audiopipe *pipe = runtime->private_data; in audiopipe_free()
88 if (pipe->sgpage.area) in audiopipe_free()
89 snd_dma_free_pages(&pipe->sgpage); in audiopipe_free()
107 if (c->min == 2) { in hw_rule_capture_format_by_channels()
113 if (c->min > 2) { in hw_rule_capture_format_by_channels()
134 if (f->bits[0] == SNDRV_PCM_FMTBIT_S32_BE) { in hw_rule_capture_channels_by_format()
145 if (f->bits[0] == SNDRV_PCM_FMTBIT_U8) { in hw_rule_capture_channels_by_format()
170 if (c->min > 2) { in hw_rule_playback_format_by_channels()
175 } else if (c->max == 1) in hw_rule_playback_format_by_channels()
179 else if (c->min == 2 && c->max == 2) in hw_rule_playback_format_by_channels()
203 fmask = f->bits[0] + ((u64)f->bits[1] << 32); in hw_rule_playback_channels_by_format()
229 sample rate only if there is only one pcm device open. */
235 struct echoaudio *chip = rule->private; in hw_rule_sample_rate()
239 mutex_lock(&chip->mode_mutex); in hw_rule_sample_rate()
241 if (chip->can_set_rate) { in hw_rule_sample_rate()
245 fixed.min = fixed.max = chip->sample_rate; in hw_rule_sample_rate()
249 mutex_unlock(&chip->mode_mutex); in hw_rule_sample_rate()
263 return -EAGAIN; in pcm_open()
266 runtime = substream->runtime; in pcm_open()
270 return -ENOMEM; in pcm_open()
271 pipe->index = -1; /* Not configured yet */ in pcm_open()
274 memcpy(&pipe->hw, &pcm_hardware_skel, sizeof(struct snd_pcm_hardware)); in pcm_open()
275 dev_dbg(chip->card->dev, "max_channels=%d\n", max_channels); in pcm_open()
276 pipe->constr.list = channels_list; in pcm_open()
277 pipe->constr.mask = 0; in pcm_open()
279 pipe->constr.count = i; in pcm_open()
280 if (pipe->hw.channels_max > max_channels) in pcm_open()
281 pipe->hw.channels_max = max_channels; in pcm_open()
282 if (chip->digital_mode == DIGITAL_MODE_ADAT) { in pcm_open()
283 pipe->hw.rate_max = 48000; in pcm_open()
284 pipe->hw.rates &= SNDRV_PCM_RATE_8000_48000; in pcm_open()
287 runtime->hw = pipe->hw; in pcm_open()
288 runtime->private_data = pipe; in pcm_open()
289 runtime->private_free = audiopipe_free; in pcm_open()
295 &pipe->constr); in pcm_open()
306 32-bytes-aligned. It's not a requirement, but it seems that IRQs are in pcm_open()
317 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_open()
320 SNDRV_PCM_HW_PARAM_RATE, -1); in pcm_open()
324 /* Allocate a page for the scatter-gather list */ in pcm_open()
326 &chip->pci->dev, in pcm_open()
327 PAGE_SIZE, &pipe->sgpage); in pcm_open()
329 dev_err(chip->card->dev, "s-g list allocation failed\n"); in pcm_open()
337 dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d", in pcm_open()
338 chip->opencount, chip->can_set_rate, chip->rate_set); in pcm_open()
340 chip->opencount++; in pcm_open()
341 if (chip->opencount > 1 && chip->rate_set) in pcm_open()
342 chip->can_set_rate = 0; in pcm_open()
355 num_analog_busses_in(chip) - substream->number); in pcm_analog_in_open()
358 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
361 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_analog_in_open()
364 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_in_open()
367 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_analog_in_open()
386 err = pcm_open(substream, max_channels - substream->number); in pcm_analog_out_open()
389 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
393 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_analog_out_open()
396 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_analog_out_open()
400 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_analog_out_open()
416 max_channels = num_digital_busses_in(chip) - substream->number; in pcm_digital_in_open()
417 mutex_lock(&chip->mode_mutex); in pcm_digital_in_open()
418 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_in_open()
423 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_in_open()
428 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
431 SNDRV_PCM_HW_PARAM_FORMAT, -1); in pcm_digital_in_open()
434 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_in_open()
437 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in pcm_digital_in_open()
442 mutex_unlock(&chip->mode_mutex); in pcm_digital_in_open()
455 max_channels = num_digital_busses_out(chip) - substream->number; in pcm_digital_out_open()
456 mutex_lock(&chip->mode_mutex); in pcm_digital_out_open()
457 if (chip->digital_mode == DIGITAL_MODE_ADAT) in pcm_digital_out_open()
462 err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT); in pcm_digital_out_open()
467 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
471 -1); in pcm_digital_out_open()
474 err = snd_pcm_hw_rule_add(substream->runtime, 0, in pcm_digital_out_open()
478 -1); in pcm_digital_out_open()
483 mutex_unlock(&chip->mode_mutex); in pcm_digital_out_open()
501 mutex_lock(&chip->mode_mutex); in pcm_close()
503 dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d", in pcm_close()
504 chip->opencount, chip->can_set_rate, chip->rate_set); in pcm_close()
506 chip->opencount--; in pcm_close()
508 switch (chip->opencount) { in pcm_close()
510 chip->can_set_rate = 1; in pcm_close()
514 chip->rate_set = 0; in pcm_close()
518 mutex_unlock(&chip->mode_mutex); in pcm_close()
524 /* Channel allocation and scatter-gather list setup */
534 pipe = (struct audiopipe *) substream->runtime->private_data; in init_engine()
539 spin_lock_irq(&chip->lock); in init_engine()
540 if (pipe->index >= 0) { in init_engine()
541 dev_dbg(chip->card->dev, "hwp_ie free(%d)\n", pipe->index); in init_engine()
544 chip->substream[pipe->index] = NULL; in init_engine()
549 spin_unlock_irq(&chip->lock); in init_engine()
550 dev_err(chip->card->dev, "allocate_pipes(%d) err=%d\n", in init_engine()
554 spin_unlock_irq(&chip->lock); in init_engine()
555 dev_dbg(chip->card->dev, "allocate_pipes()=%d\n", pipe_index); in init_engine()
557 dev_dbg(chip->card->dev, in init_engine()
568 rest = params_buffer_bytes(hw_params) - offs; in init_engine()
572 if (rest <= edge - offs) { in init_engine()
579 edge - offs); in init_engine()
580 rest -= edge - offs; in init_engine()
594 * initialized before chip->substream in init_engine()
596 pipe->last_period = 0; in init_engine()
597 pipe->last_counter = 0; in init_engine()
598 pipe->position = 0; in init_engine()
600 chip->substream[pipe_index] = substream; in init_engine()
601 chip->rate_set = 1; in init_engine()
602 spin_lock_irq(&chip->lock); in init_engine()
603 set_sample_rate(chip, hw_params->rate_num / hw_params->rate_den); in init_engine()
604 spin_unlock_irq(&chip->lock); in init_engine()
616 substream->number, params_channels(hw_params)); in pcm_analog_in_hw_params()
624 return init_engine(substream, hw_params, substream->number, in pcm_analog_out_hw_params()
638 substream->number, params_channels(hw_params)); in pcm_digital_in_hw_params()
650 substream->number, params_channels(hw_params)); in pcm_digital_out_hw_params()
664 pipe = (struct audiopipe *) substream->runtime->private_data; in pcm_hw_free()
666 spin_lock_irq(&chip->lock); in pcm_hw_free()
667 if (pipe->index >= 0) { in pcm_hw_free()
668 dev_dbg(chip->card->dev, "pcm_hw_free(%d)\n", pipe->index); in pcm_hw_free()
670 chip->substream[pipe->index] = NULL; in pcm_hw_free()
671 pipe->index = -1; in pcm_hw_free()
673 spin_unlock_irq(&chip->lock); in pcm_hw_free()
683 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_prepare()
685 int pipe_index = ((struct audiopipe *)runtime->private_data)->index; in pcm_prepare()
687 dev_dbg(chip->card->dev, "Prepare rate=%d format=%d channels=%d\n", in pcm_prepare()
688 runtime->rate, runtime->format, runtime->channels); in pcm_prepare()
689 format.interleave = runtime->channels; in pcm_prepare()
692 switch (runtime->format) { in pcm_prepare()
709 dev_err(chip->card->dev, in pcm_prepare()
711 runtime->format); in pcm_prepare()
712 return -EINVAL; in pcm_prepare()
716 return -EINVAL; in pcm_prepare()
723 spin_lock_irq(&chip->lock); in pcm_prepare()
726 spin_unlock_irq(&chip->lock); in pcm_prepare()
727 return -EINVAL; in pcm_prepare()
731 spin_unlock_irq(&chip->lock); in pcm_prepare()
748 if (s == chip->substream[i]) { in pcm_trigger()
755 spin_lock(&chip->lock); in pcm_trigger()
762 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
763 switch (pipe->state) { in pcm_trigger()
765 pipe->last_period = 0; in pcm_trigger()
766 pipe->last_counter = 0; in pcm_trigger()
767 pipe->position = 0; in pcm_trigger()
768 *pipe->dma_counter = 0; in pcm_trigger()
771 pipe->state = PIPE_STATE_STARTED; in pcm_trigger()
779 chip->pipe_cyclic_mask); in pcm_trigger()
785 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
786 pipe->state = PIPE_STATE_STOPPED; in pcm_trigger()
794 pipe = chip->substream[i]->runtime->private_data; in pcm_trigger()
795 pipe->state = PIPE_STATE_PAUSED; in pcm_trigger()
801 err = -EINVAL; in pcm_trigger()
803 spin_unlock(&chip->lock); in pcm_trigger()
811 struct snd_pcm_runtime *runtime = substream->runtime; in pcm_pointer()
812 struct audiopipe *pipe = runtime->private_data; in pcm_pointer()
820 counter = le32_to_cpu(*pipe->dma_counter); /* presumed atomic */ in pcm_pointer()
822 step = counter - pipe->last_counter; /* handles wrapping */ in pcm_pointer()
823 pipe->last_counter = counter; in pcm_pointer()
829 pipe->position += step; in pcm_pointer()
830 pipe->position %= frames_to_bytes(runtime, runtime->buffer_size); /* wrap */ in pcm_pointer()
832 return bytes_to_frames(runtime, pipe->position); in pcm_pointer()
837 /* pcm *_ops structures */
884 static void snd_echo_preallocate_pages(struct snd_pcm *pcm, struct device *dev) in snd_echo_preallocate_pages() argument
890 for (ss = pcm->streams[stream].substream; ss; ss = ss->next) in snd_echo_preallocate_pages()
893 ss->number ? 0 : 128<<10, in snd_echo_preallocate_pages()
899 /*<--snd_echo_probe() */
902 struct snd_pcm *pcm; in snd_echo_new_pcm() local
906 /* This card has a Vmixer, that is there is no direct mapping from PCM in snd_echo_new_pcm()
912 /* PCM#0 Virtual outputs and analog inputs */ in snd_echo_new_pcm()
913 err = snd_pcm_new(chip->card, "PCM", 0, num_pipes_out(chip), in snd_echo_new_pcm()
914 num_analog_busses_in(chip), &pcm); in snd_echo_new_pcm()
917 pcm->private_data = chip; in snd_echo_new_pcm()
918 chip->analog_pcm = pcm; in snd_echo_new_pcm()
919 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
920 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops); in snd_echo_new_pcm()
921 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops); in snd_echo_new_pcm()
922 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
925 /* PCM#1 Digital inputs, no outputs */ in snd_echo_new_pcm()
926 err = snd_pcm_new(chip->card, "Digital PCM", 1, 0, in snd_echo_new_pcm()
927 num_digital_busses_in(chip), &pcm); in snd_echo_new_pcm()
930 pcm->private_data = chip; in snd_echo_new_pcm()
931 chip->digital_pcm = pcm; in snd_echo_new_pcm()
932 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
933 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops); in snd_echo_new_pcm()
934 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
942 register two PCM devices: */ in snd_echo_new_pcm()
944 /* PCM#0 Analog i/o */ in snd_echo_new_pcm()
945 err = snd_pcm_new(chip->card, "Analog PCM", 0, in snd_echo_new_pcm()
947 num_analog_busses_in(chip), &pcm); in snd_echo_new_pcm()
950 pcm->private_data = chip; in snd_echo_new_pcm()
951 chip->analog_pcm = pcm; in snd_echo_new_pcm()
952 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
953 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops); in snd_echo_new_pcm()
954 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops); in snd_echo_new_pcm()
955 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
958 /* PCM#1 Digital i/o */ in snd_echo_new_pcm()
959 err = snd_pcm_new(chip->card, "Digital PCM", 1, in snd_echo_new_pcm()
961 num_digital_busses_in(chip), &pcm); in snd_echo_new_pcm()
964 pcm->private_data = chip; in snd_echo_new_pcm()
965 chip->digital_pcm = pcm; in snd_echo_new_pcm()
966 strcpy(pcm->name, chip->card->shortname); in snd_echo_new_pcm()
967 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &digital_playback_ops); in snd_echo_new_pcm()
968 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops); in snd_echo_new_pcm()
969 snd_echo_preallocate_pages(pcm, &chip->pci->dev); in snd_echo_new_pcm()
986 /******************* PCM output volume *******************/
993 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_output_gain_info()
994 uinfo->count = num_busses_out(chip); in snd_echo_output_gain_info()
995 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_output_gain_info()
996 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_output_gain_info()
1008 ucontrol->value.integer.value[c] = chip->output_gain[c]; in snd_echo_output_gain_get()
1020 spin_lock_irq(&chip->lock); in snd_echo_output_gain_put()
1022 gain = ucontrol->value.integer.value[c]; in snd_echo_output_gain_put()
1026 if (chip->output_gain[c] != gain) { in snd_echo_output_gain_put()
1033 spin_unlock_irq(&chip->lock); in snd_echo_output_gain_put()
1038 /* On the Mia this one controls the line-out volume */
1051 .name = "PCM Playback Volume",
1074 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_input_gain_info()
1075 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_gain_info()
1076 uinfo->value.integer.min = ECHOGAIN_MININP; in snd_echo_input_gain_info()
1077 uinfo->value.integer.max = ECHOGAIN_MAXINP; in snd_echo_input_gain_info()
1089 ucontrol->value.integer.value[c] = chip->input_gain[c]; in snd_echo_input_gain_get()
1101 spin_lock_irq(&chip->lock); in snd_echo_input_gain_put()
1103 gain = ucontrol->value.integer.value[c]; in snd_echo_input_gain_put()
1107 if (chip->input_gain[c] != gain) { in snd_echo_input_gain_put()
1114 spin_unlock_irq(&chip->lock); in snd_echo_input_gain_put()
1118 static const DECLARE_TLV_DB_SCALE(db_scale_input_gain, -2500, 50, 0);
1136 /************ Analog output nominal level (+4dBu / -10dBV) ***************/
1143 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_output_nominal_info()
1144 uinfo->count = num_analog_busses_out(chip); in snd_echo_output_nominal_info()
1145 uinfo->value.integer.min = 0; in snd_echo_output_nominal_info()
1146 uinfo->value.integer.max = 1; in snd_echo_output_nominal_info()
1158 ucontrol->value.integer.value[c] = chip->nominal_level[c]; in snd_echo_output_nominal_get()
1170 spin_lock_irq(&chip->lock); in snd_echo_output_nominal_put()
1172 if (chip->nominal_level[c] != ucontrol->value.integer.value[c]) { in snd_echo_output_nominal_put()
1174 ucontrol->value.integer.value[c]); in snd_echo_output_nominal_put()
1180 spin_unlock_irq(&chip->lock); in snd_echo_output_nominal_put()
1185 .name = "Line Playback Switch (-10dBV)",
1198 /*************** Analog input nominal level (+4dBu / -10dBV) ***************/
1205 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_echo_input_nominal_info()
1206 uinfo->count = num_analog_busses_in(chip); in snd_echo_input_nominal_info()
1207 uinfo->value.integer.min = 0; in snd_echo_input_nominal_info()
1208 uinfo->value.integer.max = 1; in snd_echo_input_nominal_info()
1220 ucontrol->value.integer.value[c] = in snd_echo_input_nominal_get()
1221 chip->nominal_level[bx_analog_in(chip) + c]; in snd_echo_input_nominal_get()
1233 spin_lock_irq(&chip->lock); in snd_echo_input_nominal_put()
1235 if (chip->nominal_level[bx_analog_in(chip) + c] != in snd_echo_input_nominal_put()
1236 ucontrol->value.integer.value[c]) { in snd_echo_input_nominal_put()
1238 ucontrol->value.integer.value[c]); in snd_echo_input_nominal_put()
1246 spin_unlock_irq(&chip->lock); in snd_echo_input_nominal_put()
1251 .name = "Line Capture Switch (-10dBV)",
1268 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_mixer_info()
1269 uinfo->count = 1; in snd_echo_mixer_info()
1270 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_mixer_info()
1271 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_mixer_info()
1279 unsigned int out = ucontrol->id.index / num_busses_in(chip); in snd_echo_mixer_get()
1280 unsigned int in = ucontrol->id.index % num_busses_in(chip); in snd_echo_mixer_get()
1283 return -EINVAL; in snd_echo_mixer_get()
1285 ucontrol->value.integer.value[0] = chip->monitor_gain[out][in]; in snd_echo_mixer_get()
1298 out = ucontrol->id.index / num_busses_in(chip); in snd_echo_mixer_put()
1299 in = ucontrol->id.index % num_busses_in(chip); in snd_echo_mixer_put()
1301 return -EINVAL; in snd_echo_mixer_put()
1302 gain = ucontrol->value.integer.value[0]; in snd_echo_mixer_put()
1304 return -EINVAL; in snd_echo_mixer_put()
1305 if (chip->monitor_gain[out][in] != gain) { in snd_echo_mixer_put()
1306 spin_lock_irq(&chip->lock); in snd_echo_mixer_put()
1309 spin_unlock_irq(&chip->lock); in snd_echo_mixer_put()
1335 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vmixer_info()
1336 uinfo->count = 1; in snd_echo_vmixer_info()
1337 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vmixer_info()
1338 uinfo->value.integer.max = ECHOGAIN_MAXOUT; in snd_echo_vmixer_info()
1348 ucontrol->value.integer.value[0] = in snd_echo_vmixer_get()
1349 chip->vmixer_gain[ucontrol->id.index / num_pipes_out(chip)] in snd_echo_vmixer_get()
1350 [ucontrol->id.index % num_pipes_out(chip)]; in snd_echo_vmixer_get()
1363 out = ucontrol->id.index / num_pipes_out(chip); in snd_echo_vmixer_put()
1364 vch = ucontrol->id.index % num_pipes_out(chip); in snd_echo_vmixer_put()
1365 gain = ucontrol->value.integer.value[0]; in snd_echo_vmixer_put()
1367 return -EINVAL; in snd_echo_vmixer_put()
1368 if (chip->vmixer_gain[out][vch] != ucontrol->value.integer.value[0]) { in snd_echo_vmixer_put()
1369 spin_lock_irq(&chip->lock); in snd_echo_vmixer_put()
1370 set_vmixer_gain(chip, out, vch, ucontrol->value.integer.value[0]); in snd_echo_vmixer_put()
1372 spin_unlock_irq(&chip->lock); in snd_echo_vmixer_put()
1394 /******************* Digital mode switch *******************/
1405 return snd_ctl_enum_info(uinfo, 1, chip->num_digital_modes, names); in snd_echo_digital_mode_info()
1412 int i, mode; in snd_echo_digital_mode_get() local
1415 mode = chip->digital_mode; in snd_echo_digital_mode_get()
1416 for (i = chip->num_digital_modes - 1; i >= 0; i--) in snd_echo_digital_mode_get()
1417 if (mode == chip->digital_mode_list[i]) { in snd_echo_digital_mode_get()
1418 ucontrol->value.enumerated.item[0] = i; in snd_echo_digital_mode_get()
1434 emode = ucontrol->value.enumerated.item[0]; in snd_echo_digital_mode_put()
1435 if (emode >= chip->num_digital_modes) in snd_echo_digital_mode_put()
1436 return -EINVAL; in snd_echo_digital_mode_put()
1437 dmode = chip->digital_mode_list[emode]; in snd_echo_digital_mode_put()
1439 if (dmode != chip->digital_mode) { in snd_echo_digital_mode_put()
1442 mutex_lock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1444 /* Do not allow the user to change the digital mode when a pcm in snd_echo_digital_mode_put()
1447 if (chip->opencount) { in snd_echo_digital_mode_put()
1448 changed = -EAGAIN; in snd_echo_digital_mode_put()
1451 /* If we had to change the clock source, report it */ in snd_echo_digital_mode_put()
1452 if (changed > 0 && chip->clock_src_ctl) { in snd_echo_digital_mode_put()
1453 snd_ctl_notify(chip->card, in snd_echo_digital_mode_put()
1455 &chip->clock_src_ctl->id); in snd_echo_digital_mode_put()
1456 dev_dbg(chip->card->dev, in snd_echo_digital_mode_put()
1462 mutex_unlock(&chip->mode_mutex); in snd_echo_digital_mode_put()
1468 .name = "Digital mode Switch",
1481 /******************* S/PDIF mode switch *******************/
1496 ucontrol->value.enumerated.item[0] = !!chip->professional_spdif; in snd_echo_spdif_mode_get()
1504 int mode; in snd_echo_spdif_mode_put() local
1507 mode = !!ucontrol->value.enumerated.item[0]; in snd_echo_spdif_mode_put()
1508 if (mode != chip->professional_spdif) { in snd_echo_spdif_mode_put()
1509 spin_lock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1510 set_professional_spdif(chip, mode); in snd_echo_spdif_mode_put()
1511 spin_unlock_irq(&chip->lock); in snd_echo_spdif_mode_put()
1518 .name = "S/PDIF mode Switch",
1531 /******************* Select input clock source *******************/
1542 return snd_ctl_enum_info(uinfo, 1, chip->num_clock_sources, names); in snd_echo_clock_source_info()
1549 int i, clock; in snd_echo_clock_source_get() local
1552 clock = chip->input_clock; in snd_echo_clock_source_get()
1554 for (i = 0; i < chip->num_clock_sources; i++) in snd_echo_clock_source_get()
1555 if (clock == chip->clock_source_list[i]) in snd_echo_clock_source_get()
1556 ucontrol->value.enumerated.item[0] = i; in snd_echo_clock_source_get()
1570 eclock = ucontrol->value.enumerated.item[0]; in snd_echo_clock_source_put()
1571 if (eclock >= chip->input_clock_types) in snd_echo_clock_source_put()
1572 return -EINVAL; in snd_echo_clock_source_put()
1573 dclock = chip->clock_source_list[eclock]; in snd_echo_clock_source_put()
1574 if (chip->input_clock != dclock) { in snd_echo_clock_source_put()
1575 mutex_lock(&chip->mode_mutex); in snd_echo_clock_source_put()
1576 spin_lock_irq(&chip->lock); in snd_echo_clock_source_put()
1580 spin_unlock_irq(&chip->lock); in snd_echo_clock_source_put()
1581 mutex_unlock(&chip->mode_mutex); in snd_echo_clock_source_put()
1585 dev_dbg(chip->card->dev, in snd_echo_clock_source_put()
1592 .name = "Sample Clock Source",
1613 ucontrol->value.integer.value[0] = chip->phantom_power; in snd_echo_phantom_power_get()
1623 power = !!ucontrol->value.integer.value[0]; in snd_echo_phantom_power_put()
1624 if (chip->phantom_power != power) { in snd_echo_phantom_power_put()
1625 spin_lock_irq(&chip->lock); in snd_echo_phantom_power_put()
1627 spin_unlock_irq(&chip->lock); in snd_echo_phantom_power_put()
1656 ucontrol->value.integer.value[0] = chip->digital_in_automute; in snd_echo_automute_get()
1666 automute = !!ucontrol->value.integer.value[0]; in snd_echo_automute_put()
1667 if (chip->digital_in_automute != automute) { in snd_echo_automute_put()
1668 spin_lock_irq(&chip->lock); in snd_echo_automute_put()
1670 spin_unlock_irq(&chip->lock); in snd_echo_automute_put()
1689 /******************* VU-meters switch *******************/
1698 spin_lock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1699 set_meters_on(chip, ucontrol->value.integer.value[0]); in snd_echo_vumeters_switch_put()
1700 spin_unlock_irq(&chip->lock); in snd_echo_vumeters_switch_put()
1705 .name = "VU-meters Switch",
1714 /***** Read VU-meters (input, output, analog and digital together) *****/
1718 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_vumeters_info()
1719 uinfo->count = 96; in snd_echo_vumeters_info()
1720 uinfo->value.integer.min = ECHOGAIN_MINOUT; in snd_echo_vumeters_info()
1721 uinfo->value.integer.max = 0; in snd_echo_vumeters_info()
1731 get_audio_meters(chip, ucontrol->value.integer.value); in snd_echo_vumeters_get()
1736 .name = "VU-meters",
1748 /*** Channels info - it exports informations about the number of channels ***/
1752 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_echo_channels_info_info()
1753 uinfo->count = 6; in snd_echo_channels_info_info()
1754 uinfo->value.integer.min = 0; in snd_echo_channels_info_info()
1755 uinfo->value.integer.max = 1 << ECHO_CLOCK_NUMBER; in snd_echo_channels_info_info()
1766 ucontrol->value.integer.value[0] = num_busses_in(chip); in snd_echo_channels_info_get()
1767 ucontrol->value.integer.value[1] = num_analog_busses_in(chip); in snd_echo_channels_info_get()
1768 ucontrol->value.integer.value[2] = num_busses_out(chip); in snd_echo_channels_info_get()
1769 ucontrol->value.integer.value[3] = num_analog_busses_out(chip); in snd_echo_channels_info_get()
1770 ucontrol->value.integer.value[4] = num_pipes_out(chip); in snd_echo_channels_info_get()
1775 src = chip->num_clock_sources - 1; in snd_echo_channels_info_get()
1776 for (bit = ECHO_CLOCK_NUMBER - 1; bit >= 0; bit--) in snd_echo_channels_info_get()
1778 for (; src >= 0; src--) in snd_echo_channels_info_get()
1779 if (bit == chip->clock_source_list[src]) { in snd_echo_channels_info_get()
1783 ucontrol->value.integer.value[5] = clocks; in snd_echo_channels_info_get()
1804 * Don't make any updates to state; PCM core handles this with the
1811 struct snd_pcm_runtime *runtime = substream->runtime; in period_has_elapsed()
1812 struct audiopipe *pipe = runtime->private_data; in period_has_elapsed()
1816 if (pipe->state != PIPE_STATE_STARTED) in period_has_elapsed()
1819 period_bytes = frames_to_bytes(runtime, runtime->period_size); in period_has_elapsed()
1821 counter = le32_to_cpu(*pipe->dma_counter); /* presumed atomic */ in period_has_elapsed()
1823 step = counter - pipe->last_period; /* handles wrapping */ in period_has_elapsed()
1824 step -= step % period_bytes; /* acknowledge whole periods only */ in period_has_elapsed()
1829 pipe->last_period += step; /* used exclusively by us */ in period_has_elapsed()
1838 spin_lock(&chip->lock); in snd_echo_interrupt()
1841 spin_unlock(&chip->lock); in snd_echo_interrupt()
1849 substream = chip->substream[ss]; in snd_echo_interrupt()
1851 spin_unlock(&chip->lock); in snd_echo_interrupt()
1853 spin_lock(&chip->lock); in snd_echo_interrupt()
1856 spin_unlock(&chip->lock); in snd_echo_interrupt()
1859 if (st > 0 && chip->midi_in) { in snd_echo_interrupt()
1860 snd_rawmidi_receive(chip->midi_in, chip->midi_buffer, st); in snd_echo_interrupt()
1861 dev_dbg(chip->card->dev, "rawmidi_iread=%d\n", st); in snd_echo_interrupt()
1876 struct echoaudio *chip = card->private_data; in snd_echo_free()
1878 if (chip->comm_page) in snd_echo_free()
1881 if (chip->irq >= 0) in snd_echo_free()
1882 free_irq(chip->irq, chip); in snd_echo_free()
1888 /* <--snd_echo_probe() */
1892 struct echoaudio *chip = card->private_data; in snd_echo_create()
1904 spin_lock_init(&chip->lock); in snd_echo_create()
1905 chip->card = card; in snd_echo_create()
1906 chip->pci = pci; in snd_echo_create()
1907 chip->irq = -1; in snd_echo_create()
1908 chip->opencount = 0; in snd_echo_create()
1909 mutex_init(&chip->mode_mutex); in snd_echo_create()
1910 chip->can_set_rate = 1; in snd_echo_create()
1917 chip->dsp_registers_phys = pci_resource_start(pci, 0); in snd_echo_create()
1922 chip->dsp_registers = devm_ioremap(&pci->dev, chip->dsp_registers_phys, sz); in snd_echo_create()
1923 if (!chip->dsp_registers) { in snd_echo_create()
1924 dev_err(chip->card->dev, "ioremap failed\n"); in snd_echo_create()
1925 return -ENOMEM; in snd_echo_create()
1928 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_create()
1930 dev_err(chip->card->dev, "cannot grab irq\n"); in snd_echo_create()
1931 return -EBUSY; in snd_echo_create()
1933 chip->irq = pci->irq; in snd_echo_create()
1934 card->sync_irq = chip->irq; in snd_echo_create()
1935 dev_dbg(card->dev, "pci=%p irq=%d subdev=%04x Init hardware...\n", in snd_echo_create()
1936 chip->pci, chip->irq, chip->pci->subsystem_device); in snd_echo_create()
1938 card->private_free = snd_echo_free; in snd_echo_create()
1940 /* Create the DSP comm page - this is the area of memory used for most in snd_echo_create()
1942 chip->commpage_dma_buf = in snd_echo_create()
1943 snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, in snd_echo_create()
1945 if (!chip->commpage_dma_buf) in snd_echo_create()
1946 return -ENOMEM; in snd_echo_create()
1947 chip->comm_page_phys = chip->commpage_dma_buf->addr; in snd_echo_create()
1948 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf->area; in snd_echo_create()
1950 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_create()
1954 dev_err(card->dev, "init_hw err=%d\n", err); in snd_echo_create()
1973 return -ENODEV; in __snd_echo_probe()
1976 return -ENOENT; in __snd_echo_probe()
1980 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in __snd_echo_probe()
1984 chip = card->private_data; in __snd_echo_probe()
1990 strcpy(card->driver, "Echo_" ECHOCARD_NAME); in __snd_echo_probe()
1991 strcpy(card->shortname, chip->card_name); in __snd_echo_probe()
1994 if (pci_id->device == 0x3410) in __snd_echo_probe()
1997 sprintf(card->longname, "%s rev.%d (DSP%s) at 0x%lx irq %i", in __snd_echo_probe()
1998 card->shortname, pci_id->subdevice & 0x000f, dsp, in __snd_echo_probe()
1999 chip->dsp_registers_phys, chip->irq); in __snd_echo_probe()
2003 dev_err(chip->card->dev, "new pcm error %d\n", err); in __snd_echo_probe()
2008 if (chip->has_midi) { /* Some Mia's do not have midi */ in __snd_echo_probe()
2011 dev_err(chip->card->dev, "new midi error %d\n", err); in __snd_echo_probe()
2019 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip)); in __snd_echo_probe()
2023 err = snd_ctl_add(chip->card, in __snd_echo_probe()
2029 err = snd_ctl_add(chip->card, in __snd_echo_probe()
2036 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip)); in __snd_echo_probe()
2042 if (!chip->hasnt_input_nominal_level) { in __snd_echo_probe()
2043 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip)); in __snd_echo_probe()
2050 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip)); in __snd_echo_probe()
2055 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip)); in __snd_echo_probe()
2059 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip)); in __snd_echo_probe()
2065 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip)); in __snd_echo_probe()
2071 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip)); in __snd_echo_probe()
2076 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip)); in __snd_echo_probe()
2082 chip->num_digital_modes = 0; in __snd_echo_probe()
2084 if (chip->digital_modes & (1 << i)) in __snd_echo_probe()
2085 chip->digital_mode_list[chip->num_digital_modes++] = i; in __snd_echo_probe()
2087 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip)); in __snd_echo_probe()
2093 /* Creates a list of available clock sources */ in __snd_echo_probe()
2094 chip->num_clock_sources = 0; in __snd_echo_probe()
2096 if (chip->input_clock_types & (1 << i)) in __snd_echo_probe()
2097 chip->clock_source_list[chip->num_clock_sources++] = i; in __snd_echo_probe()
2099 if (chip->num_clock_sources > 1) { in __snd_echo_probe()
2100 chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip); in __snd_echo_probe()
2101 err = snd_ctl_add(chip->card, chip->clock_src_ctl); in __snd_echo_probe()
2108 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip)); in __snd_echo_probe()
2114 if (chip->has_phantom_power) { in __snd_echo_probe()
2115 err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip)); in __snd_echo_probe()
2124 dev_info(card->dev, "Card registered: %s\n", card->longname); in __snd_echo_probe()
2134 return snd_card_free_on_error(&pci->dev, __snd_echo_probe(pci, pci_id)); in snd_echo_probe()
2144 if (chip->midi_out) in snd_echo_suspend()
2145 snd_echo_midi_output_trigger(chip->midi_out, 0); in snd_echo_suspend()
2147 spin_lock_irq(&chip->lock); in snd_echo_suspend()
2149 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2150 return -EIO; in snd_echo_suspend()
2154 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2155 return -EIO; in snd_echo_suspend()
2157 spin_unlock_irq(&chip->lock); in snd_echo_suspend()
2159 chip->dsp_code = NULL; in snd_echo_suspend()
2160 free_irq(chip->irq, chip); in snd_echo_suspend()
2161 chip->irq = -1; in snd_echo_suspend()
2162 chip->card->sync_irq = -1; in snd_echo_suspend()
2176 commpage = chip->comm_page; in snd_echo_resume()
2179 return -ENOMEM; in snd_echo_resume()
2181 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); in snd_echo_resume()
2188 /* Temporarily set chip->pipe_alloc_mask=0 otherwise in snd_echo_resume()
2191 pipe_alloc_mask = chip->pipe_alloc_mask; in snd_echo_resume()
2192 chip->pipe_alloc_mask = 0; in snd_echo_resume()
2194 chip->pipe_alloc_mask = pipe_alloc_mask; in snd_echo_resume()
2200 memcpy(&commpage->audio_format, &commpage_bak->audio_format, in snd_echo_resume()
2201 sizeof(commpage->audio_format)); in snd_echo_resume()
2202 memcpy(&commpage->sglist_addr, &commpage_bak->sglist_addr, in snd_echo_resume()
2203 sizeof(commpage->sglist_addr)); in snd_echo_resume()
2204 memcpy(&commpage->midi_output, &commpage_bak->midi_output, in snd_echo_resume()
2205 sizeof(commpage->midi_output)); in snd_echo_resume()
2208 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, in snd_echo_resume()
2210 dev_err(chip->card->dev, "cannot grab irq\n"); in snd_echo_resume()
2211 return -EBUSY; in snd_echo_resume()
2213 chip->irq = pci->irq; in snd_echo_resume()
2214 chip->card->sync_irq = chip->irq; in snd_echo_resume()
2215 dev_dbg(dev, "resume irq=%d\n", chip->irq); in snd_echo_resume()
2218 if (chip->midi_input_enabled) in snd_echo_resume()
2220 if (chip->midi_out) in snd_echo_resume()
2221 snd_echo_midi_output_trigger(chip->midi_out, 1); in snd_echo_resume()