Signed-off-by: Xiubo Li <Li.Xiubo@xxxxxxxxxxxxx> --- sound/soc/generic/simple-card.c | 61 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index 986d2c7..cad2b30 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -163,6 +163,26 @@ asoc_simple_card_sub_parse_of(struct device_node *np, return 0; } +static inline unsigned int +asoc_simple_card_fmt_master(struct device_node *np, + struct device_node *bitclkmaster, + struct device_node *framemaster) +{ + switch (((np == bitclkmaster) << 4) | (np == framemaster)) { + case 0x11: + return SND_SOC_DAIFMT_CBS_CFS; + case 0x10: + return SND_SOC_DAIFMT_CBS_CFM; + case 0x01: + return SND_SOC_DAIFMT_CBM_CFS; + default: + return SND_SOC_DAIFMT_CBM_CFM; + } + + /* Shouldn't be here */ + return -EINVAL; +} + static int asoc_simple_card_dai_link_of(struct device_node *node, struct device *dev, struct snd_soc_dai_link *dai_link, @@ -172,7 +192,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, struct device_node *np = NULL; struct device_node *bitclkmaster = NULL; struct device_node *framemaster = NULL; - unsigned int daifmt; + unsigned int daifmt, fmt; char *name; char prop[128]; char *prefix = ""; @@ -185,6 +205,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, &bitclkmaster, &framemaster); daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK; + /* Parse CPU DAI sub-node */ snprintf(prop, sizeof(prop), "%scpu", prefix); np = of_get_child_by_name(node, prop); if (!np) { @@ -199,23 +220,11 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, if (ret < 0) goto dai_link_of_err; - dai_props->cpu_dai.fmt = daifmt; - switch (((np == bitclkmaster) << 4) | (np == framemaster)) { - case 0x11: - dai_props->cpu_dai.fmt |= SND_SOC_DAIFMT_CBS_CFS; - break; - case 0x10: - dai_props->cpu_dai.fmt |= SND_SOC_DAIFMT_CBS_CFM; - break; - case 0x01: - dai_props->cpu_dai.fmt |= SND_SOC_DAIFMT_CBM_CFS; - break; - default: - dai_props->cpu_dai.fmt |= SND_SOC_DAIFMT_CBM_CFM; - break; - } - + fmt = asoc_simple_card_fmt_master(np, bitclkmaster, framemaster); + dai_props->cpu_dai.fmt = daifmt | fmt; of_node_put(np); + + /* Parse CODEC DAI sub-node */ snprintf(prop, sizeof(prop), "%scodec", prefix); np = of_get_child_by_name(node, prop); if (!np) { @@ -240,21 +249,9 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, snd_soc_of_parse_daifmt(np, NULL, NULL, NULL) | (daifmt & ~SND_SOC_DAIFMT_CLOCK_MASK); } else { - dai_props->codec_dai.fmt = daifmt; - switch (((np == bitclkmaster) << 4) | (np == framemaster)) { - case 0x11: - dai_props->codec_dai.fmt |= SND_SOC_DAIFMT_CBM_CFM; - break; - case 0x10: - dai_props->codec_dai.fmt |= SND_SOC_DAIFMT_CBM_CFS; - break; - case 0x01: - dai_props->codec_dai.fmt |= SND_SOC_DAIFMT_CBS_CFM; - break; - default: - dai_props->codec_dai.fmt |= SND_SOC_DAIFMT_CBS_CFS; - break; - } + fmt = asoc_simple_card_fmt_master(np, bitclkmaster, + framemaster); + dai_props->codec_dai.fmt = daifmt | fmt; } if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name) { -- 1.8.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html