Merge remote-tracking branches 'asoc/topic/wm8753' and 'asoc/topic/wm8985' into asoc...
[deliverable/linux.git] / sound / soc / generic / simple-card-utils.c
CommitLineData
abd3147e
KM
1/*
2 * simple-card-core.c
3 *
4 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/of.h>
11#include <sound/simple_card_utils.h>
12
13int asoc_simple_card_parse_daifmt(struct device *dev,
14 struct device_node *node,
15 struct device_node *codec,
16 char *prefix,
17 unsigned int *retfmt)
18{
19 struct device_node *bitclkmaster = NULL;
20 struct device_node *framemaster = NULL;
21 int prefix_len = prefix ? strlen(prefix) : 0;
22 unsigned int daifmt;
23
24 daifmt = snd_soc_of_parse_daifmt(node, prefix,
25 &bitclkmaster, &framemaster);
26 daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK;
27
28 if (prefix_len && !bitclkmaster && !framemaster) {
29 /*
30 * No dai-link level and master setting was not found from
31 * sound node level, revert back to legacy DT parsing and
32 * take the settings from codec node.
33 */
34 dev_dbg(dev, "Revert to legacy daifmt parsing\n");
35
36 daifmt = snd_soc_of_parse_daifmt(codec, NULL, NULL, NULL) |
37 (daifmt & ~SND_SOC_DAIFMT_CLOCK_MASK);
38 } else {
39 if (codec == bitclkmaster)
40 daifmt |= (codec == framemaster) ?
41 SND_SOC_DAIFMT_CBM_CFM : SND_SOC_DAIFMT_CBM_CFS;
42 else
43 daifmt |= (codec == framemaster) ?
44 SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
45 }
46
47 of_node_put(bitclkmaster);
48 of_node_put(framemaster);
49
50 *retfmt = daifmt;
51
52 return 0;
53}
54EXPORT_SYMBOL_GPL(asoc_simple_card_parse_daifmt);
1db3312e
KM
55
56int asoc_simple_card_set_dailink_name(struct device *dev,
57 struct snd_soc_dai_link *dai_link,
58 const char *fmt, ...)
59{
60 va_list ap;
61 char *name = NULL;
62 int ret = -ENOMEM;
63
64 va_start(ap, fmt);
65 name = devm_kvasprintf(dev, GFP_KERNEL, fmt, ap);
66 va_end(ap);
67
68 if (name) {
69 ret = 0;
70
71 dai_link->name = name;
72 dai_link->stream_name = name;
73 }
74
75 return ret;
76}
77EXPORT_SYMBOL_GPL(asoc_simple_card_set_dailink_name);
fc55c9b5
KM
78
79int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
80 char *prefix)
81{
82 char prop[128];
83 int ret;
84
85 snprintf(prop, sizeof(prop), "%sname", prefix);
86
87 /* Parse the card name from DT */
88 ret = snd_soc_of_parse_card_name(card, prop);
89 if (ret < 0)
90 return ret;
91
92 if (!card->name && card->dai_link)
93 card->name = card->dai_link->name;
94
95 return 0;
96}
97EXPORT_SYMBOL_GPL(asoc_simple_card_parse_card_name);
This page took 0.045575 seconds and 5 git commands to generate.