Lines Matching defs:tplg

80 static int soc_tplg_check_elem_count(struct soc_tplg *tplg, size_t elem_size,
83 const u8 *end = tplg->pos + elem_size * count;
85 if (end > tplg->fw->data + tplg->fw->size) {
86 dev_err(tplg->dev, "ASoC: %s overflow end of data\n",
94 dev_err(tplg->dev,
103 static inline bool soc_tplg_is_eof(struct soc_tplg *tplg)
105 const u8 *end = tplg->hdr_pos;
107 if (end >= tplg->fw->data + tplg->fw->size)
112 static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg *tplg)
114 return (unsigned long)(tplg->hdr_pos - tplg->fw->data);
117 static inline unsigned long soc_tplg_get_offset(struct soc_tplg *tplg)
119 return (unsigned long)(tplg->pos - tplg->fw->data);
185 static int tplg_chan_get_reg(struct soc_tplg *tplg,
198 static int tplg_chan_get_shift(struct soc_tplg *tplg,
223 static inline void soc_bind_err(struct soc_tplg *tplg,
226 dev_err(tplg->dev,
229 soc_tplg_get_offset(tplg));
232 static inline void soc_control_err(struct soc_tplg *tplg,
235 dev_err(tplg->dev,
238 soc_tplg_get_offset(tplg));
242 static int soc_tplg_vendor_load(struct soc_tplg *tplg,
247 if (tplg->ops && tplg->ops->vendor_load)
248 ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr);
250 dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n",
256 dev_err(tplg->dev,
258 soc_tplg_get_hdr_offset(tplg),
259 soc_tplg_get_hdr_offset(tplg),
266 static int soc_tplg_widget_load(struct soc_tplg *tplg,
269 if (tplg->ops && tplg->ops->widget_load)
270 return tplg->ops->widget_load(tplg->comp, tplg->index, w,
278 static int soc_tplg_widget_ready(struct soc_tplg *tplg,
281 if (tplg->ops && tplg->ops->widget_ready)
282 return tplg->ops->widget_ready(tplg->comp, tplg->index, w,
289 static int soc_tplg_dai_load(struct soc_tplg *tplg,
293 if (tplg->ops && tplg->ops->dai_load)
294 return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv,
301 static int soc_tplg_dai_link_load(struct soc_tplg *tplg,
304 if (tplg->ops && tplg->ops->link_load)
305 return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg);
311 static int soc_tplg_complete(struct soc_tplg *tplg)
313 if (tplg->ops && tplg->ops->complete)
314 return tplg->ops->complete(tplg->comp);
344 static int soc_tplg_add_kcontrol(struct soc_tplg *tplg,
347 struct snd_soc_component *comp = tplg->comp;
350 tplg->dev, k, comp->name_prefix, comp, kcontrol);
471 const struct soc_tplg *tplg)
505 ext_ops = tplg->bytes_ext_ops;
506 num_ops = tplg->bytes_ext_ops_count;
524 ops = tplg->io_ops;
525 num_ops = tplg->io_ops_count;
585 static int soc_tplg_control_load(struct soc_tplg *tplg,
590 if (tplg->ops && tplg->ops->control_load)
591 ret = tplg->ops->control_load(tplg->comp, tplg->index, k, hdr);
594 dev_err(tplg->dev, "ASoC: failed to init %s\n", hdr->name);
600 static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg,
606 p = devm_kzalloc(tplg->dev, item_len + 2 * sizeof(unsigned int), GFP_KERNEL);
620 static int soc_tplg_create_tlv(struct soc_tplg *tplg,
633 return soc_tplg_create_tlv_db_scale(tplg, kc,
638 dev_dbg(tplg->dev, "Unsupported TLV type %d\n",
647 static int soc_tplg_dbytes_create(struct soc_tplg *tplg, size_t size)
654 if (soc_tplg_check_elem_count(tplg,
659 be = (struct snd_soc_tplg_bytes_control *)tplg->pos;
666 sbe = devm_kzalloc(tplg->dev, sizeof(*sbe), GFP_KERNEL);
670 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) +
673 dev_dbg(tplg->dev,
685 if (tplg->ops)
686 sbe->dobj.unload = tplg->ops->control_unload;
690 ret = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg);
692 soc_control_err(tplg, &be->hdr, be->hdr.name);
697 ret = soc_tplg_control_load(tplg, &kc, &be->hdr);
702 ret = soc_tplg_add_kcontrol(tplg, &kc, &sbe->dobj.control.kcontrol);
706 list_add(&sbe->dobj.list, &tplg->comp->dobj_list);
712 static int soc_tplg_dmixer_create(struct soc_tplg *tplg, size_t size)
719 if (soc_tplg_check_elem_count(tplg,
724 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos;
731 sm = devm_kzalloc(tplg->dev, sizeof(*sm), GFP_KERNEL);
734 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) +
737 dev_dbg(tplg->dev,
748 sm->reg = tplg_chan_get_reg(tplg, mc->channel, SNDRV_CHMAP_FL);
749 sm->rreg = tplg_chan_get_reg(tplg, mc->channel, SNDRV_CHMAP_FR);
750 sm->shift = tplg_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FL);
751 sm->rshift = tplg_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FR);
757 sm->dobj.index = tplg->index;
759 if (tplg->ops)
760 sm->dobj.unload = tplg->ops->control_unload;
764 ret = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg);
766 soc_control_err(tplg, &mc->hdr, mc->hdr.name);
771 ret = soc_tplg_create_tlv(tplg, &kc, &mc->hdr);
773 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n", mc->hdr.name);
778 ret = soc_tplg_control_load(tplg, &kc, &mc->hdr);
783 ret = soc_tplg_add_kcontrol(tplg, &kc, &sm->dobj.control.kcontrol);
787 list_add(&sm->dobj.list, &tplg->comp->dobj_list);
793 static int soc_tplg_denum_create_texts(struct soc_tplg *tplg, struct soc_enum *se,
802 devm_kcalloc(tplg->dev, le32_to_cpu(ec->items), sizeof(char *), GFP_KERNEL);
814 se->dobj.control.dtexts[i] = devm_kstrdup(tplg->dev, ec->texts[i], GFP_KERNEL);
829 static int soc_tplg_denum_create_values(struct soc_tplg *tplg, struct soc_enum *se,
843 se->dobj.control.dvalues = devm_kcalloc(tplg->dev, le32_to_cpu(ec->items),
857 static int soc_tplg_denum_create(struct soc_tplg *tplg, size_t size)
864 if (soc_tplg_check_elem_count(tplg,
869 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
876 se = devm_kzalloc(tplg->dev, (sizeof(*se)), GFP_KERNEL);
880 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
883 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n",
892 se->reg = tplg_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL);
893 se->shift_l = tplg_chan_get_shift(tplg, ec->channel,
895 se->shift_r = tplg_chan_get_shift(tplg, ec->channel,
899 se->dobj.index = tplg->index;
901 if (tplg->ops)
902 se->dobj.unload = tplg->ops->control_unload;
908 ret = soc_tplg_denum_create_values(tplg, se, ec);
910 dev_err(tplg->dev,
919 ret = soc_tplg_denum_create_texts(tplg, se, ec);
921 dev_err(tplg->dev,
929 dev_err(tplg->dev,
936 ret = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg);
938 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
943 ret = soc_tplg_control_load(tplg, &kc, &ec->hdr);
948 ret = soc_tplg_add_kcontrol(tplg, &kc, &se->dobj.control.kcontrol);
952 list_add(&se->dobj.list, &tplg->comp->dobj_list);
958 static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg,
964 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count,
965 soc_tplg_get_offset(tplg));
968 struct snd_soc_tplg_ctl_hdr *control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
971 dev_err(tplg->dev, "ASoC: invalid control size\n");
983 ret = soc_tplg_dmixer_create(tplg, le32_to_cpu(hdr->payload_size));
990 ret = soc_tplg_denum_create(tplg, le32_to_cpu(hdr->payload_size));
993 ret = soc_tplg_dbytes_create(tplg, le32_to_cpu(hdr->payload_size));
996 soc_bind_err(tplg, control_hdr, i);
1000 dev_err(tplg->dev, "ASoC: invalid control\n");
1010 static int soc_tplg_add_route(struct soc_tplg *tplg,
1013 if (tplg->ops && tplg->ops->dapm_route_load)
1014 return tplg->ops->dapm_route_load(tplg->comp, tplg->index,
1020 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
1023 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
1031 if (soc_tplg_check_elem_count(tplg,
1036 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count,
1040 route = devm_kzalloc(tplg->dev, sizeof(*route), GFP_KERNEL);
1043 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos;
1044 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem);
1066 /* set to NULL atm for tplg users */
1075 if (tplg->ops)
1076 route->dobj.unload = tplg->ops->dapm_route_unload;
1077 route->dobj.index = tplg->index;
1078 list_add(&route->dobj.list, &tplg->comp->dobj_list);
1080 ret = soc_tplg_add_route(tplg, route);
1082 dev_err(tplg->dev, "ASoC: topology: add_route failed: %d\n", ret);
1093 static int soc_tplg_dapm_widget_dmixer_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc)
1099 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos;
1106 sm = devm_kzalloc(tplg->dev, sizeof(*sm), GFP_KERNEL);
1110 tplg->pos += sizeof(struct snd_soc_tplg_mixer_control) +
1113 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s\n",
1117 kc->name = devm_kstrdup(tplg->dev, mc->hdr.name, GFP_KERNEL);
1124 sm->reg = tplg_chan_get_reg(tplg, mc->channel,
1126 sm->rreg = tplg_chan_get_reg(tplg, mc->channel,
1128 sm->shift = tplg_chan_get_shift(tplg, mc->channel,
1130 sm->rshift = tplg_chan_get_shift(tplg, mc->channel,
1137 sm->dobj.index = tplg->index;
1141 err = soc_tplg_kcontrol_bind_io(&mc->hdr, kc, tplg);
1143 soc_control_err(tplg, &mc->hdr, mc->hdr.name);
1148 err = soc_tplg_create_tlv(tplg, kc, &mc->hdr);
1150 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n",
1156 err = soc_tplg_control_load(tplg, kc, &mc->hdr);
1163 static int soc_tplg_dapm_widget_denum_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc)
1169 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
1175 se = devm_kzalloc(tplg->dev, sizeof(*se), GFP_KERNEL);
1179 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
1182 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n",
1186 kc->name = devm_kstrdup(tplg->dev, ec->hdr.name, GFP_KERNEL);
1193 se->reg = tplg_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL);
1194 se->shift_l = tplg_chan_get_shift(tplg, ec->channel,
1196 se->shift_r = tplg_chan_get_shift(tplg, ec->channel,
1201 se->dobj.index = tplg->index;
1206 err = soc_tplg_denum_create_values(tplg, se, ec);
1208 dev_err(tplg->dev, "ASoC: could not create values for %s\n",
1216 err = soc_tplg_denum_create_texts(tplg, se, ec);
1218 dev_err(tplg->dev, "ASoC: could not create texts for %s\n",
1224 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n",
1230 err = soc_tplg_kcontrol_bind_io(&ec->hdr, kc, tplg);
1232 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
1237 err = soc_tplg_control_load(tplg, kc, &ec->hdr);
1244 static int soc_tplg_dapm_widget_dbytes_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc)
1250 be = (struct snd_soc_tplg_bytes_control *)tplg->pos;
1257 sbe = devm_kzalloc(tplg->dev, sizeof(*sbe), GFP_KERNEL);
1261 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) +
1264 dev_dbg(tplg->dev,
1269 kc->name = devm_kstrdup(tplg->dev, be->hdr.name, GFP_KERNEL);
1279 err = soc_tplg_kcontrol_bind_io(&be->hdr, kc, tplg);
1281 soc_control_err(tplg, &be->hdr, be->hdr.name);
1286 err = soc_tplg_control_load(tplg, kc, &be->hdr);
1293 static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1296 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
1299 struct snd_soc_card *card = tplg->comp->card;
1315 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n",
1342 template.dobj.index = tplg->index;
1344 tplg->pos +=
1354 kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL);
1360 kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int),
1368 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
1380 ret = soc_tplg_dapm_widget_dmixer_create(tplg, &kc[i]);
1393 ret = soc_tplg_dapm_widget_denum_create(tplg, &kc[i]);
1402 ret = soc_tplg_dapm_widget_dbytes_create(tplg, &kc[i]);
1407 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n",
1416 dev_dbg(tplg->dev, "ASoC: template %s with %d/%d/%d (mixer/enum/bytes) control\n",
1420 ret = soc_tplg_widget_load(tplg, &template, w);
1437 if (tplg->ops)
1438 widget->dobj.unload = tplg->ops->widget_unload;
1439 widget->dobj.index = tplg->index;
1440 list_add(&widget->dobj.list, &tplg->comp->dobj_list);
1442 ret = soc_tplg_widget_ready(tplg, widget, w);
1461 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg,
1468 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count);
1471 struct snd_soc_tplg_dapm_widget *widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos;
1479 if (soc_tplg_get_offset(tplg) + sizeof(*widget) >= tplg->fw->size) {
1480 dev_err(tplg->dev, "ASoC: invalid widget data size\n");
1486 dev_err(tplg->dev, "ASoC: invalid widget size\n");
1491 if (soc_tplg_get_offset(tplg) + le32_to_cpu(widget->priv.size) >= tplg->fw->size) {
1492 dev_err(tplg->dev, "ASoC: invalid widget private data size\n");
1496 ret = soc_tplg_dapm_widget_create(tplg, widget);
1498 dev_err(tplg->dev, "ASoC: failed to load widget %s\n",
1507 static int soc_tplg_dapm_complete(struct soc_tplg *tplg)
1509 struct snd_soc_card *card = tplg->comp->card;
1516 dev_warn(tplg->dev, "ASoC: Parent card not yet available, widget card binding deferred\n");
1522 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n", ret);
1527 static int set_stream_info(struct soc_tplg *tplg, struct snd_soc_pcm_stream *stream,
1530 stream->stream_name = devm_kstrdup(tplg->dev, caps->name, GFP_KERNEL);
1567 static int soc_tplg_dai_create(struct soc_tplg *tplg,
1575 snd_soc_component_get_dapm(tplg->comp);
1578 dai_drv = devm_kzalloc(tplg->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL);
1583 dai_drv->name = devm_kstrdup(tplg->dev, pcm->dai_name, GFP_KERNEL);
1594 ret = set_stream_info(tplg, stream, caps);
1602 ret = set_stream_info(tplg, stream, caps);
1611 ret = soc_tplg_dai_load(tplg, dai_drv, pcm, NULL);
1613 dev_err(tplg->dev, "ASoC: DAI loading failed\n");
1617 dai_drv->dobj.index = tplg->index;
1619 if (tplg->ops)
1620 dai_drv->dobj.unload = tplg->ops->dai_unload;
1621 list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list);
1624 dai = snd_soc_register_dai(tplg->comp, dai_drv, false);
1666 static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
1674 link = devm_kzalloc(tplg->dev, sizeof(*link) + (3 * sizeof(*dlc)), GFP_KERNEL);
1683 link->dobj.index = tplg->index;
1685 if (tplg->ops)
1686 link->dobj.unload = tplg->ops->link_unload;
1689 link->name = devm_kstrdup(tplg->dev, pcm->pcm_name, GFP_KERNEL);
1690 link->stream_name = devm_kstrdup(tplg->dev, pcm->pcm_name, GFP_KERNEL);
1699 link->cpus->dai_name = devm_kstrdup(tplg->dev, pcm->dai_name, GFP_KERNEL);
1731 ret = soc_tplg_dai_link_load(tplg, link, NULL);
1733 dev_err(tplg->dev, "ASoC: FE link loading failed\n");
1737 ret = snd_soc_add_pcm_runtimes(tplg->comp->card, link, 1);
1740 dev_err(tplg->dev, "ASoC: adding FE link failed\n");
1744 list_add(&link->dobj.list, &tplg->comp->dobj_list);
1752 static int soc_tplg_pcm_create(struct soc_tplg *tplg,
1757 ret = soc_tplg_dai_create(tplg, pcm);
1761 return soc_tplg_fe_link_create(tplg, pcm);
1786 * @tplg: topology context
1792 static int pcm_new_ver(struct soc_tplg *tplg,
1803 dev_err(tplg->dev, "ASoC: invalid PCM size\n");
1807 dev_warn(tplg->dev, "ASoC: old version of PCM\n");
1833 static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
1846 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
1850 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n",
1855 if (soc_tplg_check_elem_count(tplg,
1862 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
1873 ret = pcm_new_ver(tplg, pcm, &_pcm);
1879 ret = soc_tplg_pcm_create(tplg, _pcm);
1889 tplg->pos += size + le32_to_cpu(_pcm->priv.size);
1895 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
1971 * @tplg: topology context
1977 static int link_new_ver(struct soc_tplg *tplg,
1989 dev_err(tplg->dev, "ASoC: invalid physical link config size\n");
1993 dev_warn(tplg->dev, "ASoC: old version of physical link config\n");
2052 static int soc_tplg_link_config(struct soc_tplg *tplg,
2076 link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id),
2079 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n",
2095 ret = soc_tplg_dai_link_load(tplg, link, cfg);
2097 dev_err(tplg->dev, "ASoC: physical link loading failed\n");
2102 link->dobj.index = tplg->index;
2104 if (tplg->ops)
2105 link->dobj.unload = tplg->ops->link_unload;
2106 list_add(&link->dobj.list, &tplg->comp->dobj_list);
2113 static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
2125 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2129 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n",
2134 if (soc_tplg_check_elem_count(tplg, size, count,
2141 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2148 ret = link_new_ver(tplg, link, &_link);
2153 ret = soc_tplg_link_config(tplg, _link);
2163 tplg->pos += size + le32_to_cpu(_link->priv.size);
2174 * @tplg: topology context
2180 static int soc_tplg_dai_config(struct soc_tplg *tplg,
2195 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n",
2201 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n",
2213 ret = set_stream_info(tplg, stream, caps);
2221 ret = set_stream_info(tplg, stream, caps);
2232 ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai);
2234 dev_err(tplg->dev, "ASoC: DAI loading failed\n");
2245 static int soc_tplg_dai_elems_load(struct soc_tplg *tplg,
2255 struct snd_soc_tplg_dai *dai = (struct snd_soc_tplg_dai *)tplg->pos;
2259 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n");
2263 ret = soc_tplg_dai_config(tplg, dai);
2265 dev_err(tplg->dev, "ASoC: failed to configure DAI\n");
2269 tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size));
2272 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count);
2279 * @tplg: topology context
2285 static int manifest_new_ver(struct soc_tplg *tplg,
2297 dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
2304 dev_warn(tplg->dev, "ASoC: old version of manifest\n");
2327 static int soc_tplg_manifest_load(struct soc_tplg *tplg,
2334 manifest = (struct snd_soc_tplg_manifest *)tplg->pos;
2343 ret = manifest_new_ver(tplg, manifest, &_manifest);
2349 if (tplg->ops && tplg->ops->manifest)
2350 ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest);
2359 static int soc_tplg_valid_header(struct soc_tplg *tplg,
2363 dev_err(tplg->dev,
2365 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg),
2366 tplg->fw->size);
2370 if (soc_tplg_get_hdr_offset(tplg) + le32_to_cpu(hdr->payload_size) >= tplg->fw->size) {
2371 dev_err(tplg->dev,
2373 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg),
2380 dev_err(tplg->dev,
2382 tplg->pass, hdr->magic,
2383 soc_tplg_get_hdr_offset(tplg), tplg->fw->size);
2388 dev_err(tplg->dev,
2390 tplg->pass, hdr->magic,
2391 soc_tplg_get_hdr_offset(tplg), tplg->fw->size);
2398 dev_err(tplg->dev,
2400 tplg->pass, hdr->abi,
2401 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg),
2402 tplg->fw->size);
2407 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n",
2408 soc_tplg_get_hdr_offset(tplg));
2416 static int soc_tplg_load_header(struct soc_tplg *tplg,
2419 int (*elem_load)(struct soc_tplg *tplg,
2423 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr);
2425 tplg->index = le32_to_cpu(hdr->index);
2467 if (tplg->pass == hdr_pass) {
2468 dev_dbg(tplg->dev,
2471 hdr->vendor_type, tplg->pass);
2472 return elem_load(tplg, hdr);
2479 static int soc_tplg_process_headers(struct soc_tplg *tplg)
2484 for (tplg->pass = SOC_TPLG_PASS_START; tplg->pass <= SOC_TPLG_PASS_END; tplg->pass++) {
2487 tplg->hdr_pos = tplg->fw->data;
2488 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos;
2490 while (!soc_tplg_is_eof(tplg)) {
2493 ret = soc_tplg_valid_header(tplg, hdr);
2498 ret = soc_tplg_load_header(tplg, hdr);
2501 dev_err(tplg->dev,
2509 tplg->hdr_pos += le32_to_cpu(hdr->payload_size) +
2511 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos;
2517 ret = soc_tplg_dapm_complete(tplg);
2522 static int soc_tplg_load(struct soc_tplg *tplg)
2526 ret = soc_tplg_process_headers(tplg);
2528 return soc_tplg_complete(tplg);
2537 struct soc_tplg tplg;
2551 memset(&tplg, 0, sizeof(tplg));
2552 tplg.fw = fw;
2553 tplg.dev = comp->card->dev;
2554 tplg.comp = comp;
2556 tplg.ops = ops;
2557 tplg.io_ops = ops->io_ops;
2558 tplg.io_ops_count = ops->io_ops_count;
2559 tplg.bytes_ext_ops = ops->bytes_ext_ops;
2560 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count;
2563 ret = soc_tplg_load(&tplg);