Merge remote-tracking branch 'asoc/topic/enum' into asoc-next
authorMark Brown <broonie@linaro.org>
Wed, 21 May 2014 23:23:44 +0000 (00:23 +0100)
committerMark Brown <broonie@linaro.org>
Wed, 21 May 2014 23:23:44 +0000 (00:23 +0100)
1  2 
include/sound/soc-dapm.h
include/sound/soc.h
sound/soc/codecs/adav80x.c
sound/soc/codecs/max98090.c
sound/soc/codecs/mc13783.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8997.c

diff --combined include/sound/soc-dapm.h
index 5932d66fd6544bb6c0136f14681eb3edd11ea3e0,5ec03b5e2054569cf8681a83a1c59db7b04fda7c..6b59471cdf447dd2ec69f046ee4ed5539ccdf3ea
@@@ -107,10 -107,6 +107,6 @@@ struct device
  {     .id = snd_soc_dapm_mux, .name = wname, \
        SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
        .kcontrol_news = wcontrols, .num_kcontrols = 1}
- #define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \
-       SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols)
- #define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \
-       SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols)
  
  /* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */
  #define SOC_PGA_ARRAY(wname, wreg, wshift, winvert,\
        SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
        .kcontrol_news = wcontrols, .num_kcontrols = 1, \
        .event = wevent, .event_flags = wflags}
- #define SND_SOC_DAPM_VIRT_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
-       wevent, wflags) \
-       SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, wevent, \
-               wflags)
  
  /* additional sequencing control within an event type */
  #define SND_SOC_DAPM_PGA_S(wname, wsubseq, wreg, wshift, winvert, \
  /* generic widgets */
  #define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
  {     .id = wid, .name = wname, .kcontrol_news = NULL, .num_kcontrols = 0, \
 -      .reg = -((wreg) + 1), .shift = wshift, .mask = wmask, \
 -      .on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \
 -      .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
 +      .reg = wreg, .shift = wshift, .mask = wmask, \
 +      .on_val = won_val, .off_val = woff_val, }
  #define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \
  {     .id = snd_soc_dapm_supply, .name = wname, \
        SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
        .get = snd_soc_dapm_get_enum_double, \
        .put = snd_soc_dapm_put_enum_double, \
        .private_value = (unsigned long)&xenum }
- #define SOC_DAPM_ENUM_VIRT(xname, xenum) \
-       SOC_DAPM_ENUM(xname, xenum)
  #define SOC_DAPM_ENUM_EXT(xname, xenum, xget, xput) \
  {     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
        .info = snd_soc_info_enum_double, \
        .get = xget, \
        .put = xput, \
        .private_value = (unsigned long)&xenum }
- #define SOC_DAPM_VALUE_ENUM(xname, xenum) \
-       SOC_DAPM_ENUM(xname, xenum)
  #define SOC_DAPM_PIN_SWITCH(xname) \
  {     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname " Switch", \
        .info = snd_soc_dapm_info_pin_switch, \
@@@ -361,6 -350,8 +349,6 @@@ struct regulator
  struct snd_soc_dapm_widget_list;
  struct snd_soc_dapm_update;
  
 -int dapm_reg_event(struct snd_soc_dapm_widget *w,
 -                 struct snd_kcontrol *kcontrol, int event);
  int dapm_regulator_event(struct snd_soc_dapm_widget *w,
                         struct snd_kcontrol *kcontrol, int event);
  int dapm_clock_event(struct snd_soc_dapm_widget *w,
@@@ -603,7 -594,6 +591,7 @@@ struct snd_soc_dapm_context 
                             enum snd_soc_dapm_type, int);
  
        struct device *dev; /* from parent - for debug */
 +      struct snd_soc_component *component; /* parent component */
        struct snd_soc_codec *codec; /* parent codec */
        struct snd_soc_platform *platform; /* parent platform */
        struct snd_soc_card *card; /* parent card */
diff --combined include/sound/soc.h
index c9ae1271281ec27230b2be625826c8356b674455,98e85a4796b6f30677de3393679c8cf3f29c01b4..431bfd267c52d1cc6ce95159103de6d8e7c63e80
        .info = snd_soc_info_enum_double, \
        .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
        .private_value = (unsigned long)&xenum }
