{
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
-       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-       unsigned short val;
-       unsigned short mask;
 
        if (twl4030->configured) {
                dev_err(codec->dev,
                return -EBUSY;
        }
 
-       if (ucontrol->value.enumerated.item[0] >= e->items)
-               return -EINVAL;
-
-       val = ucontrol->value.enumerated.item[0] << e->shift_l;
-       mask = e->mask << e->shift_l;
-       if (e->shift_l != e->shift_r) {
-               if (ucontrol->value.enumerated.item[1] >= e->items)
-                       return -EINVAL;
-               val |= ucontrol->value.enumerated.item[1] << e->shift_r;
-               mask |= e->mask << e->shift_r;
-       }
-
-       return snd_soc_update_bits(codec, e->reg, mask, val);
+       return snd_soc_put_enum_double(kcontrol, ucontrol);
 }
 
 /*