ASoC: core: Add devm_snd_soc_register_card()
authorMark Brown <broonie@linaro.org>
Mon, 16 Sep 2013 17:02:05 +0000 (18:02 +0100)
committerMark Brown <broonie@linaro.org>
Mon, 16 Sep 2013 23:50:06 +0000 (00:50 +0100)
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>
include/sound/soc.h
sound/soc/soc-devres.c

index b970f019b452a37ea4576950590300903e255236..d44728ab2be0b4bbdaadf2bcc44917726353e6d4 100644 (file)
@@ -369,6 +369,7 @@ int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
 
 int snd_soc_register_card(struct snd_soc_card *card);
 int snd_soc_unregister_card(struct snd_soc_card *card);
+int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
 int snd_soc_suspend(struct device *dev);
 int snd_soc_resume(struct device *dev);
 int snd_soc_poweroff(struct device *dev);
index 13fe86f7c9a8cdbd9d0a26794ebd23cd57965cab..b1d732255c0275fd06039efe36988b1a8ba3e8d2 100644 (file)
@@ -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);