ASoC: tpa6130a2: Replace DAPM code with direct interface
authorPeter Ujfalusi <peter.ujfalusi@nokia.com>
Thu, 2 Dec 2010 07:29:56 +0000 (09:29 +0200)
committerLiam Girdwood <lrg@slimlogic.co.uk>
Thu, 2 Dec 2010 11:50:07 +0000 (11:50 +0000)
The use of DAPM widgets, and extra routing can cause ordering
problems in the system.
Machine drivers should use the exported direct interface with
SND_SOC_DAPM_HP's event callback to manage the state of the
amplifier.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
sound/soc/codecs/tpa6130a2.c
sound/soc/codecs/tpa6130a2.h

index c97badfac540ef69aef67c70b2fbb536a19abab3..0a99f313e218a262056f0de6bca0c96f54e1ef9b 100644 (file)
@@ -317,65 +317,24 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
        }
 }
 
-static int tpa6130a2_pga_event(struct snd_soc_dapm_widget *w,
-               struct snd_kcontrol *kcontrol, int event)
-{
-       switch (event) {
-       case SND_SOC_DAPM_POST_PMU:
-               tpa6130a2_channel_enable(w->shift, 1);
-               break;
-       case SND_SOC_DAPM_POST_PMD:
-               tpa6130a2_channel_enable(w->shift, 0);
-               break;
-       }
-       return 0;
-}
-
-static int tpa6130a2_supply_event(struct snd_soc_dapm_widget *w,
-               struct snd_kcontrol *kcontrol, int event)
+int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable)
 {
        int ret = 0;
-
-       switch (event) {
-       case SND_SOC_DAPM_POST_PMU:
+       if (enable) {
                ret = tpa6130a2_power(1);
-               break;
-       case SND_SOC_DAPM_POST_PMD:
+               if (ret < 0)
+                       return ret;
+               tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
+                                        1);
+       } else {
+               tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
+                                        0);
                ret = tpa6130a2_power(0);
-               break;
        }
+
        return ret;
 }
-
-static const struct snd_soc_dapm_widget tpa6130a2_dapm_widgets[] = {
-       SND_SOC_DAPM_PGA_E("TPA6130A2 Left", SND_SOC_NOPM,
-                       TPA6130A2_HP_EN_L, 0, NULL, 0, tpa6130a2_pga_event,
-                       SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
-       SND_SOC_DAPM_PGA_E("TPA6130A2 Right", SND_SOC_NOPM,
-                       TPA6130A2_HP_EN_R, 0, NULL, 0, tpa6130a2_pga_event,
-                       SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
-       SND_SOC_DAPM_PGA_E("TPA6130A2 Stereo", SND_SOC_NOPM,
-                       TPA6130A2_HP_EN_L | TPA6130A2_HP_EN_R, 0, NULL, 0,
-                       tpa6130a2_pga_event,
-                       SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
-       SND_SOC_DAPM_SUPPLY("TPA6130A2 Enable", SND_SOC_NOPM,
-                       0, 0, tpa6130a2_supply_event,
-                       SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
-       /* Outputs */
-       SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Left"),
-       SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Right"),
-       SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Stereo"),
-};
-
-static const struct snd_soc_dapm_route audio_map[] = {
-       {"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Left"},
-       {"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Right"},
-       {"TPA6130A2 Headphone Stereo", NULL, "TPA6130A2 Stereo"},
-
-       {"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Enable"},
-       {"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Enable"},
-       {"TPA6130A2 Headphone Stereo", NULL, "TPA6130A2 Enable"},
-};
+EXPORT_SYMBOL_GPL(tpa6130a2_stereo_enable);
 
 int tpa6130a2_add_controls(struct snd_soc_codec *codec)
 {
@@ -387,18 +346,12 @@ int tpa6130a2_add_controls(struct snd_soc_codec *codec)
 
        data = i2c_get_clientdata(tpa6130a2_client);
 
-       snd_soc_dapm_new_controls(dapm, tpa6130a2_dapm_widgets,
-                               ARRAY_SIZE(tpa6130a2_dapm_widgets));
-
-       snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
-
        if (data->id == TPA6140A2)
                return snd_soc_add_controls(codec, tpa6140a2_controls,
                                                ARRAY_SIZE(tpa6140a2_controls));
        else
                return snd_soc_add_controls(codec, tpa6130a2_controls,
                                                ARRAY_SIZE(tpa6130a2_controls));
-
 }
 EXPORT_SYMBOL_GPL(tpa6130a2_add_controls);
 
index 57e867fd86d18040532085ae1c364329de3b9609..5df49c8756b2362df2927c869b068bd8a5241ac5 100644 (file)
@@ -57,5 +57,6 @@
 #define TPA6130A2_VERSION_MASK         (0x0f)
 
 extern int tpa6130a2_add_controls(struct snd_soc_codec *codec);
+extern int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable);
 
 #endif /* __TPA6130A2_H__ */