soc-pcm.c 86.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// SPDX-License-Identifier: GPL-2.0+
//
// soc-pcm.c  --  ALSA SoC PCM
//
// Copyright 2005 Wolfson Microelectronics PLC.
// Copyright 2005 Openedhand Ltd.
// Copyright (C) 2010 Slimlogic Ltd.
// Copyright (C) 2010 Texas Instruments Inc.
//
// Authors: Liam Girdwood <lrg@ti.com>
//          Mark Brown <broonie@opensource.wolfsonmicro.com>
12 13 14 15

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
16
#include <linux/pinctrl/consumer.h>
17
#include <linux/pm_runtime.h>
18 19
#include <linux/slab.h>
#include <linux/workqueue.h>
20
#include <linux/export.h>
21
#include <linux/debugfs.h>
22 23 24 25
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
26
#include <sound/soc-dpcm.h>
27 28
#include <sound/initval.h>

29 30
#define DPCM_MAX_BE_USERS	8

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
#ifdef CONFIG_DEBUG_FS
static const char *dpcm_state_string(enum snd_soc_dpcm_state state)
{
	switch (state) {
	case SND_SOC_DPCM_STATE_NEW:
		return "new";
	case SND_SOC_DPCM_STATE_OPEN:
		return "open";
	case SND_SOC_DPCM_STATE_HW_PARAMS:
		return "hw_params";
	case SND_SOC_DPCM_STATE_PREPARE:
		return "prepare";
	case SND_SOC_DPCM_STATE_START:
		return "start";
	case SND_SOC_DPCM_STATE_STOP:
		return "stop";
	case SND_SOC_DPCM_STATE_SUSPEND:
		return "suspend";
	case SND_SOC_DPCM_STATE_PAUSED:
		return "paused";
	case SND_SOC_DPCM_STATE_HW_FREE:
		return "hw_free";
	case SND_SOC_DPCM_STATE_CLOSE:
		return "close";
	}

	return "unknown";
}

static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
			       int stream, char *buf, size_t size)
{
	struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
	struct snd_soc_dpcm *dpcm;
	ssize_t offset = 0;
	unsigned long flags;

	/* FE state */
	offset += snprintf(buf + offset, size - offset,
			   "[%s - %s]\n", fe->dai_link->name,
			   stream ? "Capture" : "Playback");

	offset += snprintf(buf + offset, size - offset, "State: %s\n",
			   dpcm_state_string(fe->dpcm[stream].state));

	if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
	    (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
		offset += snprintf(buf + offset, size - offset,
				   "Hardware Params: "
				   "Format = %s, Channels = %d, Rate = %d\n",
				   snd_pcm_format_name(params_format(params)),
				   params_channels(params),
				   params_rate(params));

	/* BEs state */
	offset += snprintf(buf + offset, size - offset, "Backends:\n");

	if (list_empty(&fe->dpcm[stream].be_clients)) {
		offset += snprintf(buf + offset, size - offset,
				   " No active DSP links\n");
		goto out;
	}

	spin_lock_irqsave(&fe->card->dpcm_lock, flags);
	for_each_dpcm_be(fe, stream, dpcm) {
		struct snd_soc_pcm_runtime *be = dpcm->be;
		params = &dpcm->hw_params;

		offset += snprintf(buf + offset, size - offset,
				   "- %s\n", be->dai_link->name);

		offset += snprintf(buf + offset, size - offset,
				   "   State: %s\n",
				   dpcm_state_string(be->dpcm[stream].state));

		if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
		    (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
			offset += snprintf(buf + offset, size - offset,
					   "   Hardware Params: "
					   "Format = %s, Channels = %d, Rate = %d\n",
					   snd_pcm_format_name(params_format(params)),
					   params_channels(params),
					   params_rate(params));
	}
	spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
out:
	return offset;
}

static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf,
				    size_t count, loff_t *ppos)
{
	struct snd_soc_pcm_runtime *fe = file->private_data;
	ssize_t out_count = PAGE_SIZE, offset = 0, ret = 0;
	int stream;
	char *buf;

128 129 130 131 132 133
	if (fe->num_cpus > 1) {
		dev_err(fe->dev,
			"%s doesn't support Multi CPU yet\n", __func__);
		return -EINVAL;
	}

134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
	buf = kmalloc(out_count, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	for_each_pcm_streams(stream)
		if (snd_soc_dai_stream_valid(fe->cpu_dai, stream))
			offset += dpcm_show_state(fe, stream,
						  buf + offset,
						  out_count - offset);

	ret = simple_read_from_buffer(user_buf, count, ppos, buf, offset);

	kfree(buf);
	return ret;
}

static const struct file_operations dpcm_state_fops = {
	.open = simple_open,
	.read = dpcm_state_read_file,
	.llseek = default_llseek,
};

void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
{
	if (!rtd->dai_link)
		return;

	if (!rtd->dai_link->dynamic)
		return;

	if (!rtd->card->debugfs_card_root)
		return;

	rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name,
						    rtd->card->debugfs_card_root);

	debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root,
			    rtd, &dpcm_state_fops);
}
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

static void dpcm_create_debugfs_state(struct snd_soc_dpcm *dpcm, int stream)
{
	char *name;

	name = kasprintf(GFP_KERNEL, "%s:%s", dpcm->be->dai_link->name,
			 stream ? "capture" : "playback");
	if (name) {
		dpcm->debugfs_state = debugfs_create_dir(
			name, dpcm->fe->debugfs_dpcm_root);
		debugfs_create_u32("state", 0644, dpcm->debugfs_state,
				   &dpcm->state);
		kfree(name);
	}
}

static void dpcm_remove_debugfs_state(struct snd_soc_dpcm *dpcm)
{
	debugfs_remove_recursive(dpcm->debugfs_state);
}

#else
static inline void dpcm_create_debugfs_state(struct snd_soc_dpcm *dpcm,
					     int stream)
{
}

static inline void dpcm_remove_debugfs_state(struct snd_soc_dpcm *dpcm)
{
}
203 204
#endif

205 206 207 208 209 210 211 212 213
static int soc_rtd_startup(struct snd_soc_pcm_runtime *rtd,
			   struct snd_pcm_substream *substream)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->startup)
		return rtd->dai_link->ops->startup(substream);
	return 0;
}

214 215 216 217 218 219 220 221
static void soc_rtd_shutdown(struct snd_soc_pcm_runtime *rtd,
			     struct snd_pcm_substream *substream)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->shutdown)
		rtd->dai_link->ops->shutdown(substream);
}

222 223 224 225 226 227 228 229 230
static int soc_rtd_prepare(struct snd_soc_pcm_runtime *rtd,
			   struct snd_pcm_substream *substream)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->prepare)
		return rtd->dai_link->ops->prepare(substream);
	return 0;
}

231 232 233 234 235 236 237 238 239 240
static int soc_rtd_hw_params(struct snd_soc_pcm_runtime *rtd,
			     struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *params)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->hw_params)
		return rtd->dai_link->ops->hw_params(substream, params);
	return 0;
}

241 242 243 244 245 246 247 248
static void soc_rtd_hw_free(struct snd_soc_pcm_runtime *rtd,
			    struct snd_pcm_substream *substream)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->hw_free)
		rtd->dai_link->ops->hw_free(substream);
}

249 250 251 252 253 254 255 256 257 258
static int soc_rtd_trigger(struct snd_soc_pcm_runtime *rtd,
			   struct snd_pcm_substream *substream,
			   int cmd)
{
	if (rtd->dai_link->ops &&
	    rtd->dai_link->ops->trigger)
		return rtd->dai_link->ops->trigger(substream, cmd);
	return 0;
}

259 260
static void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd,
				   int stream, int action)
261
{
262
	struct snd_soc_dai *cpu_dai;
263
	struct snd_soc_dai *codec_dai;
264
	int i;
265

266
	lockdep_assert_held(&rtd->card->pcm_mutex);
267

268 269 270
	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		cpu_dai->stream_active[stream] += action;

271 272
	for_each_rtd_codec_dai(rtd, i, codec_dai)
		codec_dai->stream_active[stream] += action;
273

274 275 276 277
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		cpu_dai->active += action;
		cpu_dai->component->active += action;
	}
278
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
279 280
		codec_dai->active += action;
		codec_dai->component->active += action;
281
	}
282 283
}

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
/**
 * snd_soc_runtime_activate() - Increment active count for PCM runtime components
 * @rtd: ASoC PCM runtime that is activated
 * @stream: Direction of the PCM stream
 *
 * Increments the active count for all the DAIs and components attached to a PCM
 * runtime. Should typically be called when a stream is opened.
 *
 * Must be called with the rtd->card->pcm_mutex being held
 */
void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream)
{
	snd_soc_runtime_action(rtd, stream, 1);
}

299 300 301 302 303 304 305 306
/**
 * snd_soc_runtime_deactivate() - Decrement active count for PCM runtime components
 * @rtd: ASoC PCM runtime that is deactivated
 * @stream: Direction of the PCM stream
 *
 * Decrements the active count for all the DAIs and components attached to a PCM
 * runtime. Should typically be called when a stream is closed.
 *
307
 * Must be called with the rtd->card->pcm_mutex being held
308 309 310
 */
void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream)
{
311
	snd_soc_runtime_action(rtd, stream, -1);
312 313
}

314 315 316 317 318 319 320 321 322 323 324
/**
 * snd_soc_runtime_ignore_pmdown_time() - Check whether to ignore the power down delay
 * @rtd: The ASoC PCM runtime that should be checked.
 *
 * This function checks whether the power down delay should be ignored for a
 * specific PCM runtime. Returns true if the delay is 0, if it the DAI link has
 * been configured to ignore the delay, or if none of the components benefits
 * from having the delay.
 */
bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd)
{
325
	struct snd_soc_component *component;
326
	bool ignore = true;
327
	int i;
328

329 330 331
	if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time)
		return true;

332
	for_each_rtd_components(rtd, i, component)
333
		ignore &= !component->driver->use_pmdown_time;
334 335

	return ignore;
336 337
}

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
/**
 * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
 * @substream: the pcm substream
 * @hw: the hardware parameters
 *
 * Sets the substream runtime hardware parameters.
 */
int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
	const struct snd_pcm_hardware *hw)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	runtime->hw.info = hw->info;
	runtime->hw.formats = hw->formats;
	runtime->hw.period_bytes_min = hw->period_bytes_min;
	runtime->hw.period_bytes_max = hw->period_bytes_max;
	runtime->hw.periods_min = hw->periods_min;
	runtime->hw.periods_max = hw->periods_max;
	runtime->hw.buffer_bytes_max = hw->buffer_bytes_max;
	runtime->hw.fifo_size = hw->fifo_size;
	return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);

361
/* DPCM stream event, send event to FE and all active BEs. */
362
int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
363 364 365 366
	int event)
{
	struct snd_soc_dpcm *dpcm;

367
	for_each_dpcm_be(fe, dir, dpcm) {
368 369 370

		struct snd_soc_pcm_runtime *be = dpcm->be;

371
		dev_dbg(be->dev, "ASoC: BE %s event %d dir %d\n",
372 373
				be->dai_link->name, event, dir);

374 375 376 377
		if ((event == SND_SOC_DAPM_STREAM_STOP) &&
		    (be->dpcm[dir].users >= 1))
			continue;

378 379 380 381 382 383 384 385
		snd_soc_dapm_stream_event(be, dir, event);
	}

	snd_soc_dapm_stream_event(fe, dir, event);

	return 0;
}

386 387
static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream,
					struct snd_soc_dai *soc_dai)
388 389 390 391
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	int ret;

392 393 394 395 396
	if (soc_dai->rate && (soc_dai->driver->symmetric_rates ||
				rtd->dai_link->symmetric_rates)) {
		dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %dHz rate\n",
				soc_dai->rate);

397
		ret = snd_pcm_hw_constraint_single(substream->runtime,
398
						SNDRV_PCM_HW_PARAM_RATE,
399
						soc_dai->rate);
400 401 402 403 404 405 406
		if (ret < 0) {
			dev_err(soc_dai->dev,
				"ASoC: Unable to apply rate constraint: %d\n",
				ret);
			return ret;
		}
	}
407

408 409 410 411
	if (soc_dai->channels && (soc_dai->driver->symmetric_channels ||
				rtd->dai_link->symmetric_channels)) {
		dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d channel(s)\n",
				soc_dai->channels);
412

413
		ret = snd_pcm_hw_constraint_single(substream->runtime,
414 415 416 417 418 419 420 421
						SNDRV_PCM_HW_PARAM_CHANNELS,
						soc_dai->channels);
		if (ret < 0) {
			dev_err(soc_dai->dev,
				"ASoC: Unable to apply channel symmetry constraint: %d\n",
				ret);
			return ret;
		}
422 423
	}