- #define SOC_VALUE_ENUM(xname, xenum) \
-       SOC_ENUM(xname, xenum)
  #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
         xhandler_get, xhandler_put) \
  {     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
                {.base = xbase, .num_regs = xregs,            \
                 .mask = xmask }) }
  
 +#define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
 +{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
 +      .info = snd_soc_bytes_info_ext, \
 +      .get = xhandler_get, .put = xhandler_put, \
 +      .private_value = (unsigned long)&(struct soc_bytes_ext) \
 +              {.max = xcount} }
 +
  #define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \
                xmin, xmax, xinvert) \
  {     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
@@@ -400,6 -391,14 +398,6 @@@ int devm_snd_soc_register_component(str
                         const struct snd_soc_component_driver *cmpnt_drv,
                         struct snd_soc_dai_driver *dai_drv, int num_dai);
  void snd_soc_unregister_component(struct device *dev);
 -int snd_soc_codec_volatile_register(struct snd_soc_codec *codec,
 -                                  unsigned int reg);
 -int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
 -                                  unsigned int reg);
 -int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
 -                                  unsigned int reg);
 -int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
 -                             struct regmap *regmap);
  int snd_soc_cache_sync(struct snd_soc_codec *codec);
  int snd_soc_cache_init(struct snd_soc_codec *codec);
  int snd_soc_cache_exit(struct snd_soc_codec *codec);
@@@ -468,12 -467,12 +466,12 @@@ static inline void snd_soc_jack_free_gp
  #endif
  
  /* codec register bit access */
 -int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
 +int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned int reg,
                                unsigned int mask, unsigned int value);
  int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
 -                             unsigned short reg, unsigned int mask,
 +                             unsigned int reg, unsigned int mask,
                               unsigned int value);
 -int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
 +int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,
                                unsigned int mask, unsigned int value);
  
  int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
@@@ -539,8 -538,6 +537,8 @@@ int snd_soc_bytes_get(struct snd_kcontr
                      struct snd_ctl_elem_value *ucontrol);
  int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
                      struct snd_ctl_elem_value *ucontrol);
 +int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
 +      struct snd_ctl_elem_info *ucontrol);
  int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_info *uinfo);
  int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
@@@ -669,7 -666,6 +667,7 @@@ struct snd_soc_component 
        unsigned int active;
  
        unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */
 +      unsigned int registered_as_component:1;
  
        struct list_head list;
  
        const struct snd_soc_component_driver *driver;
  
        struct list_head dai_list;
 +
 +      int (*read)(struct snd_soc_component *, unsigned int, unsigned int *);
 +      int (*write)(struct snd_soc_component *, unsigned int, unsigned int);
 +
 +      struct regmap *regmap;
 +      int val_bytes;
 +
 +      struct mutex io_mutex;
  };
  
  /* SoC Audio Codec device */
@@@ -701,6 -689,10 +699,6 @@@ struct snd_soc_codec 
        struct snd_soc_card *card;
        struct list_head list;
        struct list_head card_list;
 -      int num_dai;
 -      int (*volatile_register)(struct snd_soc_codec *, unsigned int);
 -      int (*readable_register)(struct snd_soc_codec *, unsigned int);
 -      int (*writable_register)(struct snd_soc_codec *, unsigned int);
  
        /* runtime */
        struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
        unsigned int ac97_registered:1; /* Codec has been AC97 registered */
        unsigned int ac97_created:1; /* Codec has been created by SoC */
        unsigned int cache_init:1; /* codec cache has been initialized */
 -      unsigned int using_regmap:1; /* using regmap access */
        u32 cache_only;  /* Suppress writes to hardware */
        u32 cache_sync; /* Cache needs to be synced to hardware */
  
        /* codec IO */
        void *control_data; /* codec control (i2c/3wire) data */
        hw_write_t hw_write;
 -      unsigned int (*read)(struct snd_soc_codec *, unsigned int);
 -      int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
        void *reg_cache;
        struct mutex cache_rw_mutex;
 -      int val_bytes;
  
        /* component */
        struct snd_soc_component component;
@@@ -756,9 -752,13 +754,9 @@@ struct snd_soc_codec_driver 
                unsigned int freq_in, unsigned int freq_out);
  
        /* codec IO */
 +      struct regmap *(*get_regmap)(struct device *);
        unsigned int (*read)(struct snd_soc_codec *, unsigned int);
        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
 -      int (*display_register)(struct snd_soc_codec *, char *,
 -                              size_t, unsigned int);
 -      int (*volatile_register)(struct snd_soc_codec *, unsigned int);
 -      int (*readable_register)(struct snd_soc_codec *, unsigned int);
 -      int (*writable_register)(struct snd_soc_codec *, unsigned int);
        unsigned int reg_cache_size;
        short reg_cache_step;
        short reg_word_size;
@@@ -789,7 -789,6 +787,7 @@@ struct snd_soc_platform_driver 
        int (*remove)(struct snd_soc_platform *);
        int (*suspend)(struct snd_soc_dai *dai);
        int (*resume)(struct snd_soc_dai *dai);
 +      struct snd_soc_component_driver component_driver;
  
        /* pcm creation and destruction */
        int (*pcm_new)(struct snd_soc_pcm_runtime *);
@@@ -834,6 -833,7 +832,6 @@@ struct snd_soc_platform 
        int id;
        struct device *dev;
        const struct snd_soc_platform_driver *driver;
 -      struct mutex mutex;
  
        unsigned int suspended:1; /* platform is suspended */
        unsigned int probed:1;
        struct list_head list;
        struct list_head card_list;
  
 +      struct snd_soc_component component;
 +
        struct snd_soc_dapm_context dapm;
  
  #ifdef CONFIG_DEBUG_FS
