Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 802ae27c authored by Rama Krishna Phani A's avatar Rama Krishna Phani A
Browse files

thermal: tsens: Update mdm9640 TSENS fuse map



Add support to distinguish fusemap between mdm9640 v1/v2 and
to read the EEPROM fuse data for calibration to calculate the
gain and offset that is used to compute the final temperature.

Update the DT document with target name reference for mdm9640
along with the addition for 9640v2 compatible string support.

CRs-Fixed: 1008416
Change-Id: I8dfbbc094c5d857dc904cf18cb462fc82c46dd57
Signed-off-by: default avatarRama Krishna Phani A <rphani@codeaurora.org>
parent fbfdd7c9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -24,12 +24,13 @@ Required properties:
	       should be "qcom,msm8939-tsens" for 8939 TSENS driver.
	       should be "qcom,msm8909-tsens" for 8909 TSENS driver.
	       should be "qcom,msm8952-tsens" for 8952 TSENS driver.
	       should be "qcom,msmzirc-tsens" for zirc TSENS driver.
	       should be "qcom,mdm9640-tsens" for 9640 TSENS driver.
	       should be "qcom,mdm9607-tsens" for 9607 TSENS driver.
	       should be "qcom,msm8953-tsens" for 8953 TSENS driver.
	       should be "qcom,msm8937-tsens" for 8937 TSENS driver.
	       should be "qcom,msm8917-tsens" for 8917 TSENS driver.
	       should be "qcom,msmcobalt-tsens" for cobalt TSENS driver.
	       should be "qcom,mdm9640v2-tsens" for 9640v2 TSENS driver.
	       The compatible property is used to identify the respective fusemap to use
	       for the corresponding SoC.
- reg : offset and length of the TSENS registers.
+112 −48
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@
#define TSENS_SN_REMOTE_CONFIG(n)	((n) + 0x3c)

#define TSENS_EEPROM(n)			((n) + 0xd0)
#define TSENS_EEPROM_9640V2(n)		((n) + 0x8)
#define TSENS_EEPROM_REDUNDANCY_SEL(n)	((n) + 0x444)
#define TSENS_EEPROM_BACKUP_REGION(n)	((n) + 0x440)

@@ -586,20 +587,21 @@
#define TSENS_MSM8909_D120_WA_S1  6
#define TSENS_MSM8909_D120_WA_S3  9
#define TSENS_MSM8909_D120_WA_S4  10
#define TSENS_ZIRC_CAL_SEL		0x700
#define TSENS_ZIRC_CAL_SEL_SHIFT	8
#define TSENS_BASE0_ZIRC_MASK		0x3ff
#define TSENS_BASE1_ZIRC_MASK		0xffc00
#define TSENS_BASE1_ZIRC_SHIFT		10
#define TSENS0_OFFSET_ZIRC_MASK		0xf00000
#define TSENS0_OFFSET_ZIRC_SHIFT	20
#define TSENS1_OFFSET_ZIRC_MASK		0xf000000
#define TSENS1_OFFSET_ZIRC_SHIFT	24
#define TSENS2_OFFSET_ZIRC_MASK		0xf0000000
#define TSENS2_OFFSET_ZIRC_SHIFT	28
#define TSENS3_OFFSET_ZIRC_MASK		0xf
#define TSENS4_OFFSET_ZIRC_MASK		0xf0
#define TSENS4_OFFSET_ZIRC_SHIFT	4

#define TSENS_9640_CAL_SEL		0x700
#define TSENS_9640_CAL_SEL_SHIFT	8
#define TSENS_BASE0_9640_MASK		0x3ff
#define TSENS_BASE1_9640_MASK		0xffc00
#define TSENS_BASE1_9640_SHIFT		10
#define TSENS0_OFFSET_9640_MASK		0xf00000
#define TSENS0_OFFSET_9640_SHIFT	20
#define TSENS1_OFFSET_9640_MASK		0xf000000
#define TSENS1_OFFSET_9640_SHIFT	24
#define TSENS2_OFFSET_9640_MASK		0xf0000000
#define TSENS2_OFFSET_9640_SHIFT	28
#define TSENS3_OFFSET_9640_MASK		0xf
#define TSENS4_OFFSET_9640_MASK		0xf0
#define TSENS4_OFFSET_9640_SHIFT	4

#define TSENS_CONTR_14_BASE0_MASK                0x000000ff
#define TSENS_CONTR_14_BASE1_MASK                0xff000000
@@ -747,7 +749,7 @@ enum tsens_calib_fuse_map_type {
	TSENS_CALIB_FUSE_MAP_8939,
	TSENS_CALIB_FUSE_MAP_8994,
	TSENS_CALIB_FUSE_MAP_MSM8909,
	TSENS_CALIB_FUSE_MAP_MSMZIRC,
	TSENS_CALIB_FUSE_MAP_MDM9640,
	TSENS_CALIB_FUSE_MAP_NONE,
	TSENS_CALIB_FUSE_MAP_8992,
	TSENS_CALIB_FUSE_MAP_MSM8952,
@@ -905,8 +907,8 @@ static struct of_device_id tsens_match[] = {
	{	.compatible = "qcom,msm8909-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_MSM8909,
	},
	{	.compatible = "qcom,msmzirc-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_MSMZIRC,
	{	.compatible = "qcom,mdm9640-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_MDM9640,
	},
	{	.compatible = "qcom,msm8996-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_NONE,
@@ -932,6 +934,9 @@ static struct of_device_id tsens_match[] = {
	{	.compatible = "qcom,msmcobalt-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_NONE,
	},
	{	.compatible = "qcom,mdm9640v2-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_MDM9640,
	},
	{}
};

@@ -976,7 +981,8 @@ static int32_t get_tsens_sensor_for_client_id(struct tsens_tm_device *tmdev,
	}

	if (!strcmp(id->compatible, "qcom,msm8996-tsens") ||
		(!strcmp(id->compatible, "qcom,msmcobalt-tsens"))) {
		(!strcmp(id->compatible, "qcom,mdm9640v2-tsens") ||
		(!strcmp(id->compatible, "qcom,msmcobalt-tsens")))) {
		while (i < tmdev->tsens_num_sensor && !id_found) {
			if (tmdev->sensor[i].sensor_client_id ==
							sensor_client_id) {
@@ -5255,7 +5261,7 @@ compute_intercept_slope:
	return 0;
}

static int tsens_calib_msmzirc_sensors(struct tsens_tm_device *tmdev)
static int tsens_calib_mdm9640_sensors(struct tsens_tm_device *tmdev)
{
	int i = 0, tsens_base0_data = 0, tsens_base1_data = 0;
	int tsens0_point = 0, tsens1_point = 0, tsens2_point = 0;
@@ -5263,32 +5269,64 @@ static int tsens_calib_msmzirc_sensors(struct tsens_tm_device *tmdev)
	int tsens_calibration_mode = 0;
	uint32_t calib_data[2] = {0, 0};
	uint32_t calib_tsens_point_data[5];
	struct device_node *of_node = NULL;
	const struct of_device_id *id;

	of_node = tmdev->pdev->dev.of_node;
	if (of_node == NULL) {
		pr_err("Invalid of_node??\n");
		return -EINVAL;
	}

	if (!of_match_node(tsens_match, of_node)) {
		pr_err("Need to read SoC specific fuse map\n");
		return -ENODEV;
	}

	id = of_match_node(tsens_match, of_node);
	if (id == NULL) {
		pr_err("can not find tsens_match of_node\n");
		return -ENODEV;
	}

	if (!tmdev->calibration_less_mode) {
		if (!strcmp(id->compatible, "qcom,mdm9640v2-tsens")) {
			calib_data[0] = readl_relaxed(
				TSENS_EEPROM_9640V2(tmdev->tsens_calib_addr));
			calib_data[1] = readl_relaxed(
				(TSENS_EEPROM_9640V2(tmdev->tsens_calib_addr)
									+ 0x4));

			tsens_calibration_mode =
				(calib_data[1] & TSENS_9640_CAL_SEL) >>
					TSENS_9640_CAL_SEL_SHIFT;
			pr_debug("calib mode is %d\n", tsens_calibration_mode);
		} else {
			calib_data[0] = readl_relaxed(
				TSENS_EEPROM(tmdev->tsens_calib_addr));
			calib_data[1] = readl_relaxed(
				(TSENS_EEPROM(tmdev->tsens_calib_addr) + 0x4));

			tsens_calibration_mode =
			(calib_data[1] & TSENS_ZIRC_CAL_SEL) >>
				TSENS_ZIRC_CAL_SEL_SHIFT;
				(calib_data[1] & TSENS_9640_CAL_SEL) >>
					TSENS_9640_CAL_SEL_SHIFT;
			pr_debug("calib mode is %d\n", tsens_calibration_mode);
		}
	}

	if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) {
		tsens_base0_data = (calib_data[0] & TSENS_BASE0_ZIRC_MASK);
		tsens_base1_data = (calib_data[0] & TSENS_BASE1_ZIRC_MASK) >>
						TSENS_BASE1_ZIRC_SHIFT;
		tsens0_point = (calib_data[0] & TSENS0_OFFSET_ZIRC_MASK) >>
						TSENS0_OFFSET_ZIRC_SHIFT;
		tsens1_point = (calib_data[0] & TSENS1_OFFSET_ZIRC_MASK) >>
						TSENS1_OFFSET_ZIRC_SHIFT;
		tsens2_point = (calib_data[0] & TSENS2_OFFSET_ZIRC_MASK) >>
						TSENS2_OFFSET_ZIRC_SHIFT;
		tsens3_point = (calib_data[1] & TSENS3_OFFSET_ZIRC_MASK);
		tsens4_point = (calib_data[1] & TSENS4_OFFSET_ZIRC_MASK) >>
						TSENS4_OFFSET_ZIRC_SHIFT;
		tsens_base0_data = (calib_data[0] & TSENS_BASE0_9640_MASK);
		tsens_base1_data = (calib_data[0] & TSENS_BASE1_9640_MASK) >>
						TSENS_BASE1_9640_SHIFT;
		tsens0_point = (calib_data[0] & TSENS0_OFFSET_9640_MASK) >>
						TSENS0_OFFSET_9640_SHIFT;
		tsens1_point = (calib_data[0] & TSENS1_OFFSET_9640_MASK) >>
						TSENS1_OFFSET_9640_SHIFT;
		tsens2_point = (calib_data[0] & TSENS2_OFFSET_9640_MASK) >>
						TSENS2_OFFSET_9640_SHIFT;
		tsens3_point = (calib_data[1] & TSENS3_OFFSET_9640_MASK);
		tsens4_point = (calib_data[1] & TSENS4_OFFSET_9640_MASK) >>
						TSENS4_OFFSET_9640_SHIFT;
		calib_tsens_point_data[0] = tsens0_point;
		calib_tsens_point_data[1] = tsens1_point;
		calib_tsens_point_data[2] = tsens2_point;
@@ -5363,8 +5401,8 @@ static int tsens_calib_sensors(struct tsens_tm_device *tmdev)
		rc = tsens_calib_8994_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8909)
		rc = tsens_calib_msm8909_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSMZIRC)
		rc = tsens_calib_msmzirc_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MDM9640)
		rc = tsens_calib_mdm9640_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_8992)
		rc = tsens_calib_8992_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8952)
@@ -5480,9 +5518,10 @@ static int get_device_tree_data(struct platform_device *pdev,
	}

	if (!strcmp(id->compatible, "qcom,mdm9630-tsens") ||
		(!strcmp(id->compatible, "qcom,msmzirc-tsens")) ||
		(!strcmp(id->compatible, "qcom,mdm9640-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8994-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8992-tsens")))
		(!strcmp(id->compatible, "qcom,msm8992-tsens")) ||
		(!strcmp(id->compatible, "qcom,mdm9640v2-tsens")))
		tmdev->tsens_type = TSENS_TYPE2;
	else if (!strcmp(id->compatible, "qcom,msm8996-tsens"))
		tmdev->tsens_type = TSENS_TYPE3;
@@ -5501,13 +5540,14 @@ static int get_device_tree_data(struct platform_device *pdev,
				"qcom,valid-status-check");
	if (!tmdev->tsens_valid_status_check) {
		if (!strcmp(id->compatible, "qcom,msm8994-tsens") ||
		(!strcmp(id->compatible, "qcom,msmzirc-tsens")) ||
		(!strcmp(id->compatible, "qcom,mdm9640-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8992-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8996-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8952-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8937-tsens")) ||
		(!strcmp(id->compatible, "qcom,msm8953-tsens")) ||
		(!strcmp(id->compatible, "qcom,msmcobalt-tsens")))
		(!strcmp(id->compatible, "qcom,msmcobalt-tsens")) ||
		(!strcmp(id->compatible, "qcom,mdm9640v2-tsens")))
			tmdev->tsens_valid_status_check = true;
	}

