ASoC: Add data based control initialisation for CODECs and cards
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 7 Apr 2011 10:18:44 +0000 (19:18 +0900)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 8 Apr 2011 00:18:11 +0000 (09:18 +0900)
Allow CODEC and card drivers to point to an array of controls from their
driver structure rather than explicitly calling snd_soc_add_controls().

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
include/sound/soc.h
sound/soc/soc-core.c

index 2720a9f3780b49b0bf13ab8c74b8ea64e51c5776..435cb83c7f48d6318404632775ab3be4aeb70a45 100644 (file)
@@ -577,7 +577,9 @@ struct snd_soc_codec_driver {
                        pm_message_t state);
        int (*resume)(struct snd_soc_codec *);
 
-       /* Default DAPM setup, added after probe() is run */
+       /* Default control and setup, added after probe() is run */
+       const struct snd_kcontrol_new *controls;
+       int num_controls;
        const struct snd_soc_dapm_widget *dapm_widgets;
        int num_dapm_widgets;
        const struct snd_soc_dapm_route *dapm_routes;
@@ -747,6 +749,9 @@ struct snd_soc_card {
        struct snd_soc_pcm_runtime *rtd_aux;
        int num_aux_rtd;
 
+       const struct snd_kcontrol_new *controls;
+       int num_controls;
+
        /*
         * Card-specific routes and widgets.
         */
index f31afe9d4edda48cdbd0a220cd082f5ec714a5a6..f75f13926049ef5f73def84ed67c7cde633a8296 100644 (file)
@@ -1493,6 +1493,9 @@ static int soc_probe_codec(struct snd_soc_card *card,
                }
        }
 
+       if (driver->controls)
+               snd_soc_add_controls(codec, driver->controls,
+                                    driver->num_controls);
        if (driver->dapm_widgets)
                snd_soc_dapm_new_controls(&codec->dapm, driver->dapm_widgets,
                                          driver->num_dapm_widgets);
@@ -1890,6 +1893,14 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card)
                }
        }
 
+       /* We should have a non-codec control add function but we don't */
+       if (card->controls)
+               snd_soc_add_controls(list_first_entry(&card->codec_dev_list,
+                                                     struct snd_soc_codec,
+                                                     card_list),
+                                    card->controls,
+                                    card->num_controls);
+
        if (card->dapm_widgets)
                snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
                                          card->num_dapm_widgets);