irq = platform_get_irq_optional(pdev, 0);
        if (irq < 0) {
-               if (irq != -ENXIO)
-                       return irq;
+               if (irq != -ENXIO) {
+                       ret = irq;
+                       goto err;
+               }
        } else {
                ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler,
                                                IRQF_ONESHOT, "qcom-scm", __scm);
-               if (ret < 0)
-                       return dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n");
+               if (ret < 0) {
+                       dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n");
+                       goto err;
+               }
        }
 
        __get_convention();
                qcom_scm_disable_sdi();
 
        ret = of_reserved_mem_device_init(__scm->dev);
-       if (ret && ret != -ENODEV)
-               return dev_err_probe(__scm->dev, ret,
-                                    "Failed to setup the reserved memory region for TZ mem\n");
+       if (ret && ret != -ENODEV) {
+               dev_err_probe(__scm->dev, ret,
+                             "Failed to setup the reserved memory region for TZ mem\n");
+               goto err;
+       }
 
        ret = qcom_tzmem_enable(__scm->dev);
-       if (ret)
-               return dev_err_probe(__scm->dev, ret,
-                                    "Failed to enable the TrustZone memory allocator\n");
+       if (ret) {
+               dev_err_probe(__scm->dev, ret,
+                             "Failed to enable the TrustZone memory allocator\n");
+               goto err;
+       }
 
        memset(&pool_config, 0, sizeof(pool_config));
        pool_config.initial_size = 0;
        pool_config.max_size = SZ_256K;
 
        __scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config);
-       if (IS_ERR(__scm->mempool))
-               return dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
-                                    "Failed to create the SCM memory pool\n");
+       if (IS_ERR(__scm->mempool)) {
+               dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
+                             "Failed to create the SCM memory pool\n");
+               goto err;
+       }
 
        /*
         * Initialize the QSEECOM interface.
        WARN(ret < 0, "failed to initialize qseecom: %d\n", ret);
 
        return 0;
+
+err:
+       /* Paired with smp_load_acquire() in qcom_scm_is_available(). */
+       smp_store_release(&__scm, NULL);
+
+       return ret;
 }
 
 static void qcom_scm_shutdown(struct platform_device *pdev)