Lines Matching defs:tplg
81 static int soc_tplg_process_headers(struct soc_tplg *tplg);
82 static void soc_tplg_complete(struct soc_tplg *tplg);
87 static int soc_tplg_check_elem_count(struct soc_tplg *tplg, size_t elem_size,
90 const u8 *end = tplg->pos + elem_size * count;
92 if (end > tplg->fw->data + tplg->fw->size) {
93 dev_err(tplg->dev, "ASoC: %s overflow end of data\n",
101 dev_err(tplg->dev,
110 static inline int soc_tplg_is_eof(struct soc_tplg *tplg)
112 const u8 *end = tplg->hdr_pos;
114 if (end >= tplg->fw->data + tplg->fw->size)
119 static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg *tplg)
121 return (unsigned long)(tplg->hdr_pos - tplg->fw->data);
124 static inline unsigned long soc_tplg_get_offset(struct soc_tplg *tplg)
126 return (unsigned long)(tplg->pos - tplg->fw->data);
192 static int tplc_chan_get_reg(struct soc_tplg *tplg,
205 static int tplc_chan_get_shift(struct soc_tplg *tplg,
230 static inline void soc_bind_err(struct soc_tplg *tplg,
233 dev_err(tplg->dev,
236 soc_tplg_get_offset(tplg));
239 static inline void soc_control_err(struct soc_tplg *tplg,
242 dev_err(tplg->dev,
245 soc_tplg_get_offset(tplg));
249 static int soc_tplg_vendor_load(struct soc_tplg *tplg,
254 if (tplg->ops && tplg->ops->vendor_load)
255 ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr);
257 dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n",
263 dev_err(tplg->dev,
265 soc_tplg_get_hdr_offset(tplg),
266 soc_tplg_get_hdr_offset(tplg),
273 static int soc_tplg_widget_load(struct soc_tplg *tplg,
276 if (tplg->ops && tplg->ops->widget_load)
277 return tplg->ops->widget_load(tplg->comp, tplg->index, w,
285 static int soc_tplg_widget_ready(struct soc_tplg *tplg,
288 if (tplg->ops && tplg->ops->widget_ready)
289 return tplg->ops->widget_ready(tplg->comp, tplg->index, w,
296 static int soc_tplg_dai_load(struct soc_tplg *tplg,
300 if (tplg->ops && tplg->ops->dai_load)
301 return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv,
308 static int soc_tplg_dai_link_load(struct soc_tplg *tplg,
311 if (tplg->ops && tplg->ops->link_load)
312 return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg);
318 static void soc_tplg_complete(struct soc_tplg *tplg)
320 if (tplg->ops && tplg->ops->complete)
321 tplg->ops->complete(tplg->comp);
349 static int soc_tplg_add_kcontrol(struct soc_tplg *tplg,
352 struct snd_soc_component *comp = tplg->comp;
573 const struct soc_tplg *tplg)
607 ext_ops = tplg->bytes_ext_ops;
608 num_ops = tplg->bytes_ext_ops_count;
626 ops = tplg->io_ops;
627 num_ops = tplg->io_ops_count;
687 static int soc_tplg_init_kcontrol(struct soc_tplg *tplg,
690 if (tplg->ops && tplg->ops->control_load)
691 return tplg->ops->control_load(tplg->comp, tplg->index, k,
698 static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg,
718 static int soc_tplg_create_tlv(struct soc_tplg *tplg,
731 return soc_tplg_create_tlv_db_scale(tplg, kc,
736 dev_dbg(tplg->dev, "Unsupported TLV type %d\n",
745 static inline void soc_tplg_free_tlv(struct soc_tplg *tplg,
751 static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count,
760 if (soc_tplg_check_elem_count(tplg,
763 dev_err(tplg->dev, "ASoC: Invalid count %d for byte control\n",
769 be = (struct snd_soc_tplg_bytes_control *)tplg->pos;
780 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) +
783 dev_dbg(tplg->dev,
795 sbe->dobj.ops = tplg->ops;
799 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg);
801 soc_control_err(tplg, &be->hdr, be->hdr.name);
807 err = soc_tplg_init_kcontrol(tplg, &kc,
810 dev_err(tplg->dev, "ASoC: failed to init %s\n",
817 err = soc_tplg_add_kcontrol(tplg, &kc,
820 dev_err(tplg->dev, "ASoC: failed to add %s\n",
826 list_add(&sbe->dobj.list, &tplg->comp->dobj_list);
832 static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
841 if (soc_tplg_check_elem_count(tplg,
845 dev_err(tplg->dev, "ASoC: invalid count %d for controls\n",
851 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos;
861 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) +
864 dev_dbg(tplg->dev,
875 sm->reg = tplc_chan_get_reg(tplg, mc->channel,
877 sm->rreg = tplc_chan_get_reg(tplg, mc->channel,
879 sm->shift = tplc_chan_get_shift(tplg, mc->channel,
881 sm->rshift = tplc_chan_get_shift(tplg, mc->channel,
888 sm->dobj.index = tplg->index;
889 sm->dobj.ops = tplg->ops;
894 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg);
896 soc_control_err(tplg, &mc->hdr, mc->hdr.name);
902 err = soc_tplg_create_tlv(tplg, &kc, &mc->hdr);
904 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n",
911 err = soc_tplg_init_kcontrol(tplg, &kc,
914 dev_err(tplg->dev, "ASoC: failed to init %s\n",
916 soc_tplg_free_tlv(tplg, &kc);
922 err = soc_tplg_add_kcontrol(tplg, &kc,
925 dev_err(tplg->dev, "ASoC: failed to add %s\n",
927 soc_tplg_free_tlv(tplg, &kc);
932 list_add(&sm->dobj.list, &tplg->comp->dobj_list);
1009 static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count,
1018 if (soc_tplg_check_elem_count(tplg,
1022 dev_err(tplg->dev, "ASoC: invalid count %d for enum controls\n",
1028 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
1039 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
1042 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n",
1051 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL);
1052 se->shift_l = tplc_chan_get_shift(tplg, ec->channel,
1054 se->shift_r = tplc_chan_get_shift(tplg, ec->channel,
1058 se->dobj.index = tplg->index;
1060 se->dobj.ops = tplg->ops;
1068 dev_err(tplg->dev,
1079 dev_err(tplg->dev,
1087 dev_err(tplg->dev,
1094 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg);
1096 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
1101 err = soc_tplg_init_kcontrol(tplg, &kc,
1104 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1110 err = soc_tplg_add_kcontrol(tplg,
1113 dev_err(tplg->dev, "ASoC: could not add kcontrol %s\n",
1118 list_add(&se->dobj.list, &tplg->comp->dobj_list);
1127 static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg,
1134 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count,
1135 soc_tplg_get_offset(tplg));
1139 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
1142 dev_err(tplg->dev, "ASoC: invalid control size\n");
1154 ret = soc_tplg_dmixer_create(tplg, 1,
1162 ret = soc_tplg_denum_create(tplg, 1,
1166 ret = soc_tplg_dbytes_create(tplg, 1,
1170 soc_bind_err(tplg, control_hdr, i);
1174 dev_err(tplg->dev, "ASoC: invalid control\n");
1184 static int soc_tplg_add_route(struct soc_tplg *tplg,
1187 if (tplg->ops && tplg->ops->dapm_route_load)
1188 return tplg->ops->dapm_route_load(tplg->comp, tplg->index,
1194 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
1197 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
1205 if (soc_tplg_check_elem_count(tplg,
1209 dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n",
1214 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count,
1241 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos;
1242 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem);
1264 /* set to NULL atm for tplg users */
1273 routes[i]->dobj.ops = tplg->ops;
1274 routes[i]->dobj.index = tplg->index;
1275 list_add(&routes[i]->dobj.list, &tplg->comp->dobj_list);
1277 ret = soc_tplg_add_route(tplg, routes[i]);
1279 dev_err(tplg->dev, "ASoC: topology: add_route failed: %d\n", ret);
1314 struct soc_tplg *tplg, int num_kcontrols)
1326 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos;
1337 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) +
1340 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n",
1351 sm->reg = tplc_chan_get_reg(tplg, mc->channel,
1353 sm->rreg = tplc_chan_get_reg(tplg, mc->channel,
1355 sm->shift = tplc_chan_get_shift(tplg, mc->channel,
1357 sm->rshift = tplc_chan_get_shift(tplg, mc->channel,
1364 sm->dobj.index = tplg->index;
1368 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc[i], tplg);
1370 soc_control_err(tplg, &mc->hdr, mc->hdr.name);
1375 err = soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr);
1377 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n",
1383 err = soc_tplg_init_kcontrol(tplg, &kc[i],
1386 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1395 soc_tplg_free_tlv(tplg, &kc[i]);
1406 struct soc_tplg *tplg, int num_kcontrols)
1418 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
1428 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
1431 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n",
1442 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL);
1443 se->shift_l = tplc_chan_get_shift(tplg, ec->channel,
1445 se->shift_r = tplc_chan_get_shift(tplg, ec->channel,
1450 se->dobj.index = tplg->index;
1457 dev_err(tplg->dev, "ASoC: could not create values for %s\n",
1467 dev_err(tplg->dev, "ASoC: could not create texts for %s\n",
1473 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n",
1479 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc[i], tplg);
1481 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
1486 err = soc_tplg_init_kcontrol(tplg, &kc[i],
1489 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1516 struct soc_tplg *tplg, int num_kcontrols)
1528 be = (struct snd_soc_tplg_bytes_control *)tplg->pos;
1539 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) +
1542 dev_dbg(tplg->dev,
1557 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc[i], tplg);
1559 soc_control_err(tplg, &be->hdr, be->hdr.name);
1564 err = soc_tplg_init_kcontrol(tplg, &kc[i],
1567 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1586 static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1589 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
1592 struct snd_soc_card *card = tplg->comp->card;
1603 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n",
1630 template.dobj.index = tplg->index;
1632 tplg->pos +=
1642 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
1643 dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n",
1656 soc_tplg_dapm_widget_dmixer_create(tplg,
1671 soc_tplg_dapm_widget_denum_create(tplg,
1682 soc_tplg_dapm_widget_dbytes_create(tplg,
1690 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n",
1698 ret = soc_tplg_widget_load(tplg, &template, w);
1715 widget->dobj.ops = tplg->ops;
1716 widget->dobj.index = tplg->index;
1717 list_add(&widget->dobj.list, &tplg->comp->dobj_list);
1719 ret = soc_tplg_widget_ready(tplg, widget, w);
1738 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg,
1746 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count);
1749 widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos;
1751 dev_err(tplg->dev, "ASoC: invalid widget size\n");
1755 ret = soc_tplg_dapm_widget_create(tplg, widget);
1757 dev_err(tplg->dev, "ASoC: failed to load widget %s\n",
1766 static int soc_tplg_dapm_complete(struct soc_tplg *tplg)
1768 struct snd_soc_card *card = tplg->comp->card;
1775 dev_warn(tplg->dev, "ASoC: Parent card not yet available,"
1782 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n",
1824 static int soc_tplg_dai_create(struct soc_tplg *tplg,
1832 snd_soc_component_get_dapm(tplg->comp);
1868 ret = soc_tplg_dai_load(tplg, dai_drv, pcm, NULL);
1870 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n");
1874 dai_drv->dobj.index = tplg->index;
1875 dai_drv->dobj.ops = tplg->ops;
1877 list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list);
1880 dai = snd_soc_register_dai(tplg->comp, dai_drv, false);
1927 static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
1949 link->dobj.index = tplg->index;
1950 link->dobj.ops = tplg->ops;
1986 ret = soc_tplg_dai_link_load(tplg, link, NULL);
1988 dev_err(tplg->comp->dev, "ASoC: FE link loading failed\n");
1992 ret = snd_soc_add_pcm_runtime(tplg->comp->card, link);
1994 dev_err(tplg->comp->dev, "ASoC: adding FE link failed\n");
1998 list_add(&link->dobj.list, &tplg->comp->dobj_list);
2010 static int soc_tplg_pcm_create(struct soc_tplg *tplg,
2015 ret = soc_tplg_dai_create(tplg, pcm);
2019 return soc_tplg_fe_link_create(tplg, pcm);
2044 * @tplg: topology context
2050 static int pcm_new_ver(struct soc_tplg *tplg,
2061 dev_err(tplg->dev, "ASoC: invalid PCM size\n");
2065 dev_warn(tplg->dev, "ASoC: old version of PCM\n");
2091 static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
2104 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
2108 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n",
2113 if (soc_tplg_check_elem_count(tplg,
2117 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n",
2123 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
2134 ret = pcm_new_ver(tplg, pcm, &_pcm);
2140 ret = soc_tplg_pcm_create(tplg, _pcm);
2150 tplg->pos += size + le32_to_cpu(_pcm->priv.size);
2156 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
2232 * @tplg: topology context
2238 static int link_new_ver(struct soc_tplg *tplg,
2250 dev_err(tplg->dev, "ASoC: invalid physical link config size\n");
2254 dev_warn(tplg->dev, "ASoC: old version of physical link config\n");
2314 static int soc_tplg_link_config(struct soc_tplg *tplg,
2338 link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id),
2341 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n",
2357 ret = soc_tplg_dai_link_load(tplg, link, cfg);
2359 dev_err(tplg->dev, "ASoC: physical link loading failed\n");
2364 link->dobj.index = tplg->index;
2365 link->dobj.ops = tplg->ops;
2367 list_add(&link->dobj.list, &tplg->comp->dobj_list);
2374 static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
2386 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2390 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n",
2395 if (soc_tplg_check_elem_count(tplg,
2399 dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n",
2406 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2413 ret = link_new_ver(tplg, link, &_link);
2418 ret = soc_tplg_link_config(tplg, _link);
2428 tplg->pos += size + le32_to_cpu(_link->priv.size);
2439 * @tplg: topology context
2445 static int soc_tplg_dai_config(struct soc_tplg *tplg,
2460 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n",
2466 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n",
2497 ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai);
2499 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n");
2512 static int soc_tplg_dai_elems_load(struct soc_tplg *tplg,
2523 dai = (struct snd_soc_tplg_dai *)tplg->pos;
2525 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n");
2529 ret = soc_tplg_dai_config(tplg, dai);
2531 dev_err(tplg->dev, "ASoC: failed to configure DAI\n");
2535 tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size));
2538 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count);
2545 * @tplg: topology context
2551 static int manifest_new_ver(struct soc_tplg *tplg,
2563 dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
2570 dev_warn(tplg->dev, "ASoC: old version of manifest\n");
2593 static int soc_tplg_manifest_load(struct soc_tplg *tplg,
2600 manifest = (struct snd_soc_tplg_manifest *)tplg->pos;
2608 ret = manifest_new_ver(tplg, manifest, &_manifest);
2614 if (tplg->ops && tplg->ops->manifest)
2615 ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest);
2624 static int soc_valid_header(struct soc_tplg *tplg,
2627 if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size)
2631 dev_err(tplg->dev,
2633 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg),
2634 tplg->fw->size);
2640 dev_err(tplg->dev,
2642 tplg->pass, hdr->magic,
2643 soc_tplg_get_hdr_offset(tplg), tplg->fw->size);
2648 dev_err(tplg->dev,
2650 tplg->pass, hdr->magic,
2651 soc_tplg_get_hdr_offset(tplg), tplg->fw->size);
2658 dev_err(tplg->dev,
2660 tplg->pass, hdr->abi,
2661 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg),
2662 tplg->fw->size);
2667 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n",
2668 soc_tplg_get_hdr_offset(tplg));
2676 static int soc_tplg_load_header(struct soc_tplg *tplg,
2679 int (*elem_load)(struct soc_tplg *tplg,
2683 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr);
2686 if (le32_to_cpu(hdr->index) != tplg->req_index &&
2687 tplg->req_index != SND_SOC_TPLG_INDEX_ALL)
2690 tplg->index = le32_to_cpu(hdr->index);
2732 if (tplg->pass == hdr_pass) {
2733 dev_dbg(tplg->dev,
2736 hdr->vendor_type, tplg->pass);
2737 return elem_load(tplg, hdr);
2744 static int soc_tplg_process_headers(struct soc_tplg *tplg)
2749 tplg->pass = SOC_TPLG_PASS_START;
2752 while (tplg->pass <= SOC_TPLG_PASS_END) {
2754 tplg->hdr_pos = tplg->fw->data;
2755 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos;
2757 while (!soc_tplg_is_eof(tplg)) {
2760 ret = soc_valid_header(tplg, hdr);
2762 dev_err(tplg->dev,
2770 ret = soc_tplg_load_header(tplg, hdr);
2772 dev_err(tplg->dev,
2778 tplg->hdr_pos += le32_to_cpu(hdr->payload_size) +
2780 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos;
2784 tplg->pass++;
2788 ret = soc_tplg_dapm_complete(tplg);
2790 dev_err(tplg->dev,
2796 static int soc_tplg_load(struct soc_tplg *tplg)
2800 ret = soc_tplg_process_headers(tplg);
2802 soc_tplg_complete(tplg);
2811 struct soc_tplg tplg;
2819 memset(&tplg, 0, sizeof(tplg));
2820 tplg.fw = fw;
2821 tplg.dev = comp->dev;
2822 tplg.comp = comp;
2823 tplg.ops = ops;
2824 tplg.req_index = id;
2825 tplg.io_ops = ops->io_ops;
2826 tplg.io_ops_count = ops->io_ops_count;
2827 tplg.bytes_ext_ops = ops->bytes_ext_ops;
2828 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count;
2830 ret = soc_tplg_load(&tplg);