struct snd_soc_tplg_private *private = &tw->priv;
        struct sof_ipc_comp_volume *volume;
        struct snd_sof_control *scontrol;
+       size_t ipc_size = sizeof(*volume);
        int min_step;
        int max_step;
        int ret;
 
-       volume = kzalloc(sizeof(*volume), GFP_KERNEL);
+       volume = (struct sof_ipc_comp_volume *)
+                sof_comp_alloc(swidget, &ipc_size, index, core);
        if (!volume)
                return -ENOMEM;
 
        }
 
        /* configure volume IPC message */
-       volume->comp.hdr.size = sizeof(*volume);
-       volume->comp.hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_COMP_NEW;
-       volume->comp.id = swidget->comp_id;
        volume->comp.type = SOF_COMP_VOLUME;
-       volume->comp.pipeline_id = index;
-       volume->comp.core = core;
        volume->config.hdr.size = sizeof(volume->config);
 
        ret = sof_parse_tokens(scomp, volume, volume_tokens,
        }
 
        ret = sof_ipc_tx_message(sdev->ipc, volume->comp.hdr.cmd, volume,
-                                sizeof(*volume), r, sizeof(*r));
+                                ipc_size, r, sizeof(*r));
        if (ret >= 0)
                return ret;
 err: