Skip to content

Commit 3d08f02

Browse files
Ansueldlezcano
authored andcommitted
thermal/drivers/tsens: Fix bug in sensor enable for msm8960
Device based on tsens VER_0 contains a hardware bug that results in some problem with sensor enablement. Sensor id 6-11 can't be enabled selectively and all of them must be enabled in one step. 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-6-ansuelsmth@gmail.com
1 parent fdda131 commit 3d08f02

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

drivers/thermal/qcom/tsens-8960.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
#define EN BIT(0)
2828
#define SW_RST BIT(1)
2929
#define SENSOR0_EN BIT(3)
30+
#define MEASURE_PERIOD BIT(18)
3031
#define SLP_CLK_ENA BIT(26)
3132
#define SLP_CLK_ENA_8660 BIT(24)
32-
#define MEASURE_PERIOD 1
3333
#define SENSOR0_SHIFT 3
3434

3535
/* INT_STATUS_ADDR bitmasks */
@@ -126,17 +126,34 @@ static int resume_8960(struct tsens_priv *priv)
126126
static int enable_8960(struct tsens_priv *priv, int id)
127127
{
128128
int ret;
129-
u32 reg, mask;
129+
u32 reg, mask = BIT(id);
130130

131131
ret = regmap_read(priv->tm_map, CNTL_ADDR, &reg);
132132
if (ret)
133133
return ret;
134134

135-
mask = BIT(id + SENSOR0_SHIFT);
135+
/* HARDWARE BUG:
136+
* On platforms with more than 6 sensors, all remaining sensors
137+
* must be enabled together, otherwise undefined results are expected.
138+
* (Sensor 6-7 disabled, Sensor 3 disabled...) In the original driver,
139+
* all the sensors are enabled in one step hence this bug is not
140+
* triggered.
141+
*/
142+
if (id > 5)
143+
mask = GENMASK(10, 6);
144+
145+
mask <<= SENSOR0_SHIFT;
146+
147+
/* Sensors already enabled. Skip. */
148+
if ((reg & mask) == mask)
149+
return 0;
150+
136151
ret = regmap_write(priv->tm_map, CNTL_ADDR, reg | SW_RST);
137152
if (ret)
138153
return ret;
139154

155+
reg |= MEASURE_PERIOD;
156+
140157
if (priv->num_sensors > 1)
141158
reg |= mask | SLP_CLK_ENA | EN;
142159
else

0 commit comments

Comments
 (0)