Skip to content

Commit

Permalink
ASoC: wm9712: 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>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Robert Jarzmik authored and Mark Brown committed Sep 19, 2017
1 parent 9bd400c commit 2ed1a8e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 15 deletions.
3 changes: 2 additions & 1 deletion sound/soc/codecs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM9081 if I2C
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_WM9712 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW)
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
Expand Down Expand Up @@ -1132,6 +1132,7 @@ config SND_SOC_WM9705
config SND_SOC_WM9712
tristate
select REGMAP_AC97
select AC97_BUS_COMPAT if AC97_BUS_NEW

config SND_SOC_WM9713
tristate
Expand Down
44 changes: 30 additions & 14 deletions sound/soc/codecs/wm9712.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@

#include <linux/init.h>
#include <linux/slab.h>
#include <linux/mfd/wm97xx.h>
#include <linux/module.h>
#include <linux/kernel.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/soc.h>
#include <sound/tlv.h>
Expand All @@ -30,6 +33,7 @@ struct wm9712_priv {
struct snd_ac97 *ac97;
unsigned int hp_mixer[2];
struct mutex lock;
struct wm97xx_platform_data *mfd_pdata;
};

static const struct reg_default wm9712_reg_defaults[] = {
Expand Down Expand Up @@ -636,18 +640,25 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec)
struct regmap *regmap;
int ret;

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

regmap = regmap_init_ac97(wm9712->ac97, &wm9712_regmap_config);
if (IS_ERR(regmap)) {
ret = PTR_ERR(regmap);
goto err_free_ac97_codec;
if (wm9712->mfd_pdata) {
wm9712->ac97 = wm9712->mfd_pdata->ac97;
regmap = wm9712->mfd_pdata->regmap;
} else {
#ifdef CONFIG_SND_SOC_AC97_BUS
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;
}

regmap = regmap_init_ac97(wm9712->ac97, &wm9712_regmap_config);
if (IS_ERR(regmap)) {
ret = PTR_ERR(regmap);
goto err_free_ac97_codec;
#endif
}

snd_soc_codec_init_regmap(codec, regmap);
Expand All @@ -663,10 +674,14 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec)

static int wm9712_soc_remove(struct snd_soc_codec *codec)
{
#ifdef CONFIG_SND_SOC_AC97_BUS
struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);

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

Expand Down Expand Up @@ -697,6 +712,7 @@ static int wm9712_probe(struct platform_device *pdev)

mutex_init(&wm9712->lock);

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

return snd_soc_register_codec(&pdev->dev,
Expand Down

0 comments on commit 2ed1a8e

Please sign in to comment.