brintos

brintos / linux-shallow public Read only

0
0
Text · 58.4 KiB · 7484de2 Raw
2244 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 *  ALSA driver for Echoaudio soundcards.4 *  Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>5 *  Copyright (C) 2020 Mark Hills <mark@xwax.org>6 */7 8#include <linux/module.h>9 10MODULE_AUTHOR("Giuliano Pochini <pochini@shiny.it>");11MODULE_LICENSE("GPL v2");12MODULE_DESCRIPTION("Echoaudio " ECHOCARD_NAME " soundcards driver");13MODULE_DEVICE_TABLE(pci, snd_echo_ids);14 15static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;16static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;17static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;18 19module_param_array(index, int, NULL, 0444);20MODULE_PARM_DESC(index, "Index value for " ECHOCARD_NAME " soundcard.");21module_param_array(id, charp, NULL, 0444);22MODULE_PARM_DESC(id, "ID string for " ECHOCARD_NAME " soundcard.");23module_param_array(enable, bool, NULL, 0444);24MODULE_PARM_DESC(enable, "Enable " ECHOCARD_NAME " soundcard.");25 26static const unsigned int channels_list[10] = {1, 2, 4, 6, 8, 10, 12, 14, 16, 999999};27static const DECLARE_TLV_DB_SCALE(db_scale_output_gain, -12800, 100, 1);28 29 30 31static int get_firmware(const struct firmware **fw_entry,32			struct echoaudio *chip, const short fw_index)33{34	int err;35	char name[30];36 37	if (chip->fw_cache[fw_index]) {38		dev_dbg(chip->card->dev,39			"firmware requested: %s is cached\n",40			card_fw[fw_index].data);41		*fw_entry = chip->fw_cache[fw_index];42		return 0;43	}44 45	dev_dbg(chip->card->dev,46		"firmware requested: %s\n", card_fw[fw_index].data);47	snprintf(name, sizeof(name), "ea/%s", card_fw[fw_index].data);48	err = request_firmware(fw_entry, name, &chip->pci->dev);49	if (err < 0)50		dev_err(chip->card->dev,51			"get_firmware(): Firmware not available (%d)\n", err);52	else53		chip->fw_cache[fw_index] = *fw_entry;54	return err;55}56 57 58 59static void free_firmware(const struct firmware *fw_entry,60			  struct echoaudio *chip)61{62	dev_dbg(chip->card->dev, "firmware not released (kept in cache)\n");63}64 65 66 67static void free_firmware_cache(struct echoaudio *chip)68{69	int i;70 71	for (i = 0; i < 8 ; i++)72		if (chip->fw_cache[i]) {73			release_firmware(chip->fw_cache[i]);74			dev_dbg(chip->card->dev, "release_firmware(%d)\n", i);75		}76}77 78 79 80/******************************************************************************81	PCM interface82******************************************************************************/83 84static void audiopipe_free(struct snd_pcm_runtime *runtime)85{86	struct audiopipe *pipe = runtime->private_data;87 88	if (pipe->sgpage.area)89		snd_dma_free_pages(&pipe->sgpage);90	kfree(pipe);91}92 93 94 95static int hw_rule_capture_format_by_channels(struct snd_pcm_hw_params *params,96					      struct snd_pcm_hw_rule *rule)97{98	struct snd_interval *c = hw_param_interval(params,99						   SNDRV_PCM_HW_PARAM_CHANNELS);100	struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);101	struct snd_mask fmt;102 103	snd_mask_any(&fmt);104 105#ifndef ECHOCARD_HAS_STEREO_BIG_ENDIAN32106	/* >=2 channels cannot be S32_BE */107	if (c->min == 2) {108		fmt.bits[0] &= ~SNDRV_PCM_FMTBIT_S32_BE;109		return snd_mask_refine(f, &fmt);110	}111#endif112	/* > 2 channels cannot be U8 and S32_BE */113	if (c->min > 2) {114		fmt.bits[0] &= ~(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_BE);115		return snd_mask_refine(f, &fmt);116	}117	/* Mono is ok with any format */118	return 0;119}120 121 122 123static int hw_rule_capture_channels_by_format(struct snd_pcm_hw_params *params,124					      struct snd_pcm_hw_rule *rule)125{126	struct snd_interval *c = hw_param_interval(params,127						   SNDRV_PCM_HW_PARAM_CHANNELS);128	struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);129	struct snd_interval ch;130 131	snd_interval_any(&ch);132 133	/* S32_BE is mono (and stereo) only */134	if (f->bits[0] == SNDRV_PCM_FMTBIT_S32_BE) {135		ch.min = 1;136#ifdef ECHOCARD_HAS_STEREO_BIG_ENDIAN32137		ch.max = 2;138#else139		ch.max = 1;140#endif141		ch.integer = 1;142		return snd_interval_refine(c, &ch);143	}144	/* U8 can be only mono or stereo */145	if (f->bits[0] == SNDRV_PCM_FMTBIT_U8) {146		ch.min = 1;147		ch.max = 2;148		ch.integer = 1;149		return snd_interval_refine(c, &ch);150	}151	/* S16_LE, S24_3LE and S32_LE support any number of channels. */152	return 0;153}154 155 156 157static int hw_rule_playback_format_by_channels(struct snd_pcm_hw_params *params,158					       struct snd_pcm_hw_rule *rule)159{160	struct snd_interval *c = hw_param_interval(params,161						   SNDRV_PCM_HW_PARAM_CHANNELS);162	struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);163	struct snd_mask fmt;164	u64 fmask;165	snd_mask_any(&fmt);166 167	fmask = fmt.bits[0] + ((u64)fmt.bits[1] << 32);168 169	/* >2 channels must be S16_LE, S24_3LE or S32_LE */170	if (c->min > 2) {171		fmask &= SNDRV_PCM_FMTBIT_S16_LE |172			 SNDRV_PCM_FMTBIT_S24_3LE |173			 SNDRV_PCM_FMTBIT_S32_LE;174	/* 1 channel must be S32_BE or S32_LE */175	} else if (c->max == 1)176		fmask &= SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE;177#ifndef ECHOCARD_HAS_STEREO_BIG_ENDIAN32178	/* 2 channels cannot be S32_BE */179	else if (c->min == 2 && c->max == 2)180		fmask &= ~SNDRV_PCM_FMTBIT_S32_BE;181#endif182	else183		return 0;184 185	fmt.bits[0] &= (u32)fmask;186	fmt.bits[1] &= (u32)(fmask >> 32);187	return snd_mask_refine(f, &fmt);188}189 190 191 192static int hw_rule_playback_channels_by_format(struct snd_pcm_hw_params *params,193					       struct snd_pcm_hw_rule *rule)194{195	struct snd_interval *c = hw_param_interval(params,196						   SNDRV_PCM_HW_PARAM_CHANNELS);197	struct snd_mask *f = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);198	struct snd_interval ch;199	u64 fmask;200 201	snd_interval_any(&ch);202	ch.integer = 1;203	fmask = f->bits[0] + ((u64)f->bits[1] << 32);204 205	/* S32_BE is mono (and stereo) only */206	if (fmask == SNDRV_PCM_FMTBIT_S32_BE) {207		ch.min = 1;208#ifdef ECHOCARD_HAS_STEREO_BIG_ENDIAN32209		ch.max = 2;210#else211		ch.max = 1;212#endif213	/* U8 is stereo only */214	} else if (fmask == SNDRV_PCM_FMTBIT_U8)215		ch.min = ch.max = 2;216	/* S16_LE and S24_3LE must be at least stereo */217	else if (!(fmask & ~(SNDRV_PCM_FMTBIT_S16_LE |218			       SNDRV_PCM_FMTBIT_S24_3LE)))219		ch.min = 2;220	else221		return 0;222 223	return snd_interval_refine(c, &ch);224}225 226 227 228/* Since the sample rate is a global setting, do allow the user to change the229sample rate only if there is only one pcm device open. */230static int hw_rule_sample_rate(struct snd_pcm_hw_params *params,231			       struct snd_pcm_hw_rule *rule)232{233	struct snd_interval *rate = hw_param_interval(params,234						      SNDRV_PCM_HW_PARAM_RATE);235	struct echoaudio *chip = rule->private;236	struct snd_interval fixed;237	int err;238 239	mutex_lock(&chip->mode_mutex);240 241	if (chip->can_set_rate) {242		err = 0;243	} else {244		snd_interval_any(&fixed);245		fixed.min = fixed.max = chip->sample_rate;246		err = snd_interval_refine(rate, &fixed);247	}248 249	mutex_unlock(&chip->mode_mutex);250	return err;251}252 253 254static int pcm_open(struct snd_pcm_substream *substream,255		    signed char max_channels)256{257	struct echoaudio *chip;258	struct snd_pcm_runtime *runtime;259	struct audiopipe *pipe;260	int err, i;261 262	if (max_channels <= 0)263		return -EAGAIN;264 265	chip = snd_pcm_substream_chip(substream);266	runtime = substream->runtime;267 268	pipe = kzalloc(sizeof(struct audiopipe), GFP_KERNEL);269	if (!pipe)270		return -ENOMEM;271	pipe->index = -1;		/* Not configured yet */272 273	/* Set up hw capabilities and contraints */274	memcpy(&pipe->hw, &pcm_hardware_skel, sizeof(struct snd_pcm_hardware));275	dev_dbg(chip->card->dev, "max_channels=%d\n", max_channels);276	pipe->constr.list = channels_list;277	pipe->constr.mask = 0;278	for (i = 0; channels_list[i] <= max_channels; i++);279	pipe->constr.count = i;280	if (pipe->hw.channels_max > max_channels)281		pipe->hw.channels_max = max_channels;282	if (chip->digital_mode == DIGITAL_MODE_ADAT) {283		pipe->hw.rate_max = 48000;284		pipe->hw.rates &= SNDRV_PCM_RATE_8000_48000;285	}286 287	runtime->hw = pipe->hw;288	runtime->private_data = pipe;289	runtime->private_free = audiopipe_free;290	snd_pcm_set_sync(substream);291 292	/* Only mono and any even number of channels are allowed */293	err = snd_pcm_hw_constraint_list(runtime, 0,294					 SNDRV_PCM_HW_PARAM_CHANNELS,295					 &pipe->constr);296	if (err < 0)297		return err;298 299	/* All periods should have the same size */300	err = snd_pcm_hw_constraint_integer(runtime,301					    SNDRV_PCM_HW_PARAM_PERIODS);302	if (err < 0)303		return err;304 305	/* The hw accesses memory in chunks 32 frames long and they should be306	32-bytes-aligned. It's not a requirement, but it seems that IRQs are307	generated with a resolution of 32 frames. Thus we need the following */308	err = snd_pcm_hw_constraint_step(runtime, 0,309					 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32);310	if (err < 0)311		return err;312	err = snd_pcm_hw_constraint_step(runtime, 0,313					 SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);314	if (err < 0)315		return err;316 317	err = snd_pcm_hw_rule_add(substream->runtime, 0,318				  SNDRV_PCM_HW_PARAM_RATE,319				  hw_rule_sample_rate, chip,320				  SNDRV_PCM_HW_PARAM_RATE, -1);321	if (err < 0)322		return err;323 324	/* Allocate a page for the scatter-gather list */325	err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,326				  &chip->pci->dev,327				  PAGE_SIZE, &pipe->sgpage);328	if (err < 0) {329		dev_err(chip->card->dev, "s-g list allocation failed\n");330		return err;331	}332 333	/*334	 * Sole ownership required to set the rate335	 */336 337	dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d",338		chip->opencount, chip->can_set_rate, chip->rate_set);339 340	chip->opencount++;341	if (chip->opencount > 1 && chip->rate_set)342		chip->can_set_rate = 0;343 344	return 0;345}346 347 348 349static int pcm_analog_in_open(struct snd_pcm_substream *substream)350{351	struct echoaudio *chip = snd_pcm_substream_chip(substream);352	int err;353 354	err = pcm_open(substream,355		       num_analog_busses_in(chip) - substream->number);356	if (err < 0)357		return err;358	err = snd_pcm_hw_rule_add(substream->runtime, 0,359				  SNDRV_PCM_HW_PARAM_CHANNELS,360				  hw_rule_capture_channels_by_format, NULL,361				  SNDRV_PCM_HW_PARAM_FORMAT, -1);362	if (err < 0)363		return err;364	err = snd_pcm_hw_rule_add(substream->runtime, 0,365				  SNDRV_PCM_HW_PARAM_FORMAT,366				  hw_rule_capture_format_by_channels, NULL,367				  SNDRV_PCM_HW_PARAM_CHANNELS, -1);368	if (err < 0)369		return err;370 371	return 0;372}373 374 375 376static int pcm_analog_out_open(struct snd_pcm_substream *substream)377{378	struct echoaudio *chip = snd_pcm_substream_chip(substream);379	int max_channels, err;380 381#ifdef ECHOCARD_HAS_VMIXER382	max_channels = num_pipes_out(chip);383#else384	max_channels = num_analog_busses_out(chip);385#endif386	err = pcm_open(substream, max_channels - substream->number);387	if (err < 0)388		return err;389	err = snd_pcm_hw_rule_add(substream->runtime, 0,390				  SNDRV_PCM_HW_PARAM_CHANNELS,391				  hw_rule_playback_channels_by_format,392				  NULL,393				  SNDRV_PCM_HW_PARAM_FORMAT, -1);394	if (err < 0)395		return err;396	err = snd_pcm_hw_rule_add(substream->runtime, 0,397				  SNDRV_PCM_HW_PARAM_FORMAT,398				  hw_rule_playback_format_by_channels,399				  NULL,400				  SNDRV_PCM_HW_PARAM_CHANNELS, -1);401	if (err < 0)402		return err;403 404	return 0;405}406 407 408 409#ifdef ECHOCARD_HAS_DIGITAL_IO410 411static int pcm_digital_in_open(struct snd_pcm_substream *substream)412{413	struct echoaudio *chip = snd_pcm_substream_chip(substream);414	int err, max_channels;415 416	max_channels = num_digital_busses_in(chip) - substream->number;417	mutex_lock(&chip->mode_mutex);418	if (chip->digital_mode == DIGITAL_MODE_ADAT)419		err = pcm_open(substream, max_channels);420	else	/* If the card has ADAT, subtract the 6 channels421		 * that S/PDIF doesn't have422		 */423		err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT);424 425	if (err < 0)426		goto din_exit;427 428	err = snd_pcm_hw_rule_add(substream->runtime, 0,429				  SNDRV_PCM_HW_PARAM_CHANNELS,430				  hw_rule_capture_channels_by_format, NULL,431				  SNDRV_PCM_HW_PARAM_FORMAT, -1);432	if (err < 0)433		goto din_exit;434	err = snd_pcm_hw_rule_add(substream->runtime, 0,435				  SNDRV_PCM_HW_PARAM_FORMAT,436				  hw_rule_capture_format_by_channels, NULL,437				  SNDRV_PCM_HW_PARAM_CHANNELS, -1);438	if (err < 0)439		goto din_exit;440 441din_exit:442	mutex_unlock(&chip->mode_mutex);443	return err;444}445 446 447 448#ifndef ECHOCARD_HAS_VMIXER	/* See the note in snd_echo_new_pcm() */449 450static int pcm_digital_out_open(struct snd_pcm_substream *substream)451{452	struct echoaudio *chip = snd_pcm_substream_chip(substream);453	int err, max_channels;454 455	max_channels = num_digital_busses_out(chip) - substream->number;456	mutex_lock(&chip->mode_mutex);457	if (chip->digital_mode == DIGITAL_MODE_ADAT)458		err = pcm_open(substream, max_channels);459	else	/* If the card has ADAT, subtract the 6 channels460		 * that S/PDIF doesn't have461		 */462		err = pcm_open(substream, max_channels - ECHOCARD_HAS_ADAT);463 464	if (err < 0)465		goto dout_exit;466 467	err = snd_pcm_hw_rule_add(substream->runtime, 0,468				  SNDRV_PCM_HW_PARAM_CHANNELS,469				  hw_rule_playback_channels_by_format,470				  NULL, SNDRV_PCM_HW_PARAM_FORMAT,471				  -1);472	if (err < 0)473		goto dout_exit;474	err = snd_pcm_hw_rule_add(substream->runtime, 0,475				  SNDRV_PCM_HW_PARAM_FORMAT,476				  hw_rule_playback_format_by_channels,477				  NULL, SNDRV_PCM_HW_PARAM_CHANNELS,478				  -1);479	if (err < 0)480		goto dout_exit;481 482dout_exit:483	mutex_unlock(&chip->mode_mutex);484	return err;485}486 487#endif /* !ECHOCARD_HAS_VMIXER */488 489#endif /* ECHOCARD_HAS_DIGITAL_IO */490 491 492 493static int pcm_close(struct snd_pcm_substream *substream)494{495	struct echoaudio *chip = snd_pcm_substream_chip(substream);496 497	/* Nothing to do here. Audio is already off and pipe will be498	 * freed by its callback499	 */500 501	mutex_lock(&chip->mode_mutex);502 503	dev_dbg(chip->card->dev, "pcm_open opencount=%d can_set_rate=%d, rate_set=%d",504		chip->opencount, chip->can_set_rate, chip->rate_set);505 506	chip->opencount--;507 508	switch (chip->opencount) {509	case 1:510		chip->can_set_rate = 1;511		break;512 513	case 0:514		chip->rate_set = 0;515		break;516	}517 518	mutex_unlock(&chip->mode_mutex);519	return 0;520}521 522 523 524/* Channel allocation and scatter-gather list setup */525static int init_engine(struct snd_pcm_substream *substream,526		       struct snd_pcm_hw_params *hw_params,527		       int pipe_index, int interleave)528{529	struct echoaudio *chip;530	int err, per, rest, page, edge, offs;531	struct audiopipe *pipe;532 533	chip = snd_pcm_substream_chip(substream);534	pipe = (struct audiopipe *) substream->runtime->private_data;535 536	/* Sets up che hardware. If it's already initialized, reset and537	 * redo with the new parameters538	 */539	spin_lock_irq(&chip->lock);540	if (pipe->index >= 0) {541		dev_dbg(chip->card->dev, "hwp_ie free(%d)\n", pipe->index);542		err = free_pipes(chip, pipe);543		snd_BUG_ON(err);544		chip->substream[pipe->index] = NULL;545	}546 547	err = allocate_pipes(chip, pipe, pipe_index, interleave);548	if (err < 0) {549		spin_unlock_irq(&chip->lock);550		dev_err(chip->card->dev, "allocate_pipes(%d) err=%d\n",551			pipe_index, err);552		return err;553	}554	spin_unlock_irq(&chip->lock);555	dev_dbg(chip->card->dev, "allocate_pipes()=%d\n", pipe_index);556 557	dev_dbg(chip->card->dev,558		"pcm_hw_params (bufsize=%dB periods=%d persize=%dB)\n",559		params_buffer_bytes(hw_params), params_periods(hw_params),560		params_period_bytes(hw_params));561 562	sglist_init(chip, pipe);563	edge = PAGE_SIZE;564	for (offs = page = per = 0; offs < params_buffer_bytes(hw_params);565	     per++) {566		rest = params_period_bytes(hw_params);567		if (offs + rest > params_buffer_bytes(hw_params))568			rest = params_buffer_bytes(hw_params) - offs;569		while (rest) {570			dma_addr_t addr;571			addr = snd_pcm_sgbuf_get_addr(substream, offs);572			if (rest <= edge - offs) {573				sglist_add_mapping(chip, pipe, addr, rest);574				sglist_add_irq(chip, pipe);575				offs += rest;576				rest = 0;577			} else {578				sglist_add_mapping(chip, pipe, addr,579						   edge - offs);580				rest -= edge - offs;581				offs = edge;582			}583			if (offs == edge) {584				edge += PAGE_SIZE;585				page++;586			}587		}588	}589 590	/* Close the ring buffer */591	sglist_wrap(chip, pipe);592 593	/* This stuff is used by the irq handler, so it must be594	 * initialized before chip->substream595	 */596	pipe->last_period = 0;597	pipe->last_counter = 0;598	pipe->position = 0;599	smp_wmb();600	chip->substream[pipe_index] = substream;601	chip->rate_set = 1;602	spin_lock_irq(&chip->lock);603	set_sample_rate(chip, hw_params->rate_num / hw_params->rate_den);604	spin_unlock_irq(&chip->lock);605	return 0;606}607 608 609 610static int pcm_analog_in_hw_params(struct snd_pcm_substream *substream,611				   struct snd_pcm_hw_params *hw_params)612{613	struct echoaudio *chip = snd_pcm_substream_chip(substream);614 615	return init_engine(substream, hw_params, px_analog_in(chip) +616			substream->number, params_channels(hw_params));617}618 619 620 621static int pcm_analog_out_hw_params(struct snd_pcm_substream *substream,622				    struct snd_pcm_hw_params *hw_params)623{624	return init_engine(substream, hw_params, substream->number,625			   params_channels(hw_params));626}627 628 629 630#ifdef ECHOCARD_HAS_DIGITAL_IO631 632static int pcm_digital_in_hw_params(struct snd_pcm_substream *substream,633				    struct snd_pcm_hw_params *hw_params)634{635	struct echoaudio *chip = snd_pcm_substream_chip(substream);636 637	return init_engine(substream, hw_params, px_digital_in(chip) +638			substream->number, params_channels(hw_params));639}640 641 642 643#ifndef ECHOCARD_HAS_VMIXER	/* See the note in snd_echo_new_pcm() */644static int pcm_digital_out_hw_params(struct snd_pcm_substream *substream,645				     struct snd_pcm_hw_params *hw_params)646{647	struct echoaudio *chip = snd_pcm_substream_chip(substream);648 649	return init_engine(substream, hw_params, px_digital_out(chip) +650			substream->number, params_channels(hw_params));651}652#endif /* !ECHOCARD_HAS_VMIXER */653 654#endif /* ECHOCARD_HAS_DIGITAL_IO */655 656 657 658static int pcm_hw_free(struct snd_pcm_substream *substream)659{660	struct echoaudio *chip;661	struct audiopipe *pipe;662 663	chip = snd_pcm_substream_chip(substream);664	pipe = (struct audiopipe *) substream->runtime->private_data;665 666	spin_lock_irq(&chip->lock);667	if (pipe->index >= 0) {668		dev_dbg(chip->card->dev, "pcm_hw_free(%d)\n", pipe->index);669		free_pipes(chip, pipe);670		chip->substream[pipe->index] = NULL;671		pipe->index = -1;672	}673	spin_unlock_irq(&chip->lock);674 675	return 0;676}677 678 679 680static int pcm_prepare(struct snd_pcm_substream *substream)681{682	struct echoaudio *chip = snd_pcm_substream_chip(substream);683	struct snd_pcm_runtime *runtime = substream->runtime;684	struct audioformat format;685	int pipe_index = ((struct audiopipe *)runtime->private_data)->index;686 687	dev_dbg(chip->card->dev, "Prepare rate=%d format=%d channels=%d\n",688		runtime->rate, runtime->format, runtime->channels);689	format.interleave = runtime->channels;690	format.data_are_bigendian = 0;691	format.mono_to_stereo = 0;692	switch (runtime->format) {693	case SNDRV_PCM_FORMAT_U8:694		format.bits_per_sample = 8;695		break;696	case SNDRV_PCM_FORMAT_S16_LE:697		format.bits_per_sample = 16;698		break;699	case SNDRV_PCM_FORMAT_S24_3LE:700		format.bits_per_sample = 24;701		break;702	case SNDRV_PCM_FORMAT_S32_BE:703		format.data_are_bigendian = 1;704		fallthrough;705	case SNDRV_PCM_FORMAT_S32_LE:706		format.bits_per_sample = 32;707		break;708	default:709		dev_err(chip->card->dev,710			"Prepare error: unsupported format %d\n",711			runtime->format);712		return -EINVAL;713	}714 715	if (snd_BUG_ON(pipe_index >= px_num(chip)))716		return -EINVAL;717 718	/*719	 * We passed checks we can do independently; now take720	 * exclusive control721	 */722 723	spin_lock_irq(&chip->lock);724 725	if (snd_BUG_ON(!is_pipe_allocated(chip, pipe_index))) {726		spin_unlock_irq(&chip->lock);727		return -EINVAL;728	}729 730	set_audio_format(chip, pipe_index, &format);731	spin_unlock_irq(&chip->lock);732 733	return 0;734}735 736 737 738static int pcm_trigger(struct snd_pcm_substream *substream, int cmd)739{740	struct echoaudio *chip = snd_pcm_substream_chip(substream);741	struct audiopipe *pipe;742	int i, err;743	u32 channelmask = 0;744	struct snd_pcm_substream *s;745 746	snd_pcm_group_for_each_entry(s, substream) {747		for (i = 0; i < DSP_MAXPIPES; i++) {748			if (s == chip->substream[i]) {749				channelmask |= 1 << i;750				snd_pcm_trigger_done(s, substream);751			}752		}753	}754 755	spin_lock(&chip->lock);756	switch (cmd) {757	case SNDRV_PCM_TRIGGER_RESUME:758	case SNDRV_PCM_TRIGGER_START:759	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:760		for (i = 0; i < DSP_MAXPIPES; i++) {761			if (channelmask & (1 << i)) {762				pipe = chip->substream[i]->runtime->private_data;763				switch (pipe->state) {764				case PIPE_STATE_STOPPED:765					pipe->last_period = 0;766					pipe->last_counter = 0;767					pipe->position = 0;768					*pipe->dma_counter = 0;769					fallthrough;770				case PIPE_STATE_PAUSED:771					pipe->state = PIPE_STATE_STARTED;772					break;773				case PIPE_STATE_STARTED:774					break;775				}776			}777		}778		err = start_transport(chip, channelmask,779				      chip->pipe_cyclic_mask);780		break;781	case SNDRV_PCM_TRIGGER_SUSPEND:782	case SNDRV_PCM_TRIGGER_STOP:783		for (i = 0; i < DSP_MAXPIPES; i++) {784			if (channelmask & (1 << i)) {785				pipe = chip->substream[i]->runtime->private_data;786				pipe->state = PIPE_STATE_STOPPED;787			}788		}789		err = stop_transport(chip, channelmask);790		break;791	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:792		for (i = 0; i < DSP_MAXPIPES; i++) {793			if (channelmask & (1 << i)) {794				pipe = chip->substream[i]->runtime->private_data;795				pipe->state = PIPE_STATE_PAUSED;796			}797		}798		err = pause_transport(chip, channelmask);799		break;800	default:801		err = -EINVAL;802	}803	spin_unlock(&chip->lock);804	return err;805}806 807 808 809static snd_pcm_uframes_t pcm_pointer(struct snd_pcm_substream *substream)810{811	struct snd_pcm_runtime *runtime = substream->runtime;812	struct audiopipe *pipe = runtime->private_data;813	u32 counter, step;814 815	/*816	 * IRQ handling runs concurrently. Do not share tracking of817	 * counter with it, which would race or require locking818	 */819 820	counter = le32_to_cpu(*pipe->dma_counter);  /* presumed atomic */821 822	step = counter - pipe->last_counter;  /* handles wrapping */823	pipe->last_counter = counter;824 825	/* counter doesn't neccessarily wrap on a multiple of826	 * buffer_size, so can't derive the position; must827	 * accumulate */828 829	pipe->position += step;830	pipe->position %= frames_to_bytes(runtime, runtime->buffer_size); /* wrap */831 832	return bytes_to_frames(runtime, pipe->position);833}834 835 836 837/* pcm *_ops structures */838static const struct snd_pcm_ops analog_playback_ops = {839	.open = pcm_analog_out_open,840	.close = pcm_close,841	.hw_params = pcm_analog_out_hw_params,842	.hw_free = pcm_hw_free,843	.prepare = pcm_prepare,844	.trigger = pcm_trigger,845	.pointer = pcm_pointer,846};847static const struct snd_pcm_ops analog_capture_ops = {848	.open = pcm_analog_in_open,849	.close = pcm_close,850	.hw_params = pcm_analog_in_hw_params,851	.hw_free = pcm_hw_free,852	.prepare = pcm_prepare,853	.trigger = pcm_trigger,854	.pointer = pcm_pointer,855};856#ifdef ECHOCARD_HAS_DIGITAL_IO857#ifndef ECHOCARD_HAS_VMIXER858static const struct snd_pcm_ops digital_playback_ops = {859	.open = pcm_digital_out_open,860	.close = pcm_close,861	.hw_params = pcm_digital_out_hw_params,862	.hw_free = pcm_hw_free,863	.prepare = pcm_prepare,864	.trigger = pcm_trigger,865	.pointer = pcm_pointer,866};867#endif /* !ECHOCARD_HAS_VMIXER */868static const struct snd_pcm_ops digital_capture_ops = {869	.open = pcm_digital_in_open,870	.close = pcm_close,871	.hw_params = pcm_digital_in_hw_params,872	.hw_free = pcm_hw_free,873	.prepare = pcm_prepare,874	.trigger = pcm_trigger,875	.pointer = pcm_pointer,876};877#endif /* ECHOCARD_HAS_DIGITAL_IO */878 879 880 881/* Preallocate memory only for the first substream because it's the most882 * used one883 */884static void snd_echo_preallocate_pages(struct snd_pcm *pcm, struct device *dev)885{886	struct snd_pcm_substream *ss;887	int stream;888 889	for (stream = 0; stream < 2; stream++)890		for (ss = pcm->streams[stream].substream; ss; ss = ss->next)891			snd_pcm_set_managed_buffer(ss, SNDRV_DMA_TYPE_DEV_SG,892						   dev,893						   ss->number ? 0 : 128<<10,894						   256<<10);895}896 897 898 899/*<--snd_echo_probe() */900static int snd_echo_new_pcm(struct echoaudio *chip)901{902	struct snd_pcm *pcm;903	int err;904 905#ifdef ECHOCARD_HAS_VMIXER906	/* This card has a Vmixer, that is there is no direct mapping from PCM907	streams to physical outputs. The user can mix the streams as he wishes908	via control interface and it's possible to send any stream to any909	output, thus it makes no sense to keep analog and digital outputs910	separated */911 912	/* PCM#0 Virtual outputs and analog inputs */913	err = snd_pcm_new(chip->card, "PCM", 0, num_pipes_out(chip),914			  num_analog_busses_in(chip), &pcm);915	if (err < 0)916		return err;917	pcm->private_data = chip;918	chip->analog_pcm = pcm;919	strcpy(pcm->name, chip->card->shortname);920	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops);921	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops);922	snd_echo_preallocate_pages(pcm, &chip->pci->dev);923 924#ifdef ECHOCARD_HAS_DIGITAL_IO925	/* PCM#1 Digital inputs, no outputs */926	err = snd_pcm_new(chip->card, "Digital PCM", 1, 0,927			  num_digital_busses_in(chip), &pcm);928	if (err < 0)929		return err;930	pcm->private_data = chip;931	chip->digital_pcm = pcm;932	strcpy(pcm->name, chip->card->shortname);933	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops);934	snd_echo_preallocate_pages(pcm, &chip->pci->dev);935#endif /* ECHOCARD_HAS_DIGITAL_IO */936 937#else /* ECHOCARD_HAS_VMIXER */938 939	/* The card can manage substreams formed by analog and digital channels940	at the same time, but I prefer to keep analog and digital channels941	separated, because that mixed thing is confusing and useless. So we942	register two PCM devices: */943 944	/* PCM#0 Analog i/o */945	err = snd_pcm_new(chip->card, "Analog PCM", 0,946			  num_analog_busses_out(chip),947			  num_analog_busses_in(chip), &pcm);948	if (err < 0)949		return err;950	pcm->private_data = chip;951	chip->analog_pcm = pcm;952	strcpy(pcm->name, chip->card->shortname);953	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &analog_playback_ops);954	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &analog_capture_ops);955	snd_echo_preallocate_pages(pcm, &chip->pci->dev);956 957#ifdef ECHOCARD_HAS_DIGITAL_IO958	/* PCM#1 Digital i/o */959	err = snd_pcm_new(chip->card, "Digital PCM", 1,960			  num_digital_busses_out(chip),961			  num_digital_busses_in(chip), &pcm);962	if (err < 0)963		return err;964	pcm->private_data = chip;965	chip->digital_pcm = pcm;966	strcpy(pcm->name, chip->card->shortname);967	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &digital_playback_ops);968	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &digital_capture_ops);969	snd_echo_preallocate_pages(pcm, &chip->pci->dev);970#endif /* ECHOCARD_HAS_DIGITAL_IO */971 972#endif /* ECHOCARD_HAS_VMIXER */973 974	return 0;975}976 977 978 979 980/******************************************************************************981	Control interface982******************************************************************************/983 984#if !defined(ECHOCARD_HAS_VMIXER) || defined(ECHOCARD_HAS_LINE_OUT_GAIN)985 986/******************* PCM output volume *******************/987static int snd_echo_output_gain_info(struct snd_kcontrol *kcontrol,988				     struct snd_ctl_elem_info *uinfo)989{990	struct echoaudio *chip;991 992	chip = snd_kcontrol_chip(kcontrol);993	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;994	uinfo->count = num_busses_out(chip);995	uinfo->value.integer.min = ECHOGAIN_MINOUT;996	uinfo->value.integer.max = ECHOGAIN_MAXOUT;997	return 0;998}999 1000static int snd_echo_output_gain_get(struct snd_kcontrol *kcontrol,1001				    struct snd_ctl_elem_value *ucontrol)1002{1003	struct echoaudio *chip;1004	int c;1005 1006	chip = snd_kcontrol_chip(kcontrol);1007	for (c = 0; c < num_busses_out(chip); c++)1008		ucontrol->value.integer.value[c] = chip->output_gain[c];1009	return 0;1010}1011 1012static int snd_echo_output_gain_put(struct snd_kcontrol *kcontrol,1013				    struct snd_ctl_elem_value *ucontrol)1014{1015	struct echoaudio *chip;1016	int c, changed, gain;1017 1018	changed = 0;1019	chip = snd_kcontrol_chip(kcontrol);1020	spin_lock_irq(&chip->lock);1021	for (c = 0; c < num_busses_out(chip); c++) {1022		gain = ucontrol->value.integer.value[c];1023		/* Ignore out of range values */1024		if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)1025			continue;1026		if (chip->output_gain[c] != gain) {1027			set_output_gain(chip, c, gain);1028			changed = 1;1029		}1030	}1031	if (changed)1032		update_output_line_level(chip);1033	spin_unlock_irq(&chip->lock);1034	return changed;1035}1036 1037#ifdef ECHOCARD_HAS_LINE_OUT_GAIN1038/* On the Mia this one controls the line-out volume */1039static const struct snd_kcontrol_new snd_echo_line_output_gain = {1040	.name = "Line Playback Volume",1041	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1042	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |1043		  SNDRV_CTL_ELEM_ACCESS_TLV_READ,1044	.info = snd_echo_output_gain_info,1045	.get = snd_echo_output_gain_get,1046	.put = snd_echo_output_gain_put,1047	.tlv = {.p = db_scale_output_gain},1048};1049#else1050static const struct snd_kcontrol_new snd_echo_pcm_output_gain = {1051	.name = "PCM Playback Volume",1052	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1053	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,1054	.info = snd_echo_output_gain_info,1055	.get = snd_echo_output_gain_get,1056	.put = snd_echo_output_gain_put,1057	.tlv = {.p = db_scale_output_gain},1058};1059#endif1060 1061#endif /* !ECHOCARD_HAS_VMIXER || ECHOCARD_HAS_LINE_OUT_GAIN */1062 1063 1064 1065#ifdef ECHOCARD_HAS_INPUT_GAIN1066 1067/******************* Analog input volume *******************/1068static int snd_echo_input_gain_info(struct snd_kcontrol *kcontrol,1069				    struct snd_ctl_elem_info *uinfo)1070{1071	struct echoaudio *chip;1072 1073	chip = snd_kcontrol_chip(kcontrol);1074	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;1075	uinfo->count = num_analog_busses_in(chip);1076	uinfo->value.integer.min = ECHOGAIN_MININP;1077	uinfo->value.integer.max = ECHOGAIN_MAXINP;1078	return 0;1079}1080 1081static int snd_echo_input_gain_get(struct snd_kcontrol *kcontrol,1082				   struct snd_ctl_elem_value *ucontrol)1083{1084	struct echoaudio *chip;1085	int c;1086 1087	chip = snd_kcontrol_chip(kcontrol);1088	for (c = 0; c < num_analog_busses_in(chip); c++)1089		ucontrol->value.integer.value[c] = chip->input_gain[c];1090	return 0;1091}1092 1093static int snd_echo_input_gain_put(struct snd_kcontrol *kcontrol,1094				   struct snd_ctl_elem_value *ucontrol)1095{1096	struct echoaudio *chip;1097	int c, gain, changed;1098 1099	changed = 0;1100	chip = snd_kcontrol_chip(kcontrol);1101	spin_lock_irq(&chip->lock);1102	for (c = 0; c < num_analog_busses_in(chip); c++) {1103		gain = ucontrol->value.integer.value[c];1104		/* Ignore out of range values */1105		if (gain < ECHOGAIN_MININP || gain > ECHOGAIN_MAXINP)1106			continue;1107		if (chip->input_gain[c] != gain) {1108			set_input_gain(chip, c, gain);1109			changed = 1;1110		}1111	}1112	if (changed)1113		update_input_line_level(chip);1114	spin_unlock_irq(&chip->lock);1115	return changed;1116}1117 1118static const DECLARE_TLV_DB_SCALE(db_scale_input_gain, -2500, 50, 0);1119 1120static const struct snd_kcontrol_new snd_echo_line_input_gain = {1121	.name = "Line Capture Volume",1122	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1123	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,1124	.info = snd_echo_input_gain_info,1125	.get = snd_echo_input_gain_get,1126	.put = snd_echo_input_gain_put,1127	.tlv = {.p = db_scale_input_gain},1128};1129 1130#endif /* ECHOCARD_HAS_INPUT_GAIN */1131 1132 1133 1134#ifdef ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL1135 1136/************ Analog output nominal level (+4dBu / -10dBV) ***************/1137static int snd_echo_output_nominal_info (struct snd_kcontrol *kcontrol,1138					 struct snd_ctl_elem_info *uinfo)1139{1140	struct echoaudio *chip;1141 1142	chip = snd_kcontrol_chip(kcontrol);1143	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;1144	uinfo->count = num_analog_busses_out(chip);1145	uinfo->value.integer.min = 0;1146	uinfo->value.integer.max = 1;1147	return 0;1148}1149 1150static int snd_echo_output_nominal_get(struct snd_kcontrol *kcontrol,1151				       struct snd_ctl_elem_value *ucontrol)1152{1153	struct echoaudio *chip;1154	int c;1155 1156	chip = snd_kcontrol_chip(kcontrol);1157	for (c = 0; c < num_analog_busses_out(chip); c++)1158		ucontrol->value.integer.value[c] = chip->nominal_level[c];1159	return 0;1160}1161 1162static int snd_echo_output_nominal_put(struct snd_kcontrol *kcontrol,1163				       struct snd_ctl_elem_value *ucontrol)1164{1165	struct echoaudio *chip;1166	int c, changed;1167 1168	changed = 0;1169	chip = snd_kcontrol_chip(kcontrol);1170	spin_lock_irq(&chip->lock);1171	for (c = 0; c < num_analog_busses_out(chip); c++) {1172		if (chip->nominal_level[c] != ucontrol->value.integer.value[c]) {1173			set_nominal_level(chip, c,1174					  ucontrol->value.integer.value[c]);1175			changed = 1;1176		}1177	}1178	if (changed)1179		update_output_line_level(chip);1180	spin_unlock_irq(&chip->lock);1181	return changed;1182}1183 1184static const struct snd_kcontrol_new snd_echo_output_nominal_level = {1185	.name = "Line Playback Switch (-10dBV)",1186	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1187	.info = snd_echo_output_nominal_info,1188	.get = snd_echo_output_nominal_get,1189	.put = snd_echo_output_nominal_put,1190};1191 1192#endif /* ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL */1193 1194 1195 1196#ifdef ECHOCARD_HAS_INPUT_NOMINAL_LEVEL1197 1198/*************** Analog input nominal level (+4dBu / -10dBV) ***************/1199static int snd_echo_input_nominal_info(struct snd_kcontrol *kcontrol,1200				       struct snd_ctl_elem_info *uinfo)1201{1202	struct echoaudio *chip;1203 1204	chip = snd_kcontrol_chip(kcontrol);1205	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;1206	uinfo->count = num_analog_busses_in(chip);1207	uinfo->value.integer.min = 0;1208	uinfo->value.integer.max = 1;1209	return 0;1210}1211 1212static int snd_echo_input_nominal_get(struct snd_kcontrol *kcontrol,1213				      struct snd_ctl_elem_value *ucontrol)1214{1215	struct echoaudio *chip;1216	int c;1217 1218	chip = snd_kcontrol_chip(kcontrol);1219	for (c = 0; c < num_analog_busses_in(chip); c++)1220		ucontrol->value.integer.value[c] =1221			chip->nominal_level[bx_analog_in(chip) + c];1222	return 0;1223}1224 1225static int snd_echo_input_nominal_put(struct snd_kcontrol *kcontrol,1226				      struct snd_ctl_elem_value *ucontrol)1227{1228	struct echoaudio *chip;1229	int c, changed;1230 1231	changed = 0;1232	chip = snd_kcontrol_chip(kcontrol);1233	spin_lock_irq(&chip->lock);1234	for (c = 0; c < num_analog_busses_in(chip); c++) {1235		if (chip->nominal_level[bx_analog_in(chip) + c] !=1236		    ucontrol->value.integer.value[c]) {1237			set_nominal_level(chip, bx_analog_in(chip) + c,1238					  ucontrol->value.integer.value[c]);1239			changed = 1;1240		}1241	}1242	if (changed)1243		update_output_line_level(chip);	/* "Output" is not a mistake1244						 * here.1245						 */1246	spin_unlock_irq(&chip->lock);1247	return changed;1248}1249 1250static const struct snd_kcontrol_new snd_echo_intput_nominal_level = {1251	.name = "Line Capture Switch (-10dBV)",1252	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1253	.info = snd_echo_input_nominal_info,1254	.get = snd_echo_input_nominal_get,1255	.put = snd_echo_input_nominal_put,1256};1257 1258#endif /* ECHOCARD_HAS_INPUT_NOMINAL_LEVEL */1259 1260 1261 1262#ifdef ECHOCARD_HAS_MONITOR1263 1264/******************* Monitor mixer *******************/1265static int snd_echo_mixer_info(struct snd_kcontrol *kcontrol,1266			       struct snd_ctl_elem_info *uinfo)1267{1268	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;1269	uinfo->count = 1;1270	uinfo->value.integer.min = ECHOGAIN_MINOUT;1271	uinfo->value.integer.max = ECHOGAIN_MAXOUT;1272	return 0;1273}1274 1275static int snd_echo_mixer_get(struct snd_kcontrol *kcontrol,1276			      struct snd_ctl_elem_value *ucontrol)1277{1278	struct echoaudio *chip = snd_kcontrol_chip(kcontrol);1279	unsigned int out = ucontrol->id.index / num_busses_in(chip);1280	unsigned int in = ucontrol->id.index % num_busses_in(chip);1281 1282	if (out >= ECHO_MAXAUDIOOUTPUTS || in >= ECHO_MAXAUDIOINPUTS)1283		return -EINVAL;1284 1285	ucontrol->value.integer.value[0] = chip->monitor_gain[out][in];1286	return 0;1287}1288 1289static int snd_echo_mixer_put(struct snd_kcontrol *kcontrol,1290			      struct snd_ctl_elem_value *ucontrol)1291{1292	struct echoaudio *chip;1293	int changed,  gain;1294	unsigned int out, in;1295 1296	changed = 0;1297	chip = snd_kcontrol_chip(kcontrol);1298	out = ucontrol->id.index / num_busses_in(chip);1299	in = ucontrol->id.index % num_busses_in(chip);1300	if (out >= ECHO_MAXAUDIOOUTPUTS || in >= ECHO_MAXAUDIOINPUTS)1301		return -EINVAL;1302	gain = ucontrol->value.integer.value[0];1303	if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)1304		return -EINVAL;1305	if (chip->monitor_gain[out][in] != gain) {1306		spin_lock_irq(&chip->lock);1307		set_monitor_gain(chip, out, in, gain);1308		update_output_line_level(chip);1309		spin_unlock_irq(&chip->lock);1310		changed = 1;1311	}1312	return changed;1313}1314 1315static struct snd_kcontrol_new snd_echo_monitor_mixer = {1316	.name = "Monitor Mixer Volume",1317	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1318	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,1319	.info = snd_echo_mixer_info,1320	.get = snd_echo_mixer_get,1321	.put = snd_echo_mixer_put,1322	.tlv = {.p = db_scale_output_gain},1323};1324 1325#endif /* ECHOCARD_HAS_MONITOR */1326 1327 1328 1329#ifdef ECHOCARD_HAS_VMIXER1330 1331/******************* Vmixer *******************/1332static int snd_echo_vmixer_info(struct snd_kcontrol *kcontrol,1333				struct snd_ctl_elem_info *uinfo)1334{1335	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;1336	uinfo->count = 1;1337	uinfo->value.integer.min = ECHOGAIN_MINOUT;1338	uinfo->value.integer.max = ECHOGAIN_MAXOUT;1339	return 0;1340}1341 1342static int snd_echo_vmixer_get(struct snd_kcontrol *kcontrol,1343			       struct snd_ctl_elem_value *ucontrol)1344{1345	struct echoaudio *chip;1346 1347	chip = snd_kcontrol_chip(kcontrol);1348	ucontrol->value.integer.value[0] =1349		chip->vmixer_gain[ucontrol->id.index / num_pipes_out(chip)]1350			[ucontrol->id.index % num_pipes_out(chip)];1351	return 0;1352}1353 1354static int snd_echo_vmixer_put(struct snd_kcontrol *kcontrol,1355			       struct snd_ctl_elem_value *ucontrol)1356{1357	struct echoaudio *chip;1358	int gain, changed;1359	short vch, out;1360 1361	changed = 0;1362	chip = snd_kcontrol_chip(kcontrol);1363	out = ucontrol->id.index / num_pipes_out(chip);1364	vch = ucontrol->id.index % num_pipes_out(chip);1365	gain = ucontrol->value.integer.value[0];1366	if (gain < ECHOGAIN_MINOUT || gain > ECHOGAIN_MAXOUT)1367		return -EINVAL;1368	if (chip->vmixer_gain[out][vch] != ucontrol->value.integer.value[0]) {1369		spin_lock_irq(&chip->lock);1370		set_vmixer_gain(chip, out, vch, ucontrol->value.integer.value[0]);1371		update_vmixer_level(chip);1372		spin_unlock_irq(&chip->lock);1373		changed = 1;1374	}1375	return changed;1376}1377 1378static struct snd_kcontrol_new snd_echo_vmixer = {1379	.name = "VMixer Volume",1380	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1381	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,1382	.info = snd_echo_vmixer_info,1383	.get = snd_echo_vmixer_get,1384	.put = snd_echo_vmixer_put,1385	.tlv = {.p = db_scale_output_gain},1386};1387 1388#endif /* ECHOCARD_HAS_VMIXER */1389 1390 1391 1392#ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH1393 1394/******************* Digital mode switch *******************/1395static int snd_echo_digital_mode_info(struct snd_kcontrol *kcontrol,1396				      struct snd_ctl_elem_info *uinfo)1397{1398	static const char * const names[4] = {1399		"S/PDIF Coaxial", "S/PDIF Optical", "ADAT Optical",1400		"S/PDIF Cdrom"1401	};1402	struct echoaudio *chip;1403 1404	chip = snd_kcontrol_chip(kcontrol);1405	return snd_ctl_enum_info(uinfo, 1, chip->num_digital_modes, names);1406}1407 1408static int snd_echo_digital_mode_get(struct snd_kcontrol *kcontrol,1409				     struct snd_ctl_elem_value *ucontrol)1410{1411	struct echoaudio *chip;1412	int i, mode;1413 1414	chip = snd_kcontrol_chip(kcontrol);1415	mode = chip->digital_mode;1416	for (i = chip->num_digital_modes - 1; i >= 0; i--)1417		if (mode == chip->digital_mode_list[i]) {1418			ucontrol->value.enumerated.item[0] = i;1419			break;1420		}1421	return 0;1422}1423 1424static int snd_echo_digital_mode_put(struct snd_kcontrol *kcontrol,1425				     struct snd_ctl_elem_value *ucontrol)1426{1427	struct echoaudio *chip;1428	int changed;1429	unsigned short emode, dmode;1430 1431	changed = 0;1432	chip = snd_kcontrol_chip(kcontrol);1433 1434	emode = ucontrol->value.enumerated.item[0];1435	if (emode >= chip->num_digital_modes)1436		return -EINVAL;1437	dmode = chip->digital_mode_list[emode];1438 1439	if (dmode != chip->digital_mode) {1440		/* mode_mutex is required to make this operation atomic wrt1441		pcm_digital_*_open() and set_input_clock() functions. */1442		mutex_lock(&chip->mode_mutex);1443 1444		/* Do not allow the user to change the digital mode when a pcm1445		device is open because it also changes the number of channels1446		and the allowed sample rates */1447		if (chip->opencount) {1448			changed = -EAGAIN;1449		} else {1450			changed = set_digital_mode(chip, dmode);1451			/* If we had to change the clock source, report it */1452			if (changed > 0 && chip->clock_src_ctl) {1453				snd_ctl_notify(chip->card,1454					       SNDRV_CTL_EVENT_MASK_VALUE,1455					       &chip->clock_src_ctl->id);1456				dev_dbg(chip->card->dev,1457					"SDM() =%d\n", changed);1458			}1459			if (changed >= 0)1460				changed = 1;	/* No errors */1461		}1462		mutex_unlock(&chip->mode_mutex);1463	}1464	return changed;1465}1466 1467static const struct snd_kcontrol_new snd_echo_digital_mode_switch = {1468	.name = "Digital mode Switch",1469	.iface = SNDRV_CTL_ELEM_IFACE_CARD,1470	.info = snd_echo_digital_mode_info,1471	.get = snd_echo_digital_mode_get,1472	.put = snd_echo_digital_mode_put,1473};1474 1475#endif /* ECHOCARD_HAS_DIGITAL_MODE_SWITCH */1476 1477 1478 1479#ifdef ECHOCARD_HAS_DIGITAL_IO1480 1481/******************* S/PDIF mode switch *******************/1482static int snd_echo_spdif_mode_info(struct snd_kcontrol *kcontrol,1483				    struct snd_ctl_elem_info *uinfo)1484{1485	static const char * const names[2] = {"Consumer", "Professional"};1486 1487	return snd_ctl_enum_info(uinfo, 1, 2, names);1488}1489 1490static int snd_echo_spdif_mode_get(struct snd_kcontrol *kcontrol,1491				   struct snd_ctl_elem_value *ucontrol)1492{1493	struct echoaudio *chip;1494 1495	chip = snd_kcontrol_chip(kcontrol);1496	ucontrol->value.enumerated.item[0] = !!chip->professional_spdif;1497	return 0;1498}1499 1500static int snd_echo_spdif_mode_put(struct snd_kcontrol *kcontrol,1501				   struct snd_ctl_elem_value *ucontrol)1502{1503	struct echoaudio *chip;1504	int mode;1505 1506	chip = snd_kcontrol_chip(kcontrol);1507	mode = !!ucontrol->value.enumerated.item[0];1508	if (mode != chip->professional_spdif) {1509		spin_lock_irq(&chip->lock);1510		set_professional_spdif(chip, mode);1511		spin_unlock_irq(&chip->lock);1512		return 1;1513	}1514	return 0;1515}1516 1517static const struct snd_kcontrol_new snd_echo_spdif_mode_switch = {1518	.name = "S/PDIF mode Switch",1519	.iface = SNDRV_CTL_ELEM_IFACE_CARD,1520	.info = snd_echo_spdif_mode_info,1521	.get = snd_echo_spdif_mode_get,1522	.put = snd_echo_spdif_mode_put,1523};1524 1525#endif /* ECHOCARD_HAS_DIGITAL_IO */1526 1527 1528 1529#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK1530 1531/******************* Select input clock source *******************/1532static int snd_echo_clock_source_info(struct snd_kcontrol *kcontrol,1533				      struct snd_ctl_elem_info *uinfo)1534{1535	static const char * const names[8] = {1536		"Internal", "Word", "Super", "S/PDIF", "ADAT", "ESync",1537		"ESync96", "MTC"1538	};1539	struct echoaudio *chip;1540 1541	chip = snd_kcontrol_chip(kcontrol);1542	return snd_ctl_enum_info(uinfo, 1, chip->num_clock_sources, names);1543}1544 1545static int snd_echo_clock_source_get(struct snd_kcontrol *kcontrol,1546				     struct snd_ctl_elem_value *ucontrol)1547{1548	struct echoaudio *chip;1549	int i, clock;1550 1551	chip = snd_kcontrol_chip(kcontrol);1552	clock = chip->input_clock;1553 1554	for (i = 0; i < chip->num_clock_sources; i++)1555		if (clock == chip->clock_source_list[i])1556			ucontrol->value.enumerated.item[0] = i;1557 1558	return 0;1559}1560 1561static int snd_echo_clock_source_put(struct snd_kcontrol *kcontrol,1562				     struct snd_ctl_elem_value *ucontrol)1563{1564	struct echoaudio *chip;1565	int changed;1566	unsigned int eclock, dclock;1567 1568	changed = 0;1569	chip = snd_kcontrol_chip(kcontrol);1570	eclock = ucontrol->value.enumerated.item[0];1571	if (eclock >= chip->input_clock_types)1572		return -EINVAL;1573	dclock = chip->clock_source_list[eclock];1574	if (chip->input_clock != dclock) {1575		mutex_lock(&chip->mode_mutex);1576		spin_lock_irq(&chip->lock);1577		changed = set_input_clock(chip, dclock);1578		if (!changed)1579			changed = 1;	/* no errors */1580		spin_unlock_irq(&chip->lock);1581		mutex_unlock(&chip->mode_mutex);1582	}1583 1584	if (changed < 0)1585		dev_dbg(chip->card->dev,1586			"seticlk val%d err 0x%x\n", dclock, changed);1587 1588	return changed;1589}1590 1591static const struct snd_kcontrol_new snd_echo_clock_source_switch = {1592	.name = "Sample Clock Source",1593	.iface = SNDRV_CTL_ELEM_IFACE_PCM,1594	.info = snd_echo_clock_source_info,1595	.get = snd_echo_clock_source_get,1596	.put = snd_echo_clock_source_put,1597};1598 1599#endif /* ECHOCARD_HAS_EXTERNAL_CLOCK */1600 1601 1602 1603#ifdef ECHOCARD_HAS_PHANTOM_POWER1604 1605/******************* Phantom power switch *******************/1606#define snd_echo_phantom_power_info	snd_ctl_boolean_mono_info1607 1608static int snd_echo_phantom_power_get(struct snd_kcontrol *kcontrol,1609				      struct snd_ctl_elem_value *ucontrol)1610{1611	struct echoaudio *chip = snd_kcontrol_chip(kcontrol);1612 1613	ucontrol->value.integer.value[0] = chip->phantom_power;1614	return 0;1615}1616 1617static int snd_echo_phantom_power_put(struct snd_kcontrol *kcontrol,1618				      struct snd_ctl_elem_value *ucontrol)1619{1620	struct echoaudio *chip = snd_kcontrol_chip(kcontrol);1621	int power, changed = 0;1622 1623	power = !!ucontrol->value.integer.value[0];1624	if (chip->phantom_power != power) {1625		spin_lock_irq(&chip->lock);1626		changed = set_phantom_power(chip, power);1627		spin_unlock_irq(&chip->lock);1628		if (changed == 0)1629			changed = 1;	/* no errors */1630	}1631	return changed;1632}1633 1634static const struct snd_kcontrol_new snd_echo_phantom_power_switch = {1635	.name = "Phantom power Switch",1636	.iface = SNDRV_CTL_ELEM_IFACE_CARD,1637	.info = snd_echo_phantom_power_info,1638	.get = snd_echo_phantom_power_get,1639	.put = snd_echo_phantom_power_put,1640};1641 1642#endif /* ECHOCARD_HAS_PHANTOM_POWER */1643 1644 1645 1646#ifdef ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE1647 1648/******************* Digital input automute switch *******************/1649#define snd_echo_automute_info		snd_ctl_boolean_mono_info1650 1651static int snd_echo_automute_get(struct snd_kcontrol *kcontrol,1652				 struct snd_ctl_elem_value *ucontrol)1653{1654	struct echoaudio *chip = snd_kcontrol_chip(kcontrol);1655 1656	ucontrol->value.integer.value[0] = chip->digital_in_automute;1657	return 0;1658}1659 1660static int snd_echo_automute_put(struct snd_kcontrol *kcontrol,1661				 struct snd_ctl_elem_value *ucontrol)1662{1663	struct echoaudio *chip = snd_kcontrol_chip(kcontrol);1664	int automute, changed = 0;1665 1666	automute = !!ucontrol->value.integer.value[0];1667	if (chip->digital_in_automute != automute) {1668		spin_lock_irq(&chip->lock);1669		changed = set_input_auto_mute(chip, automute);1670		spin_unlock_irq(&chip->lock);1671		if (changed == 0)1672			changed = 1;	/* no errors */1673	}1674	return changed;1675}1676 1677static const struct snd_kcontrol_new snd_echo_automute_switch = {1678	.name = "Digital Capture Switch (automute)",1679	.iface = SNDRV_CTL_ELEM_IFACE_CARD,1680	.info = snd_echo_automute_info,1681	.get = snd_echo_automute_get,1682	.put = snd_echo_automute_put,1683};1684 1685#endif /* ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE */1686 1687 1688 1689/******************* VU-meters switch *******************/1690#define snd_echo_vumeters_switch_info		snd_ctl_boolean_mono_info1691 1692static int snd_echo_vumeters_switch_put(struct snd_kcontrol *kcontrol,1693					struct snd_ctl_elem_value *ucontrol)1694{1695	struct echoaudio *chip;1696 1697	chip = snd_kcontrol_chip(kcontrol);1698	spin_lock_irq(&chip->lock);1699	set_meters_on(chip, ucontrol->value.integer.value[0]);1700	spin_unlock_irq(&chip->lock);1701	return 1;1702}1703 1704static const struct snd_kcontrol_new snd_echo_vumeters_switch = {1705	.name = "VU-meters Switch",1706	.iface = SNDRV_CTL_ELEM_IFACE_CARD,1707	.access = SNDRV_CTL_ELEM_ACCESS_WRITE,1708	.info = snd_echo_vumeters_switch_info,1709	.put = snd_echo_vumeters_switch_put,1710};1711 1712 1713 1714/***** Read VU-meters (input, output, analog and digital together) *****/1715static int snd_echo_vumeters_info(struct snd_kcontrol *kcontrol,1716				  struct snd_ctl_elem_info *uinfo)1717{1718	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;1719	uinfo->count = 96;1720	uinfo->value.integer.min = ECHOGAIN_MINOUT;1721	uinfo->value.integer.max = 0;1722	return 0;1723}1724 1725static int snd_echo_vumeters_get(struct snd_kcontrol *kcontrol,1726				 struct snd_ctl_elem_value *ucontrol)1727{1728	struct echoaudio *chip;1729 1730	chip = snd_kcontrol_chip(kcontrol);1731	get_audio_meters(chip, ucontrol->value.integer.value);1732	return 0;1733}1734 1735static const struct snd_kcontrol_new snd_echo_vumeters = {1736	.name = "VU-meters",1737	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,1738	.access = SNDRV_CTL_ELEM_ACCESS_READ |1739		  SNDRV_CTL_ELEM_ACCESS_VOLATILE |1740		  SNDRV_CTL_ELEM_ACCESS_TLV_READ,1741	.info = snd_echo_vumeters_info,1742	.get = snd_echo_vumeters_get,1743	.tlv = {.p = db_scale_output_gain},1744};1745 1746 1747 1748/*** Channels info - it exports informations about the number of channels ***/1749static int snd_echo_channels_info_info(struct snd_kcontrol *kcontrol,1750				       struct snd_ctl_elem_info *uinfo)1751{1752	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;1753	uinfo->count = 6;1754	uinfo->value.integer.min = 0;1755	uinfo->value.integer.max = 1 << ECHO_CLOCK_NUMBER;1756	return 0;1757}1758 1759static int snd_echo_channels_info_get(struct snd_kcontrol *kcontrol,1760				      struct snd_ctl_elem_value *ucontrol)1761{1762	struct echoaudio *chip;1763	int detected, clocks, bit, src;1764 1765	chip = snd_kcontrol_chip(kcontrol);1766	ucontrol->value.integer.value[0] = num_busses_in(chip);1767	ucontrol->value.integer.value[1] = num_analog_busses_in(chip);1768	ucontrol->value.integer.value[2] = num_busses_out(chip);1769	ucontrol->value.integer.value[3] = num_analog_busses_out(chip);1770	ucontrol->value.integer.value[4] = num_pipes_out(chip);1771 1772	/* Compute the bitmask of the currently valid input clocks */1773	detected = detect_input_clocks(chip);1774	clocks = 0;1775	src = chip->num_clock_sources - 1;1776	for (bit = ECHO_CLOCK_NUMBER - 1; bit >= 0; bit--)1777		if (detected & (1 << bit))1778			for (; src >= 0; src--)1779				if (bit == chip->clock_source_list[src]) {1780					clocks |= 1 << src;1781					break;1782				}1783	ucontrol->value.integer.value[5] = clocks;1784 1785	return 0;1786}1787 1788static const struct snd_kcontrol_new snd_echo_channels_info = {1789	.name = "Channels info",1790	.iface = SNDRV_CTL_ELEM_IFACE_HWDEP,1791	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,1792	.info = snd_echo_channels_info_info,1793	.get = snd_echo_channels_info_get,1794};1795 1796 1797 1798 1799/******************************************************************************1800	IRQ Handling1801******************************************************************************/1802/* Check if a period has elapsed since last interrupt1803 *1804 * Don't make any updates to state; PCM core handles this with the1805 * correct locks.1806 *1807 * \return true if a period has elapsed, otherwise false1808 */1809static bool period_has_elapsed(struct snd_pcm_substream *substream)1810{1811	struct snd_pcm_runtime *runtime = substream->runtime;1812	struct audiopipe *pipe = runtime->private_data;1813	u32 counter, step;1814	size_t period_bytes;1815 1816	if (pipe->state != PIPE_STATE_STARTED)1817		return false;1818 1819	period_bytes = frames_to_bytes(runtime, runtime->period_size);1820 1821	counter = le32_to_cpu(*pipe->dma_counter);  /* presumed atomic */1822 1823	step = counter - pipe->last_period;  /* handles wrapping */1824	step -= step % period_bytes;  /* acknowledge whole periods only */1825 1826	if (step == 0)1827		return false;  /* haven't advanced a whole period yet */1828 1829	pipe->last_period += step;  /* used exclusively by us */1830	return true;1831}1832 1833static irqreturn_t snd_echo_interrupt(int irq, void *dev_id)1834{1835	struct echoaudio *chip = dev_id;1836	int ss, st;1837 1838	spin_lock(&chip->lock);1839	st = service_irq(chip);1840	if (st < 0) {1841		spin_unlock(&chip->lock);1842		return IRQ_NONE;1843	}1844	/* The hardware doesn't tell us which substream caused the irq,1845	thus we have to check all running substreams. */1846	for (ss = 0; ss < DSP_MAXPIPES; ss++) {1847		struct snd_pcm_substream *substream;1848 1849		substream = chip->substream[ss];1850		if (substream && period_has_elapsed(substream)) {1851			spin_unlock(&chip->lock);1852			snd_pcm_period_elapsed(substream);1853			spin_lock(&chip->lock);1854		}1855	}1856	spin_unlock(&chip->lock);1857 1858#ifdef ECHOCARD_HAS_MIDI1859	if (st > 0 && chip->midi_in) {1860		snd_rawmidi_receive(chip->midi_in, chip->midi_buffer, st);1861		dev_dbg(chip->card->dev, "rawmidi_iread=%d\n", st);1862	}1863#endif1864	return IRQ_HANDLED;1865}1866 1867 1868 1869 1870/******************************************************************************1871	Module construction / destruction1872******************************************************************************/1873 1874static void snd_echo_free(struct snd_card *card)1875{1876	struct echoaudio *chip = card->private_data;1877 1878	if (chip->comm_page)1879		rest_in_peace(chip);1880 1881	if (chip->irq >= 0)1882		free_irq(chip->irq, chip);1883 1884	/* release chip data */1885	free_firmware_cache(chip);1886}1887 1888/* <--snd_echo_probe() */1889static int snd_echo_create(struct snd_card *card,1890			   struct pci_dev *pci)1891{1892	struct echoaudio *chip = card->private_data;1893	int err;1894	size_t sz;1895 1896	pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0xC0);1897 1898	err = pcim_enable_device(pci);1899	if (err < 0)1900		return err;1901	pci_set_master(pci);1902 1903	/* Allocate chip if needed */1904	spin_lock_init(&chip->lock);1905	chip->card = card;1906	chip->pci = pci;1907	chip->irq = -1;1908	chip->opencount = 0;1909	mutex_init(&chip->mode_mutex);1910	chip->can_set_rate = 1;1911 1912	/* PCI resource allocation */1913	err = pci_request_regions(pci, ECHOCARD_NAME);1914	if (err < 0)1915		return err;1916 1917	chip->dsp_registers_phys = pci_resource_start(pci, 0);1918	sz = pci_resource_len(pci, 0);1919	if (sz > PAGE_SIZE)1920		sz = PAGE_SIZE;		/* We map only the required part */1921 1922	chip->dsp_registers = devm_ioremap(&pci->dev, chip->dsp_registers_phys, sz);1923	if (!chip->dsp_registers) {1924		dev_err(chip->card->dev, "ioremap failed\n");1925		return -ENOMEM;1926	}1927 1928	if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,1929			KBUILD_MODNAME, chip)) {1930		dev_err(chip->card->dev, "cannot grab irq\n");1931		return -EBUSY;1932	}1933	chip->irq = pci->irq;1934	card->sync_irq = chip->irq;1935	dev_dbg(card->dev, "pci=%p irq=%d subdev=%04x Init hardware...\n",1936		chip->pci, chip->irq, chip->pci->subsystem_device);1937 1938	card->private_free = snd_echo_free;1939 1940	/* Create the DSP comm page - this is the area of memory used for most1941	of the communication with the DSP, which accesses it via bus mastering */1942	chip->commpage_dma_buf =1943		snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV,1944				     sizeof(struct comm_page));1945	if (!chip->commpage_dma_buf)1946		return -ENOMEM;1947	chip->comm_page_phys = chip->commpage_dma_buf->addr;1948	chip->comm_page = (struct comm_page *)chip->commpage_dma_buf->area;1949 1950	err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);1951	if (err >= 0)1952		err = set_mixer_defaults(chip);1953	if (err < 0) {1954		dev_err(card->dev, "init_hw err=%d\n", err);1955		return err;1956	}1957 1958	return 0;1959}1960 1961/* constructor */1962static int __snd_echo_probe(struct pci_dev *pci,1963			    const struct pci_device_id *pci_id)1964{1965	static int dev;1966	struct snd_card *card;1967	struct echoaudio *chip;1968	char *dsp;1969	__maybe_unused int i;1970	int err;1971 1972	if (dev >= SNDRV_CARDS)1973		return -ENODEV;1974	if (!enable[dev]) {1975		dev++;1976		return -ENOENT;1977	}1978 1979	i = 0;1980	err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,1981				sizeof(*chip), &card);1982	if (err < 0)1983		return err;1984	chip = card->private_data;1985 1986	err = snd_echo_create(card, pci);1987	if (err < 0)1988		return err;1989 1990	strcpy(card->driver, "Echo_" ECHOCARD_NAME);1991	strcpy(card->shortname, chip->card_name);1992 1993	dsp = "56301";1994	if (pci_id->device == 0x3410)1995		dsp = "56361";1996 1997	sprintf(card->longname, "%s rev.%d (DSP%s) at 0x%lx irq %i",1998		card->shortname, pci_id->subdevice & 0x000f, dsp,1999		chip->dsp_registers_phys, chip->irq);2000 2001	err = snd_echo_new_pcm(chip);2002	if (err < 0) {2003		dev_err(chip->card->dev, "new pcm error %d\n", err);2004		return err;2005	}2006 2007#ifdef ECHOCARD_HAS_MIDI2008	if (chip->has_midi) {	/* Some Mia's do not have midi */2009		err = snd_echo_midi_create(card, chip);2010		if (err < 0) {2011			dev_err(chip->card->dev, "new midi error %d\n", err);2012			return err;2013		}2014	}2015#endif2016 2017#ifdef ECHOCARD_HAS_VMIXER2018	snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip);2019	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip));2020	if (err < 0)2021		return err;2022#ifdef ECHOCARD_HAS_LINE_OUT_GAIN2023	err = snd_ctl_add(chip->card,2024			  snd_ctl_new1(&snd_echo_line_output_gain, chip));2025	if (err < 0)2026		return err;2027#endif2028#else /* ECHOCARD_HAS_VMIXER */2029	err = snd_ctl_add(chip->card,2030			  snd_ctl_new1(&snd_echo_pcm_output_gain, chip));2031	if (err < 0)2032		return err;2033#endif /* ECHOCARD_HAS_VMIXER */2034 2035#ifdef ECHOCARD_HAS_INPUT_GAIN2036	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip));2037	if (err < 0)2038		return err;2039#endif2040 2041#ifdef ECHOCARD_HAS_INPUT_NOMINAL_LEVEL2042	if (!chip->hasnt_input_nominal_level) {2043		err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip));2044		if (err < 0)2045			return err;2046	}2047#endif2048 2049#ifdef ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL2050	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip));2051	if (err < 0)2052		return err;2053#endif2054 2055	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip));2056	if (err < 0)2057		return err;2058 2059	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip));2060	if (err < 0)2061		return err;2062 2063#ifdef ECHOCARD_HAS_MONITOR2064	snd_echo_monitor_mixer.count = num_busses_in(chip) * num_busses_out(chip);2065	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip));2066	if (err < 0)2067		return err;2068#endif2069 2070#ifdef ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE2071	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip));2072	if (err < 0)2073		return err;2074#endif2075 2076	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip));2077	if (err < 0)2078		return err;2079 2080#ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH2081	/* Creates a list of available digital modes */2082	chip->num_digital_modes = 0;2083	for (i = 0; i < 6; i++)2084		if (chip->digital_modes & (1 << i))2085			chip->digital_mode_list[chip->num_digital_modes++] = i;2086 2087	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip));2088	if (err < 0)2089		return err;2090#endif /* ECHOCARD_HAS_DIGITAL_MODE_SWITCH */2091 2092#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK2093	/* Creates a list of available clock sources */2094	chip->num_clock_sources = 0;2095	for (i = 0; i < 10; i++)2096		if (chip->input_clock_types & (1 << i))2097			chip->clock_source_list[chip->num_clock_sources++] = i;2098 2099	if (chip->num_clock_sources > 1) {2100		chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip);2101		err = snd_ctl_add(chip->card, chip->clock_src_ctl);2102		if (err < 0)2103			return err;2104	}2105#endif /* ECHOCARD_HAS_EXTERNAL_CLOCK */2106 2107#ifdef ECHOCARD_HAS_DIGITAL_IO2108	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip));2109	if (err < 0)2110		return err;2111#endif2112 2113#ifdef ECHOCARD_HAS_PHANTOM_POWER2114	if (chip->has_phantom_power) {2115		err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip));2116		if (err < 0)2117			return err;2118	}2119#endif2120 2121	err = snd_card_register(card);2122	if (err < 0)2123		return err;2124	dev_info(card->dev, "Card registered: %s\n", card->longname);2125 2126	pci_set_drvdata(pci, chip);2127	dev++;2128	return 0;2129}2130 2131static int snd_echo_probe(struct pci_dev *pci,2132			  const struct pci_device_id *pci_id)2133{2134	return snd_card_free_on_error(&pci->dev, __snd_echo_probe(pci, pci_id));2135}2136 2137 2138static int snd_echo_suspend(struct device *dev)2139{2140	struct echoaudio *chip = dev_get_drvdata(dev);2141 2142#ifdef ECHOCARD_HAS_MIDI2143	/* This call can sleep */2144	if (chip->midi_out)2145		snd_echo_midi_output_trigger(chip->midi_out, 0);2146#endif2147	spin_lock_irq(&chip->lock);2148	if (wait_handshake(chip)) {2149		spin_unlock_irq(&chip->lock);2150		return -EIO;2151	}2152	clear_handshake(chip);2153	if (send_vector(chip, DSP_VC_GO_COMATOSE) < 0) {2154		spin_unlock_irq(&chip->lock);2155		return -EIO;2156	}2157	spin_unlock_irq(&chip->lock);2158 2159	chip->dsp_code = NULL;2160	free_irq(chip->irq, chip);2161	chip->irq = -1;2162	chip->card->sync_irq = -1;2163	return 0;2164}2165 2166 2167 2168static int snd_echo_resume(struct device *dev)2169{2170	struct pci_dev *pci = to_pci_dev(dev);2171	struct echoaudio *chip = dev_get_drvdata(dev);2172	struct comm_page *commpage, *commpage_bak;2173	u32 pipe_alloc_mask;2174	int err;2175 2176	commpage = chip->comm_page;2177	commpage_bak = kmemdup(commpage, sizeof(*commpage), GFP_KERNEL);2178	if (commpage_bak == NULL)2179		return -ENOMEM;2180 2181	err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);2182	if (err < 0) {2183		kfree(commpage_bak);2184		dev_err(dev, "resume init_hw err=%d\n", err);2185		return err;2186	}2187 2188	/* Temporarily set chip->pipe_alloc_mask=0 otherwise2189	 * restore_dsp_settings() fails.2190	 */2191	pipe_alloc_mask = chip->pipe_alloc_mask;2192	chip->pipe_alloc_mask = 0;2193	err = restore_dsp_rettings(chip);2194	chip->pipe_alloc_mask = pipe_alloc_mask;2195	if (err < 0) {2196		kfree(commpage_bak);2197		return err;2198	}2199 2200	memcpy(&commpage->audio_format, &commpage_bak->audio_format,2201		sizeof(commpage->audio_format));2202	memcpy(&commpage->sglist_addr, &commpage_bak->sglist_addr,2203		sizeof(commpage->sglist_addr));2204	memcpy(&commpage->midi_output, &commpage_bak->midi_output,2205		sizeof(commpage->midi_output));2206	kfree(commpage_bak);2207 2208	if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,2209			KBUILD_MODNAME, chip)) {2210		dev_err(chip->card->dev, "cannot grab irq\n");2211		return -EBUSY;2212	}2213	chip->irq = pci->irq;2214	chip->card->sync_irq = chip->irq;2215	dev_dbg(dev, "resume irq=%d\n", chip->irq);2216 2217#ifdef ECHOCARD_HAS_MIDI2218	if (chip->midi_input_enabled)2219		enable_midi_input(chip, true);2220	if (chip->midi_out)2221		snd_echo_midi_output_trigger(chip->midi_out, 1);2222#endif2223 2224	return 0;2225}2226 2227static DEFINE_SIMPLE_DEV_PM_OPS(snd_echo_pm, snd_echo_suspend, snd_echo_resume);2228 2229/******************************************************************************2230	Everything starts and ends here2231******************************************************************************/2232 2233/* pci_driver definition */2234static struct pci_driver echo_driver = {2235	.name = KBUILD_MODNAME,2236	.id_table = snd_echo_ids,2237	.probe = snd_echo_probe,2238	.driver = {2239		.pm = &snd_echo_pm,2240	},2241};2242 2243module_pci_driver(echo_driver);2244