|
@@ -91,6 +91,7 @@ static int qcom_scm_call(struct device *dev, u32 svc_id, u32 cmd_id,
|
|
|
dma_addr_t args_phys = 0;
|
|
|
void *args_virt = NULL;
|
|
|
size_t alloc_len;
|
|
|
+ struct arm_smccc_quirk quirk = {.id = ARM_SMCCC_QUIRK_QCOM_A6};
|
|
|
|
|
|
if (unlikely(arglen > N_REGISTER_ARGS)) {
|
|
|
alloc_len = N_EXT_QCOM_SCM_ARGS * sizeof(u64);
|
|
@@ -131,10 +132,16 @@ static int qcom_scm_call(struct device *dev, u32 svc_id, u32 cmd_id,
|
|
|
qcom_smccc_convention,
|
|
|
ARM_SMCCC_OWNER_SIP, fn_id);
|
|
|
|
|
|
+ quirk.state.a6 = 0;
|
|
|
+
|
|
|
do {
|
|
|
- arm_smccc_smc(cmd, desc->arginfo, desc->args[0],
|
|
|
- desc->args[1], desc->args[2], x5, 0, 0,
|
|
|
- res);
|
|
|
+ arm_smccc_smc_quirk(cmd, desc->arginfo, desc->args[0],
|
|
|
+ desc->args[1], desc->args[2], x5,
|
|
|
+ quirk.state.a6, 0, res, &quirk);
|
|
|
+
|
|
|
+ if (res->a0 == QCOM_SCM_INTERRUPTED)
|
|
|
+ cmd = res->a0;
|
|
|
+
|
|
|
} while (res->a0 == QCOM_SCM_INTERRUPTED);
|
|
|
|
|
|
mutex_unlock(&qcom_scm_lock);
|