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