Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a575be4c authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Mark Brown
Browse files

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: 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 6e0b73a0
Loading
Loading
Loading
Loading
+8 −37
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@
#include <sound/tlv.h>
#include "wm9712.h"

#define WM9712_VENDOR_ID 0x574d4c12
#define WM9712_VENDOR_ID_MASK 0xffffffff

struct wm9712_priv {
	struct snd_ac97 *ac97;
	unsigned int hp_mixer[2];
@@ -613,35 +616,14 @@ static int wm9712_set_bias_level(struct snd_soc_codec *codec,
	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)
{
	struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
	int i, ret;
	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)
		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)
{
	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)) {
		ret = PTR_ERR(wm9712->ac97);
		dev_err(codec->dev, "Failed to register AC97 codec: %d\n", 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 */
	ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);

	return 0;

err_put_device:
	put_device(&wm9712->ac97->dev);
	return ret;
}

static int wm9712_soc_remove(struct snd_soc_codec *codec)