Merge branch 'for-2.6.37' into for-2.6.38
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 13 Dec 2010 16:48:38 +0000 (16:48 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 13 Dec 2010 16:48:38 +0000 (16:48 +0000)
1  2 
sound/soc/soc-dapm.c

diff --combined sound/soc/soc-dapm.c
  #include <sound/core.h>
  #include <sound/pcm.h>
  #include <sound/pcm_params.h>
 -#include <sound/soc-dapm.h>
 +#include <sound/soc.h>
  #include <sound/initval.h>
  
 +#include <trace/events/asoc.h>
 +
  /* dapm power sequences - make this per codec in the future */
  static int dapm_up_seq[] = {
        [snd_soc_dapm_pre] = 0,
@@@ -92,24 -90,17 +92,24 @@@ static void pop_wait(u32 pop_time
                schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
  }
  
 -static void pop_dbg(u32 pop_time, const char *fmt, ...)
 +static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...)
  {
        va_list args;
 +      char *buf;
  
 -      va_start(args, fmt);
 +      if (!pop_time)
 +              return;
  
 -      if (pop_time) {
 -              vprintk(fmt, args);
 -      }
 +      buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
 +      if (buf == NULL)
 +              return;
  
 +      va_start(args, fmt);
 +      vsnprintf(buf, PAGE_SIZE, fmt, args);
 +      dev_info(dev, buf);
        va_end(args);
 +
 +      kfree(buf);
  }
  
  /* create a new dapm widget */
@@@ -129,46 -120,37 +129,46 @@@ static inline struct snd_soc_dapm_widge
   * Returns 0 for success else error.
   */
  static int snd_soc_dapm_set_bias_level(struct snd_soc_card *card,
 -              struct snd_soc_codec *codec, enum snd_soc_bias_level level)
 +                                     struct snd_soc_dapm_context *dapm,
 +                                     enum snd_soc_bias_level level)
  {
        int ret = 0;
  
        switch (level) {
        case SND_SOC_BIAS_ON:
 -              dev_dbg(codec->dev, "Setting full bias\n");
 +              dev_dbg(dapm->dev, "Setting full bias\n");
                break;
        case SND_SOC_BIAS_PREPARE:
 -              dev_dbg(codec->dev, "Setting bias prepare\n");
 +              dev_dbg(dapm->dev, "Setting bias prepare\n");
                break;
        case SND_SOC_BIAS_STANDBY:
 -              dev_dbg(codec->dev, "Setting standby bias\n");
 +              dev_dbg(dapm->dev, "Setting standby bias\n");
                break;
        case SND_SOC_BIAS_OFF:
 -              dev_dbg(codec->dev, "Setting bias off\n");
 +              dev_dbg(dapm->dev, "Setting bias off\n");
                break;
        default:
 -              dev_err(codec->dev, "Setting invalid bias %d\n", level);
 +              dev_err(dapm->dev, "Setting invalid bias %d\n", level);
                return -EINVAL;
        }
  
 +      trace_snd_soc_bias_level_start(card, level);
 +
        if (card && card->set_bias_level)
                ret = card->set_bias_level(card, level);
        if (ret == 0) {
 -              if (codec->driver->set_bias_level)
 -                      ret = codec->driver->set_bias_level(codec, level);
 +              if (dapm->codec && dapm->codec->driver->set_bias_level)
 +                      ret = dapm->codec->driver->set_bias_level(dapm->codec, level);
                else
 -                      codec->bias_level = level;
 +                      dapm->bias_level = level;
 +      }
 +      if (ret == 0) {
 +              if (card && card->set_bias_level_post)
 +                      ret = card->set_bias_level_post(card, level);
        }
  
 +      trace_snd_soc_bias_level_done(card, level);
 +
        return ret;
  }
  
