offsetof(struct sof_ipc_comp_src, sink_rate)},
 };
 
+/* ASRC */
+static const struct sof_topology_token asrc_tokens[] = {
+       {SOF_TKN_ASRC_RATE_IN, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_comp_asrc, source_rate)},
+       {SOF_TKN_ASRC_RATE_OUT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_comp_asrc, sink_rate)},
+       {SOF_TKN_ASRC_ASYNCHRONOUS_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_comp_asrc, asynchronous_mode)},
+       {SOF_TKN_ASRC_OPERATION_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_comp_asrc, operation_mode)},
+};
+
 /* PCM */
 static const struct sof_topology_token pcm_tokens[] = {
        {SOF_TKN_PCM_DMAC_CONFIG, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
        [SOF_BUFFER_TOKENS] = {"Buffer tokens", buffer_tokens, ARRAY_SIZE(buffer_tokens)},
        [SOF_VOLUME_TOKENS] = {"Volume tokens", volume_tokens, ARRAY_SIZE(volume_tokens)},
        [SOF_SRC_TOKENS] = {"SRC tokens", src_tokens, ARRAY_SIZE(src_tokens)},
+       [SOF_ASRC_TOKENS] = {"ASRC tokens", asrc_tokens, ARRAY_SIZE(asrc_tokens)},
 };
 
 /**
        return ret;
 }
 
+static int sof_ipc3_widget_setup_comp_asrc(struct snd_sof_widget *swidget)
+{
+       struct snd_soc_component *scomp = swidget->scomp;
+       struct sof_ipc_comp_asrc *asrc;
+       size_t ipc_size = sizeof(*asrc);
+       int ret;
+
+       asrc = sof_comp_alloc(swidget, &ipc_size, swidget->pipeline_id);
+       if (!asrc)
+               return -ENOMEM;
+
+       swidget->private = asrc;
+
+       /* configure ASRC IPC message */
+       asrc->comp.type = SOF_COMP_ASRC;
+       asrc->config.hdr.size = sizeof(asrc->config);
+
+       /* parse one set of asrc tokens */
+       ret = sof_update_ipc_object(scomp, asrc, SOF_ASRC_TOKENS, swidget->tuples,
+                                   swidget->num_tuples, sizeof(*asrc), 1);
+       if (ret < 0)
+               goto err;
+
+       /* parse one set of comp tokens */
+       ret = sof_update_ipc_object(scomp, &asrc->config, SOF_COMP_TOKENS,
+                                   swidget->tuples, swidget->num_tuples, sizeof(asrc->config), 1);
+       if (ret < 0)
+               goto err;
+
+       dev_dbg(scomp->dev, "asrc %s: source rate %d sink rate %d asynch %d operation %d\n",
+               swidget->widget->name, asrc->source_rate, asrc->sink_rate,
+               asrc->asynchronous_mode, asrc->operation_mode);
+
+       sof_dbg_comp_config(scomp, &asrc->config);
+
+       return 0;
+err:
+       kfree(swidget->private);
+       swidget->private = NULL;
+
+       return ret;
+}
+
 /*
  * Mux topology
  */
        SOF_SCHED_TOKENS,
 };
 
+static enum sof_tokens asrc_token_list[] = {
+       SOF_CORE_TOKENS,
+       SOF_COMP_EXT_TOKENS,
+       SOF_ASRC_TOKENS,
+       SOF_COMP_TOKENS,
+};
+
 static enum sof_tokens src_token_list[] = {
        SOF_CORE_TOKENS,
        SOF_COMP_EXT_TOKENS,
                                NULL},
        [snd_soc_dapm_src] = {sof_ipc3_widget_setup_comp_src, sof_ipc3_widget_free_comp,
                              src_token_list, ARRAY_SIZE(src_token_list), NULL},
