summaryrefslogtreecommitdiff
path: root/target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch
diff options
context:
space:
mode:
authordissent1 <be.dissent+github@gmail.com>2016-11-05 16:15:33 +0300
committerJohn Crispin <john@phrozen.org>2016-12-01 15:47:43 +0100
commitfef6a96d9e9e001a28b6a673c56ed79029457b5d (patch)
tree808f89926a7a7a2b3b29564e2070592ef983d948 /target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch
parent2b71f958b1d2022bd0c4dcaa458f5ba1b955f934 (diff)
downloadmtk-20170518-fef6a96d9e9e001a28b6a673c56ed79029457b5d.zip
mtk-20170518-fef6a96d9e9e001a28b6a673c56ed79029457b5d.tar.gz
mtk-20170518-fef6a96d9e9e001a28b6a673c56ed79029457b5d.tar.bz2
ipq806x: add thermal sensor driver
Allows to check cpu temperature. Huge thanks to @hnyman for valuable assistance! Signed-off-by: Pavel Kubelun <be.dissent@gmail.com>
Diffstat (limited to 'target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch')
-rw-r--r--target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch293
1 files changed, 293 insertions, 0 deletions
diff --git a/target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch b/target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch
new file mode 100644
index 0000000..671f461
--- /dev/null
+++ b/target/linux/ipq806x/patches-4.4/015-3-thermal-qcom-tsens-8974-Add-support-for-8974-family-of-SoCs.patch
@@ -0,0 +1,293 @@
+From 5e6703bd2d83548998848865cb9a9a795f31a311 Mon Sep 17 00:00:00 2001
+From: Rajendra Nayak <rnayak@codeaurora.org>
+Date: Thu, 5 May 2016 14:21:41 +0530
+Subject: thermal: qcom: tsens-8974: Add support for 8974 family of SoCs
+
+Add .calibrate support for 8974 family as part of tsens_ops.
+
+Based on the original code by Siddartha Mohanadoss and Stephen Boyd.
+
+Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
+Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
+Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+---
+ drivers/thermal/qcom/Makefile | 2 +-
+ drivers/thermal/qcom/tsens-8974.c | 244 ++++++++++++++++++++++++++++++++++++++
+ drivers/thermal/qcom/tsens.c | 1 +
+ drivers/thermal/qcom/tsens.h | 2 +-
+ 4 files changed, 247 insertions(+), 2 deletions(-)
+ create mode 100644 drivers/thermal/qcom/tsens-8974.c
+
+--- a/drivers/thermal/qcom/Makefile
++++ b/drivers/thermal/qcom/Makefile
+@@ -1,2 +1,2 @@
+ obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o
+-qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o
++qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o
+--- /dev/null
++++ b/drivers/thermal/qcom/tsens-8974.c
+@@ -0,0 +1,244 @@
++/*
++ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 and
++ * only version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/platform_device.h>
++#include "tsens.h"
++
++/* eeprom layout data for 8974 */
++#define BASE1_MASK 0xff
++#define S0_P1_MASK 0x3f00
++#define S1_P1_MASK 0xfc000
++#define S2_P1_MASK 0x3f00000
++#define S3_P1_MASK 0xfc000000
++#define S4_P1_MASK 0x3f
++#define S5_P1_MASK 0xfc0
++#define S6_P1_MASK 0x3f000
++#define S7_P1_MASK 0xfc0000
++#define S8_P1_MASK 0x3f000000
++#define S8_P1_MASK_BKP 0x3f
++#define S9_P1_MASK 0x3f
++#define S9_P1_MASK_BKP 0xfc0
++#define S10_P1_MASK 0xfc0
++#define S10_P1_MASK_BKP 0x3f000
++#define CAL_SEL_0_1 0xc0000000
++#define CAL_SEL_2 0x40000000
++#define CAL_SEL_SHIFT 30
++#define CAL_SEL_SHIFT_2 28
++
++#define S0_P1_SHIFT 8
++#define S1_P1_SHIFT 14
++#define S2_P1_SHIFT 20
++#define S3_P1_SHIFT 26
++#define S5_P1_SHIFT 6
++#define S6_P1_SHIFT 12
++#define S7_P1_SHIFT 18
++#define S8_P1_SHIFT 24
++#define S9_P1_BKP_SHIFT 6
++#define S10_P1_SHIFT 6
++#define S10_P1_BKP_SHIFT 12
++
++#define BASE2_SHIFT 12
++#define BASE2_BKP_SHIFT 18
++#define S0_P2_SHIFT 20
++#define S0_P2_BKP_SHIFT 26
++#define S1_P2_SHIFT 26
++#define S2_P2_BKP_SHIFT 6
++#define S3_P2_SHIFT 6
++#define S3_P2_BKP_SHIFT 12
++#define S4_P2_SHIFT 12
++#define S4_P2_BKP_SHIFT 18
++#define S5_P2_SHIFT 18
++#define S5_P2_BKP_SHIFT 24
++#define S6_P2_SHIFT 24
++#define S7_P2_BKP_SHIFT 6
++#define S8_P2_SHIFT 6
++#define S8_P2_BKP_SHIFT 12
++#define S9_P2_SHIFT 12
++#define S9_P2_BKP_SHIFT 18
++#define S10_P2_SHIFT 18
++#define S10_P2_BKP_SHIFT 24
++
++#define BASE2_MASK 0xff000
++#define BASE2_BKP_MASK 0xfc0000
++#define S0_P2_MASK 0x3f00000
++#define S0_P2_BKP_MASK 0xfc000000
++#define S1_P2_MASK 0xfc000000
++#define S1_P2_BKP_MASK 0x3f
++#define S2_P2_MASK 0x3f
++#define S2_P2_BKP_MASK 0xfc0
++#define S3_P2_MASK 0xfc0
++#define S3_P2_BKP_MASK 0x3f000
++#define S4_P2_MASK 0x3f000
++#define S4_P2_BKP_MASK 0xfc0000
++#define S5_P2_MASK 0xfc0000
++#define S5_P2_BKP_MASK 0x3f000000
++#define S6_P2_MASK 0x3f000000
++#define S6_P2_BKP_MASK 0x3f
++#define S7_P2_MASK 0x3f
++#define S7_P2_BKP_MASK 0xfc0
++#define S8_P2_MASK 0xfc0
++#define S8_P2_BKP_MASK 0x3f000
++#define S9_P2_MASK 0x3f000
++#define S9_P2_BKP_MASK 0xfc0000
++#define S10_P2_MASK 0xfc0000
++#define S10_P2_BKP_MASK 0x3f000000
++
++#define BKP_SEL 0x3
++#define BKP_REDUN_SEL 0xe0000000
++#define BKP_REDUN_SHIFT 29
++
++#define BIT_APPEND 0x3
++
++static int calibrate_8974(struct tsens_device *tmdev)
++{
++ int base1 = 0, base2 = 0, i;
++ u32 p1[11], p2[11];
++ int mode = 0;
++ u32 *calib, *bkp;
++ u32 calib_redun_sel;
++
++ calib = (u32 *)qfprom_read(tmdev->dev, "calib");
++ if (IS_ERR(calib))
++ return PTR_ERR(calib);
++
++ bkp = (u32 *)qfprom_read(tmdev->dev, "calib_backup");
++ if (IS_ERR(bkp))
++ return PTR_ERR(bkp);
++
++ calib_redun_sel = bkp[1] & BKP_REDUN_SEL;
++ calib_redun_sel >>= BKP_REDUN_SHIFT;
++
++ if (calib_redun_sel == BKP_SEL) {
++ mode = (calib[4] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
++ mode |= (calib[5] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
++
++ switch (mode) {
++ case TWO_PT_CALIB:
++ base2 = (bkp[2] & BASE2_BKP_MASK) >> BASE2_BKP_SHIFT;
++ p2[0] = (bkp[2] & S0_P2_BKP_MASK) >> S0_P2_BKP_SHIFT;
++ p2[1] = (bkp[3] & S1_P2_BKP_MASK);
++ p2[2] = (bkp[3] & S2_P2_BKP_MASK) >> S2_P2_BKP_SHIFT;
++ p2[3] = (bkp[3] & S3_P2_BKP_MASK) >> S3_P2_BKP_SHIFT;
++ p2[4] = (bkp[3] & S4_P2_BKP_MASK) >> S4_P2_BKP_SHIFT;
++ p2[5] = (calib[4] & S5_P2_BKP_MASK) >> S5_P2_BKP_SHIFT;
++ p2[6] = (calib[5] & S6_P2_BKP_MASK);
++ p2[7] = (calib[5] & S7_P2_BKP_MASK) >> S7_P2_BKP_SHIFT;
++ p2[8] = (calib[5] & S8_P2_BKP_MASK) >> S8_P2_BKP_SHIFT;
++ p2[9] = (calib[5] & S9_P2_BKP_MASK) >> S9_P2_BKP_SHIFT;
++ p2[10] = (calib[5] & S10_P2_BKP_MASK) >> S10_P2_BKP_SHIFT;
++ /* Fall through */
++ case ONE_PT_CALIB:
++ case ONE_PT_CALIB2:
++ base1 = bkp[0] & BASE1_MASK;
++ p1[0] = (bkp[0] & S0_P1_MASK) >> S0_P1_SHIFT;
++ p1[1] = (bkp[0] & S1_P1_MASK) >> S1_P1_SHIFT;
++ p1[2] = (bkp[0] & S2_P1_MASK) >> S2_P1_SHIFT;
++ p1[3] = (bkp[0] & S3_P1_MASK) >> S3_P1_SHIFT;
++ p1[4] = (bkp[1] & S4_P1_MASK);
++ p1[5] = (bkp[1] & S5_P1_MASK) >> S5_P1_SHIFT;
++ p1[6] = (bkp[1] & S6_P1_MASK) >> S6_P1_SHIFT;
++ p1[7] = (bkp[1] & S7_P1_MASK) >> S7_P1_SHIFT;
++ p1[8] = (bkp[2] & S8_P1_MASK_BKP) >> S8_P1_SHIFT;
++ p1[9] = (bkp[2] & S9_P1_MASK_BKP) >> S9_P1_BKP_SHIFT;
++ p1[10] = (bkp[2] & S10_P1_MASK_BKP) >> S10_P1_BKP_SHIFT;
++ break;
++ }
++ } else {
++ mode = (calib[1] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
++ mode |= (calib[3] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
++
++ switch (mode) {
++ case TWO_PT_CALIB:
++ base2 = (calib[2] & BASE2_MASK) >> BASE2_SHIFT;
++ p2[0] = (calib[2] & S0_P2_MASK) >> S0_P2_SHIFT;
++ p2[1] = (calib[2] & S1_P2_MASK) >> S1_P2_SHIFT;
++ p2[2] = (calib[3] & S2_P2_MASK);
++ p2[3] = (calib[3] & S3_P2_MASK) >> S3_P2_SHIFT;
++ p2[4] = (calib[3] & S4_P2_MASK) >> S4_P2_SHIFT;
++ p2[5] = (calib[3] & S5_P2_MASK) >> S5_P2_SHIFT;
++ p2[6] = (calib[3] & S6_P2_MASK) >> S6_P2_SHIFT;
++ p2[7] = (calib[4] & S7_P2_MASK);
++ p2[8] = (calib[4] & S8_P2_MASK) >> S8_P2_SHIFT;
++ p2[9] = (calib[4] & S9_P2_MASK) >> S9_P2_SHIFT;
++ p2[10] = (calib[4] & S10_P2_MASK) >> S10_P2_SHIFT;
++ /* Fall through */
++ case ONE_PT_CALIB:
++ case ONE_PT_CALIB2:
++ base1 = calib[0] & BASE1_MASK;
++ p1[0] = (calib[0] & S0_P1_MASK) >> S0_P1_SHIFT;
++ p1[1] = (calib[0] & S1_P1_MASK) >> S1_P1_SHIFT;
++ p1[2] = (calib[0] & S2_P1_MASK) >> S2_P1_SHIFT;
++ p1[3] = (calib[0] & S3_P1_MASK) >> S3_P1_SHIFT;
++ p1[4] = (calib[1] & S4_P1_MASK);
++ p1[5] = (calib[1] & S5_P1_MASK) >> S5_P1_SHIFT;
++ p1[6] = (calib[1] & S6_P1_MASK) >> S6_P1_SHIFT;
++ p1[7] = (calib[1] & S7_P1_MASK) >> S7_P1_SHIFT;
++ p1[8] = (calib[1] & S8_P1_MASK) >> S8_P1_SHIFT;
++ p1[9] = (calib[2] & S9_P1_MASK);
++ p1[10] = (calib[2] & S10_P1_MASK) >> S10_P1_SHIFT;
++ break;
++ }
++ }
++
++ switch (mode) {
++ case ONE_PT_CALIB:
++ for (i = 0; i < tmdev->num_sensors; i++)
++ p1[i] += (base1 << 2) | BIT_APPEND;
++ break;
++ case TWO_PT_CALIB:
++ for (i = 0; i < tmdev->num_sensors; i++) {
++ p2[i] += base2;
++ p2[i] <<= 2;
++ p2[i] |= BIT_APPEND;
++ }
++ /* Fall through */
++ case ONE_PT_CALIB2:
++ for (i = 0; i < tmdev->num_sensors; i++) {
++ p1[i] += base1;
++ p1[i] <<= 2;
++ p1[i] |= BIT_APPEND;
++ }
++ break;
++ default:
++ for (i = 0; i < tmdev->num_sensors; i++)
++ p2[i] = 780;
++ p1[0] = 502;
++ p1[1] = 509;
++ p1[2] = 503;
++ p1[3] = 509;
++ p1[4] = 505;
++ p1[5] = 509;
++ p1[6] = 507;
++ p1[7] = 510;
++ p1[8] = 508;
++ p1[9] = 509;
++ p1[10] = 508;
++ break;
++ }
++
++ compute_intercept_slope(tmdev, p1, p2, mode);
++
++ return 0;
++}
++
++const struct tsens_ops ops_8974 = {
++ .init = init_common,
++ .calibrate = calibrate_8974,
++ .get_temp = get_temp_common,
++};
++
++const struct tsens_data data_8974 = {
++ .num_sensors = 11,
++ .ops = &ops_8974,
++};
+--- a/drivers/thermal/qcom/tsens.c
++++ b/drivers/thermal/qcom/tsens.c
+@@ -68,6 +68,7 @@ static const struct of_device_id tsens_t
+ .data = &data_8916,
+ }, {
+ .compatible = "qcom,msm8974-tsens",
++ .data = &data_8974,
+ },
+ {}
+ };
+--- a/drivers/thermal/qcom/tsens.h
++++ b/drivers/thermal/qcom/tsens.h
+@@ -87,6 +87,6 @@ void compute_intercept_slope(struct tsen
+ int init_common(struct tsens_device *);
+ int get_temp_common(struct tsens_device *, int, int *);
+
+-extern const struct tsens_data data_8916;
++extern const struct tsens_data data_8916, data_8974;
+
+ #endif /* __QCOM_TSENS_H__ */