if (dobj->ops && dobj->ops->widget_unload)
                dobj->ops->widget_unload(comp, dobj);
 
+       if (!w->kcontrols)
+               goto free_news;
+
        /*
         * Dynamic Widgets either have 1..N enum kcontrols or mixers.
         * The enum may either have an array of values or strings.
 
                        kfree(se);
                }
-               kfree(w->kcontrol_news);
        } else {
                /* volume mixer or bytes controls */
                for (i = 0; i < w->num_kcontrols; i++) {
                        kfree((void *)kcontrol->private_value);
                        snd_ctl_remove(card, kcontrol);
                }
-               kfree(w->kcontrol_news);
        }
+
+free_news:
+       kfree(w->kcontrol_news);
+
        /* widget w is freed by soc-dapm.c */
 }