2023-06-07 10:58:27

by Stephan Gerhold

[permalink] [raw]
Subject: [PATCH v5 0/6] thermal: qcom: tsens: Fix MDM9607, add MSM8909

Make the MDM9607 thermal sensor support consistent with Qualcomm's
vendor kernel (msm-3.18) by applying the correct default slope values
and adding "correction factors" to the factory calibration values in the
fuses. Use the same functionality to add the very similar MSM8909 SoC to
the tsens driver.

---
Changes in v5:
- Rebase on top of MSM8226 series that way applied by Daniel
(https://lore.kernel.org/linux-arm-msm/[email protected]/)
- Add review tags from Dmitry
- Link to v4: https://lore.kernel.org/r/[email protected]
Changes in v4:
- Mostly just resend, explicitly initialize zero values for
the MSM8909 p1/p2_calib_offset for better clarity (Konrad)
- Link to v3: https://lore.kernel.org/r/[email protected]
Changes in v3:
- Drop now unused definition reported by kernel test robot
Changes in v2:
- Rewrite on top of per-sensor nvmem cell changes that landed in 6.3
- Add patches to fix existing support for MDM9607

---
Stephan Gerhold (6):
thermal: qcom: tsens: Drop unused legacy structs
thermal: qcom: tsens-v0_1: Fix mdm9607 slope values
thermal: qcom: tsens-v0_1: Add mdm9607 correction offsets
dt-bindings: thermal: qcom-tsens: Drop redundant compatibles
dt-bindings: thermal: qcom-tsens: Add MSM8909 compatible
thermal: qcom: tsens-v0_1: Add MSM8909 data

.../devicetree/bindings/thermal/qcom-tsens.yaml | 23 +----
drivers/thermal/qcom/tsens-v0_1.c | 101 +++++++++++++--------
drivers/thermal/qcom/tsens-v1.c | 22 -----
drivers/thermal/qcom/tsens.c | 19 +++-
drivers/thermal/qcom/tsens.h | 6 +-
5 files changed, 88 insertions(+), 83 deletions(-)
---
base-commit: 7e25e9706bbade1b3dc670fad44a920d087064df
change-id: 20230508-msm8909-tsens-6733a6d415be

Best regards,
--
Stephan Gerhold
Kernkonzept GmbH at Dresden, Germany, HRB 31129, CEO Dr.-Ing. Michael Hohmuth



2023-06-07 10:59:01

by Stephan Gerhold

[permalink] [raw]
Subject: [PATCH v5 6/6] thermal: qcom: tsens-v0_1: Add MSM8909 data

The MSM8909 SoC has 5 thermal sensors in a TSENS v0.1 block. Like
MDM9607 it uses a non-standard default slope value of 3000 [1] and needs
per-sensor "correction factors" to workaround issues with the factory
calibration [2].

[1]: https://git.codelinaro.org/clo/la/kernel/msm-3.18/-/blob/LA.UM.7.7.c26-09100-8x09.0/arch/arm/boot/dts/qcom/msm8909.dtsi#L476
[2]: https://git.codelinaro.org/clo/la/kernel/msm-3.18/-/commit/6df022c6d0c2c1b4a5a6c2124dba4d57910c0911

Reviewed-by: Konrad Dybcio <[email protected]>
Reviewed-by: Dmitry Baryshkov <[email protected]>
Signed-off-by: Stephan Gerhold <[email protected]>
---
drivers/thermal/qcom/tsens-v0_1.c | 36 +++++++++++++++++++++++++++++++++++-
drivers/thermal/qcom/tsens.c | 3 +++
drivers/thermal/qcom/tsens.h | 2 +-
3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/qcom/tsens-v0_1.c b/drivers/thermal/qcom/tsens-v0_1.c
index 4a55a8ea0043..a941b4241b0a 100644
--- a/drivers/thermal/qcom/tsens-v0_1.c
+++ b/drivers/thermal/qcom/tsens-v0_1.c
@@ -219,6 +219,27 @@ static int __init init_8226(struct tsens_priv *priv)
return init_common(priv);
}

+static int __init init_8909(struct tsens_priv *priv)
+{
+ int i;
+
+ for (i = 0; i < priv->num_sensors; ++i)
+ priv->sensor[i].slope = 3000;
+
+ priv->sensor[0].p1_calib_offset = 0;
+ priv->sensor[0].p2_calib_offset = 0;
+ priv->sensor[1].p1_calib_offset = -10;
+ priv->sensor[1].p2_calib_offset = -6;
+ priv->sensor[2].p1_calib_offset = 0;
+ priv->sensor[2].p2_calib_offset = 0;
+ priv->sensor[3].p1_calib_offset = -9;
+ priv->sensor[3].p2_calib_offset = -9;
+ priv->sensor[4].p1_calib_offset = -8;
+ priv->sensor[4].p2_calib_offset = -10;
+
+ return init_common(priv);
+}
+
static int __init init_8939(struct tsens_priv *priv) {
priv->sensor[0].slope = 2911;
priv->sensor[1].slope = 2789;
@@ -255,7 +276,7 @@ static int __init init_9607(struct tsens_priv *priv)
return init_common(priv);
}

-/* v0.1: 8226, 8916, 8939, 8974, 9607 */
+/* v0.1: 8226, 8909, 8916, 8939, 8974, 9607 */

static struct tsens_features tsens_v0_1_feat = {
.ver_major = VER_0_1,
@@ -323,6 +344,19 @@ struct tsens_plat_data data_8226 = {
.fields = tsens_v0_1_regfields,
};

+static const struct tsens_ops ops_8909 = {
+ .init = init_8909,
+ .calibrate = tsens_calibrate_common,
+ .get_temp = get_temp_common,
+};
+
+struct tsens_plat_data data_8909 = {
+ .num_sensors = 5,
+ .ops = &ops_8909,
+ .feat = &tsens_v0_1_feat,
+ .fields = tsens_v0_1_regfields,
+};
+
static const struct tsens_ops ops_8916 = {
.init = init_common,
.calibrate = calibrate_8916,
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index 9dd5e4b70911..1ab165370fb0 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -1112,6 +1112,9 @@ static const struct of_device_id tsens_table[] = {
}, {
.compatible = "qcom,msm8226-tsens",
.data = &data_8226,
+ }, {
+ .compatible = "qcom,msm8909-tsens",
+ .data = &data_8909,
}, {
.compatible = "qcom,msm8916-tsens",
.data = &data_8916,
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
index 1cd8f4fe0971..2805de1c6827 100644
--- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h
@@ -639,7 +639,7 @@ int get_temp_common(const struct tsens_sensor *s, int *temp);
extern struct tsens_plat_data data_8960;

/* TSENS v0.1 targets */
-extern struct tsens_plat_data data_8226, data_8916, data_8939, data_8974, data_9607;
+extern struct tsens_plat_data data_8226, data_8909, data_8916, data_8939, data_8974, data_9607;

/* TSENS v1 targets */
extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956;

--
2.30.2