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);
91 static int soc_tplg_check_elem_count(struct soc_tplg *tplg, size_t elem_size, in soc_tplg_check_elem_count() argument
94 const u8 *end = tplg->pos + elem_size * count; in soc_tplg_check_elem_count()
96 if (end > tplg->fw->data + tplg->fw->size) { in soc_tplg_check_elem_count()
97 dev_err(tplg->dev, "ASoC: %s overflow end of data\n", in soc_tplg_check_elem_count()
105 dev_err(tplg->dev, in soc_tplg_check_elem_count()
114 static inline int soc_tplg_is_eof(struct soc_tplg *tplg) in soc_tplg_is_eof() argument
116 const u8 *end = tplg->hdr_pos; in soc_tplg_is_eof()
118 if (end >= tplg->fw->data + tplg->fw->size) in soc_tplg_is_eof()
123 static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg *tplg) in soc_tplg_get_hdr_offset() argument
125 return (unsigned long)(tplg->hdr_pos - tplg->fw->data); in soc_tplg_get_hdr_offset()
128 static inline unsigned long soc_tplg_get_offset(struct soc_tplg *tplg) in soc_tplg_get_offset() argument
130 return (unsigned long)(tplg->pos - tplg->fw->data); in soc_tplg_get_offset()
188 static int tplc_chan_get_reg(struct soc_tplg *tplg, in tplc_chan_get_reg() argument
201 static int tplc_chan_get_shift(struct soc_tplg *tplg, in tplc_chan_get_shift() argument
271 static inline void soc_bind_err(struct soc_tplg *tplg, in soc_bind_err() argument
274 dev_err(tplg->dev, in soc_bind_err()
277 soc_tplg_get_offset(tplg)); in soc_bind_err()
280 static inline void soc_control_err(struct soc_tplg *tplg, in soc_control_err() argument
283 dev_err(tplg->dev, in soc_control_err()
286 soc_tplg_get_offset(tplg)); in soc_control_err()
290 static int soc_tplg_vendor_load_(struct soc_tplg *tplg, in soc_tplg_vendor_load_() argument
295 if (tplg->comp && tplg->ops && tplg->ops->vendor_load) in soc_tplg_vendor_load_()
296 ret = tplg->ops->vendor_load(tplg->comp, hdr); in soc_tplg_vendor_load_()
298 dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n", in soc_tplg_vendor_load_()
304 dev_err(tplg->dev, in soc_tplg_vendor_load_()
306 soc_tplg_get_hdr_offset(tplg), in soc_tplg_vendor_load_()
307 soc_tplg_get_hdr_offset(tplg), in soc_tplg_vendor_load_()
313 static int soc_tplg_vendor_load(struct soc_tplg *tplg, in soc_tplg_vendor_load() argument
316 if (tplg->pass != SOC_TPLG_PASS_VENDOR) in soc_tplg_vendor_load()
319 return soc_tplg_vendor_load_(tplg, hdr); in soc_tplg_vendor_load()
324 static int soc_tplg_widget_load(struct soc_tplg *tplg, in soc_tplg_widget_load() argument
327 if (tplg->comp && tplg->ops && tplg->ops->widget_load) in soc_tplg_widget_load()
328 return tplg->ops->widget_load(tplg->comp, w, tplg_w); in soc_tplg_widget_load()
334 static int soc_tplg_pcm_dai_load(struct soc_tplg *tplg, in soc_tplg_pcm_dai_load() argument
337 if (tplg->comp && tplg->ops && tplg->ops->pcm_dai_load) in soc_tplg_pcm_dai_load()
338 return tplg->ops->pcm_dai_load(tplg->comp, pcm_dai, num_pcm_dai); in soc_tplg_pcm_dai_load()
344 static void soc_tplg_complete(struct soc_tplg *tplg) in soc_tplg_complete() argument
346 if (tplg->comp && tplg->ops && tplg->ops->complete) in soc_tplg_complete()
347 tplg->ops->complete(tplg->comp); in soc_tplg_complete()
375 static int soc_tplg_add_kcontrol(struct soc_tplg *tplg, in soc_tplg_add_kcontrol() argument
378 struct snd_soc_component *comp = tplg->comp; in soc_tplg_add_kcontrol()
515 const struct soc_tplg *tplg) in soc_tplg_kcontrol_bind_io() argument
537 ext_ops = tplg->bytes_ext_ops; in soc_tplg_kcontrol_bind_io()
538 num_ops = tplg->bytes_ext_ops_count; in soc_tplg_kcontrol_bind_io()
553 ops = tplg->io_ops; in soc_tplg_kcontrol_bind_io()
554 num_ops = tplg->io_ops_count; in soc_tplg_kcontrol_bind_io()
614 static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, in soc_tplg_init_kcontrol() argument
617 if (tplg->comp && tplg->ops && tplg->ops->control_load) in soc_tplg_init_kcontrol()
618 return tplg->ops->control_load(tplg->comp, k, hdr); in soc_tplg_init_kcontrol()
624 static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, in soc_tplg_create_tlv_db_scale() argument
644 static int soc_tplg_create_tlv(struct soc_tplg *tplg, in soc_tplg_create_tlv() argument
656 return soc_tplg_create_tlv_db_scale(tplg, kc, in soc_tplg_create_tlv()
661 dev_dbg(tplg->dev, "Unsupported TLV type %d\n", in soc_tplg_create_tlv()
670 static inline void soc_tplg_free_tlv(struct soc_tplg *tplg, in soc_tplg_free_tlv() argument
676 static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dbytes_create() argument
684 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dbytes_create()
687 dev_err(tplg->dev, "ASoC: Invalid count %d for byte control\n", in soc_tplg_dbytes_create()
693 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dbytes_create()
704 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dbytes_create()
707 dev_dbg(tplg->dev, in soc_tplg_dbytes_create()
719 sbe->dobj.ops = tplg->ops; in soc_tplg_dbytes_create()
723 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg); in soc_tplg_dbytes_create()
725 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dbytes_create()
731 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
734 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dbytes_create()
741 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dbytes_create()
744 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dbytes_create()
750 list_add(&sbe->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dbytes_create()
756 static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_dmixer_create() argument
764 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dmixer_create()
768 dev_err(tplg->dev, "ASoC: invalid count %d for controls\n", in soc_tplg_dmixer_create()
774 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dmixer_create()
784 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dmixer_create()
787 dev_dbg(tplg->dev, in soc_tplg_dmixer_create()
798 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
800 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dmixer_create()
802 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
804 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dmixer_create()
811 sm->dobj.index = tplg->index; in soc_tplg_dmixer_create()
812 sm->dobj.ops = tplg->ops; in soc_tplg_dmixer_create()
817 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg); in soc_tplg_dmixer_create()
819 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dmixer_create()
825 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
828 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dmixer_create()
835 soc_tplg_create_tlv(tplg, &kc, &mc->hdr); in soc_tplg_dmixer_create()
838 err = soc_tplg_add_kcontrol(tplg, &kc, in soc_tplg_dmixer_create()
841 dev_err(tplg->dev, "ASoC: failed to add %s\n", in soc_tplg_dmixer_create()
843 soc_tplg_free_tlv(tplg, &kc); in soc_tplg_dmixer_create()
848 list_add(&sm->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dmixer_create()
903 static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, in soc_tplg_denum_create() argument
911 if (soc_tplg_check_elem_count(tplg, in soc_tplg_denum_create()
915 dev_err(tplg->dev, "ASoC: invalid count %d for enum controls\n", in soc_tplg_denum_create()
921 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_denum_create()
922 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_denum_create()
934 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", in soc_tplg_denum_create()
943 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_denum_create()
944 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
946 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, in soc_tplg_denum_create()
951 se->dobj.index = tplg->index; in soc_tplg_denum_create()
953 se->dobj.ops = tplg->ops; in soc_tplg_denum_create()
961 dev_err(tplg->dev, in soc_tplg_denum_create()
973 dev_err(tplg->dev, in soc_tplg_denum_create()
981 dev_err(tplg->dev, in soc_tplg_denum_create()
989 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg); in soc_tplg_denum_create()
991 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_denum_create()
997 err = soc_tplg_init_kcontrol(tplg, &kc, in soc_tplg_denum_create()
1000 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_denum_create()
1007 ret = soc_tplg_add_kcontrol(tplg, in soc_tplg_denum_create()
1010 dev_err(tplg->dev, "ASoC: could not add kcontrol %s\n", in soc_tplg_denum_create()
1016 list_add(&se->dobj.list, &tplg->comp->dobj_list); in soc_tplg_denum_create()
1022 static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, in soc_tplg_kcontrol_elems_load() argument
1028 if (tplg->pass != SOC_TPLG_PASS_MIXER) { in soc_tplg_kcontrol_elems_load()
1029 tplg->pos += hdr->size + hdr->payload_size; in soc_tplg_kcontrol_elems_load()
1033 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, in soc_tplg_kcontrol_elems_load()
1034 soc_tplg_get_offset(tplg)); in soc_tplg_kcontrol_elems_load()
1038 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_kcontrol_elems_load()
1048 soc_tplg_dmixer_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1055 soc_tplg_denum_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1058 soc_tplg_dbytes_create(tplg, 1, hdr->payload_size); in soc_tplg_kcontrol_elems_load()
1061 soc_bind_err(tplg, control_hdr, i); in soc_tplg_kcontrol_elems_load()
1069 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_graph_elems_load() argument
1072 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_graph_elems_load()
1077 if (tplg->pass != SOC_TPLG_PASS_GRAPH) { in soc_tplg_dapm_graph_elems_load()
1078 tplg->pos += hdr->size + hdr->payload_size; in soc_tplg_dapm_graph_elems_load()
1082 if (soc_tplg_check_elem_count(tplg, in soc_tplg_dapm_graph_elems_load()
1086 dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n", in soc_tplg_dapm_graph_elems_load()
1091 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes\n", count); in soc_tplg_dapm_graph_elems_load()
1094 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos; in soc_tplg_dapm_graph_elems_load()
1095 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem); in soc_tplg_dapm_graph_elems_load()
1124 struct soc_tplg *tplg, int num_kcontrols) in soc_tplg_dapm_widget_dmixer_create() argument
1136 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; in soc_tplg_dapm_widget_dmixer_create()
1141 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + in soc_tplg_dapm_widget_dmixer_create()
1149 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", in soc_tplg_dapm_widget_dmixer_create()
1158 sm->reg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1160 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1162 sm->shift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1164 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, in soc_tplg_dapm_widget_dmixer_create()
1171 sm->dobj.index = tplg->index; in soc_tplg_dapm_widget_dmixer_create()
1175 err = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dmixer_create()
1177 soc_control_err(tplg, &mc->hdr, mc->hdr.name); in soc_tplg_dapm_widget_dmixer_create()
1183 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dmixer_create()
1186 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dmixer_create()
1204 struct soc_tplg *tplg) in soc_tplg_dapm_widget_denum_create() argument
1211 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; in soc_tplg_dapm_widget_denum_create()
1212 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + in soc_tplg_dapm_widget_denum_create()
1228 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", in soc_tplg_dapm_widget_denum_create()
1237 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_dapm_widget_denum_create()
1238 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FL); in soc_tplg_dapm_widget_denum_create()
1239 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FR); in soc_tplg_dapm_widget_denum_create()
1243 se->dobj.index = tplg->index; in soc_tplg_dapm_widget_denum_create()
1250 dev_err(tplg->dev, "ASoC: could not create values for %s\n", in soc_tplg_dapm_widget_denum_create()
1260 dev_err(tplg->dev, "ASoC: could not create texts for %s\n", in soc_tplg_dapm_widget_denum_create()
1266 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n", in soc_tplg_dapm_widget_denum_create()
1272 err = soc_tplg_kcontrol_bind_io(&ec->hdr, kc, tplg); in soc_tplg_dapm_widget_denum_create()
1274 soc_control_err(tplg, &ec->hdr, ec->hdr.name); in soc_tplg_dapm_widget_denum_create()
1279 err = soc_tplg_init_kcontrol(tplg, kc, in soc_tplg_dapm_widget_denum_create()
1282 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_denum_create()
1303 struct soc_tplg *tplg, int count) in soc_tplg_dapm_widget_dbytes_create() argument
1315 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; in soc_tplg_dapm_widget_dbytes_create()
1326 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + in soc_tplg_dapm_widget_dbytes_create()
1329 dev_dbg(tplg->dev, in soc_tplg_dapm_widget_dbytes_create()
1342 err = soc_tplg_kcontrol_bind_io(&be->hdr, &kc[i], tplg); in soc_tplg_dapm_widget_dbytes_create()
1344 soc_control_err(tplg, &be->hdr, be->hdr.name); in soc_tplg_dapm_widget_dbytes_create()
1350 err = soc_tplg_init_kcontrol(tplg, &kc[i], in soc_tplg_dapm_widget_dbytes_create()
1353 dev_err(tplg->dev, "ASoC: failed to init %s\n", in soc_tplg_dapm_widget_dbytes_create()
1370 static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, in soc_tplg_dapm_widget_create() argument
1373 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; in soc_tplg_dapm_widget_create()
1376 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_widget_create()
1386 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n", in soc_tplg_dapm_widget_create()
1412 template.dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1414 tplg->pos += in soc_tplg_dapm_widget_create()
1421 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; in soc_tplg_dapm_widget_create()
1422 dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n", in soc_tplg_dapm_widget_create()
1434 soc_tplg_dapm_widget_dmixer_create(tplg, in soc_tplg_dapm_widget_create()
1449 soc_tplg_dapm_widget_denum_create(tplg); in soc_tplg_dapm_widget_create()
1458 soc_tplg_dapm_widget_dbytes_create(tplg, in soc_tplg_dapm_widget_create()
1466 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", in soc_tplg_dapm_widget_create()
1474 ret = soc_tplg_widget_load(tplg, &template, w); in soc_tplg_dapm_widget_create()
1485 dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n", in soc_tplg_dapm_widget_create()
1491 widget->dobj.ops = tplg->ops; in soc_tplg_dapm_widget_create()
1492 widget->dobj.index = tplg->index; in soc_tplg_dapm_widget_create()
1493 list_add(&widget->dobj.list, &tplg->comp->dobj_list); in soc_tplg_dapm_widget_create()
1503 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, in soc_tplg_dapm_widget_elems_load() argument
1509 if (tplg->pass != SOC_TPLG_PASS_WIDGET) in soc_tplg_dapm_widget_elems_load()
1512 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count); in soc_tplg_dapm_widget_elems_load()
1515 widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; in soc_tplg_dapm_widget_elems_load()
1516 ret = soc_tplg_dapm_widget_create(tplg, widget); in soc_tplg_dapm_widget_elems_load()
1518 dev_err(tplg->dev, "ASoC: failed to load widget %s\n", in soc_tplg_dapm_widget_elems_load()
1525 static int soc_tplg_dapm_complete(struct soc_tplg *tplg) in soc_tplg_dapm_complete() argument
1527 struct snd_soc_card *card = tplg->comp->card; in soc_tplg_dapm_complete()
1534 dev_warn(tplg->dev, "ASoC: Parent card not yet available," in soc_tplg_dapm_complete()
1541 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n", in soc_tplg_dapm_complete()
1547 static int soc_tplg_pcm_dai_elems_load(struct soc_tplg *tplg, in soc_tplg_pcm_dai_elems_load() argument
1555 if (tplg->pass != SOC_TPLG_PASS_PCM_DAI) in soc_tplg_pcm_dai_elems_load()
1558 pcm_dai = (struct snd_soc_tplg_pcm_dai *)tplg->pos; in soc_tplg_pcm_dai_elems_load()
1560 if (soc_tplg_check_elem_count(tplg, in soc_tplg_pcm_dai_elems_load()
1563 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", in soc_tplg_pcm_dai_elems_load()
1568 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count); in soc_tplg_pcm_dai_elems_load()
1569 tplg->pos += sizeof(struct snd_soc_tplg_pcm) * count; in soc_tplg_pcm_dai_elems_load()
1576 ret = soc_tplg_pcm_dai_load(tplg, pcm_dai, count); in soc_tplg_pcm_dai_elems_load()
1578 dev_err(tplg->comp->dev, "ASoC: PCM DAI loading failed\n"); in soc_tplg_pcm_dai_elems_load()
1585 dobj->ops = tplg->ops; in soc_tplg_pcm_dai_elems_load()
1586 dobj->index = tplg->index; in soc_tplg_pcm_dai_elems_load()
1587 list_add(&dobj->list, &tplg->comp->dobj_list); in soc_tplg_pcm_dai_elems_load()
1595 static int soc_tplg_manifest_load(struct soc_tplg *tplg, in soc_tplg_manifest_load() argument
1600 if (tplg->pass != SOC_TPLG_PASS_MANIFEST) in soc_tplg_manifest_load()
1603 manifest = (struct snd_soc_tplg_manifest *)tplg->pos; in soc_tplg_manifest_load()
1604 tplg->pos += sizeof(struct snd_soc_tplg_manifest); in soc_tplg_manifest_load()
1606 if (tplg->comp && tplg->ops && tplg->ops->manifest) in soc_tplg_manifest_load()
1607 return tplg->ops->manifest(tplg->comp, manifest); in soc_tplg_manifest_load()
1609 dev_err(tplg->dev, "ASoC: Firmware manifest not supported\n"); in soc_tplg_manifest_load()
1614 static int soc_valid_header(struct soc_tplg *tplg, in soc_valid_header() argument
1617 if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) in soc_valid_header()
1622 dev_err(tplg->dev, in soc_valid_header()
1624 tplg->pass, hdr->magic, in soc_valid_header()
1625 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
1630 dev_err(tplg->dev, in soc_valid_header()
1632 tplg->pass, hdr->magic, in soc_valid_header()
1633 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); in soc_valid_header()
1638 dev_err(tplg->dev, in soc_valid_header()
1640 tplg->pass, hdr->abi, in soc_valid_header()
1641 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg), in soc_valid_header()
1642 tplg->fw->size); in soc_valid_header()
1647 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n", in soc_valid_header()
1648 soc_tplg_get_hdr_offset(tplg)); in soc_valid_header()
1652 if (tplg->pass == hdr->type) in soc_valid_header()
1653 dev_dbg(tplg->dev, in soc_valid_header()
1656 hdr->vendor_type, tplg->pass); in soc_valid_header()
1662 static int soc_tplg_load_header(struct soc_tplg *tplg, in soc_tplg_load_header() argument
1665 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); in soc_tplg_load_header()
1668 if (hdr->index != tplg->req_index && in soc_tplg_load_header()
1672 tplg->index = hdr->index; in soc_tplg_load_header()
1678 return soc_tplg_kcontrol_elems_load(tplg, hdr); in soc_tplg_load_header()
1680 return soc_tplg_dapm_graph_elems_load(tplg, hdr); in soc_tplg_load_header()
1682 return soc_tplg_dapm_widget_elems_load(tplg, hdr); in soc_tplg_load_header()
1686 return soc_tplg_pcm_dai_elems_load(tplg, hdr); in soc_tplg_load_header()
1688 return soc_tplg_manifest_load(tplg, hdr); in soc_tplg_load_header()
1691 return soc_tplg_vendor_load(tplg, hdr); in soc_tplg_load_header()
1698 static int soc_tplg_process_headers(struct soc_tplg *tplg) in soc_tplg_process_headers() argument
1703 tplg->pass = SOC_TPLG_PASS_START; in soc_tplg_process_headers()
1706 while (tplg->pass <= SOC_TPLG_PASS_END) { in soc_tplg_process_headers()
1708 tplg->hdr_pos = tplg->fw->data; in soc_tplg_process_headers()
1709 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
1711 while (!soc_tplg_is_eof(tplg)) { in soc_tplg_process_headers()
1714 ret = soc_valid_header(tplg, hdr); in soc_tplg_process_headers()
1721 ret = soc_tplg_load_header(tplg, hdr); in soc_tplg_process_headers()
1726 tplg->hdr_pos += hdr->payload_size + in soc_tplg_process_headers()
1728 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; in soc_tplg_process_headers()
1732 tplg->pass++; in soc_tplg_process_headers()
1736 ret = soc_tplg_dapm_complete(tplg); in soc_tplg_process_headers()
1738 dev_err(tplg->dev, in soc_tplg_process_headers()
1744 static int soc_tplg_load(struct soc_tplg *tplg) in soc_tplg_load() argument
1748 ret = soc_tplg_process_headers(tplg); in soc_tplg_load()
1750 soc_tplg_complete(tplg); in soc_tplg_load()
1759 struct soc_tplg tplg; in snd_soc_tplg_component_load() local
1762 memset(&tplg, 0, sizeof(tplg)); in snd_soc_tplg_component_load()
1763 tplg.fw = fw; in snd_soc_tplg_component_load()
1764 tplg.dev = comp->dev; in snd_soc_tplg_component_load()
1765 tplg.comp = comp; in snd_soc_tplg_component_load()
1766 tplg.ops = ops; in snd_soc_tplg_component_load()
1767 tplg.req_index = id; in snd_soc_tplg_component_load()
1768 tplg.io_ops = ops->io_ops; in snd_soc_tplg_component_load()
1769 tplg.io_ops_count = ops->io_ops_count; in snd_soc_tplg_component_load()
1770 tplg.bytes_ext_ops = ops->bytes_ext_ops; in snd_soc_tplg_component_load()
1771 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; in snd_soc_tplg_component_load()
1773 return soc_tplg_load(&tplg); in snd_soc_tplg_component_load()