ASoC: Only restore non-default registers for WM8776
[safe/jmp/linux-2.6] / sound / soc / codecs / wm_hubs.c
index e8fc474..d73c305 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/pm.h>
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
-#include <linux/regulator/consumer.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
@@ -274,17 +273,12 @@ static int hp_event(struct snd_soc_dapm_widget *w,
 
                /* Start the DC servo */
                snd_soc_update_bits(codec, WM8993_DC_SERVO_0,
-                                   WM8993_DCS_ENA_CHAN_0 |
-                                   WM8993_DCS_ENA_CHAN_1 |
-                                   WM8993_DCS_TRIG_STARTUP_1 |
-                                   WM8993_DCS_TRIG_STARTUP_0,
+                                   0xFFFF,
                                    WM8993_DCS_ENA_CHAN_0 |
                                    WM8993_DCS_ENA_CHAN_1 |
                                    WM8993_DCS_TRIG_STARTUP_1 |
                                    WM8993_DCS_TRIG_STARTUP_0);
                wait_for_dc_servo(codec);
-               snd_soc_update_bits(codec, WM8993_DC_SERVO_1,
-                                   WM8993_DCS_TIMER_PERIOD_01_MASK, 0xa);
 
                reg |= WM8993_HPOUT1R_OUTP | WM8993_HPOUT1R_RMV_SHORT |
                        WM8993_HPOUT1L_OUTP | WM8993_HPOUT1L_RMV_SHORT;
@@ -299,11 +293,8 @@ static int hp_event(struct snd_soc_dapm_widget *w,
                         WM8993_HPOUT1R_DLY |
                         WM8993_HPOUT1R_OUTP);
 
-               snd_soc_update_bits(codec, WM8993_DC_SERVO_1,
-                                   WM8993_DCS_TIMER_PERIOD_01_MASK, 0);
                snd_soc_update_bits(codec, WM8993_DC_SERVO_0,
-                                   WM8993_DCS_ENA_CHAN_0 |
-                                   WM8993_DCS_ENA_CHAN_1, 0);
+                                   0xffff, 0);
 
                snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg);
                snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
