ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
ARRAY_SIZE(dmic_widgets)); if (ret) {
dev_err(rtd->dev, "fail to add dmic widgets, ret %d\n", ret); return ret;
}
ret = snd_soc_dapm_add_routes(&card->dapm, dmic_routes,
ARRAY_SIZE(dmic_routes)); if (ret) {
dev_err(rtd->dev, "fail to add dmic routes, ret %d\n", ret); return ret;
}
return 0;
}
/* * HDA External Codec DAI Link
*/ staticconststruct snd_soc_dapm_widget hda_widgets[] = {
SND_SOC_DAPM_MIC("Analog In", NULL),
SND_SOC_DAPM_MIC("Digital In", NULL),
SND_SOC_DAPM_MIC("Alt Analog In", NULL),
ret = snd_soc_dapm_new_controls(&card->dapm, hda_widgets,
ARRAY_SIZE(hda_widgets)); if (ret) {
dev_err(rtd->dev, "fail to add hda widgets, ret %d\n", ret); return ret;
}
ret = snd_soc_dapm_add_routes(&card->dapm, hda_routes,
ARRAY_SIZE(hda_routes)); if (ret)
dev_err(rtd->dev, "fail to add hda routes, ret %d\n", ret);
if (ctx->link_order_overwrite)
link_order = ctx->link_order_overwrite; else
link_order = DEFAULT_LINK_ORDER;
if (ctx->link_id_overwrite)
link_ids = ctx->link_id_overwrite; else
link_ids = 0;
dev_dbg(dev, "create dai links, link_order 0x%lx, id_overwrite 0x%lx\n",
link_order, link_ids);
while (link_order) {
link = link_order & SOF_LINK_ORDER_MASK;
link_order >>= SOF_LINK_ORDER_SHIFT;
if (ctx->link_id_overwrite) {
be_id = link_ids & SOF_LINK_IDS_MASK;
link_ids >>= SOF_LINK_IDS_SHIFT;
} else { /* use array index as link id */
be_id = idx;
}
switch (link) { case SOF_LINK_CODEC: /* headphone codec */ if (ctx->codec_type == CODEC_NONE) continue;
ret = set_ssp_codec_link(dev, &links[idx], be_id,
ctx->codec_type, ctx->ssp_codec); if (ret) {
dev_err(dev, "fail to set codec link, ret %d\n",
ret); return ret;
}
ctx->codec_link = &links[idx];
idx++; break; case SOF_LINK_DMIC01: /* dmic01 */ if (ctx->dmic_be_num == 0) continue;
/* at least we have dmic01 */
ret = set_dmic_link(dev, &links[idx], be_id, SOF_DMIC_01); if (ret) {
dev_err(dev, "fail to set dmic01 link, ret %d\n",
ret); return ret;
}
idx++; break; case SOF_LINK_DMIC16K: /* dmic16k */ if (ctx->dmic_be_num <= 1) continue;
/* set up 2 BE links at most */
ret = set_dmic_link(dev, &links[idx], be_id,
SOF_DMIC_16K); if (ret) {
dev_err(dev, "fail to set dmic16k link, ret %d\n",
ret); return ret;
}
idx++; break; case SOF_LINK_IDISP_HDMI: /* idisp HDMI */ for (i = 1; i <= ctx->hdmi_num; i++) {
ret = set_idisp_hdmi_link(dev, &links[idx],
be_id, i,
ctx->hdmi.idisp_codec); if (ret) {
dev_err(dev, "fail to set hdmi link, ret %d\n",
ret); return ret;
}
idx++;
be_id++;
} break; case SOF_LINK_AMP: /* speaker amp */ if (ctx->amp_type == CODEC_NONE) continue;
ret = set_ssp_amp_link(dev, &links[idx], be_id,
ctx->amp_type, ctx->ssp_amp); if (ret) {
dev_err(dev, "fail to set amp link, ret %d\n",
ret); return ret;
}
ctx->amp_link = &links[idx];
idx++; break; case SOF_LINK_BT_OFFLOAD: /* BT audio offload */ if (!ctx->bt_offload_present) continue;
ret = set_bt_offload_link(dev, &links[idx], be_id,
ctx->ssp_bt); if (ret) {
dev_err(dev, "fail to set bt link, ret %d\n",
ret); return ret;
}
idx++; break; case SOF_LINK_HDMI_IN: /* HDMI-In */
for_each_set_bit(ssp_hdmi_in, &ctx->ssp_mask_hdmi_in, 32) {
ret = set_hdmi_in_link(dev, &links[idx], be_id,
ssp_hdmi_in); if (ret) {
dev_err(dev, "fail to set hdmi-in link, ret %d\n",
ret); return ret;
}
idx++;
be_id++;
} break; case SOF_LINK_HDA: /* HDA external codec */ if (!ctx->hda_codec_present) continue;
ret = set_hda_codec_link(dev, &links[idx], be_id,
SOF_HDA_ANALOG); if (ret) {
dev_err(dev, "fail to set hda analog link, ret %d\n",
ret); return ret;
}
idx++;
be_id++;
ret = set_hda_codec_link(dev, &links[idx], be_id,
SOF_HDA_DIGITAL); if (ret) {
dev_err(dev, "fail to set hda digital link, ret %d\n",
ret); return ret;
}
idx++; break; case SOF_LINK_NONE: /* caught here if it's not used as terminator in macro */
fallthrough; default:
dev_err(dev, "invalid link type %ld\n", link); return -EINVAL;
}
}
if (idx != num_links) {
dev_err(dev, "link number mismatch, idx %d, num_links %d\n", idx,
num_links); return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.