1 /* 2 * soc-dapm.c -- ALSA SoC Dynamic Audio Power Management 3 * 4 * Copyright 2005 Wolfson Microelectronics PLC. 5 * Author: Liam Girdwood <lrg@slimlogic.co.uk> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2 of the License, or (at your 10 * option) any later version. 11 * 12 * Features: 13 * o Changes power status of internal codec blocks depending on the 14 * dynamic configuration of codec internal audio paths and active 15 * DACs/ADCs. 16 * o Platform power domain - can support external components i.e. amps and 17 * mic/headphone insertion events. 18 * o Automatic Mic Bias support 19 * o Jack insertion power event initiation - e.g. hp insertion will enable 20 * sinks, dacs, etc 21 * o Delayed power down of audio subsystem to reduce pops between a quick 22 * device reopen. 23 * 24 */ 25 26 #include <linux/module.h> 27 #include <linux/moduleparam.h> 28 #include <linux/init.h> 29 #include <linux/async.h> 30 #include <linux/delay.h> 31 #include <linux/pm.h> 32 #include <linux/bitops.h> 33 #include <linux/platform_device.h> 34 #include <linux/jiffies.h> 35 #include <linux/debugfs.h> 36 #include <linux/pm_runtime.h> 37 #include <linux/regulator/consumer.h> 38 #include <linux/clk.h> 39 #include <linux/slab.h> 40 #include <sound/core.h> 41 #include <sound/pcm.h> 42 #include <sound/pcm_params.h> 43 #include <sound/soc.h> 44 #include <sound/initval.h> 45 46 #include <trace/events/asoc.h> 47 48 #define DAPM_UPDATE_STAT(widget, val) widget->dapm->card->dapm_stats.val++; 49 50 #define SND_SOC_DAPM_DIR_REVERSE(x) ((x == SND_SOC_DAPM_DIR_IN) ? \ 51 SND_SOC_DAPM_DIR_OUT : SND_SOC_DAPM_DIR_IN) 52 53 #define snd_soc_dapm_for_each_direction(dir) \ 54 for ((dir) = SND_SOC_DAPM_DIR_IN; (dir) <= SND_SOC_DAPM_DIR_OUT; \ 55 (dir)++) 56 57 static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm, 58 struct snd_soc_dapm_widget *wsource, struct snd_soc_dapm_widget *wsink, 59 const char *control, 60 int (*connected)(struct snd_soc_dapm_widget *source, 61 struct snd_soc_dapm_widget *sink)); 62 63 struct snd_soc_dapm_widget * 64 snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, 65 const struct snd_soc_dapm_widget *widget); 66 67 struct snd_soc_dapm_widget * 68 snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, 69 const struct snd_soc_dapm_widget *widget); 70 71 /* dapm power sequences - make this per codec in the future */ 72 static int dapm_up_seq[] = { 73 [snd_soc_dapm_pre] = 0, 74 [snd_soc_dapm_regulator_supply] = 1, 75 [snd_soc_dapm_clock_supply] = 1, 76 [snd_soc_dapm_supply] = 2, 77 [snd_soc_dapm_micbias] = 3, 78 [snd_soc_dapm_dai_link] = 2, 79 [snd_soc_dapm_dai_in] = 4, 80 [snd_soc_dapm_dai_out] = 4, 81 [snd_soc_dapm_aif_in] = 4, 82 [snd_soc_dapm_aif_out] = 4, 83 [snd_soc_dapm_mic] = 5, 84 [snd_soc_dapm_mux] = 6, 85 [snd_soc_dapm_demux] = 6, 86 [snd_soc_dapm_dac] = 7, 87 [snd_soc_dapm_switch] = 8, 88 [snd_soc_dapm_mixer] = 8, 89 [snd_soc_dapm_mixer_named_ctl] = 8, 90 [snd_soc_dapm_pga] = 9, 91 [snd_soc_dapm_adc] = 10, 92 [snd_soc_dapm_out_drv] = 11, 93 [snd_soc_dapm_hp] = 11, 94 [snd_soc_dapm_spk] = 11, 95 [snd_soc_dapm_line] = 11, 96 [snd_soc_dapm_kcontrol] = 12, 97 [snd_soc_dapm_post] = 13, 98 }; 99 100 static int dapm_down_seq[] = { 101 [snd_soc_dapm_pre] = 0, 102 [snd_soc_dapm_kcontrol] = 1, 103 [snd_soc_dapm_adc] = 2, 104 [snd_soc_dapm_hp] = 3, 105 [snd_soc_dapm_spk] = 3, 106 [snd_soc_dapm_line] = 3, 107 [snd_soc_dapm_out_drv] = 3, 108 [snd_soc_dapm_pga] = 4, 109 [snd_soc_dapm_switch] = 5, 110 [snd_soc_dapm_mixer_named_ctl] = 5, 111 [snd_soc_dapm_mixer] = 5, 112 [snd_soc_dapm_dac] = 6, 113 [snd_soc_dapm_mic] = 7, 114 [snd_soc_dapm_micbias] = 8, 115 [snd_soc_dapm_mux] = 9, 116 [snd_soc_dapm_demux] = 9, 117 [snd_soc_dapm_aif_in] = 10, 118 [snd_soc_dapm_aif_out] = 10, 119 [snd_soc_dapm_dai_in] = 10, 120 [snd_soc_dapm_dai_out] = 10, 121 [snd_soc_dapm_dai_link] = 11, 122 [snd_soc_dapm_supply] = 12, 123 [snd_soc_dapm_clock_supply] = 13, 124 [snd_soc_dapm_regulator_supply] = 13, 125 [snd_soc_dapm_post] = 14, 126 }; 127 128 static void dapm_assert_locked(struct snd_soc_dapm_context *dapm) 129 { 130 if (dapm->card && dapm->card->instantiated) 131 lockdep_assert_held(&dapm->card->dapm_mutex); 132 } 133 134 static void pop_wait(u32 pop_time) 135 { 136 if (pop_time) 137 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); 138 } 139 140 static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...) 141 { 142 va_list args; 143 char *buf; 144 145 if (!pop_time) 146 return; 147 148 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 149 if (buf == NULL) 150 return; 151 152 va_start(args, fmt); 153 vsnprintf(buf, PAGE_SIZE, fmt, args); 154 dev_info(dev, "%s", buf); 155 va_end(args); 156 157 kfree(buf); 158 } 159 160 static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w) 161 { 162 return !list_empty(&w->dirty); 163 } 164 165 static void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason) 166 { 167 dapm_assert_locked(w->dapm); 168 169 if (!dapm_dirty_widget(w)) { 170 dev_vdbg(w->dapm->dev, "Marking %s dirty due to %s\n", 171 w->name, reason); 172 list_add_tail(&w->dirty, &w->dapm->card->dapm_dirty); 173 } 174 } 175 176 /* 177 * Common implementation for dapm_widget_invalidate_input_paths() and 178 * dapm_widget_invalidate_output_paths(). The function is inlined since the 179 * combined size of the two specialized functions is only marginally larger then 180 * the size of the generic function and at the same time the fast path of the 181 * specialized functions is significantly smaller than the generic function. 182 */ 183 static __always_inline void dapm_widget_invalidate_paths( 184 struct snd_soc_dapm_widget *w, enum snd_soc_dapm_direction dir) 185 { 186 enum snd_soc_dapm_direction rdir = SND_SOC_DAPM_DIR_REVERSE(dir); 187 struct snd_soc_dapm_widget *node; 188 struct snd_soc_dapm_path *p; 189 LIST_HEAD(list); 190 191 dapm_assert_locked(w->dapm); 192 193 if (w->endpoints[dir] == -1) 194 return; 195 196 list_add_tail(&w->work_list, &list); 197 w->endpoints[dir] = -1; 198 199 list_for_each_entry(w, &list, work_list) { 200 snd_soc_dapm_widget_for_each_path(w, dir, p) { 201 if (p->is_supply || p->weak || !p->connect) 202 continue; 203 node = p->node[rdir]; 204 if (node->endpoints[dir] != -1) { 205 node->endpoints[dir] = -1; 206 list_add_tail(&node->work_list, &list); 207 } 208 } 209 } 210 } 211 212 /* 213 * dapm_widget_invalidate_input_paths() - Invalidate the cached number of 214 * input paths 215 * @w: The widget for which to invalidate the cached number of input paths 216 * 217 * Resets the cached number of inputs for the specified widget and all widgets 218 * that can be reached via outcoming paths from the widget. 219 * 220 * This function must be called if the number of output paths for a widget might 221 * have changed. E.g. if the source state of a widget changes or a path is added 222 * or activated with the widget as the sink. 223 */ 224 static void dapm_widget_invalidate_input_paths(struct snd_soc_dapm_widget *w) 225 { 226 dapm_widget_invalidate_paths(w, SND_SOC_DAPM_DIR_IN); 227 } 228 229 /* 230 * dapm_widget_invalidate_output_paths() - Invalidate the cached number of 231 * output paths 232 * @w: The widget for which to invalidate the cached number of output paths 233 * 234 * Resets the cached number of outputs for the specified widget and all widgets 235 * that can be reached via incoming paths from the widget. 236 * 237 * This function must be called if the number of output paths for a widget might 238 * have changed. E.g. if the sink state of a widget changes or a path is added 239 * or activated with the widget as the source. 240 */ 241 static void dapm_widget_invalidate_output_paths(struct snd_soc_dapm_widget *w) 242 { 243 dapm_widget_invalidate_paths(w, SND_SOC_DAPM_DIR_OUT); 244 } 245 246 /* 247 * dapm_path_invalidate() - Invalidates the cached number of inputs and outputs 248 * for the widgets connected to a path 249 * @p: The path to invalidate 250 * 251 * Resets the cached number of inputs for the sink of the path and the cached 252 * number of outputs for the source of the path. 253 * 254 * This function must be called when a path is added, removed or the connected 255 * state changes. 256 */ 257 static void dapm_path_invalidate(struct snd_soc_dapm_path *p) 258 { 259 /* 260 * Weak paths or supply paths do not influence the number of input or 261 * output paths of their neighbors. 262 */ 263 if (p->weak || p->is_supply) 264 return; 265 266 /* 267 * The number of connected endpoints is the sum of the number of 268 * connected endpoints of all neighbors. If a node with 0 connected 269 * endpoints is either connected or disconnected that sum won't change, 270 * so there is no need to re-check the path. 271 */ 272 if (p->source->endpoints[SND_SOC_DAPM_DIR_IN] != 0) 273 dapm_widget_invalidate_input_paths(p->sink); 274 if (p->sink->endpoints[SND_SOC_DAPM_DIR_OUT] != 0) 275 dapm_widget_invalidate_output_paths(p->source); 276 } 277 278 void dapm_mark_endpoints_dirty(struct snd_soc_card *card) 279 { 280 struct snd_soc_dapm_widget *w; 281 282 mutex_lock(&card->dapm_mutex); 283 284 list_for_each_entry(w, &card->widgets, list) { 285 if (w->is_ep) { 286 dapm_mark_dirty(w, "Rechecking endpoints"); 287 if (w->is_ep & SND_SOC_DAPM_EP_SINK) 288 dapm_widget_invalidate_output_paths(w); 289 if (w->is_ep & SND_SOC_DAPM_EP_SOURCE) 290 dapm_widget_invalidate_input_paths(w); 291 } 292 } 293 294 mutex_unlock(&card->dapm_mutex); 295 } 296 EXPORT_SYMBOL_GPL(dapm_mark_endpoints_dirty); 297 298 /* create a new dapm widget */ 299 static inline struct snd_soc_dapm_widget *dapm_cnew_widget( 300 const struct snd_soc_dapm_widget *_widget) 301 { 302 return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL); 303 } 304 305 struct dapm_kcontrol_data { 306 unsigned int value; 307 struct snd_soc_dapm_widget *widget; 308 struct list_head paths; 309 struct snd_soc_dapm_widget_list *wlist; 310 }; 311 312 static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, 313 struct snd_kcontrol *kcontrol) 314 { 315 struct dapm_kcontrol_data *data; 316 struct soc_mixer_control *mc; 317 struct soc_enum *e; 318 const char *name; 319 int ret; 320 321 data = kzalloc(sizeof(*data), GFP_KERNEL); 322 if (!data) 323 return -ENOMEM; 324 325 INIT_LIST_HEAD(&data->paths); 326 327 switch (widget->id) { 328 case snd_soc_dapm_switch: 329 case snd_soc_dapm_mixer: 330 case snd_soc_dapm_mixer_named_ctl: 331 mc = (struct soc_mixer_control *)kcontrol->private_value; 332 333 if (mc->autodisable) { 334 struct snd_soc_dapm_widget template; 335 336 name = kasprintf(GFP_KERNEL, "%s %s", kcontrol->id.name, 337 "Autodisable"); 338 if (!name) { 339 ret = -ENOMEM; 340 goto err_data; 341 } 342 343 memset(&template, 0, sizeof(template)); 344 template.reg = mc->reg; 345 template.mask = (1 << fls(mc->max)) - 1; 346 template.shift = mc->shift; 347 if (mc->invert) 348 template.off_val = mc->max; 349 else 350 template.off_val = 0; 351 template.on_val = template.off_val; 352 template.id = snd_soc_dapm_kcontrol; 353 template.name = name; 354 355 data->value = template.on_val; 356 357 data->widget = 358 snd_soc_dapm_new_control_unlocked(widget->dapm, 359 &template); 360 kfree(name); 361 if (!data->widget) { 362 ret = -ENOMEM; 363 goto err_data; 364 } 365 } 366 break; 367 case snd_soc_dapm_demux: 368 case snd_soc_dapm_mux: 369 e = (struct soc_enum *)kcontrol->private_value; 370 371 if (e->autodisable) { 372 struct snd_soc_dapm_widget template; 373 374 name = kasprintf(GFP_KERNEL, "%s %s", kcontrol->id.name, 375 "Autodisable"); 376 if (!name) { 377 ret = -ENOMEM; 378 goto err_data; 379 } 380 381 memset(&template, 0, sizeof(template)); 382 template.reg = e->reg; 383 template.mask = e->mask << e->shift_l; 384 template.shift = e->shift_l; 385 template.off_val = snd_soc_enum_item_to_val(e, 0); 386 template.on_val = template.off_val; 387 template.id = snd_soc_dapm_kcontrol; 388 template.name = name; 389 390 data->value = template.on_val; 391 392 data->widget = snd_soc_dapm_new_control_unlocked( 393 widget->dapm, &template); 394 kfree(name); 395 if (!data->widget) { 396 ret = -ENOMEM; 397 goto err_data; 398 } 399 400 snd_soc_dapm_add_path(widget->dapm, data->widget, 401 widget, NULL, NULL); 402 } 403 break; 404 default: 405 break; 406 } 407 408 kcontrol->private_data = data; 409 410 return 0; 411 412 err_data: 413 kfree(data); 414 return ret; 415 } 416 417 static void dapm_kcontrol_free(struct snd_kcontrol *kctl) 418 { 419 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); 420 kfree(data->wlist); 421 kfree(data); 422 } 423 424 static struct snd_soc_dapm_widget_list *dapm_kcontrol_get_wlist( 425 const struct snd_kcontrol *kcontrol) 426 { 427 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 428 429 return data->wlist; 430 } 431 432 static int dapm_kcontrol_add_widget(struct snd_kcontrol *kcontrol, 433 struct snd_soc_dapm_widget *widget) 434 { 435 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 436 struct snd_soc_dapm_widget_list *new_wlist; 437 unsigned int n; 438 439 if (data->wlist) 440 n = data->wlist->num_widgets + 1; 441 else 442 n = 1; 443 444 new_wlist = krealloc(data->wlist, 445 sizeof(*new_wlist) + sizeof(widget) * n, GFP_KERNEL); 446 if (!new_wlist) 447 return -ENOMEM; 448 449 new_wlist->widgets[n - 1] = widget; 450 new_wlist->num_widgets = n; 451 452 data->wlist = new_wlist; 453 454 return 0; 455 } 456 457 static void dapm_kcontrol_add_path(const struct snd_kcontrol *kcontrol, 458 struct snd_soc_dapm_path *path) 459 { 460 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 461 462 list_add_tail(&path->list_kcontrol, &data->paths); 463 } 464 465 static bool dapm_kcontrol_is_powered(const struct snd_kcontrol *kcontrol) 466 { 467 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 468 469 if (!data->widget) 470 return true; 471 472 return data->widget->power; 473 } 474 475 static struct list_head *dapm_kcontrol_get_path_list( 476 const struct snd_kcontrol *kcontrol) 477 { 478 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 479 480 return &data->paths; 481 } 482 483 #define dapm_kcontrol_for_each_path(path, kcontrol) \ 484 list_for_each_entry(path, dapm_kcontrol_get_path_list(kcontrol), \ 485 list_kcontrol) 486 487 unsigned int dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol) 488 { 489 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 490 491 return data->value; 492 } 493 EXPORT_SYMBOL_GPL(dapm_kcontrol_get_value); 494 495 static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol, 496 unsigned int value) 497 { 498 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol); 499 500 if (data->value == value) 501 return false; 502 503 if (data->widget) 504 data->widget->on_val = value; 505 506 data->value = value; 507 508 return true; 509 } 510 511 /** 512 * snd_soc_dapm_kcontrol_widget() - Returns the widget associated to a 513 * kcontrol 514 * @kcontrol: The kcontrol 515 */ 516 struct snd_soc_dapm_widget *snd_soc_dapm_kcontrol_widget( 517 struct snd_kcontrol *kcontrol) 518 { 519 return dapm_kcontrol_get_wlist(kcontrol)->widgets[0]; 520 } 521 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_widget); 522 523 /** 524 * snd_soc_dapm_kcontrol_dapm() - Returns the dapm context associated to a 525 * kcontrol 526 * @kcontrol: The kcontrol 527 * 528 * Note: This function must only be used on kcontrols that are known to have 529 * been registered for a CODEC. Otherwise the behaviour is undefined. 530 */ 531 struct snd_soc_dapm_context *snd_soc_dapm_kcontrol_dapm( 532 struct snd_kcontrol *kcontrol) 533 { 534 return dapm_kcontrol_get_wlist(kcontrol)->widgets[0]->dapm; 535 } 536 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_dapm); 537 538 static void dapm_reset(struct snd_soc_card *card) 539 { 540 struct snd_soc_dapm_widget *w; 541 542 lockdep_assert_held(&card->dapm_mutex); 543 544 memset(&card->dapm_stats, 0, sizeof(card->dapm_stats)); 545 546 list_for_each_entry(w, &card->widgets, list) { 547 w->new_power = w->power; 548 w->power_checked = false; 549 } 550 } 551 552 static const char *soc_dapm_prefix(struct snd_soc_dapm_context *dapm) 553 { 554 if (!dapm->component) 555 return NULL; 556 return dapm->component->name_prefix; 557 } 558 559 static int soc_dapm_read(struct snd_soc_dapm_context *dapm, int reg, 560 unsigned int *value) 561 { 562 if (!dapm->component) 563 return -EIO; 564 return snd_soc_component_read(dapm->component, reg, value); 565 } 566 567 static int soc_dapm_update_bits(struct snd_soc_dapm_context *dapm, 568 int reg, unsigned int mask, unsigned int value) 569 { 570 if (!dapm->component) 571 return -EIO; 572 return snd_soc_component_update_bits(dapm->component, reg, 573 mask, value); 574 } 575 576 static int soc_dapm_test_bits(struct snd_soc_dapm_context *dapm, 577 int reg, unsigned int mask, unsigned int value) 578 { 579 if (!dapm->component) 580 return -EIO; 581 return snd_soc_component_test_bits(dapm->component, reg, mask, value); 582 } 583 584 static void soc_dapm_async_complete(struct snd_soc_dapm_context *dapm) 585 { 586 if (dapm->component) 587 snd_soc_component_async_complete(dapm->component); 588 } 589 590 static struct snd_soc_dapm_widget * 591 dapm_wcache_lookup(struct snd_soc_dapm_wcache *wcache, const char *name) 592 { 593 struct snd_soc_dapm_widget *w = wcache->widget; 594 struct list_head *wlist; 595 const int depth = 2; 596 int i = 0; 597 598 if (w) { 599 wlist = &w->dapm->card->widgets; 600 601 list_for_each_entry_from(w, wlist, list) { 602 if (!strcmp(name, w->name)) 603 return w; 604 605 if (++i == depth) 606 break; 607 } 608 } 609 610 return NULL; 611 } 612 613 static inline void dapm_wcache_update(struct snd_soc_dapm_wcache *wcache, 614 struct snd_soc_dapm_widget *w) 615 { 616 wcache->widget = w; 617 } 618 619 /** 620 * snd_soc_dapm_force_bias_level() - Sets the DAPM bias level 621 * @dapm: The DAPM context for which to set the level 622 * @level: The level to set 623 * 624 * Forces the DAPM bias level to a specific state. It will call the bias level 625 * callback of DAPM context with the specified level. This will even happen if 626 * the context is already at the same level. Furthermore it will not go through 627 * the normal bias level sequencing, meaning any intermediate states between the 628 * current and the target state will not be entered. 629 * 630 * Note that the change in bias level is only temporary and the next time 631 * snd_soc_dapm_sync() is called the state will be set to the level as 632 * determined by the DAPM core. The function is mainly intended to be used to 633 * used during probe or resume from suspend to power up the device so 634 * initialization can be done, before the DAPM core takes over. 635 */ 636 int snd_soc_dapm_force_bias_level(struct snd_soc_dapm_context *dapm, 637 enum snd_soc_bias_level level) 638 { 639 int ret = 0; 640 641 if (dapm->set_bias_level) 642 ret = dapm->set_bias_level(dapm, level); 643 644 if (ret == 0) 645 dapm->bias_level = level; 646 647 return ret; 648 } 649 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_bias_level); 650 651 /** 652 * snd_soc_dapm_set_bias_level - set the bias level for the system 653 * @dapm: DAPM context 654 * @level: level to configure 655 * 656 * Configure the bias (power) levels for the SoC audio device. 657 * 658 * Returns 0 for success else error. 659 */ 660 static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm, 661 enum snd_soc_bias_level level) 662 { 663 struct snd_soc_card *card = dapm->card; 664 int ret = 0; 665 666 trace_snd_soc_bias_level_start(card, level); 667 668 if (card && card->set_bias_level) 669 ret = card->set_bias_level(card, dapm, level); 670 if (ret != 0) 671 goto out; 672 673 if (!card || dapm != &card->dapm) 674 ret = snd_soc_dapm_force_bias_level(dapm, level); 675 676 if (ret != 0) 677 goto out; 678 679 if (card && card->set_bias_level_post) 680 ret = card->set_bias_level_post(card, dapm, level); 681 out: 682 trace_snd_soc_bias_level_done(card, level); 683 684 return ret; 685 } 686 687 /* connect mux widget to its interconnecting audio paths */ 688 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm, 689 struct snd_soc_dapm_path *path, const char *control_name, 690 struct snd_soc_dapm_widget *w) 691 { 692 const struct snd_kcontrol_new *kcontrol = &w->kcontrol_news[0]; 693 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 694 unsigned int val, item; 695 int i; 696 697 if (e->reg != SND_SOC_NOPM) { 698 soc_dapm_read(dapm, e->reg, &val); 699 val = (val >> e->shift_l) & e->mask; 700 item = snd_soc_enum_val_to_item(e, val); 701 } else { 702 /* since a virtual mux has no backing registers to 703 * decide which path to connect, it will try to match 704 * with the first enumeration. This is to ensure 705 * that the default mux choice (the first) will be 706 * correctly powered up during initialization. 707 */ 708 item = 0; 709 } 710 711 for (i = 0; i < e->items; i++) { 712 if (!(strcmp(control_name, e->texts[i]))) { 713 path->name = e->texts[i]; 714 if (i == item) 715 path->connect = 1; 716 else 717 path->connect = 0; 718 return 0; 719 } 720 } 721 722 return -ENODEV; 723 } 724 725 /* set up initial codec paths */ 726 static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i) 727 { 728 struct soc_mixer_control *mc = (struct soc_mixer_control *) 729 p->sink->kcontrol_news[i].private_value; 730 unsigned int reg = mc->reg; 731 unsigned int shift = mc->shift; 732 unsigned int max = mc->max; 733 unsigned int mask = (1 << fls(max)) - 1; 734 unsigned int invert = mc->invert; 735 unsigned int val; 736 737 if (reg != SND_SOC_NOPM) { 738 soc_dapm_read(p->sink->dapm, reg, &val); 739 val = (val >> shift) & mask; 740 if (invert) 741 val = max - val; 742 p->connect = !!val; 743 } else { 744 p->connect = 0; 745 } 746 } 747 748 /* connect mixer widget to its interconnecting audio paths */ 749 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm, 750 struct snd_soc_dapm_path *path, const char *control_name) 751 { 752 int i; 753 754 /* search for mixer kcontrol */ 755 for (i = 0; i < path->sink->num_kcontrols; i++) { 756 if (!strcmp(control_name, path->sink->kcontrol_news[i].name)) { 757 path->name = path->sink->kcontrol_news[i].name; 758 dapm_set_mixer_path_status(path, i); 759 return 0; 760 } 761 } 762 return -ENODEV; 763 } 764 765 static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm, 766 struct snd_soc_dapm_widget *kcontrolw, 767 const struct snd_kcontrol_new *kcontrol_new, 768 struct snd_kcontrol **kcontrol) 769 { 770 struct snd_soc_dapm_widget *w; 771 int i; 772 773 *kcontrol = NULL; 774 775 list_for_each_entry(w, &dapm->card->widgets, list) { 776 if (w == kcontrolw || w->dapm != kcontrolw->dapm) 777 continue; 778 for (i = 0; i < w->num_kcontrols; i++) { 779 if (&w->kcontrol_news[i] == kcontrol_new) { 780 if (w->kcontrols) 781 *kcontrol = w->kcontrols[i]; 782 return 1; 783 } 784 } 785 } 786 787 return 0; 788 } 789 790 /* 791 * Determine if a kcontrol is shared. If it is, look it up. If it isn't, 792 * create it. Either way, add the widget into the control's widget list 793 */ 794 static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w, 795 int kci) 796 { 797 struct snd_soc_dapm_context *dapm = w->dapm; 798 struct snd_card *card = dapm->card->snd_card; 799 const char *prefix; 800 size_t prefix_len; 801 int shared; 802 struct snd_kcontrol *kcontrol; 803 bool wname_in_long_name, kcname_in_long_name; 804 char *long_name = NULL; 805 const char *name; 806 int ret = 0; 807 808 prefix = soc_dapm_prefix(dapm); 809 if (prefix) 810 prefix_len = strlen(prefix) + 1; 811 else 812 prefix_len = 0; 813 814 shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[kci], 815 &kcontrol); 816 817 if (!kcontrol) { 818 if (shared) { 819 wname_in_long_name = false; 820 kcname_in_long_name = true; 821 } else { 822 switch (w->id) { 823 case snd_soc_dapm_switch: 824 case snd_soc_dapm_mixer: 825 case snd_soc_dapm_pga: 826 wname_in_long_name = true; 827 kcname_in_long_name = true; 828 break; 829 case snd_soc_dapm_mixer_named_ctl: 830 wname_in_long_name = false; 831 kcname_in_long_name = true; 832 break; 833 case snd_soc_dapm_demux: 834 case snd_soc_dapm_mux: 835 wname_in_long_name = true; 836 kcname_in_long_name = false; 837 break; 838 default: 839 return -EINVAL; 840 } 841 } 842 843 if (wname_in_long_name && kcname_in_long_name) { 844 /* 845 * The control will get a prefix from the control 846 * creation process but we're also using the same 847 * prefix for widgets so cut the prefix off the 848 * front of the widget name. 849 */ 850 long_name = kasprintf(GFP_KERNEL, "%s %s", 851 w->name + prefix_len, 852 w->kcontrol_news[kci].name); 853 if (long_name == NULL) 854 return -ENOMEM; 855 856 name = long_name; 857 } else if (wname_in_long_name) { 858 long_name = NULL; 859 name = w->name + prefix_len; 860 } else { 861 long_name = NULL; 862 name = w->kcontrol_news[kci].name; 863 } 864 865 kcontrol = snd_soc_cnew(&w->kcontrol_news[kci], NULL, name, 866 prefix); 867 if (!kcontrol) { 868 ret = -ENOMEM; 869 goto exit_free; 870 } 871 872 kcontrol->private_free = dapm_kcontrol_free; 873 874 ret = dapm_kcontrol_data_alloc(w, kcontrol); 875 if (ret) { 876 snd_ctl_free_one(kcontrol); 877 goto exit_free; 878 } 879 880 ret = snd_ctl_add(card, kcontrol); 881 if (ret < 0) { 882 dev_err(dapm->dev, 883 "ASoC: failed to add widget %s dapm kcontrol %s: %d\n", 884 w->name, name, ret); 885 goto exit_free; 886 } 887 } 888 889 ret = dapm_kcontrol_add_widget(kcontrol, w); 890 if (ret == 0) 891 w->kcontrols[kci] = kcontrol; 892 893 exit_free: 894 kfree(long_name); 895 896 return ret; 897 } 898 899 /* create new dapm mixer control */ 900 static int dapm_new_mixer(struct snd_soc_dapm_widget *w) 901 { 902 int i, ret; 903 struct snd_soc_dapm_path *path; 904 struct dapm_kcontrol_data *data; 905 906 /* add kcontrol */ 907 for (i = 0; i < w->num_kcontrols; i++) { 908 /* match name */ 909 snd_soc_dapm_widget_for_each_source_path(w, path) { 910 /* mixer/mux paths name must match control name */ 911 if (path->name != (char *)w->kcontrol_news[i].name) 912 continue; 913 914 if (!w->kcontrols[i]) { 915 ret = dapm_create_or_share_kcontrol(w, i); 916 if (ret < 0) 917 return ret; 918 } 919 920 dapm_kcontrol_add_path(w->kcontrols[i], path); 921 922 data = snd_kcontrol_chip(w->kcontrols[i]); 923 if (data->widget) 924 snd_soc_dapm_add_path(data->widget->dapm, 925 data->widget, 926 path->source, 927 NULL, NULL); 928 } 929 } 930 931 return 0; 932 } 933 934 /* create new dapm mux control */ 935 static int dapm_new_mux(struct snd_soc_dapm_widget *w) 936 { 937 struct snd_soc_dapm_context *dapm = w->dapm; 938 enum snd_soc_dapm_direction dir; 939 struct snd_soc_dapm_path *path; 940 const char *type; 941 int ret; 942 943 switch (w->id) { 944 case snd_soc_dapm_mux: 945 dir = SND_SOC_DAPM_DIR_OUT; 946 type = "mux"; 947 break; 948 case snd_soc_dapm_demux: 949 dir = SND_SOC_DAPM_DIR_IN; 950 type = "demux"; 951 break; 952 default: 953 return -EINVAL; 954 } 955 956 if (w->num_kcontrols != 1) { 957 dev_err(dapm->dev, 958 "ASoC: %s %s has incorrect number of controls\n", type, 959 w->name); 960 return -EINVAL; 961 } 962 963 if (list_empty(&w->edges[dir])) { 964 dev_err(dapm->dev, "ASoC: %s %s has no paths\n", type, w->name); 965 return -EINVAL; 966 } 967 968 ret = dapm_create_or_share_kcontrol(w, 0); 969 if (ret < 0) 970 return ret; 971 972 snd_soc_dapm_widget_for_each_path(w, dir, path) { 973 if (path->name) 974 dapm_kcontrol_add_path(w->kcontrols[0], path); 975 } 976 977 return 0; 978 } 979 980 /* create new dapm volume control */ 981 static int dapm_new_pga(struct snd_soc_dapm_widget *w) 982 { 983 int i, ret; 984 985 for (i = 0; i < w->num_kcontrols; i++) { 986 ret = dapm_create_or_share_kcontrol(w, i); 987 if (ret < 0) 988 return ret; 989 } 990 991 return 0; 992 } 993 994 /* create new dapm dai link control */ 995 static int dapm_new_dai_link(struct snd_soc_dapm_widget *w) 996 { 997 int i, ret; 998 struct snd_kcontrol *kcontrol; 999 struct snd_soc_dapm_context *dapm = w->dapm; 1000 struct snd_card *card = dapm->card->snd_card; 1001 1002 /* create control for links with > 1 config */ 1003 if (w->num_params <= 1) 1004 return 0; 1005 1006 /* add kcontrol */ 1007 for (i = 0; i < w->num_kcontrols; i++) { 1008 kcontrol = snd_soc_cnew(&w->kcontrol_news[i], w, 1009 w->name, NULL); 1010 ret = snd_ctl_add(card, kcontrol); 1011 if (ret < 0) { 1012 dev_err(dapm->dev, 1013 "ASoC: failed to add widget %s dapm kcontrol %s: %d\n", 1014 w->name, w->kcontrol_news[i].name, ret); 1015 return ret; 1016 } 1017 kcontrol->private_data = w; 1018 w->kcontrols[i] = kcontrol; 1019 } 1020 1021 return 0; 1022 } 1023 1024 /* We implement power down on suspend by checking the power state of 1025 * the ALSA card - when we are suspending the ALSA state for the card 1026 * is set to D3. 1027 */ 1028 static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget) 1029 { 1030 int level = snd_power_get_state(widget->dapm->card->snd_card); 1031 1032 switch (level) { 1033 case SNDRV_CTL_POWER_D3hot: 1034 case SNDRV_CTL_POWER_D3cold: 1035 if (widget->ignore_suspend) 1036 dev_dbg(widget->dapm->dev, "ASoC: %s ignoring suspend\n", 1037 widget->name); 1038 return widget->ignore_suspend; 1039 default: 1040 return 1; 1041 } 1042 } 1043 1044 static int dapm_widget_list_create(struct snd_soc_dapm_widget_list **list, 1045 struct list_head *widgets) 1046 { 1047 struct snd_soc_dapm_widget *w; 1048 struct list_head *it; 1049 unsigned int size = 0; 1050 unsigned int i = 0; 1051 1052 list_for_each(it, widgets) 1053 size++; 1054 1055 *list = kzalloc(sizeof(**list) + size * sizeof(*w), GFP_KERNEL); 1056 if (*list == NULL) 1057 return -ENOMEM; 1058 1059 list_for_each_entry(w, widgets, work_list) 1060 (*list)->widgets[i++] = w; 1061 1062 (*list)->num_widgets = i; 1063 1064 return 0; 1065 } 1066 1067 /* 1068 * Common implementation for is_connected_output_ep() and 1069 * is_connected_input_ep(). The function is inlined since the combined size of 1070 * the two specialized functions is only marginally larger then the size of the 1071 * generic function and at the same time the fast path of the specialized 1072 * functions is significantly smaller than the generic function. 1073 */ 1074 static __always_inline int is_connected_ep(struct snd_soc_dapm_widget *widget, 1075 struct list_head *list, enum snd_soc_dapm_direction dir, 1076 int (*fn)(struct snd_soc_dapm_widget *, struct list_head *)) 1077 { 1078 enum snd_soc_dapm_direction rdir = SND_SOC_DAPM_DIR_REVERSE(dir); 1079 struct snd_soc_dapm_path *path; 1080 int con = 0; 1081 1082 if (widget->endpoints[dir] >= 0) 1083 return widget->endpoints[dir]; 1084 1085 DAPM_UPDATE_STAT(widget, path_checks); 1086 1087 /* do we need to add this widget to the list ? */ 1088 if (list) 1089 list_add_tail(&widget->work_list, list); 1090 1091 if ((widget->is_ep & SND_SOC_DAPM_DIR_TO_EP(dir)) && widget->connected) { 1092 widget->endpoints[dir] = snd_soc_dapm_suspend_check(widget); 1093 return widget->endpoints[dir]; 1094 } 1095 1096 snd_soc_dapm_widget_for_each_path(widget, rdir, path) { 1097 DAPM_UPDATE_STAT(widget, neighbour_checks); 1098 1099 if (path->weak || path->is_supply) 1100 continue; 1101 1102 if (path->walking) 1103 return 1; 1104 1105 trace_snd_soc_dapm_path(widget, dir, path); 1106 1107 if (path->connect) { 1108 path->walking = 1; 1109 con += fn(path->node[dir], list); 1110 path->walking = 0; 1111 } 1112 } 1113 1114 widget->endpoints[dir] = con; 1115 1116 return con; 1117 } 1118 1119 /* 1120 * Recursively check for a completed path to an active or physically connected 1121 * output widget. Returns number of complete paths. 1122 */ 1123 static int is_connected_output_ep(struct snd_soc_dapm_widget *widget, 1124 struct list_head *list) 1125 { 1126 return is_connected_ep(widget, list, SND_SOC_DAPM_DIR_OUT, 1127 is_connected_output_ep); 1128 } 1129 1130 /* 1131 * Recursively check for a completed path to an active or physically connected 1132 * input widget. Returns number of complete paths. 1133 */ 1134 static int is_connected_input_ep(struct snd_soc_dapm_widget *widget, 1135 struct list_head *list) 1136 { 1137 return is_connected_ep(widget, list, SND_SOC_DAPM_DIR_IN, 1138 is_connected_input_ep); 1139 } 1140 1141 /** 1142 * snd_soc_dapm_get_connected_widgets - query audio path and it's widgets. 1143 * @dai: the soc DAI. 1144 * @stream: stream direction. 1145 * @list: list of active widgets for this stream. 1146 * 1147 * Queries DAPM graph as to whether an valid audio stream path exists for 1148 * the initial stream specified by name. This takes into account 1149 * current mixer and mux kcontrol settings. Creates list of valid widgets. 1150 * 1151 * Returns the number of valid paths or negative error. 1152 */ 1153 int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream, 1154 struct snd_soc_dapm_widget_list **list) 1155 { 1156 struct snd_soc_card *card = dai->component->card; 1157 struct snd_soc_dapm_widget *w; 1158 LIST_HEAD(widgets); 1159 int paths; 1160 int ret; 1161 1162 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 1163 1164 /* 1165 * For is_connected_{output,input}_ep fully discover the graph we need 1166 * to reset the cached number of inputs and outputs. 1167 */ 1168 list_for_each_entry(w, &card->widgets, list) { 1169 w->endpoints[SND_SOC_DAPM_DIR_IN] = -1; 1170 w->endpoints[SND_SOC_DAPM_DIR_OUT] = -1; 1171 } 1172 1173 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 1174 paths = is_connected_output_ep(dai->playback_widget, &widgets); 1175 else 1176 paths = is_connected_input_ep(dai->capture_widget, &widgets); 1177 1178 /* Drop starting point */ 1179 list_del(widgets.next); 1180 1181 ret = dapm_widget_list_create(list, &widgets); 1182 if (ret) 1183 paths = ret; 1184 1185 trace_snd_soc_dapm_connected(paths, stream); 1186 mutex_unlock(&card->dapm_mutex); 1187 1188 return paths; 1189 } 1190 1191 /* 1192 * Handler for regulator supply widget. 1193 */ 1194 int dapm_regulator_event(struct snd_soc_dapm_widget *w, 1195 struct snd_kcontrol *kcontrol, int event) 1196 { 1197 int ret; 1198 1199 soc_dapm_async_complete(w->dapm); 1200 1201 if (SND_SOC_DAPM_EVENT_ON(event)) { 1202 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) { 1203 ret = regulator_allow_bypass(w->regulator, false); 1204 if (ret != 0) 1205 dev_warn(w->dapm->dev, 1206 "ASoC: Failed to unbypass %s: %d\n", 1207 w->name, ret); 1208 } 1209 1210 return regulator_enable(w->regulator); 1211 } else { 1212 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) { 1213 ret = regulator_allow_bypass(w->regulator, true); 1214 if (ret != 0) 1215 dev_warn(w->dapm->dev, 1216 "ASoC: Failed to bypass %s: %d\n", 1217 w->name, ret); 1218 } 1219 1220 return regulator_disable_deferred(w->regulator, w->shift); 1221 } 1222 } 1223 EXPORT_SYMBOL_GPL(dapm_regulator_event); 1224 1225 /* 1226 * Handler for clock supply widget. 1227 */ 1228 int dapm_clock_event(struct snd_soc_dapm_widget *w, 1229 struct snd_kcontrol *kcontrol, int event) 1230 { 1231 if (!w->clk) 1232 return -EIO; 1233 1234 soc_dapm_async_complete(w->dapm); 1235 1236 #ifdef CONFIG_HAVE_CLK 1237 if (SND_SOC_DAPM_EVENT_ON(event)) { 1238 return clk_prepare_enable(w->clk); 1239 } else { 1240 clk_disable_unprepare(w->clk); 1241 return 0; 1242 } 1243 #endif 1244 return 0; 1245 } 1246 EXPORT_SYMBOL_GPL(dapm_clock_event); 1247 1248 static int dapm_widget_power_check(struct snd_soc_dapm_widget *w) 1249 { 1250 if (w->power_checked) 1251 return w->new_power; 1252 1253 if (w->force) 1254 w->new_power = 1; 1255 else 1256 w->new_power = w->power_check(w); 1257 1258 w->power_checked = true; 1259 1260 return w->new_power; 1261 } 1262 1263 /* Generic check to see if a widget should be powered. 1264 */ 1265 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w) 1266 { 1267 int in, out; 1268 1269 DAPM_UPDATE_STAT(w, power_checks); 1270 1271 in = is_connected_input_ep(w, NULL); 1272 out = is_connected_output_ep(w, NULL); 1273 return out != 0 && in != 0; 1274 } 1275 1276 /* Check to see if a power supply is needed */ 1277 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w) 1278 { 1279 struct snd_soc_dapm_path *path; 1280 1281 DAPM_UPDATE_STAT(w, power_checks); 1282 1283 /* Check if one of our outputs is connected */ 1284 snd_soc_dapm_widget_for_each_sink_path(w, path) { 1285 DAPM_UPDATE_STAT(w, neighbour_checks); 1286 1287 if (path->weak) 1288 continue; 1289 1290 if (path->connected && 1291 !path->connected(path->source, path->sink)) 1292 continue; 1293 1294 if (dapm_widget_power_check(path->sink)) 1295 return 1; 1296 } 1297 1298 return 0; 1299 } 1300 1301 static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w) 1302 { 1303 return 1; 1304 } 1305 1306 static int dapm_seq_compare(struct snd_soc_dapm_widget *a, 1307 struct snd_soc_dapm_widget *b, 1308 bool power_up) 1309 { 1310 int *sort; 1311 1312 if (power_up) 1313 sort = dapm_up_seq; 1314 else 1315 sort = dapm_down_seq; 1316 1317 if (sort[a->id] != sort[b->id]) 1318 return sort[a->id] - sort[b->id]; 1319 if (a->subseq != b->subseq) { 1320 if (power_up) 1321 return a->subseq - b->subseq; 1322 else 1323 return b->subseq - a->subseq; 1324 } 1325 if (a->reg != b->reg) 1326 return a->reg - b->reg; 1327 if (a->dapm != b->dapm) 1328 return (unsigned long)a->dapm - (unsigned long)b->dapm; 1329 1330 return 0; 1331 } 1332 1333 /* Insert a widget in order into a DAPM power sequence. */ 1334 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget, 1335 struct list_head *list, 1336 bool power_up) 1337 { 1338 struct snd_soc_dapm_widget *w; 1339 1340 list_for_each_entry(w, list, power_list) 1341 if (dapm_seq_compare(new_widget, w, power_up) < 0) { 1342 list_add_tail(&new_widget->power_list, &w->power_list); 1343 return; 1344 } 1345 1346 list_add_tail(&new_widget->power_list, list); 1347 } 1348 1349 static void dapm_seq_check_event(struct snd_soc_card *card, 1350 struct snd_soc_dapm_widget *w, int event) 1351 { 1352 const char *ev_name; 1353 int power, ret; 1354 1355 switch (event) { 1356 case SND_SOC_DAPM_PRE_PMU: 1357 ev_name = "PRE_PMU"; 1358 power = 1; 1359 break; 1360 case SND_SOC_DAPM_POST_PMU: 1361 ev_name = "POST_PMU"; 1362 power = 1; 1363 break; 1364 case SND_SOC_DAPM_PRE_PMD: 1365 ev_name = "PRE_PMD"; 1366 power = 0; 1367 break; 1368 case SND_SOC_DAPM_POST_PMD: 1369 ev_name = "POST_PMD"; 1370 power = 0; 1371 break; 1372 case SND_SOC_DAPM_WILL_PMU: 1373 ev_name = "WILL_PMU"; 1374 power = 1; 1375 break; 1376 case SND_SOC_DAPM_WILL_PMD: 1377 ev_name = "WILL_PMD"; 1378 power = 0; 1379 break; 1380 default: 1381 WARN(1, "Unknown event %d\n", event); 1382 return; 1383 } 1384 1385 if (w->new_power != power) 1386 return; 1387 1388 if (w->event && (w->event_flags & event)) { 1389 pop_dbg(w->dapm->dev, card->pop_time, "pop test : %s %s\n", 1390 w->name, ev_name); 1391 soc_dapm_async_complete(w->dapm); 1392 trace_snd_soc_dapm_widget_event_start(w, event); 1393 ret = w->event(w, NULL, event); 1394 trace_snd_soc_dapm_widget_event_done(w, event); 1395 if (ret < 0) 1396 dev_err(w->dapm->dev, "ASoC: %s: %s event failed: %d\n", 1397 ev_name, w->name, ret); 1398 } 1399 } 1400 1401 /* Apply the coalesced changes from a DAPM sequence */ 1402 static void dapm_seq_run_coalesced(struct snd_soc_card *card, 1403 struct list_head *pending) 1404 { 1405 struct snd_soc_dapm_context *dapm; 1406 struct snd_soc_dapm_widget *w; 1407 int reg; 1408 unsigned int value = 0; 1409 unsigned int mask = 0; 1410 1411 w = list_first_entry(pending, struct snd_soc_dapm_widget, power_list); 1412 reg = w->reg; 1413 dapm = w->dapm; 1414 1415 list_for_each_entry(w, pending, power_list) { 1416 WARN_ON(reg != w->reg || dapm != w->dapm); 1417 w->power = w->new_power; 1418 1419 mask |= w->mask << w->shift; 1420 if (w->power) 1421 value |= w->on_val << w->shift; 1422 else 1423 value |= w->off_val << w->shift; 1424 1425 pop_dbg(dapm->dev, card->pop_time, 1426 "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n", 1427 w->name, reg, value, mask); 1428 1429 /* Check for events */ 1430 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMU); 1431 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMD); 1432 } 1433 1434 if (reg >= 0) { 1435 /* Any widget will do, they should all be updating the 1436 * same register. 1437 */ 1438 1439 pop_dbg(dapm->dev, card->pop_time, 1440 "pop test : Applying 0x%x/0x%x to %x in %dms\n", 1441 value, mask, reg, card->pop_time); 1442 pop_wait(card->pop_time); 1443 soc_dapm_update_bits(dapm, reg, mask, value); 1444 } 1445 1446 list_for_each_entry(w, pending, power_list) { 1447 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMU); 1448 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMD); 1449 } 1450 } 1451 1452 /* Apply a DAPM power sequence. 1453 * 1454 * We walk over a pre-sorted list of widgets to apply power to. In 1455 * order to minimise the number of writes to the device required 1456 * multiple widgets will be updated in a single write where possible. 1457 * Currently anything that requires more than a single write is not 1458 * handled. 1459 */ 1460 static void dapm_seq_run(struct snd_soc_card *card, 1461 struct list_head *list, int event, bool power_up) 1462 { 1463 struct snd_soc_dapm_widget *w, *n; 1464 struct snd_soc_dapm_context *d; 1465 LIST_HEAD(pending); 1466 int cur_sort = -1; 1467 int cur_subseq = -1; 1468 int cur_reg = SND_SOC_NOPM; 1469 struct snd_soc_dapm_context *cur_dapm = NULL; 1470 int ret, i; 1471 int *sort; 1472 1473 if (power_up) 1474 sort = dapm_up_seq; 1475 else 1476 sort = dapm_down_seq; 1477 1478 list_for_each_entry_safe(w, n, list, power_list) { 1479 ret = 0; 1480 1481 /* Do we need to apply any queued changes? */ 1482 if (sort[w->id] != cur_sort || w->reg != cur_reg || 1483 w->dapm != cur_dapm || w->subseq != cur_subseq) { 1484 if (!list_empty(&pending)) 1485 dapm_seq_run_coalesced(card, &pending); 1486 1487 if (cur_dapm && cur_dapm->seq_notifier) { 1488 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++) 1489 if (sort[i] == cur_sort) 1490 cur_dapm->seq_notifier(cur_dapm, 1491 i, 1492 cur_subseq); 1493 } 1494 1495 if (cur_dapm && w->dapm != cur_dapm) 1496 soc_dapm_async_complete(cur_dapm); 1497 1498 INIT_LIST_HEAD(&pending); 1499 cur_sort = -1; 1500 cur_subseq = INT_MIN; 1501 cur_reg = SND_SOC_NOPM; 1502 cur_dapm = NULL; 1503 } 1504 1505 switch (w->id) { 1506 case snd_soc_dapm_pre: 1507 if (!w->event) 1508 list_for_each_entry_safe_continue(w, n, list, 1509 power_list); 1510 1511 if (event == SND_SOC_DAPM_STREAM_START) 1512 ret = w->event(w, 1513 NULL, SND_SOC_DAPM_PRE_PMU); 1514 else if (event == SND_SOC_DAPM_STREAM_STOP) 1515 ret = w->event(w, 1516 NULL, SND_SOC_DAPM_PRE_PMD); 1517 break; 1518 1519 case snd_soc_dapm_post: 1520 if (!w->event) 1521 list_for_each_entry_safe_continue(w, n, list, 1522 power_list); 1523 1524 if (event == SND_SOC_DAPM_STREAM_START) 1525 ret = w->event(w, 1526 NULL, SND_SOC_DAPM_POST_PMU); 1527 else if (event == SND_SOC_DAPM_STREAM_STOP) 1528 ret = w->event(w, 1529 NULL, SND_SOC_DAPM_POST_PMD); 1530 break; 1531 1532 default: 1533 /* Queue it up for application */ 1534 cur_sort = sort[w->id]; 1535 cur_subseq = w->subseq; 1536 cur_reg = w->reg; 1537 cur_dapm = w->dapm; 1538 list_move(&w->power_list, &pending); 1539 break; 1540 } 1541 1542 if (ret < 0) 1543 dev_err(w->dapm->dev, 1544 "ASoC: Failed to apply widget power: %d\n", ret); 1545 } 1546 1547 if (!list_empty(&pending)) 1548 dapm_seq_run_coalesced(card, &pending); 1549 1550 if (cur_dapm && cur_dapm->seq_notifier) { 1551 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++) 1552 if (sort[i] == cur_sort) 1553 cur_dapm->seq_notifier(cur_dapm, 1554 i, cur_subseq); 1555 } 1556 1557 list_for_each_entry(d, &card->dapm_list, list) { 1558 soc_dapm_async_complete(d); 1559 } 1560 } 1561 1562 static void dapm_widget_update(struct snd_soc_card *card) 1563 { 1564 struct snd_soc_dapm_update *update = card->update; 1565 struct snd_soc_dapm_widget_list *wlist; 1566 struct snd_soc_dapm_widget *w = NULL; 1567 unsigned int wi; 1568 int ret; 1569 1570 if (!update || !dapm_kcontrol_is_powered(update->kcontrol)) 1571 return; 1572 1573 wlist = dapm_kcontrol_get_wlist(update->kcontrol); 1574 1575 for (wi = 0; wi < wlist->num_widgets; wi++) { 1576 w = wlist->widgets[wi]; 1577 1578 if (w->event && (w->event_flags & SND_SOC_DAPM_PRE_REG)) { 1579 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG); 1580 if (ret != 0) 1581 dev_err(w->dapm->dev, "ASoC: %s DAPM pre-event failed: %d\n", 1582 w->name, ret); 1583 } 1584 } 1585 1586 if (!w) 1587 return; 1588 1589 ret = soc_dapm_update_bits(w->dapm, update->reg, update->mask, 1590 update->val); 1591 if (ret < 0) 1592 dev_err(w->dapm->dev, "ASoC: %s DAPM update failed: %d\n", 1593 w->name, ret); 1594 1595 for (wi = 0; wi < wlist->num_widgets; wi++) { 1596 w = wlist->widgets[wi]; 1597 1598 if (w->event && (w->event_flags & SND_SOC_DAPM_POST_REG)) { 1599 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG); 1600 if (ret != 0) 1601 dev_err(w->dapm->dev, "ASoC: %s DAPM post-event failed: %d\n", 1602 w->name, ret); 1603 } 1604 } 1605 } 1606 1607 /* Async callback run prior to DAPM sequences - brings to _PREPARE if 1608 * they're changing state. 1609 */ 1610 static void dapm_pre_sequence_async(void *data, async_cookie_t cookie) 1611 { 1612 struct snd_soc_dapm_context *d = data; 1613 int ret; 1614 1615 /* If we're off and we're not supposed to be go into STANDBY */ 1616 if (d->bias_level == SND_SOC_BIAS_OFF && 1617 d->target_bias_level != SND_SOC_BIAS_OFF) { 1618 if (d->dev) 1619 pm_runtime_get_sync(d->dev); 1620 1621 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY); 1622 if (ret != 0) 1623 dev_err(d->dev, 1624 "ASoC: Failed to turn on bias: %d\n", ret); 1625 } 1626 1627 /* Prepare for a transition to ON or away from ON */ 1628 if ((d->target_bias_level == SND_SOC_BIAS_ON && 1629 d->bias_level != SND_SOC_BIAS_ON) || 1630 (d->target_bias_level != SND_SOC_BIAS_ON && 1631 d->bias_level == SND_SOC_BIAS_ON)) { 1632 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_PREPARE); 1633 if (ret != 0) 1634 dev_err(d->dev, 1635 "ASoC: Failed to prepare bias: %d\n", ret); 1636 } 1637 } 1638 1639 /* Async callback run prior to DAPM sequences - brings to their final 1640 * state. 1641 */ 1642 static void dapm_post_sequence_async(void *data, async_cookie_t cookie) 1643 { 1644 struct snd_soc_dapm_context *d = data; 1645 int ret; 1646 1647 /* If we just powered the last thing off drop to standby bias */ 1648 if (d->bias_level == SND_SOC_BIAS_PREPARE && 1649 (d->target_bias_level == SND_SOC_BIAS_STANDBY || 1650 d->target_bias_level == SND_SOC_BIAS_OFF)) { 1651 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY); 1652 if (ret != 0) 1653 dev_err(d->dev, "ASoC: Failed to apply standby bias: %d\n", 1654 ret); 1655 } 1656 1657 /* If we're in standby and can support bias off then do that */ 1658 if (d->bias_level == SND_SOC_BIAS_STANDBY && 1659 d->target_bias_level == SND_SOC_BIAS_OFF) { 1660 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_OFF); 1661 if (ret != 0) 1662 dev_err(d->dev, "ASoC: Failed to turn off bias: %d\n", 1663 ret); 1664 1665 if (d->dev) 1666 pm_runtime_put(d->dev); 1667 } 1668 1669 /* If we just powered up then move to active bias */ 1670 if (d->bias_level == SND_SOC_BIAS_PREPARE && 1671 d->target_bias_level == SND_SOC_BIAS_ON) { 1672 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_ON); 1673 if (ret != 0) 1674 dev_err(d->dev, "ASoC: Failed to apply active bias: %d\n", 1675 ret); 1676 } 1677 } 1678 1679 static void dapm_widget_set_peer_power(struct snd_soc_dapm_widget *peer, 1680 bool power, bool connect) 1681 { 1682 /* If a connection is being made or broken then that update 1683 * will have marked the peer dirty, otherwise the widgets are 1684 * not connected and this update has no impact. */ 1685 if (!connect) 1686 return; 1687 1688 /* If the peer is already in the state we're moving to then we 1689 * won't have an impact on it. */ 1690 if (power != peer->power) 1691 dapm_mark_dirty(peer, "peer state change"); 1692 } 1693 1694 static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power, 1695 struct list_head *up_list, 1696 struct list_head *down_list) 1697 { 1698 struct snd_soc_dapm_path *path; 1699 1700 if (w->power == power) 1701 return; 1702 1703 trace_snd_soc_dapm_widget_power(w, power); 1704 1705 /* If we changed our power state perhaps our neigbours changed 1706 * also. 1707 */ 1708 snd_soc_dapm_widget_for_each_source_path(w, path) 1709 dapm_widget_set_peer_power(path->source, power, path->connect); 1710 1711 /* Supplies can't affect their outputs, only their inputs */ 1712 if (!w->is_supply) { 1713 snd_soc_dapm_widget_for_each_sink_path(w, path) 1714 dapm_widget_set_peer_power(path->sink, power, 1715 path->connect); 1716 } 1717 1718 if (power) 1719 dapm_seq_insert(w, up_list, true); 1720 else 1721 dapm_seq_insert(w, down_list, false); 1722 } 1723 1724 static void dapm_power_one_widget(struct snd_soc_dapm_widget *w, 1725 struct list_head *up_list, 1726 struct list_head *down_list) 1727 { 1728 int power; 1729 1730 switch (w->id) { 1731 case snd_soc_dapm_pre: 1732 dapm_seq_insert(w, down_list, false); 1733 break; 1734 case snd_soc_dapm_post: 1735 dapm_seq_insert(w, up_list, true); 1736 break; 1737 1738 default: 1739 power = dapm_widget_power_check(w); 1740 1741 dapm_widget_set_power(w, power, up_list, down_list); 1742 break; 1743 } 1744 } 1745 1746 static bool dapm_idle_bias_off(struct snd_soc_dapm_context *dapm) 1747 { 1748 if (dapm->idle_bias_off) 1749 return true; 1750 1751 switch (snd_power_get_state(dapm->card->snd_card)) { 1752 case SNDRV_CTL_POWER_D3hot: 1753 case SNDRV_CTL_POWER_D3cold: 1754 return dapm->suspend_bias_off; 1755 default: 1756 break; 1757 } 1758 1759 return false; 1760 } 1761 1762 /* 1763 * Scan each dapm widget for complete audio path. 1764 * A complete path is a route that has valid endpoints i.e.:- 1765 * 1766 * o DAC to output pin. 1767 * o Input Pin to ADC. 1768 * o Input pin to Output pin (bypass, sidetone) 1769 * o DAC to ADC (loopback). 1770 */ 1771 static int dapm_power_widgets(struct snd_soc_card *card, int event) 1772 { 1773 struct snd_soc_dapm_widget *w; 1774 struct snd_soc_dapm_context *d; 1775 LIST_HEAD(up_list); 1776 LIST_HEAD(down_list); 1777 ASYNC_DOMAIN_EXCLUSIVE(async_domain); 1778 enum snd_soc_bias_level bias; 1779 1780 lockdep_assert_held(&card->dapm_mutex); 1781 1782 trace_snd_soc_dapm_start(card); 1783 1784 list_for_each_entry(d, &card->dapm_list, list) { 1785 if (dapm_idle_bias_off(d)) 1786 d->target_bias_level = SND_SOC_BIAS_OFF; 1787 else 1788 d->target_bias_level = SND_SOC_BIAS_STANDBY; 1789 } 1790 1791 dapm_reset(card); 1792 1793 /* Check which widgets we need to power and store them in 1794 * lists indicating if they should be powered up or down. We 1795 * only check widgets that have been flagged as dirty but note 1796 * that new widgets may be added to the dirty list while we 1797 * iterate. 1798 */ 1799 list_for_each_entry(w, &card->dapm_dirty, dirty) { 1800 dapm_power_one_widget(w, &up_list, &down_list); 1801 } 1802 1803 list_for_each_entry(w, &card->widgets, list) { 1804 switch (w->id) { 1805 case snd_soc_dapm_pre: 1806 case snd_soc_dapm_post: 1807 /* These widgets always need to be powered */ 1808 break; 1809 default: 1810 list_del_init(&w->dirty); 1811 break; 1812 } 1813 1814 if (w->new_power) { 1815 d = w->dapm; 1816 1817 /* Supplies and micbiases only bring the 1818 * context up to STANDBY as unless something 1819 * else is active and passing audio they 1820 * generally don't require full power. Signal 1821 * generators are virtual pins and have no 1822 * power impact themselves. 1823 */ 1824 switch (w->id) { 1825 case snd_soc_dapm_siggen: 1826 case snd_soc_dapm_vmid: 1827 break; 1828 case snd_soc_dapm_supply: 1829 case snd_soc_dapm_regulator_supply: 1830 case snd_soc_dapm_clock_supply: 1831 case snd_soc_dapm_micbias: 1832 if (d->target_bias_level < SND_SOC_BIAS_STANDBY) 1833 d->target_bias_level = SND_SOC_BIAS_STANDBY; 1834 break; 1835 default: 1836 d->target_bias_level = SND_SOC_BIAS_ON; 1837 break; 1838 } 1839 } 1840 1841 } 1842 1843 /* Force all contexts in the card to the same bias state if 1844 * they're not ground referenced. 1845 */ 1846 bias = SND_SOC_BIAS_OFF; 1847 list_for_each_entry(d, &card->dapm_list, list) 1848 if (d->target_bias_level > bias) 1849 bias = d->target_bias_level; 1850 list_for_each_entry(d, &card->dapm_list, list) 1851 if (!dapm_idle_bias_off(d)) 1852 d->target_bias_level = bias; 1853 1854 trace_snd_soc_dapm_walk_done(card); 1855 1856 /* Run card bias changes at first */ 1857 dapm_pre_sequence_async(&card->dapm, 0); 1858 /* Run other bias changes in parallel */ 1859 list_for_each_entry(d, &card->dapm_list, list) { 1860 if (d != &card->dapm) 1861 async_schedule_domain(dapm_pre_sequence_async, d, 1862 &async_domain); 1863 } 1864 async_synchronize_full_domain(&async_domain); 1865 1866 list_for_each_entry(w, &down_list, power_list) { 1867 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMD); 1868 } 1869 1870 list_for_each_entry(w, &up_list, power_list) { 1871 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMU); 1872 } 1873 1874 /* Power down widgets first; try to avoid amplifying pops. */ 1875 dapm_seq_run(card, &down_list, event, false); 1876 1877 dapm_widget_update(card); 1878 1879 /* Now power up. */ 1880 dapm_seq_run(card, &up_list, event, true); 1881 1882 /* Run all the bias changes in parallel */ 1883 list_for_each_entry(d, &card->dapm_list, list) { 1884 if (d != &card->dapm) 1885 async_schedule_domain(dapm_post_sequence_async, d, 1886 &async_domain); 1887 } 1888 async_synchronize_full_domain(&async_domain); 1889 /* Run card bias changes at last */ 1890 dapm_post_sequence_async(&card->dapm, 0); 1891 1892 /* do we need to notify any clients that DAPM event is complete */ 1893 list_for_each_entry(d, &card->dapm_list, list) { 1894 if (d->stream_event) 1895 d->stream_event(d, event); 1896 } 1897 1898 pop_dbg(card->dev, card->pop_time, 1899 "DAPM sequencing finished, waiting %dms\n", card->pop_time); 1900 pop_wait(card->pop_time); 1901 1902 trace_snd_soc_dapm_done(card); 1903 1904 return 0; 1905 } 1906 1907 #ifdef CONFIG_DEBUG_FS 1908 static ssize_t dapm_widget_power_read_file(struct file *file, 1909 char __user *user_buf, 1910 size_t count, loff_t *ppos) 1911 { 1912 struct snd_soc_dapm_widget *w = file->private_data; 1913 struct snd_soc_card *card = w->dapm->card; 1914 enum snd_soc_dapm_direction dir, rdir; 1915 char *buf; 1916 int in, out; 1917 ssize_t ret; 1918 struct snd_soc_dapm_path *p = NULL; 1919 1920 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 1921 if (!buf) 1922 return -ENOMEM; 1923 1924 mutex_lock(&card->dapm_mutex); 1925 1926 /* Supply widgets are not handled by is_connected_{input,output}_ep() */ 1927 if (w->is_supply) { 1928 in = 0; 1929 out = 0; 1930 } else { 1931 in = is_connected_input_ep(w, NULL); 1932 out = is_connected_output_ep(w, NULL); 1933 } 1934 1935 ret = snprintf(buf, PAGE_SIZE, "%s: %s%s in %d out %d", 1936 w->name, w->power ? "On" : "Off", 1937 w->force ? " (forced)" : "", in, out); 1938 1939 if (w->reg >= 0) 1940 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1941 " - R%d(0x%x) mask 0x%x", 1942 w->reg, w->reg, w->mask << w->shift); 1943 1944 ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n"); 1945 1946 if (w->sname) 1947 ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n", 1948 w->sname, 1949 w->active ? "active" : "inactive"); 1950 1951 snd_soc_dapm_for_each_direction(dir) { 1952 rdir = SND_SOC_DAPM_DIR_REVERSE(dir); 1953 snd_soc_dapm_widget_for_each_path(w, dir, p) { 1954 if (p->connected && !p->connected(w, p->node[rdir])) 1955 continue; 1956 1957 if (!p->connect) 1958 continue; 1959 1960 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1961 " %s \"%s\" \"%s\"\n", 1962 (rdir == SND_SOC_DAPM_DIR_IN) ? "in" : "out", 1963 p->name ? p->name : "static", 1964 p->node[rdir]->name); 1965 } 1966 } 1967 1968 mutex_unlock(&card->dapm_mutex); 1969 1970 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); 1971 1972 kfree(buf); 1973 return ret; 1974 } 1975 1976 static const struct file_operations dapm_widget_power_fops = { 1977 .open = simple_open, 1978 .read = dapm_widget_power_read_file, 1979 .llseek = default_llseek, 1980 }; 1981 1982 static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, 1983 size_t count, loff_t *ppos) 1984 { 1985 struct snd_soc_dapm_context *dapm = file->private_data; 1986 char *level; 1987 1988 switch (dapm->bias_level) { 1989 case SND_SOC_BIAS_ON: 1990 level = "On\n"; 1991 break; 1992 case SND_SOC_BIAS_PREPARE: 1993 level = "Prepare\n"; 1994 break; 1995 case SND_SOC_BIAS_STANDBY: 1996 level = "Standby\n"; 1997 break; 1998 case SND_SOC_BIAS_OFF: 1999 level = "Off\n"; 2000 break; 2001 default: 2002 WARN(1, "Unknown bias_level %d\n", dapm->bias_level); 2003 level = "Unknown\n"; 2004 break; 2005 } 2006 2007 return simple_read_from_buffer(user_buf, count, ppos, level, 2008 strlen(level)); 2009 } 2010 2011 static const struct file_operations dapm_bias_fops = { 2012 .open = simple_open, 2013 .read = dapm_bias_read_file, 2014 .llseek = default_llseek, 2015 }; 2016 2017 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, 2018 struct dentry *parent) 2019 { 2020 struct dentry *d; 2021 2022 if (!parent) 2023 return; 2024 2025 dapm->debugfs_dapm = debugfs_create_dir("dapm", parent); 2026 2027 if (!dapm->debugfs_dapm) { 2028 dev_warn(dapm->dev, 2029 "ASoC: Failed to create DAPM debugfs directory\n"); 2030 return; 2031 } 2032 2033 d = debugfs_create_file("bias_level", 0444, 2034 dapm->debugfs_dapm, dapm, 2035 &dapm_bias_fops); 2036 if (!d) 2037 dev_warn(dapm->dev, 2038 "ASoC: Failed to create bias level debugfs file\n"); 2039 } 2040 2041 static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) 2042 { 2043 struct snd_soc_dapm_context *dapm = w->dapm; 2044 struct dentry *d; 2045 2046 if (!dapm->debugfs_dapm || !w->name) 2047 return; 2048 2049 d = debugfs_create_file(w->name, 0444, 2050 dapm->debugfs_dapm, w, 2051 &dapm_widget_power_fops); 2052 if (!d) 2053 dev_warn(w->dapm->dev, 2054 "ASoC: Failed to create %s debugfs file\n", 2055 w->name); 2056 } 2057 2058 static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) 2059 { 2060 debugfs_remove_recursive(dapm->debugfs_dapm); 2061 } 2062 2063 #else 2064 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, 2065 struct dentry *parent) 2066 { 2067 } 2068 2069 static inline void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) 2070 { 2071 } 2072 2073 static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) 2074 { 2075 } 2076 2077 #endif 2078 2079 /* 2080 * soc_dapm_connect_path() - Connects or disconnects a path 2081 * @path: The path to update 2082 * @connect: The new connect state of the path. True if the path is connected, 2083 * false if it is disconneted. 2084 * @reason: The reason why the path changed (for debugging only) 2085 */ 2086 static void soc_dapm_connect_path(struct snd_soc_dapm_path *path, 2087 bool connect, const char *reason) 2088 { 2089 if (path->connect == connect) 2090 return; 2091 2092 path->connect = connect; 2093 dapm_mark_dirty(path->source, reason); 2094 dapm_mark_dirty(path->sink, reason); 2095 dapm_path_invalidate(path); 2096 } 2097 2098 /* test and update the power status of a mux widget */ 2099 static int soc_dapm_mux_update_power(struct snd_soc_card *card, 2100 struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e) 2101 { 2102 struct snd_soc_dapm_path *path; 2103 int found = 0; 2104 bool connect; 2105 2106 lockdep_assert_held(&card->dapm_mutex); 2107 2108 /* find dapm widget path assoc with kcontrol */ 2109 dapm_kcontrol_for_each_path(path, kcontrol) { 2110 found = 1; 2111 /* we now need to match the string in the enum to the path */ 2112 if (!(strcmp(path->name, e->texts[mux]))) 2113 connect = true; 2114 else 2115 connect = false; 2116 2117 soc_dapm_connect_path(path, connect, "mux update"); 2118 } 2119 2120 if (found) 2121 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP); 2122 2123 return found; 2124 } 2125 2126 int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context *dapm, 2127 struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e, 2128 struct snd_soc_dapm_update *update) 2129 { 2130 struct snd_soc_card *card = dapm->card; 2131 int ret; 2132 2133 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2134 card->update = update; 2135 ret = soc_dapm_mux_update_power(card, kcontrol, mux, e); 2136 card->update = NULL; 2137 mutex_unlock(&card->dapm_mutex); 2138 if (ret > 0) 2139 soc_dpcm_runtime_update(card); 2140 return ret; 2141 } 2142 EXPORT_SYMBOL_GPL(snd_soc_dapm_mux_update_power); 2143 2144 /* test and update the power status of a mixer or switch widget */ 2145 static int soc_dapm_mixer_update_power(struct snd_soc_card *card, 2146 struct snd_kcontrol *kcontrol, int connect) 2147 { 2148 struct snd_soc_dapm_path *path; 2149 int found = 0; 2150 2151 lockdep_assert_held(&card->dapm_mutex); 2152 2153 /* find dapm widget path assoc with kcontrol */ 2154 dapm_kcontrol_for_each_path(path, kcontrol) { 2155 found = 1; 2156 soc_dapm_connect_path(path, connect, "mixer update"); 2157 } 2158 2159 if (found) 2160 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP); 2161 2162 return found; 2163 } 2164 2165 int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm, 2166 struct snd_kcontrol *kcontrol, int connect, 2167 struct snd_soc_dapm_update *update) 2168 { 2169 struct snd_soc_card *card = dapm->card; 2170 int ret; 2171 2172 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2173 card->update = update; 2174 ret = soc_dapm_mixer_update_power(card, kcontrol, connect); 2175 card->update = NULL; 2176 mutex_unlock(&card->dapm_mutex); 2177 if (ret > 0) 2178 soc_dpcm_runtime_update(card); 2179 return ret; 2180 } 2181 EXPORT_SYMBOL_GPL(snd_soc_dapm_mixer_update_power); 2182 2183 static ssize_t dapm_widget_show_component(struct snd_soc_component *cmpnt, 2184 char *buf) 2185 { 2186 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cmpnt); 2187 struct snd_soc_dapm_widget *w; 2188 int count = 0; 2189 char *state = "not set"; 2190 2191 list_for_each_entry(w, &cmpnt->card->widgets, list) { 2192 if (w->dapm != dapm) 2193 continue; 2194 2195 /* only display widgets that burnm power */ 2196 switch (w->id) { 2197 case snd_soc_dapm_hp: 2198 case snd_soc_dapm_mic: 2199 case snd_soc_dapm_spk: 2200 case snd_soc_dapm_line: 2201 case snd_soc_dapm_micbias: 2202 case snd_soc_dapm_dac: 2203 case snd_soc_dapm_adc: 2204 case snd_soc_dapm_pga: 2205 case snd_soc_dapm_out_drv: 2206 case snd_soc_dapm_mixer: 2207 case snd_soc_dapm_mixer_named_ctl: 2208 case snd_soc_dapm_supply: 2209 case snd_soc_dapm_regulator_supply: 2210 case snd_soc_dapm_clock_supply: 2211 if (w->name) 2212 count += sprintf(buf + count, "%s: %s\n", 2213 w->name, w->power ? "On":"Off"); 2214 break; 2215 default: 2216 break; 2217 } 2218 } 2219 2220 switch (snd_soc_dapm_get_bias_level(dapm)) { 2221 case SND_SOC_BIAS_ON: 2222 state = "On"; 2223 break; 2224 case SND_SOC_BIAS_PREPARE: 2225 state = "Prepare"; 2226 break; 2227 case SND_SOC_BIAS_STANDBY: 2228 state = "Standby"; 2229 break; 2230 case SND_SOC_BIAS_OFF: 2231 state = "Off"; 2232 break; 2233 } 2234 count += sprintf(buf + count, "PM State: %s\n", state); 2235 2236 return count; 2237 } 2238 2239 /* show dapm widget status in sys fs */ 2240 static ssize_t dapm_widget_show(struct device *dev, 2241 struct device_attribute *attr, char *buf) 2242 { 2243 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); 2244 int i, count = 0; 2245 2246 mutex_lock(&rtd->card->dapm_mutex); 2247 2248 for (i = 0; i < rtd->num_codecs; i++) { 2249 struct snd_soc_component *cmpnt = rtd->codec_dais[i]->component; 2250 2251 count += dapm_widget_show_component(cmpnt, buf + count); 2252 } 2253 2254 mutex_unlock(&rtd->card->dapm_mutex); 2255 2256 return count; 2257 } 2258 2259 static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); 2260 2261 struct attribute *soc_dapm_dev_attrs[] = { 2262 &dev_attr_dapm_widget.attr, 2263 NULL 2264 }; 2265 2266 static void dapm_free_path(struct snd_soc_dapm_path *path) 2267 { 2268 list_del(&path->list_node[SND_SOC_DAPM_DIR_IN]); 2269 list_del(&path->list_node[SND_SOC_DAPM_DIR_OUT]); 2270 list_del(&path->list_kcontrol); 2271 list_del(&path->list); 2272 kfree(path); 2273 } 2274 2275 void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w) 2276 { 2277 struct snd_soc_dapm_path *p, *next_p; 2278 enum snd_soc_dapm_direction dir; 2279 2280 list_del(&w->list); 2281 /* 2282 * remove source and sink paths associated to this widget. 2283 * While removing the path, remove reference to it from both 2284 * source and sink widgets so that path is removed only once. 2285 */ 2286 snd_soc_dapm_for_each_direction(dir) { 2287 snd_soc_dapm_widget_for_each_path_safe(w, dir, p, next_p) 2288 dapm_free_path(p); 2289 } 2290 2291 kfree(w->kcontrols); 2292 kfree_const(w->name); 2293 kfree(w); 2294 } 2295 2296 /* free all dapm widgets and resources */ 2297 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) 2298 { 2299 struct snd_soc_dapm_widget *w, *next_w; 2300 2301 list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) { 2302 if (w->dapm != dapm) 2303 continue; 2304 snd_soc_dapm_free_widget(w); 2305 } 2306 } 2307 2308 static struct snd_soc_dapm_widget *dapm_find_widget( 2309 struct snd_soc_dapm_context *dapm, const char *pin, 2310 bool search_other_contexts) 2311 { 2312 struct snd_soc_dapm_widget *w; 2313 struct snd_soc_dapm_widget *fallback = NULL; 2314 2315 list_for_each_entry(w, &dapm->card->widgets, list) { 2316 if (!strcmp(w->name, pin)) { 2317 if (w->dapm == dapm) 2318 return w; 2319 else 2320 fallback = w; 2321 } 2322 } 2323 2324 if (search_other_contexts) 2325 return fallback; 2326 2327 return NULL; 2328 } 2329 2330 static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, 2331 const char *pin, int status) 2332 { 2333 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 2334 2335 dapm_assert_locked(dapm); 2336 2337 if (!w) { 2338 dev_err(dapm->dev, "ASoC: DAPM unknown pin %s\n", pin); 2339 return -EINVAL; 2340 } 2341 2342 if (w->connected != status) { 2343 dapm_mark_dirty(w, "pin configuration"); 2344 dapm_widget_invalidate_input_paths(w); 2345 dapm_widget_invalidate_output_paths(w); 2346 } 2347 2348 w->connected = status; 2349 if (status == 0) 2350 w->force = 0; 2351 2352 return 0; 2353 } 2354 2355 /** 2356 * snd_soc_dapm_sync_unlocked - scan and power dapm paths 2357 * @dapm: DAPM context 2358 * 2359 * Walks all dapm audio paths and powers widgets according to their 2360 * stream or path usage. 2361 * 2362 * Requires external locking. 2363 * 2364 * Returns 0 for success. 2365 */ 2366 int snd_soc_dapm_sync_unlocked(struct snd_soc_dapm_context *dapm) 2367 { 2368 /* 2369 * Suppress early reports (eg, jacks syncing their state) to avoid 2370 * silly DAPM runs during card startup. 2371 */ 2372 if (!dapm->card || !dapm->card->instantiated) 2373 return 0; 2374 2375 return dapm_power_widgets(dapm->card, SND_SOC_DAPM_STREAM_NOP); 2376 } 2377 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync_unlocked); 2378 2379 /** 2380 * snd_soc_dapm_sync - scan and power dapm paths 2381 * @dapm: DAPM context 2382 * 2383 * Walks all dapm audio paths and powers widgets according to their 2384 * stream or path usage. 2385 * 2386 * Returns 0 for success. 2387 */ 2388 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm) 2389 { 2390 int ret; 2391 2392 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2393 ret = snd_soc_dapm_sync_unlocked(dapm); 2394 mutex_unlock(&dapm->card->dapm_mutex); 2395 return ret; 2396 } 2397 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync); 2398 2399 /* 2400 * dapm_update_widget_flags() - Re-compute widget sink and source flags 2401 * @w: The widget for which to update the flags 2402 * 2403 * Some widgets have a dynamic category which depends on which neighbors they 2404 * are connected to. This function update the category for these widgets. 2405 * 2406 * This function must be called whenever a path is added or removed to a widget. 2407 */ 2408 static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w) 2409 { 2410 enum snd_soc_dapm_direction dir; 2411 struct snd_soc_dapm_path *p; 2412 unsigned int ep; 2413 2414 switch (w->id) { 2415 case snd_soc_dapm_input: 2416 /* On a fully routed card a input is never a source */ 2417 if (w->dapm->card->fully_routed) 2418 return; 2419 ep = SND_SOC_DAPM_EP_SOURCE; 2420 snd_soc_dapm_widget_for_each_source_path(w, p) { 2421 if (p->source->id == snd_soc_dapm_micbias || 2422 p->source->id == snd_soc_dapm_mic || 2423 p->source->id == snd_soc_dapm_line || 2424 p->source->id == snd_soc_dapm_output) { 2425 ep = 0; 2426 break; 2427 } 2428 } 2429 break; 2430 case snd_soc_dapm_output: 2431 /* On a fully routed card a output is never a sink */ 2432 if (w->dapm->card->fully_routed) 2433 return; 2434 ep = SND_SOC_DAPM_EP_SINK; 2435 snd_soc_dapm_widget_for_each_sink_path(w, p) { 2436 if (p->sink->id == snd_soc_dapm_spk || 2437 p->sink->id == snd_soc_dapm_hp || 2438 p->sink->id == snd_soc_dapm_line || 2439 p->sink->id == snd_soc_dapm_input) { 2440 ep = 0; 2441 break; 2442 } 2443 } 2444 break; 2445 case snd_soc_dapm_line: 2446 ep = 0; 2447 snd_soc_dapm_for_each_direction(dir) { 2448 if (!list_empty(&w->edges[dir])) 2449 ep |= SND_SOC_DAPM_DIR_TO_EP(dir); 2450 } 2451 break; 2452 default: 2453 return; 2454 } 2455 2456 w->is_ep = ep; 2457 } 2458 2459 static int snd_soc_dapm_check_dynamic_path(struct snd_soc_dapm_context *dapm, 2460 struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink, 2461 const char *control) 2462 { 2463 bool dynamic_source = false; 2464 bool dynamic_sink = false; 2465 2466 if (!control) 2467 return 0; 2468 2469 switch (source->id) { 2470 case snd_soc_dapm_demux: 2471 dynamic_source = true; 2472 break; 2473 default: 2474 break; 2475 } 2476 2477 switch (sink->id) { 2478 case snd_soc_dapm_mux: 2479 case snd_soc_dapm_switch: 2480 case snd_soc_dapm_mixer: 2481 case snd_soc_dapm_mixer_named_ctl: 2482 dynamic_sink = true; 2483 break; 2484 default: 2485 break; 2486 } 2487 2488 if (dynamic_source && dynamic_sink) { 2489 dev_err(dapm->dev, 2490 "Direct connection between demux and mixer/mux not supported for path %s -> [%s] -> %s\n", 2491 source->name, control, sink->name); 2492 return -EINVAL; 2493 } else if (!dynamic_source && !dynamic_sink) { 2494 dev_err(dapm->dev, 2495 "Control not supported for path %s -> [%s] -> %s\n", 2496 source->name, control, sink->name); 2497 return -EINVAL; 2498 } 2499 2500 return 0; 2501 } 2502 2503 static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm, 2504 struct snd_soc_dapm_widget *wsource, struct snd_soc_dapm_widget *wsink, 2505 const char *control, 2506 int (*connected)(struct snd_soc_dapm_widget *source, 2507 struct snd_soc_dapm_widget *sink)) 2508 { 2509 struct snd_soc_dapm_widget *widgets[2]; 2510 enum snd_soc_dapm_direction dir; 2511 struct snd_soc_dapm_path *path; 2512 int ret; 2513 2514 if (wsink->is_supply && !wsource->is_supply) { 2515 dev_err(dapm->dev, 2516 "Connecting non-supply widget to supply widget is not supported (%s -> %s)\n", 2517 wsource->name, wsink->name); 2518 return -EINVAL; 2519 } 2520 2521 if (connected && !wsource->is_supply) { 2522 dev_err(dapm->dev, 2523 "connected() callback only supported for supply widgets (%s -> %s)\n", 2524 wsource->name, wsink->name); 2525 return -EINVAL; 2526 } 2527 2528 if (wsource->is_supply && control) { 2529 dev_err(dapm->dev, 2530 "Conditional paths are not supported for supply widgets (%s -> [%s] -> %s)\n", 2531 wsource->name, control, wsink->name); 2532 return -EINVAL; 2533 } 2534 2535 ret = snd_soc_dapm_check_dynamic_path(dapm, wsource, wsink, control); 2536 if (ret) 2537 return ret; 2538 2539 path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL); 2540 if (!path) 2541 return -ENOMEM; 2542 2543 path->node[SND_SOC_DAPM_DIR_IN] = wsource; 2544 path->node[SND_SOC_DAPM_DIR_OUT] = wsink; 2545 widgets[SND_SOC_DAPM_DIR_IN] = wsource; 2546 widgets[SND_SOC_DAPM_DIR_OUT] = wsink; 2547 2548 path->connected = connected; 2549 INIT_LIST_HEAD(&path->list); 2550 INIT_LIST_HEAD(&path->list_kcontrol); 2551 2552 if (wsource->is_supply || wsink->is_supply) 2553 path->is_supply = 1; 2554 2555 /* connect static paths */ 2556 if (control == NULL) { 2557 path->connect = 1; 2558 } else { 2559 switch (wsource->id) { 2560 case snd_soc_dapm_demux: 2561 ret = dapm_connect_mux(dapm, path, control, wsource); 2562 if (ret) 2563 goto err; 2564 break; 2565 default: 2566 break; 2567 } 2568 2569 switch (wsink->id) { 2570 case snd_soc_dapm_mux: 2571 ret = dapm_connect_mux(dapm, path, control, wsink); 2572 if (ret != 0) 2573 goto err; 2574 break; 2575 case snd_soc_dapm_switch: 2576 case snd_soc_dapm_mixer: 2577 case snd_soc_dapm_mixer_named_ctl: 2578 ret = dapm_connect_mixer(dapm, path, control); 2579 if (ret != 0) 2580 goto err; 2581 break; 2582 default: 2583 break; 2584 } 2585 } 2586 2587 list_add(&path->list, &dapm->card->paths); 2588 snd_soc_dapm_for_each_direction(dir) 2589 list_add(&path->list_node[dir], &widgets[dir]->edges[dir]); 2590 2591 snd_soc_dapm_for_each_direction(dir) { 2592 dapm_update_widget_flags(widgets[dir]); 2593 dapm_mark_dirty(widgets[dir], "Route added"); 2594 } 2595 2596 if (dapm->card->instantiated && path->connect) 2597 dapm_path_invalidate(path); 2598 2599 return 0; 2600 err: 2601 kfree(path); 2602 return ret; 2603 } 2604 2605 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm, 2606 const struct snd_soc_dapm_route *route) 2607 { 2608 struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w; 2609 struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL; 2610 const char *sink; 2611 const char *source; 2612 char prefixed_sink[80]; 2613 char prefixed_source[80]; 2614 const char *prefix; 2615 int ret; 2616 2617 prefix = soc_dapm_prefix(dapm); 2618 if (prefix) { 2619 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s", 2620 prefix, route->sink); 2621 sink = prefixed_sink; 2622 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s", 2623 prefix, route->source); 2624 source = prefixed_source; 2625 } else { 2626 sink = route->sink; 2627 source = route->source; 2628 } 2629 2630 wsource = dapm_wcache_lookup(&dapm->path_source_cache, source); 2631 wsink = dapm_wcache_lookup(&dapm->path_sink_cache, sink); 2632 2633 if (wsink && wsource) 2634 goto skip_search; 2635 2636 /* 2637 * find src and dest widgets over all widgets but favor a widget from 2638 * current DAPM context 2639 */ 2640 list_for_each_entry(w, &dapm->card->widgets, list) { 2641 if (!wsink && !(strcmp(w->name, sink))) { 2642 wtsink = w; 2643 if (w->dapm == dapm) { 2644 wsink = w; 2645 if (wsource) 2646 break; 2647 } 2648 continue; 2649 } 2650 if (!wsource && !(strcmp(w->name, source))) { 2651 wtsource = w; 2652 if (w->dapm == dapm) { 2653 wsource = w; 2654 if (wsink) 2655 break; 2656 } 2657 } 2658 } 2659 /* use widget from another DAPM context if not found from this */ 2660 if (!wsink) 2661 wsink = wtsink; 2662 if (!wsource) 2663 wsource = wtsource; 2664 2665 if (wsource == NULL) { 2666 dev_err(dapm->dev, "ASoC: no source widget found for %s\n", 2667 route->source); 2668 return -ENODEV; 2669 } 2670 if (wsink == NULL) { 2671 dev_err(dapm->dev, "ASoC: no sink widget found for %s\n", 2672 route->sink); 2673 return -ENODEV; 2674 } 2675 2676 skip_search: 2677 dapm_wcache_update(&dapm->path_sink_cache, wsink); 2678 dapm_wcache_update(&dapm->path_source_cache, wsource); 2679 2680 ret = snd_soc_dapm_add_path(dapm, wsource, wsink, route->control, 2681 route->connected); 2682 if (ret) 2683 goto err; 2684 2685 return 0; 2686 err: 2687 dev_warn(dapm->dev, "ASoC: no dapm match for %s --> %s --> %s\n", 2688 source, route->control, sink); 2689 return ret; 2690 } 2691 2692 static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm, 2693 const struct snd_soc_dapm_route *route) 2694 { 2695 struct snd_soc_dapm_widget *wsource, *wsink; 2696 struct snd_soc_dapm_path *path, *p; 2697 const char *sink; 2698 const char *source; 2699 char prefixed_sink[80]; 2700 char prefixed_source[80]; 2701 const char *prefix; 2702 2703 if (route->control) { 2704 dev_err(dapm->dev, 2705 "ASoC: Removal of routes with controls not supported\n"); 2706 return -EINVAL; 2707 } 2708 2709 prefix = soc_dapm_prefix(dapm); 2710 if (prefix) { 2711 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s", 2712 prefix, route->sink); 2713 sink = prefixed_sink; 2714 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s", 2715 prefix, route->source); 2716 source = prefixed_source; 2717 } else { 2718 sink = route->sink; 2719 source = route->source; 2720 } 2721 2722 path = NULL; 2723 list_for_each_entry(p, &dapm->card->paths, list) { 2724 if (strcmp(p->source->name, source) != 0) 2725 continue; 2726 if (strcmp(p->sink->name, sink) != 0) 2727 continue; 2728 path = p; 2729 break; 2730 } 2731 2732 if (path) { 2733 wsource = path->source; 2734 wsink = path->sink; 2735 2736 dapm_mark_dirty(wsource, "Route removed"); 2737 dapm_mark_dirty(wsink, "Route removed"); 2738 if (path->connect) 2739 dapm_path_invalidate(path); 2740 2741 dapm_free_path(path); 2742 2743 /* Update any path related flags */ 2744 dapm_update_widget_flags(wsource); 2745 dapm_update_widget_flags(wsink); 2746 } else { 2747 dev_warn(dapm->dev, "ASoC: Route %s->%s does not exist\n", 2748 source, sink); 2749 } 2750 2751 return 0; 2752 } 2753 2754 /** 2755 * snd_soc_dapm_add_routes - Add routes between DAPM widgets 2756 * @dapm: DAPM context 2757 * @route: audio routes 2758 * @num: number of routes 2759 * 2760 * Connects 2 dapm widgets together via a named audio path. The sink is 2761 * the widget receiving the audio signal, whilst the source is the sender 2762 * of the audio signal. 2763 * 2764 * Returns 0 for success else error. On error all resources can be freed 2765 * with a call to snd_soc_card_free(). 2766 */ 2767 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm, 2768 const struct snd_soc_dapm_route *route, int num) 2769 { 2770 int i, r, ret = 0; 2771 2772 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT); 2773 for (i = 0; i < num; i++) { 2774 r = snd_soc_dapm_add_route(dapm, route); 2775 if (r < 0) { 2776 dev_err(dapm->dev, "ASoC: Failed to add route %s -> %s -> %s\n", 2777 route->source, 2778 route->control ? route->control : "direct", 2779 route->sink); 2780 ret = r; 2781 } 2782 route++; 2783 } 2784 mutex_unlock(&dapm->card->dapm_mutex); 2785 2786 return ret; 2787 } 2788 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes); 2789 2790 /** 2791 * snd_soc_dapm_del_routes - Remove routes between DAPM widgets 2792 * @dapm: DAPM context 2793 * @route: audio routes 2794 * @num: number of routes 2795 * 2796 * Removes routes from the DAPM context. 2797 */ 2798 int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm, 2799 const struct snd_soc_dapm_route *route, int num) 2800 { 2801 int i, ret = 0; 2802 2803 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT); 2804 for (i = 0; i < num; i++) { 2805 snd_soc_dapm_del_route(dapm, route); 2806 route++; 2807 } 2808 mutex_unlock(&dapm->card->dapm_mutex); 2809 2810 return ret; 2811 } 2812 EXPORT_SYMBOL_GPL(snd_soc_dapm_del_routes); 2813 2814 static int snd_soc_dapm_weak_route(struct snd_soc_dapm_context *dapm, 2815 const struct snd_soc_dapm_route *route) 2816 { 2817 struct snd_soc_dapm_widget *source = dapm_find_widget(dapm, 2818 route->source, 2819 true); 2820 struct snd_soc_dapm_widget *sink = dapm_find_widget(dapm, 2821 route->sink, 2822 true); 2823 struct snd_soc_dapm_path *path; 2824 int count = 0; 2825 2826 if (!source) { 2827 dev_err(dapm->dev, "ASoC: Unable to find source %s for weak route\n", 2828 route->source); 2829 return -ENODEV; 2830 } 2831 2832 if (!sink) { 2833 dev_err(dapm->dev, "ASoC: Unable to find sink %s for weak route\n", 2834 route->sink); 2835 return -ENODEV; 2836 } 2837 2838 if (route->control || route->connected) 2839 dev_warn(dapm->dev, "ASoC: Ignoring control for weak route %s->%s\n", 2840 route->source, route->sink); 2841 2842 snd_soc_dapm_widget_for_each_sink_path(source, path) { 2843 if (path->sink == sink) { 2844 path->weak = 1; 2845 count++; 2846 } 2847 } 2848 2849 if (count == 0) 2850 dev_err(dapm->dev, "ASoC: No path found for weak route %s->%s\n", 2851 route->source, route->sink); 2852 if (count > 1) 2853 dev_warn(dapm->dev, "ASoC: %d paths found for weak route %s->%s\n", 2854 count, route->source, route->sink); 2855 2856 return 0; 2857 } 2858 2859 /** 2860 * snd_soc_dapm_weak_routes - Mark routes between DAPM widgets as weak 2861 * @dapm: DAPM context 2862 * @route: audio routes 2863 * @num: number of routes 2864 * 2865 * Mark existing routes matching those specified in the passed array 2866 * as being weak, meaning that they are ignored for the purpose of 2867 * power decisions. The main intended use case is for sidetone paths 2868 * which couple audio between other independent paths if they are both 2869 * active in order to make the combination work better at the user 2870 * level but which aren't intended to be "used". 2871 * 2872 * Note that CODEC drivers should not use this as sidetone type paths 2873 * can frequently also be used as bypass paths. 2874 */ 2875 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm, 2876 const struct snd_soc_dapm_route *route, int num) 2877 { 2878 int i, err; 2879 int ret = 0; 2880 2881 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT); 2882 for (i = 0; i < num; i++) { 2883 err = snd_soc_dapm_weak_route(dapm, route); 2884 if (err) 2885 ret = err; 2886 route++; 2887 } 2888 mutex_unlock(&dapm->card->dapm_mutex); 2889 2890 return ret; 2891 } 2892 EXPORT_SYMBOL_GPL(snd_soc_dapm_weak_routes); 2893 2894 /** 2895 * snd_soc_dapm_new_widgets - add new dapm widgets 2896 * @card: card to be checked for new dapm widgets 2897 * 2898 * Checks the codec for any new dapm widgets and creates them if found. 2899 * 2900 * Returns 0 for success. 2901 */ 2902 int snd_soc_dapm_new_widgets(struct snd_soc_card *card) 2903 { 2904 struct snd_soc_dapm_widget *w; 2905 unsigned int val; 2906 2907 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT); 2908 2909 list_for_each_entry(w, &card->widgets, list) 2910 { 2911 if (w->new) 2912 continue; 2913 2914 if (w->num_kcontrols) { 2915 w->kcontrols = kzalloc(w->num_kcontrols * 2916 sizeof(struct snd_kcontrol *), 2917 GFP_KERNEL); 2918 if (!w->kcontrols) { 2919 mutex_unlock(&card->dapm_mutex); 2920 return -ENOMEM; 2921 } 2922 } 2923 2924 switch(w->id) { 2925 case snd_soc_dapm_switch: 2926 case snd_soc_dapm_mixer: 2927 case snd_soc_dapm_mixer_named_ctl: 2928 dapm_new_mixer(w); 2929 break; 2930 case snd_soc_dapm_mux: 2931 case snd_soc_dapm_demux: 2932 dapm_new_mux(w); 2933 break; 2934 case snd_soc_dapm_pga: 2935 case snd_soc_dapm_out_drv: 2936 dapm_new_pga(w); 2937 break; 2938 case snd_soc_dapm_dai_link: 2939 dapm_new_dai_link(w); 2940 break; 2941 default: 2942 break; 2943 } 2944 2945 /* Read the initial power state from the device */ 2946 if (w->reg >= 0) { 2947 soc_dapm_read(w->dapm, w->reg, &val); 2948 val = val >> w->shift; 2949 val &= w->mask; 2950 if (val == w->on_val) 2951 w->power = 1; 2952 } 2953 2954 w->new = 1; 2955 2956 dapm_mark_dirty(w, "new widget"); 2957 dapm_debugfs_add_widget(w); 2958 } 2959 2960 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP); 2961 mutex_unlock(&card->dapm_mutex); 2962 return 0; 2963 } 2964 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets); 2965 2966 /** 2967 * snd_soc_dapm_get_volsw - dapm mixer get callback 2968 * @kcontrol: mixer control 2969 * @ucontrol: control element information 2970 * 2971 * Callback to get the value of a dapm mixer control. 2972 * 2973 * Returns 0 for success. 2974 */ 2975 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol, 2976 struct snd_ctl_elem_value *ucontrol) 2977 { 2978 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 2979 struct snd_soc_card *card = dapm->card; 2980 struct soc_mixer_control *mc = 2981 (struct soc_mixer_control *)kcontrol->private_value; 2982 int reg = mc->reg; 2983 unsigned int shift = mc->shift; 2984 int max = mc->max; 2985 unsigned int mask = (1 << fls(max)) - 1; 2986 unsigned int invert = mc->invert; 2987 unsigned int val; 2988 int ret = 0; 2989 2990 if (snd_soc_volsw_is_stereo(mc)) 2991 dev_warn(dapm->dev, 2992 "ASoC: Control '%s' is stereo, which is not supported\n", 2993 kcontrol->id.name); 2994 2995 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2996 if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM) { 2997 ret = soc_dapm_read(dapm, reg, &val); 2998 val = (val >> shift) & mask; 2999 } else { 3000 val = dapm_kcontrol_get_value(kcontrol); 3001 } 3002 mutex_unlock(&card->dapm_mutex); 3003 3004 if (invert) 3005 ucontrol->value.integer.value[0] = max - val; 3006 else 3007 ucontrol->value.integer.value[0] = val; 3008 3009 return ret; 3010 } 3011 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); 3012 3013 /** 3014 * snd_soc_dapm_put_volsw - dapm mixer set callback 3015 * @kcontrol: mixer control 3016 * @ucontrol: control element information 3017 * 3018 * Callback to set the value of a dapm mixer control. 3019 * 3020 * Returns 0 for success. 3021 */ 3022 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, 3023 struct snd_ctl_elem_value *ucontrol) 3024 { 3025 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 3026 struct snd_soc_card *card = dapm->card; 3027 struct soc_mixer_control *mc = 3028 (struct soc_mixer_control *)kcontrol->private_value; 3029 int reg = mc->reg; 3030 unsigned int shift = mc->shift; 3031 int max = mc->max; 3032 unsigned int mask = (1 << fls(max)) - 1; 3033 unsigned int invert = mc->invert; 3034 unsigned int val; 3035 int connect, change, reg_change = 0; 3036 struct snd_soc_dapm_update update; 3037 int ret = 0; 3038 3039 if (snd_soc_volsw_is_stereo(mc)) 3040 dev_warn(dapm->dev, 3041 "ASoC: Control '%s' is stereo, which is not supported\n", 3042 kcontrol->id.name); 3043 3044 val = (ucontrol->value.integer.value[0] & mask); 3045 connect = !!val; 3046 3047 if (invert) 3048 val = max - val; 3049 3050 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3051 3052 change = dapm_kcontrol_set_value(kcontrol, val); 3053 3054 if (reg != SND_SOC_NOPM) { 3055 mask = mask << shift; 3056 val = val << shift; 3057 3058 reg_change = soc_dapm_test_bits(dapm, reg, mask, val); 3059 } 3060 3061 if (change || reg_change) { 3062 if (reg_change) { 3063 update.kcontrol = kcontrol; 3064 update.reg = reg; 3065 update.mask = mask; 3066 update.val = val; 3067 card->update = &update; 3068 } 3069 change |= reg_change; 3070 3071 ret = soc_dapm_mixer_update_power(card, kcontrol, connect); 3072 3073 card->update = NULL; 3074 } 3075 3076 mutex_unlock(&card->dapm_mutex); 3077 3078 if (ret > 0) 3079 soc_dpcm_runtime_update(card); 3080 3081 return change; 3082 } 3083 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw); 3084 3085 /** 3086 * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback 3087 * @kcontrol: mixer control 3088 * @ucontrol: control element information 3089 * 3090 * Callback to get the value of a dapm enumerated double mixer control. 3091 * 3092 * Returns 0 for success. 3093 */ 3094 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol, 3095 struct snd_ctl_elem_value *ucontrol) 3096 { 3097 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 3098 struct snd_soc_card *card = dapm->card; 3099 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 3100 unsigned int reg_val, val; 3101 3102 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3103 if (e->reg != SND_SOC_NOPM && dapm_kcontrol_is_powered(kcontrol)) { 3104 int ret = soc_dapm_read(dapm, e->reg, ®_val); 3105 if (ret) { 3106 mutex_unlock(&card->dapm_mutex); 3107 return ret; 3108 } 3109 } else { 3110 reg_val = dapm_kcontrol_get_value(kcontrol); 3111 } 3112 mutex_unlock(&card->dapm_mutex); 3113 3114 val = (reg_val >> e->shift_l) & e->mask; 3115 ucontrol->value.enumerated.item[0] = snd_soc_enum_val_to_item(e, val); 3116 if (e->shift_l != e->shift_r) { 3117 val = (reg_val >> e->shift_r) & e->mask; 3118 val = snd_soc_enum_val_to_item(e, val); 3119 ucontrol->value.enumerated.item[1] = val; 3120 } 3121 3122 return 0; 3123 } 3124 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double); 3125 3126 /** 3127 * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback 3128 * @kcontrol: mixer control 3129 * @ucontrol: control element information 3130 * 3131 * Callback to set the value of a dapm enumerated double mixer control. 3132 * 3133 * Returns 0 for success. 3134 */ 3135 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, 3136 struct snd_ctl_elem_value *ucontrol) 3137 { 3138 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 3139 struct snd_soc_card *card = dapm->card; 3140 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 3141 unsigned int *item = ucontrol->value.enumerated.item; 3142 unsigned int val, change, reg_change = 0; 3143 unsigned int mask; 3144 struct snd_soc_dapm_update update; 3145 int ret = 0; 3146 3147 if (item[0] >= e->items) 3148 return -EINVAL; 3149 3150 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; 3151 mask = e->mask << e->shift_l; 3152 if (e->shift_l != e->shift_r) { 3153 if (item[1] > e->items) 3154 return -EINVAL; 3155 val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_l; 3156 mask |= e->mask << e->shift_r; 3157 } 3158 3159 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3160 3161 change = dapm_kcontrol_set_value(kcontrol, val); 3162 3163 if (e->reg != SND_SOC_NOPM) 3164 reg_change = soc_dapm_test_bits(dapm, e->reg, mask, val); 3165 3166 if (change || reg_change) { 3167 if (reg_change) { 3168 update.kcontrol = kcontrol; 3169 update.reg = e->reg; 3170 update.mask = mask; 3171 update.val = val; 3172 card->update = &update; 3173 } 3174 change |= reg_change; 3175 3176 ret = soc_dapm_mux_update_power(card, kcontrol, item[0], e); 3177 3178 card->update = NULL; 3179 } 3180 3181 mutex_unlock(&card->dapm_mutex); 3182 3183 if (ret > 0) 3184 soc_dpcm_runtime_update(card); 3185 3186 return change; 3187 } 3188 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double); 3189 3190 /** 3191 * snd_soc_dapm_info_pin_switch - Info for a pin switch 3192 * 3193 * @kcontrol: mixer control 3194 * @uinfo: control element information 3195 * 3196 * Callback to provide information about a pin switch control. 3197 */ 3198 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol, 3199 struct snd_ctl_elem_info *uinfo) 3200 { 3201 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 3202 uinfo->count = 1; 3203 uinfo->value.integer.min = 0; 3204 uinfo->value.integer.max = 1; 3205 3206 return 0; 3207 } 3208 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch); 3209 3210 /** 3211 * snd_soc_dapm_get_pin_switch - Get information for a pin switch 3212 * 3213 * @kcontrol: mixer control 3214 * @ucontrol: Value 3215 */ 3216 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol, 3217 struct snd_ctl_elem_value *ucontrol) 3218 { 3219 struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 3220 const char *pin = (const char *)kcontrol->private_value; 3221 3222 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3223 3224 ucontrol->value.integer.value[0] = 3225 snd_soc_dapm_get_pin_status(&card->dapm, pin); 3226 3227 mutex_unlock(&card->dapm_mutex); 3228 3229 return 0; 3230 } 3231 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch); 3232 3233 /** 3234 * snd_soc_dapm_put_pin_switch - Set information for a pin switch 3235 * 3236 * @kcontrol: mixer control 3237 * @ucontrol: Value 3238 */ 3239 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, 3240 struct snd_ctl_elem_value *ucontrol) 3241 { 3242 struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 3243 const char *pin = (const char *)kcontrol->private_value; 3244 3245 if (ucontrol->value.integer.value[0]) 3246 snd_soc_dapm_enable_pin(&card->dapm, pin); 3247 else 3248 snd_soc_dapm_disable_pin(&card->dapm, pin); 3249 3250 snd_soc_dapm_sync(&card->dapm); 3251 return 0; 3252 } 3253 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); 3254 3255 struct snd_soc_dapm_widget * 3256 snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, 3257 const struct snd_soc_dapm_widget *widget) 3258 { 3259 struct snd_soc_dapm_widget *w; 3260 3261 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3262 w = snd_soc_dapm_new_control_unlocked(dapm, widget); 3263 if (!w) 3264 dev_err(dapm->dev, 3265 "ASoC: Failed to create DAPM control %s\n", 3266 widget->name); 3267 3268 mutex_unlock(&dapm->card->dapm_mutex); 3269 return w; 3270 } 3271 3272 struct snd_soc_dapm_widget * 3273 snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, 3274 const struct snd_soc_dapm_widget *widget) 3275 { 3276 enum snd_soc_dapm_direction dir; 3277 struct snd_soc_dapm_widget *w; 3278 const char *prefix; 3279 int ret; 3280 3281 if ((w = dapm_cnew_widget(widget)) == NULL) 3282 return NULL; 3283 3284 switch (w->id) { 3285 case snd_soc_dapm_regulator_supply: 3286 w->regulator = devm_regulator_get(dapm->dev, w->name); 3287 if (IS_ERR(w->regulator)) { 3288 ret = PTR_ERR(w->regulator); 3289 dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n", 3290 w->name, ret); 3291 return NULL; 3292 } 3293 3294 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) { 3295 ret = regulator_allow_bypass(w->regulator, true); 3296 if (ret != 0) 3297 dev_warn(w->dapm->dev, 3298 "ASoC: Failed to bypass %s: %d\n", 3299 w->name, ret); 3300 } 3301 break; 3302 case snd_soc_dapm_clock_supply: 3303 #ifdef CONFIG_CLKDEV_LOOKUP 3304 w->clk = devm_clk_get(dapm->dev, w->name); 3305 if (IS_ERR(w->clk)) { 3306 ret = PTR_ERR(w->clk); 3307 dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n", 3308 w->name, ret); 3309 return NULL; 3310 } 3311 #else 3312 return NULL; 3313 #endif 3314 break; 3315 default: 3316 break; 3317 } 3318 3319 prefix = soc_dapm_prefix(dapm); 3320 if (prefix) 3321 w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); 3322 else 3323 w->name = kstrdup_const(widget->name, GFP_KERNEL); 3324 if (w->name == NULL) { 3325 kfree(w); 3326 return NULL; 3327 } 3328 3329 switch (w->id) { 3330 case snd_soc_dapm_mic: 3331 w->is_ep = SND_SOC_DAPM_EP_SOURCE; 3332 w->power_check = dapm_generic_check_power; 3333 break; 3334 case snd_soc_dapm_input: 3335 if (!dapm->card->fully_routed) 3336 w->is_ep = SND_SOC_DAPM_EP_SOURCE; 3337 w->power_check = dapm_generic_check_power; 3338 break; 3339 case snd_soc_dapm_spk: 3340 case snd_soc_dapm_hp: 3341 w->is_ep = SND_SOC_DAPM_EP_SINK; 3342 w->power_check = dapm_generic_check_power; 3343 break; 3344 case snd_soc_dapm_output: 3345 if (!dapm->card->fully_routed) 3346 w->is_ep = SND_SOC_DAPM_EP_SINK; 3347 w->power_check = dapm_generic_check_power; 3348 break; 3349 case snd_soc_dapm_vmid: 3350 case snd_soc_dapm_siggen: 3351 w->is_ep = SND_SOC_DAPM_EP_SOURCE; 3352 w->power_check = dapm_always_on_check_power; 3353 break; 3354 case snd_soc_dapm_mux: 3355 case snd_soc_dapm_demux: 3356 case snd_soc_dapm_switch: 3357 case snd_soc_dapm_mixer: 3358 case snd_soc_dapm_mixer_named_ctl: 3359 case snd_soc_dapm_adc: 3360 case snd_soc_dapm_aif_out: 3361 case snd_soc_dapm_dac: 3362 case snd_soc_dapm_aif_in: 3363 case snd_soc_dapm_pga: 3364 case snd_soc_dapm_out_drv: 3365 case snd_soc_dapm_micbias: 3366 case snd_soc_dapm_line: 3367 case snd_soc_dapm_dai_link: 3368 case snd_soc_dapm_dai_out: 3369 case snd_soc_dapm_dai_in: 3370 w->power_check = dapm_generic_check_power; 3371 break; 3372 case snd_soc_dapm_supply: 3373 case snd_soc_dapm_regulator_supply: 3374 case snd_soc_dapm_clock_supply: 3375 case snd_soc_dapm_kcontrol: 3376 w->is_supply = 1; 3377 w->power_check = dapm_supply_check_power; 3378 break; 3379 default: 3380 w->power_check = dapm_always_on_check_power; 3381 break; 3382 } 3383 3384 w->dapm = dapm; 3385 INIT_LIST_HEAD(&w->list); 3386 INIT_LIST_HEAD(&w->dirty); 3387 list_add_tail(&w->list, &dapm->card->widgets); 3388 3389 snd_soc_dapm_for_each_direction(dir) { 3390 INIT_LIST_HEAD(&w->edges[dir]); 3391 w->endpoints[dir] = -1; 3392 } 3393 3394 /* machine layer set ups unconnected pins and insertions */ 3395 w->connected = 1; 3396 return w; 3397 } 3398 3399 /** 3400 * snd_soc_dapm_new_controls - create new dapm controls 3401 * @dapm: DAPM context 3402 * @widget: widget array 3403 * @num: number of widgets 3404 * 3405 * Creates new DAPM controls based upon the templates. 3406 * 3407 * Returns 0 for success else error. 3408 */ 3409 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm, 3410 const struct snd_soc_dapm_widget *widget, 3411 int num) 3412 { 3413 struct snd_soc_dapm_widget *w; 3414 int i; 3415 int ret = 0; 3416 3417 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT); 3418 for (i = 0; i < num; i++) { 3419 w = snd_soc_dapm_new_control_unlocked(dapm, widget); 3420 if (!w) { 3421 dev_err(dapm->dev, 3422 "ASoC: Failed to create DAPM control %s\n", 3423 widget->name); 3424 ret = -ENOMEM; 3425 break; 3426 } 3427 widget++; 3428 } 3429 mutex_unlock(&dapm->card->dapm_mutex); 3430 return ret; 3431 } 3432 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls); 3433 3434 static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, 3435 struct snd_kcontrol *kcontrol, int event) 3436 { 3437 struct snd_soc_dapm_path *source_p, *sink_p; 3438 struct snd_soc_dai *source, *sink; 3439 const struct snd_soc_pcm_stream *config = w->params + w->params_select; 3440 struct snd_pcm_substream substream; 3441 struct snd_pcm_hw_params *params = NULL; 3442 u64 fmt; 3443 int ret; 3444 3445 if (WARN_ON(!config) || 3446 WARN_ON(list_empty(&w->edges[SND_SOC_DAPM_DIR_OUT]) || 3447 list_empty(&w->edges[SND_SOC_DAPM_DIR_IN]))) 3448 return -EINVAL; 3449 3450 /* We only support a single source and sink, pick the first */ 3451 source_p = list_first_entry(&w->edges[SND_SOC_DAPM_DIR_OUT], 3452 struct snd_soc_dapm_path, 3453 list_node[SND_SOC_DAPM_DIR_OUT]); 3454 sink_p = list_first_entry(&w->edges[SND_SOC_DAPM_DIR_IN], 3455 struct snd_soc_dapm_path, 3456 list_node[SND_SOC_DAPM_DIR_IN]); 3457 3458 source = source_p->source->priv; 3459 sink = sink_p->sink->priv; 3460 3461 /* Be a little careful as we don't want to overflow the mask array */ 3462 if (config->formats) { 3463 fmt = ffs(config->formats) - 1; 3464 } else { 3465 dev_warn(w->dapm->dev, "ASoC: Invalid format %llx specified\n", 3466 config->formats); 3467 fmt = 0; 3468 } 3469 3470 /* Currently very limited parameter selection */ 3471 params = kzalloc(sizeof(*params), GFP_KERNEL); 3472 if (!params) { 3473 ret = -ENOMEM; 3474 goto out; 3475 } 3476 snd_mask_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), fmt); 3477 3478 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->min = 3479 config->rate_min; 3480 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->max = 3481 config->rate_max; 3482 3483 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->min 3484 = config->channels_min; 3485 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->max 3486 = config->channels_max; 3487 3488 memset(&substream, 0, sizeof(substream)); 3489 3490 switch (event) { 3491 case SND_SOC_DAPM_PRE_PMU: 3492 substream.stream = SNDRV_PCM_STREAM_CAPTURE; 3493 if (source->driver->ops && source->driver->ops->startup) { 3494 ret = source->driver->ops->startup(&substream, source); 3495 if (ret < 0) { 3496 dev_err(source->dev, 3497 "ASoC: startup() failed: %d\n", ret); 3498 goto out; 3499 } 3500 source->active++; 3501 } 3502 ret = soc_dai_hw_params(&substream, params, source); 3503 if (ret < 0) 3504 goto out; 3505 3506 substream.stream = SNDRV_PCM_STREAM_PLAYBACK; 3507 if (sink->driver->ops && sink->driver->ops->startup) { 3508 ret = sink->driver->ops->startup(&substream, sink); 3509 if (ret < 0) { 3510 dev_err(sink->dev, 3511 "ASoC: startup() failed: %d\n", ret); 3512 goto out; 3513 } 3514 sink->active++; 3515 } 3516 ret = soc_dai_hw_params(&substream, params, sink); 3517 if (ret < 0) 3518 goto out; 3519 break; 3520 3521 case SND_SOC_DAPM_POST_PMU: 3522 ret = snd_soc_dai_digital_mute(sink, 0, 3523 SNDRV_PCM_STREAM_PLAYBACK); 3524 if (ret != 0 && ret != -ENOTSUPP) 3525 dev_warn(sink->dev, "ASoC: Failed to unmute: %d\n", ret); 3526 ret = 0; 3527 break; 3528 3529 case SND_SOC_DAPM_PRE_PMD: 3530 ret = snd_soc_dai_digital_mute(sink, 1, 3531 SNDRV_PCM_STREAM_PLAYBACK); 3532 if (ret != 0 && ret != -ENOTSUPP) 3533 dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret); 3534 ret = 0; 3535 3536 source->active--; 3537 if (source->driver->ops && source->driver->ops->shutdown) { 3538 substream.stream = SNDRV_PCM_STREAM_CAPTURE; 3539 source->driver->ops->shutdown(&substream, source); 3540 } 3541 3542 sink->active--; 3543 if (sink->driver->ops && sink->driver->ops->shutdown) { 3544 substream.stream = SNDRV_PCM_STREAM_PLAYBACK; 3545 sink->driver->ops->shutdown(&substream, sink); 3546 } 3547 break; 3548 3549 default: 3550 WARN(1, "Unknown event %d\n", event); 3551 ret = -EINVAL; 3552 } 3553 3554 out: 3555 kfree(params); 3556 return ret; 3557 } 3558 3559 static int snd_soc_dapm_dai_link_get(struct snd_kcontrol *kcontrol, 3560 struct snd_ctl_elem_value *ucontrol) 3561 { 3562 struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol); 3563 3564 ucontrol->value.integer.value[0] = w->params_select; 3565 3566 return 0; 3567 } 3568 3569 static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, 3570 struct snd_ctl_elem_value *ucontrol) 3571 { 3572 struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol); 3573 3574 /* Can't change the config when widget is already powered */ 3575 if (w->power) 3576 return -EBUSY; 3577 3578 if (ucontrol->value.integer.value[0] == w->params_select) 3579 return 0; 3580 3581 if (ucontrol->value.integer.value[0] >= w->num_params) 3582 return -EINVAL; 3583 3584 w->params_select = ucontrol->value.integer.value[0]; 3585 3586 return 0; 3587 } 3588 3589 int snd_soc_dapm_new_pcm(struct snd_soc_card *card, 3590 const struct snd_soc_pcm_stream *params, 3591 unsigned int num_params, 3592 struct snd_soc_dapm_widget *source, 3593 struct snd_soc_dapm_widget *sink) 3594 { 3595 struct snd_soc_dapm_widget template; 3596 struct snd_soc_dapm_widget *w; 3597 char *link_name; 3598 int ret, count; 3599 unsigned long private_value; 3600 const char **w_param_text; 3601 struct soc_enum w_param_enum[] = { 3602 SOC_ENUM_SINGLE(0, 0, 0, NULL), 3603 }; 3604 struct snd_kcontrol_new kcontrol_dai_link[] = { 3605 SOC_ENUM_EXT(NULL, w_param_enum[0], 3606 snd_soc_dapm_dai_link_get, 3607 snd_soc_dapm_dai_link_put), 3608 }; 3609 const struct snd_soc_pcm_stream *config = params; 3610 3611 w_param_text = devm_kcalloc(card->dev, num_params, 3612 sizeof(char *), GFP_KERNEL); 3613 if (!w_param_text) 3614 return -ENOMEM; 3615 3616 link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s", 3617 source->name, sink->name); 3618 if (!link_name) { 3619 ret = -ENOMEM; 3620 goto outfree_w_param; 3621 } 3622 3623 for (count = 0 ; count < num_params; count++) { 3624 if (!config->stream_name) { 3625 dev_warn(card->dapm.dev, 3626 "ASoC: anonymous config %d for dai link %s\n", 3627 count, link_name); 3628 w_param_text[count] = 3629 devm_kasprintf(card->dev, GFP_KERNEL, 3630 "Anonymous Configuration %d", 3631 count); 3632 if (!w_param_text[count]) { 3633 ret = -ENOMEM; 3634 goto outfree_link_name; 3635 } 3636 } else { 3637 w_param_text[count] = devm_kmemdup(card->dev, 3638 config->stream_name, 3639 strlen(config->stream_name) + 1, 3640 GFP_KERNEL); 3641 if (!w_param_text[count]) { 3642 ret = -ENOMEM; 3643 goto outfree_link_name; 3644 } 3645 } 3646 config++; 3647 } 3648 w_param_enum[0].items = num_params; 3649 w_param_enum[0].texts = w_param_text; 3650 3651 memset(&template, 0, sizeof(template)); 3652 template.reg = SND_SOC_NOPM; 3653 template.id = snd_soc_dapm_dai_link; 3654 template.name = link_name; 3655 template.event = snd_soc_dai_link_event; 3656 template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3657 SND_SOC_DAPM_PRE_PMD; 3658 template.num_kcontrols = 1; 3659 /* duplicate w_param_enum on heap so that memory persists */ 3660 private_value = 3661 (unsigned long) devm_kmemdup(card->dev, 3662 (void *)(kcontrol_dai_link[0].private_value), 3663 sizeof(struct soc_enum), GFP_KERNEL); 3664 if (!private_value) { 3665 dev_err(card->dev, "ASoC: Failed to create control for %s widget\n", 3666 link_name); 3667 ret = -ENOMEM; 3668 goto outfree_link_name; 3669 } 3670 kcontrol_dai_link[0].private_value = private_value; 3671 /* duplicate kcontrol_dai_link on heap so that memory persists */ 3672 template.kcontrol_news = 3673 devm_kmemdup(card->dev, &kcontrol_dai_link[0], 3674 sizeof(struct snd_kcontrol_new), 3675 GFP_KERNEL); 3676 if (!template.kcontrol_news) { 3677 dev_err(card->dev, "ASoC: Failed to create control for %s widget\n", 3678 link_name); 3679 ret = -ENOMEM; 3680 goto outfree_private_value; 3681 } 3682 3683 dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name); 3684 3685 w = snd_soc_dapm_new_control_unlocked(&card->dapm, &template); 3686 if (!w) { 3687 dev_err(card->dev, "ASoC: Failed to create %s widget\n", 3688 link_name); 3689 ret = -ENOMEM; 3690 goto outfree_kcontrol_news; 3691 } 3692 3693 w->params = params; 3694 w->num_params = num_params; 3695 3696 ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL); 3697 if (ret) 3698 goto outfree_w; 3699 return snd_soc_dapm_add_path(&card->dapm, w, sink, NULL, NULL); 3700 3701 outfree_w: 3702 devm_kfree(card->dev, w); 3703 outfree_kcontrol_news: 3704 devm_kfree(card->dev, (void *)template.kcontrol_news); 3705 outfree_private_value: 3706 devm_kfree(card->dev, (void *)private_value); 3707 outfree_link_name: 3708 devm_kfree(card->dev, link_name); 3709 outfree_w_param: 3710 for (count = 0 ; count < num_params; count++) 3711 devm_kfree(card->dev, (void *)w_param_text[count]); 3712 devm_kfree(card->dev, w_param_text); 3713 3714 return ret; 3715 } 3716 3717 int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm, 3718 struct snd_soc_dai *dai) 3719 { 3720 struct snd_soc_dapm_widget template; 3721 struct snd_soc_dapm_widget *w; 3722 3723 WARN_ON(dapm->dev != dai->dev); 3724 3725 memset(&template, 0, sizeof(template)); 3726 template.reg = SND_SOC_NOPM; 3727 3728 if (dai->driver->playback.stream_name) { 3729 template.id = snd_soc_dapm_dai_in; 3730 template.name = dai->driver->playback.stream_name; 3731 template.sname = dai->driver->playback.stream_name; 3732 3733 dev_dbg(dai->dev, "ASoC: adding %s widget\n", 3734 template.name); 3735 3736 w = snd_soc_dapm_new_control_unlocked(dapm, &template); 3737 if (!w) { 3738 dev_err(dapm->dev, "ASoC: Failed to create %s widget\n", 3739 dai->driver->playback.stream_name); 3740 return -ENOMEM; 3741 } 3742 3743 w->priv = dai; 3744 dai->playback_widget = w; 3745 } 3746 3747 if (dai->driver->capture.stream_name) { 3748 template.id = snd_soc_dapm_dai_out; 3749 template.name = dai->driver->capture.stream_name; 3750 template.sname = dai->driver->capture.stream_name; 3751 3752 dev_dbg(dai->dev, "ASoC: adding %s widget\n", 3753 template.name); 3754 3755 w = snd_soc_dapm_new_control_unlocked(dapm, &template); 3756 if (!w) { 3757 dev_err(dapm->dev, "ASoC: Failed to create %s widget\n", 3758 dai->driver->capture.stream_name); 3759 return -ENOMEM; 3760 } 3761 3762 w->priv = dai; 3763 dai->capture_widget = w; 3764 } 3765 3766 return 0; 3767 } 3768 3769 int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card) 3770 { 3771 struct snd_soc_dapm_widget *dai_w, *w; 3772 struct snd_soc_dapm_widget *src, *sink; 3773 struct snd_soc_dai *dai; 3774 3775 /* For each DAI widget... */ 3776 list_for_each_entry(dai_w, &card->widgets, list) { 3777 switch (dai_w->id) { 3778 case snd_soc_dapm_dai_in: 3779 case snd_soc_dapm_dai_out: 3780 break; 3781 default: 3782 continue; 3783 } 3784 3785 dai = dai_w->priv; 3786 3787 /* ...find all widgets with the same stream and link them */ 3788 list_for_each_entry(w, &card->widgets, list) { 3789 if (w->dapm != dai_w->dapm) 3790 continue; 3791 3792 switch (w->id) { 3793 case snd_soc_dapm_dai_in: 3794 case snd_soc_dapm_dai_out: 3795 continue; 3796 default: 3797 break; 3798 } 3799 3800 if (!w->sname || !strstr(w->sname, dai_w->sname)) 3801 continue; 3802 3803 if (dai_w->id == snd_soc_dapm_dai_in) { 3804 src = dai_w; 3805 sink = w; 3806 } else { 3807 src = w; 3808 sink = dai_w; 3809 } 3810 dev_dbg(dai->dev, "%s -> %s\n", src->name, sink->name); 3811 snd_soc_dapm_add_path(w->dapm, src, sink, NULL, NULL); 3812 } 3813 } 3814 3815 return 0; 3816 } 3817 3818 static void dapm_connect_dai_link_widgets(struct snd_soc_card *card, 3819 struct snd_soc_pcm_runtime *rtd) 3820 { 3821 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 3822 struct snd_soc_dapm_widget *sink, *source; 3823 int i; 3824 3825 for (i = 0; i < rtd->num_codecs; i++) { 3826 struct snd_soc_dai *codec_dai = rtd->codec_dais[i]; 3827 3828 /* connect BE DAI playback if widgets are valid */ 3829 if (codec_dai->playback_widget && cpu_dai->playback_widget) { 3830 source = cpu_dai->playback_widget; 3831 sink = codec_dai->playback_widget; 3832 dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n", 3833 cpu_dai->component->name, source->name, 3834 codec_dai->component->name, sink->name); 3835 3836 snd_soc_dapm_add_path(&card->dapm, source, sink, 3837 NULL, NULL); 3838 } 3839 3840 /* connect BE DAI capture if widgets are valid */ 3841 if (codec_dai->capture_widget && cpu_dai->capture_widget) { 3842 source = codec_dai->capture_widget; 3843 sink = cpu_dai->capture_widget; 3844 dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n", 3845 codec_dai->component->name, source->name, 3846 cpu_dai->component->name, sink->name); 3847 3848 snd_soc_dapm_add_path(&card->dapm, source, sink, 3849 NULL, NULL); 3850 } 3851 } 3852 } 3853 3854 static void soc_dapm_dai_stream_event(struct snd_soc_dai *dai, int stream, 3855 int event) 3856 { 3857 struct snd_soc_dapm_widget *w; 3858 unsigned int ep; 3859 3860 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 3861 w = dai->playback_widget; 3862 else 3863 w = dai->capture_widget; 3864 3865 if (w) { 3866 dapm_mark_dirty(w, "stream event"); 3867 3868 if (w->id == snd_soc_dapm_dai_in) { 3869 ep = SND_SOC_DAPM_EP_SOURCE; 3870 dapm_widget_invalidate_input_paths(w); 3871 } else { 3872 ep = SND_SOC_DAPM_EP_SINK; 3873 dapm_widget_invalidate_output_paths(w); 3874 } 3875 3876 switch (event) { 3877 case SND_SOC_DAPM_STREAM_START: 3878 w->active = 1; 3879 w->is_ep = ep; 3880 break; 3881 case SND_SOC_DAPM_STREAM_STOP: 3882 w->active = 0; 3883 w->is_ep = 0; 3884 break; 3885 case SND_SOC_DAPM_STREAM_SUSPEND: 3886 case SND_SOC_DAPM_STREAM_RESUME: 3887 case SND_SOC_DAPM_STREAM_PAUSE_PUSH: 3888 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE: 3889 break; 3890 } 3891 } 3892 } 3893 3894 void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card) 3895 { 3896 struct snd_soc_pcm_runtime *rtd = card->rtd; 3897 int i; 3898 3899 /* for each BE DAI link... */ 3900 for (i = 0; i < card->num_rtd; i++) { 3901 rtd = &card->rtd[i]; 3902 3903 /* 3904 * dynamic FE links have no fixed DAI mapping. 3905 * CODEC<->CODEC links have no direct connection. 3906 */ 3907 if (rtd->dai_link->dynamic || rtd->dai_link->params) 3908 continue; 3909 3910 dapm_connect_dai_link_widgets(card, rtd); 3911 } 3912 } 3913 3914 static void soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, 3915 int event) 3916 { 3917 int i; 3918 3919 soc_dapm_dai_stream_event(rtd->cpu_dai, stream, event); 3920 for (i = 0; i < rtd->num_codecs; i++) 3921 soc_dapm_dai_stream_event(rtd->codec_dais[i], stream, event); 3922 3923 dapm_power_widgets(rtd->card, event); 3924 } 3925 3926 /** 3927 * snd_soc_dapm_stream_event - send a stream event to the dapm core 3928 * @rtd: PCM runtime data 3929 * @stream: stream name 3930 * @event: stream event 3931 * 3932 * Sends a stream event to the dapm core. The core then makes any 3933 * necessary widget power changes. 3934 * 3935 * Returns 0 for success else error. 3936 */ 3937 void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, 3938 int event) 3939 { 3940 struct snd_soc_card *card = rtd->card; 3941 3942 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3943 soc_dapm_stream_event(rtd, stream, event); 3944 mutex_unlock(&card->dapm_mutex); 3945 } 3946 3947 /** 3948 * snd_soc_dapm_enable_pin_unlocked - enable pin. 3949 * @dapm: DAPM context 3950 * @pin: pin name 3951 * 3952 * Enables input/output pin and its parents or children widgets iff there is 3953 * a valid audio route and active audio stream. 3954 * 3955 * Requires external locking. 3956 * 3957 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 3958 * do any widget power switching. 3959 */ 3960 int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, 3961 const char *pin) 3962 { 3963 return snd_soc_dapm_set_pin(dapm, pin, 1); 3964 } 3965 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin_unlocked); 3966 3967 /** 3968 * snd_soc_dapm_enable_pin - enable pin. 3969 * @dapm: DAPM context 3970 * @pin: pin name 3971 * 3972 * Enables input/output pin and its parents or children widgets iff there is 3973 * a valid audio route and active audio stream. 3974 * 3975 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 3976 * do any widget power switching. 3977 */ 3978 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) 3979 { 3980 int ret; 3981 3982 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3983 3984 ret = snd_soc_dapm_set_pin(dapm, pin, 1); 3985 3986 mutex_unlock(&dapm->card->dapm_mutex); 3987 3988 return ret; 3989 } 3990 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); 3991 3992 /** 3993 * snd_soc_dapm_force_enable_pin_unlocked - force a pin to be enabled 3994 * @dapm: DAPM context 3995 * @pin: pin name 3996 * 3997 * Enables input/output pin regardless of any other state. This is 3998 * intended for use with microphone bias supplies used in microphone 3999 * jack detection. 4000 * 4001 * Requires external locking. 4002 * 4003 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4004 * do any widget power switching. 4005 */ 4006 int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, 4007 const char *pin) 4008 { 4009 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 4010 4011 if (!w) { 4012 dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin); 4013 return -EINVAL; 4014 } 4015 4016 dev_dbg(w->dapm->dev, "ASoC: force enable pin %s\n", pin); 4017 if (!w->connected) { 4018 /* 4019 * w->force does not affect the number of input or output paths, 4020 * so we only have to recheck if w->connected is changed 4021 */ 4022 dapm_widget_invalidate_input_paths(w); 4023 dapm_widget_invalidate_output_paths(w); 4024 w->connected = 1; 4025 } 4026 w->force = 1; 4027 dapm_mark_dirty(w, "force enable"); 4028 4029 return 0; 4030 } 4031 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin_unlocked); 4032 4033 /** 4034 * snd_soc_dapm_force_enable_pin - force a pin to be enabled 4035 * @dapm: DAPM context 4036 * @pin: pin name 4037 * 4038 * Enables input/output pin regardless of any other state. This is 4039 * intended for use with microphone bias supplies used in microphone 4040 * jack detection. 4041 * 4042 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4043 * do any widget power switching. 4044 */ 4045 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, 4046 const char *pin) 4047 { 4048 int ret; 4049 4050 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 4051 4052 ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin); 4053 4054 mutex_unlock(&dapm->card->dapm_mutex); 4055 4056 return ret; 4057 } 4058 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); 4059 4060 /** 4061 * snd_soc_dapm_disable_pin_unlocked - disable pin. 4062 * @dapm: DAPM context 4063 * @pin: pin name 4064 * 4065 * Disables input/output pin and its parents or children widgets. 4066 * 4067 * Requires external locking. 4068 * 4069 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4070 * do any widget power switching. 4071 */ 4072 int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, 4073 const char *pin) 4074 { 4075 return snd_soc_dapm_set_pin(dapm, pin, 0); 4076 } 4077 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin_unlocked); 4078 4079 /** 4080 * snd_soc_dapm_disable_pin - disable pin. 4081 * @dapm: DAPM context 4082 * @pin: pin name 4083 * 4084 * Disables input/output pin and its parents or children widgets. 4085 * 4086 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4087 * do any widget power switching. 4088 */ 4089 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, 4090 const char *pin) 4091 { 4092 int ret; 4093 4094 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 4095 4096 ret = snd_soc_dapm_set_pin(dapm, pin, 0); 4097 4098 mutex_unlock(&dapm->card->dapm_mutex); 4099 4100 return ret; 4101 } 4102 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); 4103 4104 /** 4105 * snd_soc_dapm_nc_pin_unlocked - permanently disable pin. 4106 * @dapm: DAPM context 4107 * @pin: pin name 4108 * 4109 * Marks the specified pin as being not connected, disabling it along 4110 * any parent or child widgets. At present this is identical to 4111 * snd_soc_dapm_disable_pin() but in future it will be extended to do 4112 * additional things such as disabling controls which only affect 4113 * paths through the pin. 4114 * 4115 * Requires external locking. 4116 * 4117 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4118 * do any widget power switching. 4119 */ 4120 int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, 4121 const char *pin) 4122 { 4123 return snd_soc_dapm_set_pin(dapm, pin, 0); 4124 } 4125 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin_unlocked); 4126 4127 /** 4128 * snd_soc_dapm_nc_pin - permanently disable pin. 4129 * @dapm: DAPM context 4130 * @pin: pin name 4131 * 4132 * Marks the specified pin as being not connected, disabling it along 4133 * any parent or child widgets. At present this is identical to 4134 * snd_soc_dapm_disable_pin() but in future it will be extended to do 4135 * additional things such as disabling controls which only affect 4136 * paths through the pin. 4137 * 4138 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 4139 * do any widget power switching. 4140 */ 4141 int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) 4142 { 4143 int ret; 4144 4145 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 4146 4147 ret = snd_soc_dapm_set_pin(dapm, pin, 0); 4148 4149 mutex_unlock(&dapm->card->dapm_mutex); 4150 4151 return ret; 4152 } 4153 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); 4154 4155 /** 4156 * snd_soc_dapm_get_pin_status - get audio pin status 4157 * @dapm: DAPM context 4158 * @pin: audio signal pin endpoint (or start point) 4159 * 4160 * Get audio pin status - connected or disconnected. 4161 * 4162 * Returns 1 for connected otherwise 0. 4163 */ 4164 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, 4165 const char *pin) 4166 { 4167 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 4168 4169 if (w) 4170 return w->connected; 4171 4172 return 0; 4173 } 4174 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status); 4175 4176 /** 4177 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint 4178 * @dapm: DAPM context 4179 * @pin: audio signal pin endpoint (or start point) 4180 * 4181 * Mark the given endpoint or pin as ignoring suspend. When the 4182 * system is disabled a path between two endpoints flagged as ignoring 4183 * suspend will not be disabled. The path must already be enabled via 4184 * normal means at suspend time, it will not be turned on if it was not 4185 * already enabled. 4186 */ 4187 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, 4188 const char *pin) 4189 { 4190 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, false); 4191 4192 if (!w) { 4193 dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin); 4194 return -EINVAL; 4195 } 4196 4197 w->ignore_suspend = 1; 4198 4199 return 0; 4200 } 4201 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend); 4202 4203 /** 4204 * snd_soc_dapm_free - free dapm resources 4205 * @dapm: DAPM context 4206 * 4207 * Free all dapm widgets and resources. 4208 */ 4209 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm) 4210 { 4211 dapm_debugfs_cleanup(dapm); 4212 dapm_free_widgets(dapm); 4213 list_del(&dapm->list); 4214 } 4215 EXPORT_SYMBOL_GPL(snd_soc_dapm_free); 4216 4217 static void soc_dapm_shutdown_dapm(struct snd_soc_dapm_context *dapm) 4218 { 4219 struct snd_soc_card *card = dapm->card; 4220 struct snd_soc_dapm_widget *w; 4221 LIST_HEAD(down_list); 4222 int powerdown = 0; 4223 4224 mutex_lock(&card->dapm_mutex); 4225 4226 list_for_each_entry(w, &dapm->card->widgets, list) { 4227 if (w->dapm != dapm) 4228 continue; 4229 if (w->power) { 4230 dapm_seq_insert(w, &down_list, false); 4231 w->power = 0; 4232 powerdown = 1; 4233 } 4234 } 4235 4236 /* If there were no widgets to power down we're already in 4237 * standby. 4238 */ 4239 if (powerdown) { 4240 if (dapm->bias_level == SND_SOC_BIAS_ON) 4241 snd_soc_dapm_set_bias_level(dapm, 4242 SND_SOC_BIAS_PREPARE); 4243 dapm_seq_run(card, &down_list, 0, false); 4244 if (dapm->bias_level == SND_SOC_BIAS_PREPARE) 4245 snd_soc_dapm_set_bias_level(dapm, 4246 SND_SOC_BIAS_STANDBY); 4247 } 4248 4249 mutex_unlock(&card->dapm_mutex); 4250 } 4251 4252 /* 4253 * snd_soc_dapm_shutdown - callback for system shutdown 4254 */ 4255 void snd_soc_dapm_shutdown(struct snd_soc_card *card) 4256 { 4257 struct snd_soc_dapm_context *dapm; 4258 4259 list_for_each_entry(dapm, &card->dapm_list, list) { 4260 if (dapm != &card->dapm) { 4261 soc_dapm_shutdown_dapm(dapm); 4262 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) 4263 snd_soc_dapm_set_bias_level(dapm, 4264 SND_SOC_BIAS_OFF); 4265 } 4266 } 4267 4268 soc_dapm_shutdown_dapm(&card->dapm); 4269 if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) 4270 snd_soc_dapm_set_bias_level(&card->dapm, 4271 SND_SOC_BIAS_OFF); 4272 } 4273 4274 /* Module information */ 4275 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk"); 4276 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC"); 4277 MODULE_LICENSE("GPL"); 4278