Linux Audio

Check our new training course

Loading...
   1/*
   2 * soc-pcm.c  --  ALSA SoC PCM
   3 *
   4 * Copyright 2005 Wolfson Microelectronics PLC.
   5 * Copyright 2005 Openedhand Ltd.
   6 * Copyright (C) 2010 Slimlogic Ltd.
   7 * Copyright (C) 2010 Texas Instruments Inc.
   8 *
   9 * Authors: Liam Girdwood <lrg@ti.com>
  10 *          Mark Brown <broonie@opensource.wolfsonmicro.com>       
  11 *
  12 *  This program is free software; you can redistribute  it and/or modify it
  13 *  under  the terms of  the GNU General  Public License as published by the
  14 *  Free Software Foundation;  either version 2 of the  License, or (at your
  15 *  option) any later version.
  16 *
  17 */
  18
  19#include <linux/kernel.h>
  20#include <linux/init.h>
  21#include <linux/delay.h>
  22#include <linux/pm_runtime.h>
  23#include <linux/slab.h>
  24#include <linux/workqueue.h>
  25#include <linux/export.h>
  26#include <linux/debugfs.h>
  27#include <sound/core.h>
  28#include <sound/pcm.h>
  29#include <sound/pcm_params.h>
  30#include <sound/soc.h>
  31#include <sound/soc-dpcm.h>
  32#include <sound/initval.h>
  33
  34#define DPCM_MAX_BE_USERS	8
  35
  36/* DPCM stream event, send event to FE and all active BEs. */
  37static int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
  38	int event)
  39{
  40	struct snd_soc_dpcm *dpcm;
  41
  42	list_for_each_entry(dpcm, &fe->dpcm[dir].be_clients, list_be) {
  43
  44		struct snd_soc_pcm_runtime *be = dpcm->be;
  45
  46		dev_dbg(be->dev, "pm: BE %s event %d dir %d\n",
  47				be->dai_link->name, event, dir);
  48
  49		snd_soc_dapm_stream_event(be, dir, event);
  50	}
  51
  52	snd_soc_dapm_stream_event(fe, dir, event);
  53
  54	return 0;
  55}
  56
  57static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream,
  58					struct snd_soc_dai *soc_dai)
  59{
  60	struct snd_soc_pcm_runtime *rtd = substream->private_data;
  61	int ret;
  62
  63	if (!soc_dai->driver->symmetric_rates &&
  64	    !rtd->dai_link->symmetric_rates)
  65		return 0;
  66
  67	/* This can happen if multiple streams are starting simultaneously -
  68	 * the second can need to get its constraints before the first has
  69	 * picked a rate.  Complain and allow the application to carry on.
  70	 */
  71	if (!soc_dai->rate) {
  72		dev_warn(soc_dai->dev,
  73			 "Not enforcing symmetric_rates due to race\n");
  74		return 0;
  75	}
  76
  77	dev_dbg(soc_dai->dev, "Symmetry forces %dHz rate\n", soc_dai->rate);
  78
  79	ret = snd_pcm_hw_constraint_minmax(substream->runtime,
  80					   SNDRV_PCM_HW_PARAM_RATE,
  81					   soc_dai->rate, soc_dai->rate);
  82	if (ret < 0) {
  83		dev_err(soc_dai->dev,
  84			"Unable to apply rate symmetry constraint: %d\n", ret);
  85		return ret;
  86	}
  87
  88	return 0;
  89}
  90
  91/*
  92 * List of sample sizes that might go over the bus for parameter
  93 * application.  There ought to be a wildcard sample size for things
  94 * like the DAC/ADC resolution to use but there isn't right now.
  95 */
  96static int sample_sizes[] = {
  97	24, 32,
  98};
  99
 100static void soc_pcm_apply_msb(struct snd_pcm_substream *substream,
 101			      struct snd_soc_dai *dai)
 102{
 103	int ret, i, bits;
 104
 105	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 106		bits = dai->driver->playback.sig_bits;
 107	else
 108		bits = dai->driver->capture.sig_bits;
 109
 110	if (!bits)
 111		return;
 112
 113	for (i = 0; i < ARRAY_SIZE(sample_sizes); i++) {
 114		if (bits >= sample_sizes[i])
 115			continue;
 116
 117		ret = snd_pcm_hw_constraint_msbits(substream->runtime, 0,
 118						   sample_sizes[i], bits);
 119		if (ret != 0)
 120			dev_warn(dai->dev,
 121				 "Failed to set MSB %d/%d: %d\n",
 122				 bits, sample_sizes[i], ret);
 123	}
 124}
 125
 126/*
 127 * Called by ALSA when a PCM substream is opened, the runtime->hw record is
 128 * then initialized and any private data can be allocated. This also calls
 129 * startup for the cpu DAI, platform, machine and codec DAI.
 130 */
 131static int soc_pcm_open(struct snd_pcm_substream *substream)
 132{
 133	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 134	struct snd_pcm_runtime *runtime = substream->runtime;
 135	struct snd_soc_platform *platform = rtd->platform;
 136	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 137	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 138	struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
 139	struct snd_soc_dai_driver *codec_dai_drv = codec_dai->driver;
 140	int ret = 0;
 141
 142	pm_runtime_get_sync(cpu_dai->dev);
 143	pm_runtime_get_sync(codec_dai->dev);
 144	pm_runtime_get_sync(platform->dev);
 145
 146	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 147
 148	/* startup the audio subsystem */
 149	if (cpu_dai->driver->ops->startup) {
 150		ret = cpu_dai->driver->ops->startup(substream, cpu_dai);
 151		if (ret < 0) {
 152			dev_err(cpu_dai->dev, "can't open interface %s: %d\n",
 153				cpu_dai->name, ret);
 154			goto out;
 155		}
 156	}
 157
 158	if (platform->driver->ops && platform->driver->ops->open) {
 159		ret = platform->driver->ops->open(substream);
 160		if (ret < 0) {
 161			dev_err(platform->dev, "can't open platform %s: %d\n",
 162				platform->name, ret);
 163			goto platform_err;
 164		}
 165	}
 166
 167	if (codec_dai->driver->ops->startup) {
 168		ret = codec_dai->driver->ops->startup(substream, codec_dai);
 169		if (ret < 0) {
 170			dev_err(codec_dai->dev, "can't open codec %s: %d\n",
 171				codec_dai->name, ret);
 172			goto codec_dai_err;
 173		}
 174	}
 175
 176	if (rtd->dai_link->ops && rtd->dai_link->ops->startup) {
 177		ret = rtd->dai_link->ops->startup(substream);
 178		if (ret < 0) {
 179			pr_err("asoc: %s startup failed: %d\n",
 180			       rtd->dai_link->name, ret);
 181			goto machine_err;
 182		}
 183	}
 184
 185	/* Dynamic PCM DAI links compat checks use dynamic capabilities */
 186	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm)
 187		goto dynamic;
 188
 189	/* Check that the codec and cpu DAIs are compatible */
 190	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 191		runtime->hw.rate_min =
 192			max(codec_dai_drv->playback.rate_min,
 193			    cpu_dai_drv->playback.rate_min);
 194		runtime->hw.rate_max =
 195			min(codec_dai_drv->playback.rate_max,
 196			    cpu_dai_drv->playback.rate_max);
 197		runtime->hw.channels_min =
 198			max(codec_dai_drv->playback.channels_min,
 199				cpu_dai_drv->playback.channels_min);
 200		runtime->hw.channels_max =
 201			min(codec_dai_drv->playback.channels_max,
 202				cpu_dai_drv->playback.channels_max);
 203		runtime->hw.formats =
 204			codec_dai_drv->playback.formats & cpu_dai_drv->playback.formats;
 205		runtime->hw.rates =
 206			codec_dai_drv->playback.rates & cpu_dai_drv->playback.rates;
 207		if (codec_dai_drv->playback.rates
 208			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
 209			runtime->hw.rates |= cpu_dai_drv->playback.rates;
 210		if (cpu_dai_drv->playback.rates
 211			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
 212			runtime->hw.rates |= codec_dai_drv->playback.rates;
 213	} else {
 214		runtime->hw.rate_min =
 215			max(codec_dai_drv->capture.rate_min,
 216			    cpu_dai_drv->capture.rate_min);
 217		runtime->hw.rate_max =
 218			min(codec_dai_drv->capture.rate_max,
 219			    cpu_dai_drv->capture.rate_max);
 220		runtime->hw.channels_min =
 221			max(codec_dai_drv->capture.channels_min,
 222				cpu_dai_drv->capture.channels_min);
 223		runtime->hw.channels_max =
 224			min(codec_dai_drv->capture.channels_max,
 225				cpu_dai_drv->capture.channels_max);
 226		runtime->hw.formats =
 227			codec_dai_drv->capture.formats & cpu_dai_drv->capture.formats;
 228		runtime->hw.rates =
 229			codec_dai_drv->capture.rates & cpu_dai_drv->capture.rates;
 230		if (codec_dai_drv->capture.rates
 231			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
 232			runtime->hw.rates |= cpu_dai_drv->capture.rates;
 233		if (cpu_dai_drv->capture.rates
 234			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
 235			runtime->hw.rates |= codec_dai_drv->capture.rates;
 236	}
 237
 238	ret = -EINVAL;
 239	snd_pcm_limit_hw_rates(runtime);
 240	if (!runtime->hw.rates) {
 241		printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
 242			codec_dai->name, cpu_dai->name);
 243		goto config_err;
 244	}
 245	if (!runtime->hw.formats) {
 246		printk(KERN_ERR "asoc: %s <-> %s No matching formats\n",
 247			codec_dai->name, cpu_dai->name);
 248		goto config_err;
 249	}
 250	if (!runtime->hw.channels_min || !runtime->hw.channels_max ||
 251	    runtime->hw.channels_min > runtime->hw.channels_max) {
 252		printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
 253				codec_dai->name, cpu_dai->name);
 254		goto config_err;
 255	}
 256
 257	soc_pcm_apply_msb(substream, codec_dai);
 258	soc_pcm_apply_msb(substream, cpu_dai);
 259
 260	/* Symmetry only applies if we've already got an active stream. */
 261	if (cpu_dai->active) {
 262		ret = soc_pcm_apply_symmetry(substream, cpu_dai);
 263		if (ret != 0)
 264			goto config_err;
 265	}
 266
 267	if (codec_dai->active) {
 268		ret = soc_pcm_apply_symmetry(substream, codec_dai);
 269		if (ret != 0)
 270			goto config_err;
 271	}
 272
 273	pr_debug("asoc: %s <-> %s info:\n",
 274			codec_dai->name, cpu_dai->name);
 275	pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates);
 276	pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
 277		 runtime->hw.channels_max);
 278	pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
 279		 runtime->hw.rate_max);
 280
 281dynamic:
 282	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 283		cpu_dai->playback_active++;
 284		codec_dai->playback_active++;
 285	} else {
 286		cpu_dai->capture_active++;
 287		codec_dai->capture_active++;
 288	}
 289	cpu_dai->active++;
 290	codec_dai->active++;
 291	rtd->codec->active++;
 292	mutex_unlock(&rtd->pcm_mutex);
 293	return 0;
 294
 295config_err:
 296	if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
 297		rtd->dai_link->ops->shutdown(substream);
 298
 299machine_err:
 300	if (codec_dai->driver->ops->shutdown)
 301		codec_dai->driver->ops->shutdown(substream, codec_dai);
 302
 303codec_dai_err:
 304	if (platform->driver->ops && platform->driver->ops->close)
 305		platform->driver->ops->close(substream);
 306
 307platform_err:
 308	if (cpu_dai->driver->ops->shutdown)
 309		cpu_dai->driver->ops->shutdown(substream, cpu_dai);
 310out:
 311	mutex_unlock(&rtd->pcm_mutex);
 312
 313	pm_runtime_put(platform->dev);
 314	pm_runtime_put(codec_dai->dev);
 315	pm_runtime_put(cpu_dai->dev);
 316
 317	return ret;
 318}
 319
 320/*
 321 * Power down the audio subsystem pmdown_time msecs after close is called.
 322 * This is to ensure there are no pops or clicks in between any music tracks
 323 * due to DAPM power cycling.
 324 */
 325static void close_delayed_work(struct work_struct *work)
 326{
 327	struct snd_soc_pcm_runtime *rtd =
 328			container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
 329	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 330
 331	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 332
 333	pr_debug("pop wq checking: %s status: %s waiting: %s\n",
 334		 codec_dai->driver->playback.stream_name,
 335		 codec_dai->playback_active ? "active" : "inactive",
 336		 codec_dai->pop_wait ? "yes" : "no");
 337
 338	/* are we waiting on this codec DAI stream */
 339	if (codec_dai->pop_wait == 1) {
 340		codec_dai->pop_wait = 0;
 341		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
 342					  SND_SOC_DAPM_STREAM_STOP);
 343	}
 344
 345	mutex_unlock(&rtd->pcm_mutex);
 346}
 347
 348/*
 349 * Called by ALSA when a PCM substream is closed. Private data can be
 350 * freed here. The cpu DAI, codec DAI, machine and platform are also
 351 * shutdown.
 352 */
 353static int soc_pcm_close(struct snd_pcm_substream *substream)
 354{
 355	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 356	struct snd_soc_platform *platform = rtd->platform;
 357	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 358	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 359	struct snd_soc_codec *codec = rtd->codec;
 360
 361	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 362
 363	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 364		cpu_dai->playback_active--;
 365		codec_dai->playback_active--;
 366	} else {
 367		cpu_dai->capture_active--;
 368		codec_dai->capture_active--;
 369	}
 370
 371	cpu_dai->active--;
 372	codec_dai->active--;
 373	codec->active--;
 374
 375	/* clear the corresponding DAIs rate when inactive */
 376	if (!cpu_dai->active)
 377		cpu_dai->rate = 0;
 378
 379	if (!codec_dai->active)
 380		codec_dai->rate = 0;
 381
 382	/* Muting the DAC suppresses artifacts caused during digital
 383	 * shutdown, for example from stopping clocks.
 384	 */
 385	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 386		snd_soc_dai_digital_mute(codec_dai, 1);
 387
 388	if (cpu_dai->driver->ops->shutdown)
 389		cpu_dai->driver->ops->shutdown(substream, cpu_dai);
 390
 391	if (codec_dai->driver->ops->shutdown)
 392		codec_dai->driver->ops->shutdown(substream, codec_dai);
 393
 394	if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
 395		rtd->dai_link->ops->shutdown(substream);
 396
 397	if (platform->driver->ops && platform->driver->ops->close)
 398		platform->driver->ops->close(substream);
 399	cpu_dai->runtime = NULL;
 400
 401	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 402		if (!rtd->pmdown_time || codec->ignore_pmdown_time ||
 403		    rtd->dai_link->ignore_pmdown_time) {
 404			/* powered down playback stream now */
 405			snd_soc_dapm_stream_event(rtd,
 406						  SNDRV_PCM_STREAM_PLAYBACK,
 407						  SND_SOC_DAPM_STREAM_STOP);
 408		} else {
 409			/* start delayed pop wq here for playback streams */
 410			codec_dai->pop_wait = 1;
 411			schedule_delayed_work(&rtd->delayed_work,
 412				msecs_to_jiffies(rtd->pmdown_time));
 413		}
 414	} else {
 415		/* capture streams can be powered down now */
 416		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
 417					  SND_SOC_DAPM_STREAM_STOP);
 418	}
 419
 420	mutex_unlock(&rtd->pcm_mutex);
 421
 422	pm_runtime_put(platform->dev);
 423	pm_runtime_put(codec_dai->dev);
 424	pm_runtime_put(cpu_dai->dev);
 425
 426	return 0;
 427}
 428
 429/*
 430 * Called by ALSA when the PCM substream is prepared, can set format, sample
 431 * rate, etc.  This function is non atomic and can be called multiple times,
 432 * it can refer to the runtime info.
 433 */
 434static int soc_pcm_prepare(struct snd_pcm_substream *substream)
 435{
 436	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 437	struct snd_soc_platform *platform = rtd->platform;
 438	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 439	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 440	int ret = 0;
 441
 442	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 443
 444	if (rtd->dai_link->ops && rtd->dai_link->ops->prepare) {
 445		ret = rtd->dai_link->ops->prepare(substream);
 446		if (ret < 0) {
 447			pr_err("asoc: machine prepare error: %d\n", ret);
 448			goto out;
 449		}
 450	}
 451
 452	if (platform->driver->ops && platform->driver->ops->prepare) {
 453		ret = platform->driver->ops->prepare(substream);
 454		if (ret < 0) {
 455			dev_err(platform->dev, "platform prepare error: %d\n",
 456				ret);
 457			goto out;
 458		}
 459	}
 460
 461	if (codec_dai->driver->ops->prepare) {
 462		ret = codec_dai->driver->ops->prepare(substream, codec_dai);
 463		if (ret < 0) {
 464			dev_err(codec_dai->dev, "DAI prepare error: %d\n",
 465				ret);
 466			goto out;
 467		}
 468	}
 469
 470	if (cpu_dai->driver->ops->prepare) {
 471		ret = cpu_dai->driver->ops->prepare(substream, cpu_dai);
 472		if (ret < 0) {
 473			dev_err(cpu_dai->dev, "DAI prepare error: %d\n",
 474				ret);
 475			goto out;
 476		}
 477	}
 478
 479	/* cancel any delayed stream shutdown that is pending */
 480	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
 481	    codec_dai->pop_wait) {
 482		codec_dai->pop_wait = 0;
 483		cancel_delayed_work(&rtd->delayed_work);
 484	}
 485
 486	snd_soc_dapm_stream_event(rtd, substream->stream,
 487			SND_SOC_DAPM_STREAM_START);
 488
 489	snd_soc_dai_digital_mute(codec_dai, 0);
 490
 491out:
 492	mutex_unlock(&rtd->pcm_mutex);
 493	return ret;
 494}
 495
 496/*
 497 * Called by ALSA when the hardware params are set by application. This
 498 * function can also be called multiple times and can allocate buffers
 499 * (using snd_pcm_lib_* ). It's non-atomic.
 500 */
 501static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
 502				struct snd_pcm_hw_params *params)
 503{
 504	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 505	struct snd_soc_platform *platform = rtd->platform;
 506	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 507	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 508	int ret = 0;
 509
 510	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 511
 512	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_params) {
 513		ret = rtd->dai_link->ops->hw_params(substream, params);
 514		if (ret < 0) {
 515			pr_err("asoc: machine hw_params failed: %d\n", ret);
 516			goto out;
 517		}
 518	}
 519
 520	if (codec_dai->driver->ops->hw_params) {
 521		ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai);
 522		if (ret < 0) {
 523			dev_err(codec_dai->dev, "can't set %s hw params: %d\n",
 524				codec_dai->name, ret);
 525			goto codec_err;
 526		}
 527	}
 528
 529	if (cpu_dai->driver->ops->hw_params) {
 530		ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai);
 531		if (ret < 0) {
 532			dev_err(cpu_dai->dev, "%s hw params failed: %d\n",
 533				cpu_dai->name, ret);
 534			goto interface_err;
 535		}
 536	}
 537
 538	if (platform->driver->ops && platform->driver->ops->hw_params) {
 539		ret = platform->driver->ops->hw_params(substream, params);
 540		if (ret < 0) {
 541			dev_err(platform->dev, "%s hw params failed: %d\n",
 542			       platform->name, ret);
 543			goto platform_err;
 544		}
 545	}
 546
 547	/* store the rate for each DAIs */
 548	cpu_dai->rate = params_rate(params);
 549	codec_dai->rate = params_rate(params);
 550
 551out:
 552	mutex_unlock(&rtd->pcm_mutex);
 553	return ret;
 554
 555platform_err:
 556	if (cpu_dai->driver->ops->hw_free)
 557		cpu_dai->driver->ops->hw_free(substream, cpu_dai);
 558
 559interface_err:
 560	if (codec_dai->driver->ops->hw_free)
 561		codec_dai->driver->ops->hw_free(substream, codec_dai);
 562
 563codec_err:
 564	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
 565		rtd->dai_link->ops->hw_free(substream);
 566
 567	mutex_unlock(&rtd->pcm_mutex);
 568	return ret;
 569}
 570
 571/*
 572 * Frees resources allocated by hw_params, can be called multiple times
 573 */
 574static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
 575{
 576	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 577	struct snd_soc_platform *platform = rtd->platform;
 578	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 579	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 580	struct snd_soc_codec *codec = rtd->codec;
 581
 582	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 583
 584	/* apply codec digital mute */
 585	if (!codec->active)
 586		snd_soc_dai_digital_mute(codec_dai, 1);
 587
 588	/* free any machine hw params */
 589	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
 590		rtd->dai_link->ops->hw_free(substream);
 591
 592	/* free any DMA resources */
 593	if (platform->driver->ops && platform->driver->ops->hw_free)
 594		platform->driver->ops->hw_free(substream);
 595
 596	/* now free hw params for the DAIs  */
 597	if (codec_dai->driver->ops->hw_free)
 598		codec_dai->driver->ops->hw_free(substream, codec_dai);
 599
 600	if (cpu_dai->driver->ops->hw_free)
 601		cpu_dai->driver->ops->hw_free(substream, cpu_dai);
 602
 603	mutex_unlock(&rtd->pcm_mutex);
 604	return 0;
 605}
 606
 607static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
 608{
 609	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 610	struct snd_soc_platform *platform = rtd->platform;
 611	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 612	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 613	int ret;
 614
 615	if (codec_dai->driver->ops->trigger) {
 616		ret = codec_dai->driver->ops->trigger(substream, cmd, codec_dai);
 617		if (ret < 0)
 618			return ret;
 619	}
 620
 621	if (platform->driver->ops && platform->driver->ops->trigger) {
 622		ret = platform->driver->ops->trigger(substream, cmd);
 623		if (ret < 0)
 624			return ret;
 625	}
 626
 627	if (cpu_dai->driver->ops->trigger) {
 628		ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
 629		if (ret < 0)
 630			return ret;
 631	}
 632	return 0;
 633}
 634
 635static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
 636				   int cmd)
 637{
 638	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 639	struct snd_soc_platform *platform = rtd->platform;
 640	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 641	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 642	int ret;
 643
 644	if (codec_dai->driver->ops->bespoke_trigger) {
 645		ret = codec_dai->driver->ops->bespoke_trigger(substream, cmd, codec_dai);
 646		if (ret < 0)
 647			return ret;
 648	}
 649
 650	if (platform->driver->bespoke_trigger) {
 651		ret = platform->driver->bespoke_trigger(substream, cmd);
 652		if (ret < 0)
 653			return ret;
 654	}
 655
 656	if (cpu_dai->driver->ops->bespoke_trigger) {
 657		ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai);
 658		if (ret < 0)
 659			return ret;
 660	}
 661	return 0;
 662}
 663/*
 664 * soc level wrapper for pointer callback
 665 * If cpu_dai, codec_dai, platform driver has the delay callback, than
 666 * the runtime->delay will be updated accordingly.
 667 */
 668static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
 669{
 670	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 671	struct snd_soc_platform *platform = rtd->platform;
 672	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 673	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 674	struct snd_pcm_runtime *runtime = substream->runtime;
 675	snd_pcm_uframes_t offset = 0;
 676	snd_pcm_sframes_t delay = 0;
 677
 678	if (platform->driver->ops && platform->driver->ops->pointer)
 679		offset = platform->driver->ops->pointer(substream);
 680
 681	if (cpu_dai->driver->ops->delay)
 682		delay += cpu_dai->driver->ops->delay(substream, cpu_dai);
 683
 684	if (codec_dai->driver->ops->delay)
 685		delay += codec_dai->driver->ops->delay(substream, codec_dai);
 686
 687	if (platform->driver->delay)
 688		delay += platform->driver->delay(substream, codec_dai);
 689
 690	runtime->delay = delay;
 691
 692	return offset;
 693}
 694
 695/* connect a FE and BE */
 696static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
 697		struct snd_soc_pcm_runtime *be, int stream)
 698{
 699	struct snd_soc_dpcm *dpcm;
 700
 701	/* only add new dpcms */
 702	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
 703		if (dpcm->be == be && dpcm->fe == fe)
 704			return 0;
 705	}
 706
 707	dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
 708	if (!dpcm)
 709		return -ENOMEM;
 710
 711	dpcm->be = be;
 712	dpcm->fe = fe;
 713	be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
 714	dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
 715	list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
 716	list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
 717
 718	dev_dbg(fe->dev, "  connected new DPCM %s path %s %s %s\n",
 719			stream ? "capture" : "playback",  fe->dai_link->name,
 720			stream ? "<-" : "->", be->dai_link->name);
 721
 722#ifdef CONFIG_DEBUG_FS
 723	dpcm->debugfs_state = debugfs_create_u32(be->dai_link->name, 0644,
 724			fe->debugfs_dpcm_root, &dpcm->state);
 725#endif
 726	return 1;
 727}
 728
 729/* reparent a BE onto another FE */
 730static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe,
 731			struct snd_soc_pcm_runtime *be, int stream)
 732{
 733	struct snd_soc_dpcm *dpcm;
 734	struct snd_pcm_substream *fe_substream, *be_substream;
 735
 736	/* reparent if BE is connected to other FEs */
 737	if (!be->dpcm[stream].users)
 738		return;
 739
 740	be_substream = snd_soc_dpcm_get_substream(be, stream);
 741
 742	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
 743		if (dpcm->fe == fe)
 744			continue;
 745
 746		dev_dbg(fe->dev, "  reparent %s path %s %s %s\n",
 747			stream ? "capture" : "playback",
 748			dpcm->fe->dai_link->name,
 749			stream ? "<-" : "->", dpcm->be->dai_link->name);
 750
 751		fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
 752		be_substream->runtime = fe_substream->runtime;
 753		break;
 754	}
 755}
 756
 757/* disconnect a BE and FE */
 758static void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
 759{
 760	struct snd_soc_dpcm *dpcm, *d;
 761
 762	list_for_each_entry_safe(dpcm, d, &fe->dpcm[stream].be_clients, list_be) {
 763		dev_dbg(fe->dev, "BE %s disconnect check for %s\n",
 764				stream ? "capture" : "playback",
 765				dpcm->be->dai_link->name);
 766
 767		if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE)
 768			continue;
 769
 770		dev_dbg(fe->dev, "  freed DSP %s path %s %s %s\n",
 771			stream ? "capture" : "playback", fe->dai_link->name,
 772			stream ? "<-" : "->", dpcm->be->dai_link->name);
 773
 774		/* BEs still alive need new FE */
 775		dpcm_be_reparent(fe, dpcm->be, stream);
 776
 777#ifdef CONFIG_DEBUG_FS
 778		debugfs_remove(dpcm->debugfs_state);
 779#endif
 780		list_del(&dpcm->list_be);
 781		list_del(&dpcm->list_fe);
 782		kfree(dpcm);
 783	}
 784}
 785
 786/* get BE for DAI widget and stream */
 787static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
 788		struct snd_soc_dapm_widget *widget, int stream)
 789{
 790	struct snd_soc_pcm_runtime *be;
 791	int i;
 792
 793	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 794		for (i = 0; i < card->num_links; i++) {
 795			be = &card->rtd[i];
 796
 797			if (!be->dai_link->no_pcm)
 798				continue;
 799
 800			if (be->cpu_dai->playback_widget == widget ||
 801				be->codec_dai->playback_widget == widget)
 802				return be;
 803		}
 804	} else {
 805
 806		for (i = 0; i < card->num_links; i++) {
 807			be = &card->rtd[i];
 808
 809			if (!be->dai_link->no_pcm)
 810				continue;
 811
 812			if (be->cpu_dai->capture_widget == widget ||
 813				be->codec_dai->capture_widget == widget)
 814				return be;
 815		}
 816	}
 817
 818	dev_err(card->dev, "can't get %s BE for %s\n",
 819		stream ? "capture" : "playback", widget->name);
 820	return NULL;
 821}
 822
 823static inline struct snd_soc_dapm_widget *
 824	rtd_get_cpu_widget(struct snd_soc_pcm_runtime *rtd, int stream)
 825{
 826	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
 827		return rtd->cpu_dai->playback_widget;
 828	else
 829		return rtd->cpu_dai->capture_widget;
 830}
 831
 832static inline struct snd_soc_dapm_widget *
 833	rtd_get_codec_widget(struct snd_soc_pcm_runtime *rtd, int stream)
 834{
 835	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
 836		return rtd->codec_dai->playback_widget;
 837	else
 838		return rtd->codec_dai->capture_widget;
 839}
 840
 841static int widget_in_list(struct snd_soc_dapm_widget_list *list,
 842		struct snd_soc_dapm_widget *widget)
 843{
 844	int i;
 845
 846	for (i = 0; i < list->num_widgets; i++) {
 847		if (widget == list->widgets[i])
 848			return 1;
 849	}
 850
 851	return 0;
 852}
 853
 854static int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
 855	int stream, struct snd_soc_dapm_widget_list **list_)
 856{
 857	struct snd_soc_dai *cpu_dai = fe->cpu_dai;
 858	struct snd_soc_dapm_widget_list *list;
 859	int paths;
 860
 861	list = kzalloc(sizeof(struct snd_soc_dapm_widget_list) +
 862			sizeof(struct snd_soc_dapm_widget *), GFP_KERNEL);
 863	if (list == NULL)
 864		return -ENOMEM;
 865
 866	/* get number of valid DAI paths and their widgets */
 867	paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, &list);
 868
 869	dev_dbg(fe->dev, "found %d audio %s paths\n", paths,
 870			stream ? "capture" : "playback");
 871
 872	*list_ = list;
 873	return paths;
 874}
 875
 876static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list)
 877{
 878	kfree(*list);
 879}
 880
 881static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
 882	struct snd_soc_dapm_widget_list **list_)
 883{
 884	struct snd_soc_dpcm *dpcm;
 885	struct snd_soc_dapm_widget_list *list = *list_;
 886	struct snd_soc_dapm_widget *widget;
 887	int prune = 0;
 888
 889	/* Destroy any old FE <--> BE connections */
 890	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
 891
 892		/* is there a valid CPU DAI widget for this BE */
 893		widget = rtd_get_cpu_widget(dpcm->be, stream);
 894
 895		/* prune the BE if it's no longer in our active list */
 896		if (widget && widget_in_list(list, widget))
 897			continue;
 898
 899		/* is there a valid CODEC DAI widget for this BE */
 900		widget = rtd_get_codec_widget(dpcm->be, stream);
 901
 902		/* prune the BE if it's no longer in our active list */
 903		if (widget && widget_in_list(list, widget))
 904			continue;
 905
 906		dev_dbg(fe->dev, "pruning %s BE %s for %s\n",
 907			stream ? "capture" : "playback",
 908			dpcm->be->dai_link->name, fe->dai_link->name);
 909		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
 910		dpcm->be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
 911		prune++;
 912	}
 913
 914	dev_dbg(fe->dev, "found %d old BE paths for pruning\n", prune);
 915	return prune;
 916}
 917
 918static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
 919	struct snd_soc_dapm_widget_list **list_)
 920{
 921	struct snd_soc_card *card = fe->card;
 922	struct snd_soc_dapm_widget_list *list = *list_;
 923	struct snd_soc_pcm_runtime *be;
 924	int i, new = 0, err;
 925
 926	/* Create any new FE <--> BE connections */
 927	for (i = 0; i < list->num_widgets; i++) {
 928
 929		if (list->widgets[i]->id != snd_soc_dapm_dai)
 930			continue;
 931
 932		/* is there a valid BE rtd for this widget */
 933		be = dpcm_get_be(card, list->widgets[i], stream);
 934		if (!be) {
 935			dev_err(fe->dev, "no BE found for %s\n",
 936					list->widgets[i]->name);
 937			continue;
 938		}
 939
 940		/* make sure BE is a real BE */
 941		if (!be->dai_link->no_pcm)
 942			continue;
 943
 944		/* don't connect if FE is not running */
 945		if (!fe->dpcm[stream].runtime)
 946			continue;
 947
 948		/* newly connected FE and BE */
 949		err = dpcm_be_connect(fe, be, stream);
 950		if (err < 0) {
 951			dev_err(fe->dev, "can't connect %s\n",
 952				list->widgets[i]->name);
 953			break;
 954		} else if (err == 0) /* already connected */
 955			continue;
 956
 957		/* new */
 958		be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
 959		new++;
 960	}
 961
 962	dev_dbg(fe->dev, "found %d new BE paths\n", new);
 963	return new;
 964}
 965
 966/*
 967 * Find the corresponding BE DAIs that source or sink audio to this
 968 * FE substream.
 969 */
 970static int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
 971	int stream, struct snd_soc_dapm_widget_list **list, int new)
 972{
 973	if (new)
 974		return dpcm_add_paths(fe, stream, list);
 975	else
 976		return dpcm_prune_paths(fe, stream, list);
 977}
 978
 979static void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
 980{
 981	struct snd_soc_dpcm *dpcm;
 982
 983	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
 984		dpcm->be->dpcm[stream].runtime_update =
 985						SND_SOC_DPCM_UPDATE_NO;
 986}
 987
 988static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
 989	int stream)
 990{
 991	struct snd_soc_dpcm *dpcm;
 992
 993	/* disable any enabled and non active backends */
 994	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
 995
 996		struct snd_soc_pcm_runtime *be = dpcm->be;
 997		struct snd_pcm_substream *be_substream =
 998			snd_soc_dpcm_get_substream(be, stream);
 999
1000		if (be->dpcm[stream].users == 0)
1001			dev_err(be->dev, "no users %s at close - state %d\n",
1002				stream ? "capture" : "playback",
1003				be->dpcm[stream].state);
1004
1005		if (--be->dpcm[stream].users != 0)
1006			continue;
1007
1008		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1009			continue;
1010
1011		soc_pcm_close(be_substream);
1012		be_substream->runtime = NULL;
1013		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1014	}
1015}
1016
1017static int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
1018{
1019	struct snd_soc_dpcm *dpcm;
1020	int err, count = 0;
1021
1022	/* only startup BE DAIs that are either sinks or sources to this FE DAI */
1023	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1024
1025		struct snd_soc_pcm_runtime *be = dpcm->be;
1026		struct snd_pcm_substream *be_substream =
1027			snd_soc_dpcm_get_substream(be, stream);
1028
1029		/* is this op for this BE ? */
1030		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1031			continue;
1032
1033		/* first time the dpcm is open ? */
1034		if (be->dpcm[stream].users == DPCM_MAX_BE_USERS)
1035			dev_err(be->dev, "too many users %s at open %d\n",
1036				stream ? "capture" : "playback",
1037				be->dpcm[stream].state);
1038
1039		if (be->dpcm[stream].users++ != 0)
1040			continue;
1041
1042		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1043		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1044			continue;
1045
1046		dev_dbg(be->dev, "dpcm: open BE %s\n", be->dai_link->name);
1047
1048		be_substream->runtime = be->dpcm[stream].runtime;
1049		err = soc_pcm_open(be_substream);
1050		if (err < 0) {
1051			dev_err(be->dev, "BE open failed %d\n", err);
1052			be->dpcm[stream].users--;
1053			if (be->dpcm[stream].users < 0)
1054				dev_err(be->dev, "no users %s at unwind %d\n",
1055					stream ? "capture" : "playback",
1056					be->dpcm[stream].state);
1057
1058			be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1059			goto unwind;
1060		}
1061
1062		be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1063		count++;
1064	}
1065
1066	return count;
1067
1068unwind:
1069	/* disable any enabled and non active backends */
1070	list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1071		struct snd_soc_pcm_runtime *be = dpcm->be;
1072		struct snd_pcm_substream *be_substream =
1073			snd_soc_dpcm_get_substream(be, stream);
1074
1075		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1076			continue;
1077
1078		if (be->dpcm[stream].users == 0)
1079			dev_err(be->dev, "no users %s at close %d\n",
1080				stream ? "capture" : "playback",
1081				be->dpcm[stream].state);
1082
1083		if (--be->dpcm[stream].users != 0)
1084			continue;
1085
1086		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1087			continue;
1088
1089		soc_pcm_close(be_substream);
1090		be_substream->runtime = NULL;
1091		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1092	}
1093
1094	return err;
1095}
1096
1097static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream)
1098{
1099	struct snd_pcm_runtime *runtime = substream->runtime;
1100	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1101	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1102	struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
1103
1104	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1105		runtime->hw.rate_min = cpu_dai_drv->playback.rate_min;
1106		runtime->hw.rate_max = cpu_dai_drv->playback.rate_max;
1107		runtime->hw.channels_min = cpu_dai_drv->playback.channels_min;
1108		runtime->hw.channels_max = cpu_dai_drv->playback.channels_max;
1109		runtime->hw.formats &= cpu_dai_drv->playback.formats;
1110		runtime->hw.rates = cpu_dai_drv->playback.rates;
1111	} else {
1112		runtime->hw.rate_min = cpu_dai_drv->capture.rate_min;
1113		runtime->hw.rate_max = cpu_dai_drv->capture.rate_max;
1114		runtime->hw.channels_min = cpu_dai_drv->capture.channels_min;
1115		runtime->hw.channels_max = cpu_dai_drv->capture.channels_max;
1116		runtime->hw.formats &= cpu_dai_drv->capture.formats;
1117		runtime->hw.rates = cpu_dai_drv->capture.rates;
1118	}
1119}
1120
1121static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
1122{
1123	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1124	struct snd_pcm_runtime *runtime = fe_substream->runtime;
1125	int stream = fe_substream->stream, ret = 0;
1126
1127	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1128
1129	ret = dpcm_be_dai_startup(fe, fe_substream->stream);
1130	if (ret < 0) {
1131		dev_err(fe->dev,"dpcm: failed to start some BEs %d\n", ret);
1132		goto be_err;
1133	}
1134
1135	dev_dbg(fe->dev, "dpcm: open FE %s\n", fe->dai_link->name);
1136
1137	/* start the DAI frontend */
1138	ret = soc_pcm_open(fe_substream);
1139	if (ret < 0) {
1140		dev_err(fe->dev,"dpcm: failed to start FE %d\n", ret);
1141		goto unwind;
1142	}
1143
1144	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1145
1146	dpcm_set_fe_runtime(fe_substream);
1147	snd_pcm_limit_hw_rates(runtime);
1148
1149	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1150	return 0;
1151
1152unwind:
1153	dpcm_be_dai_startup_unwind(fe, fe_substream->stream);
1154be_err:
1155	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1156	return ret;
1157}
1158
1159static int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
1160{
1161	struct snd_soc_dpcm *dpcm;
1162
1163	/* only shutdown BEs that are either sinks or sources to this FE DAI */
1164	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1165
1166		struct snd_soc_pcm_runtime *be = dpcm->be;
1167		struct snd_pcm_substream *be_substream =
1168			snd_soc_dpcm_get_substream(be, stream);
1169
1170		/* is this op for this BE ? */
1171		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1172			continue;
1173
1174		if (be->dpcm[stream].users == 0)
1175			dev_err(be->dev, "no users %s at close - state %d\n",
1176				stream ? "capture" : "playback",
1177				be->dpcm[stream].state);
1178
1179		if (--be->dpcm[stream].users != 0)
1180			continue;
1181
1182		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1183		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN))
1184			continue;
1185
1186		dev_dbg(be->dev, "dpcm: close BE %s\n",
1187			dpcm->fe->dai_link->name);
1188
1189		soc_pcm_close(be_substream);
1190		be_substream->runtime = NULL;
1191
1192		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1193	}
1194	return 0;
1195}
1196
1197static int dpcm_fe_dai_shutdown(struct snd_pcm_substream *substream)
1198{
1199	struct snd_soc_pcm_runtime *fe = substream->private_data;
1200	int stream = substream->stream;
1201
1202	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1203
1204	/* shutdown the BEs */
1205	dpcm_be_dai_shutdown(fe, substream->stream);
1206
1207	dev_dbg(fe->dev, "dpcm: close FE %s\n", fe->dai_link->name);
1208
1209	/* now shutdown the frontend */
1210	soc_pcm_close(substream);
1211
1212	/* run the stream event for each BE */
1213	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
1214
1215	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1216	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1217	return 0;
1218}
1219
1220static int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
1221{
1222	struct snd_soc_dpcm *dpcm;
1223
1224	/* only hw_params backends that are either sinks or sources
1225	 * to this frontend DAI */
1226	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1227
1228		struct snd_soc_pcm_runtime *be = dpcm->be;
1229		struct snd_pcm_substream *be_substream =
1230			snd_soc_dpcm_get_substream(be, stream);
1231
1232		/* is this op for this BE ? */
1233		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1234			continue;
1235
1236		/* only free hw when no longer used - check all FEs */
1237		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1238				continue;
1239
1240		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1241		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1242		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1243		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1244			continue;
1245
1246		dev_dbg(be->dev, "dpcm: hw_free BE %s\n",
1247			dpcm->fe->dai_link->name);
1248
1249		soc_pcm_hw_free(be_substream);
1250
1251		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1252	}
1253
1254	return 0;
1255}
1256
1257static int dpcm_fe_dai_hw_free(struct snd_pcm_substream *substream)
1258{
1259	struct snd_soc_pcm_runtime *fe = substream->private_data;
1260	int err, stream = substream->stream;
1261
1262	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1263	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1264
1265	dev_dbg(fe->dev, "dpcm: hw_free FE %s\n", fe->dai_link->name);
1266
1267	/* call hw_free on the frontend */
1268	err = soc_pcm_hw_free(substream);
1269	if (err < 0)
1270		dev_err(fe->dev,"dpcm: hw_free FE %s failed\n",
1271			fe->dai_link->name);
1272
1273	/* only hw_params backends that are either sinks or sources
1274	 * to this frontend DAI */
1275	err = dpcm_be_dai_hw_free(fe, stream);
1276
1277	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1278	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1279
1280	mutex_unlock(&fe->card->mutex);
1281	return 0;
1282}
1283
1284static int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream)
1285{
1286	struct snd_soc_dpcm *dpcm;
1287	int ret;
1288
1289	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1290
1291		struct snd_soc_pcm_runtime *be = dpcm->be;
1292		struct snd_pcm_substream *be_substream =
1293			snd_soc_dpcm_get_substream(be, stream);
1294
1295		/* is this op for this BE ? */
1296		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1297			continue;
1298
1299		/* only allow hw_params() if no connected FEs are running */
1300		if (!snd_soc_dpcm_can_be_params(fe, be, stream))
1301			continue;
1302
1303		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
1304		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1305		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
1306			continue;
1307
1308		dev_dbg(be->dev, "dpcm: hw_params BE %s\n",
1309			dpcm->fe->dai_link->name);
1310
1311		/* copy params for each dpcm */
1312		memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params,
1313				sizeof(struct snd_pcm_hw_params));
1314
1315		/* perform any hw_params fixups */
1316		if (be->dai_link->be_hw_params_fixup) {
1317			ret = be->dai_link->be_hw_params_fixup(be,
1318					&dpcm->hw_params);
1319			if (ret < 0) {
1320				dev_err(be->dev,
1321					"dpcm: hw_params BE fixup failed %d\n",
1322					ret);
1323				goto unwind;
1324			}
1325		}
1326
1327		ret = soc_pcm_hw_params(be_substream, &dpcm->hw_params);
1328		if (ret < 0) {
1329			dev_err(dpcm->be->dev,
1330				"dpcm: hw_params BE failed %d\n", ret);
1331			goto unwind;
1332		}
1333
1334		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
1335	}
1336	return 0;
1337
1338unwind:
1339	/* disable any enabled and non active backends */
1340	list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1341		struct snd_soc_pcm_runtime *be = dpcm->be;
1342		struct snd_pcm_substream *be_substream =
1343			snd_soc_dpcm_get_substream(be, stream);
1344
1345		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1346			continue;
1347
1348		/* only allow hw_free() if no connected FEs are running */
1349		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1350			continue;
1351
1352		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
1353		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1354		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1355		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1356			continue;
1357
1358		soc_pcm_hw_free(be_substream);
1359	}
1360
1361	return ret;
1362}
1363
1364static int dpcm_fe_dai_hw_params(struct snd_pcm_substream *substream,
1365				 struct snd_pcm_hw_params *params)
1366{
1367	struct snd_soc_pcm_runtime *fe = substream->private_data;
1368	int ret, stream = substream->stream;
1369
1370	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1371	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1372
1373	memcpy(&fe->dpcm[substream->stream].hw_params, params,
1374			sizeof(struct snd_pcm_hw_params));
1375	ret = dpcm_be_dai_hw_params(fe, substream->stream);
1376	if (ret < 0) {
1377		dev_err(fe->dev,"dpcm: hw_params BE failed %d\n", ret);
1378		goto out;
1379	}
1380
1381	dev_dbg(fe->dev, "dpcm: hw_params FE %s rate %d chan %x fmt %d\n",
1382			fe->dai_link->name, params_rate(params),
1383			params_channels(params), params_format(params));
1384
1385	/* call hw_params on the frontend */
1386	ret = soc_pcm_hw_params(substream, params);
1387	if (ret < 0) {
1388		dev_err(fe->dev,"dpcm: hw_params FE failed %d\n", ret);
1389		dpcm_be_dai_hw_free(fe, stream);
1390	 } else
1391		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
1392
1393out:
1394	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1395	mutex_unlock(&fe->card->mutex);
1396	return ret;
1397}
1398
1399static int dpcm_do_trigger(struct snd_soc_dpcm *dpcm,
1400		struct snd_pcm_substream *substream, int cmd)
1401{
1402	int ret;
1403
1404	dev_dbg(dpcm->be->dev, "dpcm: trigger BE %s cmd %d\n",
1405			dpcm->fe->dai_link->name, cmd);
1406
1407	ret = soc_pcm_trigger(substream, cmd);
1408	if (ret < 0)
1409		dev_err(dpcm->be->dev,"dpcm: trigger BE failed %d\n", ret);
1410
1411	return ret;
1412}
1413
1414static int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
1415			       int cmd)
1416{
1417	struct snd_soc_dpcm *dpcm;
1418	int ret = 0;
1419
1420	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1421
1422		struct snd_soc_pcm_runtime *be = dpcm->be;
1423		struct snd_pcm_substream *be_substream =
1424			snd_soc_dpcm_get_substream(be, stream);
1425
1426		/* is this op for this BE ? */
1427		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1428			continue;
1429
1430		switch (cmd) {
1431		case SNDRV_PCM_TRIGGER_START:
1432			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1433			    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1434				continue;
1435
1436			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1437			if (ret)
1438				return ret;
1439
1440			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1441			break;
1442		case SNDRV_PCM_TRIGGER_RESUME:
1443			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
1444				continue;
1445
1446			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1447			if (ret)
1448				return ret;
1449
1450			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1451			break;
1452		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1453			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
1454				continue;
1455
1456			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1457			if (ret)
1458				return ret;
1459
1460			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1461			break;
1462		case SNDRV_PCM_TRIGGER_STOP:
1463			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1464				continue;
1465
1466			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1467				continue;
1468
1469			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1470			if (ret)
1471				return ret;
1472
1473			be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
1474			break;
1475		case SNDRV_PCM_TRIGGER_SUSPEND:
1476			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)
1477				continue;
1478
1479			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1480				continue;
1481
1482			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1483			if (ret)
1484				return ret;
1485
1486			be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
1487			break;
1488		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1489			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1490				continue;
1491
1492			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1493				continue;
1494
1495			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1496			if (ret)
1497				return ret;
1498
1499			be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
1500			break;
1501		}
1502	}
1503
1504	return ret;
1505}
1506EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger);
1507
1508static int dpcm_fe_dai_trigger(struct snd_pcm_substream *substream, int cmd)
1509{
1510	struct snd_soc_pcm_runtime *fe = substream->private_data;
1511	int stream = substream->stream, ret;
1512	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1513
1514	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1515
1516	switch (trigger) {
1517	case SND_SOC_DPCM_TRIGGER_PRE:
1518		/* call trigger on the frontend before the backend. */
1519
1520		dev_dbg(fe->dev, "dpcm: pre trigger FE %s cmd %d\n",
1521				fe->dai_link->name, cmd);
1522
1523		ret = soc_pcm_trigger(substream, cmd);
1524		if (ret < 0) {
1525			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1526			goto out;
1527		}
1528
1529		ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
1530		break;
1531	case SND_SOC_DPCM_TRIGGER_POST:
1532		/* call trigger on the frontend after the backend. */
1533
1534		ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
1535		if (ret < 0) {
1536			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1537			goto out;
1538		}
1539
1540		dev_dbg(fe->dev, "dpcm: post trigger FE %s cmd %d\n",
1541				fe->dai_link->name, cmd);
1542
1543		ret = soc_pcm_trigger(substream, cmd);
1544		break;
1545	case SND_SOC_DPCM_TRIGGER_BESPOKE:
1546		/* bespoke trigger() - handles both FE and BEs */
1547
1548		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd %d\n",
1549				fe->dai_link->name, cmd);
1550
1551		ret = soc_pcm_bespoke_trigger(substream, cmd);
1552		if (ret < 0) {
1553			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1554			goto out;
1555		}
1556		break;
1557	default:
1558		dev_err(fe->dev, "dpcm: invalid trigger cmd %d for %s\n", cmd,
1559				fe->dai_link->name);
1560		ret = -EINVAL;
1561		goto out;
1562	}
1563
1564	switch (cmd) {
1565	case SNDRV_PCM_TRIGGER_START:
1566	case SNDRV_PCM_TRIGGER_RESUME:
1567	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1568		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1569		break;
1570	case SNDRV_PCM_TRIGGER_STOP:
1571	case SNDRV_PCM_TRIGGER_SUSPEND:
1572	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1573		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
1574		break;
1575	}
1576
1577out:
1578	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1579	return ret;
1580}
1581
1582static int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
1583{
1584	struct snd_soc_dpcm *dpcm;
1585	int ret = 0;
1586
1587	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1588
1589		struct snd_soc_pcm_runtime *be = dpcm->be;
1590		struct snd_pcm_substream *be_substream =
1591			snd_soc_dpcm_get_substream(be, stream);
1592
1593		/* is this op for this BE ? */
1594		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1595			continue;
1596
1597		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1598		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1599			continue;
1600
1601		dev_dbg(be->dev, "dpcm: prepare BE %s\n",
1602			dpcm->fe->dai_link->name);
1603
1604		ret = soc_pcm_prepare(be_substream);
1605		if (ret < 0) {
1606			dev_err(be->dev, "dpcm: backend prepare failed %d\n",
1607				ret);
1608			break;
1609		}
1610
1611		be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
1612	}
1613	return ret;
1614}
1615
1616static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
1617{
1618	struct snd_soc_pcm_runtime *fe = substream->private_data;
1619	int stream = substream->stream, ret = 0;
1620
1621	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1622
1623	dev_dbg(fe->dev, "dpcm: prepare FE %s\n", fe->dai_link->name);
1624
1625	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1626
1627	/* there is no point preparing this FE if there are no BEs */
1628	if (list_empty(&fe->dpcm[stream].be_clients)) {
1629		dev_err(fe->dev, "dpcm: no backend DAIs enabled for %s\n",
1630				fe->dai_link->name);
1631		ret = -EINVAL;
1632		goto out;
1633	}
1634
1635	ret = dpcm_be_dai_prepare(fe, substream->stream);
1636	if (ret < 0)
1637		goto out;
1638
1639	/* call prepare on the frontend */
1640	ret = soc_pcm_prepare(substream);
1641	if (ret < 0) {
1642		dev_err(fe->dev,"dpcm: prepare FE %s failed\n",
1643			fe->dai_link->name);
1644		goto out;
1645	}
1646
1647	/* run the stream event for each BE */
1648	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
1649	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
1650
1651out:
1652	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1653	mutex_unlock(&fe->card->mutex);
1654
1655	return ret;
1656}
1657
1658static int soc_pcm_ioctl(struct snd_pcm_substream *substream,
1659		     unsigned int cmd, void *arg)
1660{
1661	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1662	struct snd_soc_platform *platform = rtd->platform;
1663
1664	if (platform->driver->ops->ioctl)
1665		return platform->driver->ops->ioctl(substream, cmd, arg);
1666	return snd_pcm_lib_ioctl(substream, cmd, arg);
1667}
1668
1669static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
1670{
1671	struct snd_pcm_substream *substream =
1672		snd_soc_dpcm_get_substream(fe, stream);
1673	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1674	int err;
1675
1676	dev_dbg(fe->dev, "runtime %s close on FE %s\n",
1677			stream ? "capture" : "playback", fe->dai_link->name);
1678
1679	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
1680		/* call bespoke trigger - FE takes care of all BE triggers */
1681		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd stop\n",
1682				fe->dai_link->name);
1683
1684		err = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_STOP);
1685		if (err < 0)
1686			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", err);
1687	} else {
1688		dev_dbg(fe->dev, "dpcm: trigger FE %s cmd stop\n",
1689			fe->dai_link->name);
1690
1691		err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP);
1692		if (err < 0)
1693			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", err);
1694	}
1695
1696	err = dpcm_be_dai_hw_free(fe, stream);
1697	if (err < 0)
1698		dev_err(fe->dev,"dpcm: hw_free FE failed %d\n", err);
1699
1700	err = dpcm_be_dai_shutdown(fe, stream);
1701	if (err < 0)
1702		dev_err(fe->dev,"dpcm: shutdown FE failed %d\n", err);
1703
1704	/* run the stream event for each BE */
1705	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
1706
1707	return 0;
1708}
1709
1710static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream)
1711{
1712	struct snd_pcm_substream *substream =
1713		snd_soc_dpcm_get_substream(fe, stream);
1714	struct snd_soc_dpcm *dpcm;
1715	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1716	int ret;
1717
1718	dev_dbg(fe->dev, "runtime %s open on FE %s\n",
1719			stream ? "capture" : "playback", fe->dai_link->name);
1720
1721	/* Only start the BE if the FE is ready */
1722	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
1723		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE)
1724		return -EINVAL;
1725
1726	/* startup must always be called for new BEs */
1727	ret = dpcm_be_dai_startup(fe, stream);
1728	if (ret < 0) {
1729		goto disconnect;
1730		return ret;
1731	}
1732
1733	/* keep going if FE state is > open */
1734	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
1735		return 0;
1736
1737	ret = dpcm_be_dai_hw_params(fe, stream);
1738	if (ret < 0) {
1739		goto close;
1740		return ret;
1741	}
1742
1743	/* keep going if FE state is > hw_params */
1744	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
1745		return 0;
1746
1747
1748	ret = dpcm_be_dai_prepare(fe, stream);
1749	if (ret < 0) {
1750		goto hw_free;
1751		return ret;
1752	}
1753
1754	/* run the stream event for each BE */
1755	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
1756
1757	/* keep going if FE state is > prepare */
1758	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
1759		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
1760		return 0;
1761
1762	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
1763		/* call trigger on the frontend - FE takes care of all BE triggers */
1764		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd start\n",
1765				fe->dai_link->name);
1766
1767		ret = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_START);
1768		if (ret < 0) {
1769			dev_err(fe->dev,"dpcm: bespoke trigger FE failed %d\n", ret);
1770			goto hw_free;
1771		}
1772	} else {
1773		dev_dbg(fe->dev, "dpcm: trigger FE %s cmd start\n",
1774			fe->dai_link->name);
1775
1776		ret = dpcm_be_dai_trigger(fe, stream,
1777					SNDRV_PCM_TRIGGER_START);
1778		if (ret < 0) {
1779			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1780			goto hw_free;
1781		}
1782	}
1783
1784	return 0;
1785
1786hw_free:
1787	dpcm_be_dai_hw_free(fe, stream);
1788close:
1789	dpcm_be_dai_shutdown(fe, stream);
1790disconnect:
1791	/* disconnect any non started BEs */
1792	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1793		struct snd_soc_pcm_runtime *be = dpcm->be;
1794		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1795				dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1796	}
1797
1798	return ret;
1799}
1800
1801static int dpcm_run_new_update(struct snd_soc_pcm_runtime *fe, int stream)
1802{
1803	int ret;
1804
1805	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1806	ret = dpcm_run_update_startup(fe, stream);
1807	if (ret < 0)
1808		dev_err(fe->dev, "failed to startup some BEs\n");
1809	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1810
1811	return ret;
1812}
1813
1814static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
1815{
1816	int ret;
1817
1818	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1819	ret = dpcm_run_update_shutdown(fe, stream);
1820	if (ret < 0)
1821		dev_err(fe->dev, "failed to shutdown some BEs\n");
1822	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1823
1824	return ret;
1825}
1826
1827/* Called by DAPM mixer/mux changes to update audio routing between PCMs and
1828 * any DAI links.
1829 */
1830int soc_dpcm_runtime_update(struct snd_soc_dapm_widget *widget)
1831{
1832	struct snd_soc_card *card;
1833	int i, old, new, paths;
1834
1835	if (widget->codec)
1836		card = widget->codec->card;
1837	else if (widget->platform)
1838		card = widget->platform->card;
1839	else
1840		return -EINVAL;
1841
1842	mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1843	for (i = 0; i < card->num_rtd; i++) {
1844		struct snd_soc_dapm_widget_list *list;
1845		struct snd_soc_pcm_runtime *fe = &card->rtd[i];
1846
1847		/* make sure link is FE */
1848		if (!fe->dai_link->dynamic)
1849			continue;
1850
1851		/* only check active links */
1852		if (!fe->cpu_dai->active)
1853			continue;
1854
1855		/* DAPM sync will call this to update DSP paths */
1856		dev_dbg(fe->dev, "DPCM runtime update for FE %s\n",
1857			fe->dai_link->name);
1858
1859		/* skip if FE doesn't have playback capability */
1860		if (!fe->cpu_dai->driver->playback.channels_min)
1861			goto capture;
1862
1863		paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list);
1864		if (paths < 0) {
1865			dev_warn(fe->dev, "%s no valid %s path\n",
1866					fe->dai_link->name,  "playback");
1867			mutex_unlock(&card->mutex);
1868			return paths;
1869		}
1870
1871		/* update any new playback paths */
1872		new = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, 1);
1873		if (new) {
1874			dpcm_run_new_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
1875			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK);
1876			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK);
1877		}
1878
1879		/* update any old playback paths */
1880		old = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, 0);
1881		if (old) {
1882			dpcm_run_old_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
1883			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK);
1884			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK);
1885		}
1886
1887capture:
1888		/* skip if FE doesn't have capture capability */
1889		if (!fe->cpu_dai->driver->capture.channels_min)
1890			continue;
1891
1892		paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list);
1893		if (paths < 0) {
1894			dev_warn(fe->dev, "%s no valid %s path\n",
1895					fe->dai_link->name,  "capture");
1896			mutex_unlock(&card->mutex);
1897			return paths;
1898		}
1899
1900		/* update any new capture paths */
1901		new = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, 1);
1902		if (new) {
1903			dpcm_run_new_update(fe, SNDRV_PCM_STREAM_CAPTURE);
1904			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE);
1905			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE);
1906		}
1907
1908		/* update any old capture paths */
1909		old = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, 0);
1910		if (old) {
1911			dpcm_run_old_update(fe, SNDRV_PCM_STREAM_CAPTURE);
1912			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE);
1913			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE);
1914		}
1915
1916		dpcm_path_put(&list);
1917	}
1918
1919	mutex_unlock(&card->mutex);
1920	return 0;
1921}
1922int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute)
1923{
1924	struct snd_soc_dpcm *dpcm;
1925	struct list_head *clients =
1926		&fe->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients;
1927
1928	list_for_each_entry(dpcm, clients, list_be) {
1929
1930		struct snd_soc_pcm_runtime *be = dpcm->be;
1931		struct snd_soc_dai *dai = be->codec_dai;
1932		struct snd_soc_dai_driver *drv = dai->driver;
1933
1934		if (be->dai_link->ignore_suspend)
1935			continue;
1936
1937		dev_dbg(be->dev, "BE digital mute %s\n", be->dai_link->name);
1938
1939		if (drv->ops->digital_mute && dai->playback_active)
1940				drv->ops->digital_mute(dai, mute);
1941	}
1942
1943	return 0;
1944}
1945
1946static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
1947{
1948	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1949	struct snd_soc_dpcm *dpcm;
1950	struct snd_soc_dapm_widget_list *list;
1951	int ret;
1952	int stream = fe_substream->stream;
1953
1954	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1955	fe->dpcm[stream].runtime = fe_substream->runtime;
1956
1957	if (dpcm_path_get(fe, stream, &list) <= 0) {
1958		dev_warn(fe->dev, "asoc: %s no valid %s route\n",
1959			fe->dai_link->name, stream ? "capture" : "playback");
1960			mutex_unlock(&fe->card->mutex);
1961			return -EINVAL;
1962	}
1963
1964	/* calculate valid and active FE <-> BE dpcms */
1965	dpcm_process_paths(fe, stream, &list, 1);
1966
1967	ret = dpcm_fe_dai_startup(fe_substream);
1968	if (ret < 0) {
1969		/* clean up all links */
1970		list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
1971			dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1972
1973		dpcm_be_disconnect(fe, stream);
1974		fe->dpcm[stream].runtime = NULL;
1975	}
1976
1977	dpcm_clear_pending_state(fe, stream);
1978	dpcm_path_put(&list);
1979	mutex_unlock(&fe->card->mutex);
1980	return ret;
1981}
1982
1983static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
1984{
1985	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1986	struct snd_soc_dpcm *dpcm;
1987	int stream = fe_substream->stream, ret;
1988
1989	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1990	ret = dpcm_fe_dai_shutdown(fe_substream);
1991
1992	/* mark FE's links ready to prune */
1993	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
1994		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1995
1996	dpcm_be_disconnect(fe, stream);
1997
1998	fe->dpcm[stream].runtime = NULL;
1999	mutex_unlock(&fe->card->mutex);
2000	return ret;
2001}
2002
2003/* create a new pcm */
2004int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2005{
2006	struct snd_soc_codec *codec = rtd->codec;
2007	struct snd_soc_platform *platform = rtd->platform;
2008	struct snd_soc_dai *codec_dai = rtd->codec_dai;
2009	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2010	struct snd_pcm *pcm;
2011	char new_name[64];
2012	int ret = 0, playback = 0, capture = 0;
2013
2014	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) {
2015		if (cpu_dai->driver->playback.channels_min)
2016			playback = 1;
2017		if (cpu_dai->driver->capture.channels_min)
2018			capture = 1;
2019	} else {
2020		if (codec_dai->driver->playback.channels_min)
2021			playback = 1;
2022		if (codec_dai->driver->capture.channels_min)
2023			capture = 1;
2024	}
2025
2026	/* create the PCM */
2027	if (rtd->dai_link->no_pcm) {
2028		snprintf(new_name, sizeof(new_name), "(%s)",
2029			rtd->dai_link->stream_name);
2030
2031		ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
2032				playback, capture, &pcm);
2033	} else {
2034		if (rtd->dai_link->dynamic)
2035			snprintf(new_name, sizeof(new_name), "%s (*)",
2036				rtd->dai_link->stream_name);
2037		else
2038			snprintf(new_name, sizeof(new_name), "%s %s-%d",
2039				rtd->dai_link->stream_name, codec_dai->name, num);
2040
2041		ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback,
2042			capture, &pcm);
2043	}
2044	if (ret < 0) {
2045		printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name);
2046		return ret;
2047	}
2048	dev_dbg(rtd->card->dev, "registered pcm #%d %s\n",num, new_name);
2049
2050	/* DAPM dai link stream work */
2051	INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
2052
2053	rtd->pcm = pcm;
2054	pcm->private_data = rtd;
2055
2056	if (rtd->dai_link->no_pcm) {
2057		if (playback)
2058			pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
2059		if (capture)
2060			pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
2061		goto out;
2062	}
2063
2064	/* ASoC PCM operations */
2065	if (rtd->dai_link->dynamic) {
2066		rtd->ops.open		= dpcm_fe_dai_open;
2067		rtd->ops.hw_params	= dpcm_fe_dai_hw_params;
2068		rtd->ops.prepare	= dpcm_fe_dai_prepare;
2069		rtd->ops.trigger	= dpcm_fe_dai_trigger;
2070		rtd->ops.hw_free	= dpcm_fe_dai_hw_free;
2071		rtd->ops.close		= dpcm_fe_dai_close;
2072		rtd->ops.pointer	= soc_pcm_pointer;
2073		rtd->ops.ioctl		= soc_pcm_ioctl;
2074	} else {
2075		rtd->ops.open		= soc_pcm_open;
2076		rtd->ops.hw_params	= soc_pcm_hw_params;
2077		rtd->ops.prepare	= soc_pcm_prepare;
2078		rtd->ops.trigger	= soc_pcm_trigger;
2079		rtd->ops.hw_free	= soc_pcm_hw_free;
2080		rtd->ops.close		= soc_pcm_close;
2081		rtd->ops.pointer	= soc_pcm_pointer;
2082		rtd->ops.ioctl		= soc_pcm_ioctl;
2083	}
2084
2085	if (platform->driver->ops) {
2086		rtd->ops.ack		= platform->driver->ops->ack;
2087		rtd->ops.copy		= platform->driver->ops->copy;
2088		rtd->ops.silence	= platform->driver->ops->silence;
2089		rtd->ops.page		= platform->driver->ops->page;
2090		rtd->ops.mmap		= platform->driver->ops->mmap;
2091	}
2092
2093	if (playback)
2094		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops);
2095
2096	if (capture)
2097		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops);
2098
2099	if (platform->driver->pcm_new) {
2100		ret = platform->driver->pcm_new(rtd);
2101		if (ret < 0) {
2102			pr_err("asoc: platform pcm constructor failed\n");
2103			return ret;
2104		}
2105	}
2106
2107	pcm->private_free = platform->driver->pcm_free;
2108out:
2109	printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
2110		cpu_dai->name);
2111	return ret;
2112}
2113
2114/* is the current PCM operation for this FE ? */
2115int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream)
2116{
2117	if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
2118		return 1;
2119	return 0;
2120}
2121EXPORT_SYMBOL_GPL(snd_soc_dpcm_fe_can_update);
2122
2123/* is the current PCM operation for this BE ? */
2124int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
2125		struct snd_soc_pcm_runtime *be, int stream)
2126{
2127	if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
2128	   ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
2129		  be->dpcm[stream].runtime_update))
2130		return 1;
2131	return 0;
2132}
2133EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_can_update);
2134
2135/* get the substream for this BE */
2136struct snd_pcm_substream *
2137	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
2138{
2139	return be->pcm->streams[stream].substream;
2140}
2141EXPORT_SYMBOL_GPL(snd_soc_dpcm_get_substream);
2142
2143/* get the BE runtime state */
2144enum snd_soc_dpcm_state
2145	snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream)
2146{
2147	return be->dpcm[stream].state;
2148}
2149EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_get_state);
2150
2151/* set the BE runtime state */
2152void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be,
2153		int stream, enum snd_soc_dpcm_state state)
2154{
2155	be->dpcm[stream].state = state;
2156}
2157EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_set_state);
2158
2159/*
2160 * We can only hw_free, stop, pause or suspend a BE DAI if any of it's FE
2161 * are not running, paused or suspended for the specified stream direction.
2162 */
2163int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
2164		struct snd_soc_pcm_runtime *be, int stream)
2165{
2166	struct snd_soc_dpcm *dpcm;
2167	int state;
2168
2169	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
2170
2171		if (dpcm->fe == fe)
2172			continue;
2173
2174		state = dpcm->fe->dpcm[stream].state;
2175		if (state == SND_SOC_DPCM_STATE_START ||
2176			state == SND_SOC_DPCM_STATE_PAUSED ||
2177			state == SND_SOC_DPCM_STATE_SUSPEND)
2178			return 0;
2179	}
2180
2181	/* it's safe to free/stop this BE DAI */
2182	return 1;
2183}
2184EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);
2185
2186/*
2187 * We can only change hw params a BE DAI if any of it's FE are not prepared,
2188 * running, paused or suspended for the specified stream direction.
2189 */
2190int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
2191		struct snd_soc_pcm_runtime *be, int stream)
2192{
2193	struct snd_soc_dpcm *dpcm;
2194	int state;
2195
2196	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
2197
2198		if (dpcm->fe == fe)
2199			continue;
2200
2201		state = dpcm->fe->dpcm[stream].state;
2202		if (state == SND_SOC_DPCM_STATE_START ||
2203			state == SND_SOC_DPCM_STATE_PAUSED ||
2204			state == SND_SOC_DPCM_STATE_SUSPEND ||
2205			state == SND_SOC_DPCM_STATE_PREPARE)
2206			return 0;
2207	}
2208
2209	/* it's safe to change hw_params */
2210	return 1;
2211}
2212EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);
2213
2214int snd_soc_platform_trigger(struct snd_pcm_substream *substream,
2215		int cmd, struct snd_soc_platform *platform)
2216{
2217	if (platform->driver->ops->trigger)
2218		return platform->driver->ops->trigger(substream, cmd);
2219	return 0;
2220}
2221EXPORT_SYMBOL_GPL(snd_soc_platform_trigger);
2222
2223#ifdef CONFIG_DEBUG_FS
2224static char *dpcm_state_string(enum snd_soc_dpcm_state state)
2225{
2226	switch (state) {
2227	case SND_SOC_DPCM_STATE_NEW:
2228		return "new";
2229	case SND_SOC_DPCM_STATE_OPEN:
2230		return "open";
2231	case SND_SOC_DPCM_STATE_HW_PARAMS:
2232		return "hw_params";
2233	case SND_SOC_DPCM_STATE_PREPARE:
2234		return "prepare";
2235	case SND_SOC_DPCM_STATE_START:
2236		return "start";
2237	case SND_SOC_DPCM_STATE_STOP:
2238		return "stop";
2239	case SND_SOC_DPCM_STATE_SUSPEND:
2240		return "suspend";
2241	case SND_SOC_DPCM_STATE_PAUSED:
2242		return "paused";
2243	case SND_SOC_DPCM_STATE_HW_FREE:
2244		return "hw_free";
2245	case SND_SOC_DPCM_STATE_CLOSE:
2246		return "close";
2247	}
2248
2249	return "unknown";
2250}
2251
2252static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
2253				int stream, char *buf, size_t size)
2254{
2255	struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
2256	struct snd_soc_dpcm *dpcm;
2257	ssize_t offset = 0;
2258
2259	/* FE state */
2260	offset += snprintf(buf + offset, size - offset,
2261			"[%s - %s]\n", fe->dai_link->name,
2262			stream ? "Capture" : "Playback");
2263
2264	offset += snprintf(buf + offset, size - offset, "State: %s\n",
2265	                dpcm_state_string(fe->dpcm[stream].state));
2266
2267	if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
2268	    (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
2269		offset += snprintf(buf + offset, size - offset,
2270				"Hardware Params: "
2271				"Format = %s, Channels = %d, Rate = %d\n",
2272				snd_pcm_format_name(params_format(params)),
2273				params_channels(params),
2274				params_rate(params));
2275
2276	/* BEs state */
2277	offset += snprintf(buf + offset, size - offset, "Backends:\n");
2278
2279	if (list_empty(&fe->dpcm[stream].be_clients)) {
2280		offset += snprintf(buf + offset, size - offset,
2281				" No active DSP links\n");
2282		goto out;
2283	}
2284
2285	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
2286		struct snd_soc_pcm_runtime *be = dpcm->be;
2287		params = &dpcm->hw_params;
2288
2289		offset += snprintf(buf + offset, size - offset,
2290				"- %s\n", be->dai_link->name);
2291
2292		offset += snprintf(buf + offset, size - offset,
2293				"   State: %s\n",
2294				dpcm_state_string(be->dpcm[stream].state));
2295
2296		if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
2297		    (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
2298			offset += snprintf(buf + offset, size - offset,
2299				"   Hardware Params: "
2300				"Format = %s, Channels = %d, Rate = %d\n",
2301				snd_pcm_format_name(params_format(params)),
2302				params_channels(params),
2303				params_rate(params));
2304	}
2305
2306out:
2307	return offset;
2308}
2309
2310static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf,
2311				size_t count, loff_t *ppos)
2312{
2313	struct snd_soc_pcm_runtime *fe = file->private_data;
2314	ssize_t out_count = PAGE_SIZE, offset = 0, ret = 0;
2315	char *buf;
2316
2317	buf = kmalloc(out_count, GFP_KERNEL);
2318	if (!buf)
2319		return -ENOMEM;
2320
2321	if (fe->cpu_dai->driver->playback.channels_min)
2322		offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_PLAYBACK,
2323					buf + offset, out_count - offset);
2324
2325	if (fe->cpu_dai->driver->capture.channels_min)
2326		offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_CAPTURE,
2327					buf + offset, out_count - offset);
2328
2329	ret = simple_read_from_buffer(user_buf, count, ppos, buf, offset);
2330
2331	kfree(buf);
2332	return ret;
2333}
2334
2335static const struct file_operations dpcm_state_fops = {
2336	.open = simple_open,
2337	.read = dpcm_state_read_file,
2338	.llseek = default_llseek,
2339};
2340
2341int soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
2342{
2343	if (!rtd->dai_link)
2344		return 0;
2345
2346	rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name,
2347			rtd->card->debugfs_card_root);
2348	if (!rtd->debugfs_dpcm_root) {
2349		dev_dbg(rtd->dev,
2350			 "ASoC: Failed to create dpcm debugfs directory %s\n",
2351			 rtd->dai_link->name);
2352		return -EINVAL;
2353	}
2354
2355	rtd->debugfs_dpcm_state = debugfs_create_file("state", 0444,
2356						rtd->debugfs_dpcm_root,
2357						rtd, &dpcm_state_fops);
2358
2359	return 0;
2360}
2361#endif