summaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-devres.c
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-09-16 18:02:05 +0100
committerMark Brown <broonie@linaro.org>2013-09-17 00:50:06 +0100
commit0e4ff5c806263bf40ee5409ac283b776f0c11e41 (patch)
treeeda5a0e77010c93620b288ded2b9b1cdff85a977 /sound/soc/soc-devres.c
parenta0b03a616b08cf9d709812ff5cf7e9c0958d6807 (diff)
downloadlinux-0e4ff5c806263bf40ee5409ac283b776f0c11e41.tar.gz
linux-0e4ff5c806263bf40ee5409ac283b776f0c11e41.tar.bz2
linux-0e4ff5c806263bf40ee5409ac283b776f0c11e41.zip
ASoC: core: Add devm_snd_soc_register_card()
Simplify error handling and remove repetitive (and rarely executed) code for unregistration by providing a devm_snd_soc_register() card. Signed-off-by: Mark Brown <broonie@linaro.org> Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Diffstat (limited to 'sound/soc/soc-devres.c')
-rw-r--r--sound/soc/soc-devres.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/sound/soc/soc-devres.c b/sound/soc/soc-devres.c
index 13fe86f7c9a8..b1d732255c02 100644
--- a/sound/soc/soc-devres.c
+++ b/sound/soc/soc-devres.c
@@ -50,3 +50,37 @@ int devm_snd_soc_register_component(struct device *dev,
return ret;
}
EXPORT_SYMBOL_GPL(devm_snd_soc_register_component);
+
+static void devm_card_release(struct device *dev, void *res)
+{
+ snd_soc_unregister_card(*(struct snd_soc_card **)res);
+}
+
+/**
+ * devm_snd_soc_register_card - resource managed card registration
+ * @dev: Device used to manage card
+ * @card: Card to register
+ *
+ * Register a card with automatic unregistration when the device is
+ * unregistered.
+ */
+int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card)
+{
+ struct device **ptr;
+ int ret;
+
+ ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL);
+ if (!ptr)
+ return -ENOMEM;
+
+ ret = snd_soc_register_card(card);
+ if (ret == 0) {
+ *ptr = dev;
+ devres_add(dev, ptr);
+ } else {
+ devres_free(ptr);
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(devm_snd_soc_register_card);