From e7c207c948cfa57a82d1d793bcd8b31ef64e05d1 Mon Sep 17 00:00:00 2001 From: Bhupesh Sharma Date: Tue, 24 May 2022 12:15:37 +0530 Subject: FROMLIST: firmware: qcom_scm: Add support for tsens reinit workaround Some versions of QCoM tsens controller might enter a 'bad state' while running stability tests causing sensor temperatures/interrupts status to be in an 'invalid' state. It is recommended to re-initialize the tsens controller via trustzone (secure registers) using scm call(s) when that happens. Add support for the same in the qcom_scm driver. Cc: Amit Kucheria Cc: Thara Gopinath Cc: linux-pm@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org Signed-off-by: Bhupesh Sharma (am from https://lore.kernel.org/linux-arm-msm/20220701145815.2037993-2-bhupesh.sharma@linaro.org/) - list of conflicts: downstream only smc patches cause conflict in 'qcom_scm.h' Signed-off-by: Bhupesh Sharma --- drivers/firmware/qcom_scm.c | 17 +++++++++++++++++ drivers/firmware/qcom_scm.h | 4 ++++ include/linux/qcom_scm.h | 3 +++ 3 files changed, 24 insertions(+) diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index c881f2fb2ff7..1abeace17205 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -783,6 +783,23 @@ int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, } EXPORT_SYMBOL(qcom_scm_mem_protect_video_var); +int qcom_scm_tsens_reinit(int *tsens_ret) +{ + unsigned int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_TSENS, + .cmd = QCOM_SCM_TSENS_INIT_ID, + }; + struct qcom_scm_res res; + + ret = qcom_scm_call(__scm->dev, &desc, &res); + if (tsens_ret) + *tsens_ret = res.result[0]; + + return ret; +} +EXPORT_SYMBOL(qcom_scm_tsens_reinit); + static int __qcom_scm_assign_mem(struct device *dev, phys_addr_t mem_region, size_t mem_sz, phys_addr_t src, size_t src_sz, phys_addr_t dest, size_t dest_sz) diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 89cee14f132c..a40c7be9db62 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -89,6 +89,10 @@ extern int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc, #define QCOM_SCM_PIL_PAS_IS_SUPPORTED 0x07 #define QCOM_SCM_PIL_PAS_MSS_RESET 0x0a +/* TSENS Services and Function IDs */ +#define QCOM_SCM_SVC_TSENS 0x1E +#define QCOM_SCM_TSENS_INIT_ID 0x5 + #define QCOM_SCM_SVC_IO 0x05 #define QCOM_SCM_IO_READ 0x01 #define QCOM_SCM_IO_WRITE 0x02 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 4981bf44a3fa..e3db34b92083 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -121,4 +121,7 @@ extern int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr extern int qcom_scm_invoke_callback_response(phys_addr_t out_buf, size_t out_buf_size, int *result, u64 *response_type, unsigned int *data); + +extern int qcom_scm_tsens_reinit(int *tsens_ret); + #endif -- cgit v1.2.3