Commit dfc1193d authored by Christian Marangi's avatar Christian Marangi Committed by Daniel Lezcano
Browse files

thermal/drivers/tsens: Replace custom 8960 apis with generic apis



Rework calibrate function to use common function. Derive the offset from
a missing hardcoded slope table and the data from the nvmem calib
efuses.
Drop custom get_temp function and use generic api.

Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
Acked-by: default avatarThara Gopinath <thara.gopinath@linaro.org>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20210420183343.2272-7-ansuelsmth@gmail.com
parent 3d08f029
Loading
Loading
Loading
Loading
+15 −41
Original line number Diff line number Diff line
@@ -67,6 +67,13 @@
#define S9_STATUS_OFF		0x3674
#define S10_STATUS_OFF		0x3678

/* Original slope - 350 to compensate mC to C inaccuracy */
static u32 tsens_msm8960_slope[] = {
			826, 826, 804, 826,
			761, 782, 782, 849,
			782, 849, 782
			};

static int suspend_8960(struct tsens_priv *priv)
{
	int ret;
@@ -194,9 +201,7 @@ static int calibrate_8960(struct tsens_priv *priv)
{
	int i;
	char *data;

	ssize_t num_read = priv->num_sensors;
	struct tsens_sensor *s = priv->sensor;
	u32 p1[11];

	data = qfprom_read(priv->dev, "calib");
	if (IS_ERR(data))
@@ -204,47 +209,16 @@ static int calibrate_8960(struct tsens_priv *priv)
	if (IS_ERR(data))
		return PTR_ERR(data);

	for (i = 0; i < num_read; i++, s++)
		s->offset = data[i];

	kfree(data);

	return 0;
	for (i = 0; i < priv->num_sensors; i++) {
		p1[i] = data[i];
		priv->sensor[i].slope = tsens_msm8960_slope[i];
	}

/* Temperature on y axis and ADC-code on x-axis */
static inline int code_to_mdegC(u32 adc_code, const struct tsens_sensor *s)
{
	int slope, offset;
	compute_intercept_slope(priv, p1, NULL, ONE_PT_CALIB);

	slope = thermal_zone_get_slope(s->tzd);
	offset = CAL_MDEGC - slope * s->offset;

	return adc_code * slope + offset;
}

static int get_temp_8960(const struct tsens_sensor *s, int *temp)
{
	int ret;
	u32 code, trdy;
	struct tsens_priv *priv = s->priv;
	unsigned long timeout;
	kfree(data);

	timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
	do {
		ret = regmap_read(priv->tm_map, INT_STATUS_ADDR, &trdy);
		if (ret)
			return ret;
		if (!(trdy & TRDY_MASK))
			continue;
		ret = regmap_read(priv->tm_map, s->status, &code);
		if (ret)
			return ret;
		*temp = code_to_mdegC(code, s);
	return 0;
	} while (time_before(jiffies, timeout));

	return -ETIMEDOUT;
}

static const struct reg_field tsens_8960_regfields[MAX_REGFIELDS] = {
@@ -307,7 +281,7 @@ static const struct reg_field tsens_8960_regfields[MAX_REGFIELDS] = {
static const struct tsens_ops ops_8960 = {
	.init		= init_common,
	.calibrate	= calibrate_8960,
	.get_temp	= get_temp_8960,
	.get_temp	= get_temp_common,
	.enable		= enable_8960,
	.disable	= disable_8960,
	.suspend	= suspend_8960,