@@ -447,11 +438,11 @@ static const struct snd_soc_dapm_widget analogue_dapm_widgets[] = {
 SND_SOC_DAPM_INPUT("IN1LN"),
 SND_SOC_DAPM_INPUT("IN1LP"),
 SND_SOC_DAPM_INPUT("IN2LN"),
-SND_SOC_DAPM_INPUT("IN2LP/VXRN"),
+SND_SOC_DAPM_INPUT("IN2LP:VXRN"),
 SND_SOC_DAPM_INPUT("IN1RN"),
 SND_SOC_DAPM_INPUT("IN1RP"),
 SND_SOC_DAPM_INPUT("IN2RN"),
-SND_SOC_DAPM_INPUT("IN2RP/VXRP"),
+SND_SOC_DAPM_INPUT("IN2RP:VXRP"),
 
 SND_SOC_DAPM_MICBIAS("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0),
 SND_SOC_DAPM_MICBIAS("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0),
@@ -474,12 +465,6 @@ SND_SOC_DAPM_MIXER("MIXINL", WM8993_POWER_MANAGEMENT_2, 9, 0,
 SND_SOC_DAPM_MIXER("MIXINR", WM8993_POWER_MANAGEMENT_2, 8, 0,
                   mixinr, ARRAY_SIZE(mixinr)),
 
-SND_SOC_DAPM_ADC("ADCL", "Capture", WM8993_POWER_MANAGEMENT_2, 1, 0),
-SND_SOC_DAPM_ADC("ADCR", "Capture", WM8993_POWER_MANAGEMENT_2, 0, 0),
-
-SND_SOC_DAPM_DAC("DACL", "Playback", WM8993_POWER_MANAGEMENT_3, 1, 0),
-SND_SOC_DAPM_DAC("DACR", "Playback", WM8993_POWER_MANAGEMENT_3, 0, 0),
-
 SND_SOC_DAPM_MIXER("Left Output Mixer", WM8993_POWER_MANAGEMENT_3, 5, 0,
                   left_output_mixer, ARRAY_SIZE(left_output_mixer)),
 SND_SOC_DAPM_MIXER("Right Output Mixer", WM8993_POWER_MANAGEMENT_3, 4, 0,
@@ -552,14 +537,14 @@ static const struct snd_soc_dapm_route analogue_routes[] = {
        { "IN1R PGA", "IN1RP Switch", "IN1RP" },
        { "IN1R PGA", "IN1RN Switch", "IN1RN" },
 
-       { "IN2L PGA", "IN2LP Switch", "IN2LP/VXRN" },
+       { "IN2L PGA", "IN2LP Switch", "IN2LP:VXRN" },
        { "IN2L PGA", "IN2LN Switch", "IN2LN" },
 
-       { "IN2R PGA", "IN2RP Switch", "IN2RP/VXRP" },
+       { "IN2R PGA", "IN2RP Switch", "IN2RP:VXRP" },
        { "IN2R PGA", "IN2RN Switch", "IN2RN" },
 
-       { "Direct Voice", NULL, "IN2LP/VXRN" },
-       { "Direct Voice", NULL, "IN2RP/VXRP" },
+       { "Direct Voice", NULL, "IN2LP:VXRN" },
+       { "Direct Voice", NULL, "IN2RP:VXRP" },
 
        { "MIXINL", "IN1L Switch", "IN1L PGA" },
        { "MIXINL", "IN2L Switch", "IN2L PGA" },
@@ -580,7 +565,7 @@ static const struct snd_soc_dapm_route analogue_routes[] = {
        { "Left Output Mixer", "Right Input Switch", "MIXINR" },
        { "Left Output Mixer", "IN2RN Switch", "IN2RN" },
        { "Left Output Mixer", "IN2LN Switch", "IN2LN" },
-       { "Left Output Mixer", "IN2LP Switch", "IN2LP/VXRN" },
+       { "Left Output Mixer", "IN2LP Switch", "IN2LP:VXRN" },
        { "Left Output Mixer", "IN1L Switch", "IN1L PGA" },
        { "Left Output Mixer", "IN1R Switch", "IN1R PGA" },
 
@@ -588,7 +573,7 @@ static const struct snd_soc_dapm_route analogue_routes[] = {
        { "Right Output Mixer", "Right Input Switch", "MIXINR" },
        { "Right Output Mixer", "IN2LN Switch", "IN2LN" },
        { "Right Output Mixer", "IN2RN Switch", "IN2RN" },
-       { "Right Output Mixer", "IN2RP Switch", "IN2RP/VXRP" },
+       { "Right Output Mixer", "IN2RP Switch", "IN2RP:VXRP" },
        { "Right Output Mixer", "IN1L Switch", "IN1L PGA" },
        { "Right Output Mixer", "IN1R Switch", "IN1R PGA" },
 
@@ -753,6 +738,41 @@ int wm_hubs_add_analogue_routes(struct snd_soc_codec *codec,
 }
 EXPORT_SYMBOL_GPL(wm_hubs_add_analogue_routes);
 
+int wm_hubs_handle_analogue_pdata(struct snd_soc_codec *codec,
+                                 int lineout1_diff, int lineout2_diff,
+                                 int lineout1fb, int lineout2fb,
+                                 int jd_scthr, int jd_thr, int micbias1_lvl,
+                                 int micbias2_lvl)
+{
+       if (!lineout1_diff)
+               snd_soc_update_bits(codec, WM8993_LINE_MIXER1,
+                                   WM8993_LINEOUT1_MODE,
+                                   WM8993_LINEOUT1_MODE);
+       if (!lineout2_diff)
+               snd_soc_update_bits(codec, WM8993_LINE_MIXER2,
+                                   WM8993_LINEOUT2_MODE,
+                                   WM8993_LINEOUT2_MODE);
+
+       if (lineout1fb)
+               snd_soc_update_bits(codec, WM8993_ADDITIONAL_CONTROL,
+                                   WM8993_LINEOUT1_FB, WM8993_LINEOUT1_FB);
+
+       if (lineout2fb)
+               snd_soc_update_bits(codec, WM8993_ADDITIONAL_CONTROL,
+                                   WM8993_LINEOUT2_FB, WM8993_LINEOUT2_FB);
+
+       snd_soc_update_bits(codec, WM8993_MICBIAS,
+                           WM8993_JD_SCTHR_MASK | WM8993_JD_THR_MASK |
+                           WM8993_MICB1_LVL | WM8993_MICB2_LVL,
+                           jd_scthr << WM8993_JD_SCTHR_SHIFT |
+                           jd_thr << WM8993_JD_THR_SHIFT |
+                           micbias1_lvl |
+                           micbias2_lvl << WM8993_MICB2_LVL_SHIFT);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(wm_hubs_handle_analogue_pdata);
+
 MODULE_DESCRIPTION("Shared support for Wolfson hubs products");
 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
 MODULE_LICENSE("GPL");