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

Commit 4340e27d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "thermal: tsens: Update mdm9640 TSENS fuse map"

parents f9d9b0ee 802ae27c
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) {