apm->gdev = gdev;
        init_waitqueue_head(&apm->wait);
 
+       INIT_LIST_HEAD(&apm->widget_list);
        idr_init(&apm->graph_idr);
        idr_init(&apm->graph_info_idr);
        idr_init(&apm->sub_graphs_idr);
 
 #include "audioreach.h"
 
 struct snd_ar_control {
+       u32 graph_id; /* Graph ID */
        u32 sgid; /* Sub Graph ID */
+       u32 module_instance_id; /* Connected Module Instance ID */
+       struct snd_soc_dapm_widget *w;
+       struct list_head node;
        struct snd_soc_component *scomp;
 };
 
        struct snd_soc_tplg_vendor_value_elem *w_elem;
        struct snd_soc_tplg_vendor_array *w_array;
        struct snd_ar_control *scontrol;
+       struct q6apm *data = dev_get_drvdata(component->dev);
        struct snd_soc_dobj *dobj;
        int tkn_count = 0;
 
                case AR_TKN_U32_SUB_GRAPH_INSTANCE_ID:
                        scontrol->sgid = le32_to_cpu(w_elem->value);
                        break;
+               case AR_TKN_DAI_INDEX:
+                       scontrol->graph_id = le32_to_cpu(w_elem->value);
+                       break;
                default: /* ignore other tokens */
                        break;
                }
                w_elem++;
        }
 
+       scontrol->w = w;
+       list_add_tail(&scontrol->node, &data->widget_list);
+
        return 0;
 }
 
 
        if (w->id == snd_soc_dapm_mixer) {
                /* virtual widget */
-               kfree(dobj->private);
+               struct snd_ar_control *scontrol = dobj->private;
+
+               list_del(&scontrol->node);
+               kfree(scontrol);
                return 0;
        }
 
                case AR_TKN_U32_SUB_GRAPH_INSTANCE_ID:
                        scontrol->sgid = le32_to_cpu(c_elem->value);
                        break;
+               case AR_TKN_DAI_INDEX:
+                       scontrol->graph_id = le32_to_cpu(c_elem->value);
+                       break;
                default:
                        /* Ignore other tokens */
                        break;