diff options
author | Bhupesh Sharma <bhupesh.sharma@linaro.org> | 2022-05-24 12:15:37 +0530 |
---|---|---|
committer | Bhupesh Sharma <bhupesh.sharma@linaro.org> | 2022-07-06 10:30:27 +0530 |
commit | e7c207c948cfa57a82d1d793bcd8b31ef64e05d1 (patch) | |
tree | d1485d610d92d44c4fd0d71f991630db6f756cf7 | |
parent | 9e6eb1ce16ca0b97949ff51aeaa6168a28fef216 (diff) |
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 <amitk@kernel.org>
Cc: Thara Gopinath <thara.gopinath@gmail.com>
Cc: linux-pm@vger.kernel.org
Cc: linux-arm-msm@vger.kernel.org
Signed-off-by: Bhupesh Sharma <bhupesh.sharma@linaro.org>
(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 <bhupesh.sharma@linaro.org>
-rw-r--r-- | drivers/firmware/qcom_scm.c | 17 | ||||
-rw-r--r-- | drivers/firmware/qcom_scm.h | 4 | ||||
-rw-r--r-- | include/linux/qcom_scm.h | 3 |
3 files changed, 24 insertions, 0 deletions
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 |