Loading sound/soc/soc-topology.c +170 −121 Original line number Diff line number Diff line Loading @@ -197,8 +197,8 @@ static int tplc_chan_get_reg(struct soc_tplg *tplg, int i; for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { if (chan[i].id == map) return chan[i].reg; if (le32_to_cpu(chan[i].id) == map) return le32_to_cpu(chan[i].reg); } return -EINVAL; Loading @@ -210,8 +210,8 @@ static int tplc_chan_get_shift(struct soc_tplg *tplg, int i; for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { if (chan[i].id == map) return chan[i].shift; if (le32_to_cpu(chan[i].id) == map) return le32_to_cpu(chan[i].shift); } return -EINVAL; Loading Loading @@ -592,7 +592,7 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, const struct snd_soc_tplg_bytes_ext_ops *ext_ops; int num_ops, i; if (hdr->ops.info == SND_SOC_TPLG_CTL_BYTES if (le32_to_cpu(hdr->ops.info) == SND_SOC_TPLG_CTL_BYTES && k->iface & SNDRV_CTL_ELEM_IFACE_MIXER && k->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE && k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { Loading Loading @@ -708,9 +708,9 @@ static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, p[0] = SNDRV_CTL_TLVT_DB_SCALE; p[1] = item_len; p[2] = scale->min; p[3] = (scale->step & TLV_DB_SCALE_MASK) | (scale->mute ? TLV_DB_SCALE_MUTE : 0); p[2] = le32_to_cpu(scale->min); p[3] = (le32_to_cpu(scale->step) & TLV_DB_SCALE_MASK) | (le32_to_cpu(scale->mute) ? TLV_DB_SCALE_MUTE : 0); kc->tlv.p = (void *)p; return 0; Loading @@ -720,13 +720,14 @@ static int soc_tplg_create_tlv(struct soc_tplg *tplg, struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_hdr *tc) { struct snd_soc_tplg_ctl_tlv *tplg_tlv; u32 access = le32_to_cpu(tc->access); if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) return 0; if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK)) { if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK)) { tplg_tlv = &tc->tlv; switch (tplg_tlv->type) { switch (le32_to_cpu(tplg_tlv->type)) { case SNDRV_CTL_TLVT_DB_SCALE: return soc_tplg_create_tlv_db_scale(tplg, kc, &tplg_tlv->scale); Loading Loading @@ -777,7 +778,7 @@ static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + be->priv.size); le32_to_cpu(be->priv.size)); dev_dbg(tplg->dev, "ASoC: adding bytes kcontrol %s with access 0x%x\n", Loading @@ -787,9 +788,9 @@ static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, kc.name = be->hdr.name; kc.private_value = (long)sbe; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = be->hdr.access; kc.access = le32_to_cpu(be->hdr.access); sbe->max = be->max; sbe->max = le32_to_cpu(be->max); sbe->dobj.type = SND_SOC_DOBJ_BYTES; sbe->dobj.ops = tplg->ops; INIT_LIST_HEAD(&sbe->dobj.list); Loading Loading @@ -857,7 +858,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, if (sm == NULL) return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + mc->priv.size); le32_to_cpu(mc->priv.size)); dev_dbg(tplg->dev, "ASoC: adding mixer kcontrol %s with access 0x%x\n", Loading @@ -867,7 +868,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, kc.name = mc->hdr.name; kc.private_value = (long)sm; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = mc->hdr.access; kc.access = le32_to_cpu(mc->hdr.access); /* we only support FL/FR channel mapping atm */ sm->reg = tplc_chan_get_reg(tplg, mc->channel, Loading @@ -879,10 +880,10 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, sm->rshift = tplc_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FR); sm->max = mc->max; sm->min = mc->min; sm->invert = mc->invert; sm->platform_max = mc->platform_max; sm->max = le32_to_cpu(mc->max); sm->min = le32_to_cpu(mc->min); sm->invert = le32_to_cpu(mc->invert); sm->platform_max = le32_to_cpu(mc->platform_max); sm->dobj.index = tplg->index; sm->dobj.ops = tplg->ops; sm->dobj.type = SND_SOC_DOBJ_MIXER; Loading Loading @@ -933,7 +934,7 @@ static int soc_tplg_denum_create_texts(struct soc_enum *se, int i, ret; se->dobj.control.dtexts = kcalloc(ec->items, sizeof(char *), GFP_KERNEL); kcalloc(le32_to_cpu(ec->items), sizeof(char *), GFP_KERNEL); if (se->dobj.control.dtexts == NULL) return -ENOMEM; Loading Loading @@ -965,15 +966,22 @@ static int soc_tplg_denum_create_texts(struct soc_enum *se, static int soc_tplg_denum_create_values(struct soc_enum *se, struct snd_soc_tplg_enum_control *ec) { if (ec->items > sizeof(*ec->values)) int i; if (le32_to_cpu(ec->items) > sizeof(*ec->values)) return -EINVAL; se->dobj.control.dvalues = kmemdup(ec->values, ec->items * sizeof(u32), se->dobj.control.dvalues = kzalloc(le32_to_cpu(ec->items) * sizeof(u32), GFP_KERNEL); if (!se->dobj.control.dvalues) return -ENOMEM; /* convert from little-endian */ for (i = 0; i < le32_to_cpu(ec->items); i++) { se->dobj.control.dvalues[i] = le32_to_cpu(ec->values[i]); } return 0; } Loading Loading @@ -1007,7 +1015,7 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + ec->priv.size); le32_to_cpu(ec->priv.size)); dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", ec->hdr.name, ec->items); Loading @@ -1016,7 +1024,7 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, kc.name = ec->hdr.name; kc.private_value = (long)se; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = ec->hdr.access; kc.access = le32_to_cpu(ec->hdr.access); se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); se->shift_l = tplc_chan_get_shift(tplg, ec->channel, Loading @@ -1024,14 +1032,14 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, se->shift_r = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FL); se->items = ec->items; se->mask = ec->mask; se->items = le32_to_cpu(ec->items); se->mask = le32_to_cpu(ec->mask); se->dobj.index = tplg->index; se->dobj.type = SND_SOC_DOBJ_ENUM; se->dobj.ops = tplg->ops; INIT_LIST_HEAD(&se->dobj.list); switch (ec->hdr.ops.info) { switch (le32_to_cpu(ec->hdr.ops.info)) { case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: case SND_SOC_TPLG_CTL_ENUM_VALUE: err = soc_tplg_denum_create_values(se, ec); Loading Loading @@ -1104,23 +1112,24 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, int i; if (tplg->pass != SOC_TPLG_PASS_MIXER) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; } dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, soc_tplg_get_offset(tplg)); for (i = 0; i < hdr->count; i++) { for (i = 0; i < le32_to_cpu(hdr->count); i++) { control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; if (control_hdr->size != sizeof(*control_hdr)) { if (le32_to_cpu(control_hdr->size) != sizeof(*control_hdr)) { dev_err(tplg->dev, "ASoC: invalid control size\n"); return -EINVAL; } switch (control_hdr->ops.info) { switch (le32_to_cpu(control_hdr->ops.info)) { case SND_SOC_TPLG_CTL_VOLSW: case SND_SOC_TPLG_CTL_STROBE: case SND_SOC_TPLG_CTL_VOLSW_SX: Loading @@ -1128,17 +1137,20 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, case SND_SOC_TPLG_CTL_RANGE: case SND_SOC_TPLG_DAPM_CTL_VOLSW: case SND_SOC_TPLG_DAPM_CTL_PIN: soc_tplg_dmixer_create(tplg, 1, hdr->payload_size); soc_tplg_dmixer_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; case SND_SOC_TPLG_CTL_ENUM: case SND_SOC_TPLG_CTL_ENUM_VALUE: case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: soc_tplg_denum_create(tplg, 1, hdr->payload_size); soc_tplg_denum_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; case SND_SOC_TPLG_CTL_BYTES: soc_tplg_dbytes_create(tplg, 1, hdr->payload_size); soc_tplg_dbytes_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; default: soc_bind_err(tplg, control_hdr, i); Loading Loading @@ -1166,17 +1178,22 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; struct snd_soc_tplg_dapm_graph_elem *elem; struct snd_soc_dapm_route **routes; int count = hdr->count, i, j; int count, i, j; int ret = 0; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_GRAPH) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; } if (soc_tplg_check_elem_count(tplg, sizeof(struct snd_soc_tplg_dapm_graph_elem), count, hdr->payload_size, "graph")) { count, le32_to_cpu(hdr->payload_size), "graph")) { dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n", count); Loading Loading @@ -1291,7 +1308,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create( goto err_str; tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + mc->priv.size); le32_to_cpu(mc->priv.size)); dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", mc->hdr.name, i); Loading Loading @@ -1404,7 +1421,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create( se->mask = ec->mask; se->dobj.index = tplg->index; switch (ec->hdr.ops.info) { switch (le32_to_cpu(ec->hdr.ops.info)) { case SND_SOC_TPLG_CTL_ENUM_VALUE: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: err = soc_tplg_denum_create_values(se, ec); Loading Loading @@ -1495,7 +1512,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create( goto err; tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + be->priv.size); le32_to_cpu(be->priv.size)); dev_dbg(tplg->dev, "ASoC: adding bytes kcontrol %s with access 0x%x\n", Loading Loading @@ -1567,7 +1584,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, memset(&template, 0, sizeof(template)); /* map user to kernel widget ID */ template.id = get_widget_id(w->id); template.id = get_widget_id(le32_to_cpu(w->id)); if (template.id < 0) return template.id; Loading @@ -1580,18 +1597,20 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, ret = -ENOMEM; goto err; } template.reg = w->reg; template.shift = w->shift; template.mask = w->mask; template.subseq = w->subseq; template.reg = le32_to_cpu(w->reg); template.shift = le32_to_cpu(w->shift); template.mask = le32_to_cpu(w->mask); template.subseq = le32_to_cpu(w->subseq); template.on_val = w->invert ? 0 : 1; template.off_val = w->invert ? 1 : 0; template.ignore_suspend = w->ignore_suspend; template.event_flags = w->event_flags; template.ignore_suspend = le32_to_cpu(w->ignore_suspend); template.event_flags = le16_to_cpu(w->event_flags); template.dobj.index = tplg->index; tplg->pos += (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size); (sizeof(struct snd_soc_tplg_dapm_widget) + le32_to_cpu(w->priv.size)); if (w->num_kcontrols == 0) { kcontrol_type = 0; template.num_kcontrols = 0; Loading @@ -1602,7 +1621,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n", w->name, w->num_kcontrols, control_hdr->type); switch (control_hdr->ops.info) { switch (le32_to_cpu(control_hdr->ops.info)) { case SND_SOC_TPLG_CTL_VOLSW: case SND_SOC_TPLG_CTL_STROBE: case SND_SOC_TPLG_CTL_VOLSW_SX: Loading @@ -1610,7 +1629,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, case SND_SOC_TPLG_CTL_RANGE: case SND_SOC_TPLG_DAPM_CTL_VOLSW: kcontrol_type = SND_SOC_TPLG_TYPE_MIXER; /* volume mixer */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_dmixer_create(tplg, template.num_kcontrols); Loading @@ -1625,7 +1644,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: kcontrol_type = SND_SOC_TPLG_TYPE_ENUM; /* enumerated mixer */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_denum_create(tplg, template.num_kcontrols); Loading @@ -1636,7 +1655,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, break; case SND_SOC_TPLG_CTL_BYTES: kcontrol_type = SND_SOC_TPLG_TYPE_BYTES; /* bytes control */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_dbytes_create(tplg, template.num_kcontrols); Loading @@ -1648,7 +1667,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, default: dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", control_hdr->ops.get, control_hdr->ops.put, control_hdr->ops.info); le32_to_cpu(control_hdr->ops.info)); ret = -EINVAL; goto hdr_err; } Loading Loading @@ -1698,7 +1717,9 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_dapm_widget *widget; int ret, count = hdr->count, i; int ret, count, i; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_WIDGET) return 0; Loading @@ -1707,7 +1728,7 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, for (i = 0; i < count; i++) { widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; if (widget->size != sizeof(*widget)) { if (le32_to_cpu(widget->size) != sizeof(*widget)) { dev_err(tplg->dev, "ASoC: invalid widget size\n"); return -EINVAL; } Loading Loading @@ -1749,13 +1770,13 @@ static void set_stream_info(struct snd_soc_pcm_stream *stream, struct snd_soc_tplg_stream_caps *caps) { stream->stream_name = kstrdup(caps->name, GFP_KERNEL); stream->channels_min = caps->channels_min; stream->channels_max = caps->channels_max; stream->rates = caps->rates; stream->rate_min = caps->rate_min; stream->rate_max = caps->rate_max; stream->formats = caps->formats; stream->sig_bits = caps->sig_bits; stream->channels_min = le32_to_cpu(caps->channels_min); stream->channels_max = le32_to_cpu(caps->channels_max); stream->rates = le32_to_cpu(caps->rates); stream->rate_min = le32_to_cpu(caps->rate_min); stream->rate_max = le32_to_cpu(caps->rate_max); stream->formats = le64_to_cpu(caps->formats); stream->sig_bits = le32_to_cpu(caps->sig_bits); } static void set_dai_flags(struct snd_soc_dai_driver *dai_drv, Loading Loading @@ -1790,7 +1811,7 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg, if (strlen(pcm->dai_name)) dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL); dai_drv->id = pcm->dai_id; dai_drv->id = le32_to_cpu(pcm->dai_id); if (pcm->playback) { stream = &dai_drv->playback; Loading Loading @@ -1865,7 +1886,7 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); } link->id = pcm->pcm_id; link->id = le32_to_cpu(pcm->pcm_id); if (strlen(pcm->dai_name)) link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL); Loading @@ -1875,10 +1896,12 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, /* enable DPCM */ link->dynamic = 1; link->dpcm_playback = pcm->playback; link->dpcm_capture = pcm->capture; link->dpcm_playback = le32_to_cpu(pcm->playback); link->dpcm_capture = le32_to_cpu(pcm->capture); if (pcm->flag_mask) set_link_flags(link, pcm->flag_mask, pcm->flags); set_link_flags(link, le32_to_cpu(pcm->flag_mask), le32_to_cpu(pcm->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_link_load(tplg, link, NULL); Loading Loading @@ -1917,7 +1940,7 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg, static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest, struct snd_soc_tplg_stream_caps_v4 *src) { dest->size = sizeof(*dest); dest->size = cpu_to_le32(sizeof(*dest)); memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); dest->formats = src->formats; dest->rates = src->rates; Loading Loading @@ -1951,7 +1974,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, *pcm = NULL; if (src->size != sizeof(*src_v4)) { if (le32_to_cpu(src->size) != sizeof(*src_v4)) { dev_err(tplg->dev, "ASoC: invalid PCM size\n"); return -EINVAL; } Loading @@ -1962,7 +1985,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, if (!dest) return -ENOMEM; dest->size = sizeof(*dest); /* size of latest abi version */ dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); dest->pcm_id = src_v4->pcm_id; Loading @@ -1971,7 +1994,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, dest->capture = src_v4->capture; dest->compress = src_v4->compress; dest->num_streams = src_v4->num_streams; for (i = 0; i < dest->num_streams; i++) for (i = 0; i < le32_to_cpu(dest->num_streams); i++) memcpy(&dest->stream[i], &src_v4->stream[i], sizeof(struct snd_soc_tplg_stream)); Loading @@ -1986,25 +2009,30 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_pcm *pcm, *_pcm; int count = hdr->count; int count; int size; int i; bool abi_match; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_PCM_DAI) return 0; /* check the element size and count */ pcm = (struct snd_soc_tplg_pcm *)tplg->pos; if (pcm->size > sizeof(struct snd_soc_tplg_pcm) || pcm->size < sizeof(struct snd_soc_tplg_pcm_v4)) { size = le32_to_cpu(pcm->size); if (size > sizeof(struct snd_soc_tplg_pcm) || size < sizeof(struct snd_soc_tplg_pcm_v4)) { dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n", pcm->size); size); return -EINVAL; } if (soc_tplg_check_elem_count(tplg, pcm->size, count, hdr->payload_size, "PCM DAI")) { size, count, le32_to_cpu(hdr->payload_size), "PCM DAI")) { dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", count); return -EINVAL; Loading @@ -2012,11 +2040,12 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, for (i = 0; i < count; i++) { pcm = (struct snd_soc_tplg_pcm *)tplg->pos; size = le32_to_cpu(pcm->size); /* check ABI version by size, create a new version of pcm * if abi not match. */ if (pcm->size == sizeof(*pcm)) { if (size == sizeof(*pcm)) { abi_match = true; _pcm = pcm; } else { Loading @@ -2030,7 +2059,7 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, /* offset by version-specific struct size and * real priv data size */ tplg->pos += pcm->size + _pcm->priv.size; tplg->pos += size + le32_to_cpu(_pcm->priv.size); if (!abi_match) kfree(_pcm); /* free the duplicated one */ Loading Loading @@ -2058,12 +2087,13 @@ static void set_link_hw_format(struct snd_soc_dai_link *link, unsigned char invert_bclk, invert_fsync; int i; for (i = 0; i < cfg->num_hw_configs; i++) { for (i = 0; i < le32_to_cpu(cfg->num_hw_configs); i++) { hw_config = &cfg->hw_config[i]; if (hw_config->id != cfg->default_hw_config_id) continue; link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK; link->dai_fmt = le32_to_cpu(hw_config->fmt) & SND_SOC_DAIFMT_FORMAT_MASK; /* clock gating */ switch (hw_config->clock_gated) { Loading Loading @@ -2127,7 +2157,8 @@ static int link_new_ver(struct soc_tplg *tplg, *link = NULL; if (src->size != sizeof(struct snd_soc_tplg_link_config_v4)) { if (le32_to_cpu(src->size) != sizeof(struct snd_soc_tplg_link_config_v4)) { dev_err(tplg->dev, "ASoC: invalid physical link config size\n"); return -EINVAL; } Loading @@ -2139,10 +2170,10 @@ static int link_new_ver(struct soc_tplg *tplg, if (!dest) return -ENOMEM; dest->size = sizeof(*dest); dest->size = cpu_to_le32(sizeof(*dest)); dest->id = src_v4->id; dest->num_streams = src_v4->num_streams; for (i = 0; i < dest->num_streams; i++) for (i = 0; i < le32_to_cpu(dest->num_streams); i++) memcpy(&dest->stream[i], &src_v4->stream[i], sizeof(struct snd_soc_tplg_stream)); Loading Loading @@ -2175,7 +2206,7 @@ static int soc_tplg_link_config(struct soc_tplg *tplg, else stream_name = NULL; link = snd_soc_find_dai_link(tplg->comp->card, cfg->id, link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id), name, stream_name); if (!link) { dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n", Loading @@ -2189,7 +2220,9 @@ static int soc_tplg_link_config(struct soc_tplg *tplg, /* flags */ if (cfg->flag_mask) set_link_flags(link, cfg->flag_mask, cfg->flags); set_link_flags(link, le32_to_cpu(cfg->flag_mask), le32_to_cpu(cfg->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_link_load(tplg, link, cfg); Loading @@ -2213,27 +2246,33 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_link_config *link, *_link; int count = hdr->count; int count; int size; int i, ret; bool abi_match; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_LINK) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; }; /* check the element size and count */ link = (struct snd_soc_tplg_link_config *)tplg->pos; if (link->size > sizeof(struct snd_soc_tplg_link_config) || link->size < sizeof(struct snd_soc_tplg_link_config_v4)) { size = le32_to_cpu(link->size); if (size > sizeof(struct snd_soc_tplg_link_config) || size < sizeof(struct snd_soc_tplg_link_config_v4)) { dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n", link->size); size); return -EINVAL; } if (soc_tplg_check_elem_count(tplg, link->size, count, hdr->payload_size, "physical link config")) { size, count, le32_to_cpu(hdr->payload_size), "physical link config")) { dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n", count); return -EINVAL; Loading @@ -2242,7 +2281,8 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, /* config physical DAI links */ for (i = 0; i < count; i++) { link = (struct snd_soc_tplg_link_config *)tplg->pos; if (link->size == sizeof(*link)) { size = le32_to_cpu(link->size); if (size == sizeof(*link)) { abi_match = true; _link = link; } else { Loading @@ -2259,7 +2299,7 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, /* offset by version-specific struct size and * real priv data size */ tplg->pos += link->size + _link->priv.size; tplg->pos += size + le32_to_cpu(_link->priv.size); if (!abi_match) kfree(_link); /* free the duplicated one */ Loading @@ -2279,13 +2319,15 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, static int soc_tplg_dai_config(struct soc_tplg *tplg, struct snd_soc_tplg_dai *d) { struct snd_soc_dai_link_component dai_component = {0}; struct snd_soc_dai_link_component dai_component; struct snd_soc_dai *dai; struct snd_soc_dai_driver *dai_drv; struct snd_soc_pcm_stream *stream; struct snd_soc_tplg_stream_caps *caps; int ret; memset(&dai_component, 0, sizeof(dai_component)); dai_component.dai_name = d->dai_name; dai = snd_soc_find_dai(&dai_component); if (!dai) { Loading @@ -2294,7 +2336,7 @@ static int soc_tplg_dai_config(struct soc_tplg *tplg, return -EINVAL; } if (d->dai_id != dai->id) { if (le32_to_cpu(d->dai_id) != dai->id) { dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n", d->dai_name); return -EINVAL; Loading @@ -2317,7 +2359,9 @@ static int soc_tplg_dai_config(struct soc_tplg *tplg, } if (d->flag_mask) set_dai_flags(dai_drv, d->flag_mask, d->flags); set_dai_flags(dai_drv, le32_to_cpu(d->flag_mask), le32_to_cpu(d->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai); Loading @@ -2334,22 +2378,24 @@ static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_dai *dai; int count = hdr->count; int count; int i; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_BE_DAI) return 0; /* config the existing BE DAIs */ for (i = 0; i < count; i++) { dai = (struct snd_soc_tplg_dai *)tplg->pos; if (dai->size != sizeof(*dai)) { if (le32_to_cpu(dai->size) != sizeof(*dai)) { dev_err(tplg->dev, "ASoC: invalid physical DAI size\n"); return -EINVAL; } soc_tplg_dai_config(tplg, dai); tplg->pos += (sizeof(*dai) + dai->priv.size); tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size)); } dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); Loading @@ -2371,25 +2417,28 @@ static int manifest_new_ver(struct soc_tplg *tplg, { struct snd_soc_tplg_manifest *dest; struct snd_soc_tplg_manifest_v4 *src_v4; int size; *manifest = NULL; if (src->size != sizeof(*src_v4)) { size = le32_to_cpu(src->size); if (size != sizeof(*src_v4)) { dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n", src->size); if (src->size) size); if (size) return -EINVAL; src->size = sizeof(*src_v4); src->size = cpu_to_le32(sizeof(*src_v4)); } dev_warn(tplg->dev, "ASoC: old version of manifest\n"); src_v4 = (struct snd_soc_tplg_manifest_v4 *)src; dest = kzalloc(sizeof(*dest) + src_v4->priv.size, GFP_KERNEL); dest = kzalloc(sizeof(*dest) + le32_to_cpu(src_v4->priv.size), GFP_KERNEL); if (!dest) return -ENOMEM; dest->size = sizeof(*dest); /* size of latest abi version */ dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ dest->control_elems = src_v4->control_elems; dest->widget_elems = src_v4->widget_elems; dest->graph_elems = src_v4->graph_elems; Loading @@ -2398,7 +2447,7 @@ static int manifest_new_ver(struct soc_tplg *tplg, dest->priv.size = src_v4->priv.size; if (dest->priv.size) memcpy(dest->priv.data, src_v4->priv.data, src_v4->priv.size); le32_to_cpu(src_v4->priv.size)); *manifest = dest; return 0; Loading @@ -2417,7 +2466,7 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg, manifest = (struct snd_soc_tplg_manifest *)tplg->pos; /* check ABI version by size, create a new manifest if abi not match */ if (manifest->size == sizeof(*manifest)) { if (le32_to_cpu(manifest->size) == sizeof(*manifest)) { abi_match = true; _manifest = manifest; } else { Loading @@ -2444,10 +2493,10 @@ static int soc_valid_header(struct soc_tplg *tplg, if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) return 0; if (hdr->size != sizeof(*hdr)) { if (le32_to_cpu(hdr->size) != sizeof(*hdr)) { dev_err(tplg->dev, "ASoC: invalid header size for type %d at offset 0x%lx size 0x%zx.\n", hdr->type, soc_tplg_get_hdr_offset(tplg), le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg), tplg->fw->size); return -EINVAL; } Loading @@ -2461,7 +2510,7 @@ static int soc_valid_header(struct soc_tplg *tplg, return -EINVAL; } if (hdr->magic != SND_SOC_TPLG_MAGIC) { if (le32_to_cpu(hdr->magic) != SND_SOC_TPLG_MAGIC) { dev_err(tplg->dev, "ASoC: pass %d does not have a valid header got %x at offset 0x%lx size 0x%zx.\n", tplg->pass, hdr->magic, Loading @@ -2470,8 +2519,8 @@ static int soc_valid_header(struct soc_tplg *tplg, } /* Support ABI from version 4 */ if (hdr->abi > SND_SOC_TPLG_ABI_VERSION || hdr->abi < SND_SOC_TPLG_ABI_VERSION_MIN) { if (le32_to_cpu(hdr->abi) > SND_SOC_TPLG_ABI_VERSION || le32_to_cpu(hdr->abi) < SND_SOC_TPLG_ABI_VERSION_MIN) { dev_err(tplg->dev, "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n", tplg->pass, hdr->abi, Loading @@ -2486,7 +2535,7 @@ static int soc_valid_header(struct soc_tplg *tplg, return -EINVAL; } if (tplg->pass == hdr->type) if (tplg->pass == le32_to_cpu(hdr->type)) dev_dbg(tplg->dev, "ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n", hdr->payload_size, hdr->type, hdr->version, Loading @@ -2502,13 +2551,13 @@ static int soc_tplg_load_header(struct soc_tplg *tplg, tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); /* check for matching ID */ if (hdr->index != tplg->req_index && if (le32_to_cpu(hdr->index) != tplg->req_index && tplg->req_index != SND_SOC_TPLG_INDEX_ALL) return 0; tplg->index = hdr->index; tplg->index = le32_to_cpu(hdr->index); switch (hdr->type) { switch (le32_to_cpu(hdr->type)) { case SND_SOC_TPLG_TYPE_MIXER: case SND_SOC_TPLG_TYPE_ENUM: case SND_SOC_TPLG_TYPE_BYTES: Loading Loading @@ -2564,7 +2613,7 @@ static int soc_tplg_process_headers(struct soc_tplg *tplg) return ret; /* goto next header */ tplg->hdr_pos += hdr->payload_size + tplg->hdr_pos += le32_to_cpu(hdr->payload_size) + sizeof(struct snd_soc_tplg_hdr); hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; } Loading Loading
sound/soc/soc-topology.c +170 −121 Original line number Diff line number Diff line Loading @@ -197,8 +197,8 @@ static int tplc_chan_get_reg(struct soc_tplg *tplg, int i; for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { if (chan[i].id == map) return chan[i].reg; if (le32_to_cpu(chan[i].id) == map) return le32_to_cpu(chan[i].reg); } return -EINVAL; Loading @@ -210,8 +210,8 @@ static int tplc_chan_get_shift(struct soc_tplg *tplg, int i; for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { if (chan[i].id == map) return chan[i].shift; if (le32_to_cpu(chan[i].id) == map) return le32_to_cpu(chan[i].shift); } return -EINVAL; Loading Loading @@ -592,7 +592,7 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, const struct snd_soc_tplg_bytes_ext_ops *ext_ops; int num_ops, i; if (hdr->ops.info == SND_SOC_TPLG_CTL_BYTES if (le32_to_cpu(hdr->ops.info) == SND_SOC_TPLG_CTL_BYTES && k->iface & SNDRV_CTL_ELEM_IFACE_MIXER && k->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE && k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { Loading Loading @@ -708,9 +708,9 @@ static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, p[0] = SNDRV_CTL_TLVT_DB_SCALE; p[1] = item_len; p[2] = scale->min; p[3] = (scale->step & TLV_DB_SCALE_MASK) | (scale->mute ? TLV_DB_SCALE_MUTE : 0); p[2] = le32_to_cpu(scale->min); p[3] = (le32_to_cpu(scale->step) & TLV_DB_SCALE_MASK) | (le32_to_cpu(scale->mute) ? TLV_DB_SCALE_MUTE : 0); kc->tlv.p = (void *)p; return 0; Loading @@ -720,13 +720,14 @@ static int soc_tplg_create_tlv(struct soc_tplg *tplg, struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_hdr *tc) { struct snd_soc_tplg_ctl_tlv *tplg_tlv; u32 access = le32_to_cpu(tc->access); if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) return 0; if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK)) { if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK)) { tplg_tlv = &tc->tlv; switch (tplg_tlv->type) { switch (le32_to_cpu(tplg_tlv->type)) { case SNDRV_CTL_TLVT_DB_SCALE: return soc_tplg_create_tlv_db_scale(tplg, kc, &tplg_tlv->scale); Loading Loading @@ -777,7 +778,7 @@ static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + be->priv.size); le32_to_cpu(be->priv.size)); dev_dbg(tplg->dev, "ASoC: adding bytes kcontrol %s with access 0x%x\n", Loading @@ -787,9 +788,9 @@ static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count, kc.name = be->hdr.name; kc.private_value = (long)sbe; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = be->hdr.access; kc.access = le32_to_cpu(be->hdr.access); sbe->max = be->max; sbe->max = le32_to_cpu(be->max); sbe->dobj.type = SND_SOC_DOBJ_BYTES; sbe->dobj.ops = tplg->ops; INIT_LIST_HEAD(&sbe->dobj.list); Loading Loading @@ -857,7 +858,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, if (sm == NULL) return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + mc->priv.size); le32_to_cpu(mc->priv.size)); dev_dbg(tplg->dev, "ASoC: adding mixer kcontrol %s with access 0x%x\n", Loading @@ -867,7 +868,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, kc.name = mc->hdr.name; kc.private_value = (long)sm; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = mc->hdr.access; kc.access = le32_to_cpu(mc->hdr.access); /* we only support FL/FR channel mapping atm */ sm->reg = tplc_chan_get_reg(tplg, mc->channel, Loading @@ -879,10 +880,10 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, sm->rshift = tplc_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FR); sm->max = mc->max; sm->min = mc->min; sm->invert = mc->invert; sm->platform_max = mc->platform_max; sm->max = le32_to_cpu(mc->max); sm->min = le32_to_cpu(mc->min); sm->invert = le32_to_cpu(mc->invert); sm->platform_max = le32_to_cpu(mc->platform_max); sm->dobj.index = tplg->index; sm->dobj.ops = tplg->ops; sm->dobj.type = SND_SOC_DOBJ_MIXER; Loading Loading @@ -933,7 +934,7 @@ static int soc_tplg_denum_create_texts(struct soc_enum *se, int i, ret; se->dobj.control.dtexts = kcalloc(ec->items, sizeof(char *), GFP_KERNEL); kcalloc(le32_to_cpu(ec->items), sizeof(char *), GFP_KERNEL); if (se->dobj.control.dtexts == NULL) return -ENOMEM; Loading Loading @@ -965,15 +966,22 @@ static int soc_tplg_denum_create_texts(struct soc_enum *se, static int soc_tplg_denum_create_values(struct soc_enum *se, struct snd_soc_tplg_enum_control *ec) { if (ec->items > sizeof(*ec->values)) int i; if (le32_to_cpu(ec->items) > sizeof(*ec->values)) return -EINVAL; se->dobj.control.dvalues = kmemdup(ec->values, ec->items * sizeof(u32), se->dobj.control.dvalues = kzalloc(le32_to_cpu(ec->items) * sizeof(u32), GFP_KERNEL); if (!se->dobj.control.dvalues) return -ENOMEM; /* convert from little-endian */ for (i = 0; i < le32_to_cpu(ec->items); i++) { se->dobj.control.dvalues[i] = le32_to_cpu(ec->values[i]); } return 0; } Loading Loading @@ -1007,7 +1015,7 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, return -ENOMEM; tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + ec->priv.size); le32_to_cpu(ec->priv.size)); dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", ec->hdr.name, ec->items); Loading @@ -1016,7 +1024,7 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, kc.name = ec->hdr.name; kc.private_value = (long)se; kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc.access = ec->hdr.access; kc.access = le32_to_cpu(ec->hdr.access); se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); se->shift_l = tplc_chan_get_shift(tplg, ec->channel, Loading @@ -1024,14 +1032,14 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count, se->shift_r = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FL); se->items = ec->items; se->mask = ec->mask; se->items = le32_to_cpu(ec->items); se->mask = le32_to_cpu(ec->mask); se->dobj.index = tplg->index; se->dobj.type = SND_SOC_DOBJ_ENUM; se->dobj.ops = tplg->ops; INIT_LIST_HEAD(&se->dobj.list); switch (ec->hdr.ops.info) { switch (le32_to_cpu(ec->hdr.ops.info)) { case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: case SND_SOC_TPLG_CTL_ENUM_VALUE: err = soc_tplg_denum_create_values(se, ec); Loading Loading @@ -1104,23 +1112,24 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, int i; if (tplg->pass != SOC_TPLG_PASS_MIXER) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; } dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, soc_tplg_get_offset(tplg)); for (i = 0; i < hdr->count; i++) { for (i = 0; i < le32_to_cpu(hdr->count); i++) { control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; if (control_hdr->size != sizeof(*control_hdr)) { if (le32_to_cpu(control_hdr->size) != sizeof(*control_hdr)) { dev_err(tplg->dev, "ASoC: invalid control size\n"); return -EINVAL; } switch (control_hdr->ops.info) { switch (le32_to_cpu(control_hdr->ops.info)) { case SND_SOC_TPLG_CTL_VOLSW: case SND_SOC_TPLG_CTL_STROBE: case SND_SOC_TPLG_CTL_VOLSW_SX: Loading @@ -1128,17 +1137,20 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, case SND_SOC_TPLG_CTL_RANGE: case SND_SOC_TPLG_DAPM_CTL_VOLSW: case SND_SOC_TPLG_DAPM_CTL_PIN: soc_tplg_dmixer_create(tplg, 1, hdr->payload_size); soc_tplg_dmixer_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; case SND_SOC_TPLG_CTL_ENUM: case SND_SOC_TPLG_CTL_ENUM_VALUE: case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: soc_tplg_denum_create(tplg, 1, hdr->payload_size); soc_tplg_denum_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; case SND_SOC_TPLG_CTL_BYTES: soc_tplg_dbytes_create(tplg, 1, hdr->payload_size); soc_tplg_dbytes_create(tplg, 1, le32_to_cpu(hdr->payload_size)); break; default: soc_bind_err(tplg, control_hdr, i); Loading Loading @@ -1166,17 +1178,22 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; struct snd_soc_tplg_dapm_graph_elem *elem; struct snd_soc_dapm_route **routes; int count = hdr->count, i, j; int count, i, j; int ret = 0; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_GRAPH) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; } if (soc_tplg_check_elem_count(tplg, sizeof(struct snd_soc_tplg_dapm_graph_elem), count, hdr->payload_size, "graph")) { count, le32_to_cpu(hdr->payload_size), "graph")) { dev_err(tplg->dev, "ASoC: invalid count %d for DAPM routes\n", count); Loading Loading @@ -1291,7 +1308,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create( goto err_str; tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + mc->priv.size); le32_to_cpu(mc->priv.size)); dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", mc->hdr.name, i); Loading Loading @@ -1404,7 +1421,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create( se->mask = ec->mask; se->dobj.index = tplg->index; switch (ec->hdr.ops.info) { switch (le32_to_cpu(ec->hdr.ops.info)) { case SND_SOC_TPLG_CTL_ENUM_VALUE: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: err = soc_tplg_denum_create_values(se, ec); Loading Loading @@ -1495,7 +1512,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create( goto err; tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + be->priv.size); le32_to_cpu(be->priv.size)); dev_dbg(tplg->dev, "ASoC: adding bytes kcontrol %s with access 0x%x\n", Loading Loading @@ -1567,7 +1584,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, memset(&template, 0, sizeof(template)); /* map user to kernel widget ID */ template.id = get_widget_id(w->id); template.id = get_widget_id(le32_to_cpu(w->id)); if (template.id < 0) return template.id; Loading @@ -1580,18 +1597,20 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, ret = -ENOMEM; goto err; } template.reg = w->reg; template.shift = w->shift; template.mask = w->mask; template.subseq = w->subseq; template.reg = le32_to_cpu(w->reg); template.shift = le32_to_cpu(w->shift); template.mask = le32_to_cpu(w->mask); template.subseq = le32_to_cpu(w->subseq); template.on_val = w->invert ? 0 : 1; template.off_val = w->invert ? 1 : 0; template.ignore_suspend = w->ignore_suspend; template.event_flags = w->event_flags; template.ignore_suspend = le32_to_cpu(w->ignore_suspend); template.event_flags = le16_to_cpu(w->event_flags); template.dobj.index = tplg->index; tplg->pos += (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size); (sizeof(struct snd_soc_tplg_dapm_widget) + le32_to_cpu(w->priv.size)); if (w->num_kcontrols == 0) { kcontrol_type = 0; template.num_kcontrols = 0; Loading @@ -1602,7 +1621,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n", w->name, w->num_kcontrols, control_hdr->type); switch (control_hdr->ops.info) { switch (le32_to_cpu(control_hdr->ops.info)) { case SND_SOC_TPLG_CTL_VOLSW: case SND_SOC_TPLG_CTL_STROBE: case SND_SOC_TPLG_CTL_VOLSW_SX: Loading @@ -1610,7 +1629,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, case SND_SOC_TPLG_CTL_RANGE: case SND_SOC_TPLG_DAPM_CTL_VOLSW: kcontrol_type = SND_SOC_TPLG_TYPE_MIXER; /* volume mixer */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_dmixer_create(tplg, template.num_kcontrols); Loading @@ -1625,7 +1644,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: kcontrol_type = SND_SOC_TPLG_TYPE_ENUM; /* enumerated mixer */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_denum_create(tplg, template.num_kcontrols); Loading @@ -1636,7 +1655,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, break; case SND_SOC_TPLG_CTL_BYTES: kcontrol_type = SND_SOC_TPLG_TYPE_BYTES; /* bytes control */ template.num_kcontrols = w->num_kcontrols; template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.kcontrol_news = soc_tplg_dapm_widget_dbytes_create(tplg, template.num_kcontrols); Loading @@ -1648,7 +1667,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, default: dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", control_hdr->ops.get, control_hdr->ops.put, control_hdr->ops.info); le32_to_cpu(control_hdr->ops.info)); ret = -EINVAL; goto hdr_err; } Loading Loading @@ -1698,7 +1717,9 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_dapm_widget *widget; int ret, count = hdr->count, i; int ret, count, i; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_WIDGET) return 0; Loading @@ -1707,7 +1728,7 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, for (i = 0; i < count; i++) { widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; if (widget->size != sizeof(*widget)) { if (le32_to_cpu(widget->size) != sizeof(*widget)) { dev_err(tplg->dev, "ASoC: invalid widget size\n"); return -EINVAL; } Loading Loading @@ -1749,13 +1770,13 @@ static void set_stream_info(struct snd_soc_pcm_stream *stream, struct snd_soc_tplg_stream_caps *caps) { stream->stream_name = kstrdup(caps->name, GFP_KERNEL); stream->channels_min = caps->channels_min; stream->channels_max = caps->channels_max; stream->rates = caps->rates; stream->rate_min = caps->rate_min; stream->rate_max = caps->rate_max; stream->formats = caps->formats; stream->sig_bits = caps->sig_bits; stream->channels_min = le32_to_cpu(caps->channels_min); stream->channels_max = le32_to_cpu(caps->channels_max); stream->rates = le32_to_cpu(caps->rates); stream->rate_min = le32_to_cpu(caps->rate_min); stream->rate_max = le32_to_cpu(caps->rate_max); stream->formats = le64_to_cpu(caps->formats); stream->sig_bits = le32_to_cpu(caps->sig_bits); } static void set_dai_flags(struct snd_soc_dai_driver *dai_drv, Loading Loading @@ -1790,7 +1811,7 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg, if (strlen(pcm->dai_name)) dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL); dai_drv->id = pcm->dai_id; dai_drv->id = le32_to_cpu(pcm->dai_id); if (pcm->playback) { stream = &dai_drv->playback; Loading Loading @@ -1865,7 +1886,7 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); } link->id = pcm->pcm_id; link->id = le32_to_cpu(pcm->pcm_id); if (strlen(pcm->dai_name)) link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL); Loading @@ -1875,10 +1896,12 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, /* enable DPCM */ link->dynamic = 1; link->dpcm_playback = pcm->playback; link->dpcm_capture = pcm->capture; link->dpcm_playback = le32_to_cpu(pcm->playback); link->dpcm_capture = le32_to_cpu(pcm->capture); if (pcm->flag_mask) set_link_flags(link, pcm->flag_mask, pcm->flags); set_link_flags(link, le32_to_cpu(pcm->flag_mask), le32_to_cpu(pcm->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_link_load(tplg, link, NULL); Loading Loading @@ -1917,7 +1940,7 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg, static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest, struct snd_soc_tplg_stream_caps_v4 *src) { dest->size = sizeof(*dest); dest->size = cpu_to_le32(sizeof(*dest)); memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); dest->formats = src->formats; dest->rates = src->rates; Loading Loading @@ -1951,7 +1974,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, *pcm = NULL; if (src->size != sizeof(*src_v4)) { if (le32_to_cpu(src->size) != sizeof(*src_v4)) { dev_err(tplg->dev, "ASoC: invalid PCM size\n"); return -EINVAL; } Loading @@ -1962,7 +1985,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, if (!dest) return -ENOMEM; dest->size = sizeof(*dest); /* size of latest abi version */ dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); dest->pcm_id = src_v4->pcm_id; Loading @@ -1971,7 +1994,7 @@ static int pcm_new_ver(struct soc_tplg *tplg, dest->capture = src_v4->capture; dest->compress = src_v4->compress; dest->num_streams = src_v4->num_streams; for (i = 0; i < dest->num_streams; i++) for (i = 0; i < le32_to_cpu(dest->num_streams); i++) memcpy(&dest->stream[i], &src_v4->stream[i], sizeof(struct snd_soc_tplg_stream)); Loading @@ -1986,25 +2009,30 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_pcm *pcm, *_pcm; int count = hdr->count; int count; int size; int i; bool abi_match; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_PCM_DAI) return 0; /* check the element size and count */ pcm = (struct snd_soc_tplg_pcm *)tplg->pos; if (pcm->size > sizeof(struct snd_soc_tplg_pcm) || pcm->size < sizeof(struct snd_soc_tplg_pcm_v4)) { size = le32_to_cpu(pcm->size); if (size > sizeof(struct snd_soc_tplg_pcm) || size < sizeof(struct snd_soc_tplg_pcm_v4)) { dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n", pcm->size); size); return -EINVAL; } if (soc_tplg_check_elem_count(tplg, pcm->size, count, hdr->payload_size, "PCM DAI")) { size, count, le32_to_cpu(hdr->payload_size), "PCM DAI")) { dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", count); return -EINVAL; Loading @@ -2012,11 +2040,12 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, for (i = 0; i < count; i++) { pcm = (struct snd_soc_tplg_pcm *)tplg->pos; size = le32_to_cpu(pcm->size); /* check ABI version by size, create a new version of pcm * if abi not match. */ if (pcm->size == sizeof(*pcm)) { if (size == sizeof(*pcm)) { abi_match = true; _pcm = pcm; } else { Loading @@ -2030,7 +2059,7 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, /* offset by version-specific struct size and * real priv data size */ tplg->pos += pcm->size + _pcm->priv.size; tplg->pos += size + le32_to_cpu(_pcm->priv.size); if (!abi_match) kfree(_pcm); /* free the duplicated one */ Loading Loading @@ -2058,12 +2087,13 @@ static void set_link_hw_format(struct snd_soc_dai_link *link, unsigned char invert_bclk, invert_fsync; int i; for (i = 0; i < cfg->num_hw_configs; i++) { for (i = 0; i < le32_to_cpu(cfg->num_hw_configs); i++) { hw_config = &cfg->hw_config[i]; if (hw_config->id != cfg->default_hw_config_id) continue; link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK; link->dai_fmt = le32_to_cpu(hw_config->fmt) & SND_SOC_DAIFMT_FORMAT_MASK; /* clock gating */ switch (hw_config->clock_gated) { Loading Loading @@ -2127,7 +2157,8 @@ static int link_new_ver(struct soc_tplg *tplg, *link = NULL; if (src->size != sizeof(struct snd_soc_tplg_link_config_v4)) { if (le32_to_cpu(src->size) != sizeof(struct snd_soc_tplg_link_config_v4)) { dev_err(tplg->dev, "ASoC: invalid physical link config size\n"); return -EINVAL; } Loading @@ -2139,10 +2170,10 @@ static int link_new_ver(struct soc_tplg *tplg, if (!dest) return -ENOMEM; dest->size = sizeof(*dest); dest->size = cpu_to_le32(sizeof(*dest)); dest->id = src_v4->id; dest->num_streams = src_v4->num_streams; for (i = 0; i < dest->num_streams; i++) for (i = 0; i < le32_to_cpu(dest->num_streams); i++) memcpy(&dest->stream[i], &src_v4->stream[i], sizeof(struct snd_soc_tplg_stream)); Loading Loading @@ -2175,7 +2206,7 @@ static int soc_tplg_link_config(struct soc_tplg *tplg, else stream_name = NULL; link = snd_soc_find_dai_link(tplg->comp->card, cfg->id, link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id), name, stream_name); if (!link) { dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n", Loading @@ -2189,7 +2220,9 @@ static int soc_tplg_link_config(struct soc_tplg *tplg, /* flags */ if (cfg->flag_mask) set_link_flags(link, cfg->flag_mask, cfg->flags); set_link_flags(link, le32_to_cpu(cfg->flag_mask), le32_to_cpu(cfg->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_link_load(tplg, link, cfg); Loading @@ -2213,27 +2246,33 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_link_config *link, *_link; int count = hdr->count; int count; int size; int i, ret; bool abi_match; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_LINK) { tplg->pos += hdr->size + hdr->payload_size; tplg->pos += le32_to_cpu(hdr->size) + le32_to_cpu(hdr->payload_size); return 0; }; /* check the element size and count */ link = (struct snd_soc_tplg_link_config *)tplg->pos; if (link->size > sizeof(struct snd_soc_tplg_link_config) || link->size < sizeof(struct snd_soc_tplg_link_config_v4)) { size = le32_to_cpu(link->size); if (size > sizeof(struct snd_soc_tplg_link_config) || size < sizeof(struct snd_soc_tplg_link_config_v4)) { dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n", link->size); size); return -EINVAL; } if (soc_tplg_check_elem_count(tplg, link->size, count, hdr->payload_size, "physical link config")) { size, count, le32_to_cpu(hdr->payload_size), "physical link config")) { dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n", count); return -EINVAL; Loading @@ -2242,7 +2281,8 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, /* config physical DAI links */ for (i = 0; i < count; i++) { link = (struct snd_soc_tplg_link_config *)tplg->pos; if (link->size == sizeof(*link)) { size = le32_to_cpu(link->size); if (size == sizeof(*link)) { abi_match = true; _link = link; } else { Loading @@ -2259,7 +2299,7 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, /* offset by version-specific struct size and * real priv data size */ tplg->pos += link->size + _link->priv.size; tplg->pos += size + le32_to_cpu(_link->priv.size); if (!abi_match) kfree(_link); /* free the duplicated one */ Loading @@ -2279,13 +2319,15 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, static int soc_tplg_dai_config(struct soc_tplg *tplg, struct snd_soc_tplg_dai *d) { struct snd_soc_dai_link_component dai_component = {0}; struct snd_soc_dai_link_component dai_component; struct snd_soc_dai *dai; struct snd_soc_dai_driver *dai_drv; struct snd_soc_pcm_stream *stream; struct snd_soc_tplg_stream_caps *caps; int ret; memset(&dai_component, 0, sizeof(dai_component)); dai_component.dai_name = d->dai_name; dai = snd_soc_find_dai(&dai_component); if (!dai) { Loading @@ -2294,7 +2336,7 @@ static int soc_tplg_dai_config(struct soc_tplg *tplg, return -EINVAL; } if (d->dai_id != dai->id) { if (le32_to_cpu(d->dai_id) != dai->id) { dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n", d->dai_name); return -EINVAL; Loading @@ -2317,7 +2359,9 @@ static int soc_tplg_dai_config(struct soc_tplg *tplg, } if (d->flag_mask) set_dai_flags(dai_drv, d->flag_mask, d->flags); set_dai_flags(dai_drv, le32_to_cpu(d->flag_mask), le32_to_cpu(d->flags)); /* pass control to component driver for optional further init */ ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai); Loading @@ -2334,22 +2378,24 @@ static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, struct snd_soc_tplg_hdr *hdr) { struct snd_soc_tplg_dai *dai; int count = hdr->count; int count; int i; count = le32_to_cpu(hdr->count); if (tplg->pass != SOC_TPLG_PASS_BE_DAI) return 0; /* config the existing BE DAIs */ for (i = 0; i < count; i++) { dai = (struct snd_soc_tplg_dai *)tplg->pos; if (dai->size != sizeof(*dai)) { if (le32_to_cpu(dai->size) != sizeof(*dai)) { dev_err(tplg->dev, "ASoC: invalid physical DAI size\n"); return -EINVAL; } soc_tplg_dai_config(tplg, dai); tplg->pos += (sizeof(*dai) + dai->priv.size); tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size)); } dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); Loading @@ -2371,25 +2417,28 @@ static int manifest_new_ver(struct soc_tplg *tplg, { struct snd_soc_tplg_manifest *dest; struct snd_soc_tplg_manifest_v4 *src_v4; int size; *manifest = NULL; if (src->size != sizeof(*src_v4)) { size = le32_to_cpu(src->size); if (size != sizeof(*src_v4)) { dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n", src->size); if (src->size) size); if (size) return -EINVAL; src->size = sizeof(*src_v4); src->size = cpu_to_le32(sizeof(*src_v4)); } dev_warn(tplg->dev, "ASoC: old version of manifest\n"); src_v4 = (struct snd_soc_tplg_manifest_v4 *)src; dest = kzalloc(sizeof(*dest) + src_v4->priv.size, GFP_KERNEL); dest = kzalloc(sizeof(*dest) + le32_to_cpu(src_v4->priv.size), GFP_KERNEL); if (!dest) return -ENOMEM; dest->size = sizeof(*dest); /* size of latest abi version */ dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ dest->control_elems = src_v4->control_elems; dest->widget_elems = src_v4->widget_elems; dest->graph_elems = src_v4->graph_elems; Loading @@ -2398,7 +2447,7 @@ static int manifest_new_ver(struct soc_tplg *tplg, dest->priv.size = src_v4->priv.size; if (dest->priv.size) memcpy(dest->priv.data, src_v4->priv.data, src_v4->priv.size); le32_to_cpu(src_v4->priv.size)); *manifest = dest; return 0; Loading @@ -2417,7 +2466,7 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg, manifest = (struct snd_soc_tplg_manifest *)tplg->pos; /* check ABI version by size, create a new manifest if abi not match */ if (manifest->size == sizeof(*manifest)) { if (le32_to_cpu(manifest->size) == sizeof(*manifest)) { abi_match = true; _manifest = manifest; } else { Loading @@ -2444,10 +2493,10 @@ static int soc_valid_header(struct soc_tplg *tplg, if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) return 0; if (hdr->size != sizeof(*hdr)) { if (le32_to_cpu(hdr->size) != sizeof(*hdr)) { dev_err(tplg->dev, "ASoC: invalid header size for type %d at offset 0x%lx size 0x%zx.\n", hdr->type, soc_tplg_get_hdr_offset(tplg), le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg), tplg->fw->size); return -EINVAL; } Loading @@ -2461,7 +2510,7 @@ static int soc_valid_header(struct soc_tplg *tplg, return -EINVAL; } if (hdr->magic != SND_SOC_TPLG_MAGIC) { if (le32_to_cpu(hdr->magic) != SND_SOC_TPLG_MAGIC) { dev_err(tplg->dev, "ASoC: pass %d does not have a valid header got %x at offset 0x%lx size 0x%zx.\n", tplg->pass, hdr->magic, Loading @@ -2470,8 +2519,8 @@ static int soc_valid_header(struct soc_tplg *tplg, } /* Support ABI from version 4 */ if (hdr->abi > SND_SOC_TPLG_ABI_VERSION || hdr->abi < SND_SOC_TPLG_ABI_VERSION_MIN) { if (le32_to_cpu(hdr->abi) > SND_SOC_TPLG_ABI_VERSION || le32_to_cpu(hdr->abi) < SND_SOC_TPLG_ABI_VERSION_MIN) { dev_err(tplg->dev, "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n", tplg->pass, hdr->abi, Loading @@ -2486,7 +2535,7 @@ static int soc_valid_header(struct soc_tplg *tplg, return -EINVAL; } if (tplg->pass == hdr->type) if (tplg->pass == le32_to_cpu(hdr->type)) dev_dbg(tplg->dev, "ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n", hdr->payload_size, hdr->type, hdr->version, Loading @@ -2502,13 +2551,13 @@ static int soc_tplg_load_header(struct soc_tplg *tplg, tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); /* check for matching ID */ if (hdr->index != tplg->req_index && if (le32_to_cpu(hdr->index) != tplg->req_index && tplg->req_index != SND_SOC_TPLG_INDEX_ALL) return 0; tplg->index = hdr->index; tplg->index = le32_to_cpu(hdr->index); switch (hdr->type) { switch (le32_to_cpu(hdr->type)) { case SND_SOC_TPLG_TYPE_MIXER: case SND_SOC_TPLG_TYPE_ENUM: case SND_SOC_TPLG_TYPE_BYTES: Loading Loading @@ -2564,7 +2613,7 @@ static int soc_tplg_process_headers(struct soc_tplg *tplg) return ret; /* goto next header */ tplg->hdr_pos += hdr->payload_size + tplg->hdr_pos += le32_to_cpu(hdr->payload_size) + sizeof(struct snd_soc_tplg_hdr); hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; } Loading