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/meadphone 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 powerdown of audio susbsystem to reduce pops between a quick
  22 *      device reopen.
  23 *
  24 *  Todo:
  25 *    o DAPM power change sequencing - allow for configurable per
  26 *      codec sequences.
  27 *    o Support for analogue bias optimisation.
  28 *    o Support for reduced codec oversampling rates.
  29 *    o Support for reduced codec bias currents.
  30 */
  31
  32#include <linux/module.h>
  33#include <linux/moduleparam.h>
  34#include <linux/init.h>
  35#include <linux/delay.h>
  36#include <linux/pm.h>
  37#include <linux/bitops.h>
  38#include <linux/platform_device.h>
  39#include <linux/jiffies.h>
  40#include <linux/debugfs.h>
  41#include <linux/slab.h>
  42#include <sound/core.h>
  43#include <sound/pcm.h>
  44#include <sound/pcm_params.h>
  45#include <sound/soc.h>
  46#include <sound/initval.h>
  47
  48#include <trace/events/asoc.h>
  49
  50/* dapm power sequences - make this per codec in the future */
  51static int dapm_up_seq[] = {
  52        [snd_soc_dapm_pre] = 0,
  53        [snd_soc_dapm_supply] = 1,
  54        [snd_soc_dapm_micbias] = 2,
  55        [snd_soc_dapm_aif_in] = 3,
  56        [snd_soc_dapm_aif_out] = 3,
  57        [snd_soc_dapm_mic] = 4,
  58        [snd_soc_dapm_mux] = 5,
  59        [snd_soc_dapm_virt_mux] = 5,
  60        [snd_soc_dapm_value_mux] = 5,
  61        [snd_soc_dapm_dac] = 6,
  62        [snd_soc_dapm_mixer] = 7,
  63        [snd_soc_dapm_mixer_named_ctl] = 7,
  64        [snd_soc_dapm_pga] = 8,
  65        [snd_soc_dapm_adc] = 9,
  66        [snd_soc_dapm_out_drv] = 10,
  67        [snd_soc_dapm_hp] = 10,
  68        [snd_soc_dapm_spk] = 10,
  69        [snd_soc_dapm_post] = 11,
  70};
  71
  72static int dapm_down_seq[] = {
  73        [snd_soc_dapm_pre] = 0,
  74        [snd_soc_dapm_adc] = 1,
  75        [snd_soc_dapm_hp] = 2,
  76        [snd_soc_dapm_spk] = 2,
  77        [snd_soc_dapm_out_drv] = 2,
  78        [snd_soc_dapm_pga] = 4,
  79        [snd_soc_dapm_mixer_named_ctl] = 5,
  80        [snd_soc_dapm_mixer] = 5,
  81        [snd_soc_dapm_dac] = 6,
  82        [snd_soc_dapm_mic] = 7,
  83        [snd_soc_dapm_micbias] = 8,
  84        [snd_soc_dapm_mux] = 9,
  85        [snd_soc_dapm_virt_mux] = 9,
  86        [snd_soc_dapm_value_mux] = 9,
  87        [snd_soc_dapm_aif_in] = 10,
  88        [snd_soc_dapm_aif_out] = 10,
  89        [snd_soc_dapm_supply] = 11,
  90        [snd_soc_dapm_post] = 12,
  91};
  92
  93static void pop_wait(u32 pop_time)
  94{
  95        if (pop_time)
  96                schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
  97}
  98
  99static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...)
 100{
 101        va_list args;
 102        char *buf;
 103
 104        if (!pop_time)
 105                return;
 106
 107        buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
 108        if (buf == NULL)
 109                return;
 110
 111        va_start(args, fmt);
 112        vsnprintf(buf, PAGE_SIZE, fmt, args);
 113        dev_info(dev, "%s", buf);
 114        va_end(args);
 115
 116        kfree(buf);
 117}
 118
 119/* create a new dapm widget */
 120static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
 121        const struct snd_soc_dapm_widget *_widget)
 122{
 123        return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL);
 124}
 125
 126/**
 127 * snd_soc_dapm_set_bias_level - set the bias level for the system
 128 * @card: audio device
 129 * @level: level to configure
 130 *
 131 * Configure the bias (power) levels for the SoC audio device.
 132 *
 133 * Returns 0 for success else error.
 134 */
 135static int snd_soc_dapm_set_bias_level(struct snd_soc_card *card,
 136                                       struct snd_soc_dapm_context *dapm,
 137                                       enum snd_soc_bias_level level)
 138{
 139        int ret = 0;
 140
 141        switch (level) {
 142        case SND_SOC_BIAS_ON:
 143                dev_dbg(dapm->dev, "Setting full bias\n");
 144                break;
 145        case SND_SOC_BIAS_PREPARE:
 146                dev_dbg(dapm->dev, "Setting bias prepare\n");
 147                break;
 148        case SND_SOC_BIAS_STANDBY:
 149                dev_dbg(dapm->dev, "Setting standby bias\n");
 150                break;
 151        case SND_SOC_BIAS_OFF:
 152                dev_dbg(dapm->dev, "Setting bias off\n");
 153                break;
 154        default:
 155                dev_err(dapm->dev, "Setting invalid bias %d\n", level);
 156                return -EINVAL;
 157        }
 158
 159        trace_snd_soc_bias_level_start(card, level);
 160
 161        if (card && card->set_bias_level)
 162                ret = card->set_bias_level(card, level);
 163        if (ret == 0) {
 164                if (dapm->codec && dapm->codec->driver->set_bias_level)
 165                        ret = dapm->codec->driver->set_bias_level(dapm->codec, level);
 166                else
 167                        dapm->bias_level = level;
 168        }
 169        if (ret == 0) {
 170                if (card && card->set_bias_level_post)
 171                        ret = card->set_bias_level_post(card, level);
 172        }
 173
 174        trace_snd_soc_bias_level_done(card, level);
 175
 176        return ret;
 177}
 178
 179/* set up initial codec paths */
 180static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
 181        struct snd_soc_dapm_path *p, int i)
 182{
 183        switch (w->id) {
 184        case snd_soc_dapm_switch:
 185        case snd_soc_dapm_mixer:
 186        case snd_soc_dapm_mixer_named_ctl: {
 187                int val;
 188                struct soc_mixer_control *mc = (struct soc_mixer_control *)
 189                        w->kcontrols[i].private_value;
 190                unsigned int reg = mc->reg;
 191                unsigned int shift = mc->shift;
 192                int max = mc->max;
 193                unsigned int mask = (1 << fls(max)) - 1;
 194                unsigned int invert = mc->invert;
 195
 196                val = snd_soc_read(w->codec, reg);
 197                val = (val >> shift) & mask;
 198
 199                if ((invert && !val) || (!invert && val))
 200                        p->connect = 1;
 201                else
 202                        p->connect = 0;
 203        }
 204        break;
 205        case snd_soc_dapm_mux: {
 206                struct soc_enum *e = (struct soc_enum *)w->kcontrols[i].private_value;
 207                int val, item, bitmask;
 208
 209                for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
 210                ;
 211                val = snd_soc_read(w->codec, e->reg);
 212                item = (val >> e->shift_l) & (bitmask - 1);
 213
 214                p->connect = 0;
 215                for (i = 0; i < e->max; i++) {
 216                        if (!(strcmp(p->name, e->texts[i])) && item == i)
 217                                p->connect = 1;
 218                }
 219        }
 220        break;
 221        case snd_soc_dapm_virt_mux: {
 222                struct soc_enum *e = (struct soc_enum *)w->kcontrols[i].private_value;
 223
 224                p->connect = 0;
 225                /* since a virtual mux has no backing registers to
 226                 * decide which path to connect, it will try to match
 227                 * with the first enumeration.  This is to ensure
 228                 * that the default mux choice (the first) will be
 229                 * correctly powered up during initialization.
 230                 */
 231                if (!strcmp(p->name, e->texts[0]))
 232                        p->connect = 1;
 233        }
 234        break;
 235        case snd_soc_dapm_value_mux: {
 236                struct soc_enum *e = (struct soc_enum *)
 237                        w->kcontrols[i].private_value;
 238                int val, item;
 239
 240                val = snd_soc_read(w->codec, e->reg);
 241                val = (val >> e->shift_l) & e->mask;
 242                for (item = 0; item < e->max; item++) {
 243                        if (val == e->values[item])
 244                                break;
 245                }
 246
 247                p->connect = 0;
 248                for (i = 0; i < e->max; i++) {
 249                        if (!(strcmp(p->name, e->texts[i])) && item == i)
 250                                p->connect = 1;
 251                }
 252        }
 253        break;
 254        /* does not effect routing - always connected */
 255        case snd_soc_dapm_pga:
 256        case snd_soc_dapm_out_drv:
 257        case snd_soc_dapm_output:
 258        case snd_soc_dapm_adc:
 259        case snd_soc_dapm_input:
 260        case snd_soc_dapm_dac:
 261        case snd_soc_dapm_micbias:
 262        case snd_soc_dapm_vmid:
 263        case snd_soc_dapm_supply:
 264        case snd_soc_dapm_aif_in:
 265        case snd_soc_dapm_aif_out:
 266                p->connect = 1;
 267        break;
 268        /* does effect routing - dynamically connected */
 269        case snd_soc_dapm_hp:
 270        case snd_soc_dapm_mic:
 271        case snd_soc_dapm_spk:
 272        case snd_soc_dapm_line:
 273        case snd_soc_dapm_pre:
 274        case snd_soc_dapm_post:
 275                p->connect = 0;
 276        break;
 277        }
 278}
 279
 280/* connect mux widget to its interconnecting audio paths */
 281static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
 282        struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
 283        struct snd_soc_dapm_path *path, const char *control_name,
 284        const struct snd_kcontrol_new *kcontrol)
 285{
 286        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 287        int i;
 288
 289        for (i = 0; i < e->max; i++) {
 290                if (!(strcmp(control_name, e->texts[i]))) {
 291                        list_add(&path->list, &dapm->card->paths);
 292                        list_add(&path->list_sink, &dest->sources);
 293                        list_add(&path->list_source, &src->sinks);
 294                        path->name = (char*)e->texts[i];
 295                        dapm_set_path_status(dest, path, 0);
 296                        return 0;
 297                }
 298        }
 299
 300        return -ENODEV;
 301}
 302
 303/* connect mixer widget to its interconnecting audio paths */
 304static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
 305        struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
 306        struct snd_soc_dapm_path *path, const char *control_name)
 307{
 308        int i;
 309
 310        /* search for mixer kcontrol */
 311        for (i = 0; i < dest->num_kcontrols; i++) {
 312                if (!strcmp(control_name, dest->kcontrols[i].name)) {
 313                        list_add(&path->list, &dapm->card->paths);
 314                        list_add(&path->list_sink, &dest->sources);
 315                        list_add(&path->list_source, &src->sinks);
 316                        path->name = dest->kcontrols[i].name;
 317                        dapm_set_path_status(dest, path, i);
 318                        return 0;
 319                }
 320        }
 321        return -ENODEV;
 322}
 323
 324/* update dapm codec register bits */
 325static int dapm_update_bits(struct snd_soc_dapm_widget *widget)
 326{
 327        int change, power;
 328        unsigned int old, new;
 329        struct snd_soc_codec *codec = widget->codec;
 330        struct snd_soc_dapm_context *dapm = widget->dapm;
 331        struct snd_soc_card *card = dapm->card;
 332
 333        /* check for valid widgets */
 334        if (widget->reg < 0 || widget->id == snd_soc_dapm_input ||
 335                widget->id == snd_soc_dapm_output ||
 336                widget->id == snd_soc_dapm_hp ||
 337                widget->id == snd_soc_dapm_mic ||
 338                widget->id == snd_soc_dapm_line ||
 339                widget->id == snd_soc_dapm_spk)
 340                return 0;
 341
 342        power = widget->power;
 343        if (widget->invert)
 344                power = (power ? 0:1);
 345
 346        old = snd_soc_read(codec, widget->reg);
 347        new = (old & ~(0x1 << widget->shift)) | (power << widget->shift);
 348
 349        change = old != new;
 350        if (change) {
 351                pop_dbg(dapm->dev, card->pop_time,
 352                        "pop test %s : %s in %d ms\n",
 353                        widget->name, widget->power ? "on" : "off",
 354                        card->pop_time);
 355                pop_wait(card->pop_time);
 356                snd_soc_write(codec, widget->reg, new);
 357        }
 358        dev_dbg(dapm->dev, "reg %x old %x new %x change %d\n", widget->reg,
 359                old, new, change);
 360        return change;
 361}
 362
 363/* create new dapm mixer control */
 364static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
 365        struct snd_soc_dapm_widget *w)
 366{
 367        int i, ret = 0;
 368        size_t name_len;
 369        struct snd_soc_dapm_path *path;
 370        struct snd_card *card = dapm->codec->card->snd_card;
 371
 372        /* add kcontrol */
 373        for (i = 0; i < w->num_kcontrols; i++) {
 374
 375                /* match name */
 376                list_for_each_entry(path, &w->sources, list_sink) {
 377
 378                        /* mixer/mux paths name must match control name */
 379                        if (path->name != (char*)w->kcontrols[i].name)
 380                                continue;
 381
 382                        /* add dapm control with long name.
 383                         * for dapm_mixer this is the concatenation of the
 384                         * mixer and kcontrol name.
 385                         * for dapm_mixer_named_ctl this is simply the
 386                         * kcontrol name.
 387                         */
 388                        name_len = strlen(w->kcontrols[i].name) + 1;
 389                        if (w->id != snd_soc_dapm_mixer_named_ctl)
 390                                name_len += 1 + strlen(w->name);
 391
 392                        path->long_name = kmalloc(name_len, GFP_KERNEL);
 393
 394                        if (path->long_name == NULL)
 395                                return -ENOMEM;
 396
 397                        switch (w->id) {
 398                        default:
 399                                snprintf(path->long_name, name_len, "%s %s",
 400                                         w->name, w->kcontrols[i].name);
 401                                break;
 402                        case snd_soc_dapm_mixer_named_ctl:
 403                                snprintf(path->long_name, name_len, "%s",
 404                                         w->kcontrols[i].name);
 405                                break;
 406                        }
 407
 408                        path->long_name[name_len - 1] = '\0';
 409
 410                        path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
 411                                path->long_name);
 412                        ret = snd_ctl_add(card, path->kcontrol);
 413                        if (ret < 0) {
 414                                dev_err(dapm->dev,
 415                                        "asoc: failed to add dapm kcontrol %s: %d\n",
 416                                        path->long_name, ret);
 417                                kfree(path->long_name);
 418                                path->long_name = NULL;
 419                                return ret;
 420                        }
 421                }
 422        }
 423        return ret;
 424}
 425
 426/* create new dapm mux control */
 427static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
 428        struct snd_soc_dapm_widget *w)
 429{
 430        struct snd_soc_dapm_path *path = NULL;
 431        struct snd_kcontrol *kcontrol;
 432        struct snd_card *card = dapm->codec->card->snd_card;
 433        int ret = 0;
 434
 435        if (!w->num_kcontrols) {
 436                dev_err(dapm->dev, "asoc: mux %s has no controls\n", w->name);
 437                return -EINVAL;
 438        }
 439
 440        kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name);
 441        ret = snd_ctl_add(card, kcontrol);
 442
 443        if (ret < 0)
 444                goto err;
 445
 446        list_for_each_entry(path, &w->sources, list_sink)
 447                path->kcontrol = kcontrol;
 448
 449        return ret;
 450
 451err:
 452        dev_err(dapm->dev, "asoc: failed to add kcontrol %s\n", w->name);
 453        return ret;
 454}
 455
 456/* create new dapm volume control */
 457static int dapm_new_pga(struct snd_soc_dapm_context *dapm,
 458        struct snd_soc_dapm_widget *w)
 459{
 460        if (w->num_kcontrols)
 461                dev_err(w->dapm->dev,
 462                        "asoc: PGA controls not supported: '%s'\n", w->name);
 463
 464        return 0;
 465}
 466
 467/* reset 'walked' bit for each dapm path */
 468static inline void dapm_clear_walk(struct snd_soc_dapm_context *dapm)
 469{
 470        struct snd_soc_dapm_path *p;
 471
 472        list_for_each_entry(p, &dapm->card->paths, list)
 473                p->walked = 0;
 474}
 475
 476/* We implement power down on suspend by checking the power state of
 477 * the ALSA card - when we are suspending the ALSA state for the card
 478 * is set to D3.
 479 */
 480static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
 481{
 482        int level = snd_power_get_state(widget->dapm->codec->card->snd_card);
 483
 484        switch (level) {
 485        case SNDRV_CTL_POWER_D3hot:
 486        case SNDRV_CTL_POWER_D3cold:
 487                if (widget->ignore_suspend)
 488                        dev_dbg(widget->dapm->dev, "%s ignoring suspend\n",
 489                                widget->name);
 490                return widget->ignore_suspend;
 491        default:
 492                return 1;
 493        }
 494}
 495
 496/*
 497 * Recursively check for a completed path to an active or physically connected
 498 * output widget. Returns number of complete paths.
 499 */
 500static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
 501{
 502        struct snd_soc_dapm_path *path;
 503        int con = 0;
 504
 505        if (widget->id == snd_soc_dapm_supply)
 506                return 0;
 507
 508        switch (widget->id) {
 509        case snd_soc_dapm_adc:
 510        case snd_soc_dapm_aif_out:
 511                if (widget->active)
 512                        return snd_soc_dapm_suspend_check(widget);
 513        default:
 514                break;
 515        }
 516
 517        if (widget->connected) {
 518                /* connected pin ? */
 519                if (widget->id == snd_soc_dapm_output && !widget->ext)
 520                        return snd_soc_dapm_suspend_check(widget);
 521
 522                /* connected jack or spk ? */
 523                if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk ||
 524                    (widget->id == snd_soc_dapm_line && !list_empty(&widget->sources)))
 525                        return snd_soc_dapm_suspend_check(widget);
 526        }
 527
 528        list_for_each_entry(path, &widget->sinks, list_source) {
 529                if (path->walked)
 530                        continue;
 531
 532                if (path->sink && path->connect) {
 533                        path->walked = 1;
 534                        con += is_connected_output_ep(path->sink);
 535                }
 536        }
 537
 538        return con;
 539}
 540
 541/*
 542 * Recursively check for a completed path to an active or physically connected
 543 * input widget. Returns number of complete paths.
 544 */
 545static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
 546{
 547        struct snd_soc_dapm_path *path;
 548        int con = 0;
 549
 550        if (widget->id == snd_soc_dapm_supply)
 551                return 0;
 552
 553        /* active stream ? */
 554        switch (widget->id) {
 555        case snd_soc_dapm_dac:
 556        case snd_soc_dapm_aif_in:
 557                if (widget->active)
 558                        return snd_soc_dapm_suspend_check(widget);
 559        default:
 560                break;
 561        }
 562
 563        if (widget->connected) {
 564                /* connected pin ? */
 565                if (widget->id == snd_soc_dapm_input && !widget->ext)
 566                        return snd_soc_dapm_suspend_check(widget);
 567
 568                /* connected VMID/Bias for lower pops */
 569                if (widget->id == snd_soc_dapm_vmid)
 570                        return snd_soc_dapm_suspend_check(widget);
 571
 572                /* connected jack ? */
 573                if (widget->id == snd_soc_dapm_mic ||
 574                    (widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks)))
 575                        return snd_soc_dapm_suspend_check(widget);
 576        }
 577
 578        list_for_each_entry(path, &widget->sources, list_sink) {
 579                if (path->walked)
 580                        continue;
 581
 582                if (path->source && path->connect) {
 583                        path->walked = 1;
 584                        con += is_connected_input_ep(path->source);
 585                }
 586        }
 587
 588        return con;
 589}
 590
 591/*
 592 * Handler for generic register modifier widget.
 593 */
 594int dapm_reg_event(struct snd_soc_dapm_widget *w,
 595                   struct snd_kcontrol *kcontrol, int event)
 596{
 597        unsigned int val;
 598
 599        if (SND_SOC_DAPM_EVENT_ON(event))
 600                val = w->on_val;
 601        else
 602                val = w->off_val;
 603
 604        snd_soc_update_bits(w->codec, -(w->reg + 1),
 605                            w->mask << w->shift, val << w->shift);
 606
 607        return 0;
 608}
 609EXPORT_SYMBOL_GPL(dapm_reg_event);
 610
 611/* Standard power change method, used to apply power changes to most
 612 * widgets.
 613 */
 614static int dapm_generic_apply_power(struct snd_soc_dapm_widget *w)
 615{
 616        int ret;
 617
 618        /* call any power change event handlers */
 619        if (w->event)
 620                dev_dbg(w->dapm->dev, "power %s event for %s flags %x\n",
 621                         w->power ? "on" : "off",
 622                         w->name, w->event_flags);
 623
 624        /* power up pre event */
 625        if (w->power && w->event &&
 626            (w->event_flags & SND_SOC_DAPM_PRE_PMU)) {
 627                ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU);
 628                if (ret < 0)
 629                        return ret;
 630        }
 631
 632        /* power down pre event */
 633        if (!w->power && w->event &&
 634            (w->event_flags & SND_SOC_DAPM_PRE_PMD)) {
 635                ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD);
 636                if (ret < 0)
 637                        return ret;
 638        }
 639
 640        dapm_update_bits(w);
 641
 642        /* power up post event */
 643        if (w->power && w->event &&
 644            (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
 645                ret = w->event(w,
 646                               NULL, SND_SOC_DAPM_POST_PMU);
 647                if (ret < 0)
 648                        return ret;
 649        }
 650
 651        /* power down post event */
 652        if (!w->power && w->event &&
 653            (w->event_flags & SND_SOC_DAPM_POST_PMD)) {
 654                ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD);
 655                if (ret < 0)
 656                        return ret;
 657        }
 658
 659        return 0;
 660}
 661
 662/* Generic check to see if a widget should be powered.
 663 */
 664static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
 665{
 666        int in, out;
 667
 668        in = is_connected_input_ep(w);
 669        dapm_clear_walk(w->dapm);
 670        out = is_connected_output_ep(w);
 671        dapm_clear_walk(w->dapm);
 672        return out != 0 && in != 0;
 673}
 674
 675/* Check to see if an ADC has power */
 676static int dapm_adc_check_power(struct snd_soc_dapm_widget *w)
 677{
 678        int in;
 679
 680        if (w->active) {
 681                in = is_connected_input_ep(w);
 682                dapm_clear_walk(w->dapm);
 683                return in != 0;
 684        } else {
 685                return dapm_generic_check_power(w);
 686        }
 687}
 688
 689/* Check to see if a DAC has power */
 690static int dapm_dac_check_power(struct snd_soc_dapm_widget *w)
 691{
 692        int out;
 693
 694        if (w->active) {
 695                out = is_connected_output_ep(w);
 696                dapm_clear_walk(w->dapm);
 697                return out != 0;
 698        } else {
 699                return dapm_generic_check_power(w);
 700        }
 701}
 702
 703/* Check to see if a power supply is needed */
 704static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
 705{
 706        struct snd_soc_dapm_path *path;
 707        int power = 0;
 708
 709        /* Check if one of our outputs is connected */
 710        list_for_each_entry(path, &w->sinks, list_source) {
 711                if (path->connected &&
 712                    !path->connected(path->source, path->sink))
 713                        continue;
 714
 715                if (!path->sink)
 716                        continue;
 717
 718                if (path->sink->force) {
 719                        power = 1;
 720                        break;
 721                }
 722
 723                if (path->sink->power_check &&
 724                    path->sink->power_check(path->sink)) {
 725                        power = 1;
 726                        break;
 727                }
 728        }
 729
 730        dapm_clear_walk(w->dapm);
 731
 732        return power;
 733}
 734
 735static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
 736                            struct snd_soc_dapm_widget *b,
 737                            int sort[])
 738{
 739        if (sort[a->id] != sort[b->id])
 740                return sort[a->id] - sort[b->id];
 741        if (a->reg != b->reg)
 742                return a->reg - b->reg;
 743        if (a->dapm != b->dapm)
 744                return (unsigned long)a->dapm - (unsigned long)b->dapm;
 745
 746        return 0;
 747}
 748
 749/* Insert a widget in order into a DAPM power sequence. */
 750static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget,
 751                            struct list_head *list,
 752                            int sort[])
 753{
 754        struct snd_soc_dapm_widget *w;
 755
 756        list_for_each_entry(w, list, power_list)
 757                if (dapm_seq_compare(new_widget, w, sort) < 0) {
 758                        list_add_tail(&new_widget->power_list, &w->power_list);
 759                        return;
 760                }
 761
 762        list_add_tail(&new_widget->power_list, list);
 763}
 764
 765static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm,
 766                                 struct snd_soc_dapm_widget *w, int event)
 767{
 768        struct snd_soc_card *card = dapm->card;
 769        const char *ev_name;
 770        int power, ret;
 771
 772        switch (event) {
 773        case SND_SOC_DAPM_PRE_PMU:
 774                ev_name = "PRE_PMU";
 775                power = 1;
 776                break;
 777        case SND_SOC_DAPM_POST_PMU:
 778                ev_name = "POST_PMU";
 779                power = 1;
 780                break;
 781        case SND_SOC_DAPM_PRE_PMD:
 782                ev_name = "PRE_PMD";
 783                power = 0;
 784                break;
 785        case SND_SOC_DAPM_POST_PMD:
 786                ev_name = "POST_PMD";
 787                power = 0;
 788                break;
 789        default:
 790                BUG();
 791                return;
 792        }
 793
 794        if (w->power != power)
 795                return;
 796
 797        if (w->event && (w->event_flags & event)) {
 798                pop_dbg(dapm->dev, card->pop_time, "pop test : %s %s\n",
 799                        w->name, ev_name);
 800                trace_snd_soc_dapm_widget_event_start(w, event);
 801                ret = w->event(w, NULL, event);
 802                trace_snd_soc_dapm_widget_event_done(w, event);
 803                if (ret < 0)
 804                        pr_err("%s: %s event failed: %d\n",
 805                               ev_name, w->name, ret);
 806        }
 807}
 808
 809/* Apply the coalesced changes from a DAPM sequence */
 810static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm,
 811                                   struct list_head *pending)
 812{
 813        struct snd_soc_card *card = dapm->card;
 814        struct snd_soc_dapm_widget *w;
 815        int reg, power;
 816        unsigned int value = 0;
 817        unsigned int mask = 0;
 818        unsigned int cur_mask;
 819
 820        reg = list_first_entry(pending, struct snd_soc_dapm_widget,
 821                               power_list)->reg;
 822
 823        list_for_each_entry(w, pending, power_list) {
 824                cur_mask = 1 << w->shift;
 825                BUG_ON(reg != w->reg);
 826
 827                if (w->invert)
 828                        power = !w->power;
 829                else
 830                        power = w->power;
 831
 832                mask |= cur_mask;
 833                if (power)
 834                        value |= cur_mask;
 835
 836                pop_dbg(dapm->dev, card->pop_time,
 837                        "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
 838                        w->name, reg, value, mask);
 839
 840                /* Check for events */
 841                dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMU);
 842                dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMD);
 843        }
 844
 845        if (reg >= 0) {
 846                pop_dbg(dapm->dev, card->pop_time,
 847                        "pop test : Applying 0x%x/0x%x to %x in %dms\n",
 848                        value, mask, reg, card->pop_time);
 849                pop_wait(card->pop_time);
 850                snd_soc_update_bits(dapm->codec, reg, mask, value);
 851        }
 852
 853        list_for_each_entry(w, pending, power_list) {
 854                dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMU);
 855                dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMD);
 856        }
 857}
 858
 859/* Apply a DAPM power sequence.
 860 *
 861 * We walk over a pre-sorted list of widgets to apply power to.  In
 862 * order to minimise the number of writes to the device required
 863 * multiple widgets will be updated in a single write where possible.
 864 * Currently anything that requires more than a single write is not
 865 * handled.
 866 */
 867static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
 868                         struct list_head *list, int event, int sort[])
 869{
 870        struct snd_soc_dapm_widget *w, *n;
 871        LIST_HEAD(pending);
 872        int cur_sort = -1;
 873        int cur_reg = SND_SOC_NOPM;
 874        struct snd_soc_dapm_context *cur_dapm = NULL;
 875        int ret;
 876
 877        list_for_each_entry_safe(w, n, list, power_list) {
 878                ret = 0;
 879
 880                /* Do we need to apply any queued changes? */
 881                if (sort[w->id] != cur_sort || w->reg != cur_reg ||
 882                    w->dapm != cur_dapm) {
 883                        if (!list_empty(&pending))
 884                                dapm_seq_run_coalesced(cur_dapm, &pending);
 885
 886                        INIT_LIST_HEAD(&pending);
 887                        cur_sort = -1;
 888                        cur_reg = SND_SOC_NOPM;
 889                        cur_dapm = NULL;
 890                }
 891
 892                switch (w->id) {
 893                case snd_soc_dapm_pre:
 894                        if (!w->event)
 895                                list_for_each_entry_safe_continue(w, n, list,
 896                                                                  power_list);
 897
 898                        if (event == SND_SOC_DAPM_STREAM_START)
 899                                ret = w->event(w,
 900                                               NULL, SND_SOC_DAPM_PRE_PMU);
 901                        else if (event == SND_SOC_DAPM_STREAM_STOP)
 902                                ret = w->event(w,
 903                                               NULL, SND_SOC_DAPM_PRE_PMD);
 904                        break;
 905
 906                case snd_soc_dapm_post:
 907                        if (!w->event)
 908                                list_for_each_entry_safe_continue(w, n, list,
 909                                                                  power_list);
 910
 911                        if (event == SND_SOC_DAPM_STREAM_START)
 912                                ret = w->event(w,
 913                                               NULL, SND_SOC_DAPM_POST_PMU);
 914                        else if (event == SND_SOC_DAPM_STREAM_STOP)
 915                                ret = w->event(w,
 916                                               NULL, SND_SOC_DAPM_POST_PMD);
 917                        break;
 918
 919                case snd_soc_dapm_input:
 920                case snd_soc_dapm_output:
 921                case snd_soc_dapm_hp:
 922                case snd_soc_dapm_mic:
 923                case snd_soc_dapm_line:
 924                case snd_soc_dapm_spk:
 925                        /* No register support currently */
 926                        ret = dapm_generic_apply_power(w);
 927                        break;
 928
 929                default:
 930                        /* Queue it up for application */
 931                        cur_sort = sort[w->id];
 932                        cur_reg = w->reg;
 933                        cur_dapm = w->dapm;
 934                        list_move(&w->power_list, &pending);
 935                        break;
 936                }
 937
 938                if (ret < 0)
 939                        dev_err(w->dapm->dev,
 940                                "Failed to apply widget power: %d\n", ret);
 941        }
 942
 943        if (!list_empty(&pending))
 944                dapm_seq_run_coalesced(cur_dapm, &pending);
 945}
 946
 947static void dapm_widget_update(struct snd_soc_dapm_context *dapm)
 948{
 949        struct snd_soc_dapm_update *update = dapm->update;
 950        struct snd_soc_dapm_widget *w;
 951        int ret;
 952
 953        if (!update)
 954                return;
 955
 956        w = update->widget;
 957
 958        if (w->event &&
 959            (w->event_flags & SND_SOC_DAPM_PRE_REG)) {
 960                ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG);
 961                if (ret != 0)
 962                        pr_err("%s DAPM pre-event failed: %d\n",
 963                               w->name, ret);
 964        }
 965
 966        ret = snd_soc_update_bits(w->codec, update->reg, update->mask,
 967                                  update->val);
 968        if (ret < 0)
 969                pr_err("%s DAPM update failed: %d\n", w->name, ret);
 970
 971        if (w->event &&
 972            (w->event_flags & SND_SOC_DAPM_POST_REG)) {
 973                ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG);
 974                if (ret != 0)
 975                        pr_err("%s DAPM post-event failed: %d\n",
 976                               w->name, ret);
 977        }
 978}
 979
 980
 981
 982/*
 983 * Scan each dapm widget for complete audio path.
 984 * A complete path is a route that has valid endpoints i.e.:-
 985 *
 986 *  o DAC to output pin.
 987 *  o Input Pin to ADC.
 988 *  o Input pin to Output pin (bypass, sidetone)
 989 *  o DAC to ADC (loopback).
 990 */
 991static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
 992{
 993        struct snd_soc_card *card = dapm->codec->card;
 994        struct snd_soc_dapm_widget *w;
 995        struct snd_soc_dapm_context *d;
 996        LIST_HEAD(up_list);
 997        LIST_HEAD(down_list);
 998        int ret = 0;
 999        int power;
1000
1001        trace_snd_soc_dapm_start(card);
1002
1003        list_for_each_entry(d, &card->dapm_list, list)
1004                if (d->n_widgets)
1005                        d->dev_power = 0;
1006
1007        /* Check which widgets we need to power and store them in
1008         * lists indicating if they should be powered up or down.
1009         */
1010        list_for_each_entry(w, &card->widgets, list) {
1011                switch (w->id) {
1012                case snd_soc_dapm_pre:
1013                        dapm_seq_insert(w, &down_list, dapm_down_seq);
1014                        break;
1015                case snd_soc_dapm_post:
1016                        dapm_seq_insert(w, &up_list, dapm_up_seq);
1017                        break;
1018
1019                default:
1020                        if (!w->power_check)
1021                                continue;
1022
1023                        if (!w->force)
1024                                power = w->power_check(w);
1025                        else
1026                                power = 1;
1027                        if (power)
1028                                w->dapm->dev_power = 1;
1029
1030                        if (w->power == power)
1031                                continue;
1032
1033                        trace_snd_soc_dapm_widget_power(w, power);
1034
1035                        if (power)
1036                                dapm_seq_insert(w, &up_list, dapm_up_seq);
1037                        else
1038                                dapm_seq_insert(w, &down_list, dapm_down_seq);
1039
1040                        w->power = power;
1041                        break;
1042                }
1043        }
1044
1045        /* If there are no DAPM widgets then try to figure out power from the
1046         * event type.
1047         */
1048        if (!dapm->n_widgets) {
1049                switch (event) {
1050                case SND_SOC_DAPM_STREAM_START:
1051                case SND_SOC_DAPM_STREAM_RESUME:
1052                        dapm->dev_power = 1;
1053                        break;
1054                case SND_SOC_DAPM_STREAM_STOP:
1055                        dapm->dev_power = !!dapm->codec->active;
1056                        break;
1057                case SND_SOC_DAPM_STREAM_SUSPEND:
1058                        dapm->dev_power = 0;
1059                        break;
1060                case SND_SOC_DAPM_STREAM_NOP:
1061                        switch (dapm->bias_level) {
1062                                case SND_SOC_BIAS_STANDBY:
1063                                case SND_SOC_BIAS_OFF:
1064                                        dapm->dev_power = 0;
1065                                        break;
1066                                default:
1067                                        dapm->dev_power = 1;
1068                                        break;
1069                        }
1070                        break;
1071                default:
1072                        break;
1073                }
1074        }
1075
1076        list_for_each_entry(d, &dapm->card->dapm_list, list) {
1077                if (d->dev_power && d->bias_level == SND_SOC_BIAS_OFF) {
1078                        ret = snd_soc_dapm_set_bias_level(card, d,
1079                                                          SND_SOC_BIAS_STANDBY);
1080                        if (ret != 0)
1081                                dev_err(d->dev,
1082                                        "Failed to turn on bias: %d\n", ret);
1083                }
1084
1085                /* If we're changing to all on or all off then prepare */
1086                if ((d->dev_power && d->bias_level == SND_SOC_BIAS_STANDBY) ||
1087                    (!d->dev_power && d->bias_level == SND_SOC_BIAS_ON)) {
1088                        ret = snd_soc_dapm_set_bias_level(card, d,
1089                                                          SND_SOC_BIAS_PREPARE);
1090                        if (ret != 0)
1091                                dev_err(d->dev,
1092                                        "Failed to prepare bias: %d\n", ret);
1093                }
1094        }
1095
1096        /* Power down widgets first; try to avoid amplifying pops. */
1097        dapm_seq_run(dapm, &down_list, event, dapm_down_seq);
1098
1099        dapm_widget_update(dapm);
1100
1101        /* Now power up. */
1102        dapm_seq_run(dapm, &up_list, event, dapm_up_seq);
1103
1104        list_for_each_entry(d, &dapm->card->dapm_list, list) {
1105                /* If we just powered the last thing off drop to standby bias */
1106                if (d->bias_level == SND_SOC_BIAS_PREPARE && !d->dev_power) {
1107                        ret = snd_soc_dapm_set_bias_level(card, d,
1108                                                          SND_SOC_BIAS_STANDBY);
1109                        if (ret != 0)
1110                                dev_err(d->dev,
1111                                        "Failed to apply standby bias: %d\n",
1112                                        ret);
1113                }
1114
1115                /* If we're in standby and can support bias off then do that */
1116                if (d->bias_level == SND_SOC_BIAS_STANDBY &&
1117                    d->idle_bias_off) {
1118                        ret = snd_soc_dapm_set_bias_level(card, d,
1119                                                          SND_SOC_BIAS_OFF);
1120                        if (ret != 0)
1121                                dev_err(d->dev,
1122                                        "Failed to turn off bias: %d\n", ret);
1123                }
1124
1125                /* If we just powered up then move to active bias */
1126                if (d->bias_level == SND_SOC_BIAS_PREPARE && d->dev_power) {
1127                        ret = snd_soc_dapm_set_bias_level(card, d,
1128                                                          SND_SOC_BIAS_ON);
1129                        if (ret != 0)
1130                                dev_err(d->dev,
1131                                        "Failed to apply active bias: %d\n",
1132                                        ret);
1133                }
1134        }
1135
1136        pop_dbg(dapm->dev, card->pop_time,
1137                "DAPM sequencing finished, waiting %dms\n", card->pop_time);
1138        pop_wait(card->pop_time);
1139
1140        trace_snd_soc_dapm_done(card);
1141
1142        return 0;
1143}
1144
1145#ifdef CONFIG_DEBUG_FS
1146static int dapm_widget_power_open_file(struct inode *inode, struct file *file)
1147{
1148        file->private_data = inode->i_private;
1149        return 0;
1150}
1151
1152static ssize_t dapm_widget_power_read_file(struct file *file,
1153                                           char __user *user_buf,
1154                                           size_t count, loff_t *ppos)
1155{
1156        struct snd_soc_dapm_widget *w = file->private_data;
1157        char *buf;
1158        int in, out;
1159        ssize_t ret;
1160        struct snd_soc_dapm_path *p = NULL;
1161
1162        buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1163        if (!buf)
1164                return -ENOMEM;
1165
1166        in = is_connected_input_ep(w);
1167        dapm_clear_walk(w->dapm);
1168        out = is_connected_output_ep(w);
1169        dapm_clear_walk(w->dapm);
1170
1171        ret = snprintf(buf, PAGE_SIZE, "%s: %s  in %d out %d",
1172                       w->name, w->power ? "On" : "Off", in, out);
1173
1174        if (w->reg >= 0)
1175                ret += snprintf(buf + ret, PAGE_SIZE - ret,
1176                                " - R%d(0x%x) bit %d",
1177                                w->reg, w->reg, w->shift);
1178
1179        ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
1180
1181        if (w->sname)
1182                ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n",
1183                                w->sname,
1184                                w->active ? "active" : "inactive");
1185
1186        list_for_each_entry(p, &w->sources, list_sink) {
1187                if (p->connected && !p->connected(w, p->sink))
1188                        continue;
1189
1190                if (p->connect)
1191                        ret += snprintf(buf + ret, PAGE_SIZE - ret,
1192                                        " in  %s %s\n",
1193                                        p->name ? p->name : "static",
1194                                        p->source->name);
1195        }
1196        list_for_each_entry(p, &w->sinks, list_source) {
1197                if (p->connected && !p->connected(w, p->sink))
1198                        continue;
1199
1200                if (p->connect)
1201                        ret += snprintf(buf + ret, PAGE_SIZE - ret,
1202                                        " out %s %s\n",
1203                                        p->name ? p->name : "static",
1204                                        p->sink->name);
1205        }
1206
1207        ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
1208
1209        kfree(buf);
1210        return ret;
1211}
1212
1213static const struct file_operations dapm_widget_power_fops = {
1214        .open = dapm_widget_power_open_file,
1215        .read = dapm_widget_power_read_file,
1216        .llseek = default_llseek,
1217};
1218
1219void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm)
1220{
1221        struct snd_soc_dapm_widget *w;
1222        struct dentry *d;
1223
1224        if (!dapm->debugfs_dapm)
1225                return;
1226
1227        list_for_each_entry(w, &dapm->card->widgets, list) {
1228                if (!w->name || w->dapm != dapm)
1229                        continue;
1230
1231                d = debugfs_create_file(w->name, 0444,
1232                                        dapm->debugfs_dapm, w,
1233                                        &dapm_widget_power_fops);
1234                if (!d)
1235                        dev_warn(w->dapm->dev,
1236                                "ASoC: Failed to create %s debugfs file\n",
1237                                w->name);
1238        }
1239}
1240#else
1241void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm)
1242{
1243}
1244#endif
1245
1246/* test and update the power status of a mux widget */
1247static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
1248                                 struct snd_kcontrol *kcontrol, int change,
1249                                 int mux, struct soc_enum *e)
1250{
1251        struct snd_soc_dapm_path *path;
1252        int found = 0;
1253
1254        if (widget->id != snd_soc_dapm_mux &&
1255            widget->id != snd_soc_dapm_virt_mux &&
1256            widget->id != snd_soc_dapm_value_mux)
1257                return -ENODEV;
1258
1259        if (!change)
1260                return 0;
1261
1262        /* find dapm widget path assoc with kcontrol */
1263        list_for_each_entry(path, &widget->dapm->card->paths, list) {
1264                if (path->kcontrol != kcontrol)
1265                        continue;
1266
1267                if (!path->name || !e->texts[mux])
1268                        continue;
1269
1270                found = 1;
1271                /* we now need to match the string in the enum to the path */
1272                if (!(strcmp(path->name, e->texts[mux])))
1273                        path->connect = 1; /* new connection */
1274                else
1275                        path->connect = 0; /* old connection must be powered down */
1276        }
1277
1278        if (found)
1279                dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
1280
1281        return 0;
1282}
1283
1284/* test and update the power status of a mixer or switch widget */
1285static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
1286                                   struct snd_kcontrol *kcontrol, int connect)
1287{
1288        struct snd_soc_dapm_path *path;
1289        int found = 0;
1290
1291        if (widget->id != snd_soc_dapm_mixer &&
1292            widget->id != snd_soc_dapm_mixer_named_ctl &&
1293            widget->id != snd_soc_dapm_switch)
1294                return -ENODEV;
1295
1296        /* find dapm widget path assoc with kcontrol */
1297        list_for_each_entry(path, &widget->dapm->card->paths, list) {
1298                if (path->kcontrol != kcontrol)
1299                        continue;
1300
1301                /* found, now check type */
1302                found = 1;
1303                path->connect = connect;
1304                break;
1305        }
1306
1307        if (found)
1308                dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
1309
1310        return 0;
1311}
1312
1313/* show dapm widget status in sys fs */
1314static ssize_t dapm_widget_show(struct device *dev,
1315        struct device_attribute *attr, char *buf)
1316{
1317        struct snd_soc_pcm_runtime *rtd =
1318                        container_of(dev, struct snd_soc_pcm_runtime, dev);
1319        struct snd_soc_codec *codec =rtd->codec;
1320        struct snd_soc_dapm_widget *w;
1321        int count = 0;
1322        char *state = "not set";
1323
1324        list_for_each_entry(w, &codec->card->widgets, list) {
1325                if (w->dapm != &codec->dapm)
1326                        continue;
1327
1328                /* only display widgets that burnm power */
1329                switch (w->id) {
1330                case snd_soc_dapm_hp:
1331                case snd_soc_dapm_mic:
1332                case snd_soc_dapm_spk:
1333                case snd_soc_dapm_line:
1334                case snd_soc_dapm_micbias:
1335                case snd_soc_dapm_dac:
1336                case snd_soc_dapm_adc:
1337                case snd_soc_dapm_pga:
1338                case snd_soc_dapm_out_drv:
1339                case snd_soc_dapm_mixer:
1340                case snd_soc_dapm_mixer_named_ctl:
1341                case snd_soc_dapm_supply:
1342                        if (w->name)
1343                                count += sprintf(buf + count, "%s: %s\n",
1344                                        w->name, w->power ? "On":"Off");
1345                break;
1346                default:
1347                break;
1348                }
1349        }
1350
1351        switch (codec->dapm.bias_level) {
1352        case SND_SOC_BIAS_ON:
1353                state = "On";
1354                break;
1355        case SND_SOC_BIAS_PREPARE:
1356                state = "Prepare";
1357                break;
1358        case SND_SOC_BIAS_STANDBY:
1359                state = "Standby";
1360                break;
1361        case SND_SOC_BIAS_OFF:
1362                state = "Off";
1363                break;
1364        }
1365        count += sprintf(buf + count, "PM State: %s\n", state);
1366
1367        return count;
1368}
1369
1370static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL);
1371
1372int snd_soc_dapm_sys_add(struct device *dev)
1373{
1374        return device_create_file(dev, &dev_attr_dapm_widget);
1375}
1376
1377static void snd_soc_dapm_sys_remove(struct device *dev)
1378{
1379        device_remove_file(dev, &dev_attr_dapm_widget);
1380}
1381
1382/* free all dapm widgets and resources */
1383static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
1384{
1385        struct snd_soc_dapm_widget *w, *next_w;
1386        struct snd_soc_dapm_path *p, *next_p;
1387
1388        list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
1389                if (w->dapm != dapm)
1390                        continue;
1391                list_del(&w->list);
1392                /*
1393                 * remove source and sink paths associated to this widget.
1394                 * While removing the path, remove reference to it from both
1395                 * source and sink widgets so that path is removed only once.
1396                 */
1397                list_for_each_entry_safe(p, next_p, &w->sources, list_sink) {
1398                        list_del(&p->list_sink);
1399                        list_del(&p->list_source);
1400                        list_del(&p->list);
1401                        kfree(p->long_name);
1402                        kfree(p);
1403                }
1404                list_for_each_entry_safe(p, next_p, &w->sinks, list_source) {
1405                        list_del(&p->list_sink);
1406                        list_del(&p->list_source);
1407                        list_del(&p->list);
1408                        kfree(p->long_name);
1409                        kfree(p);
1410                }
1411                kfree(w->name);
1412                kfree(w);
1413        }
1414}
1415
1416static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
1417                                const char *pin, int status)
1418{
1419        struct snd_soc_dapm_widget *w;
1420
1421        list_for_each_entry(w, &dapm->card->widgets, list) {
1422                if (w->dapm != dapm)
1423                        continue;
1424                if (!strcmp(w->name, pin)) {
1425                        dev_dbg(w->dapm->dev, "dapm: pin %s = %d\n",
1426                                pin, status);
1427                        w->connected = status;
1428                        /* Allow disabling of forced pins */
1429                        if (status == 0)
1430                                w->force = 0;
1431                        return 0;
1432                }
1433        }
1434
1435        dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
1436        return -EINVAL;
1437}
1438
1439/**
1440 * snd_soc_dapm_sync - scan and power dapm paths
1441 * @dapm: DAPM context
1442 *
1443 * Walks all dapm audio paths and powers widgets according to their
1444 * stream or path usage.
1445 *
1446 * Returns 0 for success.
1447 */
1448int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
1449{
1450        return dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
1451}
1452EXPORT_SYMBOL_GPL(snd_soc_dapm_sync);
1453
1454static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
1455                                  const struct snd_soc_dapm_route *route)
1456{
1457        struct snd_soc_dapm_path *path;
1458        struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
1459        struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL;
1460        const char *sink;
1461        const char *control = route->control;
1462        const char *source;
1463        char prefixed_sink[80];
1464        char prefixed_source[80];
1465        int ret = 0;
1466
1467        if (dapm->codec->name_prefix) {
1468                snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
1469                         dapm->codec->name_prefix, route->sink);
1470                sink = prefixed_sink;
1471                snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
1472                         dapm->codec->name_prefix, route->source);
1473                source = prefixed_source;
1474        } else {
1475                sink = route->sink;
1476                source = route->source;
1477        }
1478
1479        /*
1480         * find src and dest widgets over all widgets but favor a widget from
1481         * current DAPM context
1482         */
1483        list_for_each_entry(w, &dapm->card->widgets, list) {
1484                if (!wsink && !(strcmp(w->name, sink))) {
1485                        wtsink = w;
1486                        if (w->dapm == dapm)
1487                                wsink = w;
1488                        continue;
1489                }
1490                if (!wsource && !(strcmp(w->name, source))) {
1491                        wtsource = w;
1492                        if (w->dapm == dapm)
1493                                wsource = w;
1494                }
1495        }
1496        /* use widget from another DAPM context if not found from this */
1497        if (!wsink)
1498                wsink = wtsink;
1499        if (!wsource)
1500                wsource = wtsource;
1501
1502        if (wsource == NULL || wsink == NULL)
1503                return -ENODEV;
1504
1505        path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL);
1506        if (!path)
1507                return -ENOMEM;
1508
1509        path->source = wsource;
1510        path->sink = wsink;
1511        path->connected = route->connected;
1512        INIT_LIST_HEAD(&path->list);
1513        INIT_LIST_HEAD(&path->list_source);
1514        INIT_LIST_HEAD(&path->list_sink);
1515
1516        /* check for external widgets */
1517        if (wsink->id == snd_soc_dapm_input) {
1518                if (wsource->id == snd_soc_dapm_micbias ||
1519                        wsource->id == snd_soc_dapm_mic ||
1520                        wsource->id == snd_soc_dapm_line ||
1521                        wsource->id == snd_soc_dapm_output)
1522                        wsink->ext = 1;
1523        }
1524        if (wsource->id == snd_soc_dapm_output) {
1525                if (wsink->id == snd_soc_dapm_spk ||
1526                        wsink->id == snd_soc_dapm_hp ||
1527                        wsink->id == snd_soc_dapm_line ||
1528                        wsink->id == snd_soc_dapm_input)
1529                        wsource->ext = 1;
1530        }
1531
1532        /* connect static paths */
1533        if (control == NULL) {
1534                list_add(&path->list, &dapm->card->paths);
1535                list_add(&path->list_sink, &wsink->sources);
1536                list_add(&path->list_source, &wsource->sinks);
1537                path->connect = 1;
1538                return 0;
1539        }
1540
1541        /* connect dynamic paths */
1542        switch(wsink->id) {
1543        case snd_soc_dapm_adc:
1544        case snd_soc_dapm_dac:
1545        case snd_soc_dapm_pga:
1546        case snd_soc_dapm_out_drv:
1547        case snd_soc_dapm_input:
1548        case snd_soc_dapm_output:
1549        case snd_soc_dapm_micbias:
1550        case snd_soc_dapm_vmid:
1551        case snd_soc_dapm_pre:
1552        case snd_soc_dapm_post:
1553        case snd_soc_dapm_supply:
1554        case snd_soc_dapm_aif_in:
1555        case snd_soc_dapm_aif_out:
1556                list_add(&path->list, &dapm->card->paths);
1557                list_add(&path->list_sink, &wsink->sources);
1558                list_add(&path->list_source, &wsource->sinks);
1559                path->connect = 1;
1560                return 0;
1561        case snd_soc_dapm_mux:
1562        case snd_soc_dapm_virt_mux:
1563        case snd_soc_dapm_value_mux:
1564                ret = dapm_connect_mux(dapm, wsource, wsink, path, control,
1565                        &wsink->kcontrols[0]);
1566                if (ret != 0)
1567                        goto err;
1568                break;
1569        case snd_soc_dapm_switch:
1570        case snd_soc_dapm_mixer:
1571        case snd_soc_dapm_mixer_named_ctl:
1572                ret = dapm_connect_mixer(dapm, wsource, wsink, path, control);
1573                if (ret != 0)
1574                        goto err;
1575                break;
1576        case snd_soc_dapm_hp:
1577        case snd_soc_dapm_mic:
1578        case snd_soc_dapm_line:
1579        case snd_soc_dapm_spk:
1580                list_add(&path->list, &dapm->card->paths);
1581                list_add(&path->list_sink, &wsink->sources);
1582                list_add(&path->list_source, &wsource->sinks);
1583                path->connect = 0;
1584                return 0;
1585        }
1586        return 0;
1587
1588err:
1589        dev_warn(dapm->dev, "asoc: no dapm match for %s --> %s --> %s\n",
1590                 source, control, sink);
1591        kfree(path);
1592        return ret;
1593}
1594
1595/**
1596 * snd_soc_dapm_add_routes - Add routes between DAPM widgets
1597 * @dapm: DAPM context
1598 * @route: audio routes
1599 * @num: number of routes
1600 *
1601 * Connects 2 dapm widgets together via a named audio path. The sink is
1602 * the widget receiving the audio signal, whilst the source is the sender
1603 * of the audio signal.
1604 *
1605 * Returns 0 for success else error. On error all resources can be freed
1606 * with a call to snd_soc_card_free().
1607 */
1608int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
1609                            const struct snd_soc_dapm_route *route, int num)
1610{
1611        int i, ret;
1612
1613        for (i = 0; i < num; i++) {
1614                ret = snd_soc_dapm_add_route(dapm, route);
1615                if (ret < 0) {
1616                        dev_err(dapm->dev, "Failed to add route %s->%s\n",
1617                                route->source, route->sink);
1618                        return ret;
1619                }
1620                route++;
1621        }
1622
1623        return 0;
1624}
1625EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
1626
1627/**
1628 * snd_soc_dapm_new_widgets - add new dapm widgets
1629 * @dapm: DAPM context
1630 *
1631 * Checks the codec for any new dapm widgets and creates them if found.
1632 *
1633 * Returns 0 for success.
1634 */
1635int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
1636{
1637        struct snd_soc_dapm_widget *w;
1638        unsigned int val;
1639
1640        list_for_each_entry(w, &dapm->card->widgets, list)
1641        {
1642                if (w->new)
1643                        continue;
1644
1645                switch(w->id) {
1646                case snd_soc_dapm_switch:
1647                case snd_soc_dapm_mixer:
1648                case snd_soc_dapm_mixer_named_ctl:
1649                        w->power_check = dapm_generic_check_power;
1650                        dapm_new_mixer(dapm, w);
1651                        break;
1652                case snd_soc_dapm_mux:
1653                case snd_soc_dapm_virt_mux:
1654                case snd_soc_dapm_value_mux:
1655                        w->power_check = dapm_generic_check_power;
1656                        dapm_new_mux(dapm, w);
1657                        break;
1658                case snd_soc_dapm_adc:
1659                case snd_soc_dapm_aif_out:
1660                        w->power_check = dapm_adc_check_power;
1661                        break;
1662                case snd_soc_dapm_dac:
1663                case snd_soc_dapm_aif_in:
1664                        w->power_check = dapm_dac_check_power;
1665                        break;
1666                case snd_soc_dapm_pga:
1667                case snd_soc_dapm_out_drv:
1668                        w->power_check = dapm_generic_check_power;
1669                        dapm_new_pga(dapm, w);
1670                        break;
1671                case snd_soc_dapm_input:
1672                case snd_soc_dapm_output:
1673                case snd_soc_dapm_micbias:
1674                case snd_soc_dapm_spk:
1675                case snd_soc_dapm_hp:
1676                case snd_soc_dapm_mic:
1677                case snd_soc_dapm_line:
1678                        w->power_check = dapm_generic_check_power;
1679                        break;
1680                case snd_soc_dapm_supply:
1681                        w->power_check = dapm_supply_check_power;
1682                case snd_soc_dapm_vmid:
1683                case snd_soc_dapm_pre:
1684                case snd_soc_dapm_post:
1685                        break;
1686                }
1687
1688                /* Read the initial power state from the device */
1689                if (w->reg >= 0) {
1690                        val = snd_soc_read(w->codec, w->reg);
1691                        val &= 1 << w->shift;
1692                        if (w->invert)
1693                                val = !val;
1694
1695                        if (val)
1696                                w->power = 1;
1697                }
1698
1699                w->new = 1;
1700        }
1701
1702        dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
1703        return 0;
1704}
1705EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
1706
1707/**
1708 * snd_soc_dapm_get_volsw - dapm mixer get callback
1709 * @kcontrol: mixer control
1710 * @ucontrol: control element information
1711 *
1712 * Callback to get the value of a dapm mixer control.
1713 *
1714 * Returns 0 for success.
1715 */
1716int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
1717        struct snd_ctl_elem_value *ucontrol)
1718{
1719        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1720        struct soc_mixer_control *mc =
1721                (struct soc_mixer_control *)kcontrol->private_value;
1722        unsigned int reg = mc->reg;
1723        unsigned int shift = mc->shift;
1724        unsigned int rshift = mc->rshift;
1725        int max = mc->max;
1726        unsigned int invert = mc->invert;
1727        unsigned int mask = (1 << fls(max)) - 1;
1728
1729        ucontrol->value.integer.value[0] =
1730                (snd_soc_read(widget->codec, reg) >> shift) & mask;
1731        if (shift != rshift)
1732                ucontrol->value.integer.value[1] =
1733                        (snd_soc_read(widget->codec, reg) >> rshift) & mask;
1734        if (invert) {
1735                ucontrol->value.integer.value[0] =
1736                        max - ucontrol->value.integer.value[0];
1737                if (shift != rshift)
1738                        ucontrol->value.integer.value[1] =
1739                                max - ucontrol->value.integer.value[1];
1740        }
1741
1742        return 0;
1743}
1744EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
1745
1746/**
1747 * snd_soc_dapm_put_volsw - dapm mixer set callback
1748 * @kcontrol: mixer control
1749 * @ucontrol: control element information
1750 *
1751 * Callback to set the value of a dapm mixer control.
1752 *
1753 * Returns 0 for success.
1754 */
1755int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
1756        struct snd_ctl_elem_value *ucontrol)
1757{
1758        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1759        struct soc_mixer_control *mc =
1760                (struct soc_mixer_control *)kcontrol->private_value;
1761        unsigned int reg = mc->reg;
1762        unsigned int shift = mc->shift;
1763        int max = mc->max;
1764        unsigned int mask = (1 << fls(max)) - 1;
1765        unsigned int invert = mc->invert;
1766        unsigned int val;
1767        int connect, change;
1768        struct snd_soc_dapm_update update;
1769
1770        val = (ucontrol->value.integer.value[0] & mask);
1771
1772        if (invert)
1773                val = max - val;
1774        mask = mask << shift;
1775        val = val << shift;
1776
1777        mutex_lock(&widget->codec->mutex);
1778        widget->value = val;
1779
1780        change = snd_soc_test_bits(widget->codec, reg, mask, val);
1781        if (change) {
1782                if (val)
1783                        /* new connection */
1784                        connect = invert ? 0:1;
1785                else
1786                        /* old connection must be powered down */
1787                        connect = invert ? 1:0;
1788
1789                update.kcontrol = kcontrol;
1790                update.widget = widget;
1791                update.reg = reg;
1792                update.mask = mask;
1793                update.val = val;
1794                widget->dapm->update = &update;
1795
1796                dapm_mixer_update_power(widget, kcontrol, connect);
1797
1798                widget->dapm->update = NULL;
1799        }
1800
1801        mutex_unlock(&widget->codec->mutex);
1802        return 0;
1803}
1804EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
1805
1806/**
1807 * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
1808 * @kcontrol: mixer control
1809 * @ucontrol: control element information
1810 *
1811 * Callback to get the value of a dapm enumerated double mixer control.
1812 *
1813 * Returns 0 for success.
1814 */
1815int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
1816        struct snd_ctl_elem_value *ucontrol)
1817{
1818        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1819        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1820        unsigned int val, bitmask;
1821
1822        for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
1823                ;
1824        val = snd_soc_read(widget->codec, e->reg);
1825        ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
1826        if (e->shift_l != e->shift_r)
1827                ucontrol->value.enumerated.item[1] =
1828                        (val >> e->shift_r) & (bitmask - 1);
1829
1830        return 0;
1831}
1832EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
1833
1834/**
1835 * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
1836 * @kcontrol: mixer control
1837 * @ucontrol: control element information
1838 *
1839 * Callback to set the value of a dapm enumerated double mixer control.
1840 *
1841 * Returns 0 for success.
1842 */
1843int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
1844        struct snd_ctl_elem_value *ucontrol)
1845{
1846        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1847        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1848        unsigned int val, mux, change;
1849        unsigned int mask, bitmask;
1850        struct snd_soc_dapm_update update;
1851
1852        for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
1853                ;
1854        if (ucontrol->value.enumerated.item[0] > e->max - 1)
1855                return -EINVAL;
1856        mux = ucontrol->value.enumerated.item[0];
1857        val = mux << e->shift_l;
1858        mask = (bitmask - 1) << e->shift_l;
1859        if (e->shift_l != e->shift_r) {
1860                if (ucontrol->value.enumerated.item[1] > e->max - 1)
1861                        return -EINVAL;
1862                val |= ucontrol->value.enumerated.item[1] << e->shift_r;
1863                mask |= (bitmask - 1) << e->shift_r;
1864        }
1865
1866        mutex_lock(&widget->codec->mutex);
1867        widget->value = val;
1868        change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
1869
1870        update.kcontrol = kcontrol;
1871        update.widget = widget;
1872        update.reg = e->reg;
1873        update.mask = mask;
1874        update.val = val;
1875        widget->dapm->update = &update;
1876
1877        dapm_mux_update_power(widget, kcontrol, change, mux, e);
1878
1879        widget->dapm->update = NULL;
1880
1881        mutex_unlock(&widget->codec->mutex);
1882        return change;
1883}
1884EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
1885
1886/**
1887 * snd_soc_dapm_get_enum_virt - Get virtual DAPM mux
1888 * @kcontrol: mixer control
1889 * @ucontrol: control element information
1890 *
1891 * Returns 0 for success.
1892 */
1893int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol,
1894                               struct snd_ctl_elem_value *ucontrol)
1895{
1896        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1897
1898        ucontrol->value.enumerated.item[0] = widget->value;
1899
1900        return 0;
1901}
1902EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_virt);
1903
1904/**
1905 * snd_soc_dapm_put_enum_virt - Set virtual DAPM mux
1906 * @kcontrol: mixer control
1907 * @ucontrol: control element information
1908 *
1909 * Returns 0 for success.
1910 */
1911int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
1912                               struct snd_ctl_elem_value *ucontrol)
1913{
1914        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1915        struct soc_enum *e =
1916                (struct soc_enum *)kcontrol->private_value;
1917        int change;
1918        int ret = 0;
1919
1920        if (ucontrol->value.enumerated.item[0] >= e->max)
1921                return -EINVAL;
1922
1923        mutex_lock(&widget->codec->mutex);
1924
1925        change = widget->value != ucontrol->value.enumerated.item[0];
1926        widget->value = ucontrol->value.enumerated.item[0];
1927        dapm_mux_update_power(widget, kcontrol, change, widget->value, e);
1928
1929        mutex_unlock(&widget->codec->mutex);
1930        return ret;
1931}
1932EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
1933
1934/**
1935 * snd_soc_dapm_get_value_enum_double - dapm semi enumerated double mixer get
1936 *                                      callback
1937 * @kcontrol: mixer control
1938 * @ucontrol: control element information
1939 *
1940 * Callback to get the value of a dapm semi enumerated double mixer control.
1941 *
1942 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1943 * used for handling bitfield coded enumeration for example.
1944 *
1945 * Returns 0 for success.
1946 */
1947int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
1948        struct snd_ctl_elem_value *ucontrol)
1949{
1950        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1951        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1952        unsigned int reg_val, val, mux;
1953
1954        reg_val = snd_soc_read(widget->codec, e->reg);
1955        val = (reg_val >> e->shift_l) & e->mask;
1956        for (mux = 0; mux < e->max; mux++) {
1957                if (val == e->values[mux])
1958                        break;
1959        }
1960        ucontrol->value.enumerated.item[0] = mux;
1961        if (e->shift_l != e->shift_r) {
1962                val = (reg_val >> e->shift_r) & e->mask;
1963                for (mux = 0; mux < e->max; mux++) {
1964                        if (val == e->values[mux])
1965                                break;
1966                }
1967                ucontrol->value.enumerated.item[1] = mux;
1968        }
1969
1970        return 0;
1971}
1972EXPORT_SYMBOL_GPL(snd_soc_dapm_get_value_enum_double);
1973
1974/**
1975 * snd_soc_dapm_put_value_enum_double - dapm semi enumerated double mixer set
1976 *                                      callback
1977 * @kcontrol: mixer control
1978 * @ucontrol: control element information
1979 *
1980 * Callback to set the value of a dapm semi enumerated double mixer control.
1981 *
1982 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1983 * used for handling bitfield coded enumeration for example.
1984 *
1985 * Returns 0 for success.
1986 */
1987int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
1988        struct snd_ctl_elem_value *ucontrol)
1989{
1990        struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
1991        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1992        unsigned int val, mux, change;
1993        unsigned int mask;
1994        struct snd_soc_dapm_update update;
1995
1996        if (ucontrol->value.enumerated.item[0] > e->max - 1)
1997                return -EINVAL;
1998        mux = ucontrol->value.enumerated.item[0];
1999        val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
2000        mask = e->mask << e->shift_l;
2001        if (e->shift_l != e->shift_r) {
2002                if (ucontrol->value.enumerated.item[1] > e->max - 1)
2003                        return -EINVAL;
2004                val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
2005                mask |= e->mask << e->shift_r;
2006        }
2007
2008        mutex_lock(&widget->codec->mutex);
2009        widget->value = val;
2010        change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
2011
2012        update.kcontrol = kcontrol;
2013        update.widget = widget;
2014        update.reg = e->reg;
2015        update.mask = mask;
2016        update.val = val;
2017        widget->dapm->update = &update;
2018
2019        dapm_mux_update_power(widget, kcontrol, change, mux, e);
2020
2021        widget->dapm->update = NULL;
2022
2023        mutex_unlock(&widget->codec->mutex);
2024        return change;
2025}
2026EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double);
2027
2028/**
2029 * snd_soc_dapm_info_pin_switch - Info for a pin switch
2030 *
2031 * @kcontrol: mixer control
2032 * @uinfo: control element information
2033 *
2034 * Callback to provide information about a pin switch control.
2035 */
2036int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
2037                                 struct snd_ctl_elem_info *uinfo)
2038{
2039        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2040        uinfo->count = 1;
2041        uinfo->value.integer.min = 0;
2042        uinfo->value.integer.max = 1;
2043
2044        return 0;
2045}
2046EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch);
2047
2048/**
2049 * snd_soc_dapm_get_pin_switch - Get information for a pin switch
2050 *
2051 * @kcontrol: mixer control
2052 * @ucontrol: Value
2053 */
2054int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
2055                                struct snd_ctl_elem_value *ucontrol)
2056{
2057        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
2058        const char *pin = (const char *)kcontrol->private_value;
2059
2060        mutex_lock(&codec->mutex);
2061
2062        ucontrol->value.integer.value[0] =
2063                snd_soc_dapm_get_pin_status(&codec->dapm, pin);
2064
2065        mutex_unlock(&codec->mutex);
2066
2067        return 0;
2068}
2069EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch);
2070
2071/**
2072 * snd_soc_dapm_put_pin_switch - Set information for a pin switch
2073 *
2074 * @kcontrol: mixer control
2075 * @ucontrol: Value
2076 */
2077int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
2078                                struct snd_ctl_elem_value *ucontrol)
2079{
2080        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
2081        const char *pin = (const char *)kcontrol->private_value;
2082
2083        mutex_lock(&codec->mutex);
2084
2085        if (ucontrol->value.integer.value[0])
2086                snd_soc_dapm_enable_pin(&codec->dapm, pin);
2087        else
2088                snd_soc_dapm_disable_pin(&codec->dapm, pin);
2089
2090        snd_soc_dapm_sync(&codec->dapm);
2091
2092        mutex_unlock(&codec->mutex);
2093
2094        return 0;
2095}
2096EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
2097
2098/**
2099 * snd_soc_dapm_new_control - create new dapm control
2100 * @dapm: DAPM context
2101 * @widget: widget template
2102 *
2103 * Creates a new dapm control based upon the template.
2104 *
2105 * Returns 0 for success else error.
2106 */
2107int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
2108        const struct snd_soc_dapm_widget *widget)
2109{
2110        struct snd_soc_dapm_widget *w;
2111        size_t name_len;
2112
2113        if ((w = dapm_cnew_widget(widget)) == NULL)
2114                return -ENOMEM;
2115
2116        name_len = strlen(widget->name) + 1;
2117        if (dapm->codec->name_prefix)
2118                name_len += 1 + strlen(dapm->codec->name_prefix);
2119        w->name = kmalloc(name_len, GFP_KERNEL);
2120        if (w->name == NULL) {
2121                kfree(w);
2122                return -ENOMEM;
2123        }
2124        if (dapm->codec->name_prefix)
2125                snprintf(w->name, name_len, "%s %s",
2126                        dapm->codec->name_prefix, widget->name);
2127        else
2128                snprintf(w->name, name_len, "%s", widget->name);
2129
2130        dapm->n_widgets++;
2131        w->dapm = dapm;
2132        w->codec = dapm->codec;
2133        INIT_LIST_HEAD(&w->sources);
2134        INIT_LIST_HEAD(&w->sinks);
2135        INIT_LIST_HEAD(&w->list);
2136        list_add(&w->list, &dapm->card->widgets);
2137
2138        /* machine layer set ups unconnected pins and insertions */
2139        w->connected = 1;
2140        return 0;
2141}
2142EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control);
2143
2144/**
2145 * snd_soc_dapm_new_controls - create new dapm controls
2146 * @dapm: DAPM context
2147 * @widget: widget array
2148 * @num: number of widgets
2149 *
2150 * Creates new DAPM controls based upon the templates.
2151 *
2152 * Returns 0 for success else error.
2153 */
2154int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
2155        const struct snd_soc_dapm_widget *widget,
2156        int num)
2157{
2158        int i, ret;
2159
2160        for (i = 0; i < num; i++) {
2161                ret = snd_soc_dapm_new_control(dapm, widget);
2162                if (ret < 0) {
2163                        dev_err(dapm->dev,
2164                                "ASoC: Failed to create DAPM control %s: %d\n",
2165                                widget->name, ret);
2166                        return ret;
2167                }
2168                widget++;
2169        }
2170        return 0;
2171}
2172EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
2173
2174static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm,
2175        const char *stream, int event)
2176{
2177        struct snd_soc_dapm_widget *w;
2178
2179        list_for_each_entry(w, &dapm->card->widgets, list)
2180        {
2181                if (!w->sname || w->dapm != dapm)
2182                        continue;
2183                dev_dbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n",
2184                        w->name, w->sname, stream, event);
2185                if (strstr(w->sname, stream)) {
2186                        switch(event) {
2187                        case SND_SOC_DAPM_STREAM_START:
2188                                w->active = 1;
2189                                break;
2190                        case SND_SOC_DAPM_STREAM_STOP:
2191                                w->active = 0;
2192                                break;
2193                        case SND_SOC_DAPM_STREAM_SUSPEND:
2194                        case SND_SOC_DAPM_STREAM_RESUME:
2195                        case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
2196                        case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
2197                                break;
2198                        }
2199                }
2200        }
2201
2202        dapm_power_widgets(dapm, event);
2203}
2204
2205/**
2206 * snd_soc_dapm_stream_event - send a stream event to the dapm core
2207 * @rtd: PCM runtime data
2208 * @stream: stream name
2209 * @event: stream event
2210 *
2211 * Sends a stream event to the dapm core. The core then makes any
2212 * necessary widget power changes.
2213 *
2214 * Returns 0 for success else error.
2215 */
2216int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
2217        const char *stream, int event)
2218{
2219        struct snd_soc_codec *codec = rtd->codec;
2220
2221        if (stream == NULL)
2222                return 0;
2223
2224        mutex_lock(&codec->mutex);
2225        soc_dapm_stream_event(&codec->dapm, stream, event);
2226        mutex_unlock(&codec->mutex);
2227        return 0;
2228}
2229EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event);
2230
2231/**
2232 * snd_soc_dapm_enable_pin - enable pin.
2233 * @dapm: DAPM context
2234 * @pin: pin name
2235 *
2236 * Enables input/output pin and its parents or children widgets iff there is
2237 * a valid audio route and active audio stream.
2238 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2239 * do any widget power switching.
2240 */
2241int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
2242{
2243        return snd_soc_dapm_set_pin(dapm, pin, 1);
2244}
2245EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
2246
2247/**
2248 * snd_soc_dapm_force_enable_pin - force a pin to be enabled
2249 * @dapm: DAPM context
2250 * @pin: pin name
2251 *
2252 * Enables input/output pin regardless of any other state.  This is
2253 * intended for use with microphone bias supplies used in microphone
2254 * jack detection.
2255 *
2256 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2257 * do any widget power switching.
2258 */
2259int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
2260                                  const char *pin)
2261{
2262        struct snd_soc_dapm_widget *w;
2263
2264        list_for_each_entry(w, &dapm->card->widgets, list) {
2265                if (w->dapm != dapm)
2266                        continue;
2267                if (!strcmp(w->name, pin)) {
2268                        dev_dbg(w->dapm->dev,
2269                                "dapm: force enable pin %s\n", pin);
2270                        w->connected = 1;
2271                        w->force = 1;
2272                        return 0;
2273                }
2274        }
2275
2276        dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
2277        return -EINVAL;
2278}
2279EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
2280
2281/**
2282 * snd_soc_dapm_disable_pin - disable pin.
2283 * @dapm: DAPM context
2284 * @pin: pin name
2285 *
2286 * Disables input/output pin and its parents or children widgets.
2287 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2288 * do any widget power switching.
2289 */
2290int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
2291                             const char *pin)
2292{
2293        return snd_soc_dapm_set_pin(dapm, pin, 0);
2294}
2295EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
2296
2297/**
2298 * snd_soc_dapm_nc_pin - permanently disable pin.
2299 * @dapm: DAPM context
2300 * @pin: pin name
2301 *
2302 * Marks the specified pin as being not connected, disabling it along
2303 * any parent or child widgets.  At present this is identical to
2304 * snd_soc_dapm_disable_pin() but in future it will be extended to do
2305 * additional things such as disabling controls which only affect
2306 * paths through the pin.
2307 *
2308 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2309 * do any widget power switching.
2310 */
2311int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin)
2312{
2313        return snd_soc_dapm_set_pin(dapm, pin, 0);
2314}
2315EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin);
2316
2317/**
2318 * snd_soc_dapm_get_pin_status - get audio pin status
2319 * @dapm: DAPM context
2320 * @pin: audio signal pin endpoint (or start point)
2321 *
2322 * Get audio pin status - connected or disconnected.
2323 *
2324 * Returns 1 for connected otherwise 0.
2325 */
2326int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
2327                                const char *pin)
2328{
2329        struct snd_soc_dapm_widget *w;
2330
2331        list_for_each_entry(w, &dapm->card->widgets, list) {
2332                if (w->dapm != dapm)
2333                        continue;
2334                if (!strcmp(w->name, pin))
2335                        return w->connected;
2336        }
2337
2338        return 0;
2339}
2340EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
2341
2342/**
2343 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
2344 * @dapm: DAPM context
2345 * @pin: audio signal pin endpoint (or start point)
2346 *
2347 * Mark the given endpoint or pin as ignoring suspend.  When the
2348 * system is disabled a path between two endpoints flagged as ignoring
2349 * suspend will not be disabled.  The path must already be enabled via
2350 * normal means at suspend time, it will not be turned on if it was not
2351 * already enabled.
2352 */
2353int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
2354                                const char *pin)
2355{
2356        struct snd_soc_dapm_widget *w;
2357
2358        list_for_each_entry(w, &dapm->card->widgets, list) {
2359                if (w->dapm != dapm)
2360                        continue;
2361                if (!strcmp(w->name, pin)) {
2362                        w->ignore_suspend = 1;
2363                        return 0;
2364                }
2365        }
2366
2367        dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
2368        return -EINVAL;
2369}
2370EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
2371
2372/**
2373 * snd_soc_dapm_free - free dapm resources
2374 * @card: SoC device
2375 *
2376 * Free all dapm widgets and resources.
2377 */
2378void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
2379{
2380        snd_soc_dapm_sys_remove(dapm->dev);
2381        dapm_free_widgets(dapm);
2382        list_del(&dapm->list);
2383}
2384EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
2385
2386static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
2387{
2388        struct snd_soc_dapm_widget *w;
2389        LIST_HEAD(down_list);
2390        int powerdown = 0;
2391
2392        list_for_each_entry(w, &dapm->card->widgets, list) {
2393                if (w->dapm != dapm)
2394                        continue;
2395                if (w->power) {
2396                        dapm_seq_insert(w, &down_list, dapm_down_seq);
2397                        w->power = 0;
2398                        powerdown = 1;
2399                }
2400        }
2401
2402        /* If there were no widgets to power down we're already in
2403         * standby.
2404         */
2405        if (powerdown) {
2406                snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_PREPARE);
2407                dapm_seq_run(dapm, &down_list, 0, dapm_down_seq);
2408                snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_STANDBY);
2409        }
2410}
2411
2412/*
2413 * snd_soc_dapm_shutdown - callback for system shutdown
2414 */
2415void snd_soc_dapm_shutdown(struct snd_soc_card *card)
2416{
2417        struct snd_soc_codec *codec;
2418
2419        list_for_each_entry(codec, &card->codec_dev_list, list) {
2420                soc_dapm_shutdown_codec(&codec->dapm);
2421                snd_soc_dapm_set_bias_level(card, &codec->dapm, SND_SOC_BIAS_OFF);
2422        }
2423}
2424
2425/* Module information */
2426MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
2427MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
2428MODULE_LICENSE("GPL");
2429