Skip to content

Commit 332bc8e

Browse files
shawnguo2dlezcano
authored andcommitted
thermal: qcom: tsens-v0_1: Add support for MSM8939
The TSENS integrated on MSM8939 is a v0_1 device with 10 sensors. Different from its predecessor MSM8916, where 'calib_sel' bits sit in separate qfprom word, MSM8939 has 'cailb' and 'calib_sel' bits mixed and spread on discrete offsets. That's why all qfprom bits are read as one go and later mapped to calibration data for MSM8939. Signed-off-by: Shawn Guo <[email protected]> Acked-by: Amit Kucheria <[email protected]> Tested-by: Konrad Dybcio <[email protected]> /* on Asus Z00T smartphone */ Acked-by: Konrad Dybcio <[email protected]> Signed-off-by: Daniel Lezcano <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent ec99756 commit 332bc8e

File tree

3 files changed

+147
-2
lines changed

3 files changed

+147
-2
lines changed

drivers/thermal/qcom/tsens-v0_1.c

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,63 @@
4848
#define MSM8916_CAL_SEL_MASK 0xe0000000
4949
#define MSM8916_CAL_SEL_SHIFT 29
5050

51+
/* eeprom layout data for 8939 */
52+
#define MSM8939_BASE0_MASK 0x000000ff
53+
#define MSM8939_BASE1_MASK 0xff000000
54+
#define MSM8939_BASE0_SHIFT 0
55+
#define MSM8939_BASE1_SHIFT 24
56+
57+
#define MSM8939_S0_P1_MASK 0x000001f8
58+
#define MSM8939_S1_P1_MASK 0x001f8000
59+
#define MSM8939_S2_P1_MASK_0_4 0xf8000000
60+
#define MSM8939_S2_P1_MASK_5 0x00000001
61+
#define MSM8939_S3_P1_MASK 0x00001f80
62+
#define MSM8939_S4_P1_MASK 0x01f80000
63+
#define MSM8939_S5_P1_MASK 0x00003f00
64+
#define MSM8939_S6_P1_MASK 0x03f00000
65+
#define MSM8939_S7_P1_MASK 0x0000003f
66+
#define MSM8939_S8_P1_MASK 0x0003f000
67+
#define MSM8939_S9_P1_MASK 0x07e00000
68+
69+
#define MSM8939_S0_P2_MASK 0x00007e00
70+
#define MSM8939_S1_P2_MASK 0x07e00000
71+
#define MSM8939_S2_P2_MASK 0x0000007e
72+
#define MSM8939_S3_P2_MASK 0x0007e000
73+
#define MSM8939_S4_P2_MASK 0x7e000000
74+
#define MSM8939_S5_P2_MASK 0x000fc000
75+
#define MSM8939_S6_P2_MASK 0xfc000000
76+
#define MSM8939_S7_P2_MASK 0x00000fc0
77+
#define MSM8939_S8_P2_MASK 0x00fc0000
78+
#define MSM8939_S9_P2_MASK_0_4 0xf8000000
79+
#define MSM8939_S9_P2_MASK_5 0x00002000
80+
81+
#define MSM8939_S0_P1_SHIFT 3
82+
#define MSM8939_S1_P1_SHIFT 15
83+
#define MSM8939_S2_P1_SHIFT_0_4 27
84+
#define MSM8939_S2_P1_SHIFT_5 0
85+
#define MSM8939_S3_P1_SHIFT 7
86+
#define MSM8939_S4_P1_SHIFT 19
87+
#define MSM8939_S5_P1_SHIFT 8
88+
#define MSM8939_S6_P1_SHIFT 20
89+
#define MSM8939_S7_P1_SHIFT 0
90+
#define MSM8939_S8_P1_SHIFT 12
91+
#define MSM8939_S9_P1_SHIFT 21
92+
93+
#define MSM8939_S0_P2_SHIFT 9
94+
#define MSM8939_S1_P2_SHIFT 21
95+
#define MSM8939_S2_P2_SHIFT 1
96+
#define MSM8939_S3_P2_SHIFT 13
97+
#define MSM8939_S4_P2_SHIFT 25
98+
#define MSM8939_S5_P2_SHIFT 14
99+
#define MSM8939_S6_P2_SHIFT 26
100+
#define MSM8939_S7_P2_SHIFT 6
101+
#define MSM8939_S8_P2_SHIFT 18
102+
#define MSM8939_S9_P2_SHIFT_0_4 27
103+
#define MSM8939_S9_P2_SHIFT_5 13
104+
105+
#define MSM8939_CAL_SEL_MASK 0x7
106+
#define MSM8939_CAL_SEL_SHIFT 0
107+
51108
/* eeprom layout data for 8974 */
52109
#define BASE1_MASK 0xff
53110
#define S0_P1_MASK 0x3f00
@@ -189,6 +246,76 @@ static int calibrate_8916(struct tsens_priv *priv)
189246
return 0;
190247
}
191248

