Commit | Line | Data |
---|---|---|
770324a4 | 1 | // SPDX-License-Identifier: GPL-2.0 |
d059c739 RN |
2 | /* |
3 | * Copyright (c) 2015, The Linux Foundation. All rights reserved. | |
770324a4 | 4 | * Copyright (c) 2018, Linaro Limited |
d059c739 RN |
5 | */ |
6 | ||
d059c739 | 7 | #include <linux/regmap.h> |
432121ad | 8 | #include <linux/bitops.h> |
d059c739 RN |
9 | #include "tsens.h" |
10 | ||
770324a4 AK |
11 | #define STATUS_OFFSET 0xa0 |
12 | #define LAST_TEMP_MASK 0xfff | |
d059c739 | 13 | #define STATUS_VALID_BIT BIT(21) |
d059c739 | 14 | |
770324a4 | 15 | static int get_temp_tsens_v2(struct tsens_device *tmdev, int id, int *temp) |
d059c739 RN |
16 | { |
17 | struct tsens_sensor *s = &tmdev->sensor[id]; | |
18 | u32 code; | |
e0fe0142 | 19 | unsigned int status_reg; |
432121ad AK |
20 | u32 last_temp = 0, last_temp2 = 0, last_temp3 = 0; |
21 | int ret; | |
d059c739 | 22 | |
e0fe0142 | 23 | status_reg = tmdev->tm_offset + STATUS_OFFSET + s->hw_id * 4; |
67b0f5e0 | 24 | ret = regmap_read(tmdev->tm_map, status_reg, &code); |
d059c739 RN |
25 | if (ret) |
26 | return ret; | |
27 | last_temp = code & LAST_TEMP_MASK; | |
28 | if (code & STATUS_VALID_BIT) | |
29 | goto done; | |
30 | ||
31 | /* Try a second time */ | |
67b0f5e0 | 32 | ret = regmap_read(tmdev->tm_map, status_reg, &code); |
d059c739 RN |
33 | if (ret) |
34 | return ret; | |
35 | if (code & STATUS_VALID_BIT) { | |
36 | last_temp = code & LAST_TEMP_MASK; | |
37 | goto done; | |
38 | } else { | |
39 | last_temp2 = code & LAST_TEMP_MASK; | |
40 | } | |
41 | ||
42 | /* Try a third/last time */ | |
67b0f5e0 | 43 | ret = regmap_read(tmdev->tm_map, status_reg, &code); |
d059c739 RN |
44 | if (ret) |
45 | return ret; | |
46 | if (code & STATUS_VALID_BIT) { | |
47 | last_temp = code & LAST_TEMP_MASK; | |
48 | goto done; | |
49 | } else { | |
50 | last_temp3 = code & LAST_TEMP_MASK; | |
51 | } | |
52 | ||
53 | if (last_temp == last_temp2) | |
54 | last_temp = last_temp2; | |
55 | else if (last_temp2 == last_temp3) | |
56 | last_temp = last_temp3; | |
57 | done: | |
432121ad AK |
58 | /* Convert temperature from deciCelsius to milliCelsius */ |
59 | *temp = sign_extend32(last_temp, fls(LAST_TEMP_MASK) - 1) * 100; | |
d059c739 RN |
60 | |
61 | return 0; | |
62 | } | |
63 | ||
770324a4 | 64 | static const struct tsens_ops ops_generic_v2 = { |
d059c739 | 65 | .init = init_common, |
770324a4 | 66 | .get_temp = get_temp_tsens_v2, |
d059c739 RN |
67 | }; |
68 | ||
191dc74b AK |
69 | const struct tsens_data data_tsens_v2 = { |
70 | .ops = &ops_generic_v2, | |
c130a760 | 71 | .reg_offsets = { [SROT_CTRL_OFFSET] = 0x4 }, |
191dc74b AK |
72 | }; |
73 | ||
74 | /* Kept around for backward compatibility with old msm8996.dtsi */ | |
d059c739 RN |
75 | const struct tsens_data data_8996 = { |
76 | .num_sensors = 13, | |
770324a4 | 77 | .ops = &ops_generic_v2, |
c130a760 | 78 | .reg_offsets = { [SROT_CTRL_OFFSET] = 0x4 }, |
d059c739 | 79 | }; |