+       [snd_soc_dapm_asrc] = {sof_ipc3_widget_setup_comp_asrc, sof_ipc3_widget_free_comp,
+                              asrc_token_list, ARRAY_SIZE(asrc_token_list), NULL},
        [snd_soc_dapm_scheduler] = {sof_ipc3_widget_setup_comp_pipeline, sof_ipc3_widget_free_comp,
                                    pipeline_token_list, ARRAY_SIZE(pipeline_token_list), NULL},
        [snd_soc_dapm_pga] = {sof_ipc3_widget_setup_comp_pga, sof_ipc3_widget_free_comp,
 
                offsetof(struct sof_ipc_dai_config, dai_index)},
 };
 
-/* ASRC */
-static const struct sof_topology_token asrc_tokens[] = {
-       {SOF_TKN_ASRC_RATE_IN, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
-               offsetof(struct sof_ipc_comp_asrc, source_rate)},
-       {SOF_TKN_ASRC_RATE_OUT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
-               offsetof(struct sof_ipc_comp_asrc, sink_rate)},
-       {SOF_TKN_ASRC_ASYNCHRONOUS_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD,
-               get_token_u32,
-               offsetof(struct sof_ipc_comp_asrc, asynchronous_mode)},
-       {SOF_TKN_ASRC_OPERATION_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD,
-               get_token_u32,
-               offsetof(struct sof_ipc_comp_asrc, operation_mode)},
-};
-
 /* Tone */
 static const struct sof_topology_token tone_tokens[] = {
 };
        return ret;
 }
 
-/*
- * ASRC Topology
- */
-
-static int sof_widget_load_asrc(struct snd_soc_component *scomp, int index,
-                               struct snd_sof_widget *swidget,
-                               struct snd_soc_tplg_dapm_widget *tw)
-{
-       struct snd_soc_tplg_private *private = &tw->priv;
-       struct sof_ipc_comp_asrc *asrc;
-       size_t ipc_size = sizeof(*asrc);
-       int ret;
-
-       asrc = (struct sof_ipc_comp_asrc *)
-              sof_comp_alloc(swidget, &ipc_size, index);
-       if (!asrc)
-               return -ENOMEM;
-
-       /* configure ASRC IPC message */
-       asrc->comp.type = SOF_COMP_ASRC;
-       asrc->config.hdr.size = sizeof(asrc->config);
-
-       ret = sof_parse_tokens(scomp, asrc, asrc_tokens,
-                              ARRAY_SIZE(asrc_tokens), private->array,
-                              le32_to_cpu(private->size));
-       if (ret != 0) {
-               dev_err(scomp->dev, "error: parse asrc tokens failed %d\n",
-                       private->size);
-               goto err;
-       }
-
-       ret = sof_parse_tokens(scomp, &asrc->config, comp_tokens,
-                              ARRAY_SIZE(comp_tokens), private->array,
-                              le32_to_cpu(private->size));
-       if (ret != 0) {
-               dev_err(scomp->dev, "error: parse asrc.cfg tokens failed %d\n",
-                       le32_to_cpu(private->size));
-               goto err;
-       }
-
-       dev_dbg(scomp->dev, "asrc %s: source rate %d sink rate %d "
-               "asynch %d operation %d\n",
-               swidget->widget->name, asrc->source_rate, asrc->sink_rate,
-               asrc->asynchronous_mode, asrc->operation_mode);
-       sof_dbg_comp_config(scomp, &asrc->config);
-
-       swidget->private = asrc;
-
-       return 0;
-err:
-       kfree(asrc);
-       return ret;
-}
-
 /*
  * Signal Generator Topology
  */
        case snd_soc_dapm_aif_out:
        case snd_soc_dapm_aif_in:
        case snd_soc_dapm_src:
+       case snd_soc_dapm_asrc:
        case snd_soc_dapm_mux:
        case snd_soc_dapm_demux:
                ret = sof_widget_parse_tokens(scomp, swidget, tw,  token_list, token_list_size);
                break;
-       case snd_soc_dapm_asrc:
-               ret = sof_widget_load_asrc(scomp, index, swidget, tw);
-               break;
        case snd_soc_dapm_siggen:
                ret = sof_widget_load_siggen(scomp, index, swidget, tw);
                break;