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