Merge remote-tracking branches 'asoc/topic/sh', 'asoc/topic/sigmadsp', 'asoc/topic...
[pandora-kernel.git] / sound / soc / codecs / adau1761.c
index 5518ebd..a1baeee 100644 (file)
@@ -255,7 +255,8 @@ static const struct snd_kcontrol_new adau1761_input_mux_control =
 static int adau1761_dejitter_fixup(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *kcontrol, int event)
 {
-       struct adau *adau = snd_soc_codec_get_drvdata(w->codec);
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
+       struct adau *adau = snd_soc_codec_get_drvdata(codec);
 
        /* After any power changes have been made the dejitter circuit
         * has to be reinitialized. */
@@ -405,6 +406,7 @@ static const struct snd_soc_dapm_widget adau1761_dapm_widgets[] = {
                2, 0, NULL, 0),
 
        SND_SOC_DAPM_SUPPLY("Slew Clock", ADAU1761_CLK_ENABLE0, 6, 0, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("ALC Clock", ADAU1761_CLK_ENABLE0, 5, 0, NULL, 0),
 
        SND_SOC_DAPM_SUPPLY_S("Digital Clock 0", 1, ADAU1761_CLK_ENABLE1,
                0, 0, NULL, 0),
@@ -436,6 +438,9 @@ static const struct snd_soc_dapm_route adau1761_dapm_routes[] = {
        { "Right Playback Mixer", NULL, "Slew Clock" },
        { "Left Playback Mixer", NULL, "Slew Clock" },
 
+       { "Left Input Mixer", NULL, "ALC Clock" },
+       { "Right Input Mixer", NULL, "ALC Clock" },
+
        { "Digital Clock 0", NULL, "SYSCLK" },
        { "Digital Clock 1", NULL, "SYSCLK" },
 };
@@ -698,11 +703,6 @@ static int adau1761_codec_probe(struct snd_soc_codec *codec)
                        ARRAY_SIZE(adau1761_dapm_routes));
                if (ret)
                        return ret;
-
-               ret = adau17x1_load_firmware(adau, codec->dev,
-                       ADAU1761_FIRMWARE);
-               if (ret)
-                       dev_warn(codec->dev, "Failed to firmware\n");
        }
 
        ret = adau17x1_add_routes(codec);
@@ -771,16 +771,20 @@ int adau1761_probe(struct device *dev, struct regmap *regmap,
        enum adau17x1_type type, void (*switch_mode)(struct device *dev))
 {
        struct snd_soc_dai_driver *dai_drv;
+       const char *firmware_name;
        int ret;
 
-       ret = adau17x1_probe(dev, regmap, type, switch_mode);
-       if (ret)
-               return ret;
-
-       if (type == ADAU1361)
+       if (type == ADAU1361) {
                dai_drv = &adau1361_dai_driver;
-       else
+               firmware_name = NULL;
+       } else {
                dai_drv = &adau1761_dai_driver;
+               firmware_name = ADAU1761_FIRMWARE;
+       }
+
+       ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name);
+       if (ret)
+               return ret;
 
        return snd_soc_register_codec(dev, &adau1761_codec_driver, dai_drv, 1);
 }
@@ -794,6 +798,7 @@ const struct regmap_config adau1761_regmap_config = {
        .num_reg_defaults = ARRAY_SIZE(adau1761_reg_defaults),
        .readable_reg = adau1761_readable_register,
        .volatile_reg = adau17x1_volatile_register,
+       .precious_reg = adau17x1_precious_register,
        .cache_type = REGCACHE_RBTREE,
 };
 EXPORT_SYMBOL_GPL(adau1761_regmap_config);