@@@ -259,7 -241,7 +259,7 @@@ static void dapm_set_path_status(struc
  }
  
  /* connect mux widget to its interconnecting audio paths */
 -static int dapm_connect_mux(struct snd_soc_codec *codec,
 +static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
        struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
        struct snd_soc_dapm_path *path, const char *control_name,
        const struct snd_kcontrol_new *kcontrol)
  
        for (i = 0; i < e->max; i++) {
                if (!(strcmp(control_name, e->texts[i]))) {
 -                      list_add(&path->list, &codec->dapm_paths);
 +                      list_add(&path->list, &dapm->paths);
                        list_add(&path->list_sink, &dest->sources);
                        list_add(&path->list_source, &src->sinks);
                        path->name = (char*)e->texts[i];
  }
  
  /* connect mixer widget to its interconnecting audio paths */
 -static int dapm_connect_mixer(struct snd_soc_codec *codec,
 +static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
        struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
        struct snd_soc_dapm_path *path, const char *control_name)
  {
        /* search for mixer kcontrol */
        for (i = 0; i < dest->num_kcontrols; i++) {
                if (!strcmp(control_name, dest->kcontrols[i].name)) {
 -                      list_add(&path->list, &codec->dapm_paths);
 +                      list_add(&path->list, &dapm->paths);
                        list_add(&path->list_sink, &dest->sources);
                        list_add(&path->list_source, &src->sinks);
                        path->name = dest->kcontrols[i].name;
@@@ -308,8 -290,6 +308,8 @@@ static int dapm_update_bits(struct snd_
        int change, power;
        unsigned int old, new;
        struct snd_soc_codec *codec = widget->codec;
 +      struct snd_soc_dapm_context *dapm = widget->dapm;
 +      struct snd_soc_card *card = dapm->card;
  
        /* check for valid widgets */
        if (widget->reg < 0 || widget->id == snd_soc_dapm_input ||
  
        change = old != new;
        if (change) {
 -              pop_dbg(codec->pop_time, "pop test %s : %s in %d ms\n",
 +              pop_dbg(dapm->dev, card->pop_time,
 +                      "pop test %s : %s in %d ms\n",
                        widget->name, widget->power ? "on" : "off",
 -                      codec->pop_time);
 -              pop_wait(codec->pop_time);
 +                      card->pop_time);
 +              pop_wait(card->pop_time);
                snd_soc_write(codec, widget->reg, new);
        }
 -      pr_debug("reg %x old %x new %x change %d\n", widget->reg,
 -               old, new, change);
 +      dev_dbg(dapm->dev, "reg %x old %x new %x change %d\n", widget->reg,
 +              old, new, change);
        return change;
  }
  
  /* create new dapm mixer control */
 -static int dapm_new_mixer(struct snd_soc_codec *codec,
 +static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
        struct snd_soc_dapm_widget *w)
  {
        int i, ret = 0;
        size_t name_len;
        struct snd_soc_dapm_path *path;
 +      struct snd_card *card = dapm->codec->card->snd_card;
  
        /* add kcontrol */
        for (i = 0; i < w->num_kcontrols; i++) {
  
                        path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
                                path->long_name);
 -                      ret = snd_ctl_add(codec->card->snd_card, path->kcontrol);
 +                      ret = snd_ctl_add(card, path->kcontrol);
                        if (ret < 0) {
 -                              printk(KERN_ERR "asoc: failed to add dapm kcontrol %s: %d\n",
 -                                     path->long_name,
 -                                     ret);
 +                              dev_err(dapm->dev,
 +                                      "asoc: failed to add dapm kcontrol %s: %d\n",
 +                                      path->long_name, ret);
                                kfree(path->long_name);
                                path->long_name = NULL;
                                return ret;
  }
  
  /* create new dapm mux control */
 -static int dapm_new_mux(struct snd_soc_codec *codec,
 +static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
        struct snd_soc_dapm_widget *w)
  {
        struct snd_soc_dapm_path *path = NULL;
        struct snd_kcontrol *kcontrol;
 +      struct snd_card *card = dapm->codec->card->snd_card;
        int ret = 0;
  
        if (!w->num_kcontrols) {
 -              printk(KERN_ERR "asoc: mux %s has no controls\n", w->name);
 +              dev_err(dapm->dev, "asoc: mux %s has no controls\n", w->name);
                return -EINVAL;
        }
  
        kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name);
 -      ret = snd_ctl_add(codec->card->snd_card, kcontrol);
 +      ret = snd_ctl_add(card, kcontrol);
 +
        if (ret < 0)
                goto err;
  
        return ret;
  
  err:
 -      printk(KERN_ERR "asoc: failed to add kcontrol %s\n", w->name);
 +      dev_err(dapm->dev, "asoc: failed to add kcontrol %s\n", w->name);
        return ret;
  }
  
  /* create new dapm volume control */
 -static int dapm_new_pga(struct snd_soc_codec *codec,
 +static int dapm_new_pga(struct snd_soc_dapm_context *dapm,
        struct snd_soc_dapm_widget *w)
  {
        if (w->num_kcontrols)
 -              pr_err("asoc: PGA controls not supported: '%s'\n", w->name);
 +              dev_err(w->dapm->dev,
 +                      "asoc: PGA controls not supported: '%s'\n", w->name);
  
        return 0;
  }
  
  /* reset 'walked' bit for each dapm path */
 -static inline void dapm_clear_walk(struct snd_soc_codec *codec)
 +static inline void dapm_clear_walk(struct snd_soc_dapm_context *dapm)
  {
        struct snd_soc_dapm_path *p;
  
 -      list_for_each_entry(p, &codec->dapm_paths, list)
 +      list_for_each_entry(p, &dapm->paths, list)
                p->walked = 0;
  }
  
   */
  static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
  {
 -      int level = snd_power_get_state(widget->codec->card->snd_card);
 +      int level = snd_power_get_state(widget->dapm->codec->card->snd_card);
  
        switch (level) {
        case SNDRV_CTL_POWER_D3hot:
        case SNDRV_CTL_POWER_D3cold:
                if (widget->ignore_suspend)
 -                      pr_debug("%s ignoring suspend\n", widget->name);
 +                      dev_dbg(widget->dapm->dev, "%s ignoring suspend\n",
 +                              widget->name);
                return widget->ignore_suspend;
        default:
                return 1;
@@@ -598,7 -572,7 +598,7 @@@ static int dapm_generic_apply_power(str
  
        /* call any power change event handlers */
        if (w->event)
 -              pr_debug("power %s event for %s flags %x\n",
 +              dev_dbg(w->dapm->dev, "power %s event for %s flags %x\n",
                         w->power ? "on" : "off",
                         w->name, w->event_flags);
  
@@@ -647,9 -621,9 +647,9 @@@ static int dapm_generic_check_power(str
        int in, out;
  
        in = is_connected_input_ep(w);
 -      dapm_clear_walk(w->codec);
 +      dapm_clear_walk(w->dapm);
        out = is_connected_output_ep(w);
 -      dapm_clear_walk(w->codec);
 +      dapm_clear_walk(w->dapm);
        return out != 0 && in != 0;
  }
  
@@@ -660,7 -634,7 +660,7 @@@ static int dapm_adc_check_power(struct 
  
        if (w->active) {
                in = is_connected_input_ep(w);
 -              dapm_clear_walk(w->codec);
 +              dapm_clear_walk(w->dapm);
                return in != 0;
        } else {
                return dapm_generic_check_power(w);
@@@ -674,7 -648,7 +674,7 @@@ static int dapm_dac_check_power(struct 
  
        if (w->active) {
                out = is_connected_output_ep(w);
 -              dapm_clear_walk(w->codec);
 +              dapm_clear_walk(w->dapm);
                return out != 0;
        } else {
                return dapm_generic_check_power(w);
@@@ -700,7 -674,7 +700,7 @@@ static int dapm_supply_check_power(stru
                }
        }
  
 -      dapm_clear_walk(w->codec);
 +      dapm_clear_walk(w->dapm);
  
        return power;
  }
@@@ -713,8 -687,8 +713,8 @@@ static int dapm_seq_compare(struct snd_
                return sort[a->id] - sort[b->id];
        if (a->reg != b->reg)
                return a->reg - b->reg;
 -      if (a->codec != b->codec)
 -              return (unsigned long)a->codec - (unsigned long)b->codec;
 +      if (a->dapm != b->dapm)
 +              return (unsigned long)a->dapm - (unsigned long)b->dapm;
  
        return 0;
  }
@@@ -735,57 -709,12 +735,57 @@@ static void dapm_seq_insert(struct snd_
        list_add_tail(&new_widget->power_list, list);
  }
  
 +static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm,
 +                               struct snd_soc_dapm_widget *w, int event)
 +{
 +      struct snd_soc_card *card = dapm->card;
 +      const char *ev_name;
 +      int power, ret;
 +
 +      switch (event) {
 +      case SND_SOC_DAPM_PRE_PMU:
 +              ev_name = "PRE_PMU";
 +              power = 1;
 +              break;
 +      case SND_SOC_DAPM_POST_PMU:
 +              ev_name = "POST_PMU";
 +              power = 1;
 +              break;
 +      case SND_SOC_DAPM_PRE_PMD:
 +              ev_name = "PRE_PMD";
 +              power = 0;
 +              break;
 +      case SND_SOC_DAPM_POST_PMD:
 +              ev_name = "POST_PMD";
 +              power = 0;
 +              break;
 +      default:
 +              BUG();
 +              return;
 +      }
 +
 +      if (w->power != power)
 +              return;
 +
 +      if (w->event && (w->event_flags & event)) {
 +              pop_dbg(dapm->dev, card->pop_time, "pop test : %s %s\n",
 +                      w->name, ev_name);
 +              trace_snd_soc_dapm_widget_event_start(w, event);
 +              ret = w->event(w, NULL, event);
 +              trace_snd_soc_dapm_widget_event_done(w, event);
 +              if (ret < 0)
 +                      pr_err("%s: %s event failed: %d\n",
 +                             ev_name, w->name, ret);
 +      }
 +}
 +
  /* Apply the coalesced changes from a DAPM sequence */
 -static void dapm_seq_run_coalesced(struct snd_soc_codec *codec,
 +static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm,
                                   struct list_head *pending)
  {
 +      struct snd_soc_card *card = dapm->card;
        struct snd_soc_dapm_widget *w;
 -      int reg, power, ret;
 +      int reg, power;
        unsigned int value = 0;
        unsigned int mask = 0;
        unsigned int cur_mask;
                if (power)
                        value |= cur_mask;
  
 -              pop_dbg(codec->pop_time,
 +              pop_dbg(dapm->dev, card->pop_time,
                        "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
                        w->name, reg, value, mask);
  
 -              /* power up pre event */
 -              if (w->power && w->event &&
 -                  (w->event_flags & SND_SOC_DAPM_PRE_PMU)) {
 -                      pop_dbg(codec->pop_time, "pop test : %s PRE_PMU\n",
 -                              w->name);
 -                      ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU);
 -                      if (ret < 0)
 -                              pr_err("%s: pre event failed: %d\n",
 -                                     w->name, ret);
 -              }
 -
 -              /* power down pre event */
 -              if (!w->power && w->event &&
 -                  (w->event_flags & SND_SOC_DAPM_PRE_PMD)) {
 -                      pop_dbg(codec->pop_time, "pop test : %s PRE_PMD\n",
 -                              w->name);
 -                      ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD);
 -                      if (ret < 0)
 -                              pr_err("%s: pre event failed: %d\n",
 -                                     w->name, ret);
 -              }
 +              /* Check for events */
 +              dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMU);
 +              dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMD);
        }
  
        if (reg >= 0) {
 -              pop_dbg(codec->pop_time,
 +              pop_dbg(dapm->dev, card->pop_time,
                        "pop test : Applying 0x%x/0x%x to %x in %dms\n",
 -                      value, mask, reg, codec->pop_time);
 -              pop_wait(codec->pop_time);
 -              snd_soc_update_bits(codec, reg, mask, value);
 +                      value, mask, reg, card->pop_time);
 +              pop_wait(card->pop_time);
 +              snd_soc_update_bits(dapm->codec, reg, mask, value);
        }
  
        list_for_each_entry(w, pending, power_list) {
 -              /* power up post event */
 -              if (w->power && w->event &&
 -                  (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
 -                      pop_dbg(codec->pop_time, "pop test : %s POST_PMU\n",
 -                              w->name);
 -                      ret = w->event(w,
 -                                     NULL, SND_SOC_DAPM_POST_PMU);
 -                      if (ret < 0)
 -                              pr_err("%s: post event failed: %d\n",
 -                                     w->name, ret);
 -              }
 -
 -              /* power down post event */
 -              if (!w->power && w->event &&
 -                  (w->event_flags & SND_SOC_DAPM_POST_PMD)) {
 -                      pop_dbg(codec->pop_time, "pop test : %s POST_PMD\n",
 -                              w->name);
 -                      ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD);
 -                      if (ret < 0)
 -                              pr_err("%s: post event failed: %d\n",
 -                                     w->name, ret);
 -              }
 +              dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMU);
 +              dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMD);
        }
  }
  
   * Currently anything that requires more than a single write is not
   * handled.
   */
 -static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list,
 -                       int event, int sort[])
 +static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
 +                       struct list_head *list, int event, int sort[])
  {
        struct snd_soc_dapm_widget *w, *n;
        LIST_HEAD(pending);
                /* Do we need to apply any queued changes? */
                if (sort[w->id] != cur_sort || w->reg != cur_reg) {
                        if (!list_empty(&pending))
 -                              dapm_seq_run_coalesced(codec, &pending);
 +                              dapm_seq_run_coalesced(dapm, &pending);
  
                        INIT_LIST_HEAD(&pending);
                        cur_sort = -1;
                }
  
                if (ret < 0)
 -                      pr_err("Failed to apply widget power: %d\n",
 -                             ret);
 +                      dev_err(w->dapm->dev,
 +                              "Failed to apply widget power: %d\n", ret);
        }
  
        if (!list_empty(&pending))
 -              dapm_seq_run_coalesced(codec, &pending);
 +              dapm_seq_run_coalesced(dapm, &pending);
  }
  
  /*
   *  o Input pin to Output pin (bypass, sidetone)
   *  o DAC to ADC (loopback).
   */
 -static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
 +static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
  {
 -      struct snd_soc_card *card = codec->card;
 +      struct snd_soc_card *card = dapm->codec->card;
        struct snd_soc_dapm_widget *w;
        LIST_HEAD(up_list);
        LIST_HEAD(down_list);
        int power;
        int sys_power = 0;
  
 +      trace_snd_soc_dapm_start(card);
 +
        /* Check which widgets we need to power and store them in
         * lists indicating if they should be powered up or down.
         */
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                switch (w->id) {
                case snd_soc_dapm_pre:
                        dapm_seq_insert(w, &down_list, dapm_down_seq);
                        if (w->power == power)
                                continue;
  
 +                      trace_snd_soc_dapm_widget_power(w, power);
 +
                        if (power)
                                dapm_seq_insert(w, &up_list, dapm_up_seq);
                        else
        /* If there are no DAPM widgets then try to figure out power from the
         * event type.
         */
 -      if (list_empty(&codec->dapm_widgets)) {
 +      if (list_empty(&dapm->widgets)) {
                switch (event) {
                case SND_SOC_DAPM_STREAM_START:
                case SND_SOC_DAPM_STREAM_RESUME:
                        sys_power = 1;
                        break;
+               case SND_SOC_DAPM_STREAM_STOP:
+                       sys_power = !!codec->active;
+                       break;
                case SND_SOC_DAPM_STREAM_SUSPEND:
                        sys_power = 0;
                        break;
                case SND_SOC_DAPM_STREAM_NOP:
 -                      switch (codec->bias_level) {
 +                      switch (dapm->bias_level) {
                                case SND_SOC_BIAS_STANDBY:
                                case SND_SOC_BIAS_OFF:
                                        sys_power = 0;
                }
        }
  
 -      if (sys_power && codec->bias_level == SND_SOC_BIAS_OFF) {
 -              ret = snd_soc_dapm_set_bias_level(card, codec,
 +      if (sys_power && dapm->bias_level == SND_SOC_BIAS_OFF) {
 +              ret = snd_soc_dapm_set_bias_level(card, dapm,
                                                  SND_SOC_BIAS_STANDBY);
                if (ret != 0)
 -                      pr_err("Failed to turn on bias: %d\n", ret);
 +                      dev_err(dapm->dev,
 +                              "Failed to turn on bias: %d\n", ret);
        }
  
        /* If we're changing to all on or all off then prepare */
 -      if ((sys_power && codec->bias_level == SND_SOC_BIAS_STANDBY) ||
 -          (!sys_power && codec->bias_level == SND_SOC_BIAS_ON)) {
 -              ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_PREPARE);
 +      if ((sys_power && dapm->bias_level == SND_SOC_BIAS_STANDBY) ||
 +          (!sys_power && dapm->bias_level == SND_SOC_BIAS_ON)) {
 +              ret = snd_soc_dapm_set_bias_level(card, dapm, SND_SOC_BIAS_PREPARE);
                if (ret != 0)
 -                      pr_err("Failed to prepare bias: %d\n", ret);
 +                      dev_err(dapm->dev,
 +                              "Failed to prepare bias: %d\n", ret);
        }
  
        /* Power down widgets first; try to avoid amplifying pops. */
 -      dapm_seq_run(codec, &down_list, event, dapm_down_seq);
 +      dapm_seq_run(dapm, &down_list, event, dapm_down_seq);
  
        /* Now power up. */
 -      dapm_seq_run(codec, &up_list, event, dapm_up_seq);
 +      dapm_seq_run(dapm, &up_list, event, dapm_up_seq);
  
        /* If we just powered the last thing off drop to standby bias */
 -      if (codec->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) {
 -              ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_STANDBY);
 +      if (dapm->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) {
 +              ret = snd_soc_dapm_set_bias_level(card, dapm, SND_SOC_BIAS_STANDBY);
                if (ret != 0)
 -                      pr_err("Failed to apply standby bias: %d\n", ret);
 +                      dev_err(dapm->dev,
 +                              "Failed to apply standby bias: %d\n", ret);
        }
  
        /* If we're in standby and can support bias off then do that */
 -      if (codec->bias_level == SND_SOC_BIAS_STANDBY &&
 -          codec->idle_bias_off) {
 -              ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF);
 +      if (dapm->bias_level == SND_SOC_BIAS_STANDBY &&
 +          dapm->idle_bias_off) {
 +              ret = snd_soc_dapm_set_bias_level(card, dapm, SND_SOC_BIAS_OFF);
                if (ret != 0)
 -                      pr_err("Failed to turn off bias: %d\n", ret);
 +                      dev_err(dapm->dev,
 +                              "Failed to turn off bias: %d\n", ret);
        }
  
        /* If we just powered up then move to active bias */
 -      if (codec->bias_level == SND_SOC_BIAS_PREPARE && sys_power) {
 -              ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_ON);
 +      if (dapm->bias_level == SND_SOC_BIAS_PREPARE && sys_power) {
 +              ret = snd_soc_dapm_set_bias_level(card, dapm, SND_SOC_BIAS_ON);
                if (ret != 0)
 -                      pr_err("Failed to apply active bias: %d\n", ret);
 +                      dev_err(dapm->dev,
 +                              "Failed to apply active bias: %d\n", ret);
        }
  
 -      pop_dbg(codec->pop_time, "DAPM sequencing finished, waiting %dms\n",
 -              codec->pop_time);
 -      pop_wait(codec->pop_time);
 +      pop_dbg(dapm->dev, card->pop_time,
 +              "DAPM sequencing finished, waiting %dms\n", card->pop_time);
 +      pop_wait(card->pop_time);
 +
 +      trace_snd_soc_dapm_done(card);
  
        return 0;
  }
@@@ -1079,9 -1038,9 +1082,9 @@@ static ssize_t dapm_widget_power_read_f
                return -ENOMEM;
  
        in = is_connected_input_ep(w);
 -      dapm_clear_walk(w->codec);
 +      dapm_clear_walk(w->dapm);
        out = is_connected_output_ep(w);
 -      dapm_clear_walk(w->codec);
 +      dapm_clear_walk(w->dapm);
  
        ret = snprintf(buf, PAGE_SIZE, "%s: %s  in %d out %d",
                       w->name, w->power ? "On" : "Off", in, out);
@@@ -1131,29 -1090,29 +1134,29 @@@ static const struct file_operations dap
        .llseek = default_llseek,
  };
  
 -void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec)
 +void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm)
  {
        struct snd_soc_dapm_widget *w;
        struct dentry *d;
  
 -      if (!codec->debugfs_dapm)
 +      if (!dapm->debugfs_dapm)
                return;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (!w->name)
                        continue;
  
                d = debugfs_create_file(w->name, 0444,
 -                                      codec->debugfs_dapm, w,
 +                                      dapm->debugfs_dapm, w,
                                        &dapm_widget_power_fops);
                if (!d)
 -                      printk(KERN_WARNING
 -                             "ASoC: Failed to create %s debugfs file\n",
 -                             w->name);
 +                      dev_warn(w->dapm->dev,
 +                              "ASoC: Failed to create %s debugfs file\n",
 +                              w->name);
        }
  }
  #else
 -void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec)
 +void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm)
  {
  }
  #endif
@@@ -1174,7 -1133,7 +1177,7 @@@ static int dapm_mux_update_power(struc
                return 0;
  
        /* find dapm widget path assoc with kcontrol */
 -      list_for_each_entry(path, &widget->codec->dapm_paths, list) {
 +      list_for_each_entry(path, &widget->dapm->paths, list) {
                if (path->kcontrol != kcontrol)
                        continue;
  
        }
  
        if (found)
 -              dapm_power_widgets(widget->codec, SND_SOC_DAPM_STREAM_NOP);
 +              dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
  
        return 0;
  }
@@@ -1208,7 -1167,7 +1211,7 @@@ static int dapm_mixer_update_power(stru
                return -ENODEV;
  
        /* find dapm widget path assoc with kcontrol */
 -      list_for_each_entry(path, &widget->codec->dapm_paths, list) {
 +      list_for_each_entry(path, &widget->dapm->paths, list) {
                if (path->kcontrol != kcontrol)
                        continue;
  
        }
  
        if (found)
 -              dapm_power_widgets(widget->codec, SND_SOC_DAPM_STREAM_NOP);
 +              dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
  
        return 0;
  }
@@@ -1235,7 -1194,7 +1238,7 @@@ static ssize_t dapm_widget_show(struct 
        int count = 0;
        char *state = "not set";
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &codec->dapm.widgets, list) {
  
                /* only display widgets that burnm power */
                switch (w->id) {
                }
        }
  
 -      switch (codec->bias_level) {
 +      switch (codec->dapm.bias_level) {
        case SND_SOC_BIAS_ON:
                state = "On";
                break;
@@@ -1291,33 -1250,31 +1294,33 @@@ static void snd_soc_dapm_sys_remove(str
  }
  
  /* free all dapm widgets and resources */
 -static void dapm_free_widgets(struct snd_soc_codec *codec)
 +static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
  {
        struct snd_soc_dapm_widget *w, *next_w;
        struct snd_soc_dapm_path *p, *next_p;
  
 -      list_for_each_entry_safe(w, next_w, &codec->dapm_widgets, list) {
 +      list_for_each_entry_safe(w, next_w, &dapm->widgets, list) {
                list_del(&w->list);
 +              kfree(w->name);
                kfree(w);
        }
  
 -      list_for_each_entry_safe(p, next_p, &codec->dapm_paths, list) {
 +      list_for_each_entry_safe(p, next_p, &dapm->paths, list) {
                list_del(&p->list);
                kfree(p->long_name);
                kfree(p);
        }
  }
  
 -static int snd_soc_dapm_set_pin(struct snd_soc_codec *codec,
 +static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
                                const char *pin, int status)
  {
        struct snd_soc_dapm_widget *w;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (!strcmp(w->name, pin)) {
 -                      pr_debug("dapm: %s: pin %s\n", codec->name, pin);
 +                      dev_dbg(w->dapm->dev, "dapm: pin %s = %d\n",
 +                              pin, status);
                        w->connected = status;
                        /* Allow disabling of forced pins */
                        if (status == 0)
                }
        }
  
 -      pr_err("dapm: %s: configuring unknown pin %s\n", codec->name, pin);
 +      dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
        return -EINVAL;
  }
  
  /**
   * snd_soc_dapm_sync - scan and power dapm paths
 - * @codec: audio codec
 + * @dapm: DAPM context
   *
   * Walks all dapm audio paths and powers widgets according to their
   * stream or path usage.
   *
   * Returns 0 for success.
   */
 -int snd_soc_dapm_sync(struct snd_soc_codec *codec)
 +int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
  {
 -      return dapm_power_widgets(codec, SND_SOC_DAPM_STREAM_NOP);
 +      return dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_sync);
  
 -static int snd_soc_dapm_add_route(struct snd_soc_codec *codec,
 +static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
                                  const struct snd_soc_dapm_route *route)
  {
        struct snd_soc_dapm_path *path;
        struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
 -      const char *sink = route->sink;
 +      const char *sink;
        const char *control = route->control;
 -      const char *source = route->source;
 +      const char *source;
 +      char prefixed_sink[80];
 +      char prefixed_source[80];
        int ret = 0;
  
 +      if (dapm->codec->name_prefix) {
 +              snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
 +                       dapm->codec->name_prefix, route->sink);
 +              sink = prefixed_sink;
 +              snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
 +                       dapm->codec->name_prefix, route->source);
 +              source = prefixed_source;
 +      } else {
 +              sink = route->sink;
 +              source = route->source;
 +      }
 +
        /* find src and dest widgets */
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
  
                if (!wsink && !(strcmp(w->name, sink))) {
                        wsink = w;
  
        /* connect static paths */
        if (control == NULL) {
 -              list_add(&path->list, &codec->dapm_paths);
 +              list_add(&path->list, &dapm->paths);
                list_add(&path->list_sink, &wsink->sources);
                list_add(&path->list_source, &wsource->sinks);
                path->connect = 1;
        case snd_soc_dapm_supply:
        case snd_soc_dapm_aif_in:
        case snd_soc_dapm_aif_out:
 -              list_add(&path->list, &codec->dapm_paths);
 +              list_add(&path->list, &dapm->paths);
                list_add(&path->list_sink, &wsink->sources);
                list_add(&path->list_source, &wsource->sinks);
                path->connect = 1;
                return 0;
        case snd_soc_dapm_mux:
        case snd_soc_dapm_value_mux:
 -              ret = dapm_connect_mux(codec, wsource, wsink, path, control,
 +              ret = dapm_connect_mux(dapm, wsource, wsink, path, control,
                        &wsink->kcontrols[0]);
                if (ret != 0)
                        goto err;
        case snd_soc_dapm_switch:
        case snd_soc_dapm_mixer:
        case snd_soc_dapm_mixer_named_ctl:
 -              ret = dapm_connect_mixer(codec, wsource, wsink, path, control);
 +              ret = dapm_connect_mixer(dapm, wsource, wsink, path, control);
                if (ret != 0)
                        goto err;
                break;
        case snd_soc_dapm_mic:
        case snd_soc_dapm_line:
        case snd_soc_dapm_spk:
 -              list_add(&path->list, &codec->dapm_paths);
 +              list_add(&path->list, &dapm->paths);
                list_add(&path->list_sink, &wsink->sources);
                list_add(&path->list_source, &wsource->sinks);
                path->connect = 0;
        return 0;
  
  err:
 -      printk(KERN_WARNING "asoc: no dapm match for %s --> %s --> %s\n", source,
 -              control, sink);
 +      dev_warn(dapm->dev, "asoc: no dapm match for %s --> %s --> %s\n",
 +               source, control, sink);
        kfree(path);
        return ret;
  }
  
  /**
   * snd_soc_dapm_add_routes - Add routes between DAPM widgets
 - * @codec: codec
 + * @dapm: DAPM context
   * @route: audio routes
   * @num: number of routes
   *
   * Returns 0 for success else error. On error all resources can be freed
   * with a call to snd_soc_card_free().
   */
 -int snd_soc_dapm_add_routes(struct snd_soc_codec *codec,
 +int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
                            const struct snd_soc_dapm_route *route, int num)
  {
        int i, ret;
  
        for (i = 0; i < num; i++) {
 -              ret = snd_soc_dapm_add_route(codec, route);
 +              ret = snd_soc_dapm_add_route(dapm, route);
                if (ret < 0) {
 -                      printk(KERN_ERR "Failed to add route %s->%s\n",
 -                             route->source,
 -                             route->sink);
 +                      dev_err(dapm->dev, "Failed to add route %s->%s\n",
 +                              route->source, route->sink);
                        return ret;
                }
                route++;
@@@ -1506,17 -1450,17 +1509,17 @@@ EXPORT_SYMBOL_GPL(snd_soc_dapm_add_rout
  
  /**
   * snd_soc_dapm_new_widgets - add new dapm widgets
 - * @codec: audio codec
 + * @dapm: DAPM context
   *
   * Checks the codec for any new dapm widgets and creates them if found.
   *
   * Returns 0 for success.
   */
 -int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec)
 +int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
  {
        struct snd_soc_dapm_widget *w;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list)
 +      list_for_each_entry(w, &dapm->widgets, list)
        {
                if (w->new)
                        continue;
                case snd_soc_dapm_mixer:
                case snd_soc_dapm_mixer_named_ctl:
                        w->power_check = dapm_generic_check_power;
 -                      dapm_new_mixer(codec, w);
 +                      dapm_new_mixer(dapm, w);
                        break;
                case snd_soc_dapm_mux:
                case snd_soc_dapm_value_mux:
                        w->power_check = dapm_generic_check_power;
 -                      dapm_new_mux(codec, w);
 +                      dapm_new_mux(dapm, w);
                        break;
                case snd_soc_dapm_adc:
                case snd_soc_dapm_aif_out:
                        break;
                case snd_soc_dapm_pga:
                        w->power_check = dapm_generic_check_power;
 -                      dapm_new_pga(codec, w);
 +                      dapm_new_pga(dapm, w);
                        break;
                case snd_soc_dapm_input:
                case snd_soc_dapm_output:
                w->new = 1;
        }
  
 -      dapm_power_widgets(codec, SND_SOC_DAPM_STREAM_NOP);
 +      dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
        return 0;
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
@@@ -1948,7 -1892,7 +1951,7 @@@ int snd_soc_dapm_get_pin_switch(struct 
        mutex_lock(&codec->mutex);
  
        ucontrol->value.integer.value[0] =
 -              snd_soc_dapm_get_pin_status(codec, pin);
 +              snd_soc_dapm_get_pin_status(&codec->dapm, pin);
  
        mutex_unlock(&codec->mutex);
  
@@@ -1971,11 -1915,11 +1974,11 @@@ int snd_soc_dapm_put_pin_switch(struct 
        mutex_lock(&codec->mutex);
  
        if (ucontrol->value.integer.value[0])
 -              snd_soc_dapm_enable_pin(codec, pin);
 +              snd_soc_dapm_enable_pin(&codec->dapm, pin);
        else
 -              snd_soc_dapm_disable_pin(codec, pin);
 +              snd_soc_dapm_disable_pin(&codec->dapm, pin);
  
 -      snd_soc_dapm_sync(codec);
 +      snd_soc_dapm_sync(&codec->dapm);
  
        mutex_unlock(&codec->mutex);
  
@@@ -1985,42 -1929,26 +1988,42 @@@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_
  
  /**
   * snd_soc_dapm_new_control - create new dapm control
 - * @codec: audio codec
 + * @dapm: DAPM context
   * @widget: widget template
   *
   * Creates a new dapm control based upon the template.
   *
   * Returns 0 for success else error.
   */
 -int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
 +int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
        const struct snd_soc_dapm_widget *widget)
  {
        struct snd_soc_dapm_widget *w;
 +      size_t name_len;
  
        if ((w = dapm_cnew_widget(widget)) == NULL)
                return -ENOMEM;
  
 -      w->codec = codec;
 +      name_len = strlen(widget->name) + 1;
 +      if (dapm->codec->name_prefix)
 +              name_len += 1 + strlen(dapm->codec->name_prefix);
 +      w->name = kmalloc(name_len, GFP_KERNEL);
 +      if (w->name == NULL) {
 +              kfree(w);
 +              return -ENOMEM;
 +      }
 +      if (dapm->codec->name_prefix)
 +              snprintf(w->name, name_len, "%s %s",
 +                      dapm->codec->name_prefix, widget->name);
 +      else
 +              snprintf(w->name, name_len, "%s", widget->name);
 +
 +      w->dapm = dapm;
 +      w->codec = dapm->codec;
        INIT_LIST_HEAD(&w->sources);
        INIT_LIST_HEAD(&w->sinks);
        INIT_LIST_HEAD(&w->list);
 -      list_add(&w->list, &codec->dapm_widgets);
 +      list_add(&w->list, &dapm->widgets);
  
        /* machine layer set ups unconnected pins and insertions */
        w->connected = 1;
@@@ -2030,7 -1958,7 +2033,7 @@@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_cont
  
  /**
   * snd_soc_dapm_new_controls - create new dapm controls
 - * @codec: audio codec
 + * @dapm: DAPM context
   * @widget: widget array
   * @num: number of widgets
   *
   *
   * Returns 0 for success else error.
   */
 -int snd_soc_dapm_new_controls(struct snd_soc_codec *codec,
 +int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
        const struct snd_soc_dapm_widget *widget,
        int num)
  {
        int i, ret;
  
        for (i = 0; i < num; i++) {
 -              ret = snd_soc_dapm_new_control(codec, widget);
 +              ret = snd_soc_dapm_new_control(dapm, widget);
                if (ret < 0) {
 -                      printk(KERN_ERR
 -                             "ASoC: Failed to create DAPM control %s: %d\n",
 -                             widget->name, ret);
 +                      dev_err(dapm->dev,
 +                              "ASoC: Failed to create DAPM control %s: %d\n",
 +                              widget->name, ret);
                        return ret;
                }
                widget++;
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
  
 -
 -/**
 - * snd_soc_dapm_stream_event - send a stream event to the dapm core
 - * @codec: audio codec
 - * @stream: stream name
 - * @event: stream event
 - *
 - * Sends a stream event to the dapm core. The core then makes any
 - * necessary widget power changes.
 - *
 - * Returns 0 for success else error.
 - */
 -int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
 +static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm,
        const char *stream, int event)
  {
 -      struct snd_soc_codec *codec = rtd->codec;
        struct snd_soc_dapm_widget *w;
  
 -      if (stream == NULL)
 -              return 0;
 -
 -      mutex_lock(&codec->mutex);
 -      list_for_each_entry(w, &codec->dapm_widgets, list)
 +      list_for_each_entry(w, &dapm->widgets, list)
        {
                if (!w->sname)
                        continue;
 -              pr_debug("widget %s\n %s stream %s event %d\n",
 -                       w->name, w->sname, stream, event);
 +              dev_dbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n",
 +                      w->name, w->sname, stream, event);
                if (strstr(w->sname, stream)) {
                        switch(event) {
                        case SND_SOC_DAPM_STREAM_START:
                }
        }
  
 -      dapm_power_widgets(codec, event);
 +      dapm_power_widgets(dapm, event);
 +}
 +
 +/**
 + * snd_soc_dapm_stream_event - send a stream event to the dapm core
 + * @rtd: PCM runtime data
 + * @stream: stream name
 + * @event: stream event
 + *
 + * Sends a stream event to the dapm core. The core then makes any
 + * necessary widget power changes.
 + *
 + * Returns 0 for success else error.
 + */
 +int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
 +      const char *stream, int event)
 +{
 +      struct snd_soc_codec *codec = rtd->codec;
 +
 +      if (stream == NULL)
 +              return 0;
 +
 +      mutex_lock(&codec->mutex);
 +      soc_dapm_stream_event(&codec->dapm, stream, event);
        mutex_unlock(&codec->mutex);
        return 0;
  }
@@@ -2117,7 -2039,7 +2120,7 @@@ EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_e
  
  /**
   * snd_soc_dapm_enable_pin - enable pin.
 - * @codec: SoC codec
 + * @dapm: DAPM context
   * @pin: pin name
   *
   * Enables input/output pin and its parents or children widgets iff there is
   * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
   * do any widget power switching.
   */
 -int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
  {
 -      return snd_soc_dapm_set_pin(codec, pin, 1);
 +      return snd_soc_dapm_set_pin(dapm, pin, 1);
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
  
  /**
   * snd_soc_dapm_force_enable_pin - force a pin to be enabled
 - * @codec: SoC codec
 + * @dapm: DAPM context
   * @pin: pin name
   *
   * Enables input/output pin regardless of any other state.  This is
   * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
   * do any widget power switching.
   */
 -int snd_soc_dapm_force_enable_pin(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
 +                                const char *pin)
  {
        struct snd_soc_dapm_widget *w;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (!strcmp(w->name, pin)) {
 -                      pr_debug("dapm: %s: pin %s\n", codec->name, pin);
 +                      dev_dbg(w->dapm->dev,
 +                              "dapm: force enable pin %s\n", pin);
                        w->connected = 1;
                        w->force = 1;
                        return 0;
                }
        }
  
 -      pr_err("dapm: %s: configuring unknown pin %s\n", codec->name, pin);
 +      dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
        return -EINVAL;
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
  
  /**
   * snd_soc_dapm_disable_pin - disable pin.
 - * @codec: SoC codec
 + * @dapm: DAPM context
   * @pin: pin name
   *
   * Disables input/output pin and its parents or children widgets.
   * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
   * do any widget power switching.
   */
 -int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
 +                           const char *pin)
  {
 -      return snd_soc_dapm_set_pin(codec, pin, 0);
 +      return snd_soc_dapm_set_pin(dapm, pin, 0);
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
  
  /**
   * snd_soc_dapm_nc_pin - permanently disable pin.
 - * @codec: SoC codec
 + * @dapm: DAPM context
   * @pin: pin name
   *
   * Marks the specified pin as being not connected, disabling it along
   * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
   * do any widget power switching.
   */
 -int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin)
  {
 -      return snd_soc_dapm_set_pin(codec, pin, 0);
 +      return snd_soc_dapm_set_pin(dapm, pin, 0);
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin);
  
  /**
   * snd_soc_dapm_get_pin_status - get audio pin status
 - * @codec: audio codec
 + * @dapm: DAPM context
   * @pin: audio signal pin endpoint (or start point)
   *
   * Get audio pin status - connected or disconnected.
   *
   * Returns 1 for connected otherwise 0.
   */
 -int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
 +                              const char *pin)
  {
        struct snd_soc_dapm_widget *w;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (!strcmp(w->name, pin))
                        return w->connected;
        }
@@@ -2224,7 -2142,7 +2227,7 @@@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_
  
  /**
   * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
 - * @codec: audio codec
 + * @dapm: DAPM context
   * @pin: audio signal pin endpoint (or start point)
   *
   * Mark the given endpoint or pin as ignoring suspend.  When the
   * normal means at suspend time, it will not be turned on if it was not
   * already enabled.
   */
 -int snd_soc_dapm_ignore_suspend(struct snd_soc_codec *codec, const char *pin)
 +int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
 +                              const char *pin)
  {
        struct snd_soc_dapm_widget *w;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (!strcmp(w->name, pin)) {
                        w->ignore_suspend = 1;
                        return 0;
                }
        }
  
 -      pr_err("Unknown DAPM pin: %s\n", pin);
 +      dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
        return -EINVAL;
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
   *
   * Free all dapm widgets and resources.
   */
 -void snd_soc_dapm_free(struct snd_soc_codec *codec)
 +void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
  {
 -      snd_soc_dapm_sys_remove(codec->dev);
 -      dapm_free_widgets(codec);
 +      snd_soc_dapm_sys_remove(dapm->dev);
 +      dapm_free_widgets(dapm);
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
  
 -static void soc_dapm_shutdown_codec(struct snd_soc_codec *codec)
 +static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
  {
        struct snd_soc_dapm_widget *w;
        LIST_HEAD(down_list);
        int powerdown = 0;
  
 -      list_for_each_entry(w, &codec->dapm_widgets, list) {
 +      list_for_each_entry(w, &dapm->widgets, list) {
                if (w->power) {
                        dapm_seq_insert(w, &down_list, dapm_down_seq);
                        w->power = 0;
         * standby.
         */
        if (powerdown) {
 -              snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_PREPARE);
 -              dapm_seq_run(codec, &down_list, 0, dapm_down_seq);
 -              snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_STANDBY);
 +              snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_PREPARE);
 +              dapm_seq_run(dapm, &down_list, 0, dapm_down_seq);
 +              snd_soc_dapm_set_bias_level(NULL, dapm, SND_SOC_BIAS_STANDBY);
        }
  }
  
@@@ -2294,10 -2211,10 +2297,10 @@@ void snd_soc_dapm_shutdown(struct snd_s
  {
        struct snd_soc_codec *codec;
  
 -      list_for_each_entry(codec, &card->codec_dev_list, list)
 -              soc_dapm_shutdown_codec(codec);
 -
 -      snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF);
 +      list_for_each_entry(codec, &card->codec_dev_list, list) {
 +              soc_dapm_shutdown_codec(&codec->dapm);
 +              snd_soc_dapm_set_bias_level(card, &codec->dapm, SND_SOC_BIAS_OFF);
 +      }
  }
  
  /* Module information */