aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBhupesh Sharma <bhupesh.sharma@linaro.org>2022-05-24 12:15:37 +0530
committerBhupesh Sharma <bhupesh.sharma@linaro.org>2022-07-06 10:30:27 +0530
commite7c207c948cfa57a82d1d793bcd8b31ef64e05d1 (patch)
treed1485d610d92d44c4fd0d71f991630db6f756cf7
parent9e6eb1ce16ca0b97949ff51aeaa6168a28fef216 (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.c17
-rw-r--r--drivers/firmware/qcom_scm.h4
-rw-r--r--include/linux/qcom_scm.h3
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