1 // SPDX-License-Identifier: GPL-2.0+ 2 // 3 // soc-pcm.c -- ALSA SoC PCM 4 // 5 // Copyright 2005 Wolfson Microelectronics PLC. 6 // Copyright 2005 Openedhand Ltd. 7 // Copyright (C) 2010 Slimlogic Ltd. 8 // Copyright (C) 2010 Texas Instruments Inc. 9 // 10 // Authors: Liam Girdwood <lrg@ti.com> 11 // Mark Brown <broonie@opensource.wolfsonmicro.com> 12 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <linux/delay.h> 16 #include <linux/pinctrl/consumer.h> 17 #include <linux/pm_runtime.h> 18 #include <linux/slab.h> 19 #include <linux/workqueue.h> 20 #include <linux/export.h> 21 #include <linux/debugfs.h> 22 #include <sound/core.h> 23 #include <sound/pcm.h> 24 #include <sound/pcm_params.h> 25 #include <sound/soc.h> 26 #include <sound/soc-dpcm.h> 27 #include <sound/initval.h> 28 29 #define DPCM_MAX_BE_USERS 8 30 31 static int soc_rtd_startup(struct snd_soc_pcm_runtime *rtd, 32 struct snd_pcm_substream *substream) 33 { 34 if (rtd->dai_link->ops && 35 rtd->dai_link->ops->startup) 36 return rtd->dai_link->ops->startup(substream); 37 return 0; 38 } 39 40 static void soc_rtd_shutdown(struct snd_soc_pcm_runtime *rtd, 41 struct snd_pcm_substream *substream) 42 { 43 if (rtd->dai_link->ops && 44 rtd->dai_link->ops->shutdown) 45 rtd->dai_link->ops->shutdown(substream); 46 } 47 48 static int soc_rtd_prepare(struct snd_soc_pcm_runtime *rtd, 49 struct snd_pcm_substream *substream) 50 { 51 if (rtd->dai_link->ops && 52 rtd->dai_link->ops->prepare) 53 return rtd->dai_link->ops->prepare(substream); 54 return 0; 55 } 56 57 static int soc_rtd_hw_params(struct snd_soc_pcm_runtime *rtd, 58 struct snd_pcm_substream *substream, 59 struct snd_pcm_hw_params *params) 60 { 61 if (rtd->dai_link->ops && 62 rtd->dai_link->ops->hw_params) 63 return rtd->dai_link->ops->hw_params(substream, params); 64 return 0; 65 } 66 67 static void soc_rtd_hw_free(struct snd_soc_pcm_runtime *rtd, 68 struct snd_pcm_substream *substream) 69 { 70 if (rtd->dai_link->ops && 71 rtd->dai_link->ops->hw_free) 72 rtd->dai_link->ops->hw_free(substream); 73 } 74 75 static int soc_rtd_trigger(struct snd_soc_pcm_runtime *rtd, 76 struct snd_pcm_substream *substream, 77 int cmd) 78 { 79 if (rtd->dai_link->ops && 80 rtd->dai_link->ops->trigger) 81 return rtd->dai_link->ops->trigger(substream, cmd); 82 return 0; 83 } 84 85 /** 86 * snd_soc_runtime_activate() - Increment active count for PCM runtime components 87 * @rtd: ASoC PCM runtime that is activated 88 * @stream: Direction of the PCM stream 89 * 90 * Increments the active count for all the DAIs and components attached to a PCM 91 * runtime. Should typically be called when a stream is opened. 92 * 93 * Must be called with the rtd->card->pcm_mutex being held 94 */ 95 void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream) 96 { 97 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 98 struct snd_soc_dai *codec_dai; 99 int i; 100 101 lockdep_assert_held(&rtd->card->pcm_mutex); 102 103 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 104 cpu_dai->playback_active++; 105 for_each_rtd_codec_dai(rtd, i, codec_dai) 106 codec_dai->playback_active++; 107 } else { 108 cpu_dai->capture_active++; 109 for_each_rtd_codec_dai(rtd, i, codec_dai) 110 codec_dai->capture_active++; 111 } 112 113 cpu_dai->active++; 114 cpu_dai->component->active++; 115 for_each_rtd_codec_dai(rtd, i, codec_dai) { 116 codec_dai->active++; 117 codec_dai->component->active++; 118 } 119 } 120 121 /** 122 * snd_soc_runtime_deactivate() - Decrement active count for PCM runtime components 123 * @rtd: ASoC PCM runtime that is deactivated 124 * @stream: Direction of the PCM stream 125 * 126 * Decrements the active count for all the DAIs and components attached to a PCM 127 * runtime. Should typically be called when a stream is closed. 128 * 129 * Must be called with the rtd->card->pcm_mutex being held 130 */ 131 void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream) 132 { 133 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 134 struct snd_soc_dai *codec_dai; 135 int i; 136 137 lockdep_assert_held(&rtd->card->pcm_mutex); 138 139 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 140 cpu_dai->playback_active--; 141 for_each_rtd_codec_dai(rtd, i, codec_dai) 142 codec_dai->playback_active--; 143 } else { 144 cpu_dai->capture_active--; 145 for_each_rtd_codec_dai(rtd, i, codec_dai) 146 codec_dai->capture_active--; 147 } 148 149 cpu_dai->active--; 150 cpu_dai->component->active--; 151 for_each_rtd_codec_dai(rtd, i, codec_dai) { 152 codec_dai->component->active--; 153 codec_dai->active--; 154 } 155 } 156 157 /** 158 * snd_soc_runtime_ignore_pmdown_time() - Check whether to ignore the power down delay 159 * @rtd: The ASoC PCM runtime that should be checked. 160 * 161 * This function checks whether the power down delay should be ignored for a 162 * specific PCM runtime. Returns true if the delay is 0, if it the DAI link has 163 * been configured to ignore the delay, or if none of the components benefits 164 * from having the delay. 165 */ 166 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) 167 { 168 struct snd_soc_component *component; 169 bool ignore = true; 170 int i; 171 172 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) 173 return true; 174 175 for_each_rtd_components(rtd, i, component) 176 ignore &= !component->driver->use_pmdown_time; 177 178 return ignore; 179 } 180 181 /** 182 * snd_soc_set_runtime_hwparams - set the runtime hardware parameters 183 * @substream: the pcm substream 184 * @hw: the hardware parameters 185 * 186 * Sets the substream runtime hardware parameters. 187 */ 188 int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, 189 const struct snd_pcm_hardware *hw) 190 { 191 struct snd_pcm_runtime *runtime = substream->runtime; 192 runtime->hw.info = hw->info; 193 runtime->hw.formats = hw->formats; 194 runtime->hw.period_bytes_min = hw->period_bytes_min; 195 runtime->hw.period_bytes_max = hw->period_bytes_max; 196 runtime->hw.periods_min = hw->periods_min; 197 runtime->hw.periods_max = hw->periods_max; 198 runtime->hw.buffer_bytes_max = hw->buffer_bytes_max; 199 runtime->hw.fifo_size = hw->fifo_size; 200 return 0; 201 } 202 EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams); 203 204 /* DPCM stream event, send event to FE and all active BEs. */ 205 int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, 206 int event) 207 { 208 struct snd_soc_dpcm *dpcm; 209 210 for_each_dpcm_be(fe, dir, dpcm) { 211 212 struct snd_soc_pcm_runtime *be = dpcm->be; 213 214 dev_dbg(be->dev, "ASoC: BE %s event %d dir %d\n", 215 be->dai_link->name, event, dir); 216 217 if ((event == SND_SOC_DAPM_STREAM_STOP) && 218 (be->dpcm[dir].users >= 1)) 219 continue; 220 221 snd_soc_dapm_stream_event(be, dir, event); 222 } 223 224 snd_soc_dapm_stream_event(fe, dir, event); 225 226 return 0; 227 } 228 229 static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream, 230 struct snd_soc_dai *soc_dai) 231 { 232 struct snd_soc_pcm_runtime *rtd = substream->private_data; 233 int ret; 234 235 if (soc_dai->rate && (soc_dai->driver->symmetric_rates || 236 rtd->dai_link->symmetric_rates)) { 237 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %dHz rate\n", 238 soc_dai->rate); 239 240 ret = snd_pcm_hw_constraint_single(substream->runtime, 241 SNDRV_PCM_HW_PARAM_RATE, 242 soc_dai->rate); 243 if (ret < 0) { 244 dev_err(soc_dai->dev, 245 "ASoC: Unable to apply rate constraint: %d\n", 246 ret); 247 return ret; 248 } 249 } 250 251 if (soc_dai->channels && (soc_dai->driver->symmetric_channels || 252 rtd->dai_link->symmetric_channels)) { 253 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d channel(s)\n", 254 soc_dai->channels); 255 256 ret = snd_pcm_hw_constraint_single(substream->runtime, 257 SNDRV_PCM_HW_PARAM_CHANNELS, 258 soc_dai->channels); 259 if (ret < 0) { 260 dev_err(soc_dai->dev, 261 "ASoC: Unable to apply channel symmetry constraint: %d\n", 262 ret); 263 return ret; 264 } 265 } 266 267 if (soc_dai->sample_bits && (soc_dai->driver->symmetric_samplebits || 268 rtd->dai_link->symmetric_samplebits)) { 269 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d sample bits\n", 270 soc_dai->sample_bits); 271 272 ret = snd_pcm_hw_constraint_single(substream->runtime, 273 SNDRV_PCM_HW_PARAM_SAMPLE_BITS, 274 soc_dai->sample_bits); 275 if (ret < 0) { 276 dev_err(soc_dai->dev, 277 "ASoC: Unable to apply sample bits symmetry constraint: %d\n", 278 ret); 279 return ret; 280 } 281 } 282 283 return 0; 284 } 285 286 static int soc_pcm_params_symmetry(struct snd_pcm_substream *substream, 287 struct snd_pcm_hw_params *params) 288 { 289 struct snd_soc_pcm_runtime *rtd = substream->private_data; 290 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 291 struct snd_soc_dai *codec_dai; 292 unsigned int rate, channels, sample_bits, symmetry, i; 293 294 rate = params_rate(params); 295 channels = params_channels(params); 296 sample_bits = snd_pcm_format_physical_width(params_format(params)); 297 298 /* reject unmatched parameters when applying symmetry */ 299 symmetry = cpu_dai->driver->symmetric_rates || 300 rtd->dai_link->symmetric_rates; 301 302 for_each_rtd_codec_dai(rtd, i, codec_dai) 303 symmetry |= codec_dai->driver->symmetric_rates; 304 305 if (symmetry && cpu_dai->rate && cpu_dai->rate != rate) { 306 dev_err(rtd->dev, "ASoC: unmatched rate symmetry: %d - %d\n", 307 cpu_dai->rate, rate); 308 return -EINVAL; 309 } 310 311 symmetry = cpu_dai->driver->symmetric_channels || 312 rtd->dai_link->symmetric_channels; 313 314 for_each_rtd_codec_dai(rtd, i, codec_dai) 315 symmetry |= codec_dai->driver->symmetric_channels; 316 317 if (symmetry && cpu_dai->channels && cpu_dai->channels != channels) { 318 dev_err(rtd->dev, "ASoC: unmatched channel symmetry: %d - %d\n", 319 cpu_dai->channels, channels); 320 return -EINVAL; 321 } 322 323 symmetry = cpu_dai->driver->symmetric_samplebits || 324 rtd->dai_link->symmetric_samplebits; 325 326 for_each_rtd_codec_dai(rtd, i, codec_dai) 327 symmetry |= codec_dai->driver->symmetric_samplebits; 328 329 if (symmetry && cpu_dai->sample_bits && cpu_dai->sample_bits != sample_bits) { 330 dev_err(rtd->dev, "ASoC: unmatched sample bits symmetry: %d - %d\n", 331 cpu_dai->sample_bits, sample_bits); 332 return -EINVAL; 333 } 334 335 return 0; 336 } 337 338 static bool soc_pcm_has_symmetry(struct snd_pcm_substream *substream) 339 { 340 struct snd_soc_pcm_runtime *rtd = substream->private_data; 341 struct snd_soc_dai_driver *cpu_driver = rtd->cpu_dai->driver; 342 struct snd_soc_dai_link *link = rtd->dai_link; 343 struct snd_soc_dai *codec_dai; 344 unsigned int symmetry, i; 345 346 symmetry = cpu_driver->symmetric_rates || link->symmetric_rates || 347 cpu_driver->symmetric_channels || link->symmetric_channels || 348 cpu_driver->symmetric_samplebits || link->symmetric_samplebits; 349 350 for_each_rtd_codec_dai(rtd, i, codec_dai) 351 symmetry = symmetry || 352 codec_dai->driver->symmetric_rates || 353 codec_dai->driver->symmetric_channels || 354 codec_dai->driver->symmetric_samplebits; 355 356 return symmetry; 357 } 358 359 static void soc_pcm_set_msb(struct snd_pcm_substream *substream, int bits) 360 { 361 struct snd_soc_pcm_runtime *rtd = substream->private_data; 362 int ret; 363 364 if (!bits) 365 return; 366 367 ret = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 0, bits); 368 if (ret != 0) 369 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", 370 bits, ret); 371 } 372 373 static void soc_pcm_apply_msb(struct snd_pcm_substream *substream) 374 { 375 struct snd_soc_pcm_runtime *rtd = substream->private_data; 376 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 377 struct snd_soc_dai *codec_dai; 378 int i; 379 unsigned int bits = 0, cpu_bits; 380 381 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 382 for_each_rtd_codec_dai(rtd, i, codec_dai) { 383 if (codec_dai->driver->playback.sig_bits == 0) { 384 bits = 0; 385 break; 386 } 387 bits = max(codec_dai->driver->playback.sig_bits, bits); 388 } 389 cpu_bits = cpu_dai->driver->playback.sig_bits; 390 } else { 391 for_each_rtd_codec_dai(rtd, i, codec_dai) { 392 if (codec_dai->driver->capture.sig_bits == 0) { 393 bits = 0; 394 break; 395 } 396 bits = max(codec_dai->driver->capture.sig_bits, bits); 397 } 398 cpu_bits = cpu_dai->driver->capture.sig_bits; 399 } 400 401 soc_pcm_set_msb(substream, bits); 402 soc_pcm_set_msb(substream, cpu_bits); 403 } 404 405 static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream) 406 { 407 struct snd_pcm_runtime *runtime = substream->runtime; 408 struct snd_pcm_hardware *hw = &runtime->hw; 409 struct snd_soc_pcm_runtime *rtd = substream->private_data; 410 struct snd_soc_dai *codec_dai; 411 struct snd_soc_dai_driver *cpu_dai_drv = rtd->cpu_dai->driver; 412 struct snd_soc_dai_driver *codec_dai_drv; 413 struct snd_soc_pcm_stream *codec_stream; 414 struct snd_soc_pcm_stream *cpu_stream; 415 unsigned int chan_min = 0, chan_max = UINT_MAX; 416 unsigned int rate_min = 0, rate_max = UINT_MAX; 417 unsigned int rates = UINT_MAX; 418 u64 formats = ULLONG_MAX; 419 int i; 420 421 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 422 cpu_stream = &cpu_dai_drv->playback; 423 else 424 cpu_stream = &cpu_dai_drv->capture; 425 426 /* first calculate min/max only for CODECs in the DAI link */ 427 for_each_rtd_codec_dai(rtd, i, codec_dai) { 428 429 /* 430 * Skip CODECs which don't support the current stream type. 431 * Otherwise, since the rate, channel, and format values will 432 * zero in that case, we would have no usable settings left, 433 * causing the resulting setup to fail. 434 * At least one CODEC should match, otherwise we should have 435 * bailed out on a higher level, since there would be no 436 * CODEC to support the transfer direction in that case. 437 */ 438 if (!snd_soc_dai_stream_valid(codec_dai, 439 substream->stream)) 440 continue; 441 442 codec_dai_drv = codec_dai->driver; 443 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 444 codec_stream = &codec_dai_drv->playback; 445 else 446 codec_stream = &codec_dai_drv->capture; 447 chan_min = max(chan_min, codec_stream->channels_min); 448 chan_max = min(chan_max, codec_stream->channels_max); 449 rate_min = max(rate_min, codec_stream->rate_min); 450 rate_max = min_not_zero(rate_max, codec_stream->rate_max); 451 formats &= codec_stream->formats; 452 rates = snd_pcm_rate_mask_intersect(codec_stream->rates, rates); 453 } 454 455 /* 456 * chan min/max cannot be enforced if there are multiple CODEC DAIs 457 * connected to a single CPU DAI, use CPU DAI's directly and let 458 * channel allocation be fixed up later 459 */ 460 if (rtd->num_codecs > 1) { 461 chan_min = cpu_stream->channels_min; 462 chan_max = cpu_stream->channels_max; 463 } 464 465 hw->channels_min = max(chan_min, cpu_stream->channels_min); 466 hw->channels_max = min(chan_max, cpu_stream->channels_max); 467 if (hw->formats) 468 hw->formats &= formats & cpu_stream->formats; 469 else 470 hw->formats = formats & cpu_stream->formats; 471 hw->rates = snd_pcm_rate_mask_intersect(rates, cpu_stream->rates); 472 473 snd_pcm_limit_hw_rates(runtime); 474 475 hw->rate_min = max(hw->rate_min, cpu_stream->rate_min); 476 hw->rate_min = max(hw->rate_min, rate_min); 477 hw->rate_max = min_not_zero(hw->rate_max, cpu_stream->rate_max); 478 hw->rate_max = min_not_zero(hw->rate_max, rate_max); 479 } 480 481 static int soc_pcm_components_open(struct snd_pcm_substream *substream, 482 struct snd_soc_component **last) 483 { 484 struct snd_soc_pcm_runtime *rtd = substream->private_data; 485 struct snd_soc_component *component; 486 int i, ret = 0; 487 488 for_each_rtd_components(rtd, i, component) { 489 *last = component; 490 491 ret = snd_soc_component_module_get_when_open(component); 492 if (ret < 0) { 493 dev_err(component->dev, 494 "ASoC: can't get module %s\n", 495 component->name); 496 return ret; 497 } 498 499 ret = snd_soc_component_open(component, substream); 500 if (ret < 0) { 501 dev_err(component->dev, 502 "ASoC: can't open component %s: %d\n", 503 component->name, ret); 504 return ret; 505 } 506 } 507 *last = NULL; 508 return 0; 509 } 510 511 static int soc_pcm_components_close(struct snd_pcm_substream *substream, 512 struct snd_soc_component *last) 513 { 514 struct snd_soc_pcm_runtime *rtd = substream->private_data; 515 struct snd_soc_component *component; 516 int i, ret = 0; 517 518 for_each_rtd_components(rtd, i, component) { 519 if (component == last) 520 break; 521 522 ret |= snd_soc_component_close(component, substream); 523 snd_soc_component_module_put_when_close(component); 524 } 525 526 return ret; 527 } 528 529 /* 530 * Called by ALSA when a PCM substream is opened, the runtime->hw record is 531 * then initialized and any private data can be allocated. This also calls 532 * startup for the cpu DAI, component, machine and codec DAI. 533 */ 534 static int soc_pcm_open(struct snd_pcm_substream *substream) 535 { 536 struct snd_soc_pcm_runtime *rtd = substream->private_data; 537 struct snd_pcm_runtime *runtime = substream->runtime; 538 struct snd_soc_component *component; 539 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 540 struct snd_soc_dai *codec_dai; 541 const char *codec_dai_name = "multicodec"; 542 int i, ret = 0; 543 544 for_each_rtd_components(rtd, i, component) 545 pinctrl_pm_select_default_state(component->dev); 546 547 for_each_rtd_components(rtd, i, component) 548 pm_runtime_get_sync(component->dev); 549 550 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); 551 552 /* startup the audio subsystem */ 553 ret = snd_soc_dai_startup(cpu_dai, substream); 554 if (ret < 0) { 555 dev_err(cpu_dai->dev, "ASoC: can't open interface %s: %d\n", 556 cpu_dai->name, ret); 557 goto out; 558 } 559 560 ret = soc_pcm_components_open(substream, &component); 561 if (ret < 0) 562 goto component_err; 563 564 for_each_rtd_codec_dai(rtd, i, codec_dai) { 565 ret = snd_soc_dai_startup(codec_dai, substream); 566 if (ret < 0) { 567 dev_err(codec_dai->dev, 568 "ASoC: can't open codec %s: %d\n", 569 codec_dai->name, ret); 570 goto codec_dai_err; 571 } 572 573 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 574 codec_dai->tx_mask = 0; 575 else 576 codec_dai->rx_mask = 0; 577 } 578 579 ret = soc_rtd_startup(rtd, substream); 580 if (ret < 0) { 581 pr_err("ASoC: %s startup failed: %d\n", 582 rtd->dai_link->name, ret); 583 goto machine_err; 584 } 585 586 /* Dynamic PCM DAI links compat checks use dynamic capabilities */ 587 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) 588 goto dynamic; 589 590 /* Check that the codec and cpu DAIs are compatible */ 591 soc_pcm_init_runtime_hw(substream); 592 593 if (rtd->num_codecs == 1) 594 codec_dai_name = rtd->codec_dai->name; 595 596 if (soc_pcm_has_symmetry(substream)) 597 runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX; 598 599 ret = -EINVAL; 600 if (!runtime->hw.rates) { 601 printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n", 602 codec_dai_name, cpu_dai->name); 603 goto config_err; 604 } 605 if (!runtime->hw.formats) { 606 printk(KERN_ERR "ASoC: %s <-> %s No matching formats\n", 607 codec_dai_name, cpu_dai->name); 608 goto config_err; 609 } 610 if (!runtime->hw.channels_min || !runtime->hw.channels_max || 611 runtime->hw.channels_min > runtime->hw.channels_max) { 612 printk(KERN_ERR "ASoC: %s <-> %s No matching channels\n", 613 codec_dai_name, cpu_dai->name); 614 goto config_err; 615 } 616 617 soc_pcm_apply_msb(substream); 618 619 /* Symmetry only applies if we've already got an active stream. */ 620 if (cpu_dai->active) { 621 ret = soc_pcm_apply_symmetry(substream, cpu_dai); 622 if (ret != 0) 623 goto config_err; 624 } 625 626 for_each_rtd_codec_dai(rtd, i, codec_dai) { 627 if (codec_dai->active) { 628 ret = soc_pcm_apply_symmetry(substream, codec_dai); 629 if (ret != 0) 630 goto config_err; 631 } 632 } 633 634 pr_debug("ASoC: %s <-> %s info:\n", 635 codec_dai_name, cpu_dai->name); 636 pr_debug("ASoC: rate mask 0x%x\n", runtime->hw.rates); 637 pr_debug("ASoC: min ch %d max ch %d\n", runtime->hw.channels_min, 638 runtime->hw.channels_max); 639 pr_debug("ASoC: min rate %d max rate %d\n", runtime->hw.rate_min, 640 runtime->hw.rate_max); 641 642 dynamic: 643 644 snd_soc_runtime_activate(rtd, substream->stream); 645 646 mutex_unlock(&rtd->card->pcm_mutex); 647 return 0; 648 649 config_err: 650 soc_rtd_shutdown(rtd, substream); 651 652 machine_err: 653 i = rtd->num_codecs; 654 655 codec_dai_err: 656 for_each_rtd_codec_dai_rollback(rtd, i, codec_dai) 657 snd_soc_dai_shutdown(codec_dai, substream); 658 659 component_err: 660 soc_pcm_components_close(substream, component); 661 662 snd_soc_dai_shutdown(cpu_dai, substream); 663 out: 664 mutex_unlock(&rtd->card->pcm_mutex); 665 666 for_each_rtd_components(rtd, i, component) { 667 pm_runtime_mark_last_busy(component->dev); 668 pm_runtime_put_autosuspend(component->dev); 669 } 670 671 for_each_rtd_components(rtd, i, component) 672 if (!component->active) 673 pinctrl_pm_select_sleep_state(component->dev); 674 675 return ret; 676 } 677 678 static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd) 679 { 680 /* 681 * Currently nothing to do for c2c links 682 * Since c2c links are internal nodes in the DAPM graph and 683 * don't interface with the outside world or application layer 684 * we don't have to do any special handling on close. 685 */ 686 } 687 688 /* 689 * Called by ALSA when a PCM substream is closed. Private data can be 690 * freed here. The cpu DAI, codec DAI, machine and components are also 691 * shutdown. 692 */ 693 static int soc_pcm_close(struct snd_pcm_substream *substream) 694 { 695 struct snd_soc_pcm_runtime *rtd = substream->private_data; 696 struct snd_soc_component *component; 697 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 698 struct snd_soc_dai *codec_dai; 699 int i; 700 701 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); 702 703 snd_soc_runtime_deactivate(rtd, substream->stream); 704 705 /* clear the corresponding DAIs rate when inactive */ 706 if (!cpu_dai->active) 707 cpu_dai->rate = 0; 708 709 for_each_rtd_codec_dai(rtd, i, codec_dai) { 710 if (!codec_dai->active) 711 codec_dai->rate = 0; 712 } 713 714 snd_soc_dai_digital_mute(cpu_dai, 1, substream->stream); 715 716 snd_soc_dai_shutdown(cpu_dai, substream); 717 718 for_each_rtd_codec_dai(rtd, i, codec_dai) 719 snd_soc_dai_shutdown(codec_dai, substream); 720 721 soc_rtd_shutdown(rtd, substream); 722 723 soc_pcm_components_close(substream, NULL); 724 725 snd_soc_dapm_stream_stop(rtd, substream->stream); 726 727 mutex_unlock(&rtd->card->pcm_mutex); 728 729 for_each_rtd_components(rtd, i, component) { 730 pm_runtime_mark_last_busy(component->dev); 731 pm_runtime_put_autosuspend(component->dev); 732 } 733 734 for_each_rtd_components(rtd, i, component) 735 if (!component->active) 736 pinctrl_pm_select_sleep_state(component->dev); 737 738 return 0; 739 } 740 741 /* 742 * Called by ALSA when the PCM substream is prepared, can set format, sample 743 * rate, etc. This function is non atomic and can be called multiple times, 744 * it can refer to the runtime info. 745 */ 746 static int soc_pcm_prepare(struct snd_pcm_substream *substream) 747 { 748 struct snd_soc_pcm_runtime *rtd = substream->private_data; 749 struct snd_soc_component *component; 750 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 751 struct snd_soc_dai *codec_dai; 752 int i, ret = 0; 753 754 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); 755 756 ret = soc_rtd_prepare(rtd, substream); 757 if (ret < 0) { 758 dev_err(rtd->card->dev, 759 "ASoC: machine prepare error: %d\n", ret); 760 goto out; 761 } 762 763 for_each_rtd_components(rtd, i, component) { 764 ret = snd_soc_component_prepare(component, substream); 765 if (ret < 0) { 766 dev_err(component->dev, 767 "ASoC: platform prepare error: %d\n", ret); 768 goto out; 769 } 770 } 771 772 for_each_rtd_codec_dai(rtd, i, codec_dai) { 773 ret = snd_soc_dai_prepare(codec_dai, substream); 774 if (ret < 0) { 775 dev_err(codec_dai->dev, 776 "ASoC: codec DAI prepare error: %d\n", 777 ret); 778 goto out; 779 } 780 } 781 782 ret = snd_soc_dai_prepare(cpu_dai, substream); 783 if (ret < 0) { 784 dev_err(cpu_dai->dev, 785 "ASoC: cpu DAI prepare error: %d\n", ret); 786 goto out; 787 } 788 789 /* cancel any delayed stream shutdown that is pending */ 790 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 791 rtd->pop_wait) { 792 rtd->pop_wait = 0; 793 cancel_delayed_work(&rtd->delayed_work); 794 } 795 796 snd_soc_dapm_stream_event(rtd, substream->stream, 797 SND_SOC_DAPM_STREAM_START); 798 799 for_each_rtd_codec_dai(rtd, i, codec_dai) 800 snd_soc_dai_digital_mute(codec_dai, 0, 801 substream->stream); 802 snd_soc_dai_digital_mute(cpu_dai, 0, substream->stream); 803 804 out: 805 mutex_unlock(&rtd->card->pcm_mutex); 806 return ret; 807 } 808 809 static void soc_pcm_codec_params_fixup(struct snd_pcm_hw_params *params, 810 unsigned int mask) 811 { 812 struct snd_interval *interval; 813 int channels = hweight_long(mask); 814 815 interval = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); 816 interval->min = channels; 817 interval->max = channels; 818 } 819 820 static int soc_pcm_components_hw_free(struct snd_pcm_substream *substream, 821 struct snd_soc_component *last) 822 { 823 struct snd_soc_pcm_runtime *rtd = substream->private_data; 824 struct snd_soc_component *component; 825 int i, ret = 0; 826 827 for_each_rtd_components(rtd, i, component) { 828 if (component == last) 829 break; 830 831 ret |= snd_soc_component_hw_free(component, substream); 832 } 833 834 return ret; 835 } 836 837 /* 838 * Called by ALSA when the hardware params are set by application. This 839 * function can also be called multiple times and can allocate buffers 840 * (using snd_pcm_lib_* ). It's non-atomic. 841 */ 842 static int soc_pcm_hw_params(struct snd_pcm_substream *substream, 843 struct snd_pcm_hw_params *params) 844 { 845 struct snd_soc_pcm_runtime *rtd = substream->private_data; 846 struct snd_soc_component *component; 847 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 848 struct snd_soc_dai *codec_dai; 849 int i, ret = 0; 850 851 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); 852 853 ret = soc_pcm_params_symmetry(substream, params); 854 if (ret) 855 goto out; 856 857 ret = soc_rtd_hw_params(rtd, substream, params); 858 if (ret < 0) { 859 dev_err(rtd->card->dev, 860 "ASoC: machine hw_params failed: %d\n", ret); 861 goto out; 862 } 863 864 for_each_rtd_codec_dai(rtd, i, codec_dai) { 865 struct snd_pcm_hw_params codec_params; 866 867 /* 868 * Skip CODECs which don't support the current stream type, 869 * the idea being that if a CODEC is not used for the currently 870 * set up transfer direction, it should not need to be 871 * configured, especially since the configuration used might 872 * not even be supported by that CODEC. There may be cases 873 * however where a CODEC needs to be set up although it is 874 * actually not being used for the transfer, e.g. if a 875 * capture-only CODEC is acting as an LRCLK and/or BCLK master 876 * for the DAI link including a playback-only CODEC. 877 * If this becomes necessary, we will have to augment the 878 * machine driver setup with information on how to act, so 879 * we can do the right thing here. 880 */ 881 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream)) 882 continue; 883 884 /* copy params for each codec */ 885 codec_params = *params; 886 887 /* fixup params based on TDM slot masks */ 888 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 889 codec_dai->tx_mask) 890 soc_pcm_codec_params_fixup(&codec_params, 891 codec_dai->tx_mask); 892 893 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE && 894 codec_dai->rx_mask) 895 soc_pcm_codec_params_fixup(&codec_params, 896 codec_dai->rx_mask); 897 898 ret = snd_soc_dai_hw_params(codec_dai, substream, 899 &codec_params); 900 if(ret < 0) 901 goto codec_err; 902 903 codec_dai->rate = params_rate(&codec_params); 904 codec_dai->channels = params_channels(&codec_params); 905 codec_dai->sample_bits = snd_pcm_format_physical_width( 906 params_format(&codec_params)); 907 908 snd_soc_dapm_update_dai(substream, &codec_params, codec_dai); 909 } 910 911 ret = snd_soc_dai_hw_params(cpu_dai, substream, params); 912 if (ret < 0) 913 goto interface_err; 914 915 /* store the parameters for each DAIs */ 916 cpu_dai->rate = params_rate(params); 917 cpu_dai->channels = params_channels(params); 918 cpu_dai->sample_bits = 919 snd_pcm_format_physical_width(params_format(params)); 920 921 snd_soc_dapm_update_dai(substream, params, cpu_dai); 922 923 for_each_rtd_components(rtd, i, component) { 924 ret = snd_soc_component_hw_params(component, substream, params); 925 if (ret < 0) { 926 dev_err(component->dev, 927 "ASoC: %s hw params failed: %d\n", 928 component->name, ret); 929 goto component_err; 930 } 931 } 932 component = NULL; 933 934 out: 935 mutex_unlock(&rtd->card->pcm_mutex); 936 return ret; 937 938 component_err: 939 soc_pcm_components_hw_free(substream, component); 940 941 snd_soc_dai_hw_free(cpu_dai, substream); 942 cpu_dai->rate = 0; 943 944 interface_err: 945 i = rtd->num_codecs; 946 947 codec_err: 948 for_each_rtd_codec_dai_rollback(rtd, i, codec_dai) { 949 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream)) 950 continue; 951 952 snd_soc_dai_hw_free(codec_dai, substream); 953 codec_dai->rate = 0; 954 } 955 956 soc_rtd_hw_free(rtd, substream); 957 958 mutex_unlock(&rtd->card->pcm_mutex); 959 return ret; 960 } 961 962 /* 963 * Frees resources allocated by hw_params, can be called multiple times 964 */ 965 static int soc_pcm_hw_free(struct snd_pcm_substream *substream) 966 { 967 struct snd_soc_pcm_runtime *rtd = substream->private_data; 968 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 969 struct snd_soc_dai *codec_dai; 970 bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 971 int i; 972 973 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); 974 975 /* clear the corresponding DAIs parameters when going to be inactive */ 976 if (cpu_dai->active == 1) { 977 cpu_dai->rate = 0; 978 cpu_dai->channels = 0; 979 cpu_dai->sample_bits = 0; 980 } 981 982 for_each_rtd_codec_dai(rtd, i, codec_dai) { 983 if (codec_dai->active == 1) { 984 codec_dai->rate = 0; 985 codec_dai->channels = 0; 986 codec_dai->sample_bits = 0; 987 } 988 } 989 990 /* apply codec digital mute */ 991 for_each_rtd_codec_dai(rtd, i, codec_dai) { 992 if ((playback && codec_dai->playback_active == 1) || 993 (!playback && codec_dai->capture_active == 1)) 994 snd_soc_dai_digital_mute(codec_dai, 1, 995 substream->stream); 996 } 997 998 /* free any machine hw params */ 999 soc_rtd_hw_free(rtd, substream); 1000 1001 /* free any component resources */ 1002 soc_pcm_components_hw_free(substream, NULL); 1003 1004 /* now free hw params for the DAIs */ 1005 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1006 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream)) 1007 continue; 1008 1009 snd_soc_dai_hw_free(codec_dai, substream); 1010 } 1011 1012 snd_soc_dai_hw_free(cpu_dai, substream); 1013 1014 mutex_unlock(&rtd->card->pcm_mutex); 1015 return 0; 1016 } 1017 1018 static int soc_pcm_trigger_start(struct snd_pcm_substream *substream, int cmd) 1019 { 1020 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1021 struct snd_soc_component *component; 1022 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1023 struct snd_soc_dai *codec_dai; 1024 int i, ret; 1025 1026 ret = soc_rtd_trigger(rtd, substream, cmd); 1027 if (ret < 0) 1028 return ret; 1029 1030 for_each_rtd_components(rtd, i, component) { 1031 ret = snd_soc_component_trigger(component, substream, cmd); 1032 if (ret < 0) 1033 return ret; 1034 } 1035 1036 ret = snd_soc_dai_trigger(cpu_dai, substream, cmd); 1037 if (ret < 0) 1038 return ret; 1039 1040 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1041 ret = snd_soc_dai_trigger(codec_dai, substream, cmd); 1042 if (ret < 0) 1043 return ret; 1044 } 1045 1046 return 0; 1047 } 1048 1049 static int soc_pcm_trigger_stop(struct snd_pcm_substream *substream, int cmd) 1050 { 1051 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1052 struct snd_soc_component *component; 1053 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1054 struct snd_soc_dai *codec_dai; 1055 int i, ret; 1056 1057 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1058 ret = snd_soc_dai_trigger(codec_dai, substream, cmd); 1059 if (ret < 0) 1060 return ret; 1061 } 1062 1063 ret = snd_soc_dai_trigger(cpu_dai, substream, cmd); 1064 if (ret < 0) 1065 return ret; 1066 1067 for_each_rtd_components(rtd, i, component) { 1068 ret = snd_soc_component_trigger(component, substream, cmd); 1069 if (ret < 0) 1070 return ret; 1071 } 1072 1073 ret = soc_rtd_trigger(rtd, substream, cmd); 1074 if (ret < 0) 1075 return ret; 1076 1077 return 0; 1078 } 1079 1080 static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 1081 { 1082 int ret; 1083 1084 switch (cmd) { 1085 case SNDRV_PCM_TRIGGER_START: 1086 case SNDRV_PCM_TRIGGER_RESUME: 1087 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 1088 ret = soc_pcm_trigger_start(substream, cmd); 1089 break; 1090 case SNDRV_PCM_TRIGGER_STOP: 1091 case SNDRV_PCM_TRIGGER_SUSPEND: 1092 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 1093 ret = soc_pcm_trigger_stop(substream, cmd); 1094 break; 1095 default: 1096 return -EINVAL; 1097 } 1098 1099 return ret; 1100 } 1101 1102 static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream, 1103 int cmd) 1104 { 1105 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1106 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1107 struct snd_soc_dai *codec_dai; 1108 int i, ret; 1109 1110 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1111 ret = snd_soc_dai_bespoke_trigger(codec_dai, substream, cmd); 1112 if (ret < 0) 1113 return ret; 1114 } 1115 1116 ret = snd_soc_dai_bespoke_trigger(cpu_dai, substream, cmd); 1117 if (ret < 0) 1118 return ret; 1119 1120 return 0; 1121 } 1122 /* 1123 * soc level wrapper for pointer callback 1124 * If cpu_dai, codec_dai, component driver has the delay callback, then 1125 * the runtime->delay will be updated accordingly. 1126 */ 1127 static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) 1128 { 1129 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1130 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1131 struct snd_soc_dai *codec_dai; 1132 struct snd_pcm_runtime *runtime = substream->runtime; 1133 snd_pcm_uframes_t offset = 0; 1134 snd_pcm_sframes_t delay = 0; 1135 snd_pcm_sframes_t codec_delay = 0; 1136 int i; 1137 1138 /* clearing the previous total delay */ 1139 runtime->delay = 0; 1140 1141 offset = snd_soc_pcm_component_pointer(substream); 1142 1143 /* base delay if assigned in pointer callback */ 1144 delay = runtime->delay; 1145 1146 delay += snd_soc_dai_delay(cpu_dai, substream); 1147 1148 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1149 codec_delay = max(codec_delay, 1150 snd_soc_dai_delay(codec_dai, substream)); 1151 } 1152 delay += codec_delay; 1153 1154 runtime->delay = delay; 1155 1156 return offset; 1157 } 1158 1159 /* connect a FE and BE */ 1160 static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, 1161 struct snd_soc_pcm_runtime *be, int stream) 1162 { 1163 struct snd_soc_dpcm *dpcm; 1164 unsigned long flags; 1165 #ifdef CONFIG_DEBUG_FS 1166 char *name; 1167 #endif 1168 1169 /* only add new dpcms */ 1170 for_each_dpcm_be(fe, stream, dpcm) { 1171 if (dpcm->be == be && dpcm->fe == fe) 1172 return 0; 1173 } 1174 1175 dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL); 1176 if (!dpcm) 1177 return -ENOMEM; 1178 1179 dpcm->be = be; 1180 dpcm->fe = fe; 1181 be->dpcm[stream].runtime = fe->dpcm[stream].runtime; 1182 dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW; 1183 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 1184 list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients); 1185 list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients); 1186 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 1187 1188 dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n", 1189 stream ? "capture" : "playback", fe->dai_link->name, 1190 stream ? "<-" : "->", be->dai_link->name); 1191 1192 #ifdef CONFIG_DEBUG_FS 1193 name = kasprintf(GFP_KERNEL, "%s:%s", be->dai_link->name, 1194 stream ? "capture" : "playback"); 1195 if (name) { 1196 dpcm->debugfs_state = debugfs_create_dir(name, 1197 fe->debugfs_dpcm_root); 1198 debugfs_create_u32("state", 0644, dpcm->debugfs_state, 1199 &dpcm->state); 1200 kfree(name); 1201 } 1202 #endif 1203 return 1; 1204 } 1205 1206 /* reparent a BE onto another FE */ 1207 static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe, 1208 struct snd_soc_pcm_runtime *be, int stream) 1209 { 1210 struct snd_soc_dpcm *dpcm; 1211 struct snd_pcm_substream *fe_substream, *be_substream; 1212 1213 /* reparent if BE is connected to other FEs */ 1214 if (!be->dpcm[stream].users) 1215 return; 1216 1217 be_substream = snd_soc_dpcm_get_substream(be, stream); 1218 1219 for_each_dpcm_fe(be, stream, dpcm) { 1220 if (dpcm->fe == fe) 1221 continue; 1222 1223 dev_dbg(fe->dev, "reparent %s path %s %s %s\n", 1224 stream ? "capture" : "playback", 1225 dpcm->fe->dai_link->name, 1226 stream ? "<-" : "->", dpcm->be->dai_link->name); 1227 1228 fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream); 1229 be_substream->runtime = fe_substream->runtime; 1230 break; 1231 } 1232 } 1233 1234 /* disconnect a BE and FE */ 1235 void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream) 1236 { 1237 struct snd_soc_dpcm *dpcm, *d; 1238 unsigned long flags; 1239 1240 for_each_dpcm_be_safe(fe, stream, dpcm, d) { 1241 dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n", 1242 stream ? "capture" : "playback", 1243 dpcm->be->dai_link->name); 1244 1245 if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE) 1246 continue; 1247 1248 dev_dbg(fe->dev, "freed DSP %s path %s %s %s\n", 1249 stream ? "capture" : "playback", fe->dai_link->name, 1250 stream ? "<-" : "->", dpcm->be->dai_link->name); 1251 1252 /* BEs still alive need new FE */ 1253 dpcm_be_reparent(fe, dpcm->be, stream); 1254 1255 #ifdef CONFIG_DEBUG_FS 1256 debugfs_remove_recursive(dpcm->debugfs_state); 1257 #endif 1258 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 1259 list_del(&dpcm->list_be); 1260 list_del(&dpcm->list_fe); 1261 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 1262 kfree(dpcm); 1263 } 1264 } 1265 1266 /* get BE for DAI widget and stream */ 1267 static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card, 1268 struct snd_soc_dapm_widget *widget, int stream) 1269 { 1270 struct snd_soc_pcm_runtime *be; 1271 struct snd_soc_dai *dai; 1272 int i; 1273 1274 dev_dbg(card->dev, "ASoC: find BE for widget %s\n", widget->name); 1275 1276 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 1277 for_each_card_rtds(card, be) { 1278 1279 if (!be->dai_link->no_pcm) 1280 continue; 1281 1282 dev_dbg(card->dev, "ASoC: try BE : %s\n", 1283 be->cpu_dai->playback_widget ? 1284 be->cpu_dai->playback_widget->name : "(not set)"); 1285 1286 if (be->cpu_dai->playback_widget == widget) 1287 return be; 1288 1289 for_each_rtd_codec_dai(be, i, dai) { 1290 if (dai->playback_widget == widget) 1291 return be; 1292 } 1293 } 1294 } else { 1295 1296 for_each_card_rtds(card, be) { 1297 1298 if (!be->dai_link->no_pcm) 1299 continue; 1300 1301 dev_dbg(card->dev, "ASoC: try BE %s\n", 1302 be->cpu_dai->capture_widget ? 1303 be->cpu_dai->capture_widget->name : "(not set)"); 1304 1305 if (be->cpu_dai->capture_widget == widget) 1306 return be; 1307 1308 for_each_rtd_codec_dai(be, i, dai) { 1309 if (dai->capture_widget == widget) 1310 return be; 1311 } 1312 } 1313 } 1314 1315 /* dai link name and stream name set correctly ? */ 1316 dev_err(card->dev, "ASoC: can't get %s BE for %s\n", 1317 stream ? "capture" : "playback", widget->name); 1318 return NULL; 1319 } 1320 1321 static inline struct snd_soc_dapm_widget * 1322 dai_get_widget(struct snd_soc_dai *dai, int stream) 1323 { 1324 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1325 return dai->playback_widget; 1326 else 1327 return dai->capture_widget; 1328 } 1329 1330 static int widget_in_list(struct snd_soc_dapm_widget_list *list, 1331 struct snd_soc_dapm_widget *widget) 1332 { 1333 int i; 1334 1335 for (i = 0; i < list->num_widgets; i++) { 1336 if (widget == list->widgets[i]) 1337 return 1; 1338 } 1339 1340 return 0; 1341 } 1342 1343 static bool dpcm_end_walk_at_be(struct snd_soc_dapm_widget *widget, 1344 enum snd_soc_dapm_direction dir) 1345 { 1346 struct snd_soc_card *card = widget->dapm->card; 1347 struct snd_soc_pcm_runtime *rtd; 1348 struct snd_soc_dai *dai; 1349 int i; 1350 1351 if (dir == SND_SOC_DAPM_DIR_OUT) { 1352 for_each_card_rtds(card, rtd) { 1353 if (!rtd->dai_link->no_pcm) 1354 continue; 1355 1356 if (rtd->cpu_dai->playback_widget == widget) 1357 return true; 1358 1359 for_each_rtd_codec_dai(rtd, i, dai) { 1360 if (dai->playback_widget == widget) 1361 return true; 1362 } 1363 } 1364 } else { /* SND_SOC_DAPM_DIR_IN */ 1365 for_each_card_rtds(card, rtd) { 1366 if (!rtd->dai_link->no_pcm) 1367 continue; 1368 1369 if (rtd->cpu_dai->capture_widget == widget) 1370 return true; 1371 1372 for_each_rtd_codec_dai(rtd, i, dai) { 1373 if (dai->capture_widget == widget) 1374 return true; 1375 } 1376 } 1377 } 1378 1379 return false; 1380 } 1381 1382 int dpcm_path_get(struct snd_soc_pcm_runtime *fe, 1383 int stream, struct snd_soc_dapm_widget_list **list) 1384 { 1385 struct snd_soc_dai *cpu_dai = fe->cpu_dai; 1386 int paths; 1387 1388 /* get number of valid DAI paths and their widgets */ 1389 paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list, 1390 dpcm_end_walk_at_be); 1391 1392 dev_dbg(fe->dev, "ASoC: found %d audio %s paths\n", paths, 1393 stream ? "capture" : "playback"); 1394 1395 return paths; 1396 } 1397 1398 static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream, 1399 struct snd_soc_dapm_widget_list **list_) 1400 { 1401 struct snd_soc_dpcm *dpcm; 1402 struct snd_soc_dapm_widget_list *list = *list_; 1403 struct snd_soc_dapm_widget *widget; 1404 struct snd_soc_dai *dai; 1405 int prune = 0; 1406 int do_prune; 1407 1408 /* Destroy any old FE <--> BE connections */ 1409 for_each_dpcm_be(fe, stream, dpcm) { 1410 unsigned int i; 1411 1412 /* is there a valid CPU DAI widget for this BE */ 1413 widget = dai_get_widget(dpcm->be->cpu_dai, stream); 1414 1415 /* prune the BE if it's no longer in our active list */ 1416 if (widget && widget_in_list(list, widget)) 1417 continue; 1418 1419 /* is there a valid CODEC DAI widget for this BE */ 1420 do_prune = 1; 1421 for_each_rtd_codec_dai(dpcm->be, i, dai) { 1422 widget = dai_get_widget(dai, stream); 1423 1424 /* prune the BE if it's no longer in our active list */ 1425 if (widget && widget_in_list(list, widget)) 1426 do_prune = 0; 1427 } 1428 if (!do_prune) 1429 continue; 1430 1431 dev_dbg(fe->dev, "ASoC: pruning %s BE %s for %s\n", 1432 stream ? "capture" : "playback", 1433 dpcm->be->dai_link->name, fe->dai_link->name); 1434 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; 1435 dpcm->be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE; 1436 prune++; 1437 } 1438 1439 dev_dbg(fe->dev, "ASoC: found %d old BE paths for pruning\n", prune); 1440 return prune; 1441 } 1442 1443 static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream, 1444 struct snd_soc_dapm_widget_list **list_) 1445 { 1446 struct snd_soc_card *card = fe->card; 1447 struct snd_soc_dapm_widget_list *list = *list_; 1448 struct snd_soc_pcm_runtime *be; 1449 int i, new = 0, err; 1450 1451 /* Create any new FE <--> BE connections */ 1452 for (i = 0; i < list->num_widgets; i++) { 1453 1454 switch (list->widgets[i]->id) { 1455 case snd_soc_dapm_dai_in: 1456 if (stream != SNDRV_PCM_STREAM_PLAYBACK) 1457 continue; 1458 break; 1459 case snd_soc_dapm_dai_out: 1460 if (stream != SNDRV_PCM_STREAM_CAPTURE) 1461 continue; 1462 break; 1463 default: 1464 continue; 1465 } 1466 1467 /* is there a valid BE rtd for this widget */ 1468 be = dpcm_get_be(card, list->widgets[i], stream); 1469 if (!be) { 1470 dev_err(fe->dev, "ASoC: no BE found for %s\n", 1471 list->widgets[i]->name); 1472 continue; 1473 } 1474 1475 /* make sure BE is a real BE */ 1476 if (!be->dai_link->no_pcm) 1477 continue; 1478 1479 /* don't connect if FE is not running */ 1480 if (!fe->dpcm[stream].runtime && !fe->fe_compr) 1481 continue; 1482 1483 /* newly connected FE and BE */ 1484 err = dpcm_be_connect(fe, be, stream); 1485 if (err < 0) { 1486 dev_err(fe->dev, "ASoC: can't connect %s\n", 1487 list->widgets[i]->name); 1488 break; 1489 } else if (err == 0) /* already connected */ 1490 continue; 1491 1492 /* new */ 1493 be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE; 1494 new++; 1495 } 1496 1497 dev_dbg(fe->dev, "ASoC: found %d new BE paths\n", new); 1498 return new; 1499 } 1500 1501 /* 1502 * Find the corresponding BE DAIs that source or sink audio to this 1503 * FE substream. 1504 */ 1505 int dpcm_process_paths(struct snd_soc_pcm_runtime *fe, 1506 int stream, struct snd_soc_dapm_widget_list **list, int new) 1507 { 1508 if (new) 1509 return dpcm_add_paths(fe, stream, list); 1510 else 1511 return dpcm_prune_paths(fe, stream, list); 1512 } 1513 1514 void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream) 1515 { 1516 struct snd_soc_dpcm *dpcm; 1517 unsigned long flags; 1518 1519 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 1520 for_each_dpcm_be(fe, stream, dpcm) 1521 dpcm->be->dpcm[stream].runtime_update = 1522 SND_SOC_DPCM_UPDATE_NO; 1523 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 1524 } 1525 1526 static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe, 1527 int stream) 1528 { 1529 struct snd_soc_dpcm *dpcm; 1530 1531 /* disable any enabled and non active backends */ 1532 for_each_dpcm_be(fe, stream, dpcm) { 1533 1534 struct snd_soc_pcm_runtime *be = dpcm->be; 1535 struct snd_pcm_substream *be_substream = 1536 snd_soc_dpcm_get_substream(be, stream); 1537 1538 if (be->dpcm[stream].users == 0) 1539 dev_err(be->dev, "ASoC: no users %s at close - state %d\n", 1540 stream ? "capture" : "playback", 1541 be->dpcm[stream].state); 1542 1543 if (--be->dpcm[stream].users != 0) 1544 continue; 1545 1546 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) 1547 continue; 1548 1549 soc_pcm_close(be_substream); 1550 be_substream->runtime = NULL; 1551 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; 1552 } 1553 } 1554 1555 int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream) 1556 { 1557 struct snd_soc_dpcm *dpcm; 1558 int err, count = 0; 1559 1560 /* only startup BE DAIs that are either sinks or sources to this FE DAI */ 1561 for_each_dpcm_be(fe, stream, dpcm) { 1562 1563 struct snd_soc_pcm_runtime *be = dpcm->be; 1564 struct snd_pcm_substream *be_substream = 1565 snd_soc_dpcm_get_substream(be, stream); 1566 1567 if (!be_substream) { 1568 dev_err(be->dev, "ASoC: no backend %s stream\n", 1569 stream ? "capture" : "playback"); 1570 continue; 1571 } 1572 1573 /* is this op for this BE ? */ 1574 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 1575 continue; 1576 1577 /* first time the dpcm is open ? */ 1578 if (be->dpcm[stream].users == DPCM_MAX_BE_USERS) 1579 dev_err(be->dev, "ASoC: too many users %s at open %d\n", 1580 stream ? "capture" : "playback", 1581 be->dpcm[stream].state); 1582 1583 if (be->dpcm[stream].users++ != 0) 1584 continue; 1585 1586 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) && 1587 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE)) 1588 continue; 1589 1590 dev_dbg(be->dev, "ASoC: open %s BE %s\n", 1591 stream ? "capture" : "playback", be->dai_link->name); 1592 1593 be_substream->runtime = be->dpcm[stream].runtime; 1594 err = soc_pcm_open(be_substream); 1595 if (err < 0) { 1596 dev_err(be->dev, "ASoC: BE open failed %d\n", err); 1597 be->dpcm[stream].users--; 1598 if (be->dpcm[stream].users < 0) 1599 dev_err(be->dev, "ASoC: no users %s at unwind %d\n", 1600 stream ? "capture" : "playback", 1601 be->dpcm[stream].state); 1602 1603 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; 1604 goto unwind; 1605 } 1606 1607 be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN; 1608 count++; 1609 } 1610 1611 return count; 1612 1613 unwind: 1614 /* disable any enabled and non active backends */ 1615 for_each_dpcm_be_rollback(fe, stream, dpcm) { 1616 struct snd_soc_pcm_runtime *be = dpcm->be; 1617 struct snd_pcm_substream *be_substream = 1618 snd_soc_dpcm_get_substream(be, stream); 1619 1620 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 1621 continue; 1622 1623 if (be->dpcm[stream].users == 0) 1624 dev_err(be->dev, "ASoC: no users %s at close %d\n", 1625 stream ? "capture" : "playback", 1626 be->dpcm[stream].state); 1627 1628 if (--be->dpcm[stream].users != 0) 1629 continue; 1630 1631 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) 1632 continue; 1633 1634 soc_pcm_close(be_substream); 1635 be_substream->runtime = NULL; 1636 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; 1637 } 1638 1639 return err; 1640 } 1641 1642 static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime, 1643 struct snd_soc_pcm_stream *stream) 1644 { 1645 runtime->hw.rate_min = stream->rate_min; 1646 runtime->hw.rate_max = min_not_zero(stream->rate_max, UINT_MAX); 1647 runtime->hw.channels_min = stream->channels_min; 1648 runtime->hw.channels_max = stream->channels_max; 1649 if (runtime->hw.formats) 1650 runtime->hw.formats &= stream->formats; 1651 else 1652 runtime->hw.formats = stream->formats; 1653 runtime->hw.rates = stream->rates; 1654 } 1655 1656 static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream, 1657 u64 *formats) 1658 { 1659 struct snd_soc_pcm_runtime *fe = substream->private_data; 1660 struct snd_soc_dpcm *dpcm; 1661 struct snd_soc_dai *dai; 1662 int stream = substream->stream; 1663 1664 if (!fe->dai_link->dpcm_merged_format) 1665 return; 1666 1667 /* 1668 * It returns merged BE codec format 1669 * if FE want to use it (= dpcm_merged_format) 1670 */ 1671 1672 for_each_dpcm_be(fe, stream, dpcm) { 1673 struct snd_soc_pcm_runtime *be = dpcm->be; 1674 struct snd_soc_dai_driver *codec_dai_drv; 1675 struct snd_soc_pcm_stream *codec_stream; 1676 int i; 1677 1678 for_each_rtd_codec_dai(be, i, dai) { 1679 /* 1680 * Skip CODECs which don't support the current stream 1681 * type. See soc_pcm_init_runtime_hw() for more details 1682 */ 1683 if (!snd_soc_dai_stream_valid(dai, stream)) 1684 continue; 1685 1686 codec_dai_drv = dai->driver; 1687 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1688 codec_stream = &codec_dai_drv->playback; 1689 else 1690 codec_stream = &codec_dai_drv->capture; 1691 1692 *formats &= codec_stream->formats; 1693 } 1694 } 1695 } 1696 1697 static void dpcm_runtime_merge_chan(struct snd_pcm_substream *substream, 1698 unsigned int *channels_min, 1699 unsigned int *channels_max) 1700 { 1701 struct snd_soc_pcm_runtime *fe = substream->private_data; 1702 struct snd_soc_dpcm *dpcm; 1703 int stream = substream->stream; 1704 1705 if (!fe->dai_link->dpcm_merged_chan) 1706 return; 1707 1708 /* 1709 * It returns merged BE codec channel; 1710 * if FE want to use it (= dpcm_merged_chan) 1711 */ 1712 1713 for_each_dpcm_be(fe, stream, dpcm) { 1714 struct snd_soc_pcm_runtime *be = dpcm->be; 1715 struct snd_soc_dai_driver *cpu_dai_drv = be->cpu_dai->driver; 1716 struct snd_soc_dai_driver *codec_dai_drv; 1717 struct snd_soc_pcm_stream *codec_stream; 1718 struct snd_soc_pcm_stream *cpu_stream; 1719 1720 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1721 cpu_stream = &cpu_dai_drv->playback; 1722 else 1723 cpu_stream = &cpu_dai_drv->capture; 1724 1725 *channels_min = max(*channels_min, cpu_stream->channels_min); 1726 *channels_max = min(*channels_max, cpu_stream->channels_max); 1727 1728 /* 1729 * chan min/max cannot be enforced if there are multiple CODEC 1730 * DAIs connected to a single CPU DAI, use CPU DAI's directly 1731 */ 1732 if (be->num_codecs == 1) { 1733 codec_dai_drv = be->codec_dais[0]->driver; 1734 1735 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1736 codec_stream = &codec_dai_drv->playback; 1737 else 1738 codec_stream = &codec_dai_drv->capture; 1739 1740 *channels_min = max(*channels_min, 1741 codec_stream->channels_min); 1742 *channels_max = min(*channels_max, 1743 codec_stream->channels_max); 1744 } 1745 } 1746 } 1747 1748 static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream, 1749 unsigned int *rates, 1750 unsigned int *rate_min, 1751 unsigned int *rate_max) 1752 { 1753 struct snd_soc_pcm_runtime *fe = substream->private_data; 1754 struct snd_soc_dpcm *dpcm; 1755 int stream = substream->stream; 1756 1757 if (!fe->dai_link->dpcm_merged_rate) 1758 return; 1759 1760 /* 1761 * It returns merged BE codec channel; 1762 * if FE want to use it (= dpcm_merged_chan) 1763 */ 1764 1765 for_each_dpcm_be(fe, stream, dpcm) { 1766 struct snd_soc_pcm_runtime *be = dpcm->be; 1767 struct snd_soc_dai_driver *cpu_dai_drv = be->cpu_dai->driver; 1768 struct snd_soc_dai_driver *codec_dai_drv; 1769 struct snd_soc_pcm_stream *codec_stream; 1770 struct snd_soc_pcm_stream *cpu_stream; 1771 struct snd_soc_dai *dai; 1772 int i; 1773 1774 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1775 cpu_stream = &cpu_dai_drv->playback; 1776 else 1777 cpu_stream = &cpu_dai_drv->capture; 1778 1779 *rate_min = max(*rate_min, cpu_stream->rate_min); 1780 *rate_max = min_not_zero(*rate_max, cpu_stream->rate_max); 1781 *rates = snd_pcm_rate_mask_intersect(*rates, cpu_stream->rates); 1782 1783 for_each_rtd_codec_dai(be, i, dai) { 1784 /* 1785 * Skip CODECs which don't support the current stream 1786 * type. See soc_pcm_init_runtime_hw() for more details 1787 */ 1788 if (!snd_soc_dai_stream_valid(dai, stream)) 1789 continue; 1790 1791 codec_dai_drv = dai->driver; 1792 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1793 codec_stream = &codec_dai_drv->playback; 1794 else 1795 codec_stream = &codec_dai_drv->capture; 1796 1797 *rate_min = max(*rate_min, codec_stream->rate_min); 1798 *rate_max = min_not_zero(*rate_max, 1799 codec_stream->rate_max); 1800 *rates = snd_pcm_rate_mask_intersect(*rates, 1801 codec_stream->rates); 1802 } 1803 } 1804 } 1805 1806 static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream) 1807 { 1808 struct snd_pcm_runtime *runtime = substream->runtime; 1809 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1810 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1811 struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver; 1812 1813 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 1814 dpcm_init_runtime_hw(runtime, &cpu_dai_drv->playback); 1815 else 1816 dpcm_init_runtime_hw(runtime, &cpu_dai_drv->capture); 1817 1818 dpcm_runtime_merge_format(substream, &runtime->hw.formats); 1819 dpcm_runtime_merge_chan(substream, &runtime->hw.channels_min, 1820 &runtime->hw.channels_max); 1821 dpcm_runtime_merge_rate(substream, &runtime->hw.rates, 1822 &runtime->hw.rate_min, &runtime->hw.rate_max); 1823 } 1824 1825 static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd); 1826 1827 /* Set FE's runtime_update state; the state is protected via PCM stream lock 1828 * for avoiding the race with trigger callback. 1829 * If the state is unset and a trigger is pending while the previous operation, 1830 * process the pending trigger action here. 1831 */ 1832 static void dpcm_set_fe_update_state(struct snd_soc_pcm_runtime *fe, 1833 int stream, enum snd_soc_dpcm_update state) 1834 { 1835 struct snd_pcm_substream *substream = 1836 snd_soc_dpcm_get_substream(fe, stream); 1837 1838 snd_pcm_stream_lock_irq(substream); 1839 if (state == SND_SOC_DPCM_UPDATE_NO && fe->dpcm[stream].trigger_pending) { 1840 dpcm_fe_dai_do_trigger(substream, 1841 fe->dpcm[stream].trigger_pending - 1); 1842 fe->dpcm[stream].trigger_pending = 0; 1843 } 1844 fe->dpcm[stream].runtime_update = state; 1845 snd_pcm_stream_unlock_irq(substream); 1846 } 1847 1848 static int dpcm_apply_symmetry(struct snd_pcm_substream *fe_substream, 1849 int stream) 1850 { 1851 struct snd_soc_dpcm *dpcm; 1852 struct snd_soc_pcm_runtime *fe = fe_substream->private_data; 1853 struct snd_soc_dai *fe_cpu_dai = fe->cpu_dai; 1854 int err; 1855 1856 /* apply symmetry for FE */ 1857 if (soc_pcm_has_symmetry(fe_substream)) 1858 fe_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX; 1859 1860 /* Symmetry only applies if we've got an active stream. */ 1861 if (fe_cpu_dai->active) { 1862 err = soc_pcm_apply_symmetry(fe_substream, fe_cpu_dai); 1863 if (err < 0) 1864 return err; 1865 } 1866 1867 /* apply symmetry for BE */ 1868 for_each_dpcm_be(fe, stream, dpcm) { 1869 struct snd_soc_pcm_runtime *be = dpcm->be; 1870 struct snd_pcm_substream *be_substream = 1871 snd_soc_dpcm_get_substream(be, stream); 1872 struct snd_soc_pcm_runtime *rtd; 1873 struct snd_soc_dai *codec_dai; 1874 int i; 1875 1876 /* A backend may not have the requested substream */ 1877 if (!be_substream) 1878 continue; 1879 1880 rtd = be_substream->private_data; 1881 if (rtd->dai_link->be_hw_params_fixup) 1882 continue; 1883 1884 if (soc_pcm_has_symmetry(be_substream)) 1885 be_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX; 1886 1887 /* Symmetry only applies if we've got an active stream. */ 1888 if (rtd->cpu_dai->active) { 1889 err = soc_pcm_apply_symmetry(fe_substream, 1890 rtd->cpu_dai); 1891 if (err < 0) 1892 return err; 1893 } 1894 1895 for_each_rtd_codec_dai(rtd, i, codec_dai) { 1896 if (codec_dai->active) { 1897 err = soc_pcm_apply_symmetry(fe_substream, 1898 codec_dai); 1899 if (err < 0) 1900 return err; 1901 } 1902 } 1903 } 1904 1905 return 0; 1906 } 1907 1908 static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream) 1909 { 1910 struct snd_soc_pcm_runtime *fe = fe_substream->private_data; 1911 struct snd_pcm_runtime *runtime = fe_substream->runtime; 1912 int stream = fe_substream->stream, ret = 0; 1913 1914 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 1915 1916 ret = dpcm_be_dai_startup(fe, fe_substream->stream); 1917 if (ret < 0) { 1918 dev_err(fe->dev,"ASoC: failed to start some BEs %d\n", ret); 1919 goto be_err; 1920 } 1921 1922 dev_dbg(fe->dev, "ASoC: open FE %s\n", fe->dai_link->name); 1923 1924 /* start the DAI frontend */ 1925 ret = soc_pcm_open(fe_substream); 1926 if (ret < 0) { 1927 dev_err(fe->dev,"ASoC: failed to start FE %d\n", ret); 1928 goto unwind; 1929 } 1930 1931 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN; 1932 1933 dpcm_set_fe_runtime(fe_substream); 1934 snd_pcm_limit_hw_rates(runtime); 1935 1936 ret = dpcm_apply_symmetry(fe_substream, stream); 1937 if (ret < 0) { 1938 dev_err(fe->dev, "ASoC: failed to apply dpcm symmetry %d\n", 1939 ret); 1940 goto unwind; 1941 } 1942 1943 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 1944 return 0; 1945 1946 unwind: 1947 dpcm_be_dai_startup_unwind(fe, fe_substream->stream); 1948 be_err: 1949 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 1950 return ret; 1951 } 1952 1953 int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream) 1954 { 1955 struct snd_soc_dpcm *dpcm; 1956 1957 /* only shutdown BEs that are either sinks or sources to this FE DAI */ 1958 for_each_dpcm_be(fe, stream, dpcm) { 1959 1960 struct snd_soc_pcm_runtime *be = dpcm->be; 1961 struct snd_pcm_substream *be_substream = 1962 snd_soc_dpcm_get_substream(be, stream); 1963 1964 /* is this op for this BE ? */ 1965 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 1966 continue; 1967 1968 if (be->dpcm[stream].users == 0) 1969 dev_err(be->dev, "ASoC: no users %s at close - state %d\n", 1970 stream ? "capture" : "playback", 1971 be->dpcm[stream].state); 1972 1973 if (--be->dpcm[stream].users != 0) 1974 continue; 1975 1976 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) && 1977 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)) { 1978 soc_pcm_hw_free(be_substream); 1979 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE; 1980 } 1981 1982 dev_dbg(be->dev, "ASoC: close BE %s\n", 1983 be->dai_link->name); 1984 1985 soc_pcm_close(be_substream); 1986 be_substream->runtime = NULL; 1987 1988 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; 1989 } 1990 return 0; 1991 } 1992 1993 static int dpcm_fe_dai_shutdown(struct snd_pcm_substream *substream) 1994 { 1995 struct snd_soc_pcm_runtime *fe = substream->private_data; 1996 int stream = substream->stream; 1997 1998 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 1999 2000 /* shutdown the BEs */ 2001 dpcm_be_dai_shutdown(fe, substream->stream); 2002 2003 dev_dbg(fe->dev, "ASoC: close FE %s\n", fe->dai_link->name); 2004 2005 /* now shutdown the frontend */ 2006 soc_pcm_close(substream); 2007 2008 /* run the stream event for each BE */ 2009 snd_soc_dapm_stream_stop(fe, stream); 2010 2011 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; 2012 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2013 return 0; 2014 } 2015 2016 int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream) 2017 { 2018 struct snd_soc_dpcm *dpcm; 2019 2020 /* only hw_params backends that are either sinks or sources 2021 * to this frontend DAI */ 2022 for_each_dpcm_be(fe, stream, dpcm) { 2023 2024 struct snd_soc_pcm_runtime *be = dpcm->be; 2025 struct snd_pcm_substream *be_substream = 2026 snd_soc_dpcm_get_substream(be, stream); 2027 2028 /* is this op for this BE ? */ 2029 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 2030 continue; 2031 2032 /* only free hw when no longer used - check all FEs */ 2033 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) 2034 continue; 2035 2036 /* do not free hw if this BE is used by other FE */ 2037 if (be->dpcm[stream].users > 1) 2038 continue; 2039 2040 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 2041 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) && 2042 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) && 2043 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) && 2044 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) && 2045 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND)) 2046 continue; 2047 2048 dev_dbg(be->dev, "ASoC: hw_free BE %s\n", 2049 be->dai_link->name); 2050 2051 soc_pcm_hw_free(be_substream); 2052 2053 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE; 2054 } 2055 2056 return 0; 2057 } 2058 2059 static int dpcm_fe_dai_hw_free(struct snd_pcm_substream *substream) 2060 { 2061 struct snd_soc_pcm_runtime *fe = substream->private_data; 2062 int err, stream = substream->stream; 2063 2064 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2065 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 2066 2067 dev_dbg(fe->dev, "ASoC: hw_free FE %s\n", fe->dai_link->name); 2068 2069 /* call hw_free on the frontend */ 2070 err = soc_pcm_hw_free(substream); 2071 if (err < 0) 2072 dev_err(fe->dev,"ASoC: hw_free FE %s failed\n", 2073 fe->dai_link->name); 2074 2075 /* only hw_params backends that are either sinks or sources 2076 * to this frontend DAI */ 2077 err = dpcm_be_dai_hw_free(fe, stream); 2078 2079 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE; 2080 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2081 2082 mutex_unlock(&fe->card->mutex); 2083 return 0; 2084 } 2085 2086 int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream) 2087 { 2088 struct snd_soc_dpcm *dpcm; 2089 int ret; 2090 2091 for_each_dpcm_be(fe, stream, dpcm) { 2092 2093 struct snd_soc_pcm_runtime *be = dpcm->be; 2094 struct snd_pcm_substream *be_substream = 2095 snd_soc_dpcm_get_substream(be, stream); 2096 2097 /* is this op for this BE ? */ 2098 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 2099 continue; 2100 2101 /* copy params for each dpcm */ 2102 memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params, 2103 sizeof(struct snd_pcm_hw_params)); 2104 2105 /* perform any hw_params fixups */ 2106 if (be->dai_link->be_hw_params_fixup) { 2107 ret = be->dai_link->be_hw_params_fixup(be, 2108 &dpcm->hw_params); 2109 if (ret < 0) { 2110 dev_err(be->dev, 2111 "ASoC: hw_params BE fixup failed %d\n", 2112 ret); 2113 goto unwind; 2114 } 2115 } 2116 2117 /* copy the fixed-up hw params for BE dai */ 2118 memcpy(&be->dpcm[stream].hw_params, &dpcm->hw_params, 2119 sizeof(struct snd_pcm_hw_params)); 2120 2121 /* only allow hw_params() if no connected FEs are running */ 2122 if (!snd_soc_dpcm_can_be_params(fe, be, stream)) 2123 continue; 2124 2125 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) && 2126 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 2127 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE)) 2128 continue; 2129 2130 dev_dbg(be->dev, "ASoC: hw_params BE %s\n", 2131 be->dai_link->name); 2132 2133 ret = soc_pcm_hw_params(be_substream, &dpcm->hw_params); 2134 if (ret < 0) { 2135 dev_err(dpcm->be->dev, 2136 "ASoC: hw_params BE failed %d\n", ret); 2137 goto unwind; 2138 } 2139 2140 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS; 2141 } 2142 return 0; 2143 2144 unwind: 2145 /* disable any enabled and non active backends */ 2146 for_each_dpcm_be_rollback(fe, stream, dpcm) { 2147 struct snd_soc_pcm_runtime *be = dpcm->be; 2148 struct snd_pcm_substream *be_substream = 2149 snd_soc_dpcm_get_substream(be, stream); 2150 2151 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 2152 continue; 2153 2154 /* only allow hw_free() if no connected FEs are running */ 2155 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) 2156 continue; 2157 2158 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) && 2159 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 2160 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) && 2161 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)) 2162 continue; 2163 2164 soc_pcm_hw_free(be_substream); 2165 } 2166 2167 return ret; 2168 } 2169 2170 static int dpcm_fe_dai_hw_params(struct snd_pcm_substream *substream, 2171 struct snd_pcm_hw_params *params) 2172 { 2173 struct snd_soc_pcm_runtime *fe = substream->private_data; 2174 int ret, stream = substream->stream; 2175 2176 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2177 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 2178 2179 memcpy(&fe->dpcm[substream->stream].hw_params, params, 2180 sizeof(struct snd_pcm_hw_params)); 2181 ret = dpcm_be_dai_hw_params(fe, substream->stream); 2182 if (ret < 0) { 2183 dev_err(fe->dev,"ASoC: hw_params BE failed %d\n", ret); 2184 goto out; 2185 } 2186 2187 dev_dbg(fe->dev, "ASoC: hw_params FE %s rate %d chan %x fmt %d\n", 2188 fe->dai_link->name, params_rate(params), 2189 params_channels(params), params_format(params)); 2190 2191 /* call hw_params on the frontend */ 2192 ret = soc_pcm_hw_params(substream, params); 2193 if (ret < 0) { 2194 dev_err(fe->dev,"ASoC: hw_params FE failed %d\n", ret); 2195 dpcm_be_dai_hw_free(fe, stream); 2196 } else 2197 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS; 2198 2199 out: 2200 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2201 mutex_unlock(&fe->card->mutex); 2202 return ret; 2203 } 2204 2205 static int dpcm_do_trigger(struct snd_soc_dpcm *dpcm, 2206 struct snd_pcm_substream *substream, int cmd) 2207 { 2208 int ret; 2209 2210 dev_dbg(dpcm->be->dev, "ASoC: trigger BE %s cmd %d\n", 2211 dpcm->be->dai_link->name, cmd); 2212 2213 ret = soc_pcm_trigger(substream, cmd); 2214 if (ret < 0) 2215 dev_err(dpcm->be->dev,"ASoC: trigger BE failed %d\n", ret); 2216 2217 return ret; 2218 } 2219 2220 int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, 2221 int cmd) 2222 { 2223 struct snd_soc_dpcm *dpcm; 2224 int ret = 0; 2225 2226 for_each_dpcm_be(fe, stream, dpcm) { 2227 2228 struct snd_soc_pcm_runtime *be = dpcm->be; 2229 struct snd_pcm_substream *be_substream = 2230 snd_soc_dpcm_get_substream(be, stream); 2231 2232 /* is this op for this BE ? */ 2233 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 2234 continue; 2235 2236 switch (cmd) { 2237 case SNDRV_PCM_TRIGGER_START: 2238 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) && 2239 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)) 2240 continue; 2241 2242 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2243 if (ret) 2244 return ret; 2245 2246 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START; 2247 break; 2248 case SNDRV_PCM_TRIGGER_RESUME: 2249 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND)) 2250 continue; 2251 2252 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2253 if (ret) 2254 return ret; 2255 2256 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START; 2257 break; 2258 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 2259 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) 2260 continue; 2261 2262 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2263 if (ret) 2264 return ret; 2265 2266 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START; 2267 break; 2268 case SNDRV_PCM_TRIGGER_STOP: 2269 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) 2270 continue; 2271 2272 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) 2273 continue; 2274 2275 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2276 if (ret) 2277 return ret; 2278 2279 be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP; 2280 break; 2281 case SNDRV_PCM_TRIGGER_SUSPEND: 2282 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) 2283 continue; 2284 2285 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) 2286 continue; 2287 2288 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2289 if (ret) 2290 return ret; 2291 2292 be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND; 2293 break; 2294 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 2295 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) 2296 continue; 2297 2298 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) 2299 continue; 2300 2301 ret = dpcm_do_trigger(dpcm, be_substream, cmd); 2302 if (ret) 2303 return ret; 2304 2305 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED; 2306 break; 2307 } 2308 } 2309 2310 return ret; 2311 } 2312 EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger); 2313 2314 static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream, 2315 int cmd, bool fe_first) 2316 { 2317 struct snd_soc_pcm_runtime *fe = substream->private_data; 2318 int ret; 2319 2320 /* call trigger on the frontend before the backend. */ 2321 if (fe_first) { 2322 dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n", 2323 fe->dai_link->name, cmd); 2324 2325 ret = soc_pcm_trigger(substream, cmd); 2326 if (ret < 0) 2327 return ret; 2328 2329 ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); 2330 return ret; 2331 } 2332 2333 /* call trigger on the frontend after the backend. */ 2334 ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); 2335 if (ret < 0) 2336 return ret; 2337 2338 dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n", 2339 fe->dai_link->name, cmd); 2340 2341 ret = soc_pcm_trigger(substream, cmd); 2342 2343 return ret; 2344 } 2345 2346 static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd) 2347 { 2348 struct snd_soc_pcm_runtime *fe = substream->private_data; 2349 int stream = substream->stream; 2350 int ret = 0; 2351 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream]; 2352 2353 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; 2354 2355 switch (trigger) { 2356 case SND_SOC_DPCM_TRIGGER_PRE: 2357 switch (cmd) { 2358 case SNDRV_PCM_TRIGGER_START: 2359 case SNDRV_PCM_TRIGGER_RESUME: 2360 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 2361 ret = dpcm_dai_trigger_fe_be(substream, cmd, true); 2362 break; 2363 case SNDRV_PCM_TRIGGER_STOP: 2364 case SNDRV_PCM_TRIGGER_SUSPEND: 2365 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 2366 ret = dpcm_dai_trigger_fe_be(substream, cmd, false); 2367 break; 2368 default: 2369 ret = -EINVAL; 2370 break; 2371 } 2372 break; 2373 case SND_SOC_DPCM_TRIGGER_POST: 2374 switch (cmd) { 2375 case SNDRV_PCM_TRIGGER_START: 2376 case SNDRV_PCM_TRIGGER_RESUME: 2377 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 2378 ret = dpcm_dai_trigger_fe_be(substream, cmd, false); 2379 break; 2380 case SNDRV_PCM_TRIGGER_STOP: 2381 case SNDRV_PCM_TRIGGER_SUSPEND: 2382 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 2383 ret = dpcm_dai_trigger_fe_be(substream, cmd, true); 2384 break; 2385 default: 2386 ret = -EINVAL; 2387 break; 2388 } 2389 break; 2390 case SND_SOC_DPCM_TRIGGER_BESPOKE: 2391 /* bespoke trigger() - handles both FE and BEs */ 2392 2393 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd %d\n", 2394 fe->dai_link->name, cmd); 2395 2396 ret = soc_pcm_bespoke_trigger(substream, cmd); 2397 break; 2398 default: 2399 dev_err(fe->dev, "ASoC: invalid trigger cmd %d for %s\n", cmd, 2400 fe->dai_link->name); 2401 ret = -EINVAL; 2402 goto out; 2403 } 2404 2405 if (ret < 0) { 2406 dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n", 2407 cmd, ret); 2408 goto out; 2409 } 2410 2411 switch (cmd) { 2412 case SNDRV_PCM_TRIGGER_START: 2413 case SNDRV_PCM_TRIGGER_RESUME: 2414 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 2415 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START; 2416 break; 2417 case SNDRV_PCM_TRIGGER_STOP: 2418 case SNDRV_PCM_TRIGGER_SUSPEND: 2419 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP; 2420 break; 2421 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 2422 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED; 2423 break; 2424 } 2425 2426 out: 2427 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; 2428 return ret; 2429 } 2430 2431 static int dpcm_fe_dai_trigger(struct snd_pcm_substream *substream, int cmd) 2432 { 2433 struct snd_soc_pcm_runtime *fe = substream->private_data; 2434 int stream = substream->stream; 2435 2436 /* if FE's runtime_update is already set, we're in race; 2437 * process this trigger later at exit 2438 */ 2439 if (fe->dpcm[stream].runtime_update != SND_SOC_DPCM_UPDATE_NO) { 2440 fe->dpcm[stream].trigger_pending = cmd + 1; 2441 return 0; /* delayed, assuming it's successful */ 2442 } 2443 2444 /* we're alone, let's trigger */ 2445 return dpcm_fe_dai_do_trigger(substream, cmd); 2446 } 2447 2448 int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream) 2449 { 2450 struct snd_soc_dpcm *dpcm; 2451 int ret = 0; 2452 2453 for_each_dpcm_be(fe, stream, dpcm) { 2454 2455 struct snd_soc_pcm_runtime *be = dpcm->be; 2456 struct snd_pcm_substream *be_substream = 2457 snd_soc_dpcm_get_substream(be, stream); 2458 2459 /* is this op for this BE ? */ 2460 if (!snd_soc_dpcm_be_can_update(fe, be, stream)) 2461 continue; 2462 2463 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 2464 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) && 2465 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) && 2466 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) 2467 continue; 2468 2469 dev_dbg(be->dev, "ASoC: prepare BE %s\n", 2470 be->dai_link->name); 2471 2472 ret = soc_pcm_prepare(be_substream); 2473 if (ret < 0) { 2474 dev_err(be->dev, "ASoC: backend prepare failed %d\n", 2475 ret); 2476 break; 2477 } 2478 2479 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; 2480 } 2481 return ret; 2482 } 2483 2484 static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream) 2485 { 2486 struct snd_soc_pcm_runtime *fe = substream->private_data; 2487 int stream = substream->stream, ret = 0; 2488 2489 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2490 2491 dev_dbg(fe->dev, "ASoC: prepare FE %s\n", fe->dai_link->name); 2492 2493 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 2494 2495 /* there is no point preparing this FE if there are no BEs */ 2496 if (list_empty(&fe->dpcm[stream].be_clients)) { 2497 dev_err(fe->dev, "ASoC: no backend DAIs enabled for %s\n", 2498 fe->dai_link->name); 2499 ret = -EINVAL; 2500 goto out; 2501 } 2502 2503 ret = dpcm_be_dai_prepare(fe, substream->stream); 2504 if (ret < 0) 2505 goto out; 2506 2507 /* call prepare on the frontend */ 2508 ret = soc_pcm_prepare(substream); 2509 if (ret < 0) { 2510 dev_err(fe->dev,"ASoC: prepare FE %s failed\n", 2511 fe->dai_link->name); 2512 goto out; 2513 } 2514 2515 /* run the stream event for each BE */ 2516 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START); 2517 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; 2518 2519 out: 2520 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2521 mutex_unlock(&fe->card->mutex); 2522 2523 return ret; 2524 } 2525 2526 static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream) 2527 { 2528 struct snd_pcm_substream *substream = 2529 snd_soc_dpcm_get_substream(fe, stream); 2530 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream]; 2531 int err; 2532 2533 dev_dbg(fe->dev, "ASoC: runtime %s close on FE %s\n", 2534 stream ? "capture" : "playback", fe->dai_link->name); 2535 2536 if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) { 2537 /* call bespoke trigger - FE takes care of all BE triggers */ 2538 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd stop\n", 2539 fe->dai_link->name); 2540 2541 err = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_STOP); 2542 if (err < 0) 2543 dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err); 2544 } else { 2545 dev_dbg(fe->dev, "ASoC: trigger FE %s cmd stop\n", 2546 fe->dai_link->name); 2547 2548 err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP); 2549 if (err < 0) 2550 dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err); 2551 } 2552 2553 err = dpcm_be_dai_hw_free(fe, stream); 2554 if (err < 0) 2555 dev_err(fe->dev,"ASoC: hw_free FE failed %d\n", err); 2556 2557 err = dpcm_be_dai_shutdown(fe, stream); 2558 if (err < 0) 2559 dev_err(fe->dev,"ASoC: shutdown FE failed %d\n", err); 2560 2561 /* run the stream event for each BE */ 2562 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP); 2563 2564 return 0; 2565 } 2566 2567 static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream) 2568 { 2569 struct snd_pcm_substream *substream = 2570 snd_soc_dpcm_get_substream(fe, stream); 2571 struct snd_soc_dpcm *dpcm; 2572 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream]; 2573 int ret; 2574 unsigned long flags; 2575 2576 dev_dbg(fe->dev, "ASoC: runtime %s open on FE %s\n", 2577 stream ? "capture" : "playback", fe->dai_link->name); 2578 2579 /* Only start the BE if the FE is ready */ 2580 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE || 2581 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE) 2582 return -EINVAL; 2583 2584 /* startup must always be called for new BEs */ 2585 ret = dpcm_be_dai_startup(fe, stream); 2586 if (ret < 0) 2587 goto disconnect; 2588 2589 /* keep going if FE state is > open */ 2590 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN) 2591 return 0; 2592 2593 ret = dpcm_be_dai_hw_params(fe, stream); 2594 if (ret < 0) 2595 goto close; 2596 2597 /* keep going if FE state is > hw_params */ 2598 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS) 2599 return 0; 2600 2601 2602 ret = dpcm_be_dai_prepare(fe, stream); 2603 if (ret < 0) 2604 goto hw_free; 2605 2606 /* run the stream event for each BE */ 2607 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP); 2608 2609 /* keep going if FE state is > prepare */ 2610 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE || 2611 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP) 2612 return 0; 2613 2614 if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) { 2615 /* call trigger on the frontend - FE takes care of all BE triggers */ 2616 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd start\n", 2617 fe->dai_link->name); 2618 2619 ret = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_START); 2620 if (ret < 0) { 2621 dev_err(fe->dev,"ASoC: bespoke trigger FE failed %d\n", ret); 2622 goto hw_free; 2623 } 2624 } else { 2625 dev_dbg(fe->dev, "ASoC: trigger FE %s cmd start\n", 2626 fe->dai_link->name); 2627 2628 ret = dpcm_be_dai_trigger(fe, stream, 2629 SNDRV_PCM_TRIGGER_START); 2630 if (ret < 0) { 2631 dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); 2632 goto hw_free; 2633 } 2634 } 2635 2636 return 0; 2637 2638 hw_free: 2639 dpcm_be_dai_hw_free(fe, stream); 2640 close: 2641 dpcm_be_dai_shutdown(fe, stream); 2642 disconnect: 2643 /* disconnect any non started BEs */ 2644 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 2645 for_each_dpcm_be(fe, stream, dpcm) { 2646 struct snd_soc_pcm_runtime *be = dpcm->be; 2647 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) 2648 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; 2649 } 2650 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 2651 2652 return ret; 2653 } 2654 2655 static int dpcm_run_new_update(struct snd_soc_pcm_runtime *fe, int stream) 2656 { 2657 int ret; 2658 2659 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE); 2660 ret = dpcm_run_update_startup(fe, stream); 2661 if (ret < 0) 2662 dev_err(fe->dev, "ASoC: failed to startup some BEs\n"); 2663 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2664 2665 return ret; 2666 } 2667 2668 static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream) 2669 { 2670 int ret; 2671 2672 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE); 2673 ret = dpcm_run_update_shutdown(fe, stream); 2674 if (ret < 0) 2675 dev_err(fe->dev, "ASoC: failed to shutdown some BEs\n"); 2676 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 2677 2678 return ret; 2679 } 2680 2681 static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new) 2682 { 2683 struct snd_soc_dapm_widget_list *list; 2684 int count, paths; 2685 2686 if (!fe->dai_link->dynamic) 2687 return 0; 2688 2689 /* only check active links */ 2690 if (!fe->cpu_dai->active) 2691 return 0; 2692 2693 /* DAPM sync will call this to update DSP paths */ 2694 dev_dbg(fe->dev, "ASoC: DPCM %s runtime update for FE %s\n", 2695 new ? "new" : "old", fe->dai_link->name); 2696 2697 /* skip if FE doesn't have playback capability */ 2698 if (!snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_PLAYBACK) || 2699 !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_PLAYBACK)) 2700 goto capture; 2701 2702 /* skip if FE isn't currently playing */ 2703 if (!fe->cpu_dai->playback_active || !fe->codec_dai->playback_active) 2704 goto capture; 2705 2706 paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list); 2707 if (paths < 0) { 2708 dev_warn(fe->dev, "ASoC: %s no valid %s path\n", 2709 fe->dai_link->name, "playback"); 2710 return paths; 2711 } 2712 2713 /* update any playback paths */ 2714 count = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, new); 2715 if (count) { 2716 if (new) 2717 dpcm_run_new_update(fe, SNDRV_PCM_STREAM_PLAYBACK); 2718 else 2719 dpcm_run_old_update(fe, SNDRV_PCM_STREAM_PLAYBACK); 2720 2721 dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK); 2722 dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK); 2723 } 2724 2725 dpcm_path_put(&list); 2726 2727 capture: 2728 /* skip if FE doesn't have capture capability */ 2729 if (!snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_CAPTURE) || 2730 !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_CAPTURE)) 2731 return 0; 2732 2733 /* skip if FE isn't currently capturing */ 2734 if (!fe->cpu_dai->capture_active || !fe->codec_dai->capture_active) 2735 return 0; 2736 2737 paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list); 2738 if (paths < 0) { 2739 dev_warn(fe->dev, "ASoC: %s no valid %s path\n", 2740 fe->dai_link->name, "capture"); 2741 return paths; 2742 } 2743 2744 /* update any old capture paths */ 2745 count = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, new); 2746 if (count) { 2747 if (new) 2748 dpcm_run_new_update(fe, SNDRV_PCM_STREAM_CAPTURE); 2749 else 2750 dpcm_run_old_update(fe, SNDRV_PCM_STREAM_CAPTURE); 2751 2752 dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE); 2753 dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE); 2754 } 2755 2756 dpcm_path_put(&list); 2757 2758 return 0; 2759 } 2760 2761 /* Called by DAPM mixer/mux changes to update audio routing between PCMs and 2762 * any DAI links. 2763 */ 2764 int soc_dpcm_runtime_update(struct snd_soc_card *card) 2765 { 2766 struct snd_soc_pcm_runtime *fe; 2767 int ret = 0; 2768 2769 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2770 /* shutdown all old paths first */ 2771 for_each_card_rtds(card, fe) { 2772 ret = soc_dpcm_fe_runtime_update(fe, 0); 2773 if (ret) 2774 goto out; 2775 } 2776 2777 /* bring new paths up */ 2778 for_each_card_rtds(card, fe) { 2779 ret = soc_dpcm_fe_runtime_update(fe, 1); 2780 if (ret) 2781 goto out; 2782 } 2783 2784 out: 2785 mutex_unlock(&card->mutex); 2786 return ret; 2787 } 2788 int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute) 2789 { 2790 struct snd_soc_dpcm *dpcm; 2791 struct snd_soc_dai *dai; 2792 2793 for_each_dpcm_be(fe, SNDRV_PCM_STREAM_PLAYBACK, dpcm) { 2794 2795 struct snd_soc_pcm_runtime *be = dpcm->be; 2796 int i; 2797 2798 if (be->dai_link->ignore_suspend) 2799 continue; 2800 2801 for_each_rtd_codec_dai(be, i, dai) { 2802 struct snd_soc_dai_driver *drv = dai->driver; 2803 2804 dev_dbg(be->dev, "ASoC: BE digital mute %s\n", 2805 be->dai_link->name); 2806 2807 if (drv->ops && drv->ops->digital_mute && 2808 dai->playback_active) 2809 drv->ops->digital_mute(dai, mute); 2810 } 2811 } 2812 2813 return 0; 2814 } 2815 2816 static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream) 2817 { 2818 struct snd_soc_pcm_runtime *fe = fe_substream->private_data; 2819 struct snd_soc_dpcm *dpcm; 2820 struct snd_soc_dapm_widget_list *list; 2821 int ret; 2822 int stream = fe_substream->stream; 2823 2824 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2825 fe->dpcm[stream].runtime = fe_substream->runtime; 2826 2827 ret = dpcm_path_get(fe, stream, &list); 2828 if (ret < 0) { 2829 mutex_unlock(&fe->card->mutex); 2830 return ret; 2831 } else if (ret == 0) { 2832 dev_dbg(fe->dev, "ASoC: %s no valid %s route\n", 2833 fe->dai_link->name, stream ? "capture" : "playback"); 2834 } 2835 2836 /* calculate valid and active FE <-> BE dpcms */ 2837 dpcm_process_paths(fe, stream, &list, 1); 2838 2839 ret = dpcm_fe_dai_startup(fe_substream); 2840 if (ret < 0) { 2841 /* clean up all links */ 2842 for_each_dpcm_be(fe, stream, dpcm) 2843 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; 2844 2845 dpcm_be_disconnect(fe, stream); 2846 fe->dpcm[stream].runtime = NULL; 2847 } 2848 2849 dpcm_clear_pending_state(fe, stream); 2850 dpcm_path_put(&list); 2851 mutex_unlock(&fe->card->mutex); 2852 return ret; 2853 } 2854 2855 static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream) 2856 { 2857 struct snd_soc_pcm_runtime *fe = fe_substream->private_data; 2858 struct snd_soc_dpcm *dpcm; 2859 int stream = fe_substream->stream, ret; 2860 2861 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2862 ret = dpcm_fe_dai_shutdown(fe_substream); 2863 2864 /* mark FE's links ready to prune */ 2865 for_each_dpcm_be(fe, stream, dpcm) 2866 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; 2867 2868 dpcm_be_disconnect(fe, stream); 2869 2870 fe->dpcm[stream].runtime = NULL; 2871 mutex_unlock(&fe->card->mutex); 2872 return ret; 2873 } 2874 2875 /* create a new pcm */ 2876 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) 2877 { 2878 struct snd_soc_dai *codec_dai; 2879 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 2880 struct snd_soc_component *component; 2881 struct snd_pcm *pcm; 2882 char new_name[64]; 2883 int ret = 0, playback = 0, capture = 0; 2884 int i; 2885 2886 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) { 2887 playback = rtd->dai_link->dpcm_playback; 2888 capture = rtd->dai_link->dpcm_capture; 2889 } else { 2890 /* Adapt stream for codec2codec links */ 2891 struct snd_soc_pcm_stream *cpu_capture = rtd->dai_link->params ? 2892 &cpu_dai->driver->playback : &cpu_dai->driver->capture; 2893 struct snd_soc_pcm_stream *cpu_playback = rtd->dai_link->params ? 2894 &cpu_dai->driver->capture : &cpu_dai->driver->playback; 2895 2896 for_each_rtd_codec_dai(rtd, i, codec_dai) { 2897 if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) && 2898 snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_CAPTURE)) 2899 playback = 1; 2900 if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) && 2901 snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_PLAYBACK)) 2902 capture = 1; 2903 } 2904 2905 capture = capture && cpu_capture->channels_min; 2906 playback = playback && cpu_playback->channels_min; 2907 } 2908 2909 if (rtd->dai_link->playback_only) { 2910 playback = 1; 2911 capture = 0; 2912 } 2913 2914 if (rtd->dai_link->capture_only) { 2915 playback = 0; 2916 capture = 1; 2917 } 2918 2919 /* create the PCM */ 2920 if (rtd->dai_link->params) { 2921 snprintf(new_name, sizeof(new_name), "codec2codec(%s)", 2922 rtd->dai_link->stream_name); 2923 2924 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, 2925 playback, capture, &pcm); 2926 } else if (rtd->dai_link->no_pcm) { 2927 snprintf(new_name, sizeof(new_name), "(%s)", 2928 rtd->dai_link->stream_name); 2929 2930 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, 2931 playback, capture, &pcm); 2932 } else { 2933 if (rtd->dai_link->dynamic) 2934 snprintf(new_name, sizeof(new_name), "%s (*)", 2935 rtd->dai_link->stream_name); 2936 else 2937 snprintf(new_name, sizeof(new_name), "%s %s-%d", 2938 rtd->dai_link->stream_name, 2939 (rtd->num_codecs > 1) ? 2940 "multicodec" : rtd->codec_dai->name, num); 2941 2942 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback, 2943 capture, &pcm); 2944 } 2945 if (ret < 0) { 2946 dev_err(rtd->card->dev, "ASoC: can't create pcm for %s\n", 2947 rtd->dai_link->name); 2948 return ret; 2949 } 2950 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name); 2951 2952 /* DAPM dai link stream work */ 2953 if (rtd->dai_link->params) 2954 rtd->close_delayed_work_func = codec2codec_close_delayed_work; 2955 else 2956 rtd->close_delayed_work_func = snd_soc_close_delayed_work; 2957 2958 pcm->nonatomic = rtd->dai_link->nonatomic; 2959 rtd->pcm = pcm; 2960 pcm->private_data = rtd; 2961 2962 if (rtd->dai_link->no_pcm || rtd->dai_link->params) { 2963 if (playback) 2964 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; 2965 if (capture) 2966 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; 2967 goto out; 2968 } 2969 2970 /* ASoC PCM operations */ 2971 if (rtd->dai_link->dynamic) { 2972 rtd->ops.open = dpcm_fe_dai_open; 2973 rtd->ops.hw_params = dpcm_fe_dai_hw_params; 2974 rtd->ops.prepare = dpcm_fe_dai_prepare; 2975 rtd->ops.trigger = dpcm_fe_dai_trigger; 2976 rtd->ops.hw_free = dpcm_fe_dai_hw_free; 2977 rtd->ops.close = dpcm_fe_dai_close; 2978 rtd->ops.pointer = soc_pcm_pointer; 2979 } else { 2980 rtd->ops.open = soc_pcm_open; 2981 rtd->ops.hw_params = soc_pcm_hw_params; 2982 rtd->ops.prepare = soc_pcm_prepare; 2983 rtd->ops.trigger = soc_pcm_trigger; 2984 rtd->ops.hw_free = soc_pcm_hw_free; 2985 rtd->ops.close = soc_pcm_close; 2986 rtd->ops.pointer = soc_pcm_pointer; 2987 } 2988 2989 for_each_rtd_components(rtd, i, component) { 2990 const struct snd_soc_component_driver *drv = component->driver; 2991 2992 if (drv->ioctl) 2993 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; 2994 if (drv->sync_stop) 2995 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; 2996 if (drv->copy_user) 2997 rtd->ops.copy_user = snd_soc_pcm_component_copy_user; 2998 if (drv->page) 2999 rtd->ops.page = snd_soc_pcm_component_page; 3000 if (drv->mmap) 3001 rtd->ops.mmap = snd_soc_pcm_component_mmap; 3002 } 3003 3004 if (playback) 3005 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); 3006 3007 if (capture) 3008 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); 3009 3010 ret = snd_soc_pcm_component_new(rtd); 3011 if (ret < 0) { 3012 dev_err(rtd->dev, "ASoC: pcm constructor failed: %d\n", ret); 3013 return ret; 3014 } 3015 3016 pcm->no_device_suspend = true; 3017 out: 3018 dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", 3019 (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, 3020 cpu_dai->name); 3021 return ret; 3022 } 3023 3024 /* is the current PCM operation for this FE ? */ 3025 int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream) 3026 { 3027 if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) 3028 return 1; 3029 return 0; 3030 } 3031 EXPORT_SYMBOL_GPL(snd_soc_dpcm_fe_can_update); 3032 3033 /* is the current PCM operation for this BE ? */ 3034 int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe, 3035 struct snd_soc_pcm_runtime *be, int stream) 3036 { 3037 if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) || 3038 ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) && 3039 be->dpcm[stream].runtime_update)) 3040 return 1; 3041 return 0; 3042 } 3043 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_can_update); 3044 3045 /* get the substream for this BE */ 3046 struct snd_pcm_substream * 3047 snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream) 3048 { 3049 return be->pcm->streams[stream].substream; 3050 } 3051 EXPORT_SYMBOL_GPL(snd_soc_dpcm_get_substream); 3052 3053 /* get the BE runtime state */ 3054 enum snd_soc_dpcm_state 3055 snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream) 3056 { 3057 return be->dpcm[stream].state; 3058 } 3059 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_get_state); 3060 3061 /* set the BE runtime state */ 3062 void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, 3063 int stream, enum snd_soc_dpcm_state state) 3064 { 3065 be->dpcm[stream].state = state; 3066 } 3067 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_set_state); 3068 3069 /* 3070 * We can only hw_free, stop, pause or suspend a BE DAI if any of it's FE 3071 * are not running, paused or suspended for the specified stream direction. 3072 */ 3073 int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, 3074 struct snd_soc_pcm_runtime *be, int stream) 3075 { 3076 struct snd_soc_dpcm *dpcm; 3077 int state; 3078 int ret = 1; 3079 unsigned long flags; 3080 3081 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 3082 for_each_dpcm_fe(be, stream, dpcm) { 3083 3084 if (dpcm->fe == fe) 3085 continue; 3086 3087 state = dpcm->fe->dpcm[stream].state; 3088 if (state == SND_SOC_DPCM_STATE_START || 3089 state == SND_SOC_DPCM_STATE_PAUSED || 3090 state == SND_SOC_DPCM_STATE_SUSPEND) { 3091 ret = 0; 3092 break; 3093 } 3094 } 3095 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 3096 3097 /* it's safe to free/stop this BE DAI */ 3098 return ret; 3099 } 3100 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop); 3101 3102 /* 3103 * We can only change hw params a BE DAI if any of it's FE are not prepared, 3104 * running, paused or suspended for the specified stream direction. 3105 */ 3106 int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, 3107 struct snd_soc_pcm_runtime *be, int stream) 3108 { 3109 struct snd_soc_dpcm *dpcm; 3110 int state; 3111 int ret = 1; 3112 unsigned long flags; 3113 3114 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 3115 for_each_dpcm_fe(be, stream, dpcm) { 3116 3117 if (dpcm->fe == fe) 3118 continue; 3119 3120 state = dpcm->fe->dpcm[stream].state; 3121 if (state == SND_SOC_DPCM_STATE_START || 3122 state == SND_SOC_DPCM_STATE_PAUSED || 3123 state == SND_SOC_DPCM_STATE_SUSPEND || 3124 state == SND_SOC_DPCM_STATE_PREPARE) { 3125 ret = 0; 3126 break; 3127 } 3128 } 3129 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 3130 3131 /* it's safe to change hw_params */ 3132 return ret; 3133 } 3134 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params); 3135 3136 #ifdef CONFIG_DEBUG_FS 3137 static const char *dpcm_state_string(enum snd_soc_dpcm_state state) 3138 { 3139 switch (state) { 3140 case SND_SOC_DPCM_STATE_NEW: 3141 return "new"; 3142 case SND_SOC_DPCM_STATE_OPEN: 3143 return "open"; 3144 case SND_SOC_DPCM_STATE_HW_PARAMS: 3145 return "hw_params"; 3146 case SND_SOC_DPCM_STATE_PREPARE: 3147 return "prepare"; 3148 case SND_SOC_DPCM_STATE_START: 3149 return "start"; 3150 case SND_SOC_DPCM_STATE_STOP: 3151 return "stop"; 3152 case SND_SOC_DPCM_STATE_SUSPEND: 3153 return "suspend"; 3154 case SND_SOC_DPCM_STATE_PAUSED: 3155 return "paused"; 3156 case SND_SOC_DPCM_STATE_HW_FREE: 3157 return "hw_free"; 3158 case SND_SOC_DPCM_STATE_CLOSE: 3159 return "close"; 3160 } 3161 3162 return "unknown"; 3163 } 3164 3165 static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe, 3166 int stream, char *buf, size_t size) 3167 { 3168 struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params; 3169 struct snd_soc_dpcm *dpcm; 3170 ssize_t offset = 0; 3171 unsigned long flags; 3172 3173 /* FE state */ 3174 offset += snprintf(buf + offset, size - offset, 3175 "[%s - %s]\n", fe->dai_link->name, 3176 stream ? "Capture" : "Playback"); 3177 3178 offset += snprintf(buf + offset, size - offset, "State: %s\n", 3179 dpcm_state_string(fe->dpcm[stream].state)); 3180 3181 if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) && 3182 (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP)) 3183 offset += snprintf(buf + offset, size - offset, 3184 "Hardware Params: " 3185 "Format = %s, Channels = %d, Rate = %d\n", 3186 snd_pcm_format_name(params_format(params)), 3187 params_channels(params), 3188 params_rate(params)); 3189 3190 /* BEs state */ 3191 offset += snprintf(buf + offset, size - offset, "Backends:\n"); 3192 3193 if (list_empty(&fe->dpcm[stream].be_clients)) { 3194 offset += snprintf(buf + offset, size - offset, 3195 " No active DSP links\n"); 3196 goto out; 3197 } 3198 3199 spin_lock_irqsave(&fe->card->dpcm_lock, flags); 3200 for_each_dpcm_be(fe, stream, dpcm) { 3201 struct snd_soc_pcm_runtime *be = dpcm->be; 3202 params = &dpcm->hw_params; 3203 3204 offset += snprintf(buf + offset, size - offset, 3205 "- %s\n", be->dai_link->name); 3206 3207 offset += snprintf(buf + offset, size - offset, 3208 " State: %s\n", 3209 dpcm_state_string(be->dpcm[stream].state)); 3210 3211 if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) && 3212 (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP)) 3213 offset += snprintf(buf + offset, size - offset, 3214 " Hardware Params: " 3215 "Format = %s, Channels = %d, Rate = %d\n", 3216 snd_pcm_format_name(params_format(params)), 3217 params_channels(params), 3218 params_rate(params)); 3219 } 3220 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags); 3221 out: 3222 return offset; 3223 } 3224 3225 static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf, 3226 size_t count, loff_t *ppos) 3227 { 3228 struct snd_soc_pcm_runtime *fe = file->private_data; 3229 ssize_t out_count = PAGE_SIZE, offset = 0, ret = 0; 3230 char *buf; 3231 3232 buf = kmalloc(out_count, GFP_KERNEL); 3233 if (!buf) 3234 return -ENOMEM; 3235 3236 if (snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_PLAYBACK)) 3237 offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_PLAYBACK, 3238 buf + offset, out_count - offset); 3239 3240 if (snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_CAPTURE)) 3241 offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_CAPTURE, 3242 buf + offset, out_count - offset); 3243 3244 ret = simple_read_from_buffer(user_buf, count, ppos, buf, offset); 3245 3246 kfree(buf); 3247 return ret; 3248 } 3249 3250 static const struct file_operations dpcm_state_fops = { 3251 .open = simple_open, 3252 .read = dpcm_state_read_file, 3253 .llseek = default_llseek, 3254 }; 3255 3256 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd) 3257 { 3258 if (!rtd->dai_link) 3259 return; 3260 3261 if (!rtd->dai_link->dynamic) 3262 return; 3263 3264 if (!rtd->card->debugfs_card_root) 3265 return; 3266 3267 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, 3268 rtd->card->debugfs_card_root); 3269 3270 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root, 3271 rtd, &dpcm_state_fops); 3272 } 3273 #endif 3274