@@@ -931,12 -929,7 +929,12 @@@ struct snd_soc_dai_link 
  };
  
  struct snd_soc_codec_conf {
 +      /*
 +       * specify device either by device name, or by
 +       * DT/OF node, but not both.
 +       */
        const char *dev_name;
 +      const struct device_node *of_node;
  
        /*
         * optional map of kcontrol, widget and path name prefixes that are
  
  struct snd_soc_aux_dev {
        const char *name;               /* Codec name */
 -      const char *codec_name;         /* for multi-codec */
 +
 +      /*
 +       * specify multi-codec either by device name, or by
 +       * DT/OF node, but not both.
 +       */
 +      const char *codec_name;
 +      const struct device_node *codec_of_node;
  
        /* codec/machine specific init - e.g. add machine controls */
        int (*init)(struct snd_soc_dapm_context *dapm);
@@@ -968,6 -955,7 +966,6 @@@ struct snd_soc_card 
        struct snd_card *snd_card;
        struct module *owner;
  
 -      struct list_head list;
        struct mutex mutex;
        struct mutex dapm_mutex;
  
        /* lists of probed devices belonging to this card */
        struct list_head codec_dev_list;
        struct list_head platform_dev_list;
 -      struct list_head dai_dev_list;
  
        struct list_head widgets;
        struct list_head paths;
@@@ -1099,10 -1088,6 +1097,10 @@@ struct soc_bytes 
        u32 mask;
  };
  
 +struct soc_bytes_ext {
 +      int max;
 +};
 +
  /* multi register control */
  struct soc_mreg_control {
        long min, max;
@@@ -1133,39 -1118,10 +1131,39 @@@ static inline struct snd_soc_codec *snd
        return container_of(component, struct snd_soc_codec, component);
  }
  
 +/**
 + * snd_soc_component_to_platform() - Casts a component to the platform it is embedded in
 + * @component: The component to cast to a platform
 + *
 + * This function must only be used on components that are known to be platforms.
 + * Otherwise the behavior is undefined.
 + */
 +static inline struct snd_soc_platform *snd_soc_component_to_platform(
 +      struct snd_soc_component *component)
 +{
 +      return container_of(component, struct snd_soc_platform, component);
 +}
 +
  /* codec IO */
  unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
 -unsigned int snd_soc_write(struct snd_soc_codec *codec,
 -                         unsigned int reg, unsigned int val);
 +int snd_soc_write(struct snd_soc_codec *codec, unsigned int reg,
 +      unsigned int val);
 +
 +/* component IO */
 +int snd_soc_component_read(struct snd_soc_component *component,
 +      unsigned int reg, unsigned int *val);
 +int snd_soc_component_write(struct snd_soc_component *component,
 +      unsigned int reg, unsigned int val);
 +int snd_soc_component_update_bits(struct snd_soc_component *component,
 +      unsigned int reg, unsigned int mask, unsigned int val);
 +int snd_soc_component_update_bits_async(struct snd_soc_component *component,
 +      unsigned int reg, unsigned int mask, unsigned int val);
 +void snd_soc_component_async_complete(struct snd_soc_component *component);
 +int snd_soc_component_test_bits(struct snd_soc_component *component,
 +      unsigned int reg, unsigned int mask, unsigned int value);
 +
 +int snd_soc_component_init_io(struct snd_soc_component *component,
 +      struct regmap *regmap);
  
  /* device driver data */
  
@@@ -1215,6 -1171,7 +1213,6 @@@ static inline void *snd_soc_pcm_get_drv
  
  static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
  {
 -      INIT_LIST_HEAD(&card->dai_dev_list);
        INIT_LIST_HEAD(&card->codec_dev_list);
        INIT_LIST_HEAD(&card->platform_dev_list);
        INIT_LIST_HEAD(&card->widgets);
@@@ -1269,50 -1226,6 +1267,50 @@@ static inline bool snd_soc_codec_is_act
        return snd_soc_component_is_active(&codec->component);
  }
  
 +/**
 + * snd_soc_kcontrol_component() - Returns the component that registered the
 + *  control
 + * @kcontrol: The control for which to get the component
 + *
 + * Note: This function will work correctly if the control has been registered
 + * for a component. Either with snd_soc_add_codec_controls() or
 + * snd_soc_add_platform_controls() or via  table based setup for either a
 + * CODEC, a platform or component driver. Otherwise the behavior is undefined.
 + */
 +static inline struct snd_soc_component *snd_soc_kcontrol_component(
 +      struct snd_kcontrol *kcontrol)
 +{
 +      return snd_kcontrol_chip(kcontrol);
 +}
 +
 +/**
 + * snd_soc_kcontrol_codec() - Returns the CODEC that registered the control
 + * @kcontrol: The control for which to get the CODEC
 + *
 + * Note: This function will only work correctly if the control has been
 + * registered with snd_soc_add_codec_controls() or via table based setup of
 + * snd_soc_codec_driver. Otherwise the behavior is undefined.
 + */
 +static inline struct snd_soc_codec *snd_soc_kcontrol_codec(
 +      struct snd_kcontrol *kcontrol)
 +{
 +      return snd_soc_component_to_codec(snd_soc_kcontrol_component(kcontrol));
 +}
 +
 +/**
 + * snd_soc_kcontrol_platform() - Returns the platform that registerd the control
 + * @kcontrol: The control for which to get the platform
 + *
 + * Note: This function will only work correctly if the control has been
 + * registered with snd_soc_add_platform_controls() or via table based setup of
 + * a snd_soc_platform_driver. Otherwise the behavior is undefined.
 + */
 +static inline struct snd_soc_platform *snd_soc_kcontrol_platform(
 +      struct snd_kcontrol *kcontrol)
 +{
 +      return snd_soc_component_to_platform(snd_soc_kcontrol_component(kcontrol));
 +}
 +
  int snd_soc_util_init(void);
  void snd_soc_util_exit(void);
  
