Commit 310398f5 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Mark Brown

ASoC: wm9713: Use core AC'97 reset helper

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: default avatarLars-Peter Clausen <lars@metafoo.de>
Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a575be4c
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#include "wm9713.h" #include "wm9713.h"
#define WM9713_VENDOR_ID 0x574d4c13
#define WM9713_VENDOR_ID_MASK 0xffffffff
struct wm9713_priv { struct wm9713_priv {
struct snd_ac97 *ac97; struct snd_ac97 *ac97;
u32 pll_in; /* PLL input frequency */ u32 pll_in; /* PLL input frequency */
...@@ -1123,28 +1126,6 @@ static struct snd_soc_dai_driver wm9713_dai[] = { ...@@ -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, static int wm9713_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
...@@ -1196,7 +1177,8 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec) ...@@ -1196,7 +1177,8 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
int i, ret; int i, ret;
u16 *cache = codec->reg_cache; 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) if (ret < 0)
return ret; return ret;
...@@ -1222,32 +1204,18 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec) ...@@ -1222,32 +1204,18 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
static int wm9713_soc_probe(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); 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)) if (IS_ERR(wm9713->ac97))
return PTR_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 */ /* unmute the adc - move to kcontrol */
reg = ac97_read(codec, AC97_CD) & 0x7fff; reg = ac97_read(codec, AC97_CD) & 0x7fff;
ac97_write(codec, AC97_CD, reg); ac97_write(codec, AC97_CD, reg);
return 0; return 0;
err_put_device:
put_device(&wm9713->ac97->dev);
return ret;
} }
static int wm9713_soc_remove(struct snd_soc_codec *codec) static int wm9713_soc_remove(struct snd_soc_codec *codec)
......
...@@ -45,6 +45,4 @@ ...@@ -45,6 +45,4 @@
#define WM9713_DAI_AC97_AUX 1 #define WM9713_DAI_AC97_AUX 1
#define WM9713_DAI_PCM_VOICE 2 #define WM9713_DAI_PCM_VOICE 2
int wm9713_reset(struct snd_soc_codec *codec, int try_warm);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment