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