diff options
Diffstat (limited to 'target/linux/ipq806x/patches-4.4/015-2-thermal-qcom-tsens-8916-Add-support-for-8916-family-of-SoCs.patch')
-rw-r--r-- | target/linux/ipq806x/patches-4.4/015-2-thermal-qcom-tsens-8916-Add-support-for-8916-family-of-SoCs.patch | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/target/linux/ipq806x/patches-4.4/015-2-thermal-qcom-tsens-8916-Add-support-for-8916-family-of-SoCs.patch b/target/linux/ipq806x/patches-4.4/015-2-thermal-qcom-tsens-8916-Add-support-for-8916-family-of-SoCs.patch new file mode 100644 index 0000000..d076196 --- /dev/null +++ b/target/linux/ipq806x/patches-4.4/015-2-thermal-qcom-tsens-8916-Add-support-for-8916-family-of-SoCs.patch @@ -0,0 +1,165 @@ +From 840a5bd3ed3fdd62456d4d26c3128ec10496555b Mon Sep 17 00:00:00 2001 +From: Rajendra Nayak <rnayak@codeaurora.org> +Date: Thu, 5 May 2016 14:21:40 +0530 +Subject: thermal: qcom: tsens-8916: Add support for 8916 family of SoCs + +Add support to calibrate sensors on 8916 family and also add common +functions to read temperature from sensors (This can be reused on +other SoCs having similar TSENS device) +The calibration data is read from eeprom using the generic nvmem +framework apis. + +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-8916.c | 113 ++++++++++++++++++++++++++++++++++++++ + drivers/thermal/qcom/tsens.c | 1 + + drivers/thermal/qcom/tsens.h | 2 + + 4 files changed, 117 insertions(+), 1 deletion(-) + create mode 100644 drivers/thermal/qcom/tsens-8916.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 ++qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o +--- /dev/null ++++ b/drivers/thermal/qcom/tsens-8916.c +@@ -0,0 +1,113 @@ ++/* ++ * 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 8916 */ ++#define BASE0_MASK 0x0000007f ++#define BASE1_MASK 0xfe000000 ++#define BASE0_SHIFT 0 ++#define BASE1_SHIFT 25 ++ ++#define S0_P1_MASK 0x00000f80 ++#define S1_P1_MASK 0x003e0000 ++#define S2_P1_MASK 0xf8000000 ++#define S3_P1_MASK 0x000003e0 ++#define S4_P1_MASK 0x000f8000 ++ ++#define S0_P2_MASK 0x0001f000 ++#define S1_P2_MASK 0x07c00000 ++#define S2_P2_MASK 0x0000001f ++#define S3_P2_MASK 0x00007c00 ++#define S4_P2_MASK 0x01f00000 ++ ++#define S0_P1_SHIFT 7 ++#define S1_P1_SHIFT 17 ++#define S2_P1_SHIFT 27 ++#define S3_P1_SHIFT 5 ++#define S4_P1_SHIFT 15 ++ ++#define S0_P2_SHIFT 12 ++#define S1_P2_SHIFT 22 ++#define S2_P2_SHIFT 0 ++#define S3_P2_SHIFT 10 ++#define S4_P2_SHIFT 20 ++ ++#define CAL_SEL_MASK 0xe0000000 ++#define CAL_SEL_SHIFT 29 ++ ++static int calibrate_8916(struct tsens_device *tmdev) ++{ ++ int base0 = 0, base1 = 0, i; ++ u32 p1[5], p2[5]; ++ int mode = 0; ++ u32 *qfprom_cdata, *qfprom_csel; ++ ++ qfprom_cdata = (u32 *)qfprom_read(tmdev->dev, "calib"); ++ if (IS_ERR(qfprom_cdata)) ++ return PTR_ERR(qfprom_cdata); ++ ++ qfprom_csel = (u32 *)qfprom_read(tmdev->dev, "calib_sel"); ++ if (IS_ERR(qfprom_csel)) ++ return PTR_ERR(qfprom_csel); ++ ++ mode = (qfprom_csel[0] & CAL_SEL_MASK) >> CAL_SEL_SHIFT; ++ dev_dbg(tmdev->dev, "calibration mode is %d\n", mode); ++ ++ switch (mode) { ++ case TWO_PT_CALIB: ++ base1 = (qfprom_cdata[1] & BASE1_MASK) >> BASE1_SHIFT; ++ p2[0] = (qfprom_cdata[0] & S0_P2_MASK) >> S0_P2_SHIFT; ++ p2[1] = (qfprom_cdata[0] & S1_P2_MASK) >> S1_P2_SHIFT; ++ p2[2] = (qfprom_cdata[1] & S2_P2_MASK) >> S2_P2_SHIFT; ++ p2[3] = (qfprom_cdata[1] & S3_P2_MASK) >> S3_P2_SHIFT; ++ p2[4] = (qfprom_cdata[1] & S4_P2_MASK) >> S4_P2_SHIFT; ++ for (i = 0; i < tmdev->num_sensors; i++) ++ p2[i] = ((base1 + p2[i]) << 3); ++ /* Fall through */ ++ case ONE_PT_CALIB2: ++ base0 = (qfprom_cdata[0] & BASE0_MASK); ++ p1[0] = (qfprom_cdata[0] & S0_P1_MASK) >> S0_P1_SHIFT; ++ p1[1] = (qfprom_cdata[0] & S1_P1_MASK) >> S1_P1_SHIFT; ++ p1[2] = (qfprom_cdata[0] & S2_P1_MASK) >> S2_P1_SHIFT; ++ p1[3] = (qfprom_cdata[1] & S3_P1_MASK) >> S3_P1_SHIFT; ++ p1[4] = (qfprom_cdata[1] & S4_P1_MASK) >> S4_P1_SHIFT; ++ for (i = 0; i < tmdev->num_sensors; i++) ++ p1[i] = (((base0) + p1[i]) << 3); ++ break; ++ default: ++ for (i = 0; i < tmdev->num_sensors; i++) { ++ p1[i] = 500; ++ p2[i] = 780; ++ } ++ break; ++ } ++ ++ compute_intercept_slope(tmdev, p1, p2, mode); ++ ++ return 0; ++} ++ ++const struct tsens_ops ops_8916 = { ++ .init = init_common, ++ .calibrate = calibrate_8916, ++ .get_temp = get_temp_common, ++}; ++ ++const struct tsens_data data_8916 = { ++ .num_sensors = 5, ++ .ops = &ops_8916, ++ .hw_ids = (unsigned int []){0, 1, 2, 4, 5 }, ++}; +--- a/drivers/thermal/qcom/tsens.c ++++ b/drivers/thermal/qcom/tsens.c +@@ -65,6 +65,7 @@ static SIMPLE_DEV_PM_OPS(tsens_pm_ops, t + static const struct of_device_id tsens_table[] = { + { + .compatible = "qcom,msm8916-tsens", ++ .data = &data_8916, + }, { + .compatible = "qcom,msm8974-tsens", + }, +--- a/drivers/thermal/qcom/tsens.h ++++ b/drivers/thermal/qcom/tsens.h +@@ -87,4 +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; ++ + #endif /* __QCOM_TSENS_H__ */ |