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: Lars-Peter Clausen <lars@metafoo.de> Reviewed-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
a575be4cbb
commit
310398f5e4
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue