From: Richard Acayan <mailingradian@gmail.com>
To: "Rafael J. Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
Zhang Rui <rui.zhang@intel.com>,
Lukasz Luba <lukasz.luba@arm.com>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Amit Kucheria <amitk@kernel.org>,
Thara Gopinath <thara.gopinath@gmail.com>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org,
devicetree@vger.kernel.org
Cc: Richard Acayan <mailingradian@gmail.com>
Subject: [PATCH v4 3/4] thermal/qcom/lmh: support SDM670 and its CPU clusters
Date: Fri, 27 Mar 2026 21:40:40 -0400 [thread overview]
Message-ID: <20260328014041.83777-4-mailingradian@gmail.com> (raw)
In-Reply-To: <20260328014041.83777-1-mailingradian@gmail.com>
The LMh driver was made for Qualcomm SoCs with clusters of 4 CPUs, but
some SoCs divide the CPUs into different sizes of clusters. In SDM670,
the first 6 CPUs are in the little cluster and the next 2 are in the big
cluster. Define the clusters in the match data and define the different
cluster configuration for SDM670.
Currently, this only supports 8 CPUs and tolerates linking to any CPU in
the cluster.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
drivers/thermal/qcom/lmh.c | 69 +++++++++++++++++++++++++++++++-------
1 file changed, 56 insertions(+), 13 deletions(-)
diff --git a/drivers/thermal/qcom/lmh.c b/drivers/thermal/qcom/lmh.c
index 3d072b7a4a6d..46c1e301f6c8 100644
--- a/drivers/thermal/qcom/lmh.c
+++ b/drivers/thermal/qcom/lmh.c
@@ -30,14 +30,17 @@
#define LMH_REG_DCVS_INTR_CLR 0x8
-#define LMH_ENABLE_ALGOS 1
-
struct lmh_hw_data {
void __iomem *base;
struct irq_domain *domain;
int irq;
};
+struct lmh_soc_data {
+ bool enable_algos;
+ u32 node_ids[8];
+};
+
static irqreturn_t lmh_handle_irq(int hw_irq, void *data)
{
struct lmh_hw_data *lmh_data = data;
@@ -100,8 +103,8 @@ static int lmh_probe(struct platform_device *pdev)
struct device_node *np = dev->of_node;
struct device_node *cpu_node;
struct lmh_hw_data *lmh_data;
+ const struct lmh_soc_data *match_data;
int temp_low, temp_high, temp_arm, cpu_id, ret;
- unsigned int enable_alg;
u32 node_id;
if (!qcom_scm_is_available())
@@ -144,10 +147,9 @@ static int lmh_probe(struct platform_device *pdev)
* for other platforms, revisit this to check if the <cpu-id, node-id> should be part
* of a dt match table.
*/
- if (cpu_id == 0) {
- node_id = LMH_CLUSTER0_NODE_ID;
- } else if (cpu_id == 4) {
- node_id = LMH_CLUSTER1_NODE_ID;
+ match_data = of_device_get_match_data(dev);
+ if (cpu_id >= 0 && cpu_id < 8) {
+ node_id = match_data->node_ids[cpu_id];
} else {
dev_err(dev, "Wrong CPU id associated with LMh node\n");
return -EINVAL;
@@ -156,9 +158,7 @@ static int lmh_probe(struct platform_device *pdev)
if (!qcom_scm_lmh_dcvsh_available())
return -EINVAL;
- enable_alg = (uintptr_t)of_device_get_match_data(dev);
-
- if (enable_alg) {
+ if (match_data->enable_algos) {
ret = qcom_scm_lmh_dcvsh(LMH_SUB_FN_CRNT, LMH_ALGO_MODE_ENABLE, 1,
LMH_NODE_DCVS, node_id, 0);
if (ret)
@@ -231,10 +231,53 @@ static int lmh_probe(struct platform_device *pdev)
return 0;
}
+static const struct lmh_soc_data sdm670_lmh_data = {
+ .enable_algos = true,
+ .node_ids = {
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ },
+};
+
+static const struct lmh_soc_data sdm845_lmh_data = {
+ .enable_algos = true,
+ .node_ids = {
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ },
+};
+
+static const struct lmh_soc_data sm8150_lmh_data = {
+ .enable_algos = false,
+ .node_ids = {
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER0_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ LMH_CLUSTER1_NODE_ID,
+ },
+};
+
static const struct of_device_id lmh_table[] = {
- { .compatible = "qcom,sc8180x-lmh", },
- { .compatible = "qcom,sdm845-lmh", .data = (void *)LMH_ENABLE_ALGOS},
- { .compatible = "qcom,sm8150-lmh", },
+ { .compatible = "qcom,sc8180x-lmh", .data = &sm8150_lmh_data },
+ { .compatible = "qcom,sdm670-lmh", .data = &sdm670_lmh_data },
+ { .compatible = "qcom,sdm845-lmh", .data = &sdm845_lmh_data },
+ { .compatible = "qcom,sm8150-lmh", .data = &sm8150_lmh_data },
{}
};
MODULE_DEVICE_TABLE(of, lmh_table);
--
2.53.0
next prev parent reply other threads:[~2026-03-28 1:40 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-28 1:40 [PATCH v4 0/4] SDM670 Basic SoC thermal zones Richard Acayan
2026-03-28 1:40 ` [PATCH v4 1/4] dt-bindings: thermal: tsens: add SDM670 compatible Richard Acayan
2026-03-28 1:40 ` [PATCH v4 2/4] dt-bindings: thermal: lmh: Add " Richard Acayan
2026-03-28 12:20 ` Krzysztof Kozlowski
2026-03-28 15:16 ` Richard Acayan
2026-03-28 1:40 ` Richard Acayan [this message]
2026-03-29 10:44 ` [PATCH v4 3/4] thermal/qcom/lmh: support SDM670 and its CPU clusters Dmitry Baryshkov
2026-03-30 10:32 ` Konrad Dybcio
2026-03-30 10:59 ` Dmitry Baryshkov
2026-03-30 13:50 ` Konrad Dybcio
2026-03-30 14:04 ` Dmitry Baryshkov
2026-03-30 10:04 ` Konrad Dybcio
2026-03-28 1:40 ` [PATCH v4 4/4] arm64: dts: qcom: sdm670: add thermal zones and thermal devices Richard Acayan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260328014041.83777-4-mailingradian@gmail.com \
--to=mailingradian@gmail.com \
--cc=amitk@kernel.org \
--cc=andersson@kernel.org \
--cc=conor+dt@kernel.org \
--cc=daniel.lezcano@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=rafael@kernel.org \
--cc=robh@kernel.org \
--cc=rui.zhang@intel.com \
--cc=thara.gopinath@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.