diff options
author | Mark Brown <broonie@linaro.org> | 2014-02-10 08:31:02 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-02-10 08:31:02 -0500 |
commit | 70c90ed7eed0860f0a502112cd26eb3848f91865 (patch) | |
tree | 897474f4838738cddc8a6547aaddd0a5d58a6905 | |
parent | 2772555b6c5ba79783c04ea6c60549530d737e2e (diff) | |
parent | 9a6d48605e632e84db2895cf752c65b3c908cd09 (diff) |
Merge branch 'topic/of' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-simple
-rw-r--r-- | include/sound/soc.h | 2 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 87 |
2 files changed, 89 insertions, 0 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 9a001472b96a..465dc6e0674d 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -1173,6 +1173,8 @@ void snd_soc_util_exit(void); | |||
1173 | 1173 | ||
1174 | int snd_soc_of_parse_card_name(struct snd_soc_card *card, | 1174 | int snd_soc_of_parse_card_name(struct snd_soc_card *card, |
1175 | const char *propname); | 1175 | const char *propname); |
1176 | int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, | ||
1177 | const char *propname); | ||
1176 | int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, | 1178 | int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, |
1177 | const char *propname); | 1179 | const char *propname); |
1178 | unsigned int snd_soc_of_parse_daifmt(struct device_node *np, | 1180 | unsigned int snd_soc_of_parse_daifmt(struct device_node *np, |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index fe1df50805a3..0540cb08e0ea 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -4417,6 +4417,93 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card, | |||
4417 | } | 4417 | } |
4418 | EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name); | 4418 | EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name); |
4419 | 4419 | ||
4420 | static const struct snd_soc_dapm_widget simple_widgets[] = { | ||
4421 | SND_SOC_DAPM_MIC("Microphone", NULL), | ||
4422 | SND_SOC_DAPM_LINE("Line", NULL), | ||
4423 | SND_SOC_DAPM_HP("Headphone", NULL), | ||
4424 | SND_SOC_DAPM_SPK("Speaker", NULL), | ||
4425 | }; | ||
4426 | |||
4427 | int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, | ||
4428 | const char *propname) | ||
4429 | { | ||
4430 | struct device_node *np = card->dev->of_node; | ||
4431 | struct snd_soc_dapm_widget *widgets; | ||
4432 | const char *template, *wname; | ||
4433 | int i, j, num_widgets, ret; | ||
4434 | |||
4435 | num_widgets = of_property_count_strings(np, propname); | ||
4436 | if (num_widgets < 0) { | ||
4437 | dev_err(card->dev, | ||
4438 | "ASoC: Property '%s' does not exist\n", propname); | ||
4439 | return -EINVAL; | ||
4440 | } | ||
4441 | if (num_widgets & 1) { | ||
4442 | dev_err(card->dev, | ||
4443 | "ASoC: Property '%s' length is not even\n", propname); | ||
4444 | return -EINVAL; | ||
4445 | } | ||
4446 | |||
4447 | num_widgets /= 2; | ||
4448 | if (!num_widgets) { | ||
4449 | dev_err(card->dev, "ASoC: Property '%s's length is zero\n", | ||
4450 | propname); | ||
4451 | return -EINVAL; | ||
4452 | } | ||
4453 | |||
4454 | widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets), | ||
4455 | GFP_KERNEL); | ||
4456 | if (!widgets) { | ||
4457 | dev_err(card->dev, | ||
4458 | "ASoC: Could not allocate memory for widgets\n"); | ||
4459 | return -ENOMEM; | ||
4460 | } | ||
4461 | |||
4462 | for (i = 0; i < num_widgets; i++) { | ||
4463 | ret = of_property_read_string_index(np, propname, | ||
4464 | 2 * i, &template); | ||
4465 | if (ret) { | ||
4466 | dev_err(card->dev, | ||
4467 | "ASoC: Property '%s' index %d read error:%d\n", | ||
4468 | propname, 2 * i, ret); | ||
4469 | return -EINVAL; | ||
4470 | } | ||
4471 | |||
4472 | for (j = 0; j < ARRAY_SIZE(simple_widgets); j++) { | ||
4473 | if (!strncmp(template, simple_widgets[j].name, | ||
4474 | strlen(simple_widgets[j].name))) { | ||
4475 | widgets[i] = simple_widgets[j]; | ||
4476 | break; | ||
4477 | } | ||
4478 | } | ||
4479 | |||
4480 | if (j >= ARRAY_SIZE(simple_widgets)) { | ||
4481 | dev_err(card->dev, | ||
4482 | "ASoC: DAPM widget '%s' is not supported\n", | ||
4483 | template); | ||
4484 | return -EINVAL; | ||
4485 | } | ||
4486 | |||
4487 | ret = of_property_read_string_index(np, propname, | ||
4488 | (2 * i) + 1, | ||
4489 | &wname); | ||
4490 | if (ret) { | ||
4491 | dev_err(card->dev, | ||
4492 | "ASoC: Property '%s' index %d read error:%d\n", | ||
4493 | propname, (2 * i) + 1, ret); | ||
4494 | return -EINVAL; | ||
4495 | } | ||
4496 | |||
4497 | widgets[i].name = wname; | ||
4498 | } | ||
4499 | |||
4500 | card->dapm_widgets = widgets; | ||
4501 | card->num_dapm_widgets = num_widgets; | ||
4502 | |||
4503 | return 0; | ||
4504 | } | ||
4505 | EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets); | ||
4506 | |||
4420 | int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, | 4507 | int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, |
4421 | const char *propname) | 4508 | const char *propname) |
4422 | { | 4509 | { |