From 034e3190a40d537eef249cb03032c28ff4660e36 Mon Sep 17 00:00:00 2001 From: Mika Westerberg Date: Wed, 13 Oct 2010 11:30:32 +0300 Subject: [PATCH] --- yaml --- r: 216629 b: refs/heads/master c: 0562f7882d968463119bb63d47ef4bdaba7d6631 h: refs/heads/master i: 216627: 12b81232fc9ec86a7da8d3794c9eab41a2ac0c32 v: v3 --- [refs] | 2 +- trunk/include/sound/soc.h | 1 + trunk/sound/soc/soc-core.c | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ae2d55342ed4..43d78aa91716 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7750752a22cbf7760f0073d218c737f5a03bff4a +refs/heads/master: 0562f7882d968463119bb63d47ef4bdaba7d6631 diff --git a/trunk/include/sound/soc.h b/trunk/include/sound/soc.h index 4fb079e14e16..5c3bce83f28a 100644 --- a/trunk/include/sound/soc.h +++ b/trunk/include/sound/soc.h @@ -442,6 +442,7 @@ struct snd_soc_codec { unsigned int suspended:1; /* Codec is in suspend PM state */ unsigned int probed:1; /* Codec has been probed */ unsigned int ac97_registered:1; /* Codec has been AC97 registered */ + unsigned int ac97_created:1; /* Codec has been created by SoC */ unsigned int sysfs_registered:1; /* codec has been sysfs registered */ /* codec IO */ diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c index 8751efdea119..7d22b5d5bc0d 100644 --- a/trunk/sound/soc/soc-core.c +++ b/trunk/sound/soc/soc-core.c @@ -1497,6 +1497,16 @@ static int soc_register_ac97_dai_link(struct snd_soc_pcm_runtime *rtd) * for the generic AC97 subsystem. */ if (rtd->codec_dai->driver->ac97_control && !rtd->codec->ac97_registered) { + /* + * It is possible that the AC97 device is already registered to + * the device subsystem. This happens when the device is created + * via snd_ac97_mixer(). Currently only SoC codec that does so + * is the generic AC97 glue but others migh emerge. + * + * In those cases we don't try to register the device again. + */ + if (!rtd->codec->ac97_created) + return 0; ret = soc_ac97_dev_register(rtd->codec); if (ret < 0) { @@ -1812,6 +1822,13 @@ int snd_soc_new_ac97_codec(struct snd_soc_codec *codec, codec->ac97->bus->ops = ops; codec->ac97->num = num; + + /* + * Mark the AC97 device to be created by us. This way we ensure that the + * device will be registered with the device subsystem later on. + */ + codec->ac97_created = 1; + mutex_unlock(&codec->mutex); return 0; } @@ -1832,6 +1849,7 @@ void snd_soc_free_ac97_codec(struct snd_soc_codec *codec) kfree(codec->ac97->bus); kfree(codec->ac97); codec->ac97 = NULL; + codec->ac97_created = 0; mutex_unlock(&codec->mutex); } EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec);