ASoC: soc core move card cleanup from soc_remove()
authorVinod Koul <vinod.koul@intel.com>
Thu, 13 Jan 2011 17:18:02 +0000 (22:48 +0530)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 13 Jan 2011 23:28:01 +0000 (23:28 +0000)
In soc_remove() the card resources are cleaned up.
This can also be done in card_unregister()

This patch move this cleanup into a new function and calls it from
card_unregister. This paves way for further work to allow card registartion
from machine.

Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Harsha Priya <priya.harsha@intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/soc-core.c

index 30d76e8bc9dfb2c4982a28bb1d341cf9fabc6a23..318c3a720216cd4471b18ec12540675e21b2b66a 100644 (file)
@@ -1890,37 +1890,42 @@ static int soc_probe(struct platform_device *pdev)
        return 0;
 }
 
-/* removes a socdev */
-static int soc_remove(struct platform_device *pdev)
+static int soc_cleanup_card_resources(struct snd_soc_card *card)
 {
-       struct snd_soc_card *card = platform_get_drvdata(pdev);
+       struct platform_device *pdev = to_platform_device(card->dev);
        int i;
 
-       if (card->instantiated) {
+       /* make sure any delayed work runs */
+       for (i = 0; i < card->num_rtd; i++) {
+               struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
+               flush_delayed_work_sync(&rtd->delayed_work);
+       }
 
-               /* make sure any delayed work runs */
-               for (i = 0; i < card->num_rtd; i++) {
-                       struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
-                       flush_delayed_work_sync(&rtd->delayed_work);
-               }
+       /* remove auxiliary devices */
+       for (i = 0; i < card->num_aux_devs; i++)
+               soc_remove_aux_dev(card, i);
 
-               /* remove auxiliary devices */
-               for (i = 0; i < card->num_aux_devs; i++)
-                       soc_remove_aux_dev(card, i);
+       /* remove and free each DAI */
+       for (i = 0; i < card->num_rtd; i++)
+               soc_remove_dai_link(card, i);
 
-               /* remove and free each DAI */
-               for (i = 0; i < card->num_rtd; i++)
-                       soc_remove_dai_link(card, i);
+       soc_cleanup_card_debugfs(card);
 
-               soc_cleanup_card_debugfs(card);
+       /* remove the card */
+       if (card->remove)
+               card->remove(pdev);
 
-               /* remove the card */
-               if (card->remove)
-                       card->remove(pdev);
+       kfree(card->rtd);
+       snd_card_free(card->snd_card);
+       return 0;
+
+}
+
+/* removes a socdev */
+static int soc_remove(struct platform_device *pdev)
+{
+       struct snd_soc_card *card = platform_get_drvdata(pdev);
 
-               kfree(card->rtd);
-               snd_card_free(card->snd_card);
-       }
        snd_soc_unregister_card(card);
        return 0;
 }
@@ -3153,6 +3158,8 @@ static int snd_soc_register_card(struct snd_soc_card *card)
  */
 static int snd_soc_unregister_card(struct snd_soc_card *card)
 {
+       if (card->instantiated)
+               soc_cleanup_card_resources(card);
        mutex_lock(&client_mutex);
        list_del(&card->list);
        mutex_unlock(&client_mutex);