Skip to content

Commit

Permalink
ASoC: wm9705: 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 c6e46e5 commit aaafcfe
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 14 deletions.
3 changes: 2 additions & 1 deletion sound/soc/codecs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8998 if MFD_WM8998
select SND_SOC_WM9081 if I2C
select SND_SOC_WM9090 if I2C
select SND_SOC_WM9705 if SND_SOC_AC97_BUS
select SND_SOC_WM9705 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW)
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
Expand Down Expand Up @@ -1128,6 +1128,7 @@ config SND_SOC_WM9090
config SND_SOC_WM9705
tristate
select REGMAP_AC97
select AC97_BUS_COMPAT if AC97_BUS_NEW

config SND_SOC_WM9712
tristate
Expand Down
42 changes: 29 additions & 13 deletions sound/soc/codecs/wm9705.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,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>

Expand All @@ -26,6 +29,7 @@

struct wm9705_priv {
struct snd_ac97 *ac97;
struct wm97xx_platform_data *mfd_pdata;
};

static const struct reg_default wm9705_reg_defaults[] = {
Expand Down Expand Up @@ -319,17 +323,24 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec)
struct regmap *regmap;
int ret;

wm9705->ac97 = snd_soc_new_ac97_codec(codec, WM9705_VENDOR_ID,
WM9705_VENDOR_ID_MASK);
if (IS_ERR(wm9705->ac97)) {
dev_err(codec->dev, "Failed to register AC97 codec\n");
return PTR_ERR(wm9705->ac97);
}

regmap = regmap_init_ac97(wm9705->ac97, &wm9705_regmap_config);
if (IS_ERR(regmap)) {
ret = PTR_ERR(regmap);
goto err_free_ac97_codec;
if (wm9705->mfd_pdata) {
wm9705->ac97 = wm9705->mfd_pdata->ac97;
regmap = wm9705->mfd_pdata->regmap;
} else {
#ifdef CONFIG_SND_SOC_AC97_BUS
wm9705->ac97 = snd_soc_new_ac97_codec(codec, WM9705_VENDOR_ID,
WM9705_VENDOR_ID_MASK);
if (IS_ERR(wm9705->ac97)) {
dev_err(codec->dev, "Failed to register AC97 codec\n");
return PTR_ERR(wm9705->ac97);
}

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

snd_soc_codec_set_drvdata(codec, wm9705->ac97);
Expand All @@ -343,10 +354,14 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec)

static int wm9705_soc_remove(struct snd_soc_codec *codec)
{
#ifdef CONFIG_SND_SOC_AC97_BUS
struct wm9705_priv *wm9705 = snd_soc_codec_get_drvdata(codec);

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

Expand Down Expand Up @@ -374,6 +389,7 @@ static int wm9705_probe(struct platform_device *pdev)
if (wm9705 == NULL)
return -ENOMEM;

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

return snd_soc_register_codec(&pdev->dev,
Expand Down

0 comments on commit aaafcfe

Please sign in to comment.