ASoC: ac97: Push snd_ac97 pointer to the driver level
Now that the ASoC core no longer needs a handle to the AC'97 device that is associated with a CODEC we can remove it from the snd_soc_codec struct and push it into the individual driver state structs like we do for other communication buses. Doing so creates a clean separation between the AC'97 bus support and the ASoC core. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:

committed by
Mark Brown

parent
bc26321404
commit
358a8bb562
@@ -135,6 +135,7 @@ static const struct snd_soc_dapm_route ad1980_dapm_routes[] = {
|
||||
static unsigned int ac97_read(struct snd_soc_codec *codec,
|
||||
unsigned int reg)
|
||||
{
|
||||
struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
|
||||
u16 *cache = codec->reg_cache;
|
||||
|
||||
switch (reg) {
|
||||
@@ -144,7 +145,7 @@ static unsigned int ac97_read(struct snd_soc_codec *codec,
|
||||
case AC97_EXTENDED_STATUS:
|
||||
case AC97_VENDOR_ID1:
|
||||
case AC97_VENDOR_ID2:
|
||||
return soc_ac97_ops->read(codec->ac97, reg);
|
||||
return soc_ac97_ops->read(ac97, reg);
|
||||
default:
|
||||
reg = reg >> 1;
|
||||
|
||||
@@ -158,9 +159,10 @@ static unsigned int ac97_read(struct snd_soc_codec *codec,
|
||||
static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int val)
|
||||
{
|
||||
struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
|
||||
u16 *cache = codec->reg_cache;
|
||||
|
||||
soc_ac97_ops->write(codec->ac97, reg, val);
|
||||
soc_ac97_ops->write(ac97, reg, val);
|
||||
reg = reg >> 1;
|
||||
if (reg < ARRAY_SIZE(ad1980_reg))
|
||||
cache[reg] = val;
|
||||
@@ -186,16 +188,17 @@ static struct snd_soc_dai_driver ad1980_dai = {
|
||||
|
||||
static int ad1980_reset(struct snd_soc_codec *codec, int try_warm)
|
||||
{
|
||||
struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
|
||||
unsigned int retry_cnt = 0;
|
||||
|
||||
do {
|
||||
if (try_warm && soc_ac97_ops->warm_reset) {
|
||||
soc_ac97_ops->warm_reset(codec->ac97);
|
||||
soc_ac97_ops->warm_reset(ac97);
|
||||
if (ac97_read(codec, AC97_RESET) == 0x0090)
|
||||
return 1;
|
||||
}
|
||||
|
||||
soc_ac97_ops->reset(codec->ac97);
|
||||
soc_ac97_ops->reset(ac97);
|
||||
/*
|
||||
* Set bit 16slot in register 74h, then every slot will has only
|
||||
* 16 bits. This command is sent out in 20bit mode, in which
|
||||
@@ -215,16 +218,20 @@ static int ad1980_reset(struct snd_soc_codec *codec, int try_warm)
|
||||
|
||||
static int ad1980_soc_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct snd_ac97 *ac97;
|
||||
int ret;
|
||||
u16 vendor_id2;
|
||||
u16 ext_status;
|
||||
|
||||
ret = snd_soc_new_ac97_codec(codec);
|
||||
if (ret < 0) {
|
||||
dev_err(codec->dev, "Failed to register AC97 codec\n");
|
||||
ac97 = snd_soc_new_ac97_codec(codec);
|
||||
if (IS_ERR(ac97)) {
|
||||
ret = PTR_ERR(ac97);
|
||||
dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
snd_soc_codec_set_drvdata(codec, ac97);
|
||||
|
||||
ret = ad1980_reset(codec, 0);
|
||||
if (ret < 0)
|
||||
goto reset_err;
|
||||
@@ -261,13 +268,15 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
|
||||
reset_err:
|
||||
snd_soc_free_ac97_codec(codec);
|
||||
snd_soc_free_ac97_codec(ac97);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ad1980_soc_remove(struct snd_soc_codec *codec)
|
||||
{
|
||||
snd_soc_free_ac97_codec(codec);
|
||||
struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
snd_soc_free_ac97_codec(ac97);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user