diff options
author | Paul Cercueil <paul@crapouillou.net> | 2019-04-25 22:25:49 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2019-04-26 05:50:02 -0400 |
commit | 90194281ee8b01fc5a223a12ac90006ae98862c4 (patch) | |
tree | d44457d91ad29ca608ccaede55f54a46f3897e3d /sound/soc/generic | |
parent | fb45befa7ea07399372266f09e562b26db5693c9 (diff) |
ASoC: simple-card-utils: add asoc_simple_parse_pin_switches()
This function is a helper that permits to create pin switch controls for
a list of widgets whose names are listed in the PREFIX "pin-switches"
devicetree property.
Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/generic')
-rw-r--r-- | sound/soc/generic/simple-card-utils.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c index db1458a19985..f4c6375d11c7 100644 --- a/sound/soc/generic/simple-card-utils.c +++ b/sound/soc/generic/simple-card-utils.c | |||
@@ -430,6 +430,63 @@ int asoc_simple_parse_widgets(struct snd_soc_card *card, | |||
430 | } | 430 | } |
431 | EXPORT_SYMBOL_GPL(asoc_simple_parse_widgets); | 431 | EXPORT_SYMBOL_GPL(asoc_simple_parse_widgets); |
432 | 432 | ||
433 | int asoc_simple_parse_pin_switches(struct snd_soc_card *card, | ||
434 | char *prefix) | ||
435 | { | ||
436 | const unsigned int nb_controls_max = 16; | ||
437 | const char **strings, *control_name; | ||
438 | struct snd_kcontrol_new *controls; | ||
439 | struct device *dev = card->dev; | ||
440 | unsigned int i, nb_controls; | ||
441 | char prop[128]; | ||
442 | int ret; | ||
443 | |||
444 | if (!prefix) | ||
445 | prefix = ""; | ||
446 | |||
447 | snprintf(prop, sizeof(prop), "%s%s", prefix, "pin-switches"); | ||
448 | |||
449 | if (!of_property_read_bool(dev->of_node, prop)) | ||
450 | return 0; | ||
451 | |||
452 | strings = devm_kcalloc(dev, nb_controls_max, | ||
453 | sizeof(*strings), GFP_KERNEL); | ||
454 | if (!strings) | ||
455 | return -ENOMEM; | ||
456 | |||
457 | ret = of_property_read_string_array(dev->of_node, prop, | ||
458 | strings, nb_controls_max); | ||
459 | if (ret < 0) | ||
460 | return ret; | ||
461 | |||
462 | nb_controls = (unsigned int)ret; | ||
463 | |||
464 | controls = devm_kcalloc(dev, nb_controls, | ||
465 | sizeof(*controls), GFP_KERNEL); | ||
466 | if (!controls) | ||
467 | return -ENOMEM; | ||
468 | |||
469 | for (i = 0; i < nb_controls; i++) { | ||
470 | control_name = devm_kasprintf(dev, GFP_KERNEL, | ||
471 | "%s Switch", strings[i]); | ||
472 | if (!control_name) | ||
473 | return -ENOMEM; | ||
474 | |||
475 | controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; | ||
476 | controls[i].name = control_name; | ||
477 | controls[i].info = snd_soc_dapm_info_pin_switch; | ||
478 | controls[i].get = snd_soc_dapm_get_pin_switch; | ||
479 | controls[i].put = snd_soc_dapm_put_pin_switch; | ||
480 | controls[i].private_value = (unsigned long)strings[i]; | ||
481 | } | ||
482 | |||
483 | card->controls = controls; | ||
484 | card->num_controls = nb_controls; | ||
485 | |||
486 | return 0; | ||
487 | } | ||
488 | EXPORT_SYMBOL_GPL(asoc_simple_parse_pin_switches); | ||
489 | |||
433 | int asoc_simple_init_jack(struct snd_soc_card *card, | 490 | int asoc_simple_init_jack(struct snd_soc_card *card, |
434 | struct asoc_simple_jack *sjack, | 491 | struct asoc_simple_jack *sjack, |
435 | int is_hp, char *prefix) | 492 | int is_hp, char *prefix) |