249+
static int calibrate_8939(struct tsens_priv *priv)
250+
{
251+
int base0 = 0, base1 = 0, i;
252+
u32 p1[10], p2[10];
253+
int mode = 0;
254+
u32 *qfprom_cdata;
255+
u32 cdata[6];
256+
257+
qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib");
258+
if (IS_ERR(qfprom_cdata))
259+
return PTR_ERR(qfprom_cdata);
260+
261+
/* Mapping between qfprom nvmem and calibration data */
262+
cdata[0] = qfprom_cdata[12];
263+
cdata[1] = qfprom_cdata[13];
264+
cdata[2] = qfprom_cdata[0];
265+
cdata[3] = qfprom_cdata[1];
266+
cdata[4] = qfprom_cdata[22];
267+
cdata[5] = qfprom_cdata[21];
268+
269+
mode = (cdata[0] & MSM8939_CAL_SEL_MASK) >> MSM8939_CAL_SEL_SHIFT;
270+
dev_dbg(priv->dev, "calibration mode is %d\n", mode);
271+
272+
switch (mode) {
273+
case TWO_PT_CALIB:
274+
base1 = (cdata[3] & MSM8939_BASE1_MASK) >> MSM8939_BASE1_SHIFT;
275+
p2[0] = (cdata[0] & MSM8939_S0_P2_MASK) >> MSM8939_S0_P2_SHIFT;
276+
p2[1] = (cdata[0] & MSM8939_S1_P2_MASK) >> MSM8939_S1_P2_SHIFT;
277+
p2[2] = (cdata[1] & MSM8939_S2_P2_MASK) >> MSM8939_S2_P2_SHIFT;
278+
p2[3] = (cdata[1] & MSM8939_S3_P2_MASK) >> MSM8939_S3_P2_SHIFT;
279+
p2[4] = (cdata[1] & MSM8939_S4_P2_MASK) >> MSM8939_S4_P2_SHIFT;
280+
p2[5] = (cdata[2] & MSM8939_S5_P2_MASK) >> MSM8939_S5_P2_SHIFT;
281+
p2[6] = (cdata[2] & MSM8939_S6_P2_MASK) >> MSM8939_S6_P2_SHIFT;
282+
p2[7] = (cdata[3] & MSM8939_S7_P2_MASK) >> MSM8939_S7_P2_SHIFT;
283+
p2[8] = (cdata[3] & MSM8939_S8_P2_MASK) >> MSM8939_S8_P2_SHIFT;
284+
p2[9] = (cdata[4] & MSM8939_S9_P2_MASK_0_4) >> MSM8939_S9_P2_SHIFT_0_4;
285+
p2[9] |= ((cdata[5] & MSM8939_S9_P2_MASK_5) >> MSM8939_S9_P2_SHIFT_5) << 5;
286+
for (i = 0; i < priv->num_sensors; i++)
287+
p2[i] = (base1 + p2[i]) << 2;
288+
fallthrough;
289+
case ONE_PT_CALIB2:
290+
base0 = (cdata[2] & MSM8939_BASE0_MASK) >> MSM8939_BASE0_SHIFT;
291+
p1[0] = (cdata[0] & MSM8939_S0_P1_MASK) >> MSM8939_S0_P1_SHIFT;
292+
p1[1] = (cdata[0] & MSM8939_S1_P1_MASK) >> MSM8939_S1_P1_SHIFT;
293+
p1[2] = (cdata[0] & MSM8939_S2_P1_MASK_0_4) >> MSM8939_S2_P1_SHIFT_0_4;
294+
p1[2] |= ((cdata[1] & MSM8939_S2_P1_MASK_5) >> MSM8939_S2_P1_SHIFT_5) << 5;
295+
p1[3] = (cdata[1] & MSM8939_S3_P1_MASK) >> MSM8939_S3_P1_SHIFT;
296+
p1[4] = (cdata[1] & MSM8939_S4_P1_MASK) >> MSM8939_S4_P1_SHIFT;
297+
p1[5] = (cdata[2] & MSM8939_S5_P1_MASK) >> MSM8939_S5_P1_SHIFT;
298+
p1[6] = (cdata[2] & MSM8939_S6_P1_MASK) >> MSM8939_S6_P1_SHIFT;
299+
p1[7] = (cdata[3] & MSM8939_S7_P1_MASK) >> MSM8939_S7_P1_SHIFT;
300+
p1[8] = (cdata[3] & MSM8939_S8_P1_MASK) >> MSM8939_S8_P1_SHIFT;
301+
p1[9] = (cdata[4] & MSM8939_S9_P1_MASK) >> MSM8939_S9_P1_SHIFT;
302+
for (i = 0; i < priv->num_sensors; i++)
303+
p1[i] = ((base0) + p1[i]) << 2;
304+
break;
305+
default:
306+
for (i = 0; i < priv->num_sensors; i++) {
307+
p1[i] = 500;
308+
p2[i] = 780;
309+
}
310+
break;
311+
}
312+
313+
compute_intercept_slope(priv, p1, p2, mode);
314+
kfree(qfprom_cdata);
315+
316+
return 0;
317+
}
318+
192319
static int calibrate_8974(struct tsens_priv *priv)
193320
{
194321
int base1 = 0, base2 = 0, i;
@@ -325,7 +452,7 @@ static int calibrate_8974(struct tsens_priv *priv)
325452
return 0;
326453
}
327454

