]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
ASoC: wm_adsp: Add codec_probe and codec_remove stubs
authorRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
Thu, 11 Jun 2015 10:32:30 +0000 (11:32 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 11 Jun 2015 10:39:39 +0000 (11:39 +0100)
Currently the only init function in wm_adsp is called by the
codec driver early in its probe before the codec has been
registered with SOC.

This patch adds stubs for the codec_probe and codec_remove stages
and calls them from WM5102 and WM5110 codec drivers. This allows us
to hang anything that needs setup during the codec probe stage off
these functions without further modification of the codec drivers.

Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index 11eba0e58fc0cccfaf832f4018742e99ee904962..341d96e3376c1b5a5f632c81a126869b089d3060 100644 (file)
@@ -1875,6 +1875,10 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
        struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec);
        int ret;
 
+       ret = wm_adsp2_codec_probe(&priv->core.adsp[0], codec);
+       if (ret)
+               return ret;
+
        ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 2);
        if (ret != 0)
                return ret;
@@ -1893,6 +1897,8 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec)
 {
        struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec);
 
+       wm_adsp2_codec_remove(&priv->core.adsp[0], codec);
+
        priv->core.arizona->dapm = NULL;
 
        return 0;
index d65364e915320e158e2c749dee5e311d113fae1b..6e15d9c7ec239ed1bbfb56aa2fd66ca021c29507 100644 (file)
@@ -1599,7 +1599,7 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
 static int wm5110_codec_probe(struct snd_soc_codec *codec)
 {
        struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
-       int ret;
+       int i, ret;
 
        priv->core.arizona->dapm = &codec->dapm;
 
@@ -1607,6 +1607,12 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
        arizona_init_gpio(codec);
        arizona_init_mono(codec);
 
+       for (i = 0; i < WM5110_NUM_ADSP; ++i) {
+               ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec);
+               if (ret)
+                       return ret;
+       }
+
        ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 8);
        if (ret != 0)
                return ret;
@@ -1621,6 +1627,10 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
 static int wm5110_codec_remove(struct snd_soc_codec *codec)
 {
        struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
+       int i;
+
+       for (i = 0; i < WM5110_NUM_ADSP; ++i)
+               wm_adsp2_codec_remove(&priv->core.adsp[i], codec);
 
        priv->core.arizona->dapm = NULL;
 
index b62ffd0c133ea1f02868f774d12f9ecc70a64357..9fad2fdf12643bd0779338ed364ce342e3b0a3bb 100644 (file)
@@ -1933,6 +1933,18 @@ err:
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_event);
 
+int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec)
+{
+       return 0;
+}
+EXPORT_SYMBOL_GPL(wm_adsp2_codec_probe);
+
+int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec)
+{
+       return 0;
+}
+EXPORT_SYMBOL_GPL(wm_adsp2_codec_remove);
+
 int wm_adsp2_init(struct wm_adsp *dsp)
 {
        int ret;
index 0e5f07c35d5053b996a7c916b88fdd8b56ec20c3..5584e34e9a01a47f81388780d41a810e7fa44580 100644 (file)
@@ -79,6 +79,8 @@ extern const struct snd_kcontrol_new wm_adsp2_fw_controls[];
 
 int wm_adsp1_init(struct wm_adsp *dsp);
 int wm_adsp2_init(struct wm_adsp *dsp);
+int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec);
+int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec);
 int wm_adsp1_event(struct snd_soc_dapm_widget *w,
                   struct snd_kcontrol *kcontrol, int event);
 int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,