diff options
author | Takashi Iwai <tiwai@suse.de> | 2022-04-12 11:31:40 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-04-20 09:36:07 +0200 |
commit | d0f475336f7d3d3b5a155a427e02021f695ef4ff (patch) | |
tree | 76c3d80c6da0334102637e08af7b65165bab98d5 /include/sound | |
parent | 1cb572a8477f022b5baabd0a7e701e47e9e5b040 (diff) | |
download | linux-stable-d0f475336f7d3d3b5a155a427e02021f695ef4ff.tar.gz linux-stable-d0f475336f7d3d3b5a155a427e02021f695ef4ff.tar.bz2 linux-stable-d0f475336f7d3d3b5a155a427e02021f695ef4ff.zip |
ALSA: core: Add snd_card_free_on_error() helper
commit fee2b871d8d6389c9b4bdf9346a99ccc1c98c9b8 upstream.
This is a small helper function to handle the error path more easily
when an error happens during the probe for the device with the
device-managed card. Since devres releases in the reverser order of
the creations, usually snd_card_free() gets called at the last in the
probe error path unless it already reached snd_card_register() calls.
Due to this nature, when a driver expects the resource releases in
card->private_free, this might be called too lately.
As a workaround, one should call the probe like:
static int __some_probe(...) { // do real probe.... }
static int some_probe(...)
{
return snd_card_free_on_error(dev, __some_probe(dev, ...));
}
so that the snd_card_free() is called explicitly at the beginning of
the error path from the probe.
This function will be used in the upcoming fixes to address the
regressions by devres usages.
Fixes: e8ad415b7a55 ("ALSA: core: Add managed card creation")
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20220412093141.8008-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/sound')
-rw-r--r-- | include/sound/core.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/sound/core.h b/include/sound/core.h index b7e9b58d3c78..6d4cc49584c6 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -284,6 +284,7 @@ int snd_card_disconnect(struct snd_card *card); void snd_card_disconnect_sync(struct snd_card *card); int snd_card_free(struct snd_card *card); int snd_card_free_when_closed(struct snd_card *card); +int snd_card_free_on_error(struct device *dev, int ret); void snd_card_set_id(struct snd_card *card, const char *id); int snd_card_register(struct snd_card *card); int snd_card_info_init(void); |