OSDN Git Service

ASoC: wm9713: Use core AC'97 reset helper
authorLars-Peter Clausen <lars@metafoo.de>
Tue, 21 Jul 2015 19:53:06 +0000 (21:53 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 23 Jul 2015 16:33:43 +0000 (17:33 +0100)
Use the new snd_ac97_reset() helper and the reset functionality provided by
snd_soc_new_ac97_codec() to perform the device reset rather than
open-coding it.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm9713.c
sound/soc/codecs/wm9713.h

index 89cd2d6..955e651 100644 (file)
@@ -29,6 +29,9 @@
 
 #include "wm9713.h"
 
+#define WM9713_VENDOR_ID 0x574d4c13
+#define WM9713_VENDOR_ID_MASK 0xffffffff
+
 struct wm9713_priv {
        struct snd_ac97 *ac97;
        u32 pll_in; /* PLL input frequency */
@@ -1123,28 +1126,6 @@ static struct snd_soc_dai_driver wm9713_dai[] = {
        },
 };
 
-int wm9713_reset(struct snd_soc_codec *codec, int try_warm)
-{
-       struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
-
-       if (try_warm && soc_ac97_ops->warm_reset) {
-               soc_ac97_ops->warm_reset(wm9713->ac97);
-               if (ac97_read(codec, 0) == wm9713_reg[0])
-                       return 1;
-       }
-
-       soc_ac97_ops->reset(wm9713->ac97);
-       if (soc_ac97_ops->warm_reset)
-               soc_ac97_ops->warm_reset(wm9713->ac97);
-       if (ac97_read(codec, 0) != wm9713_reg[0]) {
-               dev_err(codec->dev, "Failed to reset: AC97 link error\n");
-               return -EIO;
-       }
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(wm9713_reset);
-
 static int wm9713_set_bias_level(struct snd_soc_codec *codec,
                                 enum snd_soc_bias_level level)
 {
@@ -1196,7 +1177,8 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
        int i, ret;
        u16 *cache = codec->reg_cache;
 
-       ret = wm9713_reset(codec, 1);
+       ret = snd_ac97_reset(wm9713->ac97, true, WM9713_VENDOR_ID,
+               WM9713_VENDOR_ID_MASK);
        if (ret < 0)
                return ret;
 
@@ -1222,32 +1204,18 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
 static int wm9713_soc_probe(struct snd_soc_codec *codec)
 {
        struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
-       int ret = 0, reg;
+       int reg;
 
-       wm9713->ac97 = snd_soc_alloc_ac97_codec(codec);
+       wm9713->ac97 = snd_soc_new_ac97_codec(codec, WM9713_VENDOR_ID,
+               WM9713_VENDOR_ID_MASK);
        if (IS_ERR(wm9713->ac97))
                return PTR_ERR(wm9713->ac97);
 
-       /* do a cold reset for the controller and then try
-        * a warm reset followed by an optional cold reset for codec */
-       wm9713_reset(codec, 0);
-       ret = wm9713_reset(codec, 1);
-       if (ret < 0)
-               goto err_put_device;
-
-       ret = device_add(&wm9713->ac97->dev);
-       if (ret)
-               goto err_put_device;
-
        /* unmute the adc - move to kcontrol */
        reg = ac97_read(codec, AC97_CD) & 0x7fff;
        ac97_write(codec, AC97_CD, reg);
 
        return 0;
-
-err_put_device:
-       put_device(&wm9713->ac97->dev);
-       return ret;
 }
 
 static int wm9713_soc_remove(struct snd_soc_codec *codec)
index 793da86..53df11b 100644 (file)
@@ -45,6 +45,4 @@
 #define WM9713_DAI_AC97_AUX            1
 #define WM9713_DAI_PCM_VOICE   2
 
-int wm9713_reset(struct snd_soc_codec *codec,  int try_warm);
-
 #endif