|
48 | 48 | #define MSM8916_CAL_SEL_MASK 0xe0000000
|
49 | 49 | #define MSM8916_CAL_SEL_SHIFT 29
|
50 | 50 |
|
| 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 | + |
51 | 108 | /* eeprom layout data for 8974 */
|
52 | 109 | #define BASE1_MASK 0xff
|
53 | 110 | #define S0_P1_MASK 0x3f00
|
@@ -189,6 +246,76 @@ static int calibrate_8916(struct tsens_priv *priv)
|
189 | 246 | return 0;
|
190 | 247 | }
|
191 | 248 |
|
| 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 | + |
192 | 319 | static int calibrate_8974(struct tsens_priv *priv)
|
193 | 320 | {
|
194 | 321 | int base1 = 0, base2 = 0, i;
|
@@ -325,7 +452,7 @@ static int calibrate_8974(struct tsens_priv *priv)
|
325 | 452 | return 0;
|
326 | 453 | }
|
327 | 454 |
|
328 |
| -/* v0.1: 8916, 8974 */ |
| 455 | +/* v0.1: 8916, 8939, 8974 */ |
329 | 456 |
|
330 | 457 | static struct tsens_features tsens_v0_1_feat = {
|
331 | 458 | .ver_major = VER_0_1,
|
@@ -386,6 +513,21 @@ struct tsens_plat_data data_8916 = {
|
386 | 513 | .fields = tsens_v0_1_regfields,
|
387 | 514 | };
|
388 | 515 |
|
| 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 | + |
389 | 531 | static const struct tsens_ops ops_8974 = {
|
390 | 532 | .init = init_common,
|
391 | 533 | .calibrate = calibrate_8974,
|
|
0 commit comments