328-
/* v0.1: 8916, 8974 */
455+
/* v0.1: 8916, 8939, 8974 */
329456

330457
static struct tsens_features tsens_v0_1_feat = {
331458
.ver_major = VER_0_1,
@@ -386,6 +513,21 @@ struct tsens_plat_data data_8916 = {
386513
.fields = tsens_v0_1_regfields,
387514
};
388515

516+
static const struct tsens_ops ops_8939 = {
517+
.init = init_common,
518+
.calibrate = calibrate_8939,
519+
.get_temp = get_temp_common,
520+
};
521+
522+
struct tsens_plat_data data_8939 = {
523+
.num_sensors = 10,
524+
.ops = &ops_8939,
525+
.hw_ids = (unsigned int []){ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10 },
526+
527+
.feat = &tsens_v0_1_feat,
528+
.fields = tsens_v0_1_regfields,
529+
};
530+
389531
static const struct tsens_ops ops_8974 = {
390532
.init = init_common,
391533
.calibrate = calibrate_8974,

drivers/thermal/qcom/tsens.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,9 @@ static const struct of_device_id tsens_table[] = {
897897
{
898898
.compatible = "qcom,msm8916-tsens",
899899
.data = &data_8916,
900+
}, {
901+
.compatible = "qcom,msm8939-tsens",
902+
.data = &data_8939,
900903
}, {
901904
.compatible = "qcom,msm8974-tsens",
902905
.data = &data_8974,

drivers/thermal/qcom/tsens.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ int get_temp_common(const struct tsens_sensor *s, int *temp);
585585
extern struct tsens_plat_data data_8960;
586586

587587
/* TSENS v0.1 targets */
588-
extern struct tsens_plat_data data_8916, data_8974;
588+
extern struct tsens_plat_data data_8916, data_8939, data_8974;
589589

590590
/* TSENS v1 targets */
591591
extern struct tsens_plat_data data_tsens_v1, data_8976;

0 commit comments

Comments
 (0)