ASoC: rsrc-card: tidyup dai format for DPCM
rsrc-card is DPCM supported version of simple-card. Thus it has similar DT format. OTOH, snd_soc_dai_link requests cpu/codec, but one of them will be snd-soc-dummy in DPCM case, and DPCM requests frontend/backend dai_link. This means it might have multi backend/codec. And, SND_SOC_DAIFMT_xxx is based on "codec". Because of these difference, current rsrc card can't detect correct dai_fmt. This patch detect correct dai fmt from 1st "codec". Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ae638b725e
commit
af998f8531
|
@ -155,14 +155,13 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rsrc_card_parse_daifmt(struct device_node *node,
|
static int rsrc_card_parse_daifmt(struct device_node *node,
|
||||||
struct device_node *np,
|
struct device_node *codec,
|
||||||
struct rsrc_card_priv *priv,
|
struct rsrc_card_priv *priv,
|
||||||
int idx, bool is_fe)
|
struct snd_soc_dai_link *dai_link,
|
||||||
|
unsigned int *retfmt)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
|
|
||||||
struct device_node *bitclkmaster = NULL;
|
struct device_node *bitclkmaster = NULL;
|
||||||
struct device_node *framemaster = NULL;
|
struct device_node *framemaster = NULL;
|
||||||
struct device_node *codec = is_fe ? NULL : np;
|
|
||||||
unsigned int daifmt;
|
unsigned int daifmt;
|
||||||
|
|
||||||
daifmt = snd_soc_of_parse_daifmt(node, NULL,
|
daifmt = snd_soc_of_parse_daifmt(node, NULL,
|
||||||
|
@ -179,11 +178,11 @@ static int rsrc_card_parse_daifmt(struct device_node *node,
|
||||||
daifmt |= (codec == framemaster) ?
|
daifmt |= (codec == framemaster) ?
|
||||||
SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
|
SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
|
||||||
|
|
||||||
dai_link->dai_fmt = daifmt;
|
|
||||||
|
|
||||||
of_node_put(bitclkmaster);
|
of_node_put(bitclkmaster);
|
||||||
of_node_put(framemaster);
|
of_node_put(framemaster);
|
||||||
|
|
||||||
|
*retfmt = daifmt;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,24 +324,16 @@ static int rsrc_card_parse_clk(struct device_node *np,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rsrc_card_dai_link_of(struct device_node *node,
|
static int rsrc_card_dai_sub_link_of(struct device_node *node,
|
||||||
struct device_node *np,
|
struct device_node *np,
|
||||||
struct rsrc_card_priv *priv,
|
struct rsrc_card_priv *priv,
|
||||||
int idx)
|
int idx, bool is_fe)
|
||||||
{
|
{
|
||||||
struct device *dev = rsrc_priv_to_dev(priv);
|
struct device *dev = rsrc_priv_to_dev(priv);
|
||||||
struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
|
struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
|
||||||
struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
|
struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
|
||||||
bool is_fe = false;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (0 == strcmp(np->name, "cpu"))
|
|
||||||
is_fe = true;
|
|
||||||
|
|
||||||
ret = rsrc_card_parse_daifmt(node, np, priv, idx, is_fe);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = rsrc_card_parse_links(np, priv, idx, is_fe);
|
ret = rsrc_card_parse_links(np, priv, idx, is_fe);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -359,6 +350,48 @@ static int rsrc_card_dai_link_of(struct device_node *node,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rsrc_card_dai_link_of(struct device_node *node,
|
||||||
|
struct rsrc_card_priv *priv)
|
||||||
|
{
|
||||||
|
struct snd_soc_dai_link *dai_link;
|
||||||
|
struct device_node *np;
|
||||||
|
unsigned int daifmt = 0;
|
||||||
|
int ret, i;
|
||||||
|
bool is_fe;
|
||||||
|
|
||||||
|
/* find 1st codec */
|
||||||
|
i = 0;
|
||||||
|
for_each_child_of_node(node, np) {
|
||||||
|
dai_link = rsrc_priv_to_link(priv, i);
|
||||||
|
|
||||||
|
if (strcmp(np->name, "codec") == 0) {
|
||||||
|
ret = rsrc_card_parse_daifmt(node, np, priv,
|
||||||
|
dai_link, &daifmt);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
for_each_child_of_node(node, np) {
|
||||||
|
dai_link = rsrc_priv_to_link(priv, i);
|
||||||
|
dai_link->dai_fmt = daifmt;
|
||||||
|
|
||||||
|
is_fe = false;
|
||||||
|
if (strcmp(np->name, "cpu") == 0)
|
||||||
|
is_fe = true;
|
||||||
|
|
||||||
|
ret = rsrc_card_dai_sub_link_of(node, np, priv, i, is_fe);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int rsrc_card_parse_of(struct device_node *node,
|
static int rsrc_card_parse_of(struct device_node *node,
|
||||||
struct rsrc_card_priv *priv,
|
struct rsrc_card_priv *priv,
|
||||||
struct device *dev)
|
struct device *dev)
|
||||||
|
@ -366,9 +399,8 @@ static int rsrc_card_parse_of(struct device_node *node,
|
||||||
const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
|
const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
|
||||||
struct rsrc_card_dai *props;
|
struct rsrc_card_dai *props;
|
||||||
struct snd_soc_dai_link *links;
|
struct snd_soc_dai_link *links;
|
||||||
struct device_node *np;
|
|
||||||
int ret;
|
int ret;
|
||||||
int i, num;
|
int num;
|
||||||
|
|
||||||
if (!node)
|
if (!node)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -409,13 +441,9 @@ static int rsrc_card_parse_of(struct device_node *node,
|
||||||
priv->snd_card.name ? priv->snd_card.name : "",
|
priv->snd_card.name ? priv->snd_card.name : "",
|
||||||
priv->convert_rate);
|
priv->convert_rate);
|
||||||
|
|
||||||
i = 0;
|
ret = rsrc_card_dai_link_of(node, priv);
|
||||||
for_each_child_of_node(node, np) {
|
|
||||||
ret = rsrc_card_dai_link_of(node, np, priv, i);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!priv->snd_card.name)
|
if (!priv->snd_card.name)
|
||||||
priv->snd_card.name = priv->snd_card.dai_link->name;
|
priv->snd_card.name = priv->snd_card.dai_link->name;
|
||||||
|
|
Loading…
Reference in a new issue