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/delay.h> 36 #include <linux/pm.h> 37 #include <linux/bitops.h> 38 #include <linux/platform_device.h> 39 #include <linux/jiffies.h> 40 #include <linux/debugfs.h> 41 #include <linux/slab.h> 42 #include <sound/core.h> 43 #include <sound/pcm.h> 44 #include <sound/pcm_params.h> 45 #include <sound/soc.h> 46 #include <sound/initval.h> 47 48 #include <trace/events/asoc.h> 49 50 /* dapm power sequences - make this per codec in the future */ 51 static int dapm_up_seq[] = { 52 [snd_soc_dapm_pre] = 0, 53 [snd_soc_dapm_supply] = 1, 54 [snd_soc_dapm_micbias] = 2, 55 [snd_soc_dapm_aif_in] = 3, 56 [snd_soc_dapm_aif_out] = 3, 57 [snd_soc_dapm_mic] = 4, 58 [snd_soc_dapm_mux] = 5, 59 [snd_soc_dapm_virt_mux] = 5, 60 [snd_soc_dapm_value_mux] = 5, 61 [snd_soc_dapm_dac] = 6, 62 [snd_soc_dapm_mixer] = 7, 63 [snd_soc_dapm_mixer_named_ctl] = 7, 64 [snd_soc_dapm_pga] = 8, 65 [snd_soc_dapm_adc] = 9, 66 [snd_soc_dapm_out_drv] = 10, 67 [snd_soc_dapm_hp] = 10, 68 [snd_soc_dapm_spk] = 10, 69 [snd_soc_dapm_post] = 11, 70 }; 71 72 static int dapm_down_seq[] = { 73 [snd_soc_dapm_pre] = 0, 74 [snd_soc_dapm_adc] = 1, 75 [snd_soc_dapm_hp] = 2, 76 [snd_soc_dapm_spk] = 2, 77 [snd_soc_dapm_out_drv] = 2, 78 [snd_soc_dapm_pga] = 4, 79 [snd_soc_dapm_mixer_named_ctl] = 5, 80 [snd_soc_dapm_mixer] = 5, 81 [snd_soc_dapm_dac] = 6, 82 [snd_soc_dapm_mic] = 7, 83 [snd_soc_dapm_micbias] = 8, 84 [snd_soc_dapm_mux] = 9, 85 [snd_soc_dapm_virt_mux] = 9, 86 [snd_soc_dapm_value_mux] = 9, 87 [snd_soc_dapm_aif_in] = 10, 88 [snd_soc_dapm_aif_out] = 10, 89 [snd_soc_dapm_supply] = 11, 90 [snd_soc_dapm_post] = 12, 91 }; 92 93 static void pop_wait(u32 pop_time) 94 { 95 if (pop_time) 96 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); 97 } 98 99 static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...) 100 { 101 va_list args; 102 char *buf; 103 104 if (!pop_time) 105 return; 106 107 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 108 if (buf == NULL) 109 return; 110 111 va_start(args, fmt); 112 vsnprintf(buf, PAGE_SIZE, fmt, args); 113 dev_info(dev, "%s", buf); 114 va_end(args); 115 116 kfree(buf); 117 } 118 119 /* create a new dapm widget */ 120 static inline struct snd_soc_dapm_widget *dapm_cnew_widget( 121 const struct snd_soc_dapm_widget *_widget) 122 { 123 return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL); 124 } 125 126 /** 127 * snd_soc_dapm_set_bias_level - set the bias level for the system 128 * @card: audio device 129 * @level: level to configure 130 * 131 * Configure the bias (power) levels for the SoC audio device. 132 * 133 * Returns 0 for success else error. 134 */ 135 static int snd_soc_dapm_set_bias_level(struct snd_soc_card *card, 136 struct snd_soc_dapm_context *dapm, 137 enum snd_soc_bias_level level) 138 { 139 int ret = 0; 140 141 switch (level) { 142 case SND_SOC_BIAS_ON: 143 dev_dbg(dapm->dev, "Setting full bias\n"); 144 break; 145 case SND_SOC_BIAS_PREPARE: 146 dev_dbg(dapm->dev, "Setting bias prepare\n"); 147 break; 148 case SND_SOC_BIAS_STANDBY: 149 dev_dbg(dapm->dev, "Setting standby bias\n"); 150 break; 151 case SND_SOC_BIAS_OFF: 152 dev_dbg(dapm->dev, "Setting bias off\n"); 153 break; 154 default: 155 dev_err(dapm->dev, "Setting invalid bias %d\n", level); 156 return -EINVAL; 157 } 158 159 trace_snd_soc_bias_level_start(card, level); 160 161 if (card && card->set_bias_level) 162 ret = card->set_bias_level(card, level); 163 if (ret == 0) { 164 if (dapm->codec && dapm->codec->driver->set_bias_level) 165 ret = dapm->codec->driver->set_bias_level(dapm->codec, level); 166 else 167 dapm->bias_level = level; 168 } 169 if (ret == 0) { 170 if (card && card->set_bias_level_post) 171 ret = card->set_bias_level_post(card, level); 172 } 173 174 trace_snd_soc_bias_level_done(card, level); 175 176 return ret; 177 } 178 179 /* set up initial codec paths */ 180 static void dapm_set_path_status(struct snd_soc_dapm_widget *w, 181 struct snd_soc_dapm_path *p, int i) 182 { 183 switch (w->id) { 184 case snd_soc_dapm_switch: 185 case snd_soc_dapm_mixer: 186 case snd_soc_dapm_mixer_named_ctl: { 187 int val; 188 struct soc_mixer_control *mc = (struct soc_mixer_control *) 189 w->kcontrols[i].private_value; 190 unsigned int reg = mc->reg; 191 unsigned int shift = mc->shift; 192 int max = mc->max; 193 unsigned int mask = (1 << fls(max)) - 1; 194 unsigned int invert = mc->invert; 195 196 val = snd_soc_read(w->codec, reg); 197 val = (val >> shift) & mask; 198 199 if ((invert && !val) || (!invert && val)) 200 p->connect = 1; 201 else 202 p->connect = 0; 203 } 204 break; 205 case snd_soc_dapm_mux: { 206 struct soc_enum *e = (struct soc_enum *)w->kcontrols[i].private_value; 207 int val, item, bitmask; 208 209 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 210 ; 211 val = snd_soc_read(w->codec, e->reg); 212 item = (val >> e->shift_l) & (bitmask - 1); 213 214 p->connect = 0; 215 for (i = 0; i < e->max; i++) { 216 if (!(strcmp(p->name, e->texts[i])) && item == i) 217 p->connect = 1; 218 } 219 } 220 break; 221 case snd_soc_dapm_virt_mux: { 222 struct soc_enum *e = (struct soc_enum *)w->kcontrols[i].private_value; 223 224 p->connect = 0; 225 /* since a virtual mux has no backing registers to 226 * decide which path to connect, it will try to match 227 * with the first enumeration. This is to ensure 228 * that the default mux choice (the first) will be 229 * correctly powered up during initialization. 230 */ 231 if (!strcmp(p->name, e->texts[0])) 232 p->connect = 1; 233 } 234 break; 235 case snd_soc_dapm_value_mux: { 236 struct soc_enum *e = (struct soc_enum *) 237 w->kcontrols[i].private_value; 238 int val, item; 239 240 val = snd_soc_read(w->codec, e->reg); 241 val = (val >> e->shift_l) & e->mask; 242 for (item = 0; item < e->max; item++) { 243 if (val == e->values[item]) 244 break; 245 } 246 247 p->connect = 0; 248 for (i = 0; i < e->max; i++) { 249 if (!(strcmp(p->name, e->texts[i])) && item == i) 250 p->connect = 1; 251 } 252 } 253 break; 254 /* does not effect routing - always connected */ 255 case snd_soc_dapm_pga: 256 case snd_soc_dapm_out_drv: 257 case snd_soc_dapm_output: 258 case snd_soc_dapm_adc: 259 case snd_soc_dapm_input: 260 case snd_soc_dapm_dac: 261 case snd_soc_dapm_micbias: 262 case snd_soc_dapm_vmid: 263 case snd_soc_dapm_supply: 264 case snd_soc_dapm_aif_in: 265 case snd_soc_dapm_aif_out: 266 p->connect = 1; 267 break; 268 /* does effect routing - dynamically connected */ 269 case snd_soc_dapm_hp: 270 case snd_soc_dapm_mic: 271 case snd_soc_dapm_spk: 272 case snd_soc_dapm_line: 273 case snd_soc_dapm_pre: 274 case snd_soc_dapm_post: 275 p->connect = 0; 276 break; 277 } 278 } 279 280 /* connect mux widget to its interconnecting audio paths */ 281 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm, 282 struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest, 283 struct snd_soc_dapm_path *path, const char *control_name, 284 const struct snd_kcontrol_new *kcontrol) 285 { 286 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 287 int i; 288 289 for (i = 0; i < e->max; i++) { 290 if (!(strcmp(control_name, e->texts[i]))) { 291 list_add(&path->list, &dapm->card->paths); 292 list_add(&path->list_sink, &dest->sources); 293 list_add(&path->list_source, &src->sinks); 294 path->name = (char*)e->texts[i]; 295 dapm_set_path_status(dest, path, 0); 296 return 0; 297 } 298 } 299 300 return -ENODEV; 301 } 302 303 /* connect mixer widget to its interconnecting audio paths */ 304 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm, 305 struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest, 306 struct snd_soc_dapm_path *path, const char *control_name) 307 { 308 int i; 309 310 /* search for mixer kcontrol */ 311 for (i = 0; i < dest->num_kcontrols; i++) { 312 if (!strcmp(control_name, dest->kcontrols[i].name)) { 313 list_add(&path->list, &dapm->card->paths); 314 list_add(&path->list_sink, &dest->sources); 315 list_add(&path->list_source, &src->sinks); 316 path->name = dest->kcontrols[i].name; 317 dapm_set_path_status(dest, path, i); 318 return 0; 319 } 320 } 321 return -ENODEV; 322 } 323 324 /* update dapm codec register bits */ 325 static int dapm_update_bits(struct snd_soc_dapm_widget *widget) 326 { 327 int change, power; 328 unsigned int old, new; 329 struct snd_soc_codec *codec = widget->codec; 330 struct snd_soc_dapm_context *dapm = widget->dapm; 331 struct snd_soc_card *card = dapm->card; 332 333 /* check for valid widgets */ 334 if (widget->reg < 0 || widget->id == snd_soc_dapm_input || 335 widget->id == snd_soc_dapm_output || 336 widget->id == snd_soc_dapm_hp || 337 widget->id == snd_soc_dapm_mic || 338 widget->id == snd_soc_dapm_line || 339 widget->id == snd_soc_dapm_spk) 340 return 0; 341 342 power = widget->power; 343 if (widget->invert) 344 power = (power ? 0:1); 345 346 old = snd_soc_read(codec, widget->reg); 347 new = (old & ~(0x1 << widget->shift)) | (power << widget->shift); 348 349 change = old != new; 350 if (change) { 351 pop_dbg(dapm->dev, card->pop_time, 352 "pop test %s : %s in %d ms\n", 353 widget->name, widget->power ? "on" : "off", 354 card->pop_time); 355 pop_wait(card->pop_time); 356 snd_soc_write(codec, widget->reg, new); 357 } 358 dev_dbg(dapm->dev, "reg %x old %x new %x change %d\n", widget->reg, 359 old, new, change); 360 return change; 361 } 362 363 /* create new dapm mixer control */ 364 static int dapm_new_mixer(struct snd_soc_dapm_context *dapm, 365 struct snd_soc_dapm_widget *w) 366 { 367 int i, ret = 0; 368 size_t name_len; 369 struct snd_soc_dapm_path *path; 370 struct snd_card *card = dapm->codec->card->snd_card; 371 372 /* add kcontrol */ 373 for (i = 0; i < w->num_kcontrols; i++) { 374 375 /* match name */ 376 list_for_each_entry(path, &w->sources, list_sink) { 377 378 /* mixer/mux paths name must match control name */ 379 if (path->name != (char*)w->kcontrols[i].name) 380 continue; 381 382 /* add dapm control with long name. 383 * for dapm_mixer this is the concatenation of the 384 * mixer and kcontrol name. 385 * for dapm_mixer_named_ctl this is simply the 386 * kcontrol name. 387 */ 388 name_len = strlen(w->kcontrols[i].name) + 1; 389 if (w->id != snd_soc_dapm_mixer_named_ctl) 390 name_len += 1 + strlen(w->name); 391 392 path->long_name = kmalloc(name_len, GFP_KERNEL); 393 394 if (path->long_name == NULL) 395 return -ENOMEM; 396 397 switch (w->id) { 398 default: 399 snprintf(path->long_name, name_len, "%s %s", 400 w->name, w->kcontrols[i].name); 401 break; 402 case snd_soc_dapm_mixer_named_ctl: 403 snprintf(path->long_name, name_len, "%s", 404 w->kcontrols[i].name); 405 break; 406 } 407 408 path->long_name[name_len - 1] = '\0'; 409 410 path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w, 411 path->long_name); 412 ret = snd_ctl_add(card, path->kcontrol); 413 if (ret < 0) { 414 dev_err(dapm->dev, 415 "asoc: failed to add dapm kcontrol %s: %d\n", 416 path->long_name, ret); 417 kfree(path->long_name); 418 path->long_name = NULL; 419 return ret; 420 } 421 } 422 } 423 return ret; 424 } 425 426 /* create new dapm mux control */ 427 static int dapm_new_mux(struct snd_soc_dapm_context *dapm, 428 struct snd_soc_dapm_widget *w) 429 { 430 struct snd_soc_dapm_path *path = NULL; 431 struct snd_kcontrol *kcontrol; 432 struct snd_card *card = dapm->codec->card->snd_card; 433 int ret = 0; 434 435 if (!w->num_kcontrols) { 436 dev_err(dapm->dev, "asoc: mux %s has no controls\n", w->name); 437 return -EINVAL; 438 } 439 440 kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name); 441 ret = snd_ctl_add(card, kcontrol); 442 443 if (ret < 0) 444 goto err; 445 446 list_for_each_entry(path, &w->sources, list_sink) 447 path->kcontrol = kcontrol; 448 449 return ret; 450 451 err: 452 dev_err(dapm->dev, "asoc: failed to add kcontrol %s\n", w->name); 453 return ret; 454 } 455 456 /* create new dapm volume control */ 457 static int dapm_new_pga(struct snd_soc_dapm_context *dapm, 458 struct snd_soc_dapm_widget *w) 459 { 460 if (w->num_kcontrols) 461 dev_err(w->dapm->dev, 462 "asoc: PGA controls not supported: '%s'\n", w->name); 463 464 return 0; 465 } 466 467 /* reset 'walked' bit for each dapm path */ 468 static inline void dapm_clear_walk(struct snd_soc_dapm_context *dapm) 469 { 470 struct snd_soc_dapm_path *p; 471 472 list_for_each_entry(p, &dapm->card->paths, list) 473 p->walked = 0; 474 } 475 476 /* We implement power down on suspend by checking the power state of 477 * the ALSA card - when we are suspending the ALSA state for the card 478 * is set to D3. 479 */ 480 static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget) 481 { 482 int level = snd_power_get_state(widget->dapm->codec->card->snd_card); 483 484 switch (level) { 485 case SNDRV_CTL_POWER_D3hot: 486 case SNDRV_CTL_POWER_D3cold: 487 if (widget->ignore_suspend) 488 dev_dbg(widget->dapm->dev, "%s ignoring suspend\n", 489 widget->name); 490 return widget->ignore_suspend; 491 default: 492 return 1; 493 } 494 } 495 496 /* 497 * Recursively check for a completed path to an active or physically connected 498 * output widget. Returns number of complete paths. 499 */ 500 static int is_connected_output_ep(struct snd_soc_dapm_widget *widget) 501 { 502 struct snd_soc_dapm_path *path; 503 int con = 0; 504 505 if (widget->id == snd_soc_dapm_supply) 506 return 0; 507 508 switch (widget->id) { 509 case snd_soc_dapm_adc: 510 case snd_soc_dapm_aif_out: 511 if (widget->active) 512 return snd_soc_dapm_suspend_check(widget); 513 default: 514 break; 515 } 516 517 if (widget->connected) { 518 /* connected pin ? */ 519 if (widget->id == snd_soc_dapm_output && !widget->ext) 520 return snd_soc_dapm_suspend_check(widget); 521 522 /* connected jack or spk ? */ 523 if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk || 524 (widget->id == snd_soc_dapm_line && !list_empty(&widget->sources))) 525 return snd_soc_dapm_suspend_check(widget); 526 } 527 528 list_for_each_entry(path, &widget->sinks, list_source) { 529 if (path->walked) 530 continue; 531 532 if (path->sink && path->connect) { 533 path->walked = 1; 534 con += is_connected_output_ep(path->sink); 535 } 536 } 537 538 return con; 539 } 540 541 /* 542 * Recursively check for a completed path to an active or physically connected 543 * input widget. Returns number of complete paths. 544 */ 545 static int is_connected_input_ep(struct snd_soc_dapm_widget *widget) 546 { 547 struct snd_soc_dapm_path *path; 548 int con = 0; 549 550 if (widget->id == snd_soc_dapm_supply) 551 return 0; 552 553 /* active stream ? */ 554 switch (widget->id) { 555 case snd_soc_dapm_dac: 556 case snd_soc_dapm_aif_in: 557 if (widget->active) 558 return snd_soc_dapm_suspend_check(widget); 559 default: 560 break; 561 } 562 563 if (widget->connected) { 564 /* connected pin ? */ 565 if (widget->id == snd_soc_dapm_input && !widget->ext) 566 return snd_soc_dapm_suspend_check(widget); 567 568 /* connected VMID/Bias for lower pops */ 569 if (widget->id == snd_soc_dapm_vmid) 570 return snd_soc_dapm_suspend_check(widget); 571 572 /* connected jack ? */ 573 if (widget->id == snd_soc_dapm_mic || 574 (widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks))) 575 return snd_soc_dapm_suspend_check(widget); 576 } 577 578 list_for_each_entry(path, &widget->sources, list_sink) { 579 if (path->walked) 580 continue; 581 582 if (path->source && path->connect) { 583 path->walked = 1; 584 con += is_connected_input_ep(path->source); 585 } 586 } 587 588 return con; 589 } 590 591 /* 592 * Handler for generic register modifier widget. 593 */ 594 int dapm_reg_event(struct snd_soc_dapm_widget *w, 595 struct snd_kcontrol *kcontrol, int event) 596 { 597 unsigned int val; 598 599 if (SND_SOC_DAPM_EVENT_ON(event)) 600 val = w->on_val; 601 else 602 val = w->off_val; 603 604 snd_soc_update_bits(w->codec, -(w->reg + 1), 605 w->mask << w->shift, val << w->shift); 606 607 return 0; 608 } 609 EXPORT_SYMBOL_GPL(dapm_reg_event); 610 611 /* Standard power change method, used to apply power changes to most 612 * widgets. 613 */ 614 static int dapm_generic_apply_power(struct snd_soc_dapm_widget *w) 615 { 616 int ret; 617 618 /* call any power change event handlers */ 619 if (w->event) 620 dev_dbg(w->dapm->dev, "power %s event for %s flags %x\n", 621 w->power ? "on" : "off", 622 w->name, w->event_flags); 623 624 /* power up pre event */ 625 if (w->power && w->event && 626 (w->event_flags & SND_SOC_DAPM_PRE_PMU)) { 627 ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU); 628 if (ret < 0) 629 return ret; 630 } 631 632 /* power down pre event */ 633 if (!w->power && w->event && 634 (w->event_flags & SND_SOC_DAPM_PRE_PMD)) { 635 ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD); 636 if (ret < 0) 637 return ret; 638 } 639 640 dapm_update_bits(w); 641 642 /* power up post event */ 643 if (w->power && w->event && 644 (w->event_flags & SND_SOC_DAPM_POST_PMU)) { 645 ret = w->event(w, 646 NULL, SND_SOC_DAPM_POST_PMU); 647 if (ret < 0) 648 return ret; 649 } 650 651 /* power down post event */ 652 if (!w->power && w->event && 653 (w->event_flags & SND_SOC_DAPM_POST_PMD)) { 654 ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD); 655 if (ret < 0) 656 return ret; 657 } 658 659 return 0; 660 } 661 662 /* Generic check to see if a widget should be powered. 663 */ 664 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w) 665 { 666 int in, out; 667 668 in = is_connected_input_ep(w); 669 dapm_clear_walk(w->dapm); 670 out = is_connected_output_ep(w); 671 dapm_clear_walk(w->dapm); 672 return out != 0 && in != 0; 673 } 674 675 /* Check to see if an ADC has power */ 676 static int dapm_adc_check_power(struct snd_soc_dapm_widget *w) 677 { 678 int in; 679 680 if (w->active) { 681 in = is_connected_input_ep(w); 682 dapm_clear_walk(w->dapm); 683 return in != 0; 684 } else { 685 return dapm_generic_check_power(w); 686 } 687 } 688 689 /* Check to see if a DAC has power */ 690 static int dapm_dac_check_power(struct snd_soc_dapm_widget *w) 691 { 692 int out; 693 694 if (w->active) { 695 out = is_connected_output_ep(w); 696 dapm_clear_walk(w->dapm); 697 return out != 0; 698 } else { 699 return dapm_generic_check_power(w); 700 } 701 } 702 703 /* Check to see if a power supply is needed */ 704 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w) 705 { 706 struct snd_soc_dapm_path *path; 707 int power = 0; 708 709 /* Check if one of our outputs is connected */ 710 list_for_each_entry(path, &w->sinks, list_source) { 711 if (path->connected && 712 !path->connected(path->source, path->sink)) 713 continue; 714 715 if (!path->sink) 716 continue; 717 718 if (path->sink->force) { 719 power = 1; 720 break; 721 } 722 723 if (path->sink->power_check && 724 path->sink->power_check(path->sink)) { 725 power = 1; 726 break; 727 } 728 } 729 730 dapm_clear_walk(w->dapm); 731 732 return power; 733 } 734 735 static int dapm_seq_compare(struct snd_soc_dapm_widget *a, 736 struct snd_soc_dapm_widget *b, 737 int sort[]) 738 { 739 if (sort[a->id] != sort[b->id]) 740 return sort[a->id] - sort[b->id]; 741 if (a->reg != b->reg) 742 return a->reg - b->reg; 743 if (a->dapm != b->dapm) 744 return (unsigned long)a->dapm - (unsigned long)b->dapm; 745 746 return 0; 747 } 748 749 /* Insert a widget in order into a DAPM power sequence. */ 750 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget, 751 struct list_head *list, 752 int sort[]) 753 { 754 struct snd_soc_dapm_widget *w; 755 756 list_for_each_entry(w, list, power_list) 757 if (dapm_seq_compare(new_widget, w, sort) < 0) { 758 list_add_tail(&new_widget->power_list, &w->power_list); 759 return; 760 } 761 762 list_add_tail(&new_widget->power_list, list); 763 } 764 765 static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm, 766 struct snd_soc_dapm_widget *w, int event) 767 { 768 struct snd_soc_card *card = dapm->card; 769 const char *ev_name; 770 int power, ret; 771 772 switch (event) { 773 case SND_SOC_DAPM_PRE_PMU: 774 ev_name = "PRE_PMU"; 775 power = 1; 776 break; 777 case SND_SOC_DAPM_POST_PMU: 778 ev_name = "POST_PMU"; 779 power = 1; 780 break; 781 case SND_SOC_DAPM_PRE_PMD: 782 ev_name = "PRE_PMD"; 783 power = 0; 784 break; 785 case SND_SOC_DAPM_POST_PMD: 786 ev_name = "POST_PMD"; 787 power = 0; 788 break; 789 default: 790 BUG(); 791 return; 792 } 793 794 if (w->power != power) 795 return; 796 797 if (w->event && (w->event_flags & event)) { 798 pop_dbg(dapm->dev, card->pop_time, "pop test : %s %s\n", 799 w->name, ev_name); 800 trace_snd_soc_dapm_widget_event_start(w, event); 801 ret = w->event(w, NULL, event); 802 trace_snd_soc_dapm_widget_event_done(w, event); 803 if (ret < 0) 804 pr_err("%s: %s event failed: %d\n", 805 ev_name, w->name, ret); 806 } 807 } 808 809 /* Apply the coalesced changes from a DAPM sequence */ 810 static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm, 811 struct list_head *pending) 812 { 813 struct snd_soc_card *card = dapm->card; 814 struct snd_soc_dapm_widget *w; 815 int reg, power; 816 unsigned int value = 0; 817 unsigned int mask = 0; 818 unsigned int cur_mask; 819 820 reg = list_first_entry(pending, struct snd_soc_dapm_widget, 821 power_list)->reg; 822 823 list_for_each_entry(w, pending, power_list) { 824 cur_mask = 1 << w->shift; 825 BUG_ON(reg != w->reg); 826 827 if (w->invert) 828 power = !w->power; 829 else 830 power = w->power; 831 832 mask |= cur_mask; 833 if (power) 834 value |= cur_mask; 835 836 pop_dbg(dapm->dev, card->pop_time, 837 "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n", 838 w->name, reg, value, mask); 839 840 /* Check for events */ 841 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMU); 842 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMD); 843 } 844 845 if (reg >= 0) { 846 pop_dbg(dapm->dev, card->pop_time, 847 "pop test : Applying 0x%x/0x%x to %x in %dms\n", 848 value, mask, reg, card->pop_time); 849 pop_wait(card->pop_time); 850 snd_soc_update_bits(dapm->codec, reg, mask, value); 851 } 852 853 list_for_each_entry(w, pending, power_list) { 854 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMU); 855 dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMD); 856 } 857 } 858 859 /* Apply a DAPM power sequence. 860 * 861 * We walk over a pre-sorted list of widgets to apply power to. In 862 * order to minimise the number of writes to the device required 863 * multiple widgets will be updated in a single write where possible. 864 * Currently anything that requires more than a single write is not 865 * handled. 866 */ 867 static void dapm_seq_run(struct snd_soc_dapm_context *dapm, 868 struct list_head *list, int event, int sort[]) 869 { 870 struct snd_soc_dapm_widget *w, *n; 871 LIST_HEAD(pending); 872 int cur_sort = -1; 873 int cur_reg = SND_SOC_NOPM; 874 struct snd_soc_dapm_context *cur_dapm = NULL; 875 int ret; 876 877 list_for_each_entry_safe(w, n, list, power_list) { 878 ret = 0; 879 880 /* Do we need to apply any queued changes? */ 881 if (sort[w->id] != cur_sort || w->reg != cur_reg || 882 w->dapm != cur_dapm) { 883 if (!list_empty(&pending)) 884 dapm_seq_run_coalesced(cur_dapm, &pending); 885 886 INIT_LIST_HEAD(&pending); 887 cur_sort = -1; 888 cur_reg = SND_SOC_NOPM; 889 cur_dapm = NULL; 890 } 891 892 switch (w->id) { 893 case snd_soc_dapm_pre: 894 if (!w->event) 895 list_for_each_entry_safe_continue(w, n, list, 896 power_list); 897 898 if (event == SND_SOC_DAPM_STREAM_START) 899 ret = w->event(w, 900 NULL, SND_SOC_DAPM_PRE_PMU); 901 else if (event == SND_SOC_DAPM_STREAM_STOP) 902 ret = w->event(w, 903 NULL, SND_SOC_DAPM_PRE_PMD); 904 break; 905 906 case snd_soc_dapm_post: 907 if (!w->event) 908 list_for_each_entry_safe_continue(w, n, list, 909 power_list); 910 911 if (event == SND_SOC_DAPM_STREAM_START) 912 ret = w->event(w, 913 NULL, SND_SOC_DAPM_POST_PMU); 914 else if (event == SND_SOC_DAPM_STREAM_STOP) 915 ret = w->event(w, 916 NULL, SND_SOC_DAPM_POST_PMD); 917 break; 918 919 case snd_soc_dapm_input: 920 case snd_soc_dapm_output: 921 case snd_soc_dapm_hp: 922 case snd_soc_dapm_mic: 923 case snd_soc_dapm_line: 924 case snd_soc_dapm_spk: 925 /* No register support currently */ 926 ret = dapm_generic_apply_power(w); 927 break; 928 929 default: 930 /* Queue it up for application */ 931 cur_sort = sort[w->id]; 932 cur_reg = w->reg; 933 cur_dapm = w->dapm; 934 list_move(&w->power_list, &pending); 935 break; 936 } 937 938 if (ret < 0) 939 dev_err(w->dapm->dev, 940 "Failed to apply widget power: %d\n", ret); 941 } 942 943 if (!list_empty(&pending)) 944 dapm_seq_run_coalesced(cur_dapm, &pending); 945 } 946 947 static void dapm_widget_update(struct snd_soc_dapm_context *dapm) 948 { 949 struct snd_soc_dapm_update *update = dapm->update; 950 struct snd_soc_dapm_widget *w; 951 int ret; 952 953 if (!update) 954 return; 955 956 w = update->widget; 957 958 if (w->event && 959 (w->event_flags & SND_SOC_DAPM_PRE_REG)) { 960 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG); 961 if (ret != 0) 962 pr_err("%s DAPM pre-event failed: %d\n", 963 w->name, ret); 964 } 965 966 ret = snd_soc_update_bits(w->codec, update->reg, update->mask, 967 update->val); 968 if (ret < 0) 969 pr_err("%s DAPM update failed: %d\n", w->name, ret); 970 971 if (w->event && 972 (w->event_flags & SND_SOC_DAPM_POST_REG)) { 973 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG); 974 if (ret != 0) 975 pr_err("%s DAPM post-event failed: %d\n", 976 w->name, ret); 977 } 978 } 979 980 981 982 /* 983 * Scan each dapm widget for complete audio path. 984 * A complete path is a route that has valid endpoints i.e.:- 985 * 986 * o DAC to output pin. 987 * o Input Pin to ADC. 988 * o Input pin to Output pin (bypass, sidetone) 989 * o DAC to ADC (loopback). 990 */ 991 static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event) 992 { 993 struct snd_soc_card *card = dapm->codec->card; 994 struct snd_soc_dapm_widget *w; 995 struct snd_soc_dapm_context *d; 996 LIST_HEAD(up_list); 997 LIST_HEAD(down_list); 998 int ret = 0; 999 int power; 1000 1001 trace_snd_soc_dapm_start(card); 1002 1003 list_for_each_entry(d, &card->dapm_list, list) 1004 if (d->n_widgets) 1005 d->dev_power = 0; 1006 1007 /* Check which widgets we need to power and store them in 1008 * lists indicating if they should be powered up or down. 1009 */ 1010 list_for_each_entry(w, &card->widgets, list) { 1011 switch (w->id) { 1012 case snd_soc_dapm_pre: 1013 dapm_seq_insert(w, &down_list, dapm_down_seq); 1014 break; 1015 case snd_soc_dapm_post: 1016 dapm_seq_insert(w, &up_list, dapm_up_seq); 1017 break; 1018 1019 default: 1020 if (!w->power_check) 1021 continue; 1022 1023 if (!w->force) 1024 power = w->power_check(w); 1025 else 1026 power = 1; 1027 if (power) 1028 w->dapm->dev_power = 1; 1029 1030 if (w->power == power) 1031 continue; 1032 1033 trace_snd_soc_dapm_widget_power(w, power); 1034 1035 if (power) 1036 dapm_seq_insert(w, &up_list, dapm_up_seq); 1037 else 1038 dapm_seq_insert(w, &down_list, dapm_down_seq); 1039 1040 w->power = power; 1041 break; 1042 } 1043 } 1044 1045 /* If there are no DAPM widgets then try to figure out power from the 1046 * event type. 1047 */ 1048 if (!dapm->n_widgets) { 1049 switch (event) { 1050 case SND_SOC_DAPM_STREAM_START: 1051 case SND_SOC_DAPM_STREAM_RESUME: 1052 dapm->dev_power = 1; 1053 break; 1054 case SND_SOC_DAPM_STREAM_STOP: 1055 dapm->dev_power = !!dapm->codec->active; 1056 break; 1057 case SND_SOC_DAPM_STREAM_SUSPEND: 1058 dapm->dev_power = 0; 1059 break; 1060 case SND_SOC_DAPM_STREAM_NOP: 1061 switch (dapm->bias_level) { 1062 case SND_SOC_BIAS_STANDBY: 1063 case SND_SOC_BIAS_OFF: 1064 dapm->dev_power = 0; 1065 break; 1066 default: 1067 dapm->dev_power = 1; 1068 break; 1069 } 1070 break; 1071 default: 1072 break; 1073 } 1074 } 1075 1076 list_for_each_entry(d, &dapm->card->dapm_list, list) { 1077 if (d->dev_power && d->bias_level == SND_SOC_BIAS_OFF) { 1078 ret = snd_soc_dapm_set_bias_level(card, d, 1079 SND_SOC_BIAS_STANDBY); 1080 if (ret != 0) 1081 dev_err(d->dev, 1082 "Failed to turn on bias: %d\n", ret); 1083 } 1084 1085 /* If we're changing to all on or all off then prepare */ 1086 if ((d->dev_power && d->bias_level == SND_SOC_BIAS_STANDBY) || 1087 (!d->dev_power && d->bias_level == SND_SOC_BIAS_ON)) { 1088 ret = snd_soc_dapm_set_bias_level(card, d, 1089 SND_SOC_BIAS_PREPARE); 1090 if (ret != 0) 1091 dev_err(d->dev, 1092 "Failed to prepare bias: %d\n", ret); 1093 } 1094 } 1095 1096 /* Power down widgets first; try to avoid amplifying pops. */ 1097 dapm_seq_run(dapm, &down_list, event, dapm_down_seq); 1098 1099 dapm_widget_update(dapm); 1100 1101 /* Now power up. */ 1102 dapm_seq_run(dapm, &up_list, event, dapm_up_seq); 1103 1104 list_for_each_entry(d, &dapm->card->dapm_list, list) { 1105 /* If we just powered the last thing off drop to standby bias */ 1106 if (d->bias_level == SND_SOC_BIAS_PREPARE && !d->dev_power) { 1107 ret = snd_soc_dapm_set_bias_level(card, d, 1108 SND_SOC_BIAS_STANDBY); 1109 if (ret != 0) 1110 dev_err(d->dev, 1111 "Failed to apply standby bias: %d\n", 1112 ret); 1113 } 1114 1115 /* If we're in standby and can support bias off then do that */ 1116 if (d->bias_level == SND_SOC_BIAS_STANDBY && 1117 d->idle_bias_off) { 1118 ret = snd_soc_dapm_set_bias_level(card, d, 1119 SND_SOC_BIAS_OFF); 1120 if (ret != 0) 1121 dev_err(d->dev, 1122 "Failed to turn off bias: %d\n", ret); 1123 } 1124 1125 /* If we just powered up then move to active bias */ 1126 if (d->bias_level == SND_SOC_BIAS_PREPARE && d->dev_power) { 1127 ret = snd_soc_dapm_set_bias_level(card, d, 1128 SND_SOC_BIAS_ON); 1129 if (ret != 0) 1130 dev_err(d->dev, 1131 "Failed to apply active bias: %d\n", 1132 ret); 1133 } 1134 } 1135 1136 pop_dbg(dapm->dev, card->pop_time, 1137 "DAPM sequencing finished, waiting %dms\n", card->pop_time); 1138 pop_wait(card->pop_time); 1139 1140 trace_snd_soc_dapm_done(card); 1141 1142 return 0; 1143 } 1144 1145 #ifdef CONFIG_DEBUG_FS 1146 static int dapm_widget_power_open_file(struct inode *inode, struct file *file) 1147 { 1148 file->private_data = inode->i_private; 1149 return 0; 1150 } 1151 1152 static ssize_t dapm_widget_power_read_file(struct file *file, 1153 char __user *user_buf, 1154 size_t count, loff_t *ppos) 1155 { 1156 struct snd_soc_dapm_widget *w = file->private_data; 1157 char *buf; 1158 int in, out; 1159 ssize_t ret; 1160 struct snd_soc_dapm_path *p = NULL; 1161 1162 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 1163 if (!buf) 1164 return -ENOMEM; 1165 1166 in = is_connected_input_ep(w); 1167 dapm_clear_walk(w->dapm); 1168 out = is_connected_output_ep(w); 1169 dapm_clear_walk(w->dapm); 1170 1171 ret = snprintf(buf, PAGE_SIZE, "%s: %s in %d out %d", 1172 w->name, w->power ? "On" : "Off", in, out); 1173 1174 if (w->reg >= 0) 1175 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1176 " - R%d(0x%x) bit %d", 1177 w->reg, w->reg, w->shift); 1178 1179 ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n"); 1180 1181 if (w->sname) 1182 ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n", 1183 w->sname, 1184 w->active ? "active" : "inactive"); 1185 1186 list_for_each_entry(p, &w->sources, list_sink) { 1187 if (p->connected && !p->connected(w, p->sink)) 1188 continue; 1189 1190 if (p->connect) 1191 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1192 " in %s %s\n", 1193 p->name ? p->name : "static", 1194 p->source->name); 1195 } 1196 list_for_each_entry(p, &w->sinks, list_source) { 1197 if (p->connected && !p->connected(w, p->sink)) 1198 continue; 1199 1200 if (p->connect) 1201 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1202 " out %s %s\n", 1203 p->name ? p->name : "static", 1204 p->sink->name); 1205 } 1206 1207 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); 1208 1209 kfree(buf); 1210 return ret; 1211 } 1212 1213 static const struct file_operations dapm_widget_power_fops = { 1214 .open = dapm_widget_power_open_file, 1215 .read = dapm_widget_power_read_file, 1216 .llseek = default_llseek, 1217 }; 1218 1219 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm) 1220 { 1221 struct snd_soc_dapm_widget *w; 1222 struct dentry *d; 1223 1224 if (!dapm->debugfs_dapm) 1225 return; 1226 1227 list_for_each_entry(w, &dapm->card->widgets, list) { 1228 if (!w->name || w->dapm != dapm) 1229 continue; 1230 1231 d = debugfs_create_file(w->name, 0444, 1232 dapm->debugfs_dapm, w, 1233 &dapm_widget_power_fops); 1234 if (!d) 1235 dev_warn(w->dapm->dev, 1236 "ASoC: Failed to create %s debugfs file\n", 1237 w->name); 1238 } 1239 } 1240 #else 1241 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm) 1242 { 1243 } 1244 #endif 1245 1246 /* test and update the power status of a mux widget */ 1247 static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget, 1248 struct snd_kcontrol *kcontrol, int change, 1249 int mux, struct soc_enum *e) 1250 { 1251 struct snd_soc_dapm_path *path; 1252 int found = 0; 1253 1254 if (widget->id != snd_soc_dapm_mux && 1255 widget->id != snd_soc_dapm_virt_mux && 1256 widget->id != snd_soc_dapm_value_mux) 1257 return -ENODEV; 1258 1259 if (!change) 1260 return 0; 1261 1262 /* find dapm widget path assoc with kcontrol */ 1263 list_for_each_entry(path, &widget->dapm->card->paths, list) { 1264 if (path->kcontrol != kcontrol) 1265 continue; 1266 1267 if (!path->name || !e->texts[mux]) 1268 continue; 1269 1270 found = 1; 1271 /* we now need to match the string in the enum to the path */ 1272 if (!(strcmp(path->name, e->texts[mux]))) 1273 path->connect = 1; /* new connection */ 1274 else 1275 path->connect = 0; /* old connection must be powered down */ 1276 } 1277 1278 if (found) 1279 dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP); 1280 1281 return 0; 1282 } 1283 1284 /* test and update the power status of a mixer or switch widget */ 1285 static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget, 1286 struct snd_kcontrol *kcontrol, int connect) 1287 { 1288 struct snd_soc_dapm_path *path; 1289 int found = 0; 1290 1291 if (widget->id != snd_soc_dapm_mixer && 1292 widget->id != snd_soc_dapm_mixer_named_ctl && 1293 widget->id != snd_soc_dapm_switch) 1294 return -ENODEV; 1295 1296 /* find dapm widget path assoc with kcontrol */ 1297 list_for_each_entry(path, &widget->dapm->card->paths, list) { 1298 if (path->kcontrol != kcontrol) 1299 continue; 1300 1301 /* found, now check type */ 1302 found = 1; 1303 path->connect = connect; 1304 break; 1305 } 1306 1307 if (found) 1308 dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP); 1309 1310 return 0; 1311 } 1312 1313 /* show dapm widget status in sys fs */ 1314 static ssize_t dapm_widget_show(struct device *dev, 1315 struct device_attribute *attr, char *buf) 1316 { 1317 struct snd_soc_pcm_runtime *rtd = 1318 container_of(dev, struct snd_soc_pcm_runtime, dev); 1319 struct snd_soc_codec *codec =rtd->codec; 1320 struct snd_soc_dapm_widget *w; 1321 int count = 0; 1322 char *state = "not set"; 1323 1324 list_for_each_entry(w, &codec->card->widgets, list) { 1325 if (w->dapm != &codec->dapm) 1326 continue; 1327 1328 /* only display widgets that burnm power */ 1329 switch (w->id) { 1330 case snd_soc_dapm_hp: 1331 case snd_soc_dapm_mic: 1332 case snd_soc_dapm_spk: 1333 case snd_soc_dapm_line: 1334 case snd_soc_dapm_micbias: 1335 case snd_soc_dapm_dac: 1336 case snd_soc_dapm_adc: 1337 case snd_soc_dapm_pga: 1338 case snd_soc_dapm_out_drv: 1339 case snd_soc_dapm_mixer: 1340 case snd_soc_dapm_mixer_named_ctl: 1341 case snd_soc_dapm_supply: 1342 if (w->name) 1343 count += sprintf(buf + count, "%s: %s\n", 1344 w->name, w->power ? "On":"Off"); 1345 break; 1346 default: 1347 break; 1348 } 1349 } 1350 1351 switch (codec->dapm.bias_level) { 1352 case SND_SOC_BIAS_ON: 1353 state = "On"; 1354 break; 1355 case SND_SOC_BIAS_PREPARE: 1356 state = "Prepare"; 1357 break; 1358 case SND_SOC_BIAS_STANDBY: 1359 state = "Standby"; 1360 break; 1361 case SND_SOC_BIAS_OFF: 1362 state = "Off"; 1363 break; 1364 } 1365 count += sprintf(buf + count, "PM State: %s\n", state); 1366 1367 return count; 1368 } 1369 1370 static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); 1371 1372 int snd_soc_dapm_sys_add(struct device *dev) 1373 { 1374 return device_create_file(dev, &dev_attr_dapm_widget); 1375 } 1376 1377 static void snd_soc_dapm_sys_remove(struct device *dev) 1378 { 1379 device_remove_file(dev, &dev_attr_dapm_widget); 1380 } 1381 1382 /* free all dapm widgets and resources */ 1383 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) 1384 { 1385 struct snd_soc_dapm_widget *w, *next_w; 1386 struct snd_soc_dapm_path *p, *next_p; 1387 1388 list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) { 1389 if (w->dapm != dapm) 1390 continue; 1391 list_del(&w->list); 1392 /* 1393 * remove source and sink paths associated to this widget. 1394 * While removing the path, remove reference to it from both 1395 * source and sink widgets so that path is removed only once. 1396 */ 1397 list_for_each_entry_safe(p, next_p, &w->sources, list_sink) { 1398 list_del(&p->list_sink); 1399 list_del(&p->list_source); 1400 list_del(&p->list); 1401 kfree(p->long_name); 1402 kfree(p); 1403 } 1404 list_for_each_entry_safe(p, next_p, &w->sinks, list_source) { 1405 list_del(&p->list_sink); 1406 list_del(&p->list_source); 1407 list_del(&p->list); 1408 kfree(p->long_name); 1409 kfree(p); 1410 } 1411 kfree(w->name); 1412 kfree(w); 1413 } 1414 } 1415 1416 static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, 1417 const char *pin, int status) 1418 { 1419 struct snd_soc_dapm_widget *w; 1420 1421 list_for_each_entry(w, &dapm->card->widgets, list) { 1422 if (w->dapm != dapm) 1423 continue; 1424 if (!strcmp(w->name, pin)) { 1425 dev_dbg(w->dapm->dev, "dapm: pin %s = %d\n", 1426 pin, status); 1427 w->connected = status; 1428 /* Allow disabling of forced pins */ 1429 if (status == 0) 1430 w->force = 0; 1431 return 0; 1432 } 1433 } 1434 1435 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 1436 return -EINVAL; 1437 } 1438 1439 /** 1440 * snd_soc_dapm_sync - scan and power dapm paths 1441 * @dapm: DAPM context 1442 * 1443 * Walks all dapm audio paths and powers widgets according to their 1444 * stream or path usage. 1445 * 1446 * Returns 0 for success. 1447 */ 1448 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm) 1449 { 1450 return dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP); 1451 } 1452 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync); 1453 1454 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm, 1455 const struct snd_soc_dapm_route *route) 1456 { 1457 struct snd_soc_dapm_path *path; 1458 struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w; 1459 struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL; 1460 const char *sink; 1461 const char *control = route->control; 1462 const char *source; 1463 char prefixed_sink[80]; 1464 char prefixed_source[80]; 1465 int ret = 0; 1466 1467 if (dapm->codec->name_prefix) { 1468 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s", 1469 dapm->codec->name_prefix, route->sink); 1470 sink = prefixed_sink; 1471 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s", 1472 dapm->codec->name_prefix, route->source); 1473 source = prefixed_source; 1474 } else { 1475 sink = route->sink; 1476 source = route->source; 1477 } 1478 1479 /* 1480 * find src and dest widgets over all widgets but favor a widget from 1481 * current DAPM context 1482 */ 1483 list_for_each_entry(w, &dapm->card->widgets, list) { 1484 if (!wsink && !(strcmp(w->name, sink))) { 1485 wtsink = w; 1486 if (w->dapm == dapm) 1487 wsink = w; 1488 continue; 1489 } 1490 if (!wsource && !(strcmp(w->name, source))) { 1491 wtsource = w; 1492 if (w->dapm == dapm) 1493 wsource = w; 1494 } 1495 } 1496 /* use widget from another DAPM context if not found from this */ 1497 if (!wsink) 1498 wsink = wtsink; 1499 if (!wsource) 1500 wsource = wtsource; 1501 1502 if (wsource == NULL || wsink == NULL) 1503 return -ENODEV; 1504 1505 path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL); 1506 if (!path) 1507 return -ENOMEM; 1508 1509 path->source = wsource; 1510 path->sink = wsink; 1511 path->connected = route->connected; 1512 INIT_LIST_HEAD(&path->list); 1513 INIT_LIST_HEAD(&path->list_source); 1514 INIT_LIST_HEAD(&path->list_sink); 1515 1516 /* check for external widgets */ 1517 if (wsink->id == snd_soc_dapm_input) { 1518 if (wsource->id == snd_soc_dapm_micbias || 1519 wsource->id == snd_soc_dapm_mic || 1520 wsource->id == snd_soc_dapm_line || 1521 wsource->id == snd_soc_dapm_output) 1522 wsink->ext = 1; 1523 } 1524 if (wsource->id == snd_soc_dapm_output) { 1525 if (wsink->id == snd_soc_dapm_spk || 1526 wsink->id == snd_soc_dapm_hp || 1527 wsink->id == snd_soc_dapm_line || 1528 wsink->id == snd_soc_dapm_input) 1529 wsource->ext = 1; 1530 } 1531 1532 /* connect static paths */ 1533 if (control == NULL) { 1534 list_add(&path->list, &dapm->card->paths); 1535 list_add(&path->list_sink, &wsink->sources); 1536 list_add(&path->list_source, &wsource->sinks); 1537 path->connect = 1; 1538 return 0; 1539 } 1540 1541 /* connect dynamic paths */ 1542 switch(wsink->id) { 1543 case snd_soc_dapm_adc: 1544 case snd_soc_dapm_dac: 1545 case snd_soc_dapm_pga: 1546 case snd_soc_dapm_out_drv: 1547 case snd_soc_dapm_input: 1548 case snd_soc_dapm_output: 1549 case snd_soc_dapm_micbias: 1550 case snd_soc_dapm_vmid: 1551 case snd_soc_dapm_pre: 1552 case snd_soc_dapm_post: 1553 case snd_soc_dapm_supply: 1554 case snd_soc_dapm_aif_in: 1555 case snd_soc_dapm_aif_out: 1556 list_add(&path->list, &dapm->card->paths); 1557 list_add(&path->list_sink, &wsink->sources); 1558 list_add(&path->list_source, &wsource->sinks); 1559 path->connect = 1; 1560 return 0; 1561 case snd_soc_dapm_mux: 1562 case snd_soc_dapm_virt_mux: 1563 case snd_soc_dapm_value_mux: 1564 ret = dapm_connect_mux(dapm, wsource, wsink, path, control, 1565 &wsink->kcontrols[0]); 1566 if (ret != 0) 1567 goto err; 1568 break; 1569 case snd_soc_dapm_switch: 1570 case snd_soc_dapm_mixer: 1571 case snd_soc_dapm_mixer_named_ctl: 1572 ret = dapm_connect_mixer(dapm, wsource, wsink, path, control); 1573 if (ret != 0) 1574 goto err; 1575 break; 1576 case snd_soc_dapm_hp: 1577 case snd_soc_dapm_mic: 1578 case snd_soc_dapm_line: 1579 case snd_soc_dapm_spk: 1580 list_add(&path->list, &dapm->card->paths); 1581 list_add(&path->list_sink, &wsink->sources); 1582 list_add(&path->list_source, &wsource->sinks); 1583 path->connect = 0; 1584 return 0; 1585 } 1586 return 0; 1587 1588 err: 1589 dev_warn(dapm->dev, "asoc: no dapm match for %s --> %s --> %s\n", 1590 source, control, sink); 1591 kfree(path); 1592 return ret; 1593 } 1594 1595 /** 1596 * snd_soc_dapm_add_routes - Add routes between DAPM widgets 1597 * @dapm: DAPM context 1598 * @route: audio routes 1599 * @num: number of routes 1600 * 1601 * Connects 2 dapm widgets together via a named audio path. The sink is 1602 * the widget receiving the audio signal, whilst the source is the sender 1603 * of the audio signal. 1604 * 1605 * Returns 0 for success else error. On error all resources can be freed 1606 * with a call to snd_soc_card_free(). 1607 */ 1608 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm, 1609 const struct snd_soc_dapm_route *route, int num) 1610 { 1611 int i, ret; 1612 1613 for (i = 0; i < num; i++) { 1614 ret = snd_soc_dapm_add_route(dapm, route); 1615 if (ret < 0) { 1616 dev_err(dapm->dev, "Failed to add route %s->%s\n", 1617 route->source, route->sink); 1618 return ret; 1619 } 1620 route++; 1621 } 1622 1623 return 0; 1624 } 1625 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes); 1626 1627 /** 1628 * snd_soc_dapm_new_widgets - add new dapm widgets 1629 * @dapm: DAPM context 1630 * 1631 * Checks the codec for any new dapm widgets and creates them if found. 1632 * 1633 * Returns 0 for success. 1634 */ 1635 int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) 1636 { 1637 struct snd_soc_dapm_widget *w; 1638 unsigned int val; 1639 1640 list_for_each_entry(w, &dapm->card->widgets, list) 1641 { 1642 if (w->new) 1643 continue; 1644 1645 switch(w->id) { 1646 case snd_soc_dapm_switch: 1647 case snd_soc_dapm_mixer: 1648 case snd_soc_dapm_mixer_named_ctl: 1649 w->power_check = dapm_generic_check_power; 1650 dapm_new_mixer(dapm, w); 1651 break; 1652 case snd_soc_dapm_mux: 1653 case snd_soc_dapm_virt_mux: 1654 case snd_soc_dapm_value_mux: 1655 w->power_check = dapm_generic_check_power; 1656 dapm_new_mux(dapm, w); 1657 break; 1658 case snd_soc_dapm_adc: 1659 case snd_soc_dapm_aif_out: 1660 w->power_check = dapm_adc_check_power; 1661 break; 1662 case snd_soc_dapm_dac: 1663 case snd_soc_dapm_aif_in: 1664 w->power_check = dapm_dac_check_power; 1665 break; 1666 case snd_soc_dapm_pga: 1667 case snd_soc_dapm_out_drv: 1668 w->power_check = dapm_generic_check_power; 1669 dapm_new_pga(dapm, w); 1670 break; 1671 case snd_soc_dapm_input: 1672 case snd_soc_dapm_output: 1673 case snd_soc_dapm_micbias: 1674 case snd_soc_dapm_spk: 1675 case snd_soc_dapm_hp: 1676 case snd_soc_dapm_mic: 1677 case snd_soc_dapm_line: 1678 w->power_check = dapm_generic_check_power; 1679 break; 1680 case snd_soc_dapm_supply: 1681 w->power_check = dapm_supply_check_power; 1682 case snd_soc_dapm_vmid: 1683 case snd_soc_dapm_pre: 1684 case snd_soc_dapm_post: 1685 break; 1686 } 1687 1688 /* Read the initial power state from the device */ 1689 if (w->reg >= 0) { 1690 val = snd_soc_read(w->codec, w->reg); 1691 val &= 1 << w->shift; 1692 if (w->invert) 1693 val = !val; 1694 1695 if (val) 1696 w->power = 1; 1697 } 1698 1699 w->new = 1; 1700 } 1701 1702 dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP); 1703 return 0; 1704 } 1705 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets); 1706 1707 /** 1708 * snd_soc_dapm_get_volsw - dapm mixer get callback 1709 * @kcontrol: mixer control 1710 * @ucontrol: control element information 1711 * 1712 * Callback to get the value of a dapm mixer control. 1713 * 1714 * Returns 0 for success. 1715 */ 1716 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol, 1717 struct snd_ctl_elem_value *ucontrol) 1718 { 1719 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1720 struct soc_mixer_control *mc = 1721 (struct soc_mixer_control *)kcontrol->private_value; 1722 unsigned int reg = mc->reg; 1723 unsigned int shift = mc->shift; 1724 unsigned int rshift = mc->rshift; 1725 int max = mc->max; 1726 unsigned int invert = mc->invert; 1727 unsigned int mask = (1 << fls(max)) - 1; 1728 1729 ucontrol->value.integer.value[0] = 1730 (snd_soc_read(widget->codec, reg) >> shift) & mask; 1731 if (shift != rshift) 1732 ucontrol->value.integer.value[1] = 1733 (snd_soc_read(widget->codec, reg) >> rshift) & mask; 1734 if (invert) { 1735 ucontrol->value.integer.value[0] = 1736 max - ucontrol->value.integer.value[0]; 1737 if (shift != rshift) 1738 ucontrol->value.integer.value[1] = 1739 max - ucontrol->value.integer.value[1]; 1740 } 1741 1742 return 0; 1743 } 1744 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); 1745 1746 /** 1747 * snd_soc_dapm_put_volsw - dapm mixer set callback 1748 * @kcontrol: mixer control 1749 * @ucontrol: control element information 1750 * 1751 * Callback to set the value of a dapm mixer control. 1752 * 1753 * Returns 0 for success. 1754 */ 1755 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, 1756 struct snd_ctl_elem_value *ucontrol) 1757 { 1758 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1759 struct soc_mixer_control *mc = 1760 (struct soc_mixer_control *)kcontrol->private_value; 1761 unsigned int reg = mc->reg; 1762 unsigned int shift = mc->shift; 1763 int max = mc->max; 1764 unsigned int mask = (1 << fls(max)) - 1; 1765 unsigned int invert = mc->invert; 1766 unsigned int val; 1767 int connect, change; 1768 struct snd_soc_dapm_update update; 1769 1770 val = (ucontrol->value.integer.value[0] & mask); 1771 1772 if (invert) 1773 val = max - val; 1774 mask = mask << shift; 1775 val = val << shift; 1776 1777 mutex_lock(&widget->codec->mutex); 1778 widget->value = val; 1779 1780 change = snd_soc_test_bits(widget->codec, reg, mask, val); 1781 if (change) { 1782 if (val) 1783 /* new connection */ 1784 connect = invert ? 0:1; 1785 else 1786 /* old connection must be powered down */ 1787 connect = invert ? 1:0; 1788 1789 update.kcontrol = kcontrol; 1790 update.widget = widget; 1791 update.reg = reg; 1792 update.mask = mask; 1793 update.val = val; 1794 widget->dapm->update = &update; 1795 1796 dapm_mixer_update_power(widget, kcontrol, connect); 1797 1798 widget->dapm->update = NULL; 1799 } 1800 1801 mutex_unlock(&widget->codec->mutex); 1802 return 0; 1803 } 1804 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw); 1805 1806 /** 1807 * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback 1808 * @kcontrol: mixer control 1809 * @ucontrol: control element information 1810 * 1811 * Callback to get the value of a dapm enumerated double mixer control. 1812 * 1813 * Returns 0 for success. 1814 */ 1815 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol, 1816 struct snd_ctl_elem_value *ucontrol) 1817 { 1818 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1819 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1820 unsigned int val, bitmask; 1821 1822 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 1823 ; 1824 val = snd_soc_read(widget->codec, e->reg); 1825 ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1); 1826 if (e->shift_l != e->shift_r) 1827 ucontrol->value.enumerated.item[1] = 1828 (val >> e->shift_r) & (bitmask - 1); 1829 1830 return 0; 1831 } 1832 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double); 1833 1834 /** 1835 * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback 1836 * @kcontrol: mixer control 1837 * @ucontrol: control element information 1838 * 1839 * Callback to set the value of a dapm enumerated double mixer control. 1840 * 1841 * Returns 0 for success. 1842 */ 1843 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, 1844 struct snd_ctl_elem_value *ucontrol) 1845 { 1846 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1847 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1848 unsigned int val, mux, change; 1849 unsigned int mask, bitmask; 1850 struct snd_soc_dapm_update update; 1851 1852 for (bitmask = 1; bitmask < e->max; bitmask <<= 1) 1853 ; 1854 if (ucontrol->value.enumerated.item[0] > e->max - 1) 1855 return -EINVAL; 1856 mux = ucontrol->value.enumerated.item[0]; 1857 val = mux << e->shift_l; 1858 mask = (bitmask - 1) << e->shift_l; 1859 if (e->shift_l != e->shift_r) { 1860 if (ucontrol->value.enumerated.item[1] > e->max - 1) 1861 return -EINVAL; 1862 val |= ucontrol->value.enumerated.item[1] << e->shift_r; 1863 mask |= (bitmask - 1) << e->shift_r; 1864 } 1865 1866 mutex_lock(&widget->codec->mutex); 1867 widget->value = val; 1868 change = snd_soc_test_bits(widget->codec, e->reg, mask, val); 1869 1870 update.kcontrol = kcontrol; 1871 update.widget = widget; 1872 update.reg = e->reg; 1873 update.mask = mask; 1874 update.val = val; 1875 widget->dapm->update = &update; 1876 1877 dapm_mux_update_power(widget, kcontrol, change, mux, e); 1878 1879 widget->dapm->update = NULL; 1880 1881 mutex_unlock(&widget->codec->mutex); 1882 return change; 1883 } 1884 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double); 1885 1886 /** 1887 * snd_soc_dapm_get_enum_virt - Get virtual DAPM mux 1888 * @kcontrol: mixer control 1889 * @ucontrol: control element information 1890 * 1891 * Returns 0 for success. 1892 */ 1893 int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol, 1894 struct snd_ctl_elem_value *ucontrol) 1895 { 1896 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1897 1898 ucontrol->value.enumerated.item[0] = widget->value; 1899 1900 return 0; 1901 } 1902 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_virt); 1903 1904 /** 1905 * snd_soc_dapm_put_enum_virt - Set virtual DAPM mux 1906 * @kcontrol: mixer control 1907 * @ucontrol: control element information 1908 * 1909 * Returns 0 for success. 1910 */ 1911 int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol, 1912 struct snd_ctl_elem_value *ucontrol) 1913 { 1914 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1915 struct soc_enum *e = 1916 (struct soc_enum *)kcontrol->private_value; 1917 int change; 1918 int ret = 0; 1919 1920 if (ucontrol->value.enumerated.item[0] >= e->max) 1921 return -EINVAL; 1922 1923 mutex_lock(&widget->codec->mutex); 1924 1925 change = widget->value != ucontrol->value.enumerated.item[0]; 1926 widget->value = ucontrol->value.enumerated.item[0]; 1927 dapm_mux_update_power(widget, kcontrol, change, widget->value, e); 1928 1929 mutex_unlock(&widget->codec->mutex); 1930 return ret; 1931 } 1932 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt); 1933 1934 /** 1935 * snd_soc_dapm_get_value_enum_double - dapm semi enumerated double mixer get 1936 * callback 1937 * @kcontrol: mixer control 1938 * @ucontrol: control element information 1939 * 1940 * Callback to get the value of a dapm semi enumerated double mixer control. 1941 * 1942 * Semi enumerated mixer: the enumerated items are referred as values. Can be 1943 * used for handling bitfield coded enumeration for example. 1944 * 1945 * Returns 0 for success. 1946 */ 1947 int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol, 1948 struct snd_ctl_elem_value *ucontrol) 1949 { 1950 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1951 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1952 unsigned int reg_val, val, mux; 1953 1954 reg_val = snd_soc_read(widget->codec, e->reg); 1955 val = (reg_val >> e->shift_l) & e->mask; 1956 for (mux = 0; mux < e->max; mux++) { 1957 if (val == e->values[mux]) 1958 break; 1959 } 1960 ucontrol->value.enumerated.item[0] = mux; 1961 if (e->shift_l != e->shift_r) { 1962 val = (reg_val >> e->shift_r) & e->mask; 1963 for (mux = 0; mux < e->max; mux++) { 1964 if (val == e->values[mux]) 1965 break; 1966 } 1967 ucontrol->value.enumerated.item[1] = mux; 1968 } 1969 1970 return 0; 1971 } 1972 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_value_enum_double); 1973 1974 /** 1975 * snd_soc_dapm_put_value_enum_double - dapm semi enumerated double mixer set 1976 * callback 1977 * @kcontrol: mixer control 1978 * @ucontrol: control element information 1979 * 1980 * Callback to set the value of a dapm semi enumerated double mixer control. 1981 * 1982 * Semi enumerated mixer: the enumerated items are referred as values. Can be 1983 * used for handling bitfield coded enumeration for example. 1984 * 1985 * Returns 0 for success. 1986 */ 1987 int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, 1988 struct snd_ctl_elem_value *ucontrol) 1989 { 1990 struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); 1991 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1992 unsigned int val, mux, change; 1993 unsigned int mask; 1994 struct snd_soc_dapm_update update; 1995 1996 if (ucontrol->value.enumerated.item[0] > e->max - 1) 1997 return -EINVAL; 1998 mux = ucontrol->value.enumerated.item[0]; 1999 val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l; 2000 mask = e->mask << e->shift_l; 2001 if (e->shift_l != e->shift_r) { 2002 if (ucontrol->value.enumerated.item[1] > e->max - 1) 2003 return -EINVAL; 2004 val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r; 2005 mask |= e->mask << e->shift_r; 2006 } 2007 2008 mutex_lock(&widget->codec->mutex); 2009 widget->value = val; 2010 change = snd_soc_test_bits(widget->codec, e->reg, mask, val); 2011 2012 update.kcontrol = kcontrol; 2013 update.widget = widget; 2014 update.reg = e->reg; 2015 update.mask = mask; 2016 update.val = val; 2017 widget->dapm->update = &update; 2018 2019 dapm_mux_update_power(widget, kcontrol, change, mux, e); 2020 2021 widget->dapm->update = NULL; 2022 2023 mutex_unlock(&widget->codec->mutex); 2024 return change; 2025 } 2026 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double); 2027 2028 /** 2029 * snd_soc_dapm_info_pin_switch - Info for a pin switch 2030 * 2031 * @kcontrol: mixer control 2032 * @uinfo: control element information 2033 * 2034 * Callback to provide information about a pin switch control. 2035 */ 2036 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol, 2037 struct snd_ctl_elem_info *uinfo) 2038 { 2039 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 2040 uinfo->count = 1; 2041 uinfo->value.integer.min = 0; 2042 uinfo->value.integer.max = 1; 2043 2044 return 0; 2045 } 2046 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch); 2047 2048 /** 2049 * snd_soc_dapm_get_pin_switch - Get information for a pin switch 2050 * 2051 * @kcontrol: mixer control 2052 * @ucontrol: Value 2053 */ 2054 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol, 2055 struct snd_ctl_elem_value *ucontrol) 2056 { 2057 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 2058 const char *pin = (const char *)kcontrol->private_value; 2059 2060 mutex_lock(&codec->mutex); 2061 2062 ucontrol->value.integer.value[0] = 2063 snd_soc_dapm_get_pin_status(&codec->dapm, pin); 2064 2065 mutex_unlock(&codec->mutex); 2066 2067 return 0; 2068 } 2069 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch); 2070 2071 /** 2072 * snd_soc_dapm_put_pin_switch - Set information for a pin switch 2073 * 2074 * @kcontrol: mixer control 2075 * @ucontrol: Value 2076 */ 2077 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, 2078 struct snd_ctl_elem_value *ucontrol) 2079 { 2080 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 2081 const char *pin = (const char *)kcontrol->private_value; 2082 2083 mutex_lock(&codec->mutex); 2084 2085 if (ucontrol->value.integer.value[0]) 2086 snd_soc_dapm_enable_pin(&codec->dapm, pin); 2087 else 2088 snd_soc_dapm_disable_pin(&codec->dapm, pin); 2089 2090 snd_soc_dapm_sync(&codec->dapm); 2091 2092 mutex_unlock(&codec->mutex); 2093 2094 return 0; 2095 } 2096 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); 2097 2098 /** 2099 * snd_soc_dapm_new_control - create new dapm control 2100 * @dapm: DAPM context 2101 * @widget: widget template 2102 * 2103 * Creates a new dapm control based upon the template. 2104 * 2105 * Returns 0 for success else error. 2106 */ 2107 int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, 2108 const struct snd_soc_dapm_widget *widget) 2109 { 2110 struct snd_soc_dapm_widget *w; 2111 size_t name_len; 2112 2113 if ((w = dapm_cnew_widget(widget)) == NULL) 2114 return -ENOMEM; 2115 2116 name_len = strlen(widget->name) + 1; 2117 if (dapm->codec->name_prefix) 2118 name_len += 1 + strlen(dapm->codec->name_prefix); 2119 w->name = kmalloc(name_len, GFP_KERNEL); 2120 if (w->name == NULL) { 2121 kfree(w); 2122 return -ENOMEM; 2123 } 2124 if (dapm->codec->name_prefix) 2125 snprintf(w->name, name_len, "%s %s", 2126 dapm->codec->name_prefix, widget->name); 2127 else 2128 snprintf(w->name, name_len, "%s", widget->name); 2129 2130 dapm->n_widgets++; 2131 w->dapm = dapm; 2132 w->codec = dapm->codec; 2133 INIT_LIST_HEAD(&w->sources); 2134 INIT_LIST_HEAD(&w->sinks); 2135 INIT_LIST_HEAD(&w->list); 2136 list_add(&w->list, &dapm->card->widgets); 2137 2138 /* machine layer set ups unconnected pins and insertions */ 2139 w->connected = 1; 2140 return 0; 2141 } 2142 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control); 2143 2144 /** 2145 * snd_soc_dapm_new_controls - create new dapm controls 2146 * @dapm: DAPM context 2147 * @widget: widget array 2148 * @num: number of widgets 2149 * 2150 * Creates new DAPM controls based upon the templates. 2151 * 2152 * Returns 0 for success else error. 2153 */ 2154 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm, 2155 const struct snd_soc_dapm_widget *widget, 2156 int num) 2157 { 2158 int i, ret; 2159 2160 for (i = 0; i < num; i++) { 2161 ret = snd_soc_dapm_new_control(dapm, widget); 2162 if (ret < 0) { 2163 dev_err(dapm->dev, 2164 "ASoC: Failed to create DAPM control %s: %d\n", 2165 widget->name, ret); 2166 return ret; 2167 } 2168 widget++; 2169 } 2170 return 0; 2171 } 2172 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls); 2173 2174 static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm, 2175 const char *stream, int event) 2176 { 2177 struct snd_soc_dapm_widget *w; 2178 2179 list_for_each_entry(w, &dapm->card->widgets, list) 2180 { 2181 if (!w->sname || w->dapm != dapm) 2182 continue; 2183 dev_dbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n", 2184 w->name, w->sname, stream, event); 2185 if (strstr(w->sname, stream)) { 2186 switch(event) { 2187 case SND_SOC_DAPM_STREAM_START: 2188 w->active = 1; 2189 break; 2190 case SND_SOC_DAPM_STREAM_STOP: 2191 w->active = 0; 2192 break; 2193 case SND_SOC_DAPM_STREAM_SUSPEND: 2194 case SND_SOC_DAPM_STREAM_RESUME: 2195 case SND_SOC_DAPM_STREAM_PAUSE_PUSH: 2196 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE: 2197 break; 2198 } 2199 } 2200 } 2201 2202 dapm_power_widgets(dapm, event); 2203 } 2204 2205 /** 2206 * snd_soc_dapm_stream_event - send a stream event to the dapm core 2207 * @rtd: PCM runtime data 2208 * @stream: stream name 2209 * @event: stream event 2210 * 2211 * Sends a stream event to the dapm core. The core then makes any 2212 * necessary widget power changes. 2213 * 2214 * Returns 0 for success else error. 2215 */ 2216 int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, 2217 const char *stream, int event) 2218 { 2219 struct snd_soc_codec *codec = rtd->codec; 2220 2221 if (stream == NULL) 2222 return 0; 2223 2224 mutex_lock(&codec->mutex); 2225 soc_dapm_stream_event(&codec->dapm, stream, event); 2226 mutex_unlock(&codec->mutex); 2227 return 0; 2228 } 2229 EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event); 2230 2231 /** 2232 * snd_soc_dapm_enable_pin - enable pin. 2233 * @dapm: DAPM context 2234 * @pin: pin name 2235 * 2236 * Enables input/output pin and its parents or children widgets iff there is 2237 * a valid audio route and active audio stream. 2238 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2239 * do any widget power switching. 2240 */ 2241 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) 2242 { 2243 return snd_soc_dapm_set_pin(dapm, pin, 1); 2244 } 2245 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); 2246 2247 /** 2248 * snd_soc_dapm_force_enable_pin - force a pin to be enabled 2249 * @dapm: DAPM context 2250 * @pin: pin name 2251 * 2252 * Enables input/output pin regardless of any other state. This is 2253 * intended for use with microphone bias supplies used in microphone 2254 * jack detection. 2255 * 2256 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2257 * do any widget power switching. 2258 */ 2259 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, 2260 const char *pin) 2261 { 2262 struct snd_soc_dapm_widget *w; 2263 2264 list_for_each_entry(w, &dapm->card->widgets, list) { 2265 if (w->dapm != dapm) 2266 continue; 2267 if (!strcmp(w->name, pin)) { 2268 dev_dbg(w->dapm->dev, 2269 "dapm: force enable pin %s\n", pin); 2270 w->connected = 1; 2271 w->force = 1; 2272 return 0; 2273 } 2274 } 2275 2276 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 2277 return -EINVAL; 2278 } 2279 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); 2280 2281 /** 2282 * snd_soc_dapm_disable_pin - disable pin. 2283 * @dapm: DAPM context 2284 * @pin: pin name 2285 * 2286 * Disables input/output pin and its parents or children widgets. 2287 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2288 * do any widget power switching. 2289 */ 2290 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, 2291 const char *pin) 2292 { 2293 return snd_soc_dapm_set_pin(dapm, pin, 0); 2294 } 2295 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); 2296 2297 /** 2298 * snd_soc_dapm_nc_pin - permanently disable pin. 2299 * @dapm: DAPM context 2300 * @pin: pin name 2301 * 2302 * Marks the specified pin as being not connected, disabling it along 2303 * any parent or child widgets. At present this is identical to 2304 * snd_soc_dapm_disable_pin() but in future it will be extended to do 2305 * additional things such as disabling controls which only affect 2306 * paths through the pin. 2307 * 2308 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to 2309 * do any widget power switching. 2310 */ 2311 int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) 2312 { 2313 return snd_soc_dapm_set_pin(dapm, pin, 0); 2314 } 2315 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); 2316 2317 /** 2318 * snd_soc_dapm_get_pin_status - get audio pin status 2319 * @dapm: DAPM context 2320 * @pin: audio signal pin endpoint (or start point) 2321 * 2322 * Get audio pin status - connected or disconnected. 2323 * 2324 * Returns 1 for connected otherwise 0. 2325 */ 2326 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, 2327 const char *pin) 2328 { 2329 struct snd_soc_dapm_widget *w; 2330 2331 list_for_each_entry(w, &dapm->card->widgets, list) { 2332 if (w->dapm != dapm) 2333 continue; 2334 if (!strcmp(w->name, pin)) 2335 return w->connected; 2336 } 2337 2338 return 0; 2339 } 2340 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status); 2341 2342 /** 2343 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint 2344 * @dapm: DAPM context 2345 * @pin: audio signal pin endpoint (or start point) 2346 * 2347 * Mark the given endpoint or pin as ignoring suspend. When the 2348 * system is disabled a path between two endpoints flagged as ignoring 2349 * suspend will not be disabled. The path must already be enabled via 2350 * normal means at suspend time, it will not be turned on if it was not 2351 * already enabled. 2352 */ 2353 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, 2354 const char *pin) 2355 { 2356 struct snd_soc_dapm_widget *w; 2357 2358 list_for_each_entry(w, &dapm->card->widgets, list) { 2359 if (w->dapm != dapm) 2360 continue; 2361 if (!strcmp(w->name, pin)) { 2362 w->ignore_suspend = 1; 2363 return 0; 2364 } 2365 } 2366 2367 dev_err(dapm->dev, "dapm: unknown pin %s\n", pin); 2368 return -EINVAL; 2369 } 2370 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend); 2371 2372 /** 2373 * snd_soc_dapm_free - free dapm resources 2374 * @card: SoC device 2375 * 2376 * Free all dapm widgets and resources. 2377 */ 2378 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm) 2379 { 2380 snd_soc_dapm_sys_remove(dapm->dev); 2381 dapm_free_widgets(dapm); 2382 list_del(&dapm->list); 2383 } 2384 EXPORT_SYMBOL_GPL(snd_soc_dapm_free); 2385 2386 static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) 2387 { 2388 struct snd_soc_dapm_widget *w; 2389 LIST_HEAD(down_list); 2390 int powerdown = 0; 2391 2392 list_for_each_entry(w, &dapm->card->widgets, list) { 2393 if (w->dapm != dapm) 2394 continue; 2395 if (w->power) { 2396 dapm_seq_insert(w, &down_list, dapm_down_seq); 2397 w->power = 0; 2398 powerdown = 1; 2399 } 2400 } 2401 2402 /* If there were no widgets to power down we're already in 2403 * standby. 2404 */ 2405 if (powerdown) { 2406 snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_PREPARE); 2407 dapm_seq_run(dapm, &down_list, 0, dapm_down_seq); 2408 snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_STANDBY); 2409 } 2410 } 2411 2412 /* 2413 * snd_soc_dapm_shutdown - callback for system shutdown 2414 */ 2415 void snd_soc_dapm_shutdown(struct snd_soc_card *card) 2416 { 2417 struct snd_soc_codec *codec; 2418 2419 list_for_each_entry(codec, &card->codec_dev_list, list) { 2420 soc_dapm_shutdown_codec(&codec->dapm); 2421 snd_soc_dapm_set_bias_level(card, &codec->dapm, SND_SOC_BIAS_OFF); 2422 } 2423 } 2424 2425 /* Module information */ 2426 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk"); 2427 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC"); 2428 MODULE_LICENSE("GPL"); 2429