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
606 ext_ops = tplg->bytes_ext_ops; in soc_tplg_kcontrol_bind_io()
607 num_ops = tplg->bytes_ext_ops_count; in soc_tplg_kcontrol_bind_io()
625 ops = tplg->io_ops; in soc_tplg_kcontrol_bind_io()
626 num_ops = tplg->io_ops_count; in soc_tplg_kcontrol_bind_io()
686 static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, in soc_tplg_init_kcontrol() argument
689 if (tplg->ops && tplg->ops->control_load) in soc_tplg_init_kcontrol()
690 return tplg->ops->control_load(tplg->comp, tplg->index, k, in soc_tplg_init_kcontrol()
697 static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, in soc_tplg_create_tlv_db_scale() argument
717 static int soc_tplg_create_tlv(struct soc_tplg *tplg, in soc_tplg_create_tlv() argument
730 return soc_tplg_create_tlv_db_scale(tplg, kc, in soc_tplg_create_tlv()
735 dev_dbg(tplg->dev, "Unsupported TLV type %d\n", in soc_tplg_create_tlv()
744 static inline void soc_tplg_free_tlv(struct soc_tplg *tplg, in soc_tplg_free_tlv() argument
750 static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dbytes_create() argument
759 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dbytes_create()
762 dev_err(tplg->dev, "ASoC: Invalid count %d for byte control\n", in soc_tplg_dbytes_create()
768 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dbytes_create()
779 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dbytes_create()
782 dev_dbg(tplg->dev, in soc_tplg_dbytes_create()
794 sbe->dobj.ops = tplg->ops; in soc_tplg_dbytes_create()
798 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg); in soc_tplg_dbytes_create()
800 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dbytes_create()
806 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
809 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dbytes_create()
816 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
819 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dbytes_create()
825 list_add(&sbe->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dbytes_create()
831 static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dmixer_create() argument
840 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dmixer_create()
844 dev_err(tplg->dev, "ASoC: invalid count %d for controls\n", in soc_tplg_dmixer_create()
850 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dmixer_create()
860 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dmixer_create()
863 dev_dbg(tplg->dev, in soc_tplg_dmixer_create()
874 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
876 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
878 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
880 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
887 sm->dobj.index = tplg->index; in soc_tplg_dmixer_create()
888 sm->dobj.ops = tplg->ops; in soc_tplg_dmixer_create()
893 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg); in soc_tplg_dmixer_create()
895 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dmixer_create()
901 err = soc_tplg_create_tlv(tplg, &kc, &mc->hdr); in soc_tplg_dmixer_create()
903 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n", in soc_tplg_dmixer_create()
910 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
913 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dmixer_create()
915 soc_tplg_free_tlv(tplg, &kc); in soc_tplg_dmixer_create()
921 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
924 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dmixer_create()
926 soc_tplg_free_tlv(tplg, &kc); in soc_tplg_dmixer_create()
931 list_add(&sm->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dmixer_create()
1008 static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_denum_create() argument
1017 if (soc_tplg_check_elem_count(tplg, in soc_tplg_denum_create()
1021 dev_err(tplg->dev, "ASoC: invalid count %d for enum controls\n", in soc_tplg_denum_create()
1027 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_denum_create()
1038 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_denum_create()
1041 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", in soc_tplg_denum_create()
1050 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_denum_create()
1051 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
1053 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
1057 se->dobj.index = tplg->index; in soc_tplg_denum_create()
1059 se->dobj.ops = tplg->ops; in soc_tplg_denum_create()
1067 dev_err(tplg->dev, in soc_tplg_denum_create()
1078 dev_err(tplg->dev, in soc_tplg_denum_create()
1086 dev_err(tplg->dev, in soc_tplg_denum_create()
1093 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg); in soc_tplg_denum_create()
1095 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_denum_create()
1100 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_denum_create()
1103 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_denum_create()
1109 err = soc_tplg_add_kcontrol(tplg, in soc_tplg_denum_create()
1112 dev_err(tplg->dev, "ASoC: could not add kcontrol %s\n", in soc_tplg_denum_create()
1117 list_add(&se->dobj.list, &tplg->comp->dobj_list); in soc_tplg_denum_create()
1126 static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, in soc_tplg_kcontrol_elems_load() argument
1133 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, in soc_tplg_kcontrol_elems_load()
1134 soc_tplg_get_offset(tplg)); in soc_tplg_kcontrol_elems_load()
1138 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_kcontrol_elems_load()
1141 dev_err(tplg->dev, "ASoC: invalid control size\n"); in soc_tplg_kcontrol_elems_load()
1153 ret = soc_tplg_dmixer_create(tplg, 1, in soc_tplg_kcontrol_elems_load()
1161 ret = soc_tplg_denum_create(tplg, 1, in soc_tplg_kcontrol_elems_load()
1165 ret = soc_tplg_dbytes_create(tplg, 1, in soc_tplg_kcontrol_elems_load()
1169 soc_bind_err(tplg, control_hdr, i); in soc_tplg_kcontrol_elems_load()
1173 dev_err(tplg->dev, "ASoC: invalid control\n"); in soc_tplg_kcontrol_elems_load()
1183 static int soc_tplg_add_route(struct soc_tplg *tplg, in soc_tplg_add_route() argument
1186 if (tplg->ops && tplg->ops->dapm_route_load) in soc_tplg_add_route()
1187 return tplg->ops->dapm_route_load(tplg->comp, tplg->index, in soc_tplg_add_route()
1193 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_graph_elems_load() argument
1196 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_graph_elems_load()
1204 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dapm_graph_elems_load()
1208 dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n", in soc_tplg_dapm_graph_elems_load()
1213 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count, in soc_tplg_dapm_graph_elems_load()
1240 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos; in soc_tplg_dapm_graph_elems_load()
1241 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem); in soc_tplg_dapm_graph_elems_load()
1272 routes[i]->dobj.ops = tplg->ops; in soc_tplg_dapm_graph_elems_load()
1273 routes[i]->dobj.index = tplg->index; in soc_tplg_dapm_graph_elems_load()
1274 list_add(&routes[i]->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dapm_graph_elems_load()
1276 ret = soc_tplg_add_route(tplg, routes[i]); in soc_tplg_dapm_graph_elems_load()
1278 dev_err(tplg->dev, "ASoC: topology: add_route failed: %d\n", ret); in soc_tplg_dapm_graph_elems_load()
1313 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_dmixer_create() argument
1325 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dapm_widget_dmixer_create()
1336 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dapm_widget_dmixer_create()
1339 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", in soc_tplg_dapm_widget_dmixer_create()
1350 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1352 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1354 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1356 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1363 sm->dobj.index = tplg->index; in soc_tplg_dapm_widget_dmixer_create()
1367 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dmixer_create()
1369 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dapm_widget_dmixer_create()
1374 err = soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr); in soc_tplg_dapm_widget_dmixer_create()
1376 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n", in soc_tplg_dapm_widget_dmixer_create()
1382 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dmixer_create()
1385 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dmixer_create()
1394 soc_tplg_free_tlv(tplg, &kc[i]); in soc_tplg_dapm_widget_dmixer_create()
1405 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_denum_create() argument
1417 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_dapm_widget_denum_create()
1427 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_dapm_widget_denum_create()
1430 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", in soc_tplg_dapm_widget_denum_create()
1441 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_dapm_widget_denum_create()
1442 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_dapm_widget_denum_create()
1444 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_dapm_widget_denum_create()
1449 se->dobj.index = tplg->index; in soc_tplg_dapm_widget_denum_create()
1456 dev_err(tplg->dev, "ASoC: could not create values for %s\n", in soc_tplg_dapm_widget_denum_create()
1466 dev_err(tplg->dev, "ASoC: could not create texts for %s\n", in soc_tplg_dapm_widget_denum_create()
1472 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n", in soc_tplg_dapm_widget_denum_create()
1478 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_denum_create()
1480 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_dapm_widget_denum_create()
1485 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_denum_create()
1488 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_denum_create()
1515 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_dbytes_create() argument
1527 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dapm_widget_dbytes_create()
1538 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dapm_widget_dbytes_create()
1541 dev_dbg(tplg->dev, in soc_tplg_dapm_widget_dbytes_create()
1556 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dbytes_create()
1558 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dapm_widget_dbytes_create()
1563 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dbytes_create()
1566 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dbytes_create()
1585 static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, in soc_tplg_dapm_widget_create() argument
1588 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_widget_create()
1591 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_widget_create()
1602 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n", in soc_tplg_dapm_widget_create()
1629 template.dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1631 tplg->pos += in soc_tplg_dapm_widget_create()
1641 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_dapm_widget_create()
1642 dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n", in soc_tplg_dapm_widget_create()
1655 soc_tplg_dapm_widget_dmixer_create(tplg, in soc_tplg_dapm_widget_create()
1670 soc_tplg_dapm_widget_denum_create(tplg, in soc_tplg_dapm_widget_create()
1681 soc_tplg_dapm_widget_dbytes_create(tplg, in soc_tplg_dapm_widget_create()
1689 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", in soc_tplg_dapm_widget_create()
1697 ret = soc_tplg_widget_load(tplg, &template, w); in soc_tplg_dapm_widget_create()
1714 widget->dobj.ops = tplg->ops; in soc_tplg_dapm_widget_create()
1715 widget->dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1716 list_add(&widget->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dapm_widget_create()
1718 ret = soc_tplg_widget_ready(tplg, widget, w); in soc_tplg_dapm_widget_create()
1737 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_widget_elems_load() argument
1745 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count); in soc_tplg_dapm_widget_elems_load()
1748 widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; in soc_tplg_dapm_widget_elems_load()
1750 dev_err(tplg->dev, "ASoC: invalid widget size\n"); in soc_tplg_dapm_widget_elems_load()
1754 ret = soc_tplg_dapm_widget_create(tplg, widget); in soc_tplg_dapm_widget_elems_load()
1756 dev_err(tplg->dev, "ASoC: failed to load widget %s\n", in soc_tplg_dapm_widget_elems_load()
1765 static int soc_tplg_dapm_complete(struct soc_tplg *tplg) in soc_tplg_dapm_complete() argument
1767 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_complete()
1774 dev_warn(tplg->dev, "ASoC: Parent card not yet available," in soc_tplg_dapm_complete()
1781 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n", in soc_tplg_dapm_complete()
1823 static int soc_tplg_dai_create(struct soc_tplg *tplg, in soc_tplg_dai_create() argument
1831 snd_soc_component_get_dapm(tplg->comp); in soc_tplg_dai_create()
1867 ret = soc_tplg_dai_load(tplg, dai_drv, pcm, NULL); in soc_tplg_dai_create()
1869 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n"); in soc_tplg_dai_create()
1873 dai_drv->dobj.index = tplg->index; in soc_tplg_dai_create()
1874 dai_drv->dobj.ops = tplg->ops; in soc_tplg_dai_create()
1876 list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dai_create()
1879 dai = devm_snd_soc_register_dai(tplg->comp->dev, tplg->comp, dai_drv, false); in soc_tplg_dai_create()
1925 static int soc_tplg_fe_link_create(struct soc_tplg *tplg, in soc_tplg_fe_link_create() argument
1947 link->dobj.index = tplg->index; in soc_tplg_fe_link_create()
1948 link->dobj.ops = tplg->ops; in soc_tplg_fe_link_create()
1984 ret = soc_tplg_dai_link_load(tplg, link, NULL); in soc_tplg_fe_link_create()
1986 dev_err(tplg->comp->dev, "ASoC: FE link loading failed\n"); in soc_tplg_fe_link_create()
1990 ret = snd_soc_add_pcm_runtime(tplg->comp->card, link); in soc_tplg_fe_link_create()
1992 dev_err(tplg->comp->dev, "ASoC: adding FE link failed\n"); in soc_tplg_fe_link_create()
1996 list_add(&link->dobj.list, &tplg->comp->dobj_list); in soc_tplg_fe_link_create()
2008 static int soc_tplg_pcm_create(struct soc_tplg *tplg, in soc_tplg_pcm_create() argument
2013 ret = soc_tplg_dai_create(tplg, pcm); in soc_tplg_pcm_create()
2017 return soc_tplg_fe_link_create(tplg, pcm); in soc_tplg_pcm_create()
2048 static int pcm_new_ver(struct soc_tplg *tplg, in pcm_new_ver() argument
2059 dev_err(tplg->dev, "ASoC: invalid PCM size\n"); in pcm_new_ver()
2063 dev_warn(tplg->dev, "ASoC: old version of PCM\n"); in pcm_new_ver()
2089 static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, in soc_tplg_pcm_elems_load() argument
2102 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; in soc_tplg_pcm_elems_load()
2106 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n", in soc_tplg_pcm_elems_load()
2111 if (soc_tplg_check_elem_count(tplg, in soc_tplg_pcm_elems_load()
2115 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", in soc_tplg_pcm_elems_load()
2121 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; in soc_tplg_pcm_elems_load()
2132 ret = pcm_new_ver(tplg, pcm, &_pcm); in soc_tplg_pcm_elems_load()
2138 ret = soc_tplg_pcm_create(tplg, _pcm); in soc_tplg_pcm_elems_load()
2148 tplg->pos += size + le32_to_cpu(_pcm->priv.size); in soc_tplg_pcm_elems_load()
2154 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count); in soc_tplg_pcm_elems_load()
2236 static int link_new_ver(struct soc_tplg *tplg, in link_new_ver() argument
2248 dev_err(tplg->dev, "ASoC: invalid physical link config size\n"); in link_new_ver()
2252 dev_warn(tplg->dev, "ASoC: old version of physical link config\n"); in link_new_ver()
2312 static int soc_tplg_link_config(struct soc_tplg *tplg, in soc_tplg_link_config() argument
2336 link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id), in soc_tplg_link_config()
2339 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n", in soc_tplg_link_config()
2355 ret = soc_tplg_dai_link_load(tplg, link, cfg); in soc_tplg_link_config()
2357 dev_err(tplg->dev, "ASoC: physical link loading failed\n"); in soc_tplg_link_config()
2362 link->dobj.index = tplg->index; in soc_tplg_link_config()
2363 link->dobj.ops = tplg->ops; in soc_tplg_link_config()
2365 list_add(&link->dobj.list, &tplg->comp->dobj_list); in soc_tplg_link_config()
2372 static int soc_tplg_link_elems_load(struct soc_tplg *tplg, in soc_tplg_link_elems_load() argument
2384 link = (struct snd_soc_tplg_link_config *)tplg->pos; in soc_tplg_link_elems_load()
2388 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n", in soc_tplg_link_elems_load()
2393 if (soc_tplg_check_elem_count(tplg, in soc_tplg_link_elems_load()
2397 dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n", in soc_tplg_link_elems_load()
2404 link = (struct snd_soc_tplg_link_config *)tplg->pos; in soc_tplg_link_elems_load()
2411 ret = link_new_ver(tplg, link, &_link); in soc_tplg_link_elems_load()
2416 ret = soc_tplg_link_config(tplg, _link); in soc_tplg_link_elems_load()
2426 tplg->pos += size + le32_to_cpu(_link->priv.size); in soc_tplg_link_elems_load()
2443 static int soc_tplg_dai_config(struct soc_tplg *tplg, in soc_tplg_dai_config() argument
2458 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n", in soc_tplg_dai_config()
2464 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n", in soc_tplg_dai_config()
2495 ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai); in soc_tplg_dai_config()
2497 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n"); in soc_tplg_dai_config()
2510 static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, in soc_tplg_dai_elems_load() argument
2521 dai = (struct snd_soc_tplg_dai *)tplg->pos; in soc_tplg_dai_elems_load()
2523 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n"); in soc_tplg_dai_elems_load()
2527 ret = soc_tplg_dai_config(tplg, dai); in soc_tplg_dai_elems_load()
2529 dev_err(tplg->dev, "ASoC: failed to configure DAI\n"); in soc_tplg_dai_elems_load()
2533 tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size)); in soc_tplg_dai_elems_load()
2536 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); in soc_tplg_dai_elems_load()
2549 static int manifest_new_ver(struct soc_tplg *tplg, in manifest_new_ver() argument
2561 dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n", in manifest_new_ver()
2568 dev_warn(tplg->dev, "ASoC: old version of manifest\n"); in manifest_new_ver()
2591 static int soc_tplg_manifest_load(struct soc_tplg *tplg, in soc_tplg_manifest_load() argument
2598 manifest = (struct snd_soc_tplg_manifest *)tplg->pos; in soc_tplg_manifest_load()
2606 ret = manifest_new_ver(tplg, manifest, &_manifest); in soc_tplg_manifest_load()
2612 if (tplg->ops && tplg->ops->manifest) in soc_tplg_manifest_load()
2613 ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest); in soc_tplg_manifest_load()
2622 static int soc_valid_header(struct soc_tplg *tplg, in soc_valid_header() argument
2625 if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) in soc_valid_header()
2629 dev_err(tplg->dev, in soc_valid_header()
2631 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg), in soc_valid_header()
2632 tplg->fw->size); in soc_valid_header()
2638 dev_err(tplg->dev, in soc_valid_header()
2640 tplg->pass, hdr->magic, in soc_valid_header()
2641 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
2646 dev_err(tplg->dev, in soc_valid_header()
2648 tplg->pass, hdr->magic, in soc_valid_header()
2649 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
2656 dev_err(tplg->dev, in soc_valid_header()
2658 tplg->pass, hdr->abi, in soc_valid_header()
2659 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg), in soc_valid_header()
2660 tplg->fw->size); in soc_valid_header()
2665 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n", in soc_valid_header()
2666 soc_tplg_get_hdr_offset(tplg)); in soc_valid_header()
2674 static int soc_tplg_load_header(struct soc_tplg *tplg, in soc_tplg_load_header() argument
2677 int (*elem_load)(struct soc_tplg *tplg, in soc_tplg_load_header()
2681 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); in soc_tplg_load_header()
2684 if (le32_to_cpu(hdr->index) != tplg->req_index && in soc_tplg_load_header()
2685 tplg->req_index != SND_SOC_TPLG_INDEX_ALL) in soc_tplg_load_header()
2688 tplg->index = le32_to_cpu(hdr->index); in soc_tplg_load_header()
2730 if (tplg->pass == hdr_pass) { in soc_tplg_load_header()
2731 dev_dbg(tplg->dev, in soc_tplg_load_header()
2734 hdr->vendor_type, tplg->pass); in soc_tplg_load_header()
2735 return elem_load(tplg, hdr); in soc_tplg_load_header()
2742 static int soc_tplg_process_headers(struct soc_tplg *tplg) in soc_tplg_process_headers() argument
2747 tplg->pass = SOC_TPLG_PASS_START; in soc_tplg_process_headers()
2750 while (tplg->pass <= SOC_TPLG_PASS_END) { in soc_tplg_process_headers()
2752 tplg->hdr_pos = tplg->fw->data; in soc_tplg_process_headers()
2753 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
2755 while (!soc_tplg_is_eof(tplg)) { in soc_tplg_process_headers()
2758 ret = soc_valid_header(tplg, hdr); in soc_tplg_process_headers()
2760 dev_err(tplg->dev, in soc_tplg_process_headers()
2768 ret = soc_tplg_load_header(tplg, hdr); in soc_tplg_process_headers()
2770 dev_err(tplg->dev, in soc_tplg_process_headers()
2776 tplg->hdr_pos += le32_to_cpu(hdr->payload_size) + in soc_tplg_process_headers()
2778 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
2782 tplg->pass++; in soc_tplg_process_headers()
2786 ret = soc_tplg_dapm_complete(tplg); in soc_tplg_process_headers()
2788 dev_err(tplg->dev, in soc_tplg_process_headers()
2794 static int soc_tplg_load(struct soc_tplg *tplg) in soc_tplg_load() argument
2798 ret = soc_tplg_process_headers(tplg); in soc_tplg_load()
2800 soc_tplg_complete(tplg); in soc_tplg_load()
2809 struct soc_tplg tplg; in snd_soc_tplg_component_load() local
2817 memset(&tplg, 0, sizeof(tplg)); in snd_soc_tplg_component_load()
2818 tplg.fw = fw; in snd_soc_tplg_component_load()
2819 tplg.dev = comp->dev; in snd_soc_tplg_component_load()
2820 tplg.comp = comp; in snd_soc_tplg_component_load()
2821 tplg.ops = ops; in snd_soc_tplg_component_load()
2822 tplg.req_index = id; in snd_soc_tplg_component_load()
2823 tplg.io_ops = ops->io_ops; in snd_soc_tplg_component_load()
2824 tplg.io_ops_count = ops->io_ops_count; in snd_soc_tplg_component_load()
2825 tplg.bytes_ext_ops = ops->bytes_ext_ops; in snd_soc_tplg_component_load()
2826 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; in snd_soc_tplg_component_load()
2828 ret = soc_tplg_load(&tplg); in snd_soc_tplg_component_load()