mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-03 07:41:40 +00:00
ASoC: wm9712: 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
6e0b73a0a1
commit
a575be4cbb
@ -23,6 +23,9 @@
|
|||||||
#include <sound/tlv.h>
|
#include <sound/tlv.h>
|
||||||
#include "wm9712.h"
|
#include "wm9712.h"
|
||||||
|
|
||||||
|
#define WM9712_VENDOR_ID 0x574d4c12
|
||||||
|
#define WM9712_VENDOR_ID_MASK 0xffffffff
|
||||||
|
|
||||||
struct wm9712_priv {
|
struct wm9712_priv {
|
||||||
struct snd_ac97 *ac97;
|
struct snd_ac97 *ac97;
|
||||||
unsigned int hp_mixer[2];
|
unsigned int hp_mixer[2];
|
||||||
@ -613,35 +616,14 @@ static int wm9712_set_bias_level(struct snd_soc_codec *codec,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm9712_reset(struct snd_soc_codec *codec, int try_warm)
|
|
||||||
{
|
|
||||||
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
|
|
||||||
|
|
||||||
if (try_warm && soc_ac97_ops->warm_reset) {
|
|
||||||
soc_ac97_ops->warm_reset(wm9712->ac97);
|
|
||||||
if (ac97_read(codec, 0) == wm9712_reg[0])
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
soc_ac97_ops->reset(wm9712->ac97);
|
|
||||||
if (soc_ac97_ops->warm_reset)
|
|
||||||
soc_ac97_ops->warm_reset(wm9712->ac97);
|
|
||||||
if (ac97_read(codec, 0) != wm9712_reg[0])
|
|
||||||
goto err;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err:
|
|
||||||
dev_err(codec->dev, "Failed to reset: AC97 link error\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wm9712_soc_resume(struct snd_soc_codec *codec)
|
static int wm9712_soc_resume(struct snd_soc_codec *codec)
|
||||||
{
|
{
|
||||||
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
|
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
|
||||||
int i, ret;
|
int i, ret;
|
||||||
u16 *cache = codec->reg_cache;
|
u16 *cache = codec->reg_cache;
|
||||||
|
|
||||||
ret = wm9712_reset(codec, 1);
|
ret = snd_ac97_reset(wm9712->ac97, true, WM9712_VENDOR_ID,
|
||||||
|
WM9712_VENDOR_ID_MASK);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -663,31 +645,20 @@ static int wm9712_soc_resume(struct snd_soc_codec *codec)
|
|||||||
static int wm9712_soc_probe(struct snd_soc_codec *codec)
|
static int wm9712_soc_probe(struct snd_soc_codec *codec)
|
||||||
{
|
{
|
||||||
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
|
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
|
||||||
int ret = 0;
|
int ret;
|
||||||
|
|
||||||
wm9712->ac97 = snd_soc_alloc_ac97_codec(codec);
|
wm9712->ac97 = snd_soc_new_ac97_codec(codec, WM9712_VENDOR_ID,
|
||||||
|
WM9712_VENDOR_ID_MASK);
|
||||||
if (IS_ERR(wm9712->ac97)) {
|
if (IS_ERR(wm9712->ac97)) {
|
||||||
ret = PTR_ERR(wm9712->ac97);
|
ret = PTR_ERR(wm9712->ac97);
|
||||||
dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret);
|
dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wm9712_reset(codec, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
goto err_put_device;
|
|
||||||
|
|
||||||
ret = device_add(&wm9712->ac97->dev);
|
|
||||||
if (ret)
|
|
||||||
goto err_put_device;
|
|
||||||
|
|
||||||
/* set alc mux to none */
|
/* set alc mux to none */
|
||||||
ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);
|
ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_put_device:
|
|
||||||
put_device(&wm9712->ac97->dev);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm9712_soc_remove(struct snd_soc_codec *codec)
|
static int wm9712_soc_remove(struct snd_soc_codec *codec)
|
||||||
|
Loading…
Reference in New Issue
Block a user