424 425 426 427
	if (soc_dai->sample_bits && (soc_dai->driver->symmetric_samplebits ||
				rtd->dai_link->symmetric_samplebits)) {
		dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d sample bits\n",
				soc_dai->sample_bits);
428

429
		ret = snd_pcm_hw_constraint_single(substream->runtime,
430 431 432 433 434 435 436 437
						SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
						soc_dai->sample_bits);
		if (ret < 0) {
			dev_err(soc_dai->dev,
				"ASoC: Unable to apply sample bits symmetry constraint: %d\n",
				ret);
			return ret;
		}
438 439 440 441 442
	}

	return 0;
}

443 444 445 446
static int soc_pcm_params_symmetry(struct snd_pcm_substream *substream,
				struct snd_pcm_hw_params *params)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
447
	struct snd_soc_dai *cpu_dai;
448
	struct snd_soc_dai *codec_dai;
449
	unsigned int rate, channels, sample_bits, symmetry, i;
450 451 452 453 454 455

	rate = params_rate(params);
	channels = params_channels(params);
	sample_bits = snd_pcm_format_physical_width(params_format(params));

	/* reject unmatched parameters when applying symmetry */
456 457 458 459
	symmetry = rtd->dai_link->symmetric_rates;

	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		symmetry |= cpu_dai->driver->symmetric_rates;
460

461 462
	for_each_rtd_codec_dai(rtd, i, codec_dai)
		symmetry |= codec_dai->driver->symmetric_rates;
463

464 465 466 467 468 469 470 471
	if (symmetry) {
		for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
			if (cpu_dai->rate && cpu_dai->rate != rate) {
				dev_err(rtd->dev, "ASoC: unmatched rate symmetry: %d - %d\n",
					cpu_dai->rate, rate);
				return -EINVAL;
			}
		}
472 473
	}

474 475 476 477
	symmetry = rtd->dai_link->symmetric_channels;

	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		symmetry |= cpu_dai->driver->symmetric_channels;
478

479 480
	for_each_rtd_codec_dai(rtd, i, codec_dai)
		symmetry |= codec_dai->driver->symmetric_channels;
481

482 483 484 485 486 487 488 489 490
	if (symmetry) {
		for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
			if (cpu_dai->channels &&
			    cpu_dai->channels != channels) {
				dev_err(rtd->dev, "ASoC: unmatched channel symmetry: %d - %d\n",
					cpu_dai->channels, channels);
				return -EINVAL;
			}
		}
491
	}
492

493 494 495 496
	symmetry = rtd->dai_link->symmetric_samplebits;

	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		symmetry |= cpu_dai->driver->symmetric_samplebits;
497

498 499
	for_each_rtd_codec_dai(rtd, i, codec_dai)
		symmetry |= codec_dai->driver->symmetric_samplebits;
500

501 502 503 504 505 506 507 508 509
	if (symmetry) {
		for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
			if (cpu_dai->sample_bits &&
			    cpu_dai->sample_bits != sample_bits) {
				dev_err(rtd->dev, "ASoC: unmatched sample bits symmetry: %d - %d\n",
					cpu_dai->sample_bits, sample_bits);
				return -EINVAL;
			}
		}
510 511 512 513 514
	}

	return 0;
}

515 516 517 518
static bool soc_pcm_has_symmetry(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai_link *link = rtd->dai_link;
519
	struct snd_soc_dai *codec_dai;
520
	struct snd_soc_dai *cpu_dai;
521
	unsigned int symmetry, i;
522

523 524 525 526 527 528 529 530 531
	symmetry = link->symmetric_rates ||
		link->symmetric_channels ||
		link->symmetric_samplebits;

	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		symmetry = symmetry ||
			cpu_dai->driver->symmetric_rates ||
			cpu_dai->driver->symmetric_channels ||
			cpu_dai->driver->symmetric_samplebits;
532

533
	for_each_rtd_codec_dai(rtd, i, codec_dai)
534
		symmetry = symmetry ||
535 536 537
			codec_dai->driver->symmetric_rates ||
			codec_dai->driver->symmetric_channels ||
			codec_dai->driver->symmetric_samplebits;
538 539

	return symmetry;
540 541
}

542
static void soc_pcm_set_msb(struct snd_pcm_substream *substream, int bits)
543
{
544
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
545
	int ret;
546 547 548 549

	if (!bits)
		return;

550 551 552 553
	ret = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 0, bits);
	if (ret != 0)
		dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n",
				 bits, ret);
554 555
}

556 557 558
static void soc_pcm_apply_msb(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
559
	struct snd_soc_dai *cpu_dai;
560
	struct snd_soc_dai *codec_dai;
561 562
	struct snd_soc_pcm_stream *pcm_codec, *pcm_cpu;
	int stream = substream->stream;
563
	int i;
564
	unsigned int bits = 0, cpu_bits = 0;
565

566 567 568 569 570 571
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
		pcm_codec = snd_soc_dai_get_pcm_stream(codec_dai, stream);

		if (pcm_codec->sig_bits == 0) {
			bits = 0;
			break;
572
		}
573
		bits = max(pcm_codec->sig_bits, bits);
574 575
	}

576 577 578 579 580 581 582 583 584
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		pcm_cpu = snd_soc_dai_get_pcm_stream(cpu_dai, stream);

		if (pcm_cpu->sig_bits == 0) {
			cpu_bits = 0;
			break;
		}
		cpu_bits = max(pcm_cpu->sig_bits, cpu_bits);
	}
585

586 587
	soc_pcm_set_msb(substream, bits);
	soc_pcm_set_msb(substream, cpu_bits);
588 589
}

590
static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
591
{
592
	struct snd_pcm_runtime *runtime = substream->runtime;
593
	struct snd_pcm_hardware *hw = &runtime->hw;
594
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
595
	struct snd_soc_dai *codec_dai;
596
	struct snd_soc_dai *cpu_dai;
597 598 599
	struct snd_soc_pcm_stream *codec_stream;
	struct snd_soc_pcm_stream *cpu_stream;
	unsigned int chan_min = 0, chan_max = UINT_MAX;
600
	unsigned int cpu_chan_min = 0, cpu_chan_max = UINT_MAX;
601
	unsigned int rate_min = 0, rate_max = UINT_MAX;
602 603
	unsigned int cpu_rate_min = 0, cpu_rate_max = UINT_MAX;
	unsigned int rates = UINT_MAX, cpu_rates = UINT_MAX;
604
	u64 formats = ULLONG_MAX;
605
	int stream = substream->stream;
606
	int i;
607

608 609
	/* first calculate min/max only for CPUs in the DAI link */
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
610 611 612 613 614 615 616 617 618 619 620 621 622 623

		/*
		 * Skip CPUs which don't support the current stream type.
		 * Otherwise, since the rate, channel, and format values will
		 * zero in that case, we would have no usable settings left,
		 * causing the resulting setup to fail.
		 * At least one CPU should match, otherwise we should have
		 * bailed out on a higher level, since there would be no
		 * CPU to support the transfer direction in that case.
		 */
		if (!snd_soc_dai_stream_valid(cpu_dai,
					      substream->stream))
			continue;

624 625 626 627 628 629 630 631 632 633
		cpu_stream = snd_soc_dai_get_pcm_stream(cpu_dai, stream);

		cpu_chan_min = max(cpu_chan_min, cpu_stream->channels_min);
		cpu_chan_max = min(cpu_chan_max, cpu_stream->channels_max);
		cpu_rate_min = max(cpu_rate_min, cpu_stream->rate_min);
		cpu_rate_max = min_not_zero(cpu_rate_max, cpu_stream->rate_max);
		formats &= cpu_stream->formats;
		cpu_rates = snd_pcm_rate_mask_intersect(cpu_stream->rates,
							cpu_rates);
	}
634

635
	/* second calculate min/max only for CODECs in the DAI link */
636
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
637 638 639 640 641 642 643 644 645 646

		/*
		 * Skip CODECs which don't support the current stream type.
		 * Otherwise, since the rate, channel, and format values will
		 * zero in that case, we would have no usable settings left,
		 * causing the resulting setup to fail.
		 * At least one CODEC should match, otherwise we should have
		 * bailed out on a higher level, since there would be no
		 * CODEC to support the transfer direction in that case.
		 */
647
		if (!snd_soc_dai_stream_valid(codec_dai, stream))
648 649
			continue;

650 651
		codec_stream = snd_soc_dai_get_pcm_stream(codec_dai, stream);

652 653 654 655 656 657 658 659 660 661
		chan_min = max(chan_min, codec_stream->channels_min);
		chan_max = min(chan_max, codec_stream->channels_max);
		rate_min = max(rate_min, codec_stream->rate_min);
		rate_max = min_not_zero(rate_max, codec_stream->rate_max);
		formats &= codec_stream->formats;
		rates = snd_pcm_rate_mask_intersect(codec_stream->rates, rates);
	}

	/*
	 * chan min/max cannot be enforced if there are multiple CODEC DAIs
662
	 * connected to CPU DAI(s), use CPU DAI's directly and let
663 664 665
	 * channel allocation be fixed up later
	 */
	if (rtd->num_codecs > 1) {
666 667
		chan_min = cpu_chan_min;
		chan_max = cpu_chan_max;
668 669
	}

670 671 672
	/* finally find a intersection between CODECs and CPUs */
	hw->channels_min = max(chan_min, cpu_chan_min);
	hw->channels_max = min(chan_max, cpu_chan_max);
673
	if (hw->formats)
674
		hw->formats &= formats;
675
	else
676 677
		hw->formats = formats;
	hw->rates = snd_pcm_rate_mask_intersect(rates, cpu_rates);
678 679 680

	snd_pcm_limit_hw_rates(runtime);

681
	hw->rate_min = max(hw->rate_min, cpu_rate_min);
682
	hw->rate_min = max(hw->rate_min, rate_min);
683
	hw->rate_max = min_not_zero(hw->rate_max, cpu_rate_max);
684
	hw->rate_max = min_not_zero(hw->rate_max, rate_max);
685 686
}

687
static int soc_pcm_components_open(struct snd_pcm_substream *substream)
688 689
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
690
	struct snd_soc_component *last = NULL;
691
	struct snd_soc_component *component;
692
	int i, ret = 0;
693

694
	for_each_rtd_components(rtd, i, component) {
695 696
		last = component;

697 698
		ret = snd_soc_component_module_get_when_open(component);
		if (ret < 0) {
699 700 701
			dev_err(component->dev,
				"ASoC: can't get module %s\n",
				component->name);
702
			break;
703 704
		}

705
		ret = snd_soc_component_open(component, substream);
706
		if (ret < 0) {
707
			snd_soc_component_module_put_when_close(component);
708 709 710
			dev_err(component->dev,
				"ASoC: can't open component %s: %d\n",
				component->name, ret);
711
			break;
712 713
		}
	}
714

715 716 717 718 719 720 721 722 723 724 725 726
	if (ret < 0) {
		/* rollback on error */
		for_each_rtd_components(rtd, i, component) {
			if (component == last)
				break;

			snd_soc_component_close(component, substream);
			snd_soc_component_module_put_when_close(component);
		}
	}

	return ret;
727 728
}

729
static int soc_pcm_components_close(struct snd_pcm_substream *substream)
730 731 732
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_component *component;
733
	int i, r, ret = 0;
734

735
	for_each_rtd_components(rtd, i, component) {
736 737 738 739
		r = snd_soc_component_close(component, substream);
		if (r < 0)
			ret = r; /* use last ret */

740
		snd_soc_component_module_put_when_close(component);
741 742
	}

743
	return ret;
744 745
}

746 747 748 749 750 751 752 753 754
/*
 * Called by ALSA when a PCM substream is closed. Private data can be
 * freed here. The cpu DAI, codec DAI, machine and components are also
 * shutdown.
 */
static int soc_pcm_close(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_component *component;
755
	struct snd_soc_dai *cpu_dai;
756 757 758 759 760 761 762
	struct snd_soc_dai *codec_dai;
	int i;

	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

	snd_soc_runtime_deactivate(rtd, substream->stream);

763 764
	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		snd_soc_dai_digital_mute(cpu_dai, 1, substream->stream);
765

766 767
	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		snd_soc_dai_shutdown(cpu_dai, substream);
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791

	for_each_rtd_codec_dai(rtd, i, codec_dai)
		snd_soc_dai_shutdown(codec_dai, substream);

	soc_rtd_shutdown(rtd, substream);

	soc_pcm_components_close(substream);

	snd_soc_dapm_stream_stop(rtd, substream->stream);

	mutex_unlock(&rtd->card->pcm_mutex);

	for_each_rtd_components(rtd, i, component) {
		pm_runtime_mark_last_busy(component->dev);
		pm_runtime_put_autosuspend(component->dev);
	}

	for_each_rtd_components(rtd, i, component)
		if (!component->active)
			pinctrl_pm_select_sleep_state(component->dev);

	return 0;
}

792 793 794
/*
 * Called by ALSA when a PCM substream is opened, the runtime->hw record is
 * then initialized and any private data can be allocated. This also calls
795
 * startup for the cpu DAI, component, machine and codec DAI.
796 797 798 799 800
 */
static int soc_pcm_open(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_pcm_runtime *runtime = substream->runtime;
801
	struct snd_soc_component *component;
802
	struct snd_soc_dai *cpu_dai;
803 804
	struct snd_soc_dai *codec_dai;
	const char *codec_dai_name = "multicodec";
805
	const char *cpu_dai_name = "multicpu";
806
	int i, ret = 0;
807

808 809
	for_each_rtd_components(rtd, i, component)
		pinctrl_pm_select_default_state(component->dev);
810

811
	for_each_rtd_components(rtd, i, component)
812
		pm_runtime_get_sync(component->dev);
813

814
	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
815

816 817 818 819 820 821 822 823
	ret = soc_pcm_components_open(substream);
	if (ret < 0)
		goto component_err;

	ret = soc_rtd_startup(rtd, substream);
	if (ret < 0) {
		pr_err("ASoC: %s startup failed: %d\n",
		       rtd->dai_link->name, ret);
824
		goto rtd_startup_err;
825 826
	}

827
	/* startup the audio subsystem */
828 829 830 831 832 833 834
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		ret = snd_soc_dai_startup(cpu_dai, substream);
		if (ret < 0) {
			dev_err(cpu_dai->dev, "ASoC: can't open interface %s: %d\n",
				cpu_dai->name, ret);
			goto cpu_dai_err;
		}
835 836
	}

837
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
838 839 840 841 842
		ret = snd_soc_dai_startup(codec_dai, substream);
		if (ret < 0) {
			dev_err(codec_dai->dev,
				"ASoC: can't open codec %s: %d\n",
				codec_dai->name, ret);
843
			goto config_err;
844
		}
845 846 847 848 849

		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
			codec_dai->tx_mask = 0;
		else
			codec_dai->rx_mask = 0;
850 851
	}

852 853 854 855
	/* Dynamic PCM DAI links compat checks use dynamic capabilities */
	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm)
		goto dynamic;

856
	/* Check that the codec and cpu DAIs are compatible */
857 858 859 860
	soc_pcm_init_runtime_hw(substream);

	if (rtd->num_codecs == 1)
		codec_dai_name = rtd->codec_dai->name;
861

862 863 864
	if (rtd->num_cpus == 1)
		cpu_dai_name = rtd->cpu_dai->name;

865 866 867
	if (soc_pcm_has_symmetry(substream))
		runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;

868 869
	ret = -EINVAL;
	if (!runtime->hw.rates) {
870
		printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n",
871
			codec_dai_name, cpu_dai_name);
872 873 874
		goto config_err;
	}
	if (!runtime->hw.formats) {
875
		printk(KERN_ERR "ASoC: %s <-> %s No matching formats\n",
876
			codec_dai_name, cpu_dai_name);
877 878 879 880
		goto config_err;
	}
	if (!runtime->hw.channels_min || !runtime->hw.channels_max ||
	    runtime->hw.channels_min > runtime->hw.channels_max) {
881
		printk(KERN_ERR "ASoC: %s <-> %s No matching channels\n",
882
				codec_dai_name, cpu_dai_name);
883 884 885
		goto config_err;
	}

886
	soc_pcm_apply_msb(substream);
887

888
	/* Symmetry only applies if we've already got an active stream. */
889 890 891 892 893 894
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		if (cpu_dai->active) {
			ret = soc_pcm_apply_symmetry(substream, cpu_dai);
			if (ret != 0)
				goto config_err;
		}
895 896
	}

897 898 899
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
		if (codec_dai->active) {
			ret = soc_pcm_apply_symmetry(substream, codec_dai);
900 901 902
			if (ret != 0)
				goto config_err;
		}
903 904
	}

905
	pr_debug("ASoC: %s <-> %s info:\n",
906
		 codec_dai_name, cpu_dai_name);
907 908
	pr_debug("ASoC: rate mask 0x%x\n", runtime->hw.rates);
	pr_debug("ASoC: min ch %d max ch %d\n", runtime->hw.channels_min,
909
		 runtime->hw.channels_max);
910
	pr_debug("ASoC: min rate %d max rate %d\n", runtime->hw.rate_min,
911 912
		 runtime->hw.rate_max);

913
dynamic:
914 915 916

	snd_soc_runtime_activate(rtd, substream->stream);

917
	mutex_unlock(&rtd->card->pcm_mutex);
918 919 920
	return 0;

config_err:
921
	for_each_rtd_codec_dai(rtd, i, codec_dai)
922
		snd_soc_dai_shutdown(codec_dai, substream);
923
cpu_dai_err:
924 925
	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		snd_soc_dai_shutdown(cpu_dai, substream);
926

927
	soc_rtd_shutdown(rtd, substream);
928
rtd_startup_err:
929
	soc_pcm_components_close(substream);
930
component_err:
931
	mutex_unlock(&rtd->card->pcm_mutex);
932

933
	for_each_rtd_components(rtd, i, component) {
934 935
		pm_runtime_mark_last_busy(component->dev);
		pm_runtime_put_autosuspend(component->dev);
936 937
	}

938 939 940
	for_each_rtd_components(rtd, i, component)
		if (!component->active)
			pinctrl_pm_select_sleep_state(component->dev);
941

942 943 944
	return ret;
}

945
static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
946 947 948 949 950 951 952 953 954
{
	/*
	 * Currently nothing to do for c2c links
	 * Since c2c links are internal nodes in the DAPM graph and
	 * don't interface with the outside world or application layer
	 * we don't have to do any special handling on close.
	 */
}

955 956 957 958 959 960 961 962
/*
 * Called by ALSA when the PCM substream is prepared, can set format, sample
 * rate, etc.  This function is non atomic and can be called multiple times,
 * it can refer to the runtime info.
 */
static int soc_pcm_prepare(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
963
	struct snd_soc_component *component;
964
	struct snd_soc_dai *cpu_dai;
965 966
	struct snd_soc_dai *codec_dai;
	int i, ret = 0;
967

968
	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
969

970 971 972 973 974
	ret = soc_rtd_prepare(rtd, substream);
	if (ret < 0) {
		dev_err(rtd->card->dev,
			"ASoC: machine prepare error: %d\n", ret);
		goto out;
975 976
	}

977
	for_each_rtd_components(rtd, i, component) {
978
		ret = snd_soc_component_prepare(component, substream);
979 980 981 982 983 984 985
		if (ret < 0) {
			dev_err(component->dev,
				"ASoC: platform prepare error: %d\n", ret);
			goto out;
		}
	}

986
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
987
		ret = snd_soc_dai_prepare(codec_dai, substream);
988
		if (ret < 0) {
989 990 991
			dev_err(codec_dai->dev,
				"ASoC: codec DAI prepare error: %d\n",
				ret);
992 993 994 995
			goto out;
		}
	}

996 997 998 999 1000 1001 1002
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		ret = snd_soc_dai_prepare(cpu_dai, substream);
		if (ret < 0) {
			dev_err(cpu_dai->dev,
				"ASoC: cpu DAI prepare error: %d\n", ret);
			goto out;
		}
1003 1004
	}

1005 1006
	/* cancel any delayed stream shutdown that is pending */
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
1007 1008
	    rtd->pop_wait) {
		rtd->pop_wait = 0;
1009 1010 1011
		cancel_delayed_work(&rtd->delayed_work);
	}

1012 1013
	snd_soc_dapm_stream_event(rtd, substream->stream,
			SND_SOC_DAPM_STREAM_START);
1014

1015 1016
	for_each_rtd_codec_dai(rtd, i, codec_dai)
		snd_soc_dai_digital_mute(codec_dai, 0,
1017
					 substream->stream);
1018 1019
	for_each_rtd_cpu_dai(rtd, i, cpu_dai)
		snd_soc_dai_digital_mute(cpu_dai, 0, substream->stream);
1020 1021

out:
1022
	mutex_unlock(&rtd->card->pcm_mutex);
1023 1024 1025
	return ret;
}

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
static void soc_pcm_codec_params_fixup(struct snd_pcm_hw_params *params,
				       unsigned int mask)
{
	struct snd_interval *interval;
	int channels = hweight_long(mask);

	interval = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
	interval->min = channels;
	interval->max = channels;
}

1037 1038 1039 1040 1041
static int soc_pcm_components_hw_free(struct snd_pcm_substream *substream,
				      struct snd_soc_component *last)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_component *component;
1042
	int i, r, ret = 0;
1043

1044
	for_each_rtd_components(rtd, i, component) {
1045 1046 1047
		if (component == last)
			break;

1048 1049 1050
		r = snd_soc_component_hw_free(component, substream);
		if (r < 0)
			ret = r; /* use last ret */
1051 1052
	}

1053
	return ret;
1054 1055
}

1056 1057 1058 1059 1060 1061 1062 1063 1064
/*
 * Called by ALSA when the hardware params are set by application. This
 * function can also be called multiple times and can allocate buffers
 * (using snd_pcm_lib_* ). It's non-atomic.
 */
static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
				struct snd_pcm_hw_params *params)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1065
	struct snd_soc_component *component;
1066
	struct snd_soc_dai *cpu_dai;
1067
	struct snd_soc_dai *codec_dai;
1068
	int i, ret = 0;
1069

1070
	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
1071 1072 1073 1074 1075

	ret = soc_pcm_params_symmetry(substream, params);
	if (ret)
		goto out;

1076 1077 1078 1079 1080
	ret = soc_rtd_hw_params(rtd, substream, params);
	if (ret < 0) {
		dev_err(rtd->card->dev,
			"ASoC: machine hw_params failed: %d\n", ret);
		goto out;
1081 1082
	}

1083
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1084 1085
		struct snd_pcm_hw_params codec_params;

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
		/*
		 * Skip CODECs which don't support the current stream type,
		 * the idea being that if a CODEC is not used for the currently
		 * set up transfer direction, it should not need to be
		 * configured, especially since the configuration used might
		 * not even be supported by that CODEC. There may be cases
		 * however where a CODEC needs to be set up although it is
		 * actually not being used for the transfer, e.g. if a
		 * capture-only CODEC is acting as an LRCLK and/or BCLK master
		 * for the DAI link including a playback-only CODEC.
		 * If this becomes necessary, we will have to augment the
		 * machine driver setup with information on how to act, so
		 * we can do the right thing here.
		 */
		if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
			continue;

1103 1104 1105 1106
		/* copy params for each codec */
		codec_params = *params;

		/* fixup params based on TDM slot masks */
1107 1108
		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
		    codec_dai->tx_mask)
1109 1110
			soc_pcm_codec_params_fixup(&codec_params,
						   codec_dai->tx_mask);
1111 1112 1113

		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
		    codec_dai->rx_mask)
1114 1115 1116
			soc_pcm_codec_params_fixup(&codec_params,
						   codec_dai->rx_mask);

1117 1118
		ret = snd_soc_dai_hw_params(codec_dai, substream,
					    &codec_params);
1119
		if(ret < 0)
1120 1121
			goto codec_err;

1122 1123 1124 1125
		codec_dai->rate = params_rate(&codec_params);
		codec_dai->channels = params_channels(&codec_params);
		codec_dai->sample_bits = snd_pcm_format_physical_width(
						params_format(&codec_params));
1126 1127

		snd_soc_dapm_update_dai(substream, &codec_params, codec_dai);
1128 1129
	}

1130
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
1131 1132 1133 1134 1135 1136 1137
		/*
		 * Skip CPUs which don't support the current stream
		 * type. See soc_pcm_init_runtime_hw() for more details
		 */
		if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
			continue;

1138 1139 1140
		ret = snd_soc_dai_hw_params(cpu_dai, substream, params);
		if (ret < 0)
			goto interface_err;
1141

1142 1143 1144 1145 1146
		/* store the parameters for each DAI */
		cpu_dai->rate = params_rate(params);
		cpu_dai->channels = params_channels(params);
		cpu_dai->sample_bits =
			snd_pcm_format_physical_width(params_format(params));
1147

1148 1149
		snd_soc_dapm_update_dai(substream, params, cpu_dai);
	}
1150

1151
	for_each_rtd_components(rtd, i, component) {
1152
		ret = snd_soc_component_hw_params(component, substream, params);
1153
		if (ret < 0) {
1154 1155
			dev_err(component->dev,
				"ASoC: %s hw params failed: %d\n",
1156 1157
				component->name, ret);
			goto component_err;
1158 1159
		}
	}
1160
	component = NULL;
1161

1162
out:
1163
	mutex_unlock(&rtd->card->pcm_mutex);
1164 1165
	return ret;

1166
component_err:
1167
	soc_pcm_components_hw_free(substream, component);
