1 /* 2 * soc-dapm.c -- ALSA SoC Dynamic Audio Power Management 3 * 4 * Copyright 2005 Wolfson Microelectronics PLC. 5 * Author: Liam Girdwood <lrg@slimlogic.co.uk> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2 of the License, or (at your 10 * option) any later version. 11 * 12 * Features: 13 * o Changes power status of internal codec blocks depending on the 14 * dynamic configuration of codec internal audio paths and active 15 * DACs/ADCs. 16 * o Platform power domain - can support external components i.e. amps and 17 * mic/meadphone insertion events. 18 * o Automatic Mic Bias support 19 * o Jack insertion power event initiation - e.g. hp insertion will enable 20 * sinks, dacs, etc 21 * o Delayed powerdown of audio susbsystem to reduce pops between a quick 22 * device reopen. 23 * 24 * Todo: 25 * o DAPM power change sequencing - allow for configurable per 26 * codec sequences. 27 * o Support for analogue bias optimisation. 28 * o Support for reduced codec oversampling rates. 29 * o Support for reduced codec bias currents. 30 */ 31 32 #include <linux/module.h> 33 #include <linux/moduleparam.h> 34 #include <linux/init.h> 35 #include <linux/async.h> 36 #include <linux/delay.h> 37 #include <linux/pm.h> 38 #include <linux/bitops.h> 39 #include <linux/platform_device.h> 40 #include <linux/jiffies.h> 41 #include <linux/debugfs.h> 42 #include <linux/pm_runtime.h> 43 #include <linux/slab.h> 44 #include <sound/core.h> 45 #include <sound/pcm.h> 46 #include <sound/pcm_params.h> 47 #include <sound/soc.h> 48 #include <sound/initval.h> 49 50 #include <trace/events/asoc.h> 51 52 #define DAPM_UPDATE_STAT(widget, val) widget->dapm->card->dapm_stats.val++; 53 54 /* dapm power sequences - make this per codec in the future */ 55 static int dapm_up_seq[] = { 56 [snd_soc_dapm_pre] = 0, 57 [snd_soc_dapm_supply] = 1, 58 [snd_soc_dapm_micbias] = 2, 59 [snd_soc_dapm_aif_in] = 3, 60 [snd_soc_dapm_aif_out] = 3, 61 [snd_soc_dapm_mic] = 4, 62 [snd_soc_dapm_mux] = 5, 63 [snd_soc_dapm_virt_mux] = 5, 64 [snd_soc_dapm_value_mux] = 5, 65 [snd_soc_dapm_dac] = 6, 66 [snd_soc_dapm_mixer] = 7, 67 [snd_soc_dapm_mixer_named_ctl] = 7, 68 [snd_soc_dapm_pga] = 8, 69 [snd_soc_dapm_adc] = 9, 70 [snd_soc_dapm_out_drv] = 10, 71 [snd_soc_dapm_hp] = 10, 72 [snd_soc_dapm_spk] = 10, 73 [snd_soc_dapm_post] = 11, 74 }; 75 76 static int dapm_down_seq[] = { 77 [snd_soc_dapm_pre] = 0, 78 [snd_soc_dapm_adc] = 1, 79 [snd_soc_dapm_hp] = 2, 80 [snd_soc_dapm_spk] = 2, 81 [snd_soc_dapm_out_drv] = 2, 82 [snd_soc_dapm_pga] = 4, 83 [snd_soc_dapm_mixer_named_ctl] = 5, 84 [snd_soc_dapm_mixer] = 5, 85 [snd_soc_dapm_dac] = 6, 86 [snd_soc_dapm_mic] = 7, 87 [snd_soc_dapm_micbias] = 8, 88 [snd_soc_dapm_mux] = 9, 89 [snd_soc_dapm_virt_mux] = 9, 90 [snd_soc_dapm_value_mux] = 9, 91 [snd_soc_dapm_aif_in] = 10, 92 [snd_soc_dapm_aif_out] = 10, 93 [snd_soc_dapm_supply] = 11, 94 [snd_soc_dapm_post] = 12, 95 }; 96 97 static void pop_wait(u32 pop_time) 98 { 99 if (pop_time) 100 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); 101 } 102 103 static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...) 104 { 105 va_list args; 106 char *buf; 107 108 if (!pop_time) 109 return; 110 111 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 112 if (buf == NULL) 113 return; 114 115 va_start(args, fmt); 116 vsnprintf(buf, PAGE_SIZE, fmt, args); 117 dev_info(dev, "%s", buf); 118 va_end(args); 119 120 kfree(buf); 121 } 122 123 static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w) 124 { 125 return !list_empty(&w->dirty); 126 } 127 128 void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason) 129 { 130 if (!dapm_dirty_widget(w)) { 131 dev_vdbg(w->dapm->dev, "Marking %s dirty due to %s\n", 132 w->name, reason); 133 list_add_tail(&w->dirty, &w->dapm->card->dapm_dirty); 134 } 135 } 136 EXPORT_SYMBOL_GPL(dapm_mark_dirty); 137 138 /* create a new dapm widget */ 139 static inline struct snd_soc_dapm_widget *dapm_cnew_widget( 140 const struct snd_soc_dapm_widget *_widget) 141 { 142 return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL); 143 } 144 145 /* get snd_card from DAPM context */ 146 static inline struct snd_card *dapm_get_snd_card( 147 struct snd_soc_dapm_context *dapm) 148 { 149 if (dapm->codec) 150 return dapm->codec->card->snd_card; 151 else if (dapm->platform) 152 return dapm->platform->card->snd_card; 153 else 154 BUG(); 155 156 /* unreachable */ 157 return NULL; 158 } 159 160 /* get soc_card from DAPM context */ 161 static inline struct snd_soc_card *dapm_get_soc_card( 162 struct snd_soc_dapm_context *dapm) 163 { 164 if (dapm->codec) 165 return dapm->codec->card; 166 else if (dapm->platform) 167 return dapm->platform->card; 168 else 169 BUG(); 170 171 /* unreachable */ 172 return NULL; 173 } 174 175 static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg) 176 { 177 if (w->codec) 178 return snd_soc_read(w->codec, reg); 179 else if (w->platform) 180 return snd_soc_platform_read(w->platform, reg); 181 182 dev_err(w->dapm->dev, "no valid widget read method\n"); 183 return -1; 184 } 185 186 static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val) 187 { 188 if (w->codec) 189 return snd_soc_write(w->codec, reg, val); 190 else if (w->platform) 191 return snd_soc_platform_write(w->platform, reg, val); 192 193 dev_err(w->dapm->dev, "no valid widget write method\n"); 194 return -1; 195 } 196 197 static int soc_widget_update_bits(struct snd_soc_dapm_widget *w, 198 unsigned short reg, unsigned int mask, unsigned int value) 199 { 200 int change; 201 unsigned int old, new; 202 int ret; 203 204 ret = soc_widget_read(w, reg); 205 if (ret < 0) 206 return ret; 207 208 old = ret; 209 new = (old & ~mask) | (value & mask); 210 change = old != new; 211 if (change) { 212 ret = soc_widget_write(w, reg, new); 213 if (ret < 0) 214 return ret; 215 } 216 217 return change; 218 } 219 220 /** 221 * snd_soc_dapm_set_bias_level - set the bias level for the system 222 * @dapm: DAPM context 223 * @level: level to configure 224 * 225 * Configure the bias (power) levels for the SoC audio device. 226 * 227 * Returns 0 for success else error. 228 */ 229 static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm, 230 enum snd_soc_bias_level level) 231 { 232 struct snd_soc_card *card = dapm->card; 233 int ret = 0; 234 235 trace_snd_soc_bias_level_start(card, level); 236 237 if (card && card->set_bias_level) 238 ret = card->set_bias_level(card, dapm, level); 239 if (ret != 0) 240 goto out; 241 242 if (dapm->codec) { 243 if (dapm->codec->driver->set_bias_level) 244 ret = dapm->codec->driver->set_bias_level(dapm->codec, 245 level); 246 else 247 dapm->bias_level = level; 248 } 249 if (ret != 0) 250 goto out; 251 252 if (card && card->set_bias_level_post) 253 ret = card->set_bias_level_post(card, dapm, level); 254 out: 255 trace_snd_soc_bias_level_done(card, level); 256 257 return ret; 258 } 259 260 /* set up initial codec paths */ 261 static void dapm_set_path_status(struct snd_soc_dapm_widget *w, 262 struct snd_soc_dapm_path *p, int i) 263 { 264 switch (w->id) { 265 case snd_soc_dapm_switch: 266 case snd_soc_dapm_mixer: 267 case snd_soc_dapm_mixer_named_ctl: { 268 int val; 269 struct soc_mixer_control *mc = (struct soc_mixer_control *) 270 w->kcontrol_news[i].private_value; 271 unsigned int reg = mc->reg; 272 unsigned int shift = mc->shift; 273 int max = mc->max; 274 unsigned int mask = (1 << fls(max)) - 1; 275 unsigned int invert = mc->invert; 276 277 val = soc_widget_read(w, reg); 278 val = (val >> shift) & mask; 279 280 if ((invert && !val) || (!invert && val)) 281 p->connect = 1; 282 else 283 p->connect = 0; 284 } 285 break; 286 case snd_soc_dapm_mux: { 287 struct soc_enum *e = (struct soc_enum *) 288 w->kcontrol_news[i].private_value; 289 int val, item, bitmask; 290 291 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 292 ; 293 val = soc_widget_read(w, e->reg); 294 item = (val >> e->shift_l) & (bitmask - 1); 295 296 p->connect = 0; 297 for (i = 0; i < e->max; i++) { 298 if (!(strcmp(p->name, e->texts[i])) && item == i) 299 p->connect = 1; 300 } 301 } 302 break; 303 case snd_soc_dapm_virt_mux: { 304 struct soc_enum *e = (struct soc_enum *) 305 w->kcontrol_news[i].private_value; 306 307 p->connect = 0; 308 /* since a virtual mux has no backing registers to 309 * decide which path to connect, it will try to match 310 * with the first enumeration. This is to ensure 311 * that the default mux choice (the first) will be 312 * correctly powered up during initialization. 313 */ 314 if (!strcmp(p->name, e->texts[0])) 315 p->connect = 1; 316 } 317 break; 318 case snd_soc_dapm_value_mux: { 319 struct soc_enum *e = (struct soc_enum *) 320 w->kcontrol_news[i].private_value; 321 int val, item; 322 323 val = soc_widget_read(w, e->reg); 324 val = (val >> e->shift_l) & e->mask; 325 for (item = 0; item < e->max; item++) { 326 if (val == e->values[item]) 327 break; 328 } 329 330 p->connect = 0; 331 for (i = 0; i < e->max; i++) { 332 if (!(strcmp(p->name, e->texts[i])) && item == i) 333 p->connect = 1; 334 } 335 } 336 break; 337 /* does not affect routing - always connected */ 338 case snd_soc_dapm_pga: 339 case snd_soc_dapm_out_drv: 340 case snd_soc_dapm_output: 341 case snd_soc_dapm_adc: 342 case snd_soc_dapm_input: 343 case snd_soc_dapm_siggen: 344 case snd_soc_dapm_dac: 345 case snd_soc_dapm_micbias: 346 case snd_soc_dapm_vmid: 347 case snd_soc_dapm_supply: 348 case snd_soc_dapm_aif_in: 349 case snd_soc_dapm_aif_out: 350 case snd_soc_dapm_hp: 351 case snd_soc_dapm_mic: 352 case snd_soc_dapm_spk: 353 case snd_soc_dapm_line: 354 p->connect = 1; 355 break; 356 /* does affect routing - dynamically connected */ 357 case snd_soc_dapm_pre: 358 case snd_soc_dapm_post: 359 p->connect = 0; 360 break; 361 } 362 } 363 364 /* connect mux widget to its interconnecting audio paths */ 365 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm, 366 struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest, 367 struct snd_soc_dapm_path *path, const char *control_name, 368 const struct snd_kcontrol_new *kcontrol) 369 { 370 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 371 int i; 372 373 for (i = 0; i < e->max; i++) { 374 if (!(strcmp(control_name, e->texts[i]))) { 375 list_add(&path->list, &dapm->card->paths); 376 list_add(&path->list_sink, &dest->sources); 377 list_add(&path->list_source, &src->sinks); 378 path->name = (char*)e->texts[i]; 379 dapm_set_path_status(dest, path, 0); 380 return 0; 381 } 382 } 383 384 return -ENODEV; 385 } 386 387 /* connect mixer widget to its interconnecting audio paths */ 388 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm, 389 struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest, 390 struct snd_soc_dapm_path *path, const char *control_name) 391 { 392 int i; 393 394 /* search for mixer kcontrol */ 395 for (i = 0; i < dest->num_kcontrols; i++) { 396 if (!strcmp(control_name, dest->kcontrol_news[i].name)) { 397 list_add(&path->list, &dapm->card->paths); 398 list_add(&path->list_sink, &dest->sources); 399 list_add(&path->list_source, &src->sinks); 400 path->name = dest->kcontrol_news[i].name; 401 dapm_set_path_status(dest, path, i); 402 return 0; 403 } 404 } 405 return -ENODEV; 406 } 407 408 static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm, 409 struct snd_soc_dapm_widget *kcontrolw, 410 const struct snd_kcontrol_new *kcontrol_new, 411 struct snd_kcontrol **kcontrol) 412 { 413 struct snd_soc_dapm_widget *w; 414 int i; 415 416 *kcontrol = NULL; 417 418 list_for_each_entry(w, &dapm->card->widgets, list) { 419 if (w == kcontrolw || w->dapm != kcontrolw->dapm) 420 continue; 421 for (i = 0; i < w->num_kcontrols; i++) { 422 if (&w->kcontrol_news[i] == kcontrol_new) { 423 if (w->kcontrols) 424 *kcontrol = w->kcontrols[i]; 425 return 1; 426 } 427 } 428 } 429 430 return 0; 431 } 432 433 /* create new dapm mixer control */ 434 static int dapm_new_mixer(struct snd_soc_dapm_widget *w) 435 { 436 struct snd_soc_dapm_context *dapm = w->dapm; 437 int i, ret = 0; 438 size_t name_len, prefix_len; 439 struct snd_soc_dapm_path *path; 440 struct snd_card *card = dapm->card->snd_card; 441 const char *prefix; 442 struct snd_soc_dapm_widget_list *wlist; 443 size_t wlistsize; 444 445 if (dapm->codec) 446 prefix = dapm->codec->name_prefix; 447 else 448 prefix = NULL; 449 450 if (prefix) 451 prefix_len = strlen(prefix) + 1; 452 else 453 prefix_len = 0; 454 455 /* add kcontrol */ 456 for (i = 0; i < w->num_kcontrols; i++) { 457 458 /* match name */ 459 list_for_each_entry(path, &w->sources, list_sink) { 460 461 /* mixer/mux paths name must match control name */ 462 if (path->name != (char *)w->kcontrol_news[i].name) 463 continue; 464 465 if (w->kcontrols[i]) { 466 path->kcontrol = w->kcontrols[i]; 467 continue; 468 } 469 470 wlistsize = sizeof(struct snd_soc_dapm_widget_list) + 471 sizeof(struct snd_soc_dapm_widget *), 472 wlist = kzalloc(wlistsize, GFP_KERNEL); 473 if (wlist == NULL) { 474 dev_err(dapm->dev, 475 "asoc: can't allocate widget list for %s\n", 476 w->name); 477 return -ENOMEM; 478 } 479 wlist->num_widgets = 1; 480 wlist->widgets[0] = w; 481 482 /* add dapm control with long name. 483 * for dapm_mixer this is the concatenation of the 484 * mixer and kcontrol name. 485 * for dapm_mixer_named_ctl this is simply the 486 * kcontrol name. 487 */ 488 name_len = strlen(w->kcontrol_news[i].name) + 1; 489 if (w->id != snd_soc_dapm_mixer_named_ctl) 490 name_len += 1 + strlen(w->name); 491 492 path->long_name = kmalloc(name_len, GFP_KERNEL); 493 494 if (path->long_name == NULL) { 495 kfree(wlist); 496 return -ENOMEM; 497 } 498 499 switch (w->id) { 500 default: 501 /* The control will get a prefix from 502 * the control creation process but 503 * we're also using the same prefix 504 * for widgets so cut the prefix off 505 * the front of the widget name. 506 */ 507 snprintf(path->long_name, name_len, "%s %s", 508 w->name + prefix_len, 509 w->kcontrol_news[i].name); 510 break; 511 case snd_soc_dapm_mixer_named_ctl: 512 snprintf(path->long_name, name_len, "%s", 513 w->kcontrol_news[i].name); 514 break; 515 } 516 517 path->long_name[name_len - 1] = '\0'; 518 519 path->kcontrol = snd_soc_cnew(&w->kcontrol_news[i], 520 wlist, path->long_name, 521 prefix); 522 ret = snd_ctl_add(card, path->kcontrol); 523 if (ret < 0) { 524 dev_err(dapm->dev, 525 "asoc: failed to add dapm kcontrol %s: %d\n", 526 path->long_name, ret); 527 kfree(wlist); 528 kfree(path->long_name); 529 path->long_name = NULL; 530 return ret; 531 } 532 w->kcontrols[i] = path->kcontrol; 533 } 534 } 535 return ret; 536 } 537 538 /* create new dapm mux control */ 539 static int dapm_new_mux(struct snd_soc_dapm_widget *w) 540 { 541 struct snd_soc_dapm_context *dapm = w->dapm; 542 struct snd_soc_dapm_path *path = NULL; 543 struct snd_kcontrol *kcontrol; 544 struct snd_card *card = dapm->card->snd_card; 545 const char *prefix; 546 size_t prefix_len; 547 int ret; 548 struct snd_soc_dapm_widget_list *wlist; 549 int shared, wlistentries; 550 size_t wlistsize; 551 char *name; 552 553 if (w->num_kcontrols != 1) { 554 dev_err(dapm->dev, 555 "asoc: mux %s has incorrect number of controls\n", 556 w->name); 557 return -EINVAL; 558 } 559 560 shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[0], 561 &kcontrol); 562 if (kcontrol) { 563 wlist = kcontrol->private_data; 564 wlistentries = wlist->num_widgets + 1; 565 } else { 566 wlist = NULL; 567 wlistentries = 1; 568 } 569 wlistsize = sizeof(struct snd_soc_dapm_widget_list) + 570 wlistentries * sizeof(struct snd_soc_dapm_widget *), 571 wlist = krealloc(wlist, wlistsize, GFP_KERNEL); 572 if (wlist == NULL) { 573 dev_err(dapm->dev, 574 "asoc: can't allocate widget list for %s\n", w->name); 575 return -ENOMEM; 576 } 577 wlist->num_widgets = wlistentries; 578 wlist->widgets[wlistentries - 1] = w; 579 580 if (!kcontrol) { 581 if (dapm->codec) 582 prefix = dapm->codec->name_prefix; 583 else 584 prefix = NULL; 585 586 if (shared) { 587 name = w->kcontrol_news[0].name; 588 prefix_len = 0; 589 } else { 590 name = w->name; 591 if (prefix) 592 prefix_len = strlen(prefix) + 1; 593 else 594 prefix_len = 0; 595 } 596 597 /* 598 * The control will get a prefix from the control creation 599 * process but we're also using the same prefix for widgets so 600 * cut the prefix off the front of the widget name. 601 */ 602 kcontrol = snd_soc_cnew(&w->kcontrol_news[0], wlist, 603 name + prefix_len, prefix); 604 ret = snd_ctl_add(card, kcontrol); 605 if (ret < 0) { 606 dev_err(dapm->dev, "failed to add kcontrol %s: %d\n", 607 w->name, ret); 608 kfree(wlist); 609 return ret; 610 } 611 } 612 613 kcontrol->private_data = wlist; 614 615 w->kcontrols[0] = kcontrol; 616 617 list_for_each_entry(path, &w->sources, list_sink) 618 path->kcontrol = kcontrol; 619 620 return 0; 621 } 622 623 /* create new dapm volume control */ 624 static int dapm_new_pga(struct snd_soc_dapm_widget *w) 625 { 626 if (w->num_kcontrols) 627 dev_err(w->dapm->dev, 628 "asoc: PGA controls not supported: '%s'\n", w->name); 629 630 return 0; 631 } 632 633 /* reset 'walked' bit for each dapm path */ 634 static inline void dapm_clear_walk(struct snd_soc_dapm_context *dapm) 635 { 636 struct snd_soc_dapm_path *p; 637 638 list_for_each_entry(p, &dapm->card->paths, list) 639 p->walked = 0; 640 } 641 642 /* We implement power down on suspend by checking the power state of 643 * the ALSA card - when we are suspending the ALSA state for the card 644 * is set to D3. 645 */ 646 static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget) 647 { 648 int level = snd_power_get_state(widget->dapm->card->snd_card); 649 650 switch (level) { 651 case SNDRV_CTL_POWER_D3hot: 652 case SNDRV_CTL_POWER_D3cold: 653 if (widget->ignore_suspend) 654 dev_dbg(widget->dapm->dev, "%s ignoring suspend\n", 655 widget->name); 656 return widget->ignore_suspend; 657 default: 658 return 1; 659 } 660 } 661 662 /* 663 * Recursively check for a completed path to an active or physically connected 664 * output widget. Returns number of complete paths. 665 */ 666 static int is_connected_output_ep(struct snd_soc_dapm_widget *widget) 667 { 668 struct snd_soc_dapm_path *path; 669 int con = 0; 670 671 if (widget->outputs >= 0) 672 return widget->outputs; 673 674 DAPM_UPDATE_STAT(widget, path_checks); 675 676 if (widget->id == snd_soc_dapm_supply) 677 return 0; 678 679 switch (widget->id) { 680 case snd_soc_dapm_adc: 681 case snd_soc_dapm_aif_out: 682 if (widget->active) { 683 widget->outputs = snd_soc_dapm_suspend_check(widget); 684 return widget->outputs; 685 } 686 default: 687 break; 688 } 689 690 if (widget->connected) { 691 /* connected pin ? */ 692 if (widget->id == snd_soc_dapm_output && !widget->ext) { 693 widget->outputs = snd_soc_dapm_suspend_check(widget); 694 return widget->outputs; 695 } 696 697 /* connected jack or spk ? */ 698 if (widget->id == snd_soc_dapm_hp || 699 widget->id == snd_soc_dapm_spk || 700 (widget->id == snd_soc_dapm_line && 701 !list_empty(&widget->sources))) { 702 widget->outputs = snd_soc_dapm_suspend_check(widget); 703 return widget->outputs; 704 } 705 } 706 707 list_for_each_entry(path, &widget->sinks, list_source) { 708 DAPM_UPDATE_STAT(widget, neighbour_checks); 709 710 if (path->weak) 711 continue; 712 713 if (path->walked) 714 continue; 715 716 if (path->sink && path->connect) { 717 path->walked = 1; 718 con += is_connected_output_ep(path->sink); 719 } 720 } 721 722 widget->outputs = con; 723 724 return con; 725 } 726 727 /* 728 * Recursively check for a completed path to an active or physically connected 729 * input widget. Returns number of complete paths. 730 */ 731 static int is_connected_input_ep(struct snd_soc_dapm_widget *widget) 732 { 733 struct snd_soc_dapm_path *path; 734 int con = 0; 735 736 if (widget->inputs >= 0) 737 return widget->inputs; 738 739 DAPM_UPDATE_STAT(widget, path_checks); 740 741 if (widget->id == snd_soc_dapm_supply) 742 return 0; 743 744 /* active stream ? */ 745 switch (widget->id) { 746 case snd_soc_dapm_dac: 747 case snd_soc_dapm_aif_in: 748 if (widget->active) { 749 widget->inputs = snd_soc_dapm_suspend_check(widget); 750 return widget->inputs; 751 } 752 default: 753 break; 754 } 755 756 if (widget->connected) { 757 /* connected pin ? */ 758 if (widget->id == snd_soc_dapm_input && !widget->ext) { 759 widget->inputs = snd_soc_dapm_suspend_check(widget); 760 return widget->inputs; 761 } 762 763 /* connected VMID/Bias for lower pops */ 764 if (widget->id == snd_soc_dapm_vmid) { 765 widget->inputs = snd_soc_dapm_suspend_check(widget); 766 return widget->inputs; 767 } 768 769 /* connected jack ? */ 770 if (widget->id == snd_soc_dapm_mic || 771 (widget->id == snd_soc_dapm_line && 772 !list_empty(&widget->sinks))) { 773 widget->inputs = snd_soc_dapm_suspend_check(widget); 774 return widget->inputs; 775 } 776 777 /* signal generator */ 778 if (widget->id == snd_soc_dapm_siggen) { 779 widget->inputs = snd_soc_dapm_suspend_check(widget); 780 return widget->inputs; 781 } 782 } 783 784 list_for_each_entry(path, &widget->sources, list_sink) { 785 DAPM_UPDATE_STAT(widget, neighbour_checks); 786 787 if (path->weak) 788 continue; 789 790 if (path->walked) 791 continue; 792 793 if (path->source && path->connect) { 794 path->walked = 1; 795 con += is_connected_input_ep(path->source); 796 } 797 } 798 799 widget->inputs = con; 800 801 return con; 802 } 803 804 /* 805 * Handler for generic register modifier widget. 806 */ 807 int dapm_reg_event(struct snd_soc_dapm_widget *w, 808 struct snd_kcontrol *kcontrol, int event) 809 { 810 unsigned int val; 811 812 if (SND_SOC_DAPM_EVENT_ON(event)) 813 val = w->on_val; 814 else 815 val = w->off_val; 816 817 soc_widget_update_bits(w, -(w->reg + 1), 818 w->mask << w->shift, val << w->shift); 819 820 return 0; 821 } 822 EXPORT_SYMBOL_GPL(dapm_reg_event); 823 824 static int dapm_widget_power_check(struct snd_soc_dapm_widget *w) 825 { 826 if (w->power_checked) 827 return w->new_power; 828 829 if (w->force) 830 w->new_power = 1; 831 else 832 w->new_power = w->power_check(w); 833 834 w->power_checked = true; 835 836 return w->new_power; 837 } 838 839 /* Generic check to see if a widget should be powered. 840 */ 841 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w) 842 { 843 int in, out; 844 845 DAPM_UPDATE_STAT(w, power_checks); 846 847 in = is_connected_input_ep(w); 848 dapm_clear_walk(w->dapm); 849 out = is_connected_output_ep(w); 850 dapm_clear_walk(w->dapm); 851 return out != 0 && in != 0; 852 } 853 854 /* Check to see if an ADC has power */ 855 static int dapm_adc_check_power(struct snd_soc_dapm_widget *w) 856 { 857 int in; 858 859 DAPM_UPDATE_STAT(w, power_checks); 860 861 if (w->active) { 862 in = is_connected_input_ep(w); 863 dapm_clear_walk(w->dapm); 864 return in != 0; 865 } else { 866 return dapm_generic_check_power(w); 867 } 868 } 869 870 /* Check to see if a DAC has power */ 871 static int dapm_dac_check_power(struct snd_soc_dapm_widget *w) 872 { 873 int out; 874 875 DAPM_UPDATE_STAT(w, power_checks); 876 877 if (w->active) { 878 out = is_connected_output_ep(w); 879 dapm_clear_walk(w->dapm); 880 return out != 0; 881 } else { 882 return dapm_generic_check_power(w); 883 } 884 } 885 886 /* Check to see if a power supply is needed */ 887 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w) 888 { 889 struct snd_soc_dapm_path *path; 890 891 DAPM_UPDATE_STAT(w, power_checks); 892 893 /* Check if one of our outputs is connected */ 894 list_for_each_entry(path, &w->sinks, list_source) { 895 DAPM_UPDATE_STAT(w, neighbour_checks); 896 897 if (path->weak) 898 continue; 899 900 if (path->connected && 901 !path->connected(path->source, path->sink)) 902 continue; 903 904 if (!path->sink) 905 continue; 906 907 if (dapm_widget_power_check(path->sink)) 908 return 1; 909 } 910 911 dapm_clear_walk(w->dapm); 912 913 return 0; 914 } 915 916 static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w) 917 { 918 return 1; 919 } 920 921 static int dapm_seq_compare(struct snd_soc_dapm_widget *a, 922 struct snd_soc_dapm_widget *b, 923 bool power_up) 924 { 925 int *sort; 926 927 if (power_up) 928 sort = dapm_up_seq; 929 else 930 sort = dapm_down_seq; 931 932 if (sort[a->id] != sort[b->id]) 933 return sort[a->id] - sort[b->id]; 934 if (a->subseq != b->subseq) { 935 if (power_up) 936 return a->subseq - b->subseq; 937 else 938 return b->subseq - a->subseq; 939 } 940 if (a->reg != b->reg) 941 return a->reg - b->reg; 942 if (a->dapm != b->dapm) 943 return (unsigned long)a->dapm - (unsigned long)b->dapm; 944 945 return 0; 946 } 947 948 /* Insert a widget in order into a DAPM power sequence. */ 949 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget, 950 struct list_head *list, 951 bool power_up) 952 { 953 struct snd_soc_dapm_widget *w; 954 955 list_for_each_entry(w, list, power_list) 956 if (dapm_seq_compare(new_widget, w, power_up) < 0) { 957 list_add_tail(&new_widget->power_list, &w->power_list); 958 return; 959 } 960 961 list_add_tail(&new_widget->power_list, list); 962 } 963 964 static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm, 965 struct snd_soc_dapm_widget *w, int event) 966 { 967 struct snd_soc_card *card = dapm->card; 968 const char *ev_name; 969 int power, ret; 970 971 switch (event) { 972 case SND_SOC_DAPM_PRE_PMU: 973 ev_name = "PRE_PMU"; 974 power = 1; 975 break; 976 case SND_SOC_DAPM_POST_PMU: 977 ev_name = "POST_PMU"; 978 power = 1; 979 break; 980 case SND_SOC_DAPM_PRE_PMD: 981 ev_name = "PRE_PMD"; 982 power = 0; 983 break; 984 case SND_SOC_DAPM_POST_PMD: 985 ev_name = "POST_PMD"; 986 power = 0; 987 break; 988 default: 989 BUG(); 990 return; 991 } 992 993 if (w->power != power) 994 return; 995 996 if (w->event && (w->event_flags & event)) { 997 pop_dbg(dapm->dev, card->pop_time, "pop test : %s %s\n", 998 w->name, ev_name); 999 trace_snd_soc_dapm_widget_event_start(w, event); 1000 ret = w->event(w, NULL, event); 1001 trace_snd_soc_dapm_widget_event_done(w, event); 1002 if (ret < 0) 1003 pr_err("%s: %s event failed: %d\n", 1004 ev_name, w->name, ret); 1005 } 1006 } 1007 1008 /* Apply the coalesced changes from a DAPM sequence */ 1009 static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm, 1010 struct list_head *pending) 1011 { 1012 struct snd_soc_card *card = dapm->card; 1013 struct snd_soc_dapm_widget *w; 1014 int reg, power; 1015 unsigned int value = 0; 1016 unsigned int mask = 0; 1017 unsigned int cur_mask; 1018 1019 reg = list_first_entry(pending, struct snd_soc_dapm_widget, 1020 power_list)->reg; 1021 1022 list_for_each_entry(w, pending, power_list) { 1023 cur_mask = 1 << w->shift; 1024 BUG_ON(reg != w->reg); 1025 1026 if (w->invert) 1027 power = !w->power; 1028 else 1029 power = w->power; 1030 1031 mask |= cur_mask; 1032 if (power) 1033 value |= cur_mask; 1034 1035 pop_dbg(dapm->dev, card->pop_time, 1036 "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n", 1037 w->name, reg, value, mask); 1038 1039 /* Check for events */ 1040 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMU); 1041 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMD); 1042 } 1043 1044 if (reg >= 0) { 1045 /* Any widget will do, they should all be updating the 1046 * same register. 1047 */ 1048 w = list_first_entry(pending, struct snd_soc_dapm_widget, 1049 power_list); 1050 1051 pop_dbg(dapm->dev, card->pop_time, 1052 "pop test : Applying 0x%x/0x%x to %x in %dms\n", 1053 value, mask, reg, card->pop_time); 1054 pop_wait(card->pop_time); 1055 soc_widget_update_bits(w, reg, mask, value); 1056 } 1057 1058 list_for_each_entry(w, pending, power_list) { 1059 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMU); 1060 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMD); 1061 } 1062 } 1063 1064 /* Apply a DAPM power sequence. 1065 * 1066 * We walk over a pre-sorted list of widgets to apply power to. In 1067 * order to minimise the number of writes to the device required 1068 * multiple widgets will be updated in a single write where possible. 1069 * Currently anything that requires more than a single write is not 1070 * handled. 1071 */ 1072 static void dapm_seq_run(struct snd_soc_dapm_context *dapm, 1073 struct list_head *list, int event, bool power_up) 1074 { 1075 struct snd_soc_dapm_widget *w, *n; 1076 LIST_HEAD(pending); 1077 int cur_sort = -1; 1078 int cur_subseq = -1; 1079 int cur_reg = SND_SOC_NOPM; 1080 struct snd_soc_dapm_context *cur_dapm = NULL; 1081 int ret, i; 1082 int *sort; 1083 1084 if (power_up) 1085 sort = dapm_up_seq; 1086 else 1087 sort = dapm_down_seq; 1088 1089 list_for_each_entry_safe(w, n, list, power_list) { 1090 ret = 0; 1091 1092 /* Do we need to apply any queued changes? */ 1093 if (sort[w->id] != cur_sort || w->reg != cur_reg || 1094 w->dapm != cur_dapm || w->subseq != cur_subseq) { 1095 if (!list_empty(&pending)) 1096 dapm_seq_run_coalesced(cur_dapm, &pending); 1097 1098 if (cur_dapm && cur_dapm->seq_notifier) { 1099 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++) 1100 if (sort[i] == cur_sort) 1101 cur_dapm->seq_notifier(cur_dapm, 1102 i, 1103 cur_subseq); 1104 } 1105 1106 INIT_LIST_HEAD(&pending); 1107 cur_sort = -1; 1108 cur_subseq = INT_MIN; 1109 cur_reg = SND_SOC_NOPM; 1110 cur_dapm = NULL; 1111 } 1112 1113 switch (w->id) { 1114 case snd_soc_dapm_pre: 1115 if (!w->event) 1116 list_for_each_entry_safe_continue(w, n, list, 1117 power_list); 1118 1119 if (event == SND_SOC_DAPM_STREAM_START) 1120 ret = w->event(w, 1121 NULL, SND_SOC_DAPM_PRE_PMU); 1122 else if (event == SND_SOC_DAPM_STREAM_STOP) 1123 ret = w->event(w, 1124 NULL, SND_SOC_DAPM_PRE_PMD); 1125 break; 1126 1127 case snd_soc_dapm_post: 1128 if (!w->event) 1129 list_for_each_entry_safe_continue(w, n, list, 1130 power_list); 1131 1132 if (event == SND_SOC_DAPM_STREAM_START) 1133 ret = w->event(w, 1134 NULL, SND_SOC_DAPM_POST_PMU); 1135 else if (event == SND_SOC_DAPM_STREAM_STOP) 1136 ret = w->event(w, 1137 NULL, SND_SOC_DAPM_POST_PMD); 1138 break; 1139 1140 default: 1141 /* Queue it up for application */ 1142 cur_sort = sort[w->id]; 1143 cur_subseq = w->subseq; 1144 cur_reg = w->reg; 1145 cur_dapm = w->dapm; 1146 list_move(&w->power_list, &pending); 1147 break; 1148 } 1149 1150 if (ret < 0) 1151 dev_err(w->dapm->dev, 1152 "Failed to apply widget power: %d\n", ret); 1153 } 1154 1155 if (!list_empty(&pending)) 1156 dapm_seq_run_coalesced(cur_dapm, &pending); 1157 1158 if (cur_dapm && cur_dapm->seq_notifier) { 1159 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++) 1160 if (sort[i] == cur_sort) 1161 cur_dapm->seq_notifier(cur_dapm, 1162 i, cur_subseq); 1163 } 1164 } 1165 1166 static void dapm_widget_update(struct snd_soc_dapm_context *dapm) 1167 { 1168 struct snd_soc_dapm_update *update = dapm->update; 1169 struct snd_soc_dapm_widget *w; 1170 int ret; 1171 1172 if (!update) 1173 return; 1174 1175 w = update->widget; 1176 1177 if (w->event && 1178 (w->event_flags & SND_SOC_DAPM_PRE_REG)) { 1179 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG); 1180 if (ret != 0) 1181 pr_err("%s DAPM pre-event failed: %d\n", 1182 w->name, ret); 1183 } 1184 1185 ret = snd_soc_update_bits(w->codec, update->reg, update->mask, 1186 update->val); 1187 if (ret < 0) 1188 pr_err("%s DAPM update failed: %d\n", w->name, ret); 1189 1190 if (w->event && 1191 (w->event_flags & SND_SOC_DAPM_POST_REG)) { 1192 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG); 1193 if (ret != 0) 1194 pr_err("%s DAPM post-event failed: %d\n", 1195 w->name, ret); 1196 } 1197 } 1198 1199 /* Async callback run prior to DAPM sequences - brings to _PREPARE if 1200 * they're changing state. 1201 */ 1202 static void dapm_pre_sequence_async(void *data, async_cookie_t cookie) 1203 { 1204 struct snd_soc_dapm_context *d = data; 1205 int ret; 1206 1207 /* If we're off and we're not supposed to be go into STANDBY */ 1208 if (d->bias_level == SND_SOC_BIAS_OFF && 1209 d->target_bias_level != SND_SOC_BIAS_OFF) { 1210 if (d->dev) 1211 pm_runtime_get_sync(d->dev); 1212 1213 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY); 1214 if (ret != 0) 1215 dev_err(d->dev, 1216 "Failed to turn on bias: %d\n", ret); 1217 } 1218 1219 /* Prepare for a STADDBY->ON or ON->STANDBY transition */ 1220 if (d->bias_level != d->target_bias_level) { 1221 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_PREPARE); 1222 if (ret != 0) 1223 dev_err(d->dev, 1224 "Failed to prepare bias: %d\n", ret); 1225 } 1226 } 1227 1228 /* Async callback run prior to DAPM sequences - brings to their final 1229 * state. 1230 */ 1231 static void dapm_post_sequence_async(void *data, async_cookie_t cookie) 1232 { 1233 struct snd_soc_dapm_context *d = data; 1234 int ret; 1235 1236 /* If we just powered the last thing off drop to standby bias */ 1237 if (d->bias_level == SND_SOC_BIAS_PREPARE && 1238 (d->target_bias_level == SND_SOC_BIAS_STANDBY || 1239 d->target_bias_level == SND_SOC_BIAS_OFF)) { 1240 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY); 1241 if (ret != 0) 1242 dev_err(d->dev, "Failed to apply standby bias: %d\n", 1243 ret); 1244 } 1245 1246 /* If we're in standby and can support bias off then do that */ 1247 if (d->bias_level == SND_SOC_BIAS_STANDBY && 1248 d->target_bias_level == SND_SOC_BIAS_OFF) { 1249 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_OFF); 1250 if (ret != 0) 1251 dev_err(d->dev, "Failed to turn off bias: %d\n", ret); 1252 1253 if (d->dev) 1254 pm_runtime_put_sync(d->dev); 1255 } 1256 1257 /* If we just powered up then move to active bias */ 1258 if (d->bias_level == SND_SOC_BIAS_PREPARE && 1259 d->target_bias_level == SND_SOC_BIAS_ON) { 1260 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_ON); 1261 if (ret != 0) 1262 dev_err(d->dev, "Failed to apply active bias: %d\n", 1263 ret); 1264 } 1265 } 1266 1267 static void dapm_widget_set_peer_power(struct snd_soc_dapm_widget *peer, 1268 bool power, bool connect) 1269 { 1270 /* If a connection is being made or broken then that update 1271 * will have marked the peer dirty, otherwise the widgets are 1272 * not connected and this update has no impact. */ 1273 if (!connect) 1274 return; 1275 1276 /* If the peer is already in the state we're moving to then we 1277 * won't have an impact on it. */ 1278 if (power != peer->power) 1279 dapm_mark_dirty(peer, "peer state change"); 1280 } 1281 1282 static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power, 1283 struct list_head *up_list, 1284 struct list_head *down_list) 1285 { 1286 struct snd_soc_dapm_path *path; 1287 1288 if (w->power == power) 1289 return; 1290 1291 trace_snd_soc_dapm_widget_power(w, power); 1292 1293 /* If we changed our power state perhaps our neigbours changed 1294 * also. 1295 */ 1296 list_for_each_entry(path, &w->sources, list_sink) { 1297 if (path->source) { 1298 dapm_widget_set_peer_power(path->source, power, 1299 path->connect); 1300 } 1301 } 1302 switch (w->id) { 1303 case snd_soc_dapm_supply: 1304 /* Supplies can't affect their outputs, only their inputs */ 1305 break; 1306 default: 1307 list_for_each_entry(path, &w->sinks, list_source) { 1308 if (path->sink) { 1309 dapm_widget_set_peer_power(path->sink, power, 1310 path->connect); 1311 } 1312 } 1313 break; 1314 } 1315 1316 if (power) 1317 dapm_seq_insert(w, up_list, true); 1318 else 1319 dapm_seq_insert(w, down_list, false); 1320 1321 w->power = power; 1322 } 1323 1324 static void dapm_power_one_widget(struct snd_soc_dapm_widget *w, 1325 struct list_head *up_list, 1326 struct list_head *down_list) 1327 { 1328 int power; 1329 1330 switch (w->id) { 1331 case snd_soc_dapm_pre: 1332 dapm_seq_insert(w, down_list, false); 1333 break; 1334 case snd_soc_dapm_post: 1335 dapm_seq_insert(w, up_list, true); 1336 break; 1337 1338 default: 1339 power = dapm_widget_power_check(w); 1340 1341 dapm_widget_set_power(w, power, up_list, down_list); 1342 break; 1343 } 1344 } 1345 1346 /* 1347 * Scan each dapm widget for complete audio path. 1348 * A complete path is a route that has valid endpoints i.e.:- 1349 * 1350 * o DAC to output pin. 1351 * o Input Pin to ADC. 1352 * o Input pin to Output pin (bypass, sidetone) 1353 * o DAC to ADC (loopback). 1354 */ 1355 static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event) 1356 { 1357 struct snd_soc_card *card = dapm->card; 1358 struct snd_soc_dapm_widget *w; 1359 struct snd_soc_dapm_context *d; 1360 LIST_HEAD(up_list); 1361 LIST_HEAD(down_list); 1362 LIST_HEAD(async_domain); 1363 enum snd_soc_bias_level bias; 1364 1365 trace_snd_soc_dapm_start(card); 1366 1367 list_for_each_entry(d, &card->dapm_list, list) { 1368 if (d->n_widgets || d->codec == NULL) { 1369 if (d->idle_bias_off) 1370 d->target_bias_level = SND_SOC_BIAS_OFF; 1371 else 1372 d->target_bias_level = SND_SOC_BIAS_STANDBY; 1373 } 1374 } 1375 1376 memset(&card->dapm_stats, 0, sizeof(card->dapm_stats)); 1377 1378 list_for_each_entry(w, &card->widgets, list) { 1379 w->power_checked = false; 1380 w->inputs = -1; 1381 w->outputs = -1; 1382 } 1383 1384 /* Check which widgets we need to power and store them in 1385 * lists indicating if they should be powered up or down. We 1386 * only check widgets that have been flagged as dirty but note 1387 * that new widgets may be added to the dirty list while we 1388 * iterate. 1389 */ 1390 list_for_each_entry(w, &card->dapm_dirty, dirty) { 1391 dapm_power_one_widget(w, &up_list, &down_list); 1392 } 1393 1394 list_for_each_entry(w, &card->widgets, list) { 1395 list_del_init(&w->dirty); 1396 1397 if (w->power) { 1398 d = w->dapm; 1399 1400 /* Supplies and micbiases only bring the 1401 * context up to STANDBY as unless something 1402 * else is active and passing audio they 1403 * generally don't require full power. 1404 */ 1405 switch (w->id) { 1406 case snd_soc_dapm_supply: 1407 case snd_soc_dapm_micbias: 1408 if (d->target_bias_level < SND_SOC_BIAS_STANDBY) 1409 d->target_bias_level = SND_SOC_BIAS_STANDBY; 1410 break; 1411 default: 1412 d->target_bias_level = SND_SOC_BIAS_ON; 1413 break; 1414 } 1415 } 1416 1417 } 1418 1419 /* If there are no DAPM widgets then try to figure out power from the 1420 * event type. 1421 */ 1422 if (!dapm->n_widgets) { 1423 switch (event) { 1424 case SND_SOC_DAPM_STREAM_START: 1425 case SND_SOC_DAPM_STREAM_RESUME: 1426 dapm->target_bias_level = SND_SOC_BIAS_ON; 1427 break; 1428 case SND_SOC_DAPM_STREAM_STOP: 1429 if (dapm->codec && dapm->codec->active) 1430 dapm->target_bias_level = SND_SOC_BIAS_ON; 1431 else 1432 dapm->target_bias_level = SND_SOC_BIAS_STANDBY; 1433 break; 1434 case SND_SOC_DAPM_STREAM_SUSPEND: 1435 dapm->target_bias_level = SND_SOC_BIAS_STANDBY; 1436 break; 1437 case SND_SOC_DAPM_STREAM_NOP: 1438 dapm->target_bias_level = dapm->bias_level; 1439 break; 1440 default: 1441 break; 1442 } 1443 } 1444 1445 /* Force all contexts in the card to the same bias state if 1446 * they're not ground referenced. 1447 */ 1448 bias = SND_SOC_BIAS_OFF; 1449 list_for_each_entry(d, &card->dapm_list, list) 1450 if (d->target_bias_level > bias) 1451 bias = d->target_bias_level; 1452 list_for_each_entry(d, &card->dapm_list, list) 1453 if (!d->idle_bias_off) 1454 d->target_bias_level = bias; 1455 1456 trace_snd_soc_dapm_walk_done(card); 1457 1458 /* Run all the bias changes in parallel */ 1459 list_for_each_entry(d, &dapm->card->dapm_list, list) 1460 async_schedule_domain(dapm_pre_sequence_async, d, 1461 &async_domain); 1462 async_synchronize_full_domain(&async_domain); 1463 1464 /* Power down widgets first; try to avoid amplifying pops. */ 1465 dapm_seq_run(dapm, &down_list, event, false); 1466 1467 dapm_widget_update(dapm); 1468 1469 /* Now power up. */ 1470 dapm_seq_run(dapm, &up_list, event, true); 1471 1472 /* Run all the bias changes in parallel */ 1473 list_for_each_entry(d, &dapm->card->dapm_list, list) 1474 async_schedule_domain(dapm_post_sequence_async, d, 1475 &async_domain); 1476 async_synchronize_full_domain(&async_domain); 1477 1478 pop_dbg(dapm->dev, card->pop_time, 1479 "DAPM sequencing finished, waiting %dms\n", card->pop_time); 1480 pop_wait(card->pop_time); 1481 1482 trace_snd_soc_dapm_done(card); 1483 1484 return 0; 1485 } 1486 1487 #ifdef CONFIG_DEBUG_FS 1488 static int dapm_widget_power_open_file(struct inode *inode, struct file *file) 1489 { 1490 file->private_data = inode->i_private; 1491 return 0; 1492 } 1493 1494 static ssize_t dapm_widget_power_read_file(struct file *file, 1495 char __user *user_buf, 1496 size_t count, loff_t *ppos) 1497 { 1498 struct snd_soc_dapm_widget *w = file->private_data; 1499 char *buf; 1500 int in, out; 1501 ssize_t ret; 1502 struct snd_soc_dapm_path *p = NULL; 1503 1504 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 1505 if (!buf) 1506 return -ENOMEM; 1507 1508 in = is_connected_input_ep(w); 1509 dapm_clear_walk(w->dapm); 1510 out = is_connected_output_ep(w); 1511 dapm_clear_walk(w->dapm); 1512 1513 ret = snprintf(buf, PAGE_SIZE, "%s: %s in %d out %d", 1514 w->name, w->power ? "On" : "Off", in, out); 1515 1516 if (w->reg >= 0) 1517 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1518 " - R%d(0x%x) bit %d", 1519 w->reg, w->reg, w->shift); 1520 1521 ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n"); 1522 1523 if (w->sname) 1524 ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n", 1525 w->sname, 1526 w->active ? "active" : "inactive"); 1527 1528 list_for_each_entry(p, &w->sources, list_sink) { 1529 if (p->connected && !p->connected(w, p->sink)) 1530 continue; 1531 1532 if (p->connect) 1533 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1534 " in \"%s\" \"%s\"\n", 1535 p->name ? p->name : "static", 1536 p->source->name); 1537 } 1538 list_for_each_entry(p, &w->sinks, list_source) { 1539 if (p->connected && !p->connected(w, p->sink)) 1540 continue; 1541 1542 if (p->connect) 1543 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1544 " out \"%s\" \"%s\"\n", 1545 p->name ? p->name : "static", 1546 p->sink->name); 1547 } 1548 1549 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); 1550 1551 kfree(buf); 1552 return ret; 1553 } 1554 1555 static const struct file_operations dapm_widget_power_fops = { 1556 .open = dapm_widget_power_open_file, 1557 .read = dapm_widget_power_read_file, 1558 .llseek = default_llseek, 1559 }; 1560 1561 static int dapm_bias_open_file(struct inode *inode, struct file *file) 1562 { 1563 file->private_data = inode->i_private; 1564 return 0; 1565 } 1566 1567 static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, 1568 size_t count, loff_t *ppos) 1569 { 1570 struct snd_soc_dapm_context *dapm = file->private_data; 1571 char *level; 1572 1573 switch (dapm->bias_level) { 1574 case SND_SOC_BIAS_ON: 1575 level = "On\n"; 1576 break; 1577 case SND_SOC_BIAS_PREPARE: 1578 level = "Prepare\n"; 1579 break; 1580 case SND_SOC_BIAS_STANDBY: 1581 level = "Standby\n"; 1582 break; 1583 case SND_SOC_BIAS_OFF: 1584 level = "Off\n"; 1585 break; 1586 default: 1587 BUG(); 1588 level = "Unknown\n"; 1589 break; 1590 } 1591 1592 return simple_read_from_buffer(user_buf, count, ppos, level, 1593 strlen(level)); 1594 } 1595 1596 static const struct file_operations dapm_bias_fops = { 1597 .open = dapm_bias_open_file, 1598 .read = dapm_bias_read_file, 1599 .llseek = default_llseek, 1600 }; 1601 1602 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, 1603 struct dentry *parent) 1604 { 1605 struct dentry *d; 1606 1607 dapm->debugfs_dapm = debugfs_create_dir("dapm", parent); 1608 1609 if (!dapm->debugfs_dapm) { 1610 printk(KERN_WARNING 1611 "Failed to create DAPM debugfs directory\n"); 1612 return; 1613 } 1614 1615 d = debugfs_create_file("bias_level", 0444, 1616 dapm->debugfs_dapm, dapm, 1617 &dapm_bias_fops); 1618 if (!d) 1619 dev_warn(dapm->dev, 1620 "ASoC: Failed to create bias level debugfs file\n"); 1621 } 1622 1623 static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) 1624 { 1625 struct snd_soc_dapm_context *dapm = w->dapm; 1626 struct dentry *d; 1627 1628 if (!dapm->debugfs_dapm || !w->name) 1629 return; 1630 1631 d = debugfs_create_file(w->name, 0444, 1632 dapm->debugfs_dapm, w, 1633 &dapm_widget_power_fops); 1634 if (!d) 1635 dev_warn(w->dapm->dev, 1636 "ASoC: Failed to create %s debugfs file\n", 1637 w->name); 1638 } 1639 1640 static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) 1641 { 1642 debugfs_remove_recursive(dapm->debugfs_dapm); 1643 } 1644 1645 #else 1646 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, 1647 struct dentry *parent) 1648 { 1649 } 1650 1651 static inline void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) 1652 { 1653 } 1654 1655 static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) 1656 { 1657 } 1658 1659 #endif 1660 1661 /* test and update the power status of a mux widget */ 1662 static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget, 1663 struct snd_kcontrol *kcontrol, int change, 1664 int mux, struct soc_enum *e) 1665 { 1666 struct snd_soc_dapm_path *path; 1667 int found = 0; 1668 1669 if (widget->id != snd_soc_dapm_mux && 1670 widget->id != snd_soc_dapm_virt_mux && 1671 widget->id != snd_soc_dapm_value_mux) 1672 return -ENODEV; 1673 1674 if (!change) 1675 return 0; 1676 1677 /* find dapm widget path assoc with kcontrol */ 1678 list_for_each_entry(path, &widget->dapm->card->paths, list) { 1679 if (path->kcontrol != kcontrol) 1680 continue; 1681 1682 if (!path->name || !e->texts[mux]) 1683 continue; 1684 1685 found = 1; 1686 /* we now need to match the string in the enum to the path */ 1687 if (!(strcmp(path->name, e->texts[mux]))) { 1688 path->connect = 1; /* new connection */ 1689 dapm_mark_dirty(path->source, "mux connection"); 1690 } else { 1691 if (path->connect) 1692 dapm_mark_dirty(path->source, 1693 "mux disconnection"); 1694 path->connect = 0; /* old connection must be powered down */ 1695 } 1696 } 1697 1698 if (found) { 1699 dapm_mark_dirty(widget, "mux change"); 1700 dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP); 1701 } 1702 1703 return 0; 1704 } 1705 1706 /* test and update the power status of a mixer or switch widget */ 1707 static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget, 1708 struct snd_kcontrol *kcontrol, int connect) 1709 { 1710 struct snd_soc_dapm_path *path; 1711 int found = 0; 1712 1713 if (widget->id != snd_soc_dapm_mixer && 1714 widget->id != snd_soc_dapm_mixer_named_ctl && 1715 widget->id != snd_soc_dapm_switch) 1716 return -ENODEV; 1717 1718 /* find dapm widget path assoc with kcontrol */ 1719 list_for_each_entry(path, &widget->dapm->card->paths, list) { 1720 if (path->kcontrol != kcontrol) 1721 continue; 1722 1723 /* found, now check type */ 1724 found = 1; 1725 path->connect = connect; 1726 dapm_mark_dirty(path->source, "mixer connection"); 1727 } 1728 1729 if (found) { 1730 dapm_mark_dirty(widget, "mixer update"); 1731 dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP); 1732 } 1733 1734 return 0; 1735 } 1736 1737 /* show dapm widget status in sys fs */ 1738 static ssize_t dapm_widget_show(struct device *dev, 1739 struct device_attribute *attr, char *buf) 1740 { 1741 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); 1742 struct snd_soc_codec *codec =rtd->codec; 1743 struct snd_soc_dapm_widget *w; 1744 int count = 0; 1745 char *state = "not set"; 1746 1747 list_for_each_entry(w, &codec->card->widgets, list) { 1748 if (w->dapm != &codec->dapm) 1749 continue; 1750 1751 /* only display widgets that burnm power */ 1752 switch (w->id) { 1753 case snd_soc_dapm_hp: 1754 case snd_soc_dapm_mic: 1755 case snd_soc_dapm_spk: 1756 case snd_soc_dapm_line: 1757 case snd_soc_dapm_micbias: 1758 case snd_soc_dapm_dac: 1759 case snd_soc_dapm_adc: 1760 case snd_soc_dapm_pga: 1761 case snd_soc_dapm_out_drv: 1762 case snd_soc_dapm_mixer: 1763 case snd_soc_dapm_mixer_named_ctl: 1764 case snd_soc_dapm_supply: 1765 if (w->name) 1766 count += sprintf(buf + count, "%s: %s\n", 1767 w->name, w->power ? "On":"Off"); 1768 break; 1769 default: 1770 break; 1771 } 1772 } 1773 1774 switch (codec->dapm.bias_level) { 1775 case SND_SOC_BIAS_ON: 1776 state = "On"; 1777 break; 1778 case SND_SOC_BIAS_PREPARE: 1779 state = "Prepare"; 1780 break; 1781 case SND_SOC_BIAS_STANDBY: 1782 state = "Standby"; 1783 break; 1784 case SND_SOC_BIAS_OFF: 1785 state = "Off"; 1786 break; 1787 } 1788 count += sprintf(buf + count, "PM State: %s\n", state); 1789 1790 return count; 1791 } 1792 1793 static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); 1794 1795 int snd_soc_dapm_sys_add(struct device *dev) 1796 { 1797 return device_create_file(dev, &dev_attr_dapm_widget); 1798 } 1799 1800 static void snd_soc_dapm_sys_remove(struct device *dev) 1801 { 1802 device_remove_file(dev, &dev_attr_dapm_widget); 1803 } 1804 1805 /* free all dapm widgets and resources */ 1806 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) 1807 { 1808 struct snd_soc_dapm_widget *w, *next_w; 1809 struct snd_soc_dapm_path *p, *next_p; 1810 1811 list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) { 1812 if (w->dapm != dapm) 1813 continue; 1814 list_del(&w->list); 1815 /* 1816 * remove source and sink paths associated to this widget. 1817 * While removing the path, remove reference to it from both 1818 * source and sink widgets so that path is removed only once. 1819 */ 1820 list_for_each_entry_safe(p, next_p, &w->sources, list_sink) { 1821 list_del(&p->list_sink); 1822 list_del(&p->list_source); 1823 list_del(&p->list); 1824 kfree(p->long_name); 1825 kfree(p); 1826 } 1827 list_for_each_entry_safe(p, next_p, &w->sinks, list_source) { 1828 list_del(&p->list_sink); 1829 list_del(&p->list_source); 1830 list_del(&p->list); 1831 kfree(p->long_name); 1832 kfree(p); 1833 } 1834 kfree(w->kcontrols); 1835 kfree(w->name); 1836 kfree(w); 1837 } 1838 } 1839 1840 static struct snd_soc_dapm_widget *dapm_find_widget( 1841 struct snd_soc_dapm_context *dapm, const char *pin, 1842 bool search_other_contexts) 1843 { 1844 struct snd_soc_dapm_widget *w; 1845 struct snd_soc_dapm_widget *fallback = NULL; 1846 1847 list_for_each_entry(w, &dapm->card->widgets, list) { 1848 if (!strcmp(w->name, pin)) { 1849 if (w->dapm == dapm) 1850 return w; 1851 else 1852 fallback = w; 1853 } 1854 } 1855 1856 if (search_other_contexts) 1857 return fallback; 1858 1859 return NULL; 1860 } 1861 1862 static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, 1863 const char *pin, int status) 1864 { 1865 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 1866 1867 if (!w) { 1868 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 1869 return -EINVAL; 1870 } 1871 1872 w->connected = status; 1873 if (status == 0) 1874 w->force = 0; 1875 dapm_mark_dirty(w, "pin configuration"); 1876 1877 return 0; 1878 } 1879 1880 /** 1881 * snd_soc_dapm_sync - scan and power dapm paths 1882 * @dapm: DAPM context 1883 * 1884 * Walks all dapm audio paths and powers widgets according to their 1885 * stream or path usage. 1886 * 1887 * Returns 0 for success. 1888 */ 1889 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm) 1890 { 1891 /* 1892 * Suppress early reports (eg, jacks syncing their state) to avoid 1893 * silly DAPM runs during card startup. 1894 */ 1895 if (!dapm->card || !dapm->card->instantiated) 1896 return 0; 1897 1898 return dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP); 1899 } 1900 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync); 1901 1902 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm, 1903 const struct snd_soc_dapm_route *route) 1904 { 1905 struct snd_soc_dapm_path *path; 1906 struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w; 1907 struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL; 1908 const char *sink; 1909 const char *control = route->control; 1910 const char *source; 1911 char prefixed_sink[80]; 1912 char prefixed_source[80]; 1913 int ret = 0; 1914 1915 if (dapm->codec && dapm->codec->name_prefix) { 1916 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s", 1917 dapm->codec->name_prefix, route->sink); 1918 sink = prefixed_sink; 1919 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s", 1920 dapm->codec->name_prefix, route->source); 1921 source = prefixed_source; 1922 } else { 1923 sink = route->sink; 1924 source = route->source; 1925 } 1926 1927 /* 1928 * find src and dest widgets over all widgets but favor a widget from 1929 * current DAPM context 1930 */ 1931 list_for_each_entry(w, &dapm->card->widgets, list) { 1932 if (!wsink && !(strcmp(w->name, sink))) { 1933 wtsink = w; 1934 if (w->dapm == dapm) 1935 wsink = w; 1936 continue; 1937 } 1938 if (!wsource && !(strcmp(w->name, source))) { 1939 wtsource = w; 1940 if (w->dapm == dapm) 1941 wsource = w; 1942 } 1943 } 1944 /* use widget from another DAPM context if not found from this */ 1945 if (!wsink) 1946 wsink = wtsink; 1947 if (!wsource) 1948 wsource = wtsource; 1949 1950 if (wsource == NULL || wsink == NULL) 1951 return -ENODEV; 1952 1953 path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL); 1954 if (!path) 1955 return -ENOMEM; 1956 1957 path->source = wsource; 1958 path->sink = wsink; 1959 path->connected = route->connected; 1960 INIT_LIST_HEAD(&path->list); 1961 INIT_LIST_HEAD(&path->list_source); 1962 INIT_LIST_HEAD(&path->list_sink); 1963 1964 /* check for external widgets */ 1965 if (wsink->id == snd_soc_dapm_input) { 1966 if (wsource->id == snd_soc_dapm_micbias || 1967 wsource->id == snd_soc_dapm_mic || 1968 wsource->id == snd_soc_dapm_line || 1969 wsource->id == snd_soc_dapm_output) 1970 wsink->ext = 1; 1971 } 1972 if (wsource->id == snd_soc_dapm_output) { 1973 if (wsink->id == snd_soc_dapm_spk || 1974 wsink->id == snd_soc_dapm_hp || 1975 wsink->id == snd_soc_dapm_line || 1976 wsink->id == snd_soc_dapm_input) 1977 wsource->ext = 1; 1978 } 1979 1980 /* connect static paths */ 1981 if (control == NULL) { 1982 list_add(&path->list, &dapm->card->paths); 1983 list_add(&path->list_sink, &wsink->sources); 1984 list_add(&path->list_source, &wsource->sinks); 1985 path->connect = 1; 1986 return 0; 1987 } 1988 1989 /* connect dynamic paths */ 1990 switch (wsink->id) { 1991 case snd_soc_dapm_adc: 1992 case snd_soc_dapm_dac: 1993 case snd_soc_dapm_pga: 1994 case snd_soc_dapm_out_drv: 1995 case snd_soc_dapm_input: 1996 case snd_soc_dapm_output: 1997 case snd_soc_dapm_siggen: 1998 case snd_soc_dapm_micbias: 1999 case snd_soc_dapm_vmid: 2000 case snd_soc_dapm_pre: 2001 case snd_soc_dapm_post: 2002 case snd_soc_dapm_supply: 2003 case snd_soc_dapm_aif_in: 2004 case snd_soc_dapm_aif_out: 2005 list_add(&path->list, &dapm->card->paths); 2006 list_add(&path->list_sink, &wsink->sources); 2007 list_add(&path->list_source, &wsource->sinks); 2008 path->connect = 1; 2009 return 0; 2010 case snd_soc_dapm_mux: 2011 case snd_soc_dapm_virt_mux: 2012 case snd_soc_dapm_value_mux: 2013 ret = dapm_connect_mux(dapm, wsource, wsink, path, control, 2014 &wsink->kcontrol_news[0]); 2015 if (ret != 0) 2016 goto err; 2017 break; 2018 case snd_soc_dapm_switch: 2019 case snd_soc_dapm_mixer: 2020 case snd_soc_dapm_mixer_named_ctl: 2021 ret = dapm_connect_mixer(dapm, wsource, wsink, path, control); 2022 if (ret != 0) 2023 goto err; 2024 break; 2025 case snd_soc_dapm_hp: 2026 case snd_soc_dapm_mic: 2027 case snd_soc_dapm_line: 2028 case snd_soc_dapm_spk: 2029 list_add(&path->list, &dapm->card->paths); 2030 list_add(&path->list_sink, &wsink->sources); 2031 list_add(&path->list_source, &wsource->sinks); 2032 path->connect = 0; 2033 return 0; 2034 } 2035 return 0; 2036 2037 err: 2038 dev_warn(dapm->dev, "asoc: no dapm match for %s --> %s --> %s\n", 2039 source, control, sink); 2040 kfree(path); 2041 return ret; 2042 } 2043 2044 /** 2045 * snd_soc_dapm_add_routes - Add routes between DAPM widgets 2046 * @dapm: DAPM context 2047 * @route: audio routes 2048 * @num: number of routes 2049 * 2050 * Connects 2 dapm widgets together via a named audio path. The sink is 2051 * the widget receiving the audio signal, whilst the source is the sender 2052 * of the audio signal. 2053 * 2054 * Returns 0 for success else error. On error all resources can be freed 2055 * with a call to snd_soc_card_free(). 2056 */ 2057 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm, 2058 const struct snd_soc_dapm_route *route, int num) 2059 { 2060 int i, ret; 2061 2062 for (i = 0; i < num; i++) { 2063 ret = snd_soc_dapm_add_route(dapm, route); 2064 if (ret < 0) { 2065 dev_err(dapm->dev, "Failed to add route %s->%s\n", 2066 route->source, route->sink); 2067 return ret; 2068 } 2069 route++; 2070 } 2071 2072 return 0; 2073 } 2074 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes); 2075 2076 static int snd_soc_dapm_weak_route(struct snd_soc_dapm_context *dapm, 2077 const struct snd_soc_dapm_route *route) 2078 { 2079 struct snd_soc_dapm_widget *source = dapm_find_widget(dapm, 2080 route->source, 2081 true); 2082 struct snd_soc_dapm_widget *sink = dapm_find_widget(dapm, 2083 route->sink, 2084 true); 2085 struct snd_soc_dapm_path *path; 2086 int count = 0; 2087 2088 if (!source) { 2089 dev_err(dapm->dev, "Unable to find source %s for weak route\n", 2090 route->source); 2091 return -ENODEV; 2092 } 2093 2094 if (!sink) { 2095 dev_err(dapm->dev, "Unable to find sink %s for weak route\n", 2096 route->sink); 2097 return -ENODEV; 2098 } 2099 2100 if (route->control || route->connected) 2101 dev_warn(dapm->dev, "Ignoring control for weak route %s->%s\n", 2102 route->source, route->sink); 2103 2104 list_for_each_entry(path, &source->sinks, list_source) { 2105 if (path->sink == sink) { 2106 path->weak = 1; 2107 count++; 2108 } 2109 } 2110 2111 if (count == 0) 2112 dev_err(dapm->dev, "No path found for weak route %s->%s\n", 2113 route->source, route->sink); 2114 if (count > 1) 2115 dev_warn(dapm->dev, "%d paths found for weak route %s->%s\n", 2116 count, route->source, route->sink); 2117 2118 return 0; 2119 } 2120 2121 /** 2122 * snd_soc_dapm_weak_routes - Mark routes between DAPM widgets as weak 2123 * @dapm: DAPM context 2124 * @route: audio routes 2125 * @num: number of routes 2126 * 2127 * Mark existing routes matching those specified in the passed array 2128 * as being weak, meaning that they are ignored for the purpose of 2129 * power decisions. The main intended use case is for sidetone paths 2130 * which couple audio between other independent paths if they are both 2131 * active in order to make the combination work better at the user 2132 * level but which aren't intended to be "used". 2133 * 2134 * Note that CODEC drivers should not use this as sidetone type paths 2135 * can frequently also be used as bypass paths. 2136 */ 2137 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm, 2138 const struct snd_soc_dapm_route *route, int num) 2139 { 2140 int i, err; 2141 int ret = 0; 2142 2143 for (i = 0; i < num; i++) { 2144 err = snd_soc_dapm_weak_route(dapm, route); 2145 if (err) 2146 ret = err; 2147 route++; 2148 } 2149 2150 return ret; 2151 } 2152 EXPORT_SYMBOL_GPL(snd_soc_dapm_weak_routes); 2153 2154 /** 2155 * snd_soc_dapm_new_widgets - add new dapm widgets 2156 * @dapm: DAPM context 2157 * 2158 * Checks the codec for any new dapm widgets and creates them if found. 2159 * 2160 * Returns 0 for success. 2161 */ 2162 int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) 2163 { 2164 struct snd_soc_dapm_widget *w; 2165 unsigned int val; 2166 2167 list_for_each_entry(w, &dapm->card->widgets, list) 2168 { 2169 if (w->new) 2170 continue; 2171 2172 if (w->num_kcontrols) { 2173 w->kcontrols = kzalloc(w->num_kcontrols * 2174 sizeof(struct snd_kcontrol *), 2175 GFP_KERNEL); 2176 if (!w->kcontrols) 2177 return -ENOMEM; 2178 } 2179 2180 switch(w->id) { 2181 case snd_soc_dapm_switch: 2182 case snd_soc_dapm_mixer: 2183 case snd_soc_dapm_mixer_named_ctl: 2184 dapm_new_mixer(w); 2185 break; 2186 case snd_soc_dapm_mux: 2187 case snd_soc_dapm_virt_mux: 2188 case snd_soc_dapm_value_mux: 2189 dapm_new_mux(w); 2190 break; 2191 case snd_soc_dapm_pga: 2192 case snd_soc_dapm_out_drv: 2193 dapm_new_pga(w); 2194 break; 2195 default: 2196 break; 2197 } 2198 2199 /* Read the initial power state from the device */ 2200 if (w->reg >= 0) { 2201 val = soc_widget_read(w, w->reg); 2202 val &= 1 << w->shift; 2203 if (w->invert) 2204 val = !val; 2205 2206 if (val) 2207 w->power = 1; 2208 } 2209 2210 w->new = 1; 2211 2212 dapm_mark_dirty(w, "new widget"); 2213 dapm_debugfs_add_widget(w); 2214 } 2215 2216 dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP); 2217 return 0; 2218 } 2219 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets); 2220 2221 /** 2222 * snd_soc_dapm_get_volsw - dapm mixer get callback 2223 * @kcontrol: mixer control 2224 * @ucontrol: control element information 2225 * 2226 * Callback to get the value of a dapm mixer control. 2227 * 2228 * Returns 0 for success. 2229 */ 2230 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol, 2231 struct snd_ctl_elem_value *ucontrol) 2232 { 2233 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2234 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2235 struct soc_mixer_control *mc = 2236 (struct soc_mixer_control *)kcontrol->private_value; 2237 unsigned int reg = mc->reg; 2238 unsigned int shift = mc->shift; 2239 unsigned int rshift = mc->rshift; 2240 int max = mc->max; 2241 unsigned int invert = mc->invert; 2242 unsigned int mask = (1 << fls(max)) - 1; 2243 2244 ucontrol->value.integer.value[0] = 2245 (snd_soc_read(widget->codec, reg) >> shift) & mask; 2246 if (shift != rshift) 2247 ucontrol->value.integer.value[1] = 2248 (snd_soc_read(widget->codec, reg) >> rshift) & mask; 2249 if (invert) { 2250 ucontrol->value.integer.value[0] = 2251 max - ucontrol->value.integer.value[0]; 2252 if (shift != rshift) 2253 ucontrol->value.integer.value[1] = 2254 max - ucontrol->value.integer.value[1]; 2255 } 2256 2257 return 0; 2258 } 2259 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); 2260 2261 /** 2262 * snd_soc_dapm_put_volsw - dapm mixer set callback 2263 * @kcontrol: mixer control 2264 * @ucontrol: control element information 2265 * 2266 * Callback to set the value of a dapm mixer control. 2267 * 2268 * Returns 0 for success. 2269 */ 2270 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, 2271 struct snd_ctl_elem_value *ucontrol) 2272 { 2273 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2274 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2275 struct snd_soc_codec *codec = widget->codec; 2276 struct soc_mixer_control *mc = 2277 (struct soc_mixer_control *)kcontrol->private_value; 2278 unsigned int reg = mc->reg; 2279 unsigned int shift = mc->shift; 2280 int max = mc->max; 2281 unsigned int mask = (1 << fls(max)) - 1; 2282 unsigned int invert = mc->invert; 2283 unsigned int val; 2284 int connect, change; 2285 struct snd_soc_dapm_update update; 2286 int wi; 2287 2288 val = (ucontrol->value.integer.value[0] & mask); 2289 2290 if (invert) 2291 val = max - val; 2292 mask = mask << shift; 2293 val = val << shift; 2294 2295 if (val) 2296 /* new connection */ 2297 connect = invert ? 0 : 1; 2298 else 2299 /* old connection must be powered down */ 2300 connect = invert ? 1 : 0; 2301 2302 mutex_lock(&codec->mutex); 2303 2304 change = snd_soc_test_bits(widget->codec, reg, mask, val); 2305 if (change) { 2306 for (wi = 0; wi < wlist->num_widgets; wi++) { 2307 widget = wlist->widgets[wi]; 2308 2309 widget->value = val; 2310 2311 update.kcontrol = kcontrol; 2312 update.widget = widget; 2313 update.reg = reg; 2314 update.mask = mask; 2315 update.val = val; 2316 widget->dapm->update = &update; 2317 2318 dapm_mixer_update_power(widget, kcontrol, connect); 2319 2320 widget->dapm->update = NULL; 2321 } 2322 } 2323 2324 mutex_unlock(&codec->mutex); 2325 return 0; 2326 } 2327 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw); 2328 2329 /** 2330 * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback 2331 * @kcontrol: mixer control 2332 * @ucontrol: control element information 2333 * 2334 * Callback to get the value of a dapm enumerated double mixer control. 2335 * 2336 * Returns 0 for success. 2337 */ 2338 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol, 2339 struct snd_ctl_elem_value *ucontrol) 2340 { 2341 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2342 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2343 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2344 unsigned int val, bitmask; 2345 2346 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 2347 ; 2348 val = snd_soc_read(widget->codec, e->reg); 2349 ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1); 2350 if (e->shift_l != e->shift_r) 2351 ucontrol->value.enumerated.item[1] = 2352 (val >> e->shift_r) & (bitmask - 1); 2353 2354 return 0; 2355 } 2356 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double); 2357 2358 /** 2359 * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback 2360 * @kcontrol: mixer control 2361 * @ucontrol: control element information 2362 * 2363 * Callback to set the value of a dapm enumerated double mixer control. 2364 * 2365 * Returns 0 for success. 2366 */ 2367 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, 2368 struct snd_ctl_elem_value *ucontrol) 2369 { 2370 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2371 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2372 struct snd_soc_codec *codec = widget->codec; 2373 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2374 unsigned int val, mux, change; 2375 unsigned int mask, bitmask; 2376 struct snd_soc_dapm_update update; 2377 int wi; 2378 2379 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 2380 ; 2381 if (ucontrol->value.enumerated.item[0] > e->max - 1) 2382 return -EINVAL; 2383 mux = ucontrol->value.enumerated.item[0]; 2384 val = mux << e->shift_l; 2385 mask = (bitmask - 1) << e->shift_l; 2386 if (e->shift_l != e->shift_r) { 2387 if (ucontrol->value.enumerated.item[1] > e->max - 1) 2388 return -EINVAL; 2389 val |= ucontrol->value.enumerated.item[1] << e->shift_r; 2390 mask |= (bitmask - 1) << e->shift_r; 2391 } 2392 2393 mutex_lock(&codec->mutex); 2394 2395 change = snd_soc_test_bits(widget->codec, e->reg, mask, val); 2396 if (change) { 2397 for (wi = 0; wi < wlist->num_widgets; wi++) { 2398 widget = wlist->widgets[wi]; 2399 2400 widget->value = val; 2401 2402 update.kcontrol = kcontrol; 2403 update.widget = widget; 2404 update.reg = e->reg; 2405 update.mask = mask; 2406 update.val = val; 2407 widget->dapm->update = &update; 2408 2409 dapm_mux_update_power(widget, kcontrol, change, mux, e); 2410 2411 widget->dapm->update = NULL; 2412 } 2413 } 2414 2415 mutex_unlock(&codec->mutex); 2416 return change; 2417 } 2418 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double); 2419 2420 /** 2421 * snd_soc_dapm_get_enum_virt - Get virtual DAPM mux 2422 * @kcontrol: mixer control 2423 * @ucontrol: control element information 2424 * 2425 * Returns 0 for success. 2426 */ 2427 int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol, 2428 struct snd_ctl_elem_value *ucontrol) 2429 { 2430 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2431 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2432 2433 ucontrol->value.enumerated.item[0] = widget->value; 2434 2435 return 0; 2436 } 2437 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_virt); 2438 2439 /** 2440 * snd_soc_dapm_put_enum_virt - Set virtual DAPM mux 2441 * @kcontrol: mixer control 2442 * @ucontrol: control element information 2443 * 2444 * Returns 0 for success. 2445 */ 2446 int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol, 2447 struct snd_ctl_elem_value *ucontrol) 2448 { 2449 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2450 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2451 struct snd_soc_codec *codec = widget->codec; 2452 struct soc_enum *e = 2453 (struct soc_enum *)kcontrol->private_value; 2454 int change; 2455 int ret = 0; 2456 int wi; 2457 2458 if (ucontrol->value.enumerated.item[0] >= e->max) 2459 return -EINVAL; 2460 2461 mutex_lock(&codec->mutex); 2462 2463 change = widget->value != ucontrol->value.enumerated.item[0]; 2464 if (change) { 2465 for (wi = 0; wi < wlist->num_widgets; wi++) { 2466 widget = wlist->widgets[wi]; 2467 2468 widget->value = ucontrol->value.enumerated.item[0]; 2469 2470 dapm_mux_update_power(widget, kcontrol, change, 2471 widget->value, e); 2472 } 2473 } 2474 2475 mutex_unlock(&codec->mutex); 2476 return ret; 2477 } 2478 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt); 2479 2480 /** 2481 * snd_soc_dapm_get_value_enum_double - dapm semi enumerated double mixer get 2482 * callback 2483 * @kcontrol: mixer control 2484 * @ucontrol: control element information 2485 * 2486 * Callback to get the value of a dapm semi enumerated double mixer control. 2487 * 2488 * Semi enumerated mixer: the enumerated items are referred as values. Can be 2489 * used for handling bitfield coded enumeration for example. 2490 * 2491 * Returns 0 for success. 2492 */ 2493 int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol, 2494 struct snd_ctl_elem_value *ucontrol) 2495 { 2496 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2497 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2498 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2499 unsigned int reg_val, val, mux; 2500 2501 reg_val = snd_soc_read(widget->codec, e->reg); 2502 val = (reg_val >> e->shift_l) & e->mask; 2503 for (mux = 0; mux < e->max; mux++) { 2504 if (val == e->values[mux]) 2505 break; 2506 } 2507 ucontrol->value.enumerated.item[0] = mux; 2508 if (e->shift_l != e->shift_r) { 2509 val = (reg_val >> e->shift_r) & e->mask; 2510 for (mux = 0; mux < e->max; mux++) { 2511 if (val == e->values[mux]) 2512 break; 2513 } 2514 ucontrol->value.enumerated.item[1] = mux; 2515 } 2516 2517 return 0; 2518 } 2519 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_value_enum_double); 2520 2521 /** 2522 * snd_soc_dapm_put_value_enum_double - dapm semi enumerated double mixer set 2523 * callback 2524 * @kcontrol: mixer control 2525 * @ucontrol: control element information 2526 * 2527 * Callback to set the value of a dapm semi enumerated double mixer control. 2528 * 2529 * Semi enumerated mixer: the enumerated items are referred as values. Can be 2530 * used for handling bitfield coded enumeration for example. 2531 * 2532 * Returns 0 for success. 2533 */ 2534 int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, 2535 struct snd_ctl_elem_value *ucontrol) 2536 { 2537 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 2538 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 2539 struct snd_soc_codec *codec = widget->codec; 2540 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2541 unsigned int val, mux, change; 2542 unsigned int mask; 2543 struct snd_soc_dapm_update update; 2544 int wi; 2545 2546 if (ucontrol->value.enumerated.item[0] > e->max - 1) 2547 return -EINVAL; 2548 mux = ucontrol->value.enumerated.item[0]; 2549 val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l; 2550 mask = e->mask << e->shift_l; 2551 if (e->shift_l != e->shift_r) { 2552 if (ucontrol->value.enumerated.item[1] > e->max - 1) 2553 return -EINVAL; 2554 val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r; 2555 mask |= e->mask << e->shift_r; 2556 } 2557 2558 mutex_lock(&codec->mutex); 2559 2560 change = snd_soc_test_bits(widget->codec, e->reg, mask, val); 2561 if (change) { 2562 for (wi = 0; wi < wlist->num_widgets; wi++) { 2563 widget = wlist->widgets[wi]; 2564 2565 widget->value = val; 2566 2567 update.kcontrol = kcontrol; 2568 update.widget = widget; 2569 update.reg = e->reg; 2570 update.mask = mask; 2571 update.val = val; 2572 widget->dapm->update = &update; 2573 2574 dapm_mux_update_power(widget, kcontrol, change, mux, e); 2575 2576 widget->dapm->update = NULL; 2577 } 2578 } 2579 2580 mutex_unlock(&codec->mutex); 2581 return change; 2582 } 2583 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double); 2584 2585 /** 2586 * snd_soc_dapm_info_pin_switch - Info for a pin switch 2587 * 2588 * @kcontrol: mixer control 2589 * @uinfo: control element information 2590 * 2591 * Callback to provide information about a pin switch control. 2592 */ 2593 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol, 2594 struct snd_ctl_elem_info *uinfo) 2595 { 2596 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 2597 uinfo->count = 1; 2598 uinfo->value.integer.min = 0; 2599 uinfo->value.integer.max = 1; 2600 2601 return 0; 2602 } 2603 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch); 2604 2605 /** 2606 * snd_soc_dapm_get_pin_switch - Get information for a pin switch 2607 * 2608 * @kcontrol: mixer control 2609 * @ucontrol: Value 2610 */ 2611 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol, 2612 struct snd_ctl_elem_value *ucontrol) 2613 { 2614 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 2615 const char *pin = (const char *)kcontrol->private_value; 2616 2617 mutex_lock(&codec->mutex); 2618 2619 ucontrol->value.integer.value[0] = 2620 snd_soc_dapm_get_pin_status(&codec->dapm, pin); 2621 2622 mutex_unlock(&codec->mutex); 2623 2624 return 0; 2625 } 2626 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch); 2627 2628 /** 2629 * snd_soc_dapm_put_pin_switch - Set information for a pin switch 2630 * 2631 * @kcontrol: mixer control 2632 * @ucontrol: Value 2633 */ 2634 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, 2635 struct snd_ctl_elem_value *ucontrol) 2636 { 2637 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 2638 const char *pin = (const char *)kcontrol->private_value; 2639 2640 mutex_lock(&codec->mutex); 2641 2642 if (ucontrol->value.integer.value[0]) 2643 snd_soc_dapm_enable_pin(&codec->dapm, pin); 2644 else 2645 snd_soc_dapm_disable_pin(&codec->dapm, pin); 2646 2647 snd_soc_dapm_sync(&codec->dapm); 2648 2649 mutex_unlock(&codec->mutex); 2650 2651 return 0; 2652 } 2653 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); 2654 2655 /** 2656 * snd_soc_dapm_new_control - create new dapm control 2657 * @dapm: DAPM context 2658 * @widget: widget template 2659 * 2660 * Creates a new dapm control based upon the template. 2661 * 2662 * Returns 0 for success else error. 2663 */ 2664 int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, 2665 const struct snd_soc_dapm_widget *widget) 2666 { 2667 struct snd_soc_dapm_widget *w; 2668 size_t name_len; 2669 2670 if ((w = dapm_cnew_widget(widget)) == NULL) 2671 return -ENOMEM; 2672 2673 name_len = strlen(widget->name) + 1; 2674 if (dapm->codec && dapm->codec->name_prefix) 2675 name_len += 1 + strlen(dapm->codec->name_prefix); 2676 w->name = kmalloc(name_len, GFP_KERNEL); 2677 if (w->name == NULL) { 2678 kfree(w); 2679 return -ENOMEM; 2680 } 2681 if (dapm->codec && dapm->codec->name_prefix) 2682 snprintf(w->name, name_len, "%s %s", 2683 dapm->codec->name_prefix, widget->name); 2684 else 2685 snprintf(w->name, name_len, "%s", widget->name); 2686 2687 switch (w->id) { 2688 case snd_soc_dapm_switch: 2689 case snd_soc_dapm_mixer: 2690 case snd_soc_dapm_mixer_named_ctl: 2691 w->power_check = dapm_generic_check_power; 2692 break; 2693 case snd_soc_dapm_mux: 2694 case snd_soc_dapm_virt_mux: 2695 case snd_soc_dapm_value_mux: 2696 w->power_check = dapm_generic_check_power; 2697 break; 2698 case snd_soc_dapm_adc: 2699 case snd_soc_dapm_aif_out: 2700 w->power_check = dapm_adc_check_power; 2701 break; 2702 case snd_soc_dapm_dac: 2703 case snd_soc_dapm_aif_in: 2704 w->power_check = dapm_dac_check_power; 2705 break; 2706 case snd_soc_dapm_pga: 2707 case snd_soc_dapm_out_drv: 2708 case snd_soc_dapm_input: 2709 case snd_soc_dapm_output: 2710 case snd_soc_dapm_micbias: 2711 case snd_soc_dapm_spk: 2712 case snd_soc_dapm_hp: 2713 case snd_soc_dapm_mic: 2714 case snd_soc_dapm_line: 2715 w->power_check = dapm_generic_check_power; 2716 break; 2717 case snd_soc_dapm_supply: 2718 w->power_check = dapm_supply_check_power; 2719 break; 2720 default: 2721 w->power_check = dapm_always_on_check_power; 2722 break; 2723 } 2724 2725 dapm->n_widgets++; 2726 w->dapm = dapm; 2727 w->codec = dapm->codec; 2728 w->platform = dapm->platform; 2729 INIT_LIST_HEAD(&w->sources); 2730 INIT_LIST_HEAD(&w->sinks); 2731 INIT_LIST_HEAD(&w->list); 2732 INIT_LIST_HEAD(&w->dirty); 2733 list_add(&w->list, &dapm->card->widgets); 2734 2735 /* machine layer set ups unconnected pins and insertions */ 2736 w->connected = 1; 2737 return 0; 2738 } 2739 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control); 2740 2741 /** 2742 * snd_soc_dapm_new_controls - create new dapm controls 2743 * @dapm: DAPM context 2744 * @widget: widget array 2745 * @num: number of widgets 2746 * 2747 * Creates new DAPM controls based upon the templates. 2748 * 2749 * Returns 0 for success else error. 2750 */ 2751 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm, 2752 const struct snd_soc_dapm_widget *widget, 2753 int num) 2754 { 2755 int i, ret; 2756 2757 for (i = 0; i < num; i++) { 2758 ret = snd_soc_dapm_new_control(dapm, widget); 2759 if (ret < 0) { 2760 dev_err(dapm->dev, 2761 "ASoC: Failed to create DAPM control %s: %d\n", 2762 widget->name, ret); 2763 return ret; 2764 } 2765 widget++; 2766 } 2767 return 0; 2768 } 2769 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls); 2770 2771 static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm, 2772 const char *stream, int event) 2773 { 2774 struct snd_soc_dapm_widget *w; 2775 2776 list_for_each_entry(w, &dapm->card->widgets, list) 2777 { 2778 if (!w->sname || w->dapm != dapm) 2779 continue; 2780 dev_vdbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n", 2781 w->name, w->sname, stream, event); 2782 if (strstr(w->sname, stream)) { 2783 dapm_mark_dirty(w, "stream event"); 2784 switch(event) { 2785 case SND_SOC_DAPM_STREAM_START: 2786 w->active = 1; 2787 break; 2788 case SND_SOC_DAPM_STREAM_STOP: 2789 w->active = 0; 2790 break; 2791 case SND_SOC_DAPM_STREAM_SUSPEND: 2792 case SND_SOC_DAPM_STREAM_RESUME: 2793 case SND_SOC_DAPM_STREAM_PAUSE_PUSH: 2794 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE: 2795 break; 2796 } 2797 } 2798 } 2799 2800 dapm_power_widgets(dapm, event); 2801 2802 /* do we need to notify any clients that DAPM stream is complete */ 2803 if (dapm->stream_event) 2804 dapm->stream_event(dapm, event); 2805 } 2806 2807 /** 2808 * snd_soc_dapm_stream_event - send a stream event to the dapm core 2809 * @rtd: PCM runtime data 2810 * @stream: stream name 2811 * @event: stream event 2812 * 2813 * Sends a stream event to the dapm core. The core then makes any 2814 * necessary widget power changes. 2815 * 2816 * Returns 0 for success else error. 2817 */ 2818 int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, 2819 const char *stream, int event) 2820 { 2821 struct snd_soc_codec *codec = rtd->codec; 2822 2823 if (stream == NULL) 2824 return 0; 2825 2826 mutex_lock(&codec->mutex); 2827 soc_dapm_stream_event(&codec->dapm, stream, event); 2828 mutex_unlock(&codec->mutex); 2829 return 0; 2830 } 2831 2832 /** 2833 * snd_soc_dapm_enable_pin - enable pin. 2834 * @dapm: DAPM context 2835 * @pin: pin name 2836 * 2837 * Enables input/output pin and its parents or children widgets iff there is 2838 * a valid audio route and active audio stream. 2839 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2840 * do any widget power switching. 2841 */ 2842 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) 2843 { 2844 return snd_soc_dapm_set_pin(dapm, pin, 1); 2845 } 2846 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); 2847 2848 /** 2849 * snd_soc_dapm_force_enable_pin - force a pin to be enabled 2850 * @dapm: DAPM context 2851 * @pin: pin name 2852 * 2853 * Enables input/output pin regardless of any other state. This is 2854 * intended for use with microphone bias supplies used in microphone 2855 * jack detection. 2856 * 2857 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2858 * do any widget power switching. 2859 */ 2860 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, 2861 const char *pin) 2862 { 2863 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 2864 2865 if (!w) { 2866 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 2867 return -EINVAL; 2868 } 2869 2870 dev_dbg(w->dapm->dev, "dapm: force enable pin %s\n", pin); 2871 w->connected = 1; 2872 w->force = 1; 2873 dapm_mark_dirty(w, "force enable"); 2874 2875 return 0; 2876 } 2877 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); 2878 2879 /** 2880 * snd_soc_dapm_disable_pin - disable pin. 2881 * @dapm: DAPM context 2882 * @pin: pin name 2883 * 2884 * Disables input/output pin and its parents or children widgets. 2885 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2886 * do any widget power switching. 2887 */ 2888 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, 2889 const char *pin) 2890 { 2891 return snd_soc_dapm_set_pin(dapm, pin, 0); 2892 } 2893 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); 2894 2895 /** 2896 * snd_soc_dapm_nc_pin - permanently disable pin. 2897 * @dapm: DAPM context 2898 * @pin: pin name 2899 * 2900 * Marks the specified pin as being not connected, disabling it along 2901 * any parent or child widgets. At present this is identical to 2902 * snd_soc_dapm_disable_pin() but in future it will be extended to do 2903 * additional things such as disabling controls which only affect 2904 * paths through the pin. 2905 * 2906 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2907 * do any widget power switching. 2908 */ 2909 int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) 2910 { 2911 return snd_soc_dapm_set_pin(dapm, pin, 0); 2912 } 2913 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); 2914 2915 /** 2916 * snd_soc_dapm_get_pin_status - get audio pin status 2917 * @dapm: DAPM context 2918 * @pin: audio signal pin endpoint (or start point) 2919 * 2920 * Get audio pin status - connected or disconnected. 2921 * 2922 * Returns 1 for connected otherwise 0. 2923 */ 2924 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, 2925 const char *pin) 2926 { 2927 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); 2928 2929 if (w) 2930 return w->connected; 2931 2932 return 0; 2933 } 2934 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status); 2935 2936 /** 2937 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint 2938 * @dapm: DAPM context 2939 * @pin: audio signal pin endpoint (or start point) 2940 * 2941 * Mark the given endpoint or pin as ignoring suspend. When the 2942 * system is disabled a path between two endpoints flagged as ignoring 2943 * suspend will not be disabled. The path must already be enabled via 2944 * normal means at suspend time, it will not be turned on if it was not 2945 * already enabled. 2946 */ 2947 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, 2948 const char *pin) 2949 { 2950 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, false); 2951 2952 if (!w) { 2953 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 2954 return -EINVAL; 2955 } 2956 2957 w->ignore_suspend = 1; 2958 2959 return 0; 2960 } 2961 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend); 2962 2963 static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card, 2964 struct snd_soc_dapm_widget *w) 2965 { 2966 struct snd_soc_dapm_path *p; 2967 2968 list_for_each_entry(p, &card->paths, list) { 2969 if ((p->source == w) || (p->sink == w)) { 2970 dev_dbg(card->dev, 2971 "... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n", 2972 p->source->name, p->source->id, p->source->dapm, 2973 p->sink->name, p->sink->id, p->sink->dapm); 2974 2975 /* Connected to something other than the codec */ 2976 if (p->source->dapm != p->sink->dapm) 2977 return true; 2978 /* 2979 * Loopback connection from codec external pin to 2980 * codec external pin 2981 */ 2982 if (p->sink->id == snd_soc_dapm_input) { 2983 switch (p->source->id) { 2984 case snd_soc_dapm_output: 2985 case snd_soc_dapm_micbias: 2986 return true; 2987 default: 2988 break; 2989 } 2990 } 2991 } 2992 } 2993 2994 return false; 2995 } 2996 2997 /** 2998 * snd_soc_dapm_auto_nc_codec_pins - call snd_soc_dapm_nc_pin for unused pins 2999 * @codec: The codec whose pins should be processed 3000 * 3001 * Automatically call snd_soc_dapm_nc_pin() for any external pins in the codec 3002 * which are unused. Pins are used if they are connected externally to the 3003 * codec, whether that be to some other device, or a loop-back connection to 3004 * the codec itself. 3005 */ 3006 void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec) 3007 { 3008 struct snd_soc_card *card = codec->card; 3009 struct snd_soc_dapm_context *dapm = &codec->dapm; 3010 struct snd_soc_dapm_widget *w; 3011 3012 dev_dbg(codec->dev, "Auto NC: DAPMs: card:%p codec:%p\n", 3013 &card->dapm, &codec->dapm); 3014 3015 list_for_each_entry(w, &card->widgets, list) { 3016 if (w->dapm != dapm) 3017 continue; 3018 switch (w->id) { 3019 case snd_soc_dapm_input: 3020 case snd_soc_dapm_output: 3021 case snd_soc_dapm_micbias: 3022 dev_dbg(codec->dev, "Auto NC: Checking widget %s\n", 3023 w->name); 3024 if (!snd_soc_dapm_widget_in_card_paths(card, w)) { 3025 dev_dbg(codec->dev, 3026 "... Not in map; disabling\n"); 3027 snd_soc_dapm_nc_pin(dapm, w->name); 3028 } 3029 break; 3030 default: 3031 break; 3032 } 3033 } 3034 } 3035 3036 /** 3037 * snd_soc_dapm_free - free dapm resources 3038 * @dapm: DAPM context 3039 * 3040 * Free all dapm widgets and resources. 3041 */ 3042 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm) 3043 { 3044 snd_soc_dapm_sys_remove(dapm->dev); 3045 dapm_debugfs_cleanup(dapm); 3046 dapm_free_widgets(dapm); 3047 list_del(&dapm->list); 3048 } 3049 EXPORT_SYMBOL_GPL(snd_soc_dapm_free); 3050 3051 static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) 3052 { 3053 struct snd_soc_dapm_widget *w; 3054 LIST_HEAD(down_list); 3055 int powerdown = 0; 3056 3057 list_for_each_entry(w, &dapm->card->widgets, list) { 3058 if (w->dapm != dapm) 3059 continue; 3060 if (w->power) { 3061 dapm_seq_insert(w, &down_list, false); 3062 w->power = 0; 3063 powerdown = 1; 3064 } 3065 } 3066 3067 /* If there were no widgets to power down we're already in 3068 * standby. 3069 */ 3070 if (powerdown) { 3071 snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_PREPARE); 3072 dapm_seq_run(dapm, &down_list, 0, false); 3073 snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY); 3074 } 3075 } 3076 3077 /* 3078 * snd_soc_dapm_shutdown - callback for system shutdown 3079 */ 3080 void snd_soc_dapm_shutdown(struct snd_soc_card *card) 3081 { 3082 struct snd_soc_codec *codec; 3083 3084 list_for_each_entry(codec, &card->codec_dev_list, list) { 3085 soc_dapm_shutdown_codec(&codec->dapm); 3086 snd_soc_dapm_set_bias_level(&codec->dapm, SND_SOC_BIAS_OFF); 3087 } 3088 } 3089 3090 /* Module information */ 3091 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk"); 3092 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC"); 3093 MODULE_LICENSE("GPL"); 3094