.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \
        .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \
        .on_val = wflags}
+#define SND_SOC_DAPM_PINCTRL(wname, active, sleep) \
+{      .id = snd_soc_dapm_pinctrl, .name = wname, \
+       .priv = (&(struct snd_soc_dapm_pinctrl_priv) \
+               { .active_state = active, .sleep_state = sleep,}), \
+       .reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, \
+       .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
+
 
 
 /* dapm kcontrol types */
                         struct snd_kcontrol *kcontrol, int event);
 int dapm_clock_event(struct snd_soc_dapm_widget *w,
                         struct snd_kcontrol *kcontrol, int event);
+int dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
+                        struct snd_kcontrol *kcontrol, int event);
 
 /* dapm controls */
 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
        snd_soc_dapm_pre,                       /* machine specific pre widget - exec first */
        snd_soc_dapm_post,                      /* machine specific post widget - exec last */
        snd_soc_dapm_supply,            /* power/clock supply */
+       snd_soc_dapm_pinctrl,           /* pinctrl */
        snd_soc_dapm_regulator_supply,  /* external regulator */
        snd_soc_dapm_clock_supply,      /* external clock */
        snd_soc_dapm_aif_in,            /* audio interface input */
 
        void *priv;                             /* widget specific data */
        struct regulator *regulator;            /* attached regulator */
+       struct pinctrl *pinctrl;                /* attached pinctrl */
        const struct snd_soc_pcm_stream *params; /* params for dai links */
        unsigned int num_params; /* number of params for dai links */
        unsigned int params_select; /* currently selected param for dai link */
        int neighbour_checks;
 };
 
+struct snd_soc_dapm_pinctrl_priv {
+       const char *active_state;
+       const char *sleep_state;
+};
+
 /**
  * snd_soc_dapm_init_bias_level() - Initialize DAPM bias level
  * @dapm: The DAPM context to initialize
 
 #include <linux/debugfs.h>
 #include <linux/pm_runtime.h>
 #include <linux/regulator/consumer.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/clk.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 static int dapm_up_seq[] = {
        [snd_soc_dapm_pre] = 0,
        [snd_soc_dapm_regulator_supply] = 1,
+       [snd_soc_dapm_pinctrl] = 1,
        [snd_soc_dapm_clock_supply] = 1,
        [snd_soc_dapm_supply] = 2,
        [snd_soc_dapm_micbias] = 3,
        [snd_soc_dapm_dai_link] = 11,
        [snd_soc_dapm_supply] = 12,
        [snd_soc_dapm_clock_supply] = 13,
+       [snd_soc_dapm_pinctrl] = 13,
        [snd_soc_dapm_regulator_supply] = 13,
        [snd_soc_dapm_post] = 14,
 };
 }
 EXPORT_SYMBOL_GPL(dapm_regulator_event);
 
+/*
+ * Handler for pinctrl widget.
+ */
+int dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
+                      struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_dapm_pinctrl_priv *priv = w->priv;
+       struct pinctrl *p = w->pinctrl;
+       struct pinctrl_state *s;
+
+       if (!p || !priv)
+               return -EIO;
+
+       if (SND_SOC_DAPM_EVENT_ON(event))
+               s = pinctrl_lookup_state(p, priv->active_state);
+       else
+               s = pinctrl_lookup_state(p, priv->sleep_state);
+
+       if (IS_ERR(s))
+               return PTR_ERR(s);
+
+       return pinctrl_select_state(p, s);
+}
+EXPORT_SYMBOL_GPL(dapm_pinctrl_event);
+
 /*
  * Handler for clock supply widget.
  */
                                break;
                        case snd_soc_dapm_supply:
                        case snd_soc_dapm_regulator_supply:
+                       case snd_soc_dapm_pinctrl:
                        case snd_soc_dapm_clock_supply:
                        case snd_soc_dapm_micbias:
                                if (d->target_bias_level < SND_SOC_BIAS_STANDBY)
                case snd_soc_dapm_mixer_named_ctl:
                case snd_soc_dapm_supply:
                case snd_soc_dapm_regulator_supply:
+               case snd_soc_dapm_pinctrl:
                case snd_soc_dapm_clock_supply:
                        if (w->name)
                                count += sprintf(buf + count, "%s: %s\n",
                                         w->name, ret);
                }
                break;
+       case snd_soc_dapm_pinctrl:
+               w->pinctrl = devm_pinctrl_get(dapm->dev);
+               if (IS_ERR_OR_NULL(w->pinctrl)) {
+                       ret = PTR_ERR(w->pinctrl);
+                       if (ret == -EPROBE_DEFER)
+                               return ERR_PTR(ret);
+                       dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
+                               w->name, ret);
+                       return NULL;
+               }
+               break;
        case snd_soc_dapm_clock_supply:
 #ifdef CONFIG_CLKDEV_LOOKUP
                w->clk = devm_clk_get(dapm->dev, w->name);
                break;
        case snd_soc_dapm_supply:
        case snd_soc_dapm_regulator_supply:
+       case snd_soc_dapm_pinctrl:
        case snd_soc_dapm_clock_supply:
        case snd_soc_dapm_kcontrol:
                w->is_supply = 1;