1168

1169
	i = rtd->num_cpus;
1170 1171

interface_err:
1172
	for_each_rtd_cpu_dai_rollback(rtd, i, cpu_dai) {
1173 1174 1175
		if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
			continue;

1176 1177 1178 1179
		snd_soc_dai_hw_free(cpu_dai, substream);
		cpu_dai->rate = 0;
	}

1180
	i = rtd->num_codecs;
1181 1182

codec_err:
1183
	for_each_rtd_codec_dai_rollback(rtd, i, codec_dai) {
1184 1185 1186
		if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
			continue;

1187
		snd_soc_dai_hw_free(codec_dai, substream);
1188 1189 1190
		codec_dai->rate = 0;
	}

1191
	soc_rtd_hw_free(rtd, substream);
1192

1193
	mutex_unlock(&rtd->card->pcm_mutex);
1194 1195 1196 1197 1198 1199 1200 1201 1202
	return ret;
}

/*
 * Frees resources allocated by hw_params, can be called multiple times
 */
static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1203
	struct snd_soc_dai *cpu_dai;
1204
	struct snd_soc_dai *codec_dai;
1205
	bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1206
	int i;
1207

1208
	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
1209

1210
	/* clear the corresponding DAIs parameters when going to be inactive */
1211 1212 1213 1214 1215 1216
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		if (cpu_dai->active == 1) {
			cpu_dai->rate = 0;
			cpu_dai->channels = 0;
			cpu_dai->sample_bits = 0;
		}
1217 1218
	}

1219
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1220 1221 1222 1223 1224
		if (codec_dai->active == 1) {
			codec_dai->rate = 0;
			codec_dai->channels = 0;
			codec_dai->sample_bits = 0;
		}
1225 1226
	}

1227
	/* apply codec digital mute */
1228
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1229 1230 1231 1232 1233
		int playback_active = codec_dai->stream_active[SNDRV_PCM_STREAM_PLAYBACK];
		int capture_active  = codec_dai->stream_active[SNDRV_PCM_STREAM_CAPTURE];

		if ((playback && playback_active == 1) ||
		    (!playback && capture_active == 1))
1234
			snd_soc_dai_digital_mute(codec_dai, 1,
1235 1236
						 substream->stream);
	}
1237 1238

	/* free any machine hw params */
1239
	soc_rtd_hw_free(rtd, substream);
1240

1241
	/* free any component resources */
1242
	soc_pcm_components_hw_free(substream, NULL);
1243

1244
	/* now free hw params for the DAIs  */
1245
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1246 1247 1248
		if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
			continue;

1249
		snd_soc_dai_hw_free(codec_dai, substream);
1250
	}
1251

1252 1253 1254 1255
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
			continue;

1256
		snd_soc_dai_hw_free(cpu_dai, substream);
1257
	}
1258

1259
	mutex_unlock(&rtd->card->pcm_mutex);
1260 1261 1262
	return 0;
}

1263
static int soc_pcm_trigger_start(struct snd_pcm_substream *substream, int cmd)
1264 1265
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1266
	struct snd_soc_component *component;
1267
	struct snd_soc_dai *cpu_dai;
1268 1269 1270
	struct snd_soc_dai *codec_dai;
	int i, ret;

1271 1272 1273
	ret = soc_rtd_trigger(rtd, substream, cmd);
	if (ret < 0)
		return ret;
1274

1275
	for_each_rtd_components(rtd, i, component) {
1276
		ret = snd_soc_component_trigger(component, substream, cmd);
1277 1278 1279 1280
		if (ret < 0)
			return ret;
	}

1281 1282 1283 1284 1285
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
		if (ret < 0)
			return ret;
	}
1286

1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
		ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
		if (ret < 0)
			return ret;
	}

	return 0;
}

static int soc_pcm_trigger_stop(struct snd_pcm_substream *substream, int cmd)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_component *component;
1300
	struct snd_soc_dai *cpu_dai;
1301 1302 1303 1304 1305 1306 1307 1308 1309
	struct snd_soc_dai *codec_dai;
	int i, ret;

	for_each_rtd_codec_dai(rtd, i, codec_dai) {
		ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
		if (ret < 0)
			return ret;
	}

1310 1311 1312 1313 1314
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
		if (ret < 0)
			return ret;
	}
1315

1316
	for_each_rtd_components(rtd, i, component) {
1317 1318 1319 1320 1321
		ret = snd_soc_component_trigger(component, substream, cmd);
		if (ret < 0)
			return ret;
	}

1322 1323 1324
	ret = soc_rtd_trigger(rtd, substream, cmd);
	if (ret < 0)
		return ret;
1325

1326 1327 1328
	return 0;
}

1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350
static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
	int ret;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_RESUME:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
		ret = soc_pcm_trigger_start(substream, cmd);
		break;
	case SNDRV_PCM_TRIGGER_STOP:
	case SNDRV_PCM_TRIGGER_SUSPEND:
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
		ret = soc_pcm_trigger_stop(substream, cmd);
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

1351 1352
static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
				   int cmd)
1353 1354
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1355
	struct snd_soc_dai *cpu_dai;
1356 1357 1358
	struct snd_soc_dai *codec_dai;
	int i, ret;

1359
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1360
		ret = snd_soc_dai_bespoke_trigger(codec_dai, substream, cmd);
1361 1362 1363
		if (ret < 0)
			return ret;
	}
1364

1365 1366 1367 1368 1369
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		ret = snd_soc_dai_bespoke_trigger(cpu_dai, substream, cmd);
		if (ret < 0)
			return ret;
	}
1370

1371 1372
	return 0;
}
1373 1374
/*
 * soc level wrapper for pointer callback
1375
 * If cpu_dai, codec_dai, component driver has the delay callback, then
1376 1377 1378 1379 1380
 * the runtime->delay will be updated accordingly.
 */
static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1381
	struct snd_soc_dai *cpu_dai;
1382
	struct snd_soc_dai *codec_dai;
1383 1384 1385
	struct snd_pcm_runtime *runtime = substream->runtime;
	snd_pcm_uframes_t offset = 0;
	snd_pcm_sframes_t delay = 0;
1386
	snd_pcm_sframes_t codec_delay = 0;
1387
	snd_pcm_sframes_t cpu_delay = 0;
1388
	int i;
1389

1390 1391 1392
	/* clearing the previous total delay */
	runtime->delay = 0;

1393
	offset = snd_soc_pcm_component_pointer(substream);
1394

1395 1396
	/* base delay if assigned in pointer callback */
	delay = runtime->delay;
1397

1398 1399 1400 1401 1402
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
		cpu_delay = max(cpu_delay,
				snd_soc_dai_delay(cpu_dai, substream));
	}
	delay += cpu_delay;
1403

1404
	for_each_rtd_codec_dai(rtd, i, codec_dai) {
1405 1406
		codec_delay = max(codec_delay,
				  snd_soc_dai_delay(codec_dai, substream));
1407 1408
	}
	delay += codec_delay;
1409 1410 1411 1412 1413 1414

	runtime->delay = delay;

	return offset;
}

1415 1416 1417 1418 1419
/* connect a FE and BE */
static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
		struct snd_soc_pcm_runtime *be, int stream)
{
	struct snd_soc_dpcm *dpcm;
1420
	unsigned long flags;
1421 1422

	/* only add new dpcms */
1423
	for_each_dpcm_be(fe, stream, dpcm) {
1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
		if (dpcm->be == be && dpcm->fe == fe)
			return 0;
	}

	dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
	if (!dpcm)
		return -ENOMEM;

	dpcm->be = be;
	dpcm->fe = fe;
	be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
	dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
1436
	spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1437 1438
	list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
	list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
1439
	spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1440

1441
	dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n",
1442 1443 1444
			stream ? "capture" : "playback",  fe->dai_link->name,
			stream ? "<-" : "->", be->dai_link->name);

1445 1446
	dpcm_create_debugfs_state(dpcm, stream);

1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
	return 1;
}

/* reparent a BE onto another FE */
static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe,
			struct snd_soc_pcm_runtime *be, int stream)
{
	struct snd_soc_dpcm *dpcm;
	struct snd_pcm_substream *fe_substream, *be_substream;

	/* reparent if BE is connected to other FEs */
	if (!be->dpcm[stream].users)
		return;

	be_substream = snd_soc_dpcm_get_substream(be, stream);

1463
	for_each_dpcm_fe(be, stream, dpcm) {
1464 1465 1466
		if (dpcm->fe == fe)
			continue;

1467
		dev_dbg(fe->dev, "reparent %s path %s %s %s\n",
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478
			stream ? "capture" : "playback",
			dpcm->fe->dai_link->name,
			stream ? "<-" : "->", dpcm->be->dai_link->name);

		fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
		be_substream->runtime = fe_substream->runtime;
		break;
	}
}

/* disconnect a BE and FE */
1479
void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
1480 1481
{
	struct snd_soc_dpcm *dpcm, *d;
1482
	unsigned long flags;
1483

1484
	for_each_dpcm_be_safe(fe, stream, dpcm, d) {
1485
		dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n",
1486 1487 1488 1489 1490 1491
				stream ? "capture" : "playback",
				dpcm->be->dai_link->name);

		if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE)
			continue;

1492
		dev_dbg(fe->dev, "freed DSP %s path %s %s %s\n",
1493 1494 1495 1496 1497 1498
			stream ? "capture" : "playback", fe->dai_link->name,
			stream ? "<-" : "->", dpcm->be->dai_link->name);

		/* BEs still alive need new FE */
		dpcm_be_reparent(fe, dpcm->be, stream);

1499 1500
		dpcm_remove_debugfs_state(dpcm);

1501
		spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1502 1503
		list_del(&dpcm->list_be);
		list_del(&dpcm->list_fe);
1504
		spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1505 1506 1507 1508 1509 1510 1511 1512 1513
		kfree(dpcm);
	}
}

/* get BE for DAI widget and stream */
static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
		struct snd_soc_dapm_widget *widget, int stream)
{
	struct snd_soc_pcm_runtime *be;
1514
	struct snd_soc_dapm_widget *w;
1515
	struct snd_soc_dai *dai;
1516
	int i;
1517

1518 1519
	dev_dbg(card->dev, "ASoC: find BE for widget %s\n", widget->name);

1520
	for_each_card_rtds(card, be) {
1521

1522 1523
		if (!be->dai_link->no_pcm)
			continue;
1524

1525 1526
		for_each_rtd_cpu_dai(be, i, dai) {
			w = snd_soc_dai_get_widget(dai, stream);
1527

1528 1529
			dev_dbg(card->dev, "ASoC: try BE : %s\n",
				w ? w->name : "(not set)");
1530

1531 1532 1533
			if (w == widget)
				return be;
		}
1534

1535
		for_each_rtd_codec_dai(be, i, dai) {
1536
			w = snd_soc_dai_get_widget(dai, stream);
1537

1538
			if (w == widget)
1539 1540 1541 1542
				return be;
		}
	}

1543
	/* Widget provided is not a BE */
1544 1545 1546 1547 1548 1549
	return NULL;
}

static int widget_in_list(struct snd_soc_dapm_widget_list *list,
		struct snd_soc_dapm_widget *widget)
{
1550
	struct snd_soc_dapm_widget *w;
1551 1552
	int i;

1553 1554
	for_each_dapm_widgets(list, i, w)
		if (widget == w)
1555 1556 1557 1558 1559
			return 1;

	return 0;
}

1560 1561 1562 1563 1564
static bool dpcm_end_walk_at_be(struct snd_soc_dapm_widget *widget,
		enum snd_soc_dapm_direction dir)
{
	struct snd_soc_card *card = widget->dapm->card;
	struct snd_soc_pcm_runtime *rtd;
1565
	int stream;
1566

1567 1568 1569 1570 1571
	/* adjust dir to stream */
	if (dir == SND_SOC_DAPM_DIR_OUT)
		stream = SNDRV_PCM_STREAM_PLAYBACK;
	else
		stream = SNDRV_PCM_STREAM_CAPTURE;
1572

1573 1574 1575
	rtd = dpcm_get_be(card, widget, stream);
	if (rtd)
		return true;
1576 1577 1578 1579

	return false;
}

1580
int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
1581
	int stream, struct snd_soc_dapm_widget_list **list)
1582 1583 1584 1585
{
	struct snd_soc_dai *cpu_dai = fe->cpu_dai;
	int paths;

1586 1587 1588 1589 1590 1591
	if (fe->num_cpus > 1) {
		dev_err(fe->dev,
			"%s doesn't support Multi CPU yet\n", __func__);
		return -EINVAL;
	}

1592
	/* get number of valid DAI paths and their widgets */
1593
	paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list,
1594
			dpcm_end_walk_at_be);
1595

1596
	dev_dbg(fe->dev, "ASoC: found %d audio %s paths\n", paths,
1597 1598 1599 1600 1601
			stream ? "capture" : "playback");

	return paths;
}

