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