|
@@ -4218,6 +4218,113 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing);
|
|
|
|
|
|
+unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
|
|
|
+ const char *prefix)
|
|
|
+{
|
|
|
+ int ret, i;
|
|
|
+ char prop[128];
|
|
|
+ unsigned int format = 0;
|
|
|
+ int bit, frame;
|
|
|
+ const char *str;
|
|
|
+ struct {
|
|
|
+ char *name;
|
|
|
+ unsigned int val;
|
|
|
+ } of_fmt_table[] = {
|
|
|
+ { "i2s", SND_SOC_DAIFMT_I2S },
|
|
|
+ { "right_j", SND_SOC_DAIFMT_RIGHT_J },
|
|
|
+ { "left_j", SND_SOC_DAIFMT_LEFT_J },
|
|
|
+ { "dsp_a", SND_SOC_DAIFMT_DSP_A },
|
|
|
+ { "dsp_b", SND_SOC_DAIFMT_DSP_B },
|
|
|
+ { "ac97", SND_SOC_DAIFMT_AC97 },
|
|
|
+ { "pdm", SND_SOC_DAIFMT_PDM},
|
|
|
+ { "msb", SND_SOC_DAIFMT_MSB },
|
|
|
+ { "lsb", SND_SOC_DAIFMT_LSB },
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!prefix)
|
|
|
+ prefix = "";
|
|
|
+
|
|
|
+ /*
|
|
|
+ * check "[prefix]format = xxx"
|
|
|
+ * SND_SOC_DAIFMT_FORMAT_MASK area
|
|
|
+ */
|
|
|
+ snprintf(prop, sizeof(prop), "%sformat", prefix);
|
|
|
+ ret = of_property_read_string(np, prop, &str);
|
|
|
+ if (ret == 0) {
|
|
|
+ for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
|
|
|
+ if (strcmp(str, of_fmt_table[i].name) == 0) {
|
|
|
+ format |= of_fmt_table[i].val;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * check "[prefix]continuous-clock"
|
|
|
+ * SND_SOC_DAIFMT_CLOCK_MASK area
|
|
|
+ */
|
|
|
+ snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix);
|
|
|
+ if (of_get_property(np, prop, NULL))
|
|
|
+ format |= SND_SOC_DAIFMT_CONT;
|
|
|
+ else
|
|
|
+ format |= SND_SOC_DAIFMT_GATED;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * check "[prefix]bitclock-inversion"
|
|
|
+ * check "[prefix]frame-inversion"
|
|
|
+ * SND_SOC_DAIFMT_INV_MASK area
|
|
|
+ */
|
|
|
+ snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix);
|
|
|
+ bit = !!of_get_property(np, prop, NULL);
|
|
|
+
|
|
|
+ snprintf(prop, sizeof(prop), "%sframe-inversion", prefix);
|
|
|
+ frame = !!of_get_property(np, prop, NULL);
|
|
|
+
|
|
|
+ switch ((bit << 4) + frame) {
|
|
|
+ case 0x11:
|
|
|
+ format |= SND_SOC_DAIFMT_IB_IF;
|
|
|
+ break;
|
|
|
+ case 0x10:
|
|
|
+ format |= SND_SOC_DAIFMT_IB_NF;
|
|
|
+ break;
|
|
|
+ case 0x01:
|
|
|
+ format |= SND_SOC_DAIFMT_NB_IF;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* SND_SOC_DAIFMT_NB_NF is default */
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * check "[prefix]bitclock-master"
|
|
|
+ * check "[prefix]frame-master"
|
|
|
+ * SND_SOC_DAIFMT_MASTER_MASK area
|
|
|
+ */
|
|
|
+ snprintf(prop, sizeof(prop), "%sbitclock-master", prefix);
|
|
|
+ bit = !!of_get_property(np, prop, NULL);
|
|
|
+
|
|
|
+ snprintf(prop, sizeof(prop), "%sframe-master", prefix);
|
|
|
+ frame = !!of_get_property(np, prop, NULL);
|
|
|
+
|
|
|
+ switch ((bit << 4) + frame) {
|
|
|
+ case 0x11:
|
|
|
+ format |= SND_SOC_DAIFMT_CBM_CFM;
|
|
|
+ break;
|
|
|
+ case 0x10:
|
|
|
+ format |= SND_SOC_DAIFMT_CBM_CFS;
|
|
|
+ break;
|
|
|
+ case 0x01:
|
|
|
+ format |= SND_SOC_DAIFMT_CBS_CFM;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ format |= SND_SOC_DAIFMT_CBS_CFS;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return format;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
|
|
|
+
|
|
|
static int __init snd_soc_init(void)
|
|
|
{
|
|
|
#ifdef CONFIG_DEBUG_FS
|