1602 1603 1604 1605 1606
void dpcm_path_put(struct snd_soc_dapm_widget_list **list)
{
	snd_soc_dapm_dai_free_widgets(list);
}

1607 1608 1609 1610 1611 1612
static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
	struct snd_soc_dapm_widget_list **list_)
{
	struct snd_soc_dpcm *dpcm;
	struct snd_soc_dapm_widget_list *list = *list_;
	struct snd_soc_dapm_widget *widget;
1613
	struct snd_soc_dai *dai;
1614
	int prune = 0;
1615
	int do_prune;
1616 1617

	/* Destroy any old FE <--> BE connections */
1618
	for_each_dpcm_be(fe, stream, dpcm) {
1619
		unsigned int i;
1620 1621

		/* is there a valid CPU DAI widget for this BE */
1622 1623 1624
		do_prune = 1;
		for_each_rtd_cpu_dai(dpcm->be, i, dai) {
			widget = snd_soc_dai_get_widget(dai, stream);
1625

1626 1627 1628 1629 1630 1631 1632 1633
			/*
			 * The BE is pruned only if none of the cpu_dai
			 * widgets are in the active list.
			 */
			if (widget && widget_in_list(list, widget))
				do_prune = 0;
		}
		if (!do_prune)
1634 1635 1636
			continue;

		/* is there a valid CODEC DAI widget for this BE */
1637
		do_prune = 1;
1638
		for_each_rtd_codec_dai(dpcm->be, i, dai) {
1639
			widget = snd_soc_dai_get_widget(dai, stream);
1640

1641 1642
			/* prune the BE if it's no longer in our active list */
			if (widget && widget_in_list(list, widget))
1643
				do_prune = 0;
1644
		}
1645 1646
		if (!do_prune)
			continue;
1647

1648
		dev_dbg(fe->dev, "ASoC: pruning %s BE %s for %s\n",
1649 1650 1651 1652 1653 1654 1655
			stream ? "capture" : "playback",
			dpcm->be->dai_link->name, fe->dai_link->name);
		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
		dpcm->be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
		prune++;
	}

1656
	dev_dbg(fe->dev, "ASoC: found %d old BE paths for pruning\n", prune);
1657 1658 1659 1660 1661 1662 1663 1664 1665
	return prune;
}

static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
	struct snd_soc_dapm_widget_list **list_)
{
	struct snd_soc_card *card = fe->card;
	struct snd_soc_dapm_widget_list *list = *list_;
	struct snd_soc_pcm_runtime *be;
1666
	struct snd_soc_dapm_widget *widget;
1667 1668 1669
	int i, new = 0, err;

	/* Create any new FE <--> BE connections */
1670
	for_each_dapm_widgets(list, i, widget) {
1671

1672
		switch (widget->id) {
1673
		case snd_soc_dapm_dai_in:
1674 1675 1676
			if (stream != SNDRV_PCM_STREAM_PLAYBACK)
				continue;
			break;
1677
		case snd_soc_dapm_dai_out:
1678 1679
			if (stream != SNDRV_PCM_STREAM_CAPTURE)
				continue;
1680 1681
			break;
		default:
1682
			continue;
1683
		}
1684 1685

		/* is there a valid BE rtd for this widget */
1686
		be = dpcm_get_be(card, widget, stream);
1687
		if (!be) {
1688
			dev_err(fe->dev, "ASoC: no BE found for %s\n",
1689
					widget->name);
1690 1691 1692 1693
			continue;
		}

		/* don't connect if FE is not running */
1694
		if (!fe->dpcm[stream].runtime && !fe->fe_compr)
1695 1696 1697 1698 1699
			continue;

		/* newly connected FE and BE */
		err = dpcm_be_connect(fe, be, stream);
		if (err < 0) {
1700
			dev_err(fe->dev, "ASoC: can't connect %s\n",
1701
				widget->name);
1702 1703 1704 1705 1706 1707 1708 1709 1710
			break;
		} else if (err == 0) /* already connected */
			continue;

		/* new */
		be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
		new++;
	}

1711
	dev_dbg(fe->dev, "ASoC: found %d new BE paths\n", new);
1712 1713 1714 1715 1716 1717 1718
	return new;
}

/*
 * Find the corresponding BE DAIs that source or sink audio to this
 * FE substream.
 */
1719
int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
1720 1721 1722 1723 1724 1725 1726 1727
	int stream, struct snd_soc_dapm_widget_list **list, int new)
{
	if (new)
		return dpcm_add_paths(fe, stream, list);
	else
		return dpcm_prune_paths(fe, stream, list);
}

1728
void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
1729 1730
{
	struct snd_soc_dpcm *dpcm;
1731
	unsigned long flags;
1732

1733
	spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1734
	for_each_dpcm_be(fe, stream, dpcm)
1735 1736
		dpcm->be->dpcm[stream].runtime_update =
						SND_SOC_DPCM_UPDATE_NO;
1737
	spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1738 1739 1740 1741 1742 1743 1744 1745
}

static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
	int stream)
{
	struct snd_soc_dpcm *dpcm;

	/* disable any enabled and non active backends */
1746
	for_each_dpcm_be(fe, stream, dpcm) {
1747 1748 1749 1750 1751 1752

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		if (be->dpcm[stream].users == 0)
1753
			dev_err(be->dev, "ASoC: no users %s at close - state %d\n",
1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768
				stream ? "capture" : "playback",
				be->dpcm[stream].state);

		if (--be->dpcm[stream].users != 0)
			continue;

		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
			continue;

		soc_pcm_close(be_substream);
		be_substream->runtime = NULL;
		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
	}
}

1769
int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
1770 1771 1772 1773 1774
{
	struct snd_soc_dpcm *dpcm;
	int err, count = 0;

	/* only startup BE DAIs that are either sinks or sources to this FE DAI */
1775
	for_each_dpcm_be(fe, stream, dpcm) {
1776 1777 1778 1779 1780

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

1781 1782 1783 1784 1785 1786
		if (!be_substream) {
			dev_err(be->dev, "ASoC: no backend %s stream\n",
				stream ? "capture" : "playback");
			continue;
		}

1787 1788 1789 1790 1791 1792
		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		/* first time the dpcm is open ? */
		if (be->dpcm[stream].users == DPCM_MAX_BE_USERS)
1793
			dev_err(be->dev, "ASoC: too many users %s at open %d\n",
1794 1795 1796 1797 1798 1799 1800 1801 1802 1803
				stream ? "capture" : "playback",
				be->dpcm[stream].state);

		if (be->dpcm[stream].users++ != 0)
			continue;

		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
			continue;

1804 1805
		dev_dbg(be->dev, "ASoC: open %s BE %s\n",
			stream ? "capture" : "playback", be->dai_link->name);
1806 1807 1808 1809

		be_substream->runtime = be->dpcm[stream].runtime;
		err = soc_pcm_open(be_substream);
		if (err < 0) {
1810
			dev_err(be->dev, "ASoC: BE open failed %d\n", err);
1811 1812
			be->dpcm[stream].users--;
			if (be->dpcm[stream].users < 0)
1813
				dev_err(be->dev, "ASoC: no users %s at unwind %d\n",
1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
					stream ? "capture" : "playback",
					be->dpcm[stream].state);

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
			goto unwind;
		}

		be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
		count++;
	}

	return count;

unwind:
	/* disable any enabled and non active backends */
1829
	for_each_dpcm_be_rollback(fe, stream, dpcm) {
1830 1831 1832 1833 1834 1835 1836 1837
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		if (be->dpcm[stream].users == 0)
1838
			dev_err(be->dev, "ASoC: no users %s at close %d\n",
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855
				stream ? "capture" : "playback",
				be->dpcm[stream].state);

		if (--be->dpcm[stream].users != 0)
			continue;

		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
			continue;

		soc_pcm_close(be_substream);
		be_substream->runtime = NULL;
		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
	}

	return err;
}

1856
static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime,
1857
				 struct snd_soc_pcm_stream *stream)
1858 1859
{
	runtime->hw.rate_min = stream->rate_min;
1860
	runtime->hw.rate_max = min_not_zero(stream->rate_max, UINT_MAX);
1861 1862
	runtime->hw.channels_min = stream->channels_min;
	runtime->hw.channels_max = stream->channels_max;
1863
	if (runtime->hw.formats)
1864
		runtime->hw.formats &= stream->formats;
1865
	else
1866
		runtime->hw.formats = stream->formats;
1867 1868 1869
	runtime->hw.rates = stream->rates;
}

1870 1871
static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream,
				      u64 *formats)
1872 1873 1874
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	struct snd_soc_dpcm *dpcm;
1875
	struct snd_soc_dai *dai;
1876 1877 1878
	int stream = substream->stream;

	if (!fe->dai_link->dpcm_merged_format)
1879
		return;
1880 1881 1882 1883 1884 1885

	/*
	 * It returns merged BE codec format
	 * if FE want to use it (= dpcm_merged_format)
	 */

1886
	for_each_dpcm_be(fe, stream, dpcm) {
1887 1888 1889 1890
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_soc_pcm_stream *codec_stream;
		int i;

1891
		for_each_rtd_codec_dai(be, i, dai) {
1892 1893 1894 1895
			/*
			 * Skip CODECs which don't support the current stream
			 * type. See soc_pcm_init_runtime_hw() for more details
			 */
1896
			if (!snd_soc_dai_stream_valid(dai, stream))
1897 1898
				continue;

1899
			codec_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1900

1901
			*formats &= codec_stream->formats;
1902 1903 1904 1905
		}
	}
}

1906 1907 1908
static void dpcm_runtime_merge_chan(struct snd_pcm_substream *substream,
				    unsigned int *channels_min,
				    unsigned int *channels_max)
1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	struct snd_soc_dpcm *dpcm;
	int stream = substream->stream;

	if (!fe->dai_link->dpcm_merged_chan)
		return;

	/*
	 * It returns merged BE codec channel;
	 * if FE want to use it (= dpcm_merged_chan)
	 */

1922
	for_each_dpcm_be(fe, stream, dpcm) {
1923 1924
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_soc_pcm_stream *codec_stream;
1925
		struct snd_soc_pcm_stream *cpu_stream;
1926 1927
		struct snd_soc_dai *dai;
		int i;
1928

1929
		for_each_rtd_cpu_dai(be, i, dai) {
1930 1931 1932 1933 1934 1935 1936
			/*
			 * Skip CPUs which don't support the current stream
			 * type. See soc_pcm_init_runtime_hw() for more details
			 */
			if (!snd_soc_dai_stream_valid(dai, stream))
				continue;

1937
			cpu_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1938

1939 1940 1941 1942 1943
			*channels_min = max(*channels_min,
					    cpu_stream->channels_min);
			*channels_max = min(*channels_max,
					    cpu_stream->channels_max);
		}
1944 1945 1946 1947 1948 1949

		/*
		 * chan min/max cannot be enforced if there are multiple CODEC
		 * DAIs connected to a single CPU DAI, use CPU DAI's directly
		 */
		if (be->num_codecs == 1) {
1950
			codec_stream = snd_soc_dai_get_pcm_stream(be->codec_dais[0], stream);
1951 1952 1953 1954 1955 1956 1957 1958 1959

			*channels_min = max(*channels_min,
					    codec_stream->channels_min);
			*channels_max = min(*channels_max,
					    codec_stream->channels_max);
		}
	}
}

1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976
static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream,
				    unsigned int *rates,
				    unsigned int *rate_min,
				    unsigned int *rate_max)
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	struct snd_soc_dpcm *dpcm;
	int stream = substream->stream;

	if (!fe->dai_link->dpcm_merged_rate)
		return;

	/*
	 * It returns merged BE codec channel;
	 * if FE want to use it (= dpcm_merged_chan)
	 */

1977
	for_each_dpcm_be(fe, stream, dpcm) {
1978 1979 1980
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_soc_pcm_stream *codec_stream;
		struct snd_soc_pcm_stream *cpu_stream;
1981
		struct snd_soc_dai *dai;
1982 1983
		int i;

1984
		for_each_rtd_cpu_dai(be, i, dai) {
1985 1986 1987 1988 1989 1990 1991
			/*
			 * Skip CPUs which don't support the current stream
			 * type. See soc_pcm_init_runtime_hw() for more details
			 */
			if (!snd_soc_dai_stream_valid(dai, stream))
				continue;

1992
			cpu_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1993

1994 1995 1996 1997 1998 1999
			*rate_min = max(*rate_min, cpu_stream->rate_min);
			*rate_max = min_not_zero(*rate_max,
						 cpu_stream->rate_max);
			*rates = snd_pcm_rate_mask_intersect(*rates,
						cpu_stream->rates);
		}
2000

2001
		for_each_rtd_codec_dai(be, i, dai) {
2002 2003 2004 2005
			/*
			 * Skip CODECs which don't support the current stream
			 * type. See soc_pcm_init_runtime_hw() for more details
			 */
2006
			if (!snd_soc_dai_stream_valid(dai, stream))
2007 2008
				continue;

2009
			codec_stream = snd_soc_dai_get_pcm_stream(dai, stream);
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

			*rate_min = max(*rate_min, codec_stream->rate_min);
			*rate_max = min_not_zero(*rate_max,
						 codec_stream->rate_max);
			*rates = snd_pcm_rate_mask_intersect(*rates,
						codec_stream->rates);
		}
	}
}

