summaryrefslogtreecommitdiffstats
path: root/sound/soc/generic
diff options
context:
space:
mode:
authorPaul Cercueil <paul@crapouillou.net>2019-04-25 22:25:49 -0400
committerMark Brown <broonie@kernel.org>2019-04-26 05:50:02 -0400
commit90194281ee8b01fc5a223a12ac90006ae98862c4 (patch)
treed44457d91ad29ca608ccaede55f54a46f3897e3d /sound/soc/generic
parentfb45befa7ea07399372266f09e562b26db5693c9 (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.c57
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}
431EXPORT_SYMBOL_GPL(asoc_simple_parse_widgets); 431EXPORT_SYMBOL_GPL(asoc_simple_parse_widgets);
432 432
433int 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}
488EXPORT_SYMBOL_GPL(asoc_simple_parse_pin_switches);
489
433int asoc_simple_init_jack(struct snd_soc_card *card, 490int 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)