Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: core: Add snd_soc_of_parse_pin_switches() from simple-card-utils

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>

authored by

Stephan Gerhold and committed by
Mark Brown
3d4641a4 8102d8cd

+52 -44
+1
include/sound/soc.h
··· 1211 1211 const char *propname); 1212 1212 int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, 1213 1213 const char *propname); 1214 + int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop); 1214 1215 int snd_soc_of_get_slot_mask(struct device_node *np, 1215 1216 const char *prop_name, 1216 1217 unsigned int *mask);
+1 -44
sound/soc/generic/simple-card-utils.c
··· 499 499 int asoc_simple_parse_pin_switches(struct snd_soc_card *card, 500 500 char *prefix) 501 501 { 502 - const unsigned int nb_controls_max = 16; 503 - const char **strings, *control_name; 504 - struct snd_kcontrol_new *controls; 505 - struct device *dev = card->dev; 506 - unsigned int i, nb_controls; 507 502 char prop[128]; 508 - int ret; 509 503 510 504 if (!prefix) 511 505 prefix = ""; 512 506 513 507 snprintf(prop, sizeof(prop), "%s%s", prefix, "pin-switches"); 514 508 515 - if (!of_property_read_bool(dev->of_node, prop)) 516 - return 0; 517 - 518 - strings = devm_kcalloc(dev, nb_controls_max, 519 - sizeof(*strings), GFP_KERNEL); 520 - if (!strings) 521 - return -ENOMEM; 522 - 523 - ret = of_property_read_string_array(dev->of_node, prop, 524 - strings, nb_controls_max); 525 - if (ret < 0) 526 - return ret; 527 - 528 - nb_controls = (unsigned int)ret; 529 - 530 - controls = devm_kcalloc(dev, nb_controls, 531 - sizeof(*controls), GFP_KERNEL); 532 - if (!controls) 533 - return -ENOMEM; 534 - 535 - for (i = 0; i < nb_controls; i++) { 536 - control_name = devm_kasprintf(dev, GFP_KERNEL, 537 - "%s Switch", strings[i]); 538 - if (!control_name) 539 - return -ENOMEM; 540 - 541 - controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; 542 - controls[i].name = control_name; 543 - controls[i].info = snd_soc_dapm_info_pin_switch; 544 - controls[i].get = snd_soc_dapm_get_pin_switch; 545 - controls[i].put = snd_soc_dapm_put_pin_switch; 546 - controls[i].private_value = (unsigned long)strings[i]; 547 - } 548 - 549 - card->controls = controls; 550 - card->num_controls = nb_controls; 551 - 552 - return 0; 509 + return snd_soc_of_parse_pin_switches(card, prop); 553 510 } 554 511 EXPORT_SYMBOL_GPL(asoc_simple_parse_pin_switches); 555 512
+50
sound/soc/soc-core.c
··· 2823 2823 } 2824 2824 EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets); 2825 2825 2826 + int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop) 2827 + { 2828 + const unsigned int nb_controls_max = 16; 2829 + const char **strings, *control_name; 2830 + struct snd_kcontrol_new *controls; 2831 + struct device *dev = card->dev; 2832 + unsigned int i, nb_controls; 2833 + int ret; 2834 + 2835 + if (!of_property_read_bool(dev->of_node, prop)) 2836 + return 0; 2837 + 2838 + strings = devm_kcalloc(dev, nb_controls_max, 2839 + sizeof(*strings), GFP_KERNEL); 2840 + if (!strings) 2841 + return -ENOMEM; 2842 + 2843 + ret = of_property_read_string_array(dev->of_node, prop, 2844 + strings, nb_controls_max); 2845 + if (ret < 0) 2846 + return ret; 2847 + 2848 + nb_controls = (unsigned int)ret; 2849 + 2850 + controls = devm_kcalloc(dev, nb_controls, 2851 + sizeof(*controls), GFP_KERNEL); 2852 + if (!controls) 2853 + return -ENOMEM; 2854 + 2855 + for (i = 0; i < nb_controls; i++) { 2856 + control_name = devm_kasprintf(dev, GFP_KERNEL, 2857 + "%s Switch", strings[i]); 2858 + if (!control_name) 2859 + return -ENOMEM; 2860 + 2861 + controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; 2862 + controls[i].name = control_name; 2863 + controls[i].info = snd_soc_dapm_info_pin_switch; 2864 + controls[i].get = snd_soc_dapm_get_pin_switch; 2865 + controls[i].put = snd_soc_dapm_put_pin_switch; 2866 + controls[i].private_value = (unsigned long)strings[i]; 2867 + } 2868 + 2869 + card->controls = controls; 2870 + card->num_controls = nb_controls; 2871 + 2872 + return 0; 2873 + } 2874 + EXPORT_SYMBOL_GPL(snd_soc_of_parse_pin_switches); 2875 + 2826 2876 int snd_soc_of_get_slot_mask(struct device_node *np, 2827 2877 const char *prop_name, 2828 2878 unsigned int *mask)