2020
static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream)
2021 2022 2023
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
2024 2025
	struct snd_soc_dai *cpu_dai;
	int i;
2026

2027
	for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
2028 2029 2030 2031 2032 2033 2034
		/*
		 * Skip CPUs which don't support the current stream
		 * type. See soc_pcm_init_runtime_hw() for more details
		 */
		if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
			continue;

2035 2036 2037
		dpcm_init_runtime_hw(runtime,
			snd_soc_dai_get_pcm_stream(cpu_dai,
						   substream->stream));
2038
	}
2039

2040 2041 2042
	dpcm_runtime_merge_format(substream, &runtime->hw.formats);
	dpcm_runtime_merge_chan(substream, &runtime->hw.channels_min,
				&runtime->hw.channels_max);
2043 2044
	dpcm_runtime_merge_rate(substream, &runtime->hw.rates,
				&runtime->hw.rate_min, &runtime->hw.rate_max);
2045 2046
}

2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069
static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd);

/* Set FE's runtime_update state; the state is protected via PCM stream lock
 * for avoiding the race with trigger callback.
 * If the state is unset and a trigger is pending while the previous operation,
 * process the pending trigger action here.
 */
static void dpcm_set_fe_update_state(struct snd_soc_pcm_runtime *fe,
				     int stream, enum snd_soc_dpcm_update state)
{
	struct snd_pcm_substream *substream =
		snd_soc_dpcm_get_substream(fe, stream);

	snd_pcm_stream_lock_irq(substream);
	if (state == SND_SOC_DPCM_UPDATE_NO && fe->dpcm[stream].trigger_pending) {
		dpcm_fe_dai_do_trigger(substream,
				       fe->dpcm[stream].trigger_pending - 1);
		fe->dpcm[stream].trigger_pending = 0;
	}
	fe->dpcm[stream].runtime_update = state;
	snd_pcm_stream_unlock_irq(substream);
}

P
PC Liao 已提交
2070 2071 2072 2073 2074
static int dpcm_apply_symmetry(struct snd_pcm_substream *fe_substream,
			       int stream)
{
	struct snd_soc_dpcm *dpcm;
	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
2075
	struct snd_soc_dai *fe_cpu_dai;
P
PC Liao 已提交
2076
	int err;
2077
	int i;
P
PC Liao 已提交
2078 2079 2080 2081 2082

	/* apply symmetry for FE */
	if (soc_pcm_has_symmetry(fe_substream))
		fe_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;

2083 2084 2085 2086 2087 2088 2089
	for_each_rtd_cpu_dai (fe, i, fe_cpu_dai) {
		/* Symmetry only applies if we've got an active stream. */
		if (fe_cpu_dai->active) {
			err = soc_pcm_apply_symmetry(fe_substream, fe_cpu_dai);
			if (err < 0)
				return err;
		}
P
PC Liao 已提交
2090 2091 2092
	}

	/* apply symmetry for BE */
2093
	for_each_dpcm_be(fe, stream, dpcm) {
P
PC Liao 已提交
2094 2095 2096
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);
2097
		struct snd_soc_pcm_runtime *rtd;
2098
		struct snd_soc_dai *codec_dai;
2099
		struct snd_soc_dai *cpu_dai;
P
PC Liao 已提交
2100 2101
		int i;

2102 2103 2104 2105 2106
		/* A backend may not have the requested substream */
		if (!be_substream)
			continue;

		rtd = be_substream->private_data;
2107 2108 2109
		if (rtd->dai_link->be_hw_params_fixup)
			continue;

P
PC Liao 已提交
2110 2111 2112 2113
		if (soc_pcm_has_symmetry(be_substream))
			be_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;

		/* Symmetry only applies if we've got an active stream. */
2114 2115 2116 2117 2118 2119 2120
		for_each_rtd_cpu_dai(rtd, i, cpu_dai) {
			if (cpu_dai->active) {
				err = soc_pcm_apply_symmetry(fe_substream,
							     cpu_dai);
				if (err < 0)
					return err;
			}
P
PC Liao 已提交
2121 2122
		}

2123 2124
		for_each_rtd_codec_dai(rtd, i, codec_dai) {
			if (codec_dai->active) {
2125
				err = soc_pcm_apply_symmetry(fe_substream,
2126
							     codec_dai);
P
PC Liao 已提交
2127 2128 2129 2130 2131 2132 2133 2134 2135
				if (err < 0)
					return err;
			}
		}
	}

	return 0;
}

2136 2137 2138 2139 2140 2141
static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
{
	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
	struct snd_pcm_runtime *runtime = fe_substream->runtime;
	int stream = fe_substream->stream, ret = 0;

2142
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2143

2144
	ret = dpcm_be_dai_startup(fe, stream);
2145
	if (ret < 0) {
2146
		dev_err(fe->dev,"ASoC: failed to start some BEs %d\n", ret);
2147 2148 2149
		goto be_err;
	}

2150
	dev_dbg(fe->dev, "ASoC: open FE %s\n", fe->dai_link->name);
2151 2152 2153 2154

	/* start the DAI frontend */
	ret = soc_pcm_open(fe_substream);
	if (ret < 0) {
2155
		dev_err(fe->dev,"ASoC: failed to start FE %d\n", ret);
2156 2157 2158 2159 2160 2161 2162 2163
		goto unwind;
	}

	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;

	dpcm_set_fe_runtime(fe_substream);
	snd_pcm_limit_hw_rates(runtime);

P
PC Liao 已提交
2164 2165 2166 2167 2168 2169 2170
	ret = dpcm_apply_symmetry(fe_substream, stream);
	if (ret < 0) {
		dev_err(fe->dev, "ASoC: failed to apply dpcm symmetry %d\n",
			ret);
		goto unwind;
	}

2171
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2172 2173 2174
	return 0;

unwind:
2175
	dpcm_be_dai_startup_unwind(fe, stream);
2176
be_err:
2177
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2178 2179 2180
	return ret;
}

2181
int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
2182 2183 2184 2185
{
	struct snd_soc_dpcm *dpcm;

	/* only shutdown BEs that are either sinks or sources to this FE DAI */
2186
	for_each_dpcm_be(fe, stream, dpcm) {
2187 2188 2189 2190 2191 2192 2193 2194 2195 2196

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		if (be->dpcm[stream].users == 0)
2197
			dev_err(be->dev, "ASoC: no users %s at close - state %d\n",
2198 2199 2200 2201 2202 2203 2204
				stream ? "capture" : "playback",
				be->dpcm[stream].state);

		if (--be->dpcm[stream].users != 0)
			continue;

		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2205 2206 2207 2208
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)) {
			soc_pcm_hw_free(be_substream);
			be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
		}
2209

2210
		dev_dbg(be->dev, "ASoC: close BE %s\n",
2211
			be->dai_link->name);
2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225

		soc_pcm_close(be_substream);
		be_substream->runtime = NULL;

		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
	}
	return 0;
}

static int dpcm_fe_dai_shutdown(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int stream = substream->stream;

2226
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2227 2228

	/* shutdown the BEs */
2229
	dpcm_be_dai_shutdown(fe, stream);
2230

2231
	dev_dbg(fe->dev, "ASoC: close FE %s\n", fe->dai_link->name);
2232 2233 2234 2235 2236

	/* now shutdown the frontend */
	soc_pcm_close(substream);

	/* run the stream event for each BE */
2237
	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
2238 2239

	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
2240
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2241 2242 2243
	return 0;
}

2244
int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
2245 2246 2247 2248 2249
{
	struct snd_soc_dpcm *dpcm;

	/* only hw_params backends that are either sinks or sources
	 * to this frontend DAI */
2250
	for_each_dpcm_be(fe, stream, dpcm) {
2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		/* only free hw when no longer used - check all FEs */
		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
				continue;

2264 2265 2266 2267
		/* do not free hw if this BE is used by other FE */
		if (be->dpcm[stream].users > 1)
			continue;

2268 2269 2270
		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2271
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
2272 2273
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2274 2275
			continue;

2276
		dev_dbg(be->dev, "ASoC: hw_free BE %s\n",
2277
			be->dai_link->name);
2278 2279 2280 2281 2282 2283 2284 2285 2286

		soc_pcm_hw_free(be_substream);

		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
	}

	return 0;
}

2287
static int dpcm_fe_dai_hw_free(struct snd_pcm_substream *substream)
2288 2289 2290 2291 2292
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int err, stream = substream->stream;

	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2293
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2294

2295
	dev_dbg(fe->dev, "ASoC: hw_free FE %s\n", fe->dai_link->name);
2296 2297 2298 2299

	/* call hw_free on the frontend */
	err = soc_pcm_hw_free(substream);
	if (err < 0)
2300
		dev_err(fe->dev,"ASoC: hw_free FE %s failed\n",
2301 2302 2303 2304 2305 2306 2307
			fe->dai_link->name);

	/* only hw_params backends that are either sinks or sources
	 * to this frontend DAI */
	err = dpcm_be_dai_hw_free(fe, stream);

	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2308
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2309 2310 2311 2312 2313

	mutex_unlock(&fe->card->mutex);
	return 0;
}

2314
int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream)
2315 2316 2317 2318
{
	struct snd_soc_dpcm *dpcm;
	int ret;

2319
	for_each_dpcm_be(fe, stream, dpcm) {
2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		/* copy params for each dpcm */
		memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params,
				sizeof(struct snd_pcm_hw_params));

		/* perform any hw_params fixups */
		if (be->dai_link->be_hw_params_fixup) {
			ret = be->dai_link->be_hw_params_fixup(be,
					&dpcm->hw_params);
			if (ret < 0) {
				dev_err(be->dev,
2339
					"ASoC: hw_params BE fixup failed %d\n",
2340 2341 2342 2343 2344
					ret);
				goto unwind;
			}
		}

2345 2346 2347 2348
		/* copy the fixed-up hw params for BE dai */
		memcpy(&be->dpcm[stream].hw_params, &dpcm->hw_params,
		       sizeof(struct snd_pcm_hw_params));

2349 2350 2351 2352 2353 2354 2355 2356 2357 2358
		/* only allow hw_params() if no connected FEs are running */
		if (!snd_soc_dpcm_can_be_params(fe, be, stream))
			continue;

		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
			continue;

		dev_dbg(be->dev, "ASoC: hw_params BE %s\n",
2359
			be->dai_link->name);
2360

2361 2362 2363
		ret = soc_pcm_hw_params(be_substream, &dpcm->hw_params);
		if (ret < 0) {
			dev_err(dpcm->be->dev,
2364
				"ASoC: hw_params BE failed %d\n", ret);
2365 2366 2367 2368 2369 2370 2371 2372 2373
			goto unwind;
		}

		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
	}
	return 0;

unwind:
	/* disable any enabled and non active backends */
2374
	for_each_dpcm_be_rollback(fe, stream, dpcm) {
2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397
		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		/* only allow hw_free() if no connected FEs are running */
		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
			continue;

		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
			continue;

		soc_pcm_hw_free(be_substream);
	}

	return ret;
}

2398 2399
static int dpcm_fe_dai_hw_params(struct snd_pcm_substream *substream,
				 struct snd_pcm_hw_params *params)
2400 2401 2402 2403 2404
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int ret, stream = substream->stream;

	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2405
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2406

2407
	memcpy(&fe->dpcm[stream].hw_params, params,
2408
			sizeof(struct snd_pcm_hw_params));
2409
	ret = dpcm_be_dai_hw_params(fe, stream);
2410
	if (ret < 0) {
2411
		dev_err(fe->dev,"ASoC: hw_params BE failed %d\n", ret);
2412 2413 2414
		goto out;
	}

2415
	dev_dbg(fe->dev, "ASoC: hw_params FE %s rate %d chan %x fmt %d\n",
2416 2417 2418 2419 2420 2421
			fe->dai_link->name, params_rate(params),
			params_channels(params), params_format(params));

	/* call hw_params on the frontend */
	ret = soc_pcm_hw_params(substream, params);
	if (ret < 0) {
2422
		dev_err(fe->dev,"ASoC: hw_params FE failed %d\n", ret);
2423 2424 2425 2426 2427
		dpcm_be_dai_hw_free(fe, stream);
	 } else
		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;

