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