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

Commit e1b72e9b authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "thermal: tsens: Add support for mdm9607"

parents 19470729 5b70c956
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -96,6 +96,9 @@ static const struct of_device_id tsens_table[] = {
	{	.compatible = "qcom,qcs405-tsens",
		.data = &data_tsens14xx_405,
	},
	{	.compatible = "qcom,mdm9607-tsens",
		.data = &data_tsens14xx_9607,
	},
	{}
};
MODULE_DEVICE_TABLE(of, tsens_table);
+17 −1
Original line number Diff line number Diff line
@@ -26,6 +26,17 @@
#define TSENS_MAX_SENSORS			16
#define TSENS_NUM_SENSORS_8937		11
#define TSENS_NUM_SENSORS_405		10
#define TSENS_NUM_SENSORS_9607		5
#define TSENS_SROT_OFFSET_8937		0x4
#define TSENS_SROT_OFFSET_405		0x4
#define TSENS_SROT_OFFSET_9607		0x0
#define TSENS_SN_STATUS_ADDR_8937	0x44
#define TSENS_TRDY_ADDR_8937		0x84
#define TSENS_SN_STATUS_ADDR_405	0x44
#define TSENS_TRDY_ADDR_405		0x84
#define TSENS_SN_STATUS_ADDR_9607	0x30
#define TSENS_TRDY_ADDR_9607		0x5c

#define TSENS_CONTROLLER_ID(n)			(n)
#define TSENS_CTRL_ADDR(n)			(n)
#define TSENS_TM_SN_STATUS(n)			((n) + 0xa0)
@@ -184,6 +195,9 @@ struct tsens_data {
	bool				valid_status_check;
	u32				ver_major;
	u32				ver_minor;
	const u32			tsens_srot_offset;
	const u32			tsens_sn_offset;
	const u32			tsens_trdy_offset;
};

struct tsens_mtc_sysfs {
@@ -218,10 +232,12 @@ struct tsens_device {
};

extern const struct tsens_data data_tsens2xxx, data_tsens23xx, data_tsens24xx;
extern const struct tsens_data data_tsens14xx, data_tsens14xx_405;
extern const struct tsens_data data_tsens14xx, data_tsens14xx_405,
						data_tsens14xx_9607;
extern struct list_head tsens_device_list;

extern int calibrate_8937(struct tsens_device *tmdev);
extern int calibrate_405(struct tsens_device *tmdev);
extern int calibrate_9607(struct tsens_device *tmdev);

#endif /* __QCOM_TSENS_H__ */
+41 −8
Original line number Diff line number Diff line
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2019, 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
@@ -41,10 +41,11 @@

#define TSENS_TRDY_MASK			BIT(0)

#define TSENS_SN_STATUS_ADDR(n)	((n) + 0x44)
#define TSENS_SN_STATUS_ADDR(n)		(n)
#define TSENS_SN_STATUS_VALID		BIT(14)
#define TSENS_SN_STATUS_VALID_MASK	0x4000
#define TSENS_TRDY_ADDR(n)		((n) + 0x84)
#define TSENS_TRDY_ADDR(n)		(n)


#define TSENS_CTRL_ADDR(n)		(n)
#define TSENS_EN				BIT(0)
@@ -103,8 +104,10 @@ static int tsens1xxx_get_temp(struct tsens_sensor *sensor, int *temp)

	tmdev = sensor->tmdev;

	trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr);
	sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr);
	trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr +
		tmdev->ctrl_data->tsens_trdy_offset);
	sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr +
		tmdev->ctrl_data->tsens_sn_offset);

	code = readl_relaxed(sensor_addr +
			(sensor->hw_id << TSENS_STATUS_ADDR_OFFSET));
@@ -324,7 +327,8 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
	void __iomem *sensor_status_ctrl_addr;
	u32 rc = 0, addr_offset;

	sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr);
	sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr +
				tm->ctrl_data->tsens_sn_offset);
	sensor_status_ctrl_addr =
		TSENS_S0_UPPER_LOWER_STATUS_CTRL_ADDR(tm->tsens_tm_addr);

@@ -419,7 +423,8 @@ static int tsens1xxx_hw_sensor_en(struct tsens_device *tmdev,
	void __iomem *srot_addr;
	unsigned int srot_val, sensor_en;

	srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4);
	srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr +
			tmdev->ctrl_data->tsens_srot_offset);
	srot_val = readl_relaxed(srot_addr);
	srot_val = TSENS_CTRL_SENSOR_EN_MASK(srot_val);

