Skip to content

Commit

Permalink
ASoC: wm9713: add ac97 new bus support
Browse files Browse the repository at this point in the history
Add support for the new ac97 bus model, where devices are automatically
discovered on AC-Links.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Robert Jarzmik authored and Mark Brown committed Sep 19, 2017
1 parent ae9d1b5 commit 9bd400c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 13 deletions.
3 changes: 2 additions & 1 deletion sound/soc/codecs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM9090 if I2C
select SND_SOC_WM9705 if SND_SOC_AC97_BUS
select SND_SOC_WM9712 if SND_SOC_AC97_BUS
select SND_SOC_WM9713 if SND_SOC_AC97_BUS
select SND_SOC_WM9713 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW)
help
Normally ASoC codec drivers are only built if a machine driver which
uses them is also built since they are only usable with a machine
Expand Down Expand Up @@ -1136,6 +1136,7 @@ config SND_SOC_WM9712
config SND_SOC_WM9713
tristate
select REGMAP_AC97
select AC97_BUS_COMPAT if AC97_BUS_NEW

config SND_SOC_ZX_AUD96P22
tristate "ZTE ZX AUD96P22 CODEC"
Expand Down
39 changes: 27 additions & 12 deletions sound/soc/codecs/wm9713.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@

#include <linux/init.h>
#include <linux/slab.h>
#include <linux/mfd/wm97xx.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/regmap.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/ac97_codec.h>
#include <sound/ac97/codec.h>
#include <sound/ac97/compat.h>
#include <sound/initval.h>
#include <sound/pcm_params.h>
#include <sound/tlv.h>
Expand All @@ -38,6 +41,7 @@ struct wm9713_priv {
u32 pll_in; /* PLL input frequency */
unsigned int hp_mixer[2];
struct mutex lock;
struct wm97xx_platform_data *mfd_pdata;
};

#define HPL_MIXER 0
Expand Down Expand Up @@ -1205,17 +1209,23 @@ 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);
struct regmap *regmap;
struct regmap *regmap = NULL;

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);

regmap = regmap_init_ac97(wm9713->ac97, &wm9713_regmap_config);
if (IS_ERR(regmap)) {
snd_soc_free_ac97_codec(wm9713->ac97);
return PTR_ERR(regmap);
if (wm9713->mfd_pdata) {
wm9713->ac97 = wm9713->mfd_pdata->ac97;
regmap = wm9713->mfd_pdata->regmap;
} else {
#ifdef CONFIG_SND_SOC_AC97_BUS
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);
regmap = regmap_init_ac97(wm9713->ac97, &wm9713_regmap_config);
if (IS_ERR(regmap)) {
snd_soc_free_ac97_codec(wm9713->ac97);
return PTR_ERR(regmap);
}
#endif
}

snd_soc_codec_init_regmap(codec, regmap);
Expand All @@ -1228,10 +1238,14 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec)

static int wm9713_soc_remove(struct snd_soc_codec *codec)
{
#ifdef CONFIG_SND_SOC_AC97_BUS
struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);

snd_soc_codec_exit_regmap(codec);
snd_soc_free_ac97_codec(wm9713->ac97);
if (!wm9713->mfd_pdata) {
snd_soc_codec_exit_regmap(codec);
snd_soc_free_ac97_codec(wm9713->ac97);
}
#endif
return 0;
}

Expand Down Expand Up @@ -1262,6 +1276,7 @@ static int wm9713_probe(struct platform_device *pdev)

mutex_init(&wm9713->lock);

wm9713->mfd_pdata = dev_get_platdata(&pdev->dev);
platform_set_drvdata(pdev, wm9713);

return snd_soc_register_codec(&pdev->dev,
Expand Down

0 comments on commit 9bd400c

Please sign in to comment.