index cf170b5ef4260e63a24038a07d5694d4dc887d28,4d41bbc611e0c6ab06fe1165756407677e9b7ff2..c43b93fdf0dfe466e3c72e97eec0c5da5da06ecb
@@@ -172,14 -172,14 +172,14 @@@ static ADAV80X_MUX_ENUM_DECL(adav80x_ca
  static ADAV80X_MUX_ENUM_DECL(adav80x_dac_enum, ADAV80X_DPATH_CTRL2, 3);
  
  static const struct snd_kcontrol_new adav80x_aux_capture_mux_ctrl =
-       SOC_DAPM_VALUE_ENUM("Route", adav80x_aux_capture_enum);
+       SOC_DAPM_ENUM("Route", adav80x_aux_capture_enum);
  static const struct snd_kcontrol_new adav80x_capture_mux_ctrl =
-       SOC_DAPM_VALUE_ENUM("Route", adav80x_capture_enum);
+       SOC_DAPM_ENUM("Route", adav80x_capture_enum);
  static const struct snd_kcontrol_new adav80x_dac_mux_ctrl =
-       SOC_DAPM_VALUE_ENUM("Route", adav80x_dac_enum);
+       SOC_DAPM_ENUM("Route", adav80x_dac_enum);
  
  #define ADAV80X_MUX(name, ctrl) \
-       SND_SOC_DAPM_VALUE_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
+       SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
  
  static const struct snd_soc_dapm_widget adav80x_dapm_widgets[] = {
        SND_SOC_DAPM_DAC("DAC", NULL, ADAV80X_DAC_CTRL1, 7, 1),
@@@ -315,7 -315,7 +315,7 @@@ static int adav80x_set_deemph(struct sn
  static int adav80x_put_deemph(struct snd_kcontrol *kcontrol,
                struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
        unsigned int deemph = ucontrol->value.enumerated.item[0];
  
  static int adav80x_get_deemph(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
  
        ucontrol->value.enumerated.item[0] = adav80x->deemph;
index 57fc4c315033740e717e6d37acec42b039c98709,1fd31efa66646c5eb57a99a6af0cfda477d066f1..906534d18d3f948192c4c70a3920032cafc2852b
@@@ -255,7 -255,6 +255,7 @@@ static struct reg_default max98090_reg[
  static bool max98090_volatile_register(struct device *dev, unsigned int reg)
  {
        switch (reg) {
 +      case M98090_REG_SOFTWARE_RESET:
        case M98090_REG_DEVICE_STATUS:
        case M98090_REG_JACK_STATUS:
        case M98090_REG_REVISION_ID:
@@@ -390,7 -389,6 +390,7 @@@ static const DECLARE_TLV_DB_SCALE(max98
  static const DECLARE_TLV_DB_SCALE(max98090_alcmakeup_tlv, 0, 100, 0);
  static const DECLARE_TLV_DB_SCALE(max98090_alccomp_tlv, -3100, 100, 0);
  static const DECLARE_TLV_DB_SCALE(max98090_drcexp_tlv, -6600, 100, 0);
 +static const DECLARE_TLV_DB_SCALE(max98090_sdg_tlv, 50, 200, 0);
  
  static const unsigned int max98090_mixout_tlv[] = {
        TLV_DB_RANGE_HEAD(2),
@@@ -428,7 -426,7 +428,7 @@@ static const unsigned int max98090_rcv_
  static int max98090_get_enab_tlv(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
  static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
@@@ -667,7 -665,7 +667,7 @@@ static const struct snd_kcontrol_new ma
        SOC_SINGLE_EXT_TLV("Digital Sidetone Volume",
                M98090_REG_ADC_SIDETONE, M98090_DVST_SHIFT,
                M98090_DVST_NUM - 1, 1, max98090_get_enab_tlv,
 -              max98090_put_enab_tlv, max98090_micboost_tlv),
 +              max98090_put_enab_tlv, max98090_sdg_tlv),
        SOC_SINGLE_TLV("Digital Coarse Volume", M98090_REG_DAI_PLAYBACK_LEVEL,
                M98090_DVG_SHIFT, M98090_DVG_NUM - 1, 0,
                max98090_dvg_tlv),
@@@ -877,7 -875,7 +877,7 @@@ static const char *dmic_mux_text[] = { 
  static SOC_ENUM_SINGLE_VIRT_DECL(dmic_mux_enum, dmic_mux_text);
  
  static const struct snd_kcontrol_new max98090_dmic_mux =
-       SOC_DAPM_ENUM_VIRT("DMIC Mux", dmic_mux_enum);
+       SOC_DAPM_ENUM("DMIC Mux", dmic_mux_enum);
  
  static const char *max98090_micpre_text[] = { "Off", "On" };
  
@@@ -1177,8 -1175,7 +1177,7 @@@ static const struct snd_soc_dapm_widge
        SND_SOC_DAPM_MUX("MIC2 Mux", SND_SOC_NOPM,
                0, 0, &max98090_mic2_mux),
  
-       SND_SOC_DAPM_VIRT_MUX("DMIC Mux", SND_SOC_NOPM,
-               0, 0, &max98090_dmic_mux),
+       SND_SOC_DAPM_MUX("DMIC Mux", SND_SOC_NOPM, 0, 0, &max98090_dmic_mux),
  
        SND_SOC_DAPM_PGA_E("MIC1 Input", M98090_REG_MIC1_INPUT_LEVEL,
                M98090_MIC_PA1EN_SHIFT, 0, NULL, 0, max98090_micinput_event,
@@@ -2375,8 -2372,6 +2374,8 @@@ static int max98090_runtime_resume(stru
  
        regcache_cache_only(max98090->regmap, false);
  
 +      max98090_reset(max98090);
 +
        regcache_sync(max98090->regmap);
  
        return 0;
@@@ -2392,34 -2387,9 +2391,34 @@@ static int max98090_runtime_suspend(str
  }
  #endif
  
 +#ifdef CONFIG_PM
 +static int max98090_resume(struct device *dev)
 +{
 +      struct max98090_priv *max98090 = dev_get_drvdata(dev);
 +      unsigned int status;
 +
 +      regcache_mark_dirty(max98090->regmap);
 +
 +      max98090_reset(max98090);
 +
 +      /* clear IRQ status */
 +      regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &status);
 +
 +      regcache_sync(max98090->regmap);
 +
 +      return 0;
 +}
 +
 +static int max98090_suspend(struct device *dev)
 +{
 +      return 0;
 +}
 +#endif
 +
  static const struct dev_pm_ops max98090_pm = {
        SET_RUNTIME_PM_OPS(max98090_runtime_suspend,
                max98090_runtime_resume, NULL)
 +      SET_SYSTEM_SLEEP_PM_OPS(max98090_suspend, max98090_resume)
  };
  
  static const struct i2c_device_id max98090_i2c_id[] = {
index 9029e20514e16c07ca929d71ff884cbf3369ada5,ed5c5a41169be552eb69c3794c03be16183c2bfb..0b0a4ca22da0a40b0e56665bf56c83158cab28ad
@@@ -409,7 -409,7 +409,7 @@@ static const char * const adcl_enum_tex
  static SOC_ENUM_SINGLE_VIRT_DECL(adcl_enum, adcl_enum_text);
  
  static const struct snd_kcontrol_new left_input_mux =
-       SOC_DAPM_ENUM_VIRT("Route", adcl_enum);
+       SOC_DAPM_ENUM("Route", adcl_enum);
  
  static const char * const adcr_enum_text[] = {
        "MC1R", "MC2", "RXINR", "TXIN",
  static SOC_ENUM_SINGLE_VIRT_DECL(adcr_enum, adcr_enum_text);
  
  static const struct snd_kcontrol_new right_input_mux =
-       SOC_DAPM_ENUM_VIRT("Route", adcr_enum);
+       SOC_DAPM_ENUM("Route", adcr_enum);
  
  static const struct snd_kcontrol_new samp_ctl =
        SOC_DAPM_SINGLE("Switch", MC13783_AUDIO_RX0, 3, 1, 0);
@@@ -478,9 -478,9 +478,9 @@@ static const struct snd_soc_dapm_widge
        SND_SOC_DAPM_SWITCH("MC2 Amp", MC13783_AUDIO_TX, 9, 0, &mc2_amp_ctl),
        SND_SOC_DAPM_SWITCH("TXIN Amp", MC13783_AUDIO_TX, 11, 0, &atx_amp_ctl),
  
-       SND_SOC_DAPM_VIRT_MUX("PGA Left Input Mux", SND_SOC_NOPM, 0, 0,
+       SND_SOC_DAPM_MUX("PGA Left Input Mux", SND_SOC_NOPM, 0, 0,
                              &left_input_mux),
-       SND_SOC_DAPM_VIRT_MUX("PGA Right Input Mux", SND_SOC_NOPM, 0, 0,
+       SND_SOC_DAPM_MUX("PGA Right Input Mux", SND_SOC_NOPM, 0, 0,
                              &right_input_mux),
  
        SND_SOC_DAPM_MUX("Speaker Amp Source MUX", SND_SOC_NOPM, 0, 0,
@@@ -608,6 -608,14 +608,6 @@@ static struct snd_kcontrol_new mc13783_
  static int mc13783_probe(struct snd_soc_codec *codec)
  {
        struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec);
 -      int ret;
 -
 -      ret = snd_soc_codec_set_cache_io(codec,
 -                      dev_get_regmap(codec->dev->parent, NULL));
 -      if (ret != 0) {
 -              dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
 -              return ret;
 -      }
  
        /* these are the reset values */
        mc13xxx_reg_write(priv->mc13xxx, MC13783_AUDIO_RX0, 0x25893);
@@@ -727,15 -735,9 +727,15 @@@ static struct snd_soc_dai_driver mc1378
        }
  };
  
 +static struct regmap *mc13783_get_regmap(struct device *dev)
 +{
 +      return dev_get_regmap(dev->parent, NULL);
 +}
 +
  static struct snd_soc_codec_driver soc_codec_dev_mc13783 = {
        .probe          = mc13783_probe,
        .remove         = mc13783_remove,
 +      .get_regmap     = mc13783_get_regmap,
        .controls       = mc13783_control_list,
        .num_controls   = ARRAY_SIZE(mc13783_control_list),
        .dapm_widgets   = mc13783_dapm_widgets,
index 7a046536ea681cfaef382569b3b6b7bafa5cf4ca,cbe52861b19be0014b00e7126bcb7cc96c5740dd..289b64d89abd464b562d7dbd56756169ddebaba4
@@@ -764,8 -764,8 +764,8 @@@ SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mo
  SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
  SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
  
- SOC_VALUE_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
- SOC_VALUE_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
+ SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
+ SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
  
  ARIZONA_MIXER_CONTROLS("Mic", ARIZONA_MICMIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("Noise", ARIZONA_NOISEMIX_INPUT_1_SOURCE),
@@@ -814,9 -814,9 +814,9 @@@ SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volum
                 ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_VOL_SHIFT,
                 0xbf, 0, digital_tlv),
  
- SOC_VALUE_ENUM("HPOUT1 OSR", wm5102_hpout_osr[0]),
- SOC_VALUE_ENUM("HPOUT2 OSR", wm5102_hpout_osr[1]),
- SOC_VALUE_ENUM("EPOUT OSR", wm5102_hpout_osr[2]),
+ SOC_ENUM("HPOUT1 OSR", wm5102_hpout_osr[0]),
+ SOC_ENUM("HPOUT2 OSR", wm5102_hpout_osr[1]),
+ SOC_ENUM("EPOUT OSR", wm5102_hpout_osr[2]),
  
  SOC_DOUBLE("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE,
           ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0),
@@@ -970,7 -970,7 +970,7 @@@ static const struct soc_enum wm5102_aec
                              wm5102_aec_loopback_values);
  
  static const struct snd_kcontrol_new wm5102_aec_loopback_mux =
-       SOC_DAPM_VALUE_ENUM("AEC Loopback", wm5102_aec_loopback);
+       SOC_DAPM_ENUM("AEC Loopback", wm5102_aec_loopback);
  
  static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = {
  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
@@@ -1204,7 -1204,7 +1204,7 @@@ SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0
  
  ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
  
- SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
+ SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
                       ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
                       &wm5102_aec_loopback_mux),
  
@@@ -1760,6 -1760,10 +1760,6 @@@ static int wm5102_codec_probe(struct sn
        struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec);
        int ret;
  
 -      ret = snd_soc_codec_set_cache_io(codec, priv->core.arizona->regmap);
 -      if (ret != 0)
 -              return ret;
 -
        ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 2);
        if (ret != 0)
                return ret;
@@@ -1798,17 -1802,9 +1798,17 @@@ static unsigned int wm5102_digital_vu[
        ARIZONA_DAC_DIGITAL_VOLUME_5R,
  };
  
 +static struct regmap *wm5102_get_regmap(struct device *dev)
 +{
 +      struct wm5102_priv *priv = dev_get_drvdata(dev);
 +
 +      return priv->core.arizona->regmap;
 +}
 +
  static struct snd_soc_codec_driver soc_codec_dev_wm5102 = {
        .probe = wm5102_codec_probe,
        .remove = wm5102_codec_remove,
 +      .get_regmap = wm5102_get_regmap,
  
        .idle_bias_off = true,
  
index 97eb1bc5bea70f367b5e3200c7f75a2296ef5760,32e503211eec7377ae5eb5ba7336662bb712624b..20527c4098ce5c02ae4fd603d70f11b2aade3e2c
@@@ -324,13 -324,13 +324,13 @@@ SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mo
  SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
  SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
  
- SOC_VALUE_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
- SOC_VALUE_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
- SOC_VALUE_ENUM("ISRC3 FSL", arizona_isrc_fsl[2]),
- SOC_VALUE_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
- SOC_VALUE_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
- SOC_VALUE_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
- SOC_VALUE_ENUM("ASRC RATE 1", arizona_asrc_rate1),
+ SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
+ SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
+ SOC_ENUM("ISRC3 FSL", arizona_isrc_fsl[2]),
+ SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
+ SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
+ SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
+ SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
  
  ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),
@@@ -592,7 -592,7 +592,7 @@@ static const struct soc_enum wm5110_aec
                              wm5110_aec_loopback_values);
  
  static const struct snd_kcontrol_new wm5110_aec_loopback_mux =
-       SOC_DAPM_VALUE_ENUM("AEC Loopback", wm5110_aec_loopback);
+       SOC_DAPM_ENUM("AEC Loopback", wm5110_aec_loopback);
  
  static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
@@@ -774,7 -774,7 +774,7 @@@ SND_SOC_DAPM_PGA("ISRC3DEC3", ARIZONA_I
  SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3,
                 ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0),
  
- SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
+ SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
                       ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
                       &wm5110_aec_loopback_mux),
  
@@@ -1589,6 -1589,10 +1589,6 @@@ static int wm5110_codec_probe(struct sn
  
        priv->core.arizona->dapm = &codec->dapm;
  
 -      ret = snd_soc_codec_set_cache_io(codec, priv->core.arizona->regmap);
 -      if (ret != 0)
 -              return ret;
 -
        arizona_init_spk(codec);
        arizona_init_gpio(codec);
  
@@@ -1629,17 -1633,9 +1629,17 @@@ static unsigned int wm5110_digital_vu[
        ARIZONA_DAC_DIGITAL_VOLUME_6R,
  };
  
 +static struct regmap *wm5110_get_regmap(struct device *dev)
 +{
 +      struct wm5110_priv *priv = dev_get_drvdata(dev);
 +
 +      return priv->core.arizona->regmap;
 +}
 +
  static struct snd_soc_codec_driver soc_codec_dev_wm5110 = {
        .probe = wm5110_codec_probe,
        .remove = wm5110_codec_remove,
 +      .get_regmap = wm5110_get_regmap,
  
        .idle_bias_off = true,
  
index 29f40a90fa79b817537c7c44a7e5cc7487805c7b,309c97d89dbbc8b1641c1ba0398a7d5587825c60..247b39013fba682efa253924a178285e2f7e43ce
@@@ -298,7 -298,7 +298,7 @@@ static int wm8994_put_drc_sw(struct snd
  {
        struct soc_mixer_control *mc =
                (struct soc_mixer_control *)kcontrol->private_value;
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        int mask, ret;
  
        /* Can't enable both ADC and DAC paths simultaneously */
@@@ -355,7 -355,7 +355,7 @@@ static int wm8994_get_drc(const char *n
  static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        struct wm8994 *control = wm8994->wm8994;
        struct wm8994_pdata *pdata = &control->pdata;
  static int wm8994_get_drc_enum(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        int drc = wm8994_get_drc(kcontrol->id.name);
  
@@@ -462,7 -462,7 +462,7 @@@ static int wm8994_get_retune_mobile_blo
  static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,
                                         struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        struct wm8994 *control = wm8994->wm8994;
        struct wm8994_pdata *pdata = &control->pdata;
  static int wm8994_get_retune_mobile_enum(struct snd_kcontrol *kcontrol,
                                         struct snd_ctl_elem_value *ucontrol)
  {
 -      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
 +      struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
        int block = wm8994_get_retune_mobile_block(kcontrol->id.name);
  
@@@ -1347,10 -1347,10 +1347,10 @@@ static const char *adc_mux_text[] = 
  static SOC_ENUM_SINGLE_VIRT_DECL(adc_enum, adc_mux_text);
  
  static const struct snd_kcontrol_new adcl_mux =
-       SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum);
+       SOC_DAPM_ENUM("ADCL Mux", adc_enum);
  
  static const struct snd_kcontrol_new adcr_mux =
-       SOC_DAPM_ENUM_VIRT("ADCR Mux", adc_enum);
+       SOC_DAPM_ENUM("ADCR Mux", adc_enum);
  
  static const struct snd_kcontrol_new left_speaker_mixer[] = {
  SOC_DAPM_SINGLE("DAC2 Switch", WM8994_SPEAKER_MIXER, 9, 1, 0),
@@@ -1651,15 -1651,15 +1651,15 @@@ SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_
  };
  
  static const struct snd_soc_dapm_widget wm8994_adc_revd_widgets[] = {
- SND_SOC_DAPM_VIRT_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux,
+ SND_SOC_DAPM_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux,
                        adc_mux_ev, SND_SOC_DAPM_PRE_PMU),
- SND_SOC_DAPM_VIRT_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux,
+ SND_SOC_DAPM_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux,
                        adc_mux_ev, SND_SOC_DAPM_PRE_PMU),
  };
  
  static const struct snd_soc_dapm_widget wm8994_adc_widgets[] = {
- SND_SOC_DAPM_VIRT_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux),
- SND_SOC_DAPM_VIRT_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux),
+ SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux),
+ SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux),
  };
  
  static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = {
@@@ -3999,6 -3999,8 +3999,6 @@@ static int wm8994_codec_probe(struct sn
  
        wm8994->hubs.codec = codec;
  
 -      snd_soc_codec_set_cache_io(codec, control->regmap);
 -
        mutex_init(&wm8994->accdet_lock);
        INIT_DELAYED_WORK(&wm8994->jackdet_bootstrap,
                          wm1811_jackdet_bootstrap);
@@@ -4432,19 -4434,11 +4432,19 @@@ static int wm8994_codec_remove(struct s
        return 0;
  }
  
 +static struct regmap *wm8994_get_regmap(struct device *dev)
 +{
 +      struct wm8994 *control = dev_get_drvdata(dev->parent);
 +
 +      return control->regmap;
 +}
 +
  static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {
        .probe =        wm8994_codec_probe,
        .remove =       wm8994_codec_remove,
        .suspend =      wm8994_codec_suspend,
        .resume =       wm8994_codec_resume,
 +      .get_regmap =   wm8994_get_regmap,
        .set_bias_level = wm8994_set_bias_level,
  };
  
index 09c4150840a320a8182ea496f91fa298b7ba0c75,a5dcdcb3ee24b60dd3955aaf80e4f9c6ffe4efdc..bb9b47b956aa519f1b5becb9c2ccc6a75e84fe13
@@@ -245,8 -245,8 +245,8 @@@ SND_SOC_BYTES("LHPF2 Coefficients", ARI
  SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1),
  SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1),
  
- SOC_VALUE_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
- SOC_VALUE_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
+ SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
+ SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
  
  ARIZONA_MIXER_CONTROLS("Mic", ARIZONA_MICMIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("Noise", ARIZONA_NOISEMIX_INPUT_1_SOURCE),
@@@ -286,8 -286,8 +286,8 @@@ SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volum
                 ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_VOL_SHIFT,
                 0xbf, 0, digital_tlv),
  
- SOC_VALUE_ENUM("HPOUT1 OSR", wm8997_hpout_osr[0]),
- SOC_VALUE_ENUM("EPOUT OSR", wm8997_hpout_osr[1]),
+ SOC_ENUM("HPOUT1 OSR", wm8997_hpout_osr[0]),
+ SOC_ENUM("EPOUT OSR", wm8997_hpout_osr[1]),
  
  SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
  SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
@@@ -405,7 -405,7 +405,7 @@@ static const struct soc_enum wm8997_aec
                              wm8997_aec_loopback_values);
  
  static const struct snd_kcontrol_new wm8997_aec_loopback_mux =
-       SOC_DAPM_VALUE_ENUM("AEC Loopback", wm8997_aec_loopback);
+       SOC_DAPM_ENUM("AEC Loopback", wm8997_aec_loopback);
  
  static const struct snd_soc_dapm_widget wm8997_dapm_widgets[] = {
  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
@@@ -604,7 -604,7 +604,7 @@@ SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0
                    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
                    ARIZONA_SLIMRX8_ENA_SHIFT, 0),
  
- SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
+ SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
                       ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
                       &wm8997_aec_loopback_mux),
  
@@@ -1051,6 -1051,11 +1051,6 @@@ static struct snd_soc_dai_driver wm8997
  static int wm8997_codec_probe(struct snd_soc_codec *codec)
  {
        struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec);
 -      int ret;
 -
 -      ret = snd_soc_codec_set_cache_io(codec, priv->core.arizona->regmap);
 -      if (ret != 0)
 -              return ret;
  
        arizona_init_spk(codec);
  
@@@ -1081,17 -1086,9 +1081,17 @@@ static unsigned int wm8997_digital_vu[
        ARIZONA_DAC_DIGITAL_VOLUME_5R,
  };
  
 +static struct regmap *wm8997_get_regmap(struct device *dev)
 +{
 +      struct wm8997_priv *priv = dev_get_drvdata(dev);
 +
 +      return priv->core.arizona->regmap;
 +}
 +
  static struct snd_soc_codec_driver soc_codec_dev_wm8997 = {
        .probe = wm8997_codec_probe,
        .remove = wm8997_codec_remove,
 +      .get_regmap =   wm8997_get_regmap,
  
        .idle_bias_off = true,