for (id = 0; id < smsm->num_hosts; id++) {
                ret = smsm_parse_ipc(smsm, id);
                if (ret < 0)
-                       return ret;
+                       goto out_put;
        }
 
        /* Acquire the main SMSM state vector */
                              smsm->num_entries * sizeof(u32));
        if (ret < 0 && ret != -EEXIST) {
                dev_err(&pdev->dev, "unable to allocate shared state entry\n");
-               return ret;
+               goto out_put;
        }
 
        states = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_SMSM_SHARED_STATE, NULL);
        if (IS_ERR(states)) {
                dev_err(&pdev->dev, "Unable to acquire shared state entry\n");
-               return PTR_ERR(states);
+               ret = PTR_ERR(states);
+               goto out_put;
        }
 
        /* Acquire the list of interrupt mask vectors */
        ret = qcom_smem_alloc(QCOM_SMEM_HOST_ANY, SMEM_SMSM_CPU_INTR_MASK, size);
        if (ret < 0 && ret != -EEXIST) {
                dev_err(&pdev->dev, "unable to allocate smsm interrupt mask\n");
-               return ret;
+               goto out_put;
        }
 
        intr_mask = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_SMSM_CPU_INTR_MASK, NULL);
        if (IS_ERR(intr_mask)) {
                dev_err(&pdev->dev, "unable to acquire shared memory interrupt mask\n");
-               return PTR_ERR(intr_mask);
+               ret = PTR_ERR(intr_mask);
+               goto out_put;
        }
 
        /* Setup the reference to the local state bits */
        smsm->state = qcom_smem_state_register(local_node, &smsm_state_ops, smsm);
        if (IS_ERR(smsm->state)) {
                dev_err(smsm->dev, "failed to register qcom_smem_state\n");
-               return PTR_ERR(smsm->state);
+               ret = PTR_ERR(smsm->state);
+               goto out_put;
        }
 
        /* Register handlers for remote processor entries of interest. */
        }
 
        platform_set_drvdata(pdev, smsm);
+       of_node_put(local_node);
 
        return 0;
 
 unwind_interfaces:
+       of_node_put(node);
        for (id = 0; id < smsm->num_entries; id++)
                if (smsm->entries[id].domain)
                        irq_domain_remove(smsm->entries[id].domain);
 
        qcom_smem_state_unregister(smsm->state);
-
+out_put:
+       of_node_put(local_node);
        return ret;
 }