out:
2428
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2429 2430 2431 2432 2433 2434 2435 2436 2437
	mutex_unlock(&fe->card->mutex);
	return ret;
}

static int dpcm_do_trigger(struct snd_soc_dpcm *dpcm,
		struct snd_pcm_substream *substream, int cmd)
{
	int ret;

2438
	dev_dbg(dpcm->be->dev, "ASoC: trigger BE %s cmd %d\n",
2439
			dpcm->be->dai_link->name, cmd);
2440 2441 2442

	ret = soc_pcm_trigger(substream, cmd);
	if (ret < 0)
2443
		dev_err(dpcm->be->dev,"ASoC: trigger BE failed %d\n", ret);
2444 2445 2446 2447

	return ret;
}

2448
int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
2449
			       int cmd)
2450 2451 2452 2453
{
	struct snd_soc_dpcm *dpcm;
	int ret = 0;

2454
	for_each_dpcm_be(fe, stream, dpcm) {
2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		switch (cmd) {
		case SNDRV_PCM_TRIGGER_START:
			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
			    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
			break;
		case SNDRV_PCM_TRIGGER_RESUME:
			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
			break;
		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
			break;
		case SNDRV_PCM_TRIGGER_STOP:
			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
				continue;

			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
			break;
		case SNDRV_PCM_TRIGGER_SUSPEND:
2510
			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541
				continue;

			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
			break;
		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
				continue;

			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
				continue;

			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
			if (ret)
				return ret;

			be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
			break;
		}
	}

	return ret;
}
EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger);

2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573
static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream,
				  int cmd, bool fe_first)
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int ret;

	/* call trigger on the frontend before the backend. */
	if (fe_first) {
		dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n",
			fe->dai_link->name, cmd);

		ret = soc_pcm_trigger(substream, cmd);
		if (ret < 0)
			return ret;

		ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
		return ret;
	}

	/* call trigger on the frontend after the backend. */
	ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
	if (ret < 0)
		return ret;

	dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n",
		fe->dai_link->name, cmd);

	ret = soc_pcm_trigger(substream, cmd);

	return ret;
}

2574
static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd)
2575 2576
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
2577 2578
	int stream = substream->stream;
	int ret = 0;
2579 2580 2581 2582 2583 2584
	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];

	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;

	switch (trigger) {
	case SND_SOC_DPCM_TRIGGER_PRE:
2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598
		switch (cmd) {
		case SNDRV_PCM_TRIGGER_START:
		case SNDRV_PCM_TRIGGER_RESUME:
		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
			ret = dpcm_dai_trigger_fe_be(substream, cmd, true);
			break;
		case SNDRV_PCM_TRIGGER_STOP:
		case SNDRV_PCM_TRIGGER_SUSPEND:
		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
			ret = dpcm_dai_trigger_fe_be(substream, cmd, false);
			break;
		default:
			ret = -EINVAL;
			break;
2599 2600 2601
		}
		break;
	case SND_SOC_DPCM_TRIGGER_POST:
2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615
		switch (cmd) {
		case SNDRV_PCM_TRIGGER_START:
		case SNDRV_PCM_TRIGGER_RESUME:
		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
			ret = dpcm_dai_trigger_fe_be(substream, cmd, false);
			break;
		case SNDRV_PCM_TRIGGER_STOP:
		case SNDRV_PCM_TRIGGER_SUSPEND:
		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
			ret = dpcm_dai_trigger_fe_be(substream, cmd, true);
			break;
		default:
			ret = -EINVAL;
			break;
2616 2617
		}
		break;
2618 2619 2620
	case SND_SOC_DPCM_TRIGGER_BESPOKE:
		/* bespoke trigger() - handles both FE and BEs */

2621
		dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd %d\n",
2622 2623 2624 2625
				fe->dai_link->name, cmd);

		ret = soc_pcm_bespoke_trigger(substream, cmd);
		break;
2626
	default:
2627
		dev_err(fe->dev, "ASoC: invalid trigger cmd %d for %s\n", cmd,
2628 2629 2630 2631 2632
				fe->dai_link->name);
		ret = -EINVAL;
		goto out;
	}

2633 2634 2635 2636 2637 2638
	if (ret < 0) {
		dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n",
			cmd, ret);
		goto out;
	}

2639 2640 2641 2642 2643 2644 2645 2646 2647 2648
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_RESUME:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
		break;
	case SNDRV_PCM_TRIGGER_STOP:
	case SNDRV_PCM_TRIGGER_SUSPEND:
		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
		break;
2649 2650 2651
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
		break;
2652 2653 2654 2655 2656 2657 2658
	}

out:
	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
	return ret;
}

2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675
static int dpcm_fe_dai_trigger(struct snd_pcm_substream *substream, int cmd)
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int stream = substream->stream;

	/* if FE's runtime_update is already set, we're in race;
	 * process this trigger later at exit
	 */
	if (fe->dpcm[stream].runtime_update != SND_SOC_DPCM_UPDATE_NO) {
		fe->dpcm[stream].trigger_pending = cmd + 1;
		return 0; /* delayed, assuming it's successful */
	}

	/* we're alone, let's trigger */
	return dpcm_fe_dai_do_trigger(substream, cmd);
}

2676
int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
2677 2678 2679 2680
{
	struct snd_soc_dpcm *dpcm;
	int ret = 0;

2681
	for_each_dpcm_be(fe, stream, dpcm) {
2682 2683 2684 2685 2686 2687 2688 2689 2690 2691

		struct snd_soc_pcm_runtime *be = dpcm->be;
		struct snd_pcm_substream *be_substream =
			snd_soc_dpcm_get_substream(be, stream);

		/* is this op for this BE ? */
		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
			continue;

		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2692
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2693 2694
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) &&
		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2695 2696
			continue;

2697
		dev_dbg(be->dev, "ASoC: prepare BE %s\n",
2698
			be->dai_link->name);
2699 2700 2701

		ret = soc_pcm_prepare(be_substream);
		if (ret < 0) {
2702
			dev_err(be->dev, "ASoC: backend prepare failed %d\n",
2703 2704 2705 2706 2707 2708 2709 2710 2711
				ret);
			break;
		}

		be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
	}
	return ret;
}

2712
static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
2713 2714 2715 2716 2717 2718
{
	struct snd_soc_pcm_runtime *fe = substream->private_data;
	int stream = substream->stream, ret = 0;

	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);

2719
	dev_dbg(fe->dev, "ASoC: prepare FE %s\n", fe->dai_link->name);
2720

2721
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2722 2723 2724

	/* there is no point preparing this FE if there are no BEs */
	if (list_empty(&fe->dpcm[stream].be_clients)) {
2725
		dev_err(fe->dev, "ASoC: no backend DAIs enabled for %s\n",
2726 2727 2728 2729 2730
				fe->dai_link->name);
		ret = -EINVAL;
		goto out;
	}

2731
	ret = dpcm_be_dai_prepare(fe, stream);
2732 2733 2734 2735 2736 2737
	if (ret < 0)
		goto out;

	/* call prepare on the frontend */
	ret = soc_pcm_prepare(substream);
	if (ret < 0) {
2738
		dev_err(fe->dev,"ASoC: prepare FE %s failed\n",
2739 2740 2741 2742 2743 2744 2745 2746 2747
			fe->dai_link->name);
		goto out;
	}

	/* run the stream event for each BE */
	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;

out:
2748
	dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2749 2750 2751 2752 2753
	mutex_unlock(&fe->card->mutex);

	return ret;
}

2754 2755
static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
{
2756 2757 2758
	struct snd_pcm_substream *substream =
		snd_soc_dpcm_get_substream(fe, stream);
	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2759 2760
	int err;

2761
	dev_dbg(fe->dev, "ASoC: runtime %s close on FE %s\n",
2762 2763
			stream ? "capture" : "playback", fe->dai_link->name);

2764 2765
	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
		/* call bespoke trigger - FE takes care of all BE triggers */
2766
		dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd stop\n",
2767 2768 2769 2770
				fe->dai_link->name);

		err = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_STOP);
		if (err < 0)
2771
			dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err);
2772
	} else {
2773
		dev_dbg(fe->dev, "ASoC: trigger FE %s cmd stop\n",
2774 2775 2776 2777
			fe->dai_link->name);

		err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP);
		if (err < 0)
2778
			dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err);
2779
	}
2780 2781 2782

	err = dpcm_be_dai_hw_free(fe, stream);
	if (err < 0)
2783
		dev_err(fe->dev,"ASoC: hw_free FE failed %d\n", err);
2784 2785 2786

	err = dpcm_be_dai_shutdown(fe, stream);
	if (err < 0)
2787
		dev_err(fe->dev,"ASoC: shutdown FE failed %d\n", err);
2788 2789 2790 2791 2792 2793 2794 2795 2796

	/* run the stream event for each BE */
	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);

	return 0;
}

static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream)
{
2797 2798
	struct snd_pcm_substream *substream =
		snd_soc_dpcm_get_substream(fe, stream);
2799
	struct snd_soc_dpcm *dpcm;
2800
	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2801
	int ret;
2802
	unsigned long flags;
2803

2804
	dev_dbg(fe->dev, "ASoC: runtime %s open on FE %s\n",
2805 2806 2807 2808 2809 2810 2811 2812 2813
			stream ? "capture" : "playback", fe->dai_link->name);

	/* Only start the BE if the FE is ready */
	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE)
		return -EINVAL;

	/* startup must always be called for new BEs */
	ret = dpcm_be_dai_startup(fe, stream);
D
Dan Carpenter 已提交
2814
	if (ret < 0)
2815 2816 2817 2818 2819
		goto disconnect;

	/* keep going if FE state is > open */
	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
		return 0;
2820

2821
	ret = dpcm_be_dai_hw_params(fe, stream);
D
Dan Carpenter 已提交
2822
	if (ret < 0)
2823 2824 2825 2826 2827 2828 2829 2830
		goto close;

	/* keep going if FE state is > hw_params */
	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
		return 0;


	ret = dpcm_be_dai_prepare(fe, stream);
D
Dan Carpenter 已提交
2831
	if (ret < 0)
2832 2833 2834 2835 2836 2837 2838 2839 2840 2841
		goto hw_free;

	/* run the stream event for each BE */
	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);

	/* keep going if FE state is > prepare */
	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
		return 0;

2842 2843
	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
		/* call trigger on the frontend - FE takes care of all BE triggers */
2844
		dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd start\n",
2845
				fe->dai_link->name);
2846

2847 2848
		ret = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_START);
		if (ret < 0) {
2849
			dev_err(fe->dev,"ASoC: bespoke trigger FE failed %d\n", ret);
2850 2851 2852
			goto hw_free;
		}
	} else {
2853
		dev_dbg(fe->dev, "ASoC: trigger FE %s cmd start\n",
2854 2855 2856 2857 2858
			fe->dai_link->name);

		ret = dpcm_be_dai_trigger(fe, stream,
					SNDRV_PCM_TRIGGER_START);
		if (ret < 0) {
2859
			dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret);
2860 2861
			goto hw_free;
		}
2862 2863 2864 2865 2866 2867 2868 2869 2870 2871
	}

	return 0;

hw_free:
	dpcm_be_dai_hw_free(fe, stream);
close:
	dpcm_be_dai_shutdown(fe, stream);
disconnect:
	/* disconnect any non started BEs */
2872
	spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2873
	for_each_dpcm_be(fe, stream, dpcm) {
2874 2875 2876 2877
		struct snd_soc_pcm_runtime *be = dpcm->be;
		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
				dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
	}
2878
	spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2879 2880 2881 2882

	return ret;
}

2883
static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
2884
{
2885
	struct snd_soc_dapm_widget_list *list;
2886
	int stream;
2887
	int count, paths;
2888
	int ret;
2889

2890 2891 2892 2893 2894 2895
	if (fe->num_cpus > 1) {
		dev_err(fe->dev,
			"%s doesn't support Multi CPU yet\n", __func__);
		return -EINVAL;
	}

2896 2897
	if (!fe->dai_link->dynamic)
		return 0;
2898

2899 2900 2901
	/* only check active links */
	if (!fe->cpu_dai->active)
		return 0;
2902

2903 2904 2905
	/* DAPM sync will call this to update DSP paths */
	dev_dbg(fe->dev, "ASoC: DPCM %s runtime update for FE %s\n",
		new ? "new" : "old", fe->dai_link->name);
2906

2907
	for_each_pcm_streams(stream) {
2908

2909 2910 2911 2912
		/* skip if FE doesn't have playback/capture capability */
		if (!snd_soc_dai_stream_valid(fe->cpu_dai,   stream) ||
		    !snd_soc_dai_stream_valid(fe->codec_dai, stream))
			continue;
2913

2914 2915 2916 2917
		/* skip if FE isn't currently playing/capturing */
		if (!fe->cpu_dai->stream_active[stream] ||
		    !fe->codec_dai->stream_active[stream])
			continue;
2918

2919 2920 2921 2922 2923 2924 2925 2926
		paths = dpcm_path_get(fe, stream, &list);
		if (paths < 0) {
			dev_warn(fe->dev, "ASoC: %s no valid %s path\n",
				 fe->dai_link->name,
				 stream == SNDRV_PCM_STREAM_PLAYBACK ?
				 "playback" : "capture");
			return paths;
		}
2927

2928 2929 2930
		/* update any playback/capture paths */
		count = dpcm_process_paths(fe, stream, &list, new);
		if (count) {
2931
			dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE);
2932
			if (new)
2933
				ret = dpcm_run_update_startup(fe, stream);
2934
			else
2935 2936 2937 2938
				ret = dpcm_run_update_shutdown(fe, stream);
			if (ret < 0)
				dev_err(fe->dev, "ASoC: failed to shutdown some BEs\n");
			dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2939

2940 2941 2942
			dpcm_clear_pending_state(fe, stream);
			dpcm_be_disconnect(fe, stream);
		}
2943

2944
		dpcm_path_put(&list);
2945 2946 2947 2948
	}

	return 0;
}
2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959

