Lines Matching refs:tplg

79 static int soc_tplg_process_headers(struct soc_tplg *tplg);
80 static void soc_tplg_complete(struct soc_tplg *tplg);
89 static int soc_tplg_check_elem_count(struct soc_tplg *tplg, size_t elem_size, in soc_tplg_check_elem_count() argument
92 const u8 *end = tplg->pos + elem_size * count; in soc_tplg_check_elem_count()
94 if (end > tplg->fw->data + tplg->fw->size) { in soc_tplg_check_elem_count()
95 dev_err(tplg->dev, "ASoC: %s overflow end of data\n", in soc_tplg_check_elem_count()
103 dev_err(tplg->dev, in soc_tplg_check_elem_count()
112 static inline int soc_tplg_is_eof(struct soc_tplg *tplg) in soc_tplg_is_eof() argument
114 const u8 *end = tplg->hdr_pos; in soc_tplg_is_eof()
116 if (end >= tplg->fw->data + tplg->fw->size) in soc_tplg_is_eof()
121 static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg *tplg) in soc_tplg_get_hdr_offset() argument
123 return (unsigned long)(tplg->hdr_pos - tplg->fw->data); in soc_tplg_get_hdr_offset()
126 static inline unsigned long soc_tplg_get_offset(struct soc_tplg *tplg) in soc_tplg_get_offset() argument
128 return (unsigned long)(tplg->pos - tplg->fw->data); in soc_tplg_get_offset()
194 static int tplc_chan_get_reg(struct soc_tplg *tplg, in tplc_chan_get_reg() argument
207 static int tplc_chan_get_shift(struct soc_tplg *tplg, in tplc_chan_get_shift() argument
232 static inline void soc_bind_err(struct soc_tplg *tplg, in soc_bind_err() argument
235 dev_err(tplg->dev, in soc_bind_err()
238 soc_tplg_get_offset(tplg)); in soc_bind_err()
241 static inline void soc_control_err(struct soc_tplg *tplg, in soc_control_err() argument
244 dev_err(tplg->dev, in soc_control_err()
247 soc_tplg_get_offset(tplg)); in soc_control_err()
251 static int soc_tplg_vendor_load_(struct soc_tplg *tplg, in soc_tplg_vendor_load_() argument
256 if (tplg->comp && tplg->ops && tplg->ops->vendor_load) in soc_tplg_vendor_load_()
257 ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr); in soc_tplg_vendor_load_()
259 dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n", in soc_tplg_vendor_load_()
265 dev_err(tplg->dev, in soc_tplg_vendor_load_()
267 soc_tplg_get_hdr_offset(tplg), in soc_tplg_vendor_load_()
268 soc_tplg_get_hdr_offset(tplg), in soc_tplg_vendor_load_()
274 static int soc_tplg_vendor_load(struct soc_tplg *tplg, in soc_tplg_vendor_load() argument
277 if (tplg->pass != SOC_TPLG_PASS_VENDOR) in soc_tplg_vendor_load()
280 return soc_tplg_vendor_load_(tplg, hdr); in soc_tplg_vendor_load()
285 static int soc_tplg_widget_load(struct soc_tplg *tplg, in soc_tplg_widget_load() argument
288 if (tplg->comp && tplg->ops && tplg->ops->widget_load) in soc_tplg_widget_load()
289 return tplg->ops->widget_load(tplg->comp, tplg->index, w, in soc_tplg_widget_load()
297 static int soc_tplg_widget_ready(struct soc_tplg *tplg, in soc_tplg_widget_ready() argument
300 if (tplg->comp && tplg->ops && tplg->ops->widget_ready) in soc_tplg_widget_ready()
301 return tplg->ops->widget_ready(tplg->comp, tplg->index, w, in soc_tplg_widget_ready()
308 static int soc_tplg_dai_load(struct soc_tplg *tplg, in soc_tplg_dai_load() argument
312 if (tplg->comp && tplg->ops && tplg->ops->dai_load) in soc_tplg_dai_load()
313 return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv, in soc_tplg_dai_load()
320 static int soc_tplg_dai_link_load(struct soc_tplg *tplg, in soc_tplg_dai_link_load() argument
323 if (tplg->comp && tplg->ops && tplg->ops->link_load) in soc_tplg_dai_link_load()
324 return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg); in soc_tplg_dai_link_load()
330 static void soc_tplg_complete(struct soc_tplg *tplg) in soc_tplg_complete() argument
332 if (tplg->comp && tplg->ops && tplg->ops->complete) in soc_tplg_complete()
333 tplg->ops->complete(tplg->comp); in soc_tplg_complete()
361 static int soc_tplg_add_kcontrol(struct soc_tplg *tplg, in soc_tplg_add_kcontrol() argument
364 struct snd_soc_component *comp = tplg->comp; in soc_tplg_add_kcontrol()
542 const struct soc_tplg *tplg) in soc_tplg_kcontrol_bind_io() argument
564 ext_ops = tplg->bytes_ext_ops; in soc_tplg_kcontrol_bind_io()
565 num_ops = tplg->bytes_ext_ops_count; in soc_tplg_kcontrol_bind_io()
580 ops = tplg->io_ops; in soc_tplg_kcontrol_bind_io()
581 num_ops = tplg->io_ops_count; in soc_tplg_kcontrol_bind_io()
641 static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, in soc_tplg_init_kcontrol() argument
644 if (tplg->comp && tplg->ops && tplg->ops->control_load) in soc_tplg_init_kcontrol()
645 return tplg->ops->control_load(tplg->comp, tplg->index, k, in soc_tplg_init_kcontrol()
652 static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, in soc_tplg_create_tlv_db_scale() argument
672 static int soc_tplg_create_tlv(struct soc_tplg *tplg, in soc_tplg_create_tlv() argument
684 return soc_tplg_create_tlv_db_scale(tplg, kc, in soc_tplg_create_tlv()
689 dev_dbg(tplg->dev, "Unsupported TLV type %d\n", in soc_tplg_create_tlv()
698 static inline void soc_tplg_free_tlv(struct soc_tplg *tplg, in soc_tplg_free_tlv() argument
704 static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dbytes_create() argument
712 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dbytes_create()
715 dev_err(tplg->dev, "ASoC: Invalid count %d for byte control\n", in soc_tplg_dbytes_create()
721 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dbytes_create()
732 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dbytes_create()
735 dev_dbg(tplg->dev, in soc_tplg_dbytes_create()
747 sbe->dobj.ops = tplg->ops; in soc_tplg_dbytes_create()
751 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg); in soc_tplg_dbytes_create()
753 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dbytes_create()
759 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
762 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dbytes_create()
769 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
772 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dbytes_create()
778 list_add(&sbe->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dbytes_create()
784 static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dmixer_create() argument
792 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dmixer_create()
796 dev_err(tplg->dev, "ASoC: invalid count %d for controls\n", in soc_tplg_dmixer_create()
802 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dmixer_create()
812 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dmixer_create()
815 dev_dbg(tplg->dev, in soc_tplg_dmixer_create()
826 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
828 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
830 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
832 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
839 sm->dobj.index = tplg->index; in soc_tplg_dmixer_create()
840 sm->dobj.ops = tplg->ops; in soc_tplg_dmixer_create()
845 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg); in soc_tplg_dmixer_create()
847 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dmixer_create()
853 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
856 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dmixer_create()
863 soc_tplg_create_tlv(tplg, &kc, &mc->hdr); in soc_tplg_dmixer_create()
866 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
869 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dmixer_create()
871 soc_tplg_free_tlv(tplg, &kc); in soc_tplg_dmixer_create()
876 list_add(&sm->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dmixer_create()
932 static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_denum_create() argument
940 if (soc_tplg_check_elem_count(tplg, in soc_tplg_denum_create()
944 dev_err(tplg->dev, "ASoC: invalid count %d for enum controls\n", in soc_tplg_denum_create()
950 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_denum_create()
951 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_denum_create()
963 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", in soc_tplg_denum_create()
972 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_denum_create()
973 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
975 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
980 se->dobj.index = tplg->index; in soc_tplg_denum_create()
982 se->dobj.ops = tplg->ops; in soc_tplg_denum_create()
990 dev_err(tplg->dev, in soc_tplg_denum_create()
1002 dev_err(tplg->dev, in soc_tplg_denum_create()
1010 dev_err(tplg->dev, in soc_tplg_denum_create()
1018 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg); in soc_tplg_denum_create()
1020 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_denum_create()
1026 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_denum_create()
1029 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_denum_create()
1036 ret = soc_tplg_add_kcontrol(tplg, in soc_tplg_denum_create()
1039 dev_err(tplg->dev, "ASoC: could not add kcontrol %s\n", in soc_tplg_denum_create()
1045 list_add(&se->dobj.list, &tplg->comp->dobj_list); in soc_tplg_denum_create()
1051 static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, in soc_tplg_kcontrol_elems_load() argument
1057 if (tplg->pass != SOC_TPLG_PASS_MIXER) { in soc_tplg_kcontrol_elems_load()
1058 tplg->pos += hdr->size + hdr->payload_size; in soc_tplg_kcontrol_elems_load()
1062 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, in soc_tplg_kcontrol_elems_load()
1063 soc_tplg_get_offset(tplg)); in soc_tplg_kcontrol_elems_load()
1067 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_kcontrol_elems_load()
1070 dev_err(tplg->dev, "ASoC: invalid control size\n"); in soc_tplg_kcontrol_elems_load()
1082 soc_tplg_dmixer_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1089 soc_tplg_denum_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1092 soc_tplg_dbytes_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1095 soc_bind_err(tplg, control_hdr, i); in soc_tplg_kcontrol_elems_load()
1104 static int soc_tplg_add_route(struct soc_tplg *tplg, in soc_tplg_add_route() argument
1107 if (tplg->comp && tplg->ops && tplg->ops->dapm_route_load) in soc_tplg_add_route()
1108 return tplg->ops->dapm_route_load(tplg->comp, tplg->index, in soc_tplg_add_route()
1114 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_graph_elems_load() argument
1117 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_graph_elems_load()
1122 if (tplg->pass != SOC_TPLG_PASS_GRAPH) { in soc_tplg_dapm_graph_elems_load()
1123 tplg->pos += hdr->size + hdr->payload_size; in soc_tplg_dapm_graph_elems_load()
1127 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dapm_graph_elems_load()
1131 dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n", in soc_tplg_dapm_graph_elems_load()
1136 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count, in soc_tplg_dapm_graph_elems_load()
1140 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos; in soc_tplg_dapm_graph_elems_load()
1141 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem); in soc_tplg_dapm_graph_elems_load()
1162 soc_tplg_add_route(tplg, &route); in soc_tplg_dapm_graph_elems_load()
1172 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_dmixer_create() argument
1184 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dapm_widget_dmixer_create()
1189 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dapm_widget_dmixer_create()
1197 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", in soc_tplg_dapm_widget_dmixer_create()
1208 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1210 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1212 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1214 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1221 sm->dobj.index = tplg->index; in soc_tplg_dapm_widget_dmixer_create()
1225 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dmixer_create()
1227 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dapm_widget_dmixer_create()
1233 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dmixer_create()
1236 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dmixer_create()
1243 soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr); in soc_tplg_dapm_widget_dmixer_create()
1259 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_denum_create() argument
1271 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_dapm_widget_denum_create()
1281 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", in soc_tplg_dapm_widget_denum_create()
1294 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_dapm_widget_denum_create()
1295 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_dapm_widget_denum_create()
1297 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_dapm_widget_denum_create()
1302 se->dobj.index = tplg->index; in soc_tplg_dapm_widget_denum_create()
1309 dev_err(tplg->dev, "ASoC: could not create values for %s\n", in soc_tplg_dapm_widget_denum_create()
1319 dev_err(tplg->dev, "ASoC: could not create texts for %s\n", in soc_tplg_dapm_widget_denum_create()
1325 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n", in soc_tplg_dapm_widget_denum_create()
1331 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_denum_create()
1333 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_dapm_widget_denum_create()
1338 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_denum_create()
1341 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_denum_create()
1346 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_dapm_widget_denum_create()
1373 struct soc_tplg *tplg, int count) in soc_tplg_dapm_widget_dbytes_create() argument
1385 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dapm_widget_dbytes_create()
1396 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dapm_widget_dbytes_create()
1399 dev_dbg(tplg->dev, in soc_tplg_dapm_widget_dbytes_create()
1416 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dbytes_create()
1418 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dapm_widget_dbytes_create()
1424 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dbytes_create()
1427 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dbytes_create()
1446 static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, in soc_tplg_dapm_widget_create() argument
1449 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_widget_create()
1452 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_widget_create()
1463 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n", in soc_tplg_dapm_widget_create()
1490 template.dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1492 tplg->pos += in soc_tplg_dapm_widget_create()
1500 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_dapm_widget_create()
1501 dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n", in soc_tplg_dapm_widget_create()
1514 soc_tplg_dapm_widget_dmixer_create(tplg, in soc_tplg_dapm_widget_create()
1529 soc_tplg_dapm_widget_denum_create(tplg, in soc_tplg_dapm_widget_create()
1540 soc_tplg_dapm_widget_dbytes_create(tplg, in soc_tplg_dapm_widget_create()
1548 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", in soc_tplg_dapm_widget_create()
1556 ret = soc_tplg_widget_load(tplg, &template, w); in soc_tplg_dapm_widget_create()
1570 dev_err(tplg->dev, in soc_tplg_dapm_widget_create()
1576 dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n", in soc_tplg_dapm_widget_create()
1584 widget->dobj.ops = tplg->ops; in soc_tplg_dapm_widget_create()
1585 widget->dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1586 list_add(&widget->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dapm_widget_create()
1588 ret = soc_tplg_widget_ready(tplg, widget, w); in soc_tplg_dapm_widget_create()
1604 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_widget_elems_load() argument
1610 if (tplg->pass != SOC_TPLG_PASS_WIDGET) in soc_tplg_dapm_widget_elems_load()
1613 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count); in soc_tplg_dapm_widget_elems_load()
1616 widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; in soc_tplg_dapm_widget_elems_load()
1618 dev_err(tplg->dev, "ASoC: invalid widget size\n"); in soc_tplg_dapm_widget_elems_load()
1622 ret = soc_tplg_dapm_widget_create(tplg, widget); in soc_tplg_dapm_widget_elems_load()
1624 dev_err(tplg->dev, "ASoC: failed to load widget %s\n", in soc_tplg_dapm_widget_elems_load()
1633 static int soc_tplg_dapm_complete(struct soc_tplg *tplg) in soc_tplg_dapm_complete() argument
1635 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_complete()
1642 dev_warn(tplg->dev, "ASoC: Parent card not yet available," in soc_tplg_dapm_complete()
1649 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n", in soc_tplg_dapm_complete()
1686 static int soc_tplg_dai_create(struct soc_tplg *tplg, in soc_tplg_dai_create() argument
1718 ret = soc_tplg_dai_load(tplg, dai_drv, pcm, NULL); in soc_tplg_dai_create()
1720 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n"); in soc_tplg_dai_create()
1725 dai_drv->dobj.index = tplg->index; in soc_tplg_dai_create()
1726 dai_drv->dobj.ops = tplg->ops; in soc_tplg_dai_create()
1728 list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dai_create()
1731 return snd_soc_register_dai(tplg->comp, dai_drv); in soc_tplg_dai_create()
1758 static int soc_tplg_fe_link_create(struct soc_tplg *tplg, in soc_tplg_fe_link_create() argument
1788 ret = soc_tplg_dai_link_load(tplg, link, NULL); in soc_tplg_fe_link_create()
1790 dev_err(tplg->comp->dev, "ASoC: FE link loading failed\n"); in soc_tplg_fe_link_create()
1795 link->dobj.index = tplg->index; in soc_tplg_fe_link_create()
1796 link->dobj.ops = tplg->ops; in soc_tplg_fe_link_create()
1798 list_add(&link->dobj.list, &tplg->comp->dobj_list); in soc_tplg_fe_link_create()
1800 snd_soc_add_dai_link(tplg->comp->card, link); in soc_tplg_fe_link_create()
1805 static int soc_tplg_pcm_create(struct soc_tplg *tplg, in soc_tplg_pcm_create() argument
1810 ret = soc_tplg_dai_create(tplg, pcm); in soc_tplg_pcm_create()
1814 return soc_tplg_fe_link_create(tplg, pcm); in soc_tplg_pcm_create()
1845 static int pcm_new_ver(struct soc_tplg *tplg, in pcm_new_ver() argument
1856 dev_err(tplg->dev, "ASoC: invalid PCM size\n"); in pcm_new_ver()
1860 dev_warn(tplg->dev, "ASoC: old version of PCM\n"); in pcm_new_ver()
1886 static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, in soc_tplg_pcm_elems_load() argument
1894 if (tplg->pass != SOC_TPLG_PASS_PCM_DAI) in soc_tplg_pcm_elems_load()
1898 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; in soc_tplg_pcm_elems_load()
1901 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n", in soc_tplg_pcm_elems_load()
1906 if (soc_tplg_check_elem_count(tplg, in soc_tplg_pcm_elems_load()
1909 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", in soc_tplg_pcm_elems_load()
1915 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; in soc_tplg_pcm_elems_load()
1925 pcm_new_ver(tplg, pcm, &_pcm); in soc_tplg_pcm_elems_load()
1929 soc_tplg_pcm_create(tplg, _pcm); in soc_tplg_pcm_elems_load()
1934 tplg->pos += pcm->size + _pcm->priv.size; in soc_tplg_pcm_elems_load()
1940 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count); in soc_tplg_pcm_elems_load()
2021 static int link_new_ver(struct soc_tplg *tplg, in link_new_ver() argument
2032 dev_err(tplg->dev, "ASoC: invalid physical link config size\n"); in link_new_ver()
2036 dev_warn(tplg->dev, "ASoC: old version of physical link config\n"); in link_new_ver()
2055 static int soc_tplg_link_config(struct soc_tplg *tplg, in soc_tplg_link_config() argument
2079 link = snd_soc_find_dai_link(tplg->comp->card, cfg->id, in soc_tplg_link_config()
2082 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n", in soc_tplg_link_config()
2096 ret = soc_tplg_dai_link_load(tplg, link, cfg); in soc_tplg_link_config()
2098 dev_err(tplg->dev, "ASoC: physical link loading failed\n"); in soc_tplg_link_config()
2107 static int soc_tplg_link_elems_load(struct soc_tplg *tplg, in soc_tplg_link_elems_load() argument
2115 if (tplg->pass != SOC_TPLG_PASS_LINK) { in soc_tplg_link_elems_load()
2116 tplg->pos += hdr->size + hdr->payload_size; in soc_tplg_link_elems_load()
2121 link = (struct snd_soc_tplg_link_config *)tplg->pos; in soc_tplg_link_elems_load()
2124 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n", in soc_tplg_link_elems_load()
2129 if (soc_tplg_check_elem_count(tplg, in soc_tplg_link_elems_load()
2132 dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n", in soc_tplg_link_elems_load()
2139 link = (struct snd_soc_tplg_link_config *)tplg->pos; in soc_tplg_link_elems_load()
2145 ret = link_new_ver(tplg, link, &_link); in soc_tplg_link_elems_load()
2150 ret = soc_tplg_link_config(tplg, _link); in soc_tplg_link_elems_load()
2157 tplg->pos += link->size + _link->priv.size; in soc_tplg_link_elems_load()
2174 static int soc_tplg_dai_config(struct soc_tplg *tplg, in soc_tplg_dai_config() argument
2187 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n", in soc_tplg_dai_config()
2193 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n", in soc_tplg_dai_config()
2218 ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai); in soc_tplg_dai_config()
2220 dev_err(tplg->comp->dev, "ASoC: DAI loading failed\n"); in soc_tplg_dai_config()
2228 static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, in soc_tplg_dai_elems_load() argument
2235 if (tplg->pass != SOC_TPLG_PASS_BE_DAI) in soc_tplg_dai_elems_load()
2240 dai = (struct snd_soc_tplg_dai *)tplg->pos; in soc_tplg_dai_elems_load()
2242 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n"); in soc_tplg_dai_elems_load()
2246 soc_tplg_dai_config(tplg, dai); in soc_tplg_dai_elems_load()
2247 tplg->pos += (sizeof(*dai) + dai->priv.size); in soc_tplg_dai_elems_load()
2250 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); in soc_tplg_dai_elems_load()
2263 static int manifest_new_ver(struct soc_tplg *tplg, in manifest_new_ver() argument
2273 dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n", in manifest_new_ver()
2280 dev_warn(tplg->dev, "ASoC: old version of manifest\n"); in manifest_new_ver()
2302 static int soc_tplg_manifest_load(struct soc_tplg *tplg, in soc_tplg_manifest_load() argument
2309 if (tplg->pass != SOC_TPLG_PASS_MANIFEST) in soc_tplg_manifest_load()
2312 manifest = (struct snd_soc_tplg_manifest *)tplg->pos; in soc_tplg_manifest_load()
2320 err = manifest_new_ver(tplg, manifest, &_manifest); in soc_tplg_manifest_load()
2326 if (tplg->comp && tplg->ops && tplg->ops->manifest) in soc_tplg_manifest_load()
2327 return tplg->ops->manifest(tplg->comp, tplg->index, _manifest); in soc_tplg_manifest_load()
2336 static int soc_valid_header(struct soc_tplg *tplg, in soc_valid_header() argument
2339 if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) in soc_valid_header()
2343 dev_err(tplg->dev, in soc_valid_header()
2345 hdr->type, soc_tplg_get_hdr_offset(tplg), in soc_valid_header()
2346 tplg->fw->size); in soc_valid_header()
2352 dev_err(tplg->dev, in soc_valid_header()
2354 tplg->pass, hdr->magic, in soc_valid_header()
2355 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
2360 dev_err(tplg->dev, in soc_valid_header()
2362 tplg->pass, hdr->magic, in soc_valid_header()
2363 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
2370 dev_err(tplg->dev, in soc_valid_header()
2372 tplg->pass, hdr->abi, in soc_valid_header()
2373 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg), in soc_valid_header()
2374 tplg->fw->size); in soc_valid_header()
2379 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n", in soc_valid_header()
2380 soc_tplg_get_hdr_offset(tplg)); in soc_valid_header()
2384 if (tplg->pass == hdr->type) in soc_valid_header()
2385 dev_dbg(tplg->dev, in soc_valid_header()
2388 hdr->vendor_type, tplg->pass); in soc_valid_header()
2394 static int soc_tplg_load_header(struct soc_tplg *tplg, in soc_tplg_load_header() argument
2397 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); in soc_tplg_load_header()
2400 if (hdr->index != tplg->req_index && in soc_tplg_load_header()
2401 tplg->req_index != SND_SOC_TPLG_INDEX_ALL) in soc_tplg_load_header()
2404 tplg->index = hdr->index; in soc_tplg_load_header()
2410 return soc_tplg_kcontrol_elems_load(tplg, hdr); in soc_tplg_load_header()
2412 return soc_tplg_dapm_graph_elems_load(tplg, hdr); in soc_tplg_load_header()
2414 return soc_tplg_dapm_widget_elems_load(tplg, hdr); in soc_tplg_load_header()
2416 return soc_tplg_pcm_elems_load(tplg, hdr); in soc_tplg_load_header()
2418 return soc_tplg_dai_elems_load(tplg, hdr); in soc_tplg_load_header()
2422 return soc_tplg_link_elems_load(tplg, hdr); in soc_tplg_load_header()
2424 return soc_tplg_manifest_load(tplg, hdr); in soc_tplg_load_header()
2427 return soc_tplg_vendor_load(tplg, hdr); in soc_tplg_load_header()
2434 static int soc_tplg_process_headers(struct soc_tplg *tplg) in soc_tplg_process_headers() argument
2439 tplg->pass = SOC_TPLG_PASS_START; in soc_tplg_process_headers()
2442 while (tplg->pass <= SOC_TPLG_PASS_END) { in soc_tplg_process_headers()
2444 tplg->hdr_pos = tplg->fw->data; in soc_tplg_process_headers()
2445 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
2447 while (!soc_tplg_is_eof(tplg)) { in soc_tplg_process_headers()
2450 ret = soc_valid_header(tplg, hdr); in soc_tplg_process_headers()
2457 ret = soc_tplg_load_header(tplg, hdr); in soc_tplg_process_headers()
2462 tplg->hdr_pos += hdr->payload_size + in soc_tplg_process_headers()
2464 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
2468 tplg->pass++; in soc_tplg_process_headers()
2472 ret = soc_tplg_dapm_complete(tplg); in soc_tplg_process_headers()
2474 dev_err(tplg->dev, in soc_tplg_process_headers()
2480 static int soc_tplg_load(struct soc_tplg *tplg) in soc_tplg_load() argument
2484 ret = soc_tplg_process_headers(tplg); in soc_tplg_load()
2486 soc_tplg_complete(tplg); in soc_tplg_load()
2495 struct soc_tplg tplg; in snd_soc_tplg_component_load() local
2498 memset(&tplg, 0, sizeof(tplg)); in snd_soc_tplg_component_load()
2499 tplg.fw = fw; in snd_soc_tplg_component_load()
2500 tplg.dev = comp->dev; in snd_soc_tplg_component_load()
2501 tplg.comp = comp; in snd_soc_tplg_component_load()
2502 tplg.ops = ops; in snd_soc_tplg_component_load()
2503 tplg.req_index = id; in snd_soc_tplg_component_load()
2504 tplg.io_ops = ops->io_ops; in snd_soc_tplg_component_load()
2505 tplg.io_ops_count = ops->io_ops_count; in snd_soc_tplg_component_load()
2506 tplg.bytes_ext_ops = ops->bytes_ext_ops; in snd_soc_tplg_component_load()
2507 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; in snd_soc_tplg_component_load()
2509 return soc_tplg_load(&tplg); in snd_soc_tplg_component_load()