ASoC: core: Add snd_soc_of_parse_pin_switches() from simple-card-utils
authorStephan Gerhold <stephan@gerhold.net>
Tue, 14 Dec 2021 14:20:46 +0000 (15:20 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 23 Dec 2021 18:34:23 +0000 (18:34 +0000)
The ASoC core already has several helpers to parse card properties
from the device tree. Move the parsing code for "pin-switches" from
simple-card-utils to a shared snd_soc_of_parse_pin_switches() function
so other drivers can also use it to set up pin switches configured in
the device tree.

Cc: Paul Cercueil <paul@crapouillou.net>
Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20211214142049.20422-2-stephan@gerhold.net
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc.h
sound/soc/generic/simple-card-utils.c
sound/soc/soc-core.c

index 5872a8864f3b6adda1e9a3e533592fa2df2580ee..7a1650b303f1400432d365fbe1b3f94f15596c0f 100644 (file)
@@ -1211,6 +1211,7 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card,
                               const char *propname);
 int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
                                          const char *propname);
+int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop);
 int snd_soc_of_get_slot_mask(struct device_node *np,
                             const char *prop_name,
                             unsigned int *mask);
index 850e968677f1079271d55114218aead3aab4fe3b..a81323d1691d023dcc8018f55586f6f265271a64 100644 (file)
@@ -499,57 +499,14 @@ EXPORT_SYMBOL_GPL(asoc_simple_parse_widgets);
 int asoc_simple_parse_pin_switches(struct snd_soc_card *card,
                                   char *prefix)
 {
-       const unsigned int nb_controls_max = 16;
-       const char **strings, *control_name;
-       struct snd_kcontrol_new *controls;
-       struct device *dev = card->dev;
-       unsigned int i, nb_controls;
        char prop[128];
-       int ret;
 
        if (!prefix)
                prefix = "";
 
        snprintf(prop, sizeof(prop), "%s%s", prefix, "pin-switches");
 
-       if (!of_property_read_bool(dev->of_node, prop))
-               return 0;
-
-       strings = devm_kcalloc(dev, nb_controls_max,
-                              sizeof(*strings), GFP_KERNEL);
-       if (!strings)
-               return -ENOMEM;
-
-       ret = of_property_read_string_array(dev->of_node, prop,
-                                           strings, nb_controls_max);
-       if (ret < 0)
-               return ret;
-
-       nb_controls = (unsigned int)ret;
-
-       controls = devm_kcalloc(dev, nb_controls,
-                               sizeof(*controls), GFP_KERNEL);
-       if (!controls)
-               return -ENOMEM;
-
-       for (i = 0; i < nb_controls; i++) {
-               control_name = devm_kasprintf(dev, GFP_KERNEL,
-                                             "%s Switch", strings[i]);
-               if (!control_name)
-                       return -ENOMEM;
-
-               controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
-               controls[i].name = control_name;
-               controls[i].info = snd_soc_dapm_info_pin_switch;
-               controls[i].get = snd_soc_dapm_get_pin_switch;
-               controls[i].put = snd_soc_dapm_put_pin_switch;
-               controls[i].private_value = (unsigned long)strings[i];
-       }
-
-       card->controls = controls;
-       card->num_controls = nb_controls;
-
-       return 0;
+       return snd_soc_of_parse_pin_switches(card, prop);
 }
 EXPORT_SYMBOL_GPL(asoc_simple_parse_pin_switches);
 
index 1d62160f96b1173d04324992ed8a8d54001a9347..434e61b46983cf647009efba9ab7cfe1d406995a 100644 (file)
@@ -2823,6 +2823,56 @@ int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
 }
 EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets);
 
+int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop)
+{
+       const unsigned int nb_controls_max = 16;
+       const char **strings, *control_name;
+       struct snd_kcontrol_new *controls;
+       struct device *dev = card->dev;
+       unsigned int i, nb_controls;
+       int ret;
+
+       if (!of_property_read_bool(dev->of_node, prop))
+               return 0;
+
+       strings = devm_kcalloc(dev, nb_controls_max,
+                              sizeof(*strings), GFP_KERNEL);
+       if (!strings)
+               return -ENOMEM;
+
+       ret = of_property_read_string_array(dev->of_node, prop,
+                                           strings, nb_controls_max);
+       if (ret < 0)
+               return ret;
+
+       nb_controls = (unsigned int)ret;
+
+       controls = devm_kcalloc(dev, nb_controls,
+                               sizeof(*controls), GFP_KERNEL);
+       if (!controls)
+               return -ENOMEM;
+
+       for (i = 0; i < nb_controls; i++) {
+               control_name = devm_kasprintf(dev, GFP_KERNEL,
+                                             "%s Switch", strings[i]);
+               if (!control_name)
+                       return -ENOMEM;
+
+               controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+               controls[i].name = control_name;
+               controls[i].info = snd_soc_dapm_info_pin_switch;
+               controls[i].get = snd_soc_dapm_get_pin_switch;
+               controls[i].put = snd_soc_dapm_put_pin_switch;
+               controls[i].private_value = (unsigned long)strings[i];
+       }
+
+       card->controls = controls;
+       card->num_controls = nb_controls;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(snd_soc_of_parse_pin_switches);
+
 int snd_soc_of_get_slot_mask(struct device_node *np,
                             const char *prop_name,
                             unsigned int *mask)