/* Called by DAPM mixer/mux changes to update audio routing between PCMs and
 * any DAI links.
 */
int soc_dpcm_runtime_update(struct snd_soc_card *card)
{
	struct snd_soc_pcm_runtime *fe;
	int ret = 0;

	mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
	/* shutdown all old paths first */
2960
	for_each_card_rtds(card, fe) {
2961 2962 2963 2964 2965 2966
		ret = soc_dpcm_fe_runtime_update(fe, 0);
		if (ret)
			goto out;
	}

	/* bring new paths up */
2967
	for_each_card_rtds(card, fe) {
2968 2969 2970 2971 2972 2973 2974 2975 2976
		ret = soc_dpcm_fe_runtime_update(fe, 1);
		if (ret)
			goto out;
	}

out:
	mutex_unlock(&card->mutex);
	return ret;
}
2977

2978
static void dpcm_fe_dai_cleanup(struct snd_pcm_substream *fe_substream)
2979 2980 2981
{
	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
	struct snd_soc_dpcm *dpcm;
2982
	int stream = fe_substream->stream;
2983 2984 2985 2986 2987 2988 2989 2990

	/* mark FE's links ready to prune */
	for_each_dpcm_be(fe, stream, dpcm)
		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;

	dpcm_be_disconnect(fe, stream);

	fe->dpcm[stream].runtime = NULL;
2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002
}

static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
{
	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
	int ret;

	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
	ret = dpcm_fe_dai_shutdown(fe_substream);

	dpcm_fe_dai_cleanup(fe_substream);

3003 3004 3005 3006
	mutex_unlock(&fe->card->mutex);
	return ret;
}

3007
static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
3008 3009 3010 3011 3012 3013 3014 3015 3016
{
	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
	struct snd_soc_dapm_widget_list *list;
	int ret;
	int stream = fe_substream->stream;

	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
	fe->dpcm[stream].runtime = fe_substream->runtime;

3017 3018
	ret = dpcm_path_get(fe, stream, &list);
	if (ret < 0) {
3019
		goto open_end;
3020
	} else if (ret == 0) {
3021
		dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
3022 3023 3024 3025 3026 3027 3028
			fe->dai_link->name, stream ? "capture" : "playback");
	}

	/* calculate valid and active FE <-> BE dpcms */
	dpcm_process_paths(fe, stream, &list, 1);

	ret = dpcm_fe_dai_startup(fe_substream);
3029 3030
	if (ret < 0)
		dpcm_fe_dai_cleanup(fe_substream);
3031 3032 3033

	dpcm_clear_pending_state(fe, stream);
	dpcm_path_put(&list);
3034
open_end:
3035 3036 3037 3038
	mutex_unlock(&fe->card->mutex);
	return ret;
}

3039 3040 3041
/* create a new pcm */
int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
{
3042
	struct snd_soc_dai *codec_dai;
3043
	struct snd_soc_dai *cpu_dai;
3044
	struct snd_soc_component *component;
3045 3046 3047
	struct snd_pcm *pcm;
	char new_name[64];
	int ret = 0, playback = 0, capture = 0;
3048
	int i;
3049

3050
	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) {
3051 3052
		playback = rtd->dai_link->dpcm_playback;
		capture = rtd->dai_link->dpcm_capture;
3053
	} else {
3054
		/* Adapt stream for codec2codec links */
3055 3056 3057 3058
		int cpu_capture = rtd->dai_link->params ?
			SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE;
		int cpu_playback = rtd->dai_link->params ?
			SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
3059

3060
		for_each_rtd_codec_dai(rtd, i, codec_dai) {
3061 3062 3063 3064 3065 3066 3067 3068 3069 3070
			if (rtd->num_cpus == 1) {
				cpu_dai = rtd->cpu_dais[0];
			} else if (rtd->num_cpus == rtd->num_codecs) {
				cpu_dai = rtd->cpu_dais[i];
			} else {
				dev_err(rtd->card->dev,
					"N cpus to M codecs link is not supported yet\n");
				return -EINVAL;
			}

3071
			if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) &&
3072
			    snd_soc_dai_stream_valid(cpu_dai,   cpu_playback))
3073
				playback = 1;
3074
			if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) &&
3075
			    snd_soc_dai_stream_valid(cpu_dai,   cpu_capture))
3076 3077
				capture = 1;
		}
3078 3079
	}

3080 3081 3082 3083 3084 3085 3086 3087 3088 3089
	if (rtd->dai_link->playback_only) {
		playback = 1;
		capture = 0;
	}

	if (rtd->dai_link->capture_only) {
		playback = 0;
		capture = 1;
	}

3090
	/* create the PCM */
3091 3092 3093 3094 3095 3096 3097
	if (rtd->dai_link->params) {
		snprintf(new_name, sizeof(new_name), "codec2codec(%s)",
			 rtd->dai_link->stream_name);

		ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
					   playback, capture, &pcm);
	} else if (rtd->dai_link->no_pcm) {
3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108
		snprintf(new_name, sizeof(new_name), "(%s)",
			rtd->dai_link->stream_name);

		ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
				playback, capture, &pcm);
	} else {
		if (rtd->dai_link->dynamic)
			snprintf(new_name, sizeof(new_name), "%s (*)",
				rtd->dai_link->stream_name);
		else
			snprintf(new_name, sizeof(new_name), "%s %s-%d",
3109 3110 3111
				rtd->dai_link->stream_name,
				(rtd->num_codecs > 1) ?
				"multicodec" : rtd->codec_dai->name, num);
3112 3113 3114 3115

		ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback,
			capture, &pcm);
	}
3116
	if (ret < 0) {
3117
		dev_err(rtd->card->dev, "ASoC: can't create pcm for %s\n",
3118
			rtd->dai_link->name);
3119 3120
		return ret;
	}
3121
	dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name);
3122 3123

	/* DAPM dai link stream work */
3124
	if (rtd->dai_link->params)
3125
		rtd->close_delayed_work_func = codec2codec_close_delayed_work;
3126
	else
3127
		rtd->close_delayed_work_func = snd_soc_close_delayed_work;
3128

3129
	pcm->nonatomic = rtd->dai_link->nonatomic;
3130 3131
	rtd->pcm = pcm;
	pcm->private_data = rtd;
3132

3133
	if (rtd->dai_link->no_pcm || rtd->dai_link->params) {
3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159
		if (playback)
			pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
		if (capture)
			pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
		goto out;
	}

	/* ASoC PCM operations */
	if (rtd->dai_link->dynamic) {
		rtd->ops.open		= dpcm_fe_dai_open;
		rtd->ops.hw_params	= dpcm_fe_dai_hw_params;
		rtd->ops.prepare	= dpcm_fe_dai_prepare;
		rtd->ops.trigger	= dpcm_fe_dai_trigger;
		rtd->ops.hw_free	= dpcm_fe_dai_hw_free;
		rtd->ops.close		= dpcm_fe_dai_close;
		rtd->ops.pointer	= soc_pcm_pointer;
	} else {
		rtd->ops.open		= soc_pcm_open;
		rtd->ops.hw_params	= soc_pcm_hw_params;
		rtd->ops.prepare	= soc_pcm_prepare;
		rtd->ops.trigger	= soc_pcm_trigger;
		rtd->ops.hw_free	= soc_pcm_hw_free;
		rtd->ops.close		= soc_pcm_close;
		rtd->ops.pointer	= soc_pcm_pointer;
	}

3160
	for_each_rtd_components(rtd, i, component) {
3161
		const struct snd_soc_component_driver *drv = component->driver;
3162

T
Takashi Iwai 已提交
3163 3164
		if (drv->ioctl)
			rtd->ops.ioctl		= snd_soc_pcm_component_ioctl;
3165 3166
		if (drv->sync_stop)
			rtd->ops.sync_stop	= snd_soc_pcm_component_sync_stop;
3167
		if (drv->copy_user)
3168
			rtd->ops.copy_user	= snd_soc_pcm_component_copy_user;
3169
		if (drv->page)
3170
			rtd->ops.page		= snd_soc_pcm_component_page;
3171
		if (drv->mmap)
3172
			rtd->ops.mmap		= snd_soc_pcm_component_mmap;
3173 3174 3175
	}

	if (playback)
3176
		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops);
3177 3178

	if (capture)
3179
		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops);
3180

3181
	ret = snd_soc_pcm_component_new(rtd);
3182 3183 3184
	if (ret < 0) {
		dev_err(rtd->dev, "ASoC: pcm constructor failed: %d\n", ret);
		return ret;
3185
	}
J
Johan Hovold 已提交
3186

3187
	pcm->no_device_suspend = true;
3188
out:
3189 3190
	dev_info(rtd->card->dev, "%s <-> %s mapping ok\n",
		 (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name,
3191
		 (rtd->num_cpus > 1) ? "multicpu" : rtd->cpu_dai->name);
3192 3193
	return ret;
}
3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223

/* is the current PCM operation for this FE ? */
int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream)
{
	if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
		return 1;
	return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_dpcm_fe_can_update);

/* is the current PCM operation for this BE ? */
int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
		struct snd_soc_pcm_runtime *be, int stream)
{
	if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
	   ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
		  be->dpcm[stream].runtime_update))
		return 1;
	return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_can_update);

/* get the substream for this BE */
struct snd_pcm_substream *
	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
{
	return be->pcm->streams[stream].substream;
}
EXPORT_SYMBOL_GPL(snd_soc_dpcm_get_substream);

3224 3225 3226 3227 3228
static int snd_soc_dpcm_check_state(struct snd_soc_pcm_runtime *fe,
				    struct snd_soc_pcm_runtime *be,
				    int stream,
				    const enum snd_soc_dpcm_state *states,
				    int num_states)
3229 3230 3231
{
	struct snd_soc_dpcm *dpcm;
	int state;
3232 3233
	int ret = 1;
	unsigned long flags;
3234
	int i;
3235

3236
	spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3237
	for_each_dpcm_fe(be, stream, dpcm) {
3238 3239 3240 3241 3242

		if (dpcm->fe == fe)
			continue;

		state = dpcm->fe->dpcm[stream].state;
3243 3244 3245 3246 3247
		for (i = 0; i < num_states; i++) {
			if (state == states[i]) {
				ret = 0;
				break;
			}
3248
		}
3249
	}
3250
	spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3251

3252
	/* it's safe to do this BE DAI */
3253
	return ret;
3254
}
3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270

/*
 * We can only hw_free, stop, pause or suspend a BE DAI if any of it's FE
 * are not running, paused or suspended for the specified stream direction.
 */
int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
		struct snd_soc_pcm_runtime *be, int stream)
{
	const enum snd_soc_dpcm_state state[] = {
		SND_SOC_DPCM_STATE_START,
		SND_SOC_DPCM_STATE_PAUSED,
		SND_SOC_DPCM_STATE_SUSPEND,
	};

	return snd_soc_dpcm_check_state(fe, be, stream, state, ARRAY_SIZE(state));
}
3271 3272 3273 3274 3275 3276 3277 3278 3279
EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);

/*
 * We can only change hw params a BE DAI if any of it's FE are not prepared,
 * running, paused or suspended for the specified stream direction.
 */
int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
		struct snd_soc_pcm_runtime *be, int stream)
{
3280 3281 3282 3283 3284 3285
	const enum snd_soc_dpcm_state state[] = {
		SND_SOC_DPCM_STATE_START,
		SND_SOC_DPCM_STATE_PAUSED,
		SND_SOC_DPCM_STATE_SUSPEND,
		SND_SOC_DPCM_STATE_PREPARE,
	};
3286

3287
	return snd_soc_dpcm_check_state(fe, be, stream, state, ARRAY_SIZE(state));
3288 3289
}
EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);