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