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