}
 EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);
 
-int qcom_scm_shm_bridge_enable(void)
+/*
+ * This is only supposed to be called once by the TZMem module. It takes the
+ * SCM struct device as argument and uses it to pass the call as at the time
+ * the SHM Bridge is enabled, the SCM is not yet fully set up and doesn't
+ * accept global user calls. Don't try to use the __scm pointer here.
+ */
+int qcom_scm_shm_bridge_enable(struct device *scm_dev)
 {
        int ret;
 
 
        struct qcom_scm_res res;
 
-       if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
+       if (!__qcom_scm_is_call_available(scm_dev, QCOM_SCM_SVC_MP,
                                          QCOM_SCM_MP_SHM_BRIDGE_ENABLE))
                return -EOPNOTSUPP;
 
-       ret = qcom_scm_call(__scm->dev, &desc, &res);
+       ret = qcom_scm_call(scm_dev, &desc, &res);
 
        if (ret)
                return ret;
 
                    struct qcom_scm_res *res);
 
 struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void);
+int qcom_scm_shm_bridge_enable(struct device *scm_dev);
 
 #define QCOM_SCM_SVC_BOOT              0x01
 #define QCOM_SCM_BOOT_SET_ADDR         0x01
 
 
 int qcom_scm_gpu_init_regs(u32 gpu_req);
 
-int qcom_scm_shm_bridge_enable(void);
 int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
                               u64 ipfn_and_s_perm_flags, u64 size_and_flags,
                               u64 ns_vmids, u64 *handle);