@@ -433,7 +438,8 @@ static int tsens1xxx_hw_init(struct tsens_device *tmdev)
	void __iomem *srot_addr;
	unsigned int srot_val;

	srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4);
	srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr +
			tmdev->ctrl_data->tsens_srot_offset);
	srot_val = readl_relaxed(srot_addr);
	if (!(srot_val & TSENS_EN)) {
		pr_err("TSENS device is not enabled\n");
@@ -508,6 +514,9 @@ const struct tsens_data data_tsens14xx = {
	.mtc = true,
	.ver_major = 1,
	.ver_minor = 4,
	.tsens_srot_offset = TSENS_SROT_OFFSET_8937,
	.tsens_sn_offset = TSENS_SN_STATUS_ADDR_8937,
	.tsens_trdy_offset = TSENS_TRDY_ADDR_8937,
};

static const struct tsens_ops ops_tsens1xxx_405 = {
@@ -527,4 +536,28 @@ const struct tsens_data data_tsens14xx_405 = {
	.mtc = true,
	.ver_major = 1,
	.ver_minor = 4,
	.tsens_srot_offset = TSENS_SROT_OFFSET_405,
	.tsens_sn_offset = TSENS_SN_STATUS_ADDR_405,
	.tsens_trdy_offset = TSENS_TRDY_ADDR_405,
};

static const struct tsens_ops ops_tsens1xxx_9607 = {
	.hw_init = tsens1xxx_hw_init,
	.get_temp = tsens1xxx_get_temp,
	.set_trips = tsens1xxx_set_trip_temp,
	.interrupts_reg = tsens1xxx_register_interrupts,
	.sensor_en = tsens1xxx_hw_sensor_en,
	.calibrate = calibrate_9607,
	.dbg = tsens2xxx_dbg,
};

const struct tsens_data data_tsens14xx_9607 = {
	.num_sensors = TSENS_NUM_SENSORS_9607,
	.ops = &ops_tsens1xxx_9607,
	.valid_status_check = true,
	.ver_major = 1,
	.ver_minor = 4,
	.tsens_srot_offset = TSENS_SROT_OFFSET_9607,
	.tsens_sn_offset = TSENS_SN_STATUS_ADDR_9607,
	.tsens_trdy_offset = TSENS_TRDY_ADDR_9607,
};
+82 −1
Original line number Diff line number Diff line
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2019, 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
@@ -125,6 +125,37 @@

#define CAL_SEL_MASK_405			0x7

/* eeprom layout data for 9607 */
#define BASE0_MASK_9607				0x000000ff
#define BASE1_MASK_9607				0x000ff000
#define BASE1_SHIFT_9607			12

#define S0_P1_MASK_9607				0x00003f00
#define S1_P1_MASK_9607				0x03f00000
#define S2_P1_MASK_9607				0x0000003f
#define S3_P1_MASK_9607				0x0003f000
#define S4_P1_MASK_9607				0x0000003f

#define S0_P2_MASK_9607				0x000fc000
#define S1_P2_MASK_9607				0xfc000000
#define S2_P2_MASK_9607				0x00000fc0
#define S3_P2_MASK_9607				0x00fc0000
#define S4_P2_MASK_9607				0x00000fc0

#define S0_P1_SHIFT_9607			8
#define S1_P1_SHIFT_9607			20
#define S3_P1_SHIFT_9607			12

#define S0_P2_SHIFT_9607			14
#define S1_P2_SHIFT_9607			26
#define S2_P2_SHIFT_9607			6
#define S3_P2_SHIFT_9607			18
#define S4_P2_SHIFT_9607			6

#define CAL_SEL_MASK_9607			0x00700000
#define CAL_SEL_SHIFT_9607			20


#define CAL_DEGC_PT1				30
#define CAL_DEGC_PT2				120

@@ -301,3 +332,53 @@ int calibrate_405(struct tsens_device *tmdev)

	return 0;
}

int calibrate_9607(struct tsens_device *tmdev)
{
	int base0 = 0, base1 = 0, i;
	u32 p1[TSENS_NUM_SENSORS_9607], p2[TSENS_NUM_SENSORS_9607];
	int mode = 0;
	u32 qfprom_cdata[3] = { 0, 0, 0};

	qfprom_cdata[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x228);
	qfprom_cdata[1] = readl_relaxed(tmdev->tsens_calib_addr + 0x22C);
	qfprom_cdata[2] = readl_relaxed(tmdev->tsens_calib_addr + 0x230);

	mode = (qfprom_cdata[2] & CAL_SEL_MASK_9607) >> CAL_SEL_SHIFT_9607;
	pr_debug("calibration mode is %d\n", mode);

	switch (mode) {
	case TWO_PT_CALIB:
		base1 = (qfprom_cdata[2] & BASE1_MASK_9607) >> BASE1_SHIFT_9607;
		p2[0] = (qfprom_cdata[0] & S0_P2_MASK_9607) >> S0_P2_SHIFT_9607;
		p2[1] = (qfprom_cdata[0] & S1_P2_MASK_9607) >> S1_P2_SHIFT_9607;
		p2[2] = (qfprom_cdata[1] & S2_P2_MASK_9607) >> S2_P2_SHIFT_9607;
		p2[3] = (qfprom_cdata[1] & S3_P2_MASK_9607) >> S3_P2_SHIFT_9607;
		p2[4] = (qfprom_cdata[2] & S4_P2_MASK_9607) >> S4_P2_SHIFT_9607;

		for (i = 0; i < TSENS_NUM_SENSORS_9607; i++)
			p2[i] = ((base1 + p2[i]) << 2);
		/* Fall through */
	case ONE_PT_CALIB2:
		base0 = (qfprom_cdata[0] & BASE0_MASK_9607);
		p1[0] = (qfprom_cdata[0] & S0_P1_MASK_9607) >> S0_P1_SHIFT_9607;
		p1[1] = (qfprom_cdata[0] & S1_P1_MASK_9607) >> S1_P1_SHIFT_9607;
		p1[2] = (qfprom_cdata[1] & S2_P1_MASK_9607);
		p1[3] = (qfprom_cdata[1] & S3_P1_MASK_9607) >> S3_P1_SHIFT_9607;
		p1[4] = (qfprom_cdata[2] & S4_P1_MASK_9607);

		for (i = 0; i < TSENS_NUM_SENSORS_9607; i++)
			p1[i] = (((base0) + p1[i]) << 2);
		break;
	default:
		for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) {
			p1[i] = 500;
			p2[i] = 780;
		}
		break;
	}

	compute_intercept_slope(tmdev, p1, p2, mode);

	return 0;
}