@@ -5760,6 +5800,25 @@ int tsens_sensor_sw_idx = 0;
static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev)
{
	int rc = 0, i = 0;
	const struct of_device_id *id;
	struct device_node *of_node;

	of_node = tmdev->pdev->dev.of_node;
	if (of_node == NULL) {
		pr_err("Invalid of_node??\n");
		return -EINVAL;
	}

	if (!of_match_node(tsens_match, of_node)) {
		pr_err("Need to read SoC specific fuse map\n");
		return -ENODEV;
	}

	id = of_match_node(tsens_match, of_node);
	if (id == NULL) {
		pr_err("can not find tsens_match of_node\n");
		return -ENODEV;
	}

	if (tmdev == NULL) {
		pr_err("Invalid tsens instance\n");
@@ -5768,9 +5827,14 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev)

	for (i = 0; i < tmdev->tsens_num_sensor; i++) {
		char name[18];

		if ((!strcmp(id->compatible, "qcom,mdm9640-tsens")) ||
			(!strcmp(id->compatible, "qcom,mdm9640v2-tsens")))
			snprintf(name, sizeof(name), "tsens_tz_sensor%d",
					tmdev->sensor[i].sensor_hw_num);
		else
			snprintf(name, sizeof(name), "tsens_tz_sensor%d",
					tsens_sensor_sw_idx);

		tmdev->sensor[i].mode = THERMAL_DEVICE_ENABLED;
		tmdev->sensor[i].tm = tmdev;
		if (tmdev->tsens_type == TSENS_TYPE3) {