void __qcom_scm_init(void)
 {
-       u64 cmd;
-       struct arm_smccc_res res;
-       u32 fnid = SCM_SMC_FNID(QCOM_SCM_SVC_INFO, QCOM_SCM_INFO_IS_CALL_AVAIL);
-
-       /* First try a SMC64 call */
-       cmd = ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64,
-                                ARM_SMCCC_OWNER_SIP, fnid);
-
-       arm_smccc_smc(cmd, QCOM_SCM_ARGS(1), cmd & (~BIT(ARM_SMCCC_TYPE_SHIFT)),
-                     0, 0, 0, 0, 0, &res);
+       struct qcom_scm_desc desc = {
+               .svc = QCOM_SCM_SVC_INFO,
+               .cmd = QCOM_SCM_INFO_IS_CALL_AVAIL,
+               .args[0] = SCM_SMC_FNID(QCOM_SCM_SVC_INFO,
+                                       QCOM_SCM_INFO_IS_CALL_AVAIL) |
+                          (ARM_SMCCC_OWNER_SIP << ARM_SMCCC_OWNER_SHIFT),
+               .arginfo = QCOM_SCM_ARGS(1),
+               .owner = ARM_SMCCC_OWNER_SIP,
+       };
+       struct qcom_scm_res res;
+       int ret;
 
-       if (!res.a0 && res.a1)
-               qcom_smccc_convention = ARM_SMCCC_SMC_64;
-       else
-               qcom_smccc_convention = ARM_SMCCC_SMC_32;
+       qcom_smccc_convention = ARM_SMCCC_SMC_64;
+       // Device isn't required as there is only one argument - no device
+       // needed to dma_map_single to secure world
+       ret = qcom_scm_call_atomic(NULL, &desc, &res);
+       if (!ret && res.result[0] == 1)
+               goto out;
+
+       qcom_smccc_convention = ARM_SMCCC_SMC_32;
+       ret = qcom_scm_call_atomic(NULL, &desc, &res);
+       if (!ret && res.result[0] == 1)
+               goto out;
+
+       qcom_smccc_convention = -1;
+       BUG();
+out:
+       pr_info("QCOM SCM SMC Convention: %lld\n", qcom_smccc_convention);
 }
 
 bool __qcom_scm_pas_supported(struct device *dev, u32 peripheral)