struct device_opp *dev_opp = NULL;
        struct dev_pm_opp *opp, *new_opp;
        struct list_head *head;
+       int ret;
 
        /* allocate new OPP node */
        new_opp = kzalloc(sizeof(*new_opp), GFP_KERNEL);
        if (IS_ERR(dev_opp)) {
                dev_opp = add_device_opp(dev);
                if (!dev_opp) {
-                       mutex_unlock(&dev_opp_list_lock);
-                       kfree(new_opp);
-                       return -ENOMEM;
+                       ret = -ENOMEM;
+                       goto free_opp;
                }
 
                head = &dev_opp->opp_list;
 
        /* Duplicate OPPs ? */
        if (new_opp->rate == opp->rate) {
-               int ret = opp->available && new_opp->u_volt == opp->u_volt ?
+               ret = opp->available && new_opp->u_volt == opp->u_volt ?
                        0 : -EEXIST;
 
                dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
                         __func__, opp->rate, opp->u_volt, opp->available,
                         new_opp->rate, new_opp->u_volt, new_opp->available);
-               mutex_unlock(&dev_opp_list_lock);
-               kfree(new_opp);
-               return ret;
+               goto free_opp;
        }
 
 list_add:
         */
        srcu_notifier_call_chain(&dev_opp->srcu_head, OPP_EVENT_ADD, new_opp);
        return 0;
+
+free_opp:
+       mutex_unlock(&dev_opp_list_lock);
+       kfree(new_opp);
+       return ret;
 }
 
 /**