ASoC: arizona: Factor out speaker widgets from CODEC drivers
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 10 Jan 2013 14:45:58 +0000 (14:45 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 21 Mar 2013 17:54:18 +0000 (18:54 +0100)
Some system designs have been identified which repurpose portions of the
speaker driver circuits for other functions which will require that they
not be managed using DAPM. Prepare for this by factoring out the creation
of the speaker widgets into the core driver, the widgets will be replaced
by dummy ones when the additional functions are enabled.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c

index 2b0803ec82347b560f8aed278ab5a6e557b3d3bf..009810b8c667ebb03c9f4dc669edea6144c5f43d 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/gcd.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
+#include <linux/delay.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/tlv.h>
 #define arizona_aif_dbg(_dai, fmt, ...) \
        dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
 
+static int arizona_spk_ev(struct snd_soc_dapm_widget *w,
+                         struct snd_kcontrol *kcontrol,
+                         int event)
+{
+       struct snd_soc_codec *codec = w->codec;
+       struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
+       struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
+       bool manual_ena = false;
+
+       switch (arizona->type) {
+       case WM5102:
+               switch (arizona->rev) {
+               case 0:
+                       break;
+               default:
+                       manual_ena = true;
+                       break;
+               }
+       default:
+               break;
+       }
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               if (!priv->spk_ena && manual_ena) {
+                       snd_soc_write(codec, 0x4f5, 0x25a);
+                       priv->spk_ena_pending = true;
+               }
+               break;
+       case SND_SOC_DAPM_POST_PMU:
+               if (priv->spk_ena_pending) {
+                       msleep(75);
+                       snd_soc_write(codec, 0x4f5, 0xda);
+                       priv->spk_ena_pending = false;
+                       priv->spk_ena++;
+               }
+               break;
+       case SND_SOC_DAPM_PRE_PMD:
+               if (manual_ena) {
+                       priv->spk_ena--;
+                       if (!priv->spk_ena)
+                               snd_soc_write(codec, 0x4f5, 0x25a);
+               }
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               if (manual_ena) {
+                       if (!priv->spk_ena)
+                               snd_soc_write(codec, 0x4f5, 0x0da);
+               }
+               break;
+       }
+
+       return 0;
+}
+
+static const struct snd_soc_dapm_widget arizona_spkl =
+       SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
+                          ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
+
+static const struct snd_soc_dapm_widget arizona_spkr =
+       SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
+                          ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
+
+int arizona_init_spk(struct snd_soc_codec *codec)
+{
+       int ret;
+
+       ret = snd_soc_dapm_new_controls(&codec->dapm, &arizona_spkl, 1);
+       if (ret != 0)
+               return ret;
+
+       ret = snd_soc_dapm_new_controls(&codec->dapm, &arizona_spkr, 1);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(arizona_init_spk);
+
 const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
        "None",
        "Tone Generator 1",
index 572f11bc90b43fa697178e9fff5c909de958c554..9399940f700d931f6373e8fac93fb4c514c0d6e2 100644 (file)
@@ -76,6 +76,9 @@ struct arizona_priv {
 
        int num_inputs;
        unsigned int in_pending;
+
+       unsigned int spk_ena:2;
+       unsigned int spk_ena_pending:1;
 };
 
 #define ARIZONA_NUM_MIXER_INPUTS 99
@@ -228,6 +231,8 @@ extern int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
 extern int arizona_set_fll(struct arizona_fll *fll, int source,
                           unsigned int Fref, unsigned int Fout);
 
+extern int arizona_init_spk(struct snd_soc_codec *codec);
+
 extern int arizona_init_dai(struct arizona_priv *priv, int dai);
 
 int arizona_set_output_mode(struct snd_soc_codec *codec, int output,
index 44d4c69d25e562728e2fbcbccba347daae153244..97757bc5fd0ec4632edbdef938a2434d969ba639 100644 (file)
@@ -36,9 +36,6 @@
 struct wm5102_priv {
        struct arizona_priv core;
        struct arizona_fll fll[2];
-
-       unsigned int spk_ena:2;
-       unsigned int spk_ena_pending:1;
 };
 
 static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
@@ -817,47 +814,6 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
 ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
 };
 
-static int wm5102_spk_ev(struct snd_soc_dapm_widget *w,
-                        struct snd_kcontrol *kcontrol,
-                        int event)
-{
-       struct snd_soc_codec *codec = w->codec;
-       struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
-       struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec);
-
-       if (arizona->rev < 1)
-               return 0;
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               if (!wm5102->spk_ena) {
-                       snd_soc_write(codec, 0x4f5, 0x25a);
-                       wm5102->spk_ena_pending = true;
-               }
-               break;
-       case SND_SOC_DAPM_POST_PMU:
-               if (wm5102->spk_ena_pending) {
-                       msleep(75);
-                       snd_soc_write(codec, 0x4f5, 0xda);
-                       wm5102->spk_ena_pending = false;
-                       wm5102->spk_ena++;
-               }
-               break;
-       case SND_SOC_DAPM_PRE_PMD:
-               wm5102->spk_ena--;
-               if (!wm5102->spk_ena)
-                       snd_soc_write(codec, 0x4f5, 0x25a);
-               break;
-       case SND_SOC_DAPM_POST_PMD:
-               if (!wm5102->spk_ena)
-                       snd_soc_write(codec, 0x4f5, 0x0da);
-               break;
-       }
-
-       return 0;
-}
-
-
 ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
 ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
 ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
@@ -1141,12 +1097,6 @@ SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
 SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
-SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
-SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
@@ -1586,6 +1536,8 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
        if (ret != 0)
                return ret;
 
+       arizona_init_spk(codec);
+
        snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");
 
        priv->core.arizona->dapm = &codec->dapm;
index a64d3b8bc3b4486753097e204402df7ee7070ba0..b6329c8c19dff1b43a1b896187645a5039263479 100644 (file)
@@ -577,12 +577,6 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
 SND_SOC_DAPM_PGA_E("OUT3R", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
-SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
-SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),