Skip to content

Commit

Permalink
ASoC: wm9713: Use core AC'97 reset helper
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Takashi Iwai <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
larsclausen authored and broonie committed Jul 23, 2015
1 parent a575be4 commit 310398f
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 42 deletions.
48 changes: 8 additions & 40 deletions sound/soc/codecs/wm9713.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand All @@ -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)
Expand Down
2 changes: 0 additions & 2 deletions sound/soc/codecs/wm9713.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 310398f

Please sign in to comment.