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: Ansuel Smith <ansuelsmth@gmail.com>
Acked-by: Thara Gopinath <thara.gopinath@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20210420183343.2272-7-ansuelsmth@gmail.com
This commit is contained in:
Ansuel Smith 2021-04-20 20:33:40 +02:00 коммит произвёл Daniel Lezcano
Родитель 3d08f029fd
Коммит dfc1193d4d
1 изменённых файлов: 15 добавлений и 41 удалений

Просмотреть файл

@ -67,6 +67,13 @@
#define S9_STATUS_OFF 0x3674 #define S9_STATUS_OFF 0x3674
#define S10_STATUS_OFF 0x3678 #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) static int suspend_8960(struct tsens_priv *priv)
{ {
int ret; int ret;
@ -194,9 +201,7 @@ static int calibrate_8960(struct tsens_priv *priv)
{ {
int i; int i;
char *data; char *data;
u32 p1[11];
ssize_t num_read = priv->num_sensors;
struct tsens_sensor *s = priv->sensor;
data = qfprom_read(priv->dev, "calib"); data = qfprom_read(priv->dev, "calib");
if (IS_ERR(data)) if (IS_ERR(data))
@ -204,49 +209,18 @@ static int calibrate_8960(struct tsens_priv *priv)
if (IS_ERR(data)) if (IS_ERR(data))
return PTR_ERR(data); return PTR_ERR(data);
for (i = 0; i < num_read; i++, s++) for (i = 0; i < priv->num_sensors; i++) {
s->offset = data[i]; p1[i] = data[i];
priv->sensor[i].slope = tsens_msm8960_slope[i];
}
compute_intercept_slope(priv, p1, NULL, ONE_PT_CALIB);
kfree(data); kfree(data);
return 0; return 0;
} }
/* 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;
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;
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] = { static const struct reg_field tsens_8960_regfields[MAX_REGFIELDS] = {
/* ----- SROT ------ */ /* ----- SROT ------ */
/* No VERSION information */ /* No VERSION information */
@ -307,7 +281,7 @@ static const struct reg_field tsens_8960_regfields[MAX_REGFIELDS] = {
static const struct tsens_ops ops_8960 = { static const struct tsens_ops ops_8960 = {
.init = init_common, .init = init_common,
.calibrate = calibrate_8960, .calibrate = calibrate_8960,
.get_temp = get_temp_8960, .get_temp = get_temp_common,
.enable = enable_8960, .enable = enable_8960,
.disable = disable_8960, .disable = disable_8960,
.suspend = suspend_8960, .suspend = suspend_8960,