← Documents Documentation/devicetree/bindings/thermal/qcom-tsens.yaml GitHub 원문 ↗

Linux 6.18.37 · Devicetree Bindings / Thermal

Qualcomm SoC Temperature Sensor (TSENS)

Qualcomm TSENS의 v0.1·v1·v2 호환성, NVMEM 보정 레이아웃, 세대별 인터럽트 규칙을 설명합니다.

Source pathDocumentation/devicetree/bindings/thermal/qcom-tsens.yaml
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

qcom-tsens.yaml:1-434

Qualcomm TSENS의 세대 식별 방식과 플랫폼별 compatible, 세 종류의 NVMEM 보정 데이터 형식, `uplow`·`critical`·`combined` 인터럽트 구성을 정리합니다. 접을 수 있는 영어 원문 전체는 줄 좌표를 보존하고, 한국어 전문 번역에서는 property·compatible·cell 이름·레지스터·인터럽트·예제 코드를 원형대로 유지합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 # SPDX-License-Identifier: (GPL-2.0 OR MIT)
2 # Copyright 2019 Linaro Ltd.
3 %YAML 1.2
4 ---
5 $id: http://devicetree.org/schemas/thermal/qcom-tsens.yaml#
6 $schema: http://devicetree.org/meta-schemas/core.yaml#
7
8 title: QCOM SoC Temperature Sensor (TSENS)
9
10 maintainers:
11 - Amit Kucheria <amitk@kernel.org>
12
13 description: |
14 QCOM SoCs have TSENS IP to allow temperature measurement. There are currently
15 three distinct major versions of the IP that is supported by a single driver.
16 The IP versions are named v0.1, v1 and v2 in the driver, where v0.1 captures
17 everything before v1 when there was no versioning information.
18
19 properties:
20 compatible:
21 oneOf:
22 - description: msm8960 TSENS based
23 items:
24 - enum:
25 - qcom,ipq8064-tsens
26 - qcom,msm8960-tsens
27
28 - description: v0.1 of TSENS
29 items:
30 - enum:
31 - qcom,mdm9607-tsens
32 - qcom,msm8226-tsens
33 - qcom,msm8909-tsens
34 - qcom,msm8916-tsens
35 - qcom,msm8939-tsens
36 - qcom,msm8974-tsens
37 - const: qcom,tsens-v0_1
38
39 - description: v1 of TSENS
40 items:
41 - enum:
42 - qcom,ipq5018-tsens
43 - qcom,msm8937-tsens
44 - qcom,msm8956-tsens
45 - qcom,msm8976-tsens
46 - qcom,qcs404-tsens
47 - const: qcom,tsens-v1
48
49 - description: v2 of TSENS
50 items:
51 - enum:
52 - qcom,glymur-tsens
53 - qcom,milos-tsens
54 - qcom,msm8953-tsens
55 - qcom,msm8996-tsens
56 - qcom,msm8998-tsens
57 - qcom,qcm2290-tsens
58 - qcom,qcs615-tsens
59 - qcom,sa8255p-tsens
60 - qcom,sa8775p-tsens
61 - qcom,sar2130p-tsens
62 - qcom,sc7180-tsens
63 - qcom,sc7280-tsens
64 - qcom,sc8180x-tsens
65 - qcom,sc8280xp-tsens
66 - qcom,sdm630-tsens
67 - qcom,sdm845-tsens
68 - qcom,sm6115-tsens
69 - qcom,sm6350-tsens
70 - qcom,sm6375-tsens
71 - qcom,sm8150-tsens
72 - qcom,sm8250-tsens
73 - qcom,sm8350-tsens
74 - qcom,sm8450-tsens
75 - qcom,sm8550-tsens
76 - qcom,sm8650-tsens
77 - qcom,x1e80100-tsens
78 - const: qcom,tsens-v2
79
80 - description: v2 of TSENS with combined interrupt
81 enum:
82 - qcom,ipq5332-tsens
83 - qcom,ipq5424-tsens
84 - qcom,ipq8074-tsens
85
86 - description: v2 of TSENS with combined interrupt
87 items:
88 - enum:
89 - qcom,ipq6018-tsens
90 - qcom,ipq9574-tsens
91 - const: qcom,ipq8074-tsens
92
93 reg:
94 items:
95 - description: TM registers
96 - description: SROT registers
97
98 interrupts:
99 minItems: 1
100 maxItems: 2
101
102 interrupt-names:
103 minItems: 1
104 maxItems: 2
105
106 nvmem-cells:
107 oneOf:
108 - minItems: 1
109 maxItems: 2
110 description:
111 Reference to an nvmem node for the calibration data
112 - minItems: 5
113 maxItems: 35
114 description: |
115 Reference to nvmem cells for the calibration mode, two calibration
116 bases and two cells per each sensor
117 # special case for msm8974 / apq8084
118 - maxItems: 51
119 description: |
120 Reference to nvmem cells for the calibration mode, two calibration
121 bases and two cells per each sensor, main and backup copies, plus use_backup cell
122
123 nvmem-cell-names:
124 oneOf:
125 - minItems: 1
126 items:
127 - const: calib
128 - enum:
129 - calib_backup
130 - calib_sel
131 - minItems: 5
132 items:
133 - const: mode
134 - const: base1
135 - const: base2
136 - pattern: '^s[0-9]+_p1$'
137 - pattern: '^s[0-9]+_p2$'
138 - pattern: '^s[0-9]+_p1$'
139 - pattern: '^s[0-9]+_p2$'
140 - pattern: '^s[0-9]+_p1$'
141 - pattern: '^s[0-9]+_p2$'
142 - pattern: '^s[0-9]+_p1$'
143 - pattern: '^s[0-9]+_p2$'
144 - pattern: '^s[0-9]+_p1$'
145 - pattern: '^s[0-9]+_p2$'
146 - pattern: '^s[0-9]+_p1$'
147 - pattern: '^s[0-9]+_p2$'
148 - pattern: '^s[0-9]+_p1$'
149 - pattern: '^s[0-9]+_p2$'
150 - pattern: '^s[0-9]+_p1$'
151 - pattern: '^s[0-9]+_p2$'
152 - pattern: '^s[0-9]+_p1$'
153 - pattern: '^s[0-9]+_p2$'
154 - pattern: '^s[0-9]+_p1$'
155 - pattern: '^s[0-9]+_p2$'
156 - pattern: '^s[0-9]+_p1$'
157 - pattern: '^s[0-9]+_p2$'
158 - pattern: '^s[0-9]+_p1$'
159 - pattern: '^s[0-9]+_p2$'
160 - pattern: '^s[0-9]+_p1$'
161 - pattern: '^s[0-9]+_p2$'
162 - pattern: '^s[0-9]+_p1$'
163 - pattern: '^s[0-9]+_p2$'
164 - pattern: '^s[0-9]+_p1$'
165 - pattern: '^s[0-9]+_p2$'
166 - pattern: '^s[0-9]+_p1$'
167 - pattern: '^s[0-9]+_p2$'
168 # special case for msm8974 / apq8084
169 - items:
170 - const: mode
171 - const: base1
172 - const: base2
173 - const: use_backup
174 - const: mode_backup
175 - const: base1_backup
176 - const: base2_backup
177 - const: s0_p1
178 - const: s0_p2
179 - const: s1_p1
180 - const: s1_p2
181 - const: s2_p1
182 - const: s2_p2
183 - const: s3_p1
184 - const: s3_p2
185 - const: s4_p1
186 - const: s4_p2
187 - const: s5_p1
188 - const: s5_p2
189 - const: s6_p1
190 - const: s6_p2
191 - const: s7_p1
192 - const: s7_p2
193 - const: s8_p1
194 - const: s8_p2
195 - const: s9_p1
196 - const: s9_p2
197 - const: s10_p1
198 - const: s10_p2
199 - const: s0_p1_backup
200 - const: s0_p2_backup
201 - const: s1_p1_backup
202 - const: s1_p2_backup
203 - const: s2_p1_backup
204 - const: s2_p2_backup
205 - const: s3_p1_backup
206 - const: s3_p2_backup
207 - const: s4_p1_backup
208 - const: s4_p2_backup
209 - const: s5_p1_backup
210 - const: s5_p2_backup
211 - const: s6_p1_backup
212 - const: s6_p2_backup
213 - const: s7_p1_backup
214 - const: s7_p2_backup
215 - const: s8_p1_backup
216 - const: s8_p2_backup
217 - const: s9_p1_backup
218 - const: s9_p2_backup
219 - const: s10_p1_backup
220 - const: s10_p2_backup
221 - minItems: 8
222 items:
223 - const: mode
224 - const: base0
225 - const: base1
226 - pattern: '^tsens_sens[0-9]+_off$'
227 - pattern: '^tsens_sens[0-9]+_off$'
228 - pattern: '^tsens_sens[0-9]+_off$'
229 - pattern: '^tsens_sens[0-9]+_off$'
230 - pattern: '^tsens_sens[0-9]+_off$'
231 - pattern: '^tsens_sens[0-9]+_off$'
232 - pattern: '^tsens_sens[0-9]+_off$'
233
234 "#qcom,sensors":
235 description:
236 Number of sensors enabled on this platform
237 $ref: /schemas/types.yaml#/definitions/uint32
238 minimum: 1
239 maximum: 16
240
241 "#thermal-sensor-cells":
242 const: 1
243
244 required:
245 - compatible
246 - interrupts
247 - interrupt-names
248 - "#qcom,sensors"
249
250 allOf:
251 - $ref: thermal-sensor.yaml#
252
253 - if:
254 properties:
255 compatible:
256 contains:
257 enum:
258 - qcom,ipq5018-tsens
259 - qcom,ipq8064-tsens
260 - qcom,msm8960-tsens
261 - qcom,tsens-v0_1
262 - qcom,tsens-v1
263 then:
264 properties:
265 interrupts:
266 items:
267 - description: Combined interrupt if upper or lower threshold crossed
268 interrupt-names:
269 items:
270 - const: uplow
271
272 - if:
273 properties:
274 compatible:
275 contains:
276 const: qcom,tsens-v2
277 then:
278 properties:
279 interrupts:
280 items:
281 - description: Combined interrupt if upper or lower threshold crossed
282 - description: Interrupt if critical threshold crossed
283 interrupt-names:
284 items:
285 - const: uplow
286 - const: critical
287
288 - if:
289 properties:
290 compatible:
291 contains:
292 enum:
293 - qcom,ipq5332-tsens
294 - qcom,ipq5424-tsens
295 - qcom,ipq8074-tsens
296 then:
297 properties:
298 interrupts:
299 items:
300 - description: Combined interrupt if upper, lower or critical thresholds crossed
301 interrupt-names:
302 items:
303 - const: combined
304
305 - if:
306 properties:
307 compatible:
308 contains:
309 enum:
310 - qcom,ipq5332-tsens
311 - qcom,ipq5424-tsens
312 - qcom,ipq8074-tsens
313 - qcom,tsens-v0_1
314 - qcom,tsens-v1
315 - qcom,tsens-v2
316
317 then:
318 required:
319 - reg
320
321 unevaluatedProperties: false
322
323 examples:
324 - |
325 #include <dt-bindings/interrupt-controller/arm-gic.h>
326 thermal-sensor {
327 compatible = "qcom,ipq8064-tsens";
328
329 nvmem-cells = <&tsens_calib>, <&tsens_calib_backup>;
330 nvmem-cell-names = "calib", "calib_backup";
331 interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
332 interrupt-names = "uplow";
333
334 #qcom,sensors = <11>;
335 #thermal-sensor-cells = <1>;
336 };
337
338 - |
339 #include <dt-bindings/interrupt-controller/arm-gic.h>
340 // Example 1 (new calibration data: for pre v1 IP):
341 thermal-sensor@4a9000 {
342 compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
343 reg = <0x4a9000 0x1000>, /* TM */
344 <0x4a8000 0x1000>; /* SROT */
345
346 nvmem-cells = <&tsens_mode>,
347 <&tsens_base1>, <&tsens_base2>,
348 <&tsens_s0_p1>, <&tsens_s0_p2>,
349 <&tsens_s1_p1>, <&tsens_s1_p2>,
350 <&tsens_s2_p1>, <&tsens_s2_p2>,
351 <&tsens_s4_p1>, <&tsens_s4_p2>,
352 <&tsens_s5_p1>, <&tsens_s5_p2>;
353 nvmem-cell-names = "mode",
354 "base1", "base2",
355 "s0_p1", "s0_p2",
356 "s1_p1", "s1_p2",
357 "s2_p1", "s2_p2",
358 "s4_p1", "s4_p2",
359 "s5_p1", "s5_p2";
360
361 interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
362 interrupt-names = "uplow";
363
364 #qcom,sensors = <5>;
365 #thermal-sensor-cells = <1>;
366 };
367
368 - |
369 #include <dt-bindings/interrupt-controller/arm-gic.h>
370 // Example 1 (legacy: for pre v1 IP):
371 tsens1: thermal-sensor@4a9000 {
372 compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
373 reg = <0x4a9000 0x1000>, /* TM */
374 <0x4a8000 0x1000>; /* SROT */
375
376 nvmem-cells = <&tsens_caldata>, <&tsens_calsel>;
377 nvmem-cell-names = "calib", "calib_sel";
378
379 interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
380 interrupt-names = "uplow";
381
382 #qcom,sensors = <5>;
383 #thermal-sensor-cells = <1>;
384 };
385
386 - |
387 #include <dt-bindings/interrupt-controller/arm-gic.h>
388 // Example 2 (for any platform containing v1 of the TSENS IP):
389 tsens2: thermal-sensor@4a9000 {
390 compatible = "qcom,qcs404-tsens", "qcom,tsens-v1";
391 reg = <0x004a9000 0x1000>, /* TM */
392 <0x004a8000 0x1000>; /* SROT */
393
394 nvmem-cells = <&tsens_caldata>;
395 nvmem-cell-names = "calib";
396
397 interrupts = <GIC_SPI 506 IRQ_TYPE_LEVEL_HIGH>;
398 interrupt-names = "uplow";
399
400 #qcom,sensors = <10>;
401 #thermal-sensor-cells = <1>;
402 };
403
404 - |
405 #include <dt-bindings/interrupt-controller/arm-gic.h>
406 // Example 3 (for any platform containing v2 of the TSENS IP):
407 tsens3: thermal-sensor@c263000 {
408 compatible = "qcom,sdm845-tsens", "qcom,tsens-v2";
409 reg = <0xc263000 0x1ff>,
410 <0xc222000 0x1ff>;
411
412 interrupts = <GIC_SPI 506 IRQ_TYPE_LEVEL_HIGH>,
413 <GIC_SPI 508 IRQ_TYPE_LEVEL_HIGH>;
414 interrupt-names = "uplow", "critical";
415
416 #qcom,sensors = <13>;
417 #thermal-sensor-cells = <1>;
418 };
419
420 - |
421 #include <dt-bindings/interrupt-controller/arm-gic.h>
422 // Example 4 (for any IPQ8074 based SoC-s):
423 tsens4: thermal-sensor@4a9000 {
424 compatible = "qcom,ipq8074-tsens";
425 reg = <0x4a9000 0x1000>,
426 <0x4a8000 0x1000>;
427
428 interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
429 interrupt-names = "combined";
430
431 #qcom,sensors = <16>;
432 #thermal-sensor-cells = <1>;
433 };
434 ...
435

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

QCOM SoC Temperature Sensor

1-12

이 GPL-2.0 또는 MIT YAML 스키마는 Qualcomm SoC Temperature Sensor(TSENS)를 정의합니다. 스키마 식별자는 `thermal/qcom-tsens.yaml#`이며 core 메타 스키마를 사용합니다. 저작권은 Linaro Ltd.에 있고 maintainer는 Amit Kucheria입니다.

TSENS IP 세대

13-18

Qualcomm SoC에는 온도를 측정하는 TSENS IP가 있습니다. 하나의 드라이버가 서로 구별되는 세 가지 주요 세대를 지원합니다. 드라이버에서는 이를 `v0.1`, `v1`, `v2`라고 부르며, 버전 정보가 존재하지 않았던 v1 이전의 모든 구현은 `v0.1`로 묶습니다.

MSM8960 계열과 TSENS v0.1

19-38

`compatible`은 `oneOf`로 세대와 SoC 조합을 제한합니다. MSM8960 기반 구현은 `qcom,ipq8064-tsens` 또는 `qcom,msm8960-tsens`를 직접 사용합니다. TSENS v0.1 구현은 `qcom,mdm9607-tsens`, `qcom,msm8226-tsens`, `qcom,msm8909-tsens`, `qcom,msm8916-tsens`, `qcom,msm8939-tsens`, `qcom,msm8974-tsens` 가운데 하나를 먼저 쓰고 `qcom,tsens-v0_1`을 fallback으로 둡니다.

properties:
  compatible:
    oneOf:
      - description: msm8960 TSENS based
        items:
          - enum:
              - qcom,ipq8064-tsens
              - qcom,msm8960-tsens

      - description: v0.1 of TSENS
        items:
          - enum:
              - qcom,mdm9607-tsens
              - qcom,msm8226-tsens
              - qcom,msm8909-tsens
              - qcom,msm8916-tsens
              - qcom,msm8939-tsens
              - qcom,msm8974-tsens
          - const: qcom,tsens-v0_1

TSENS v1, v2와 결합 인터럽트 변형

39-92

TSENS v1은 IPQ5018, MSM8937, MSM8956, MSM8976, QCS404용 SoC compatible 뒤에 `qcom,tsens-v1`을 둡니다. TSENS v2는 Glymur, Milos, MSM8953·8996·8998, QCM2290, QCS615, SA8255P·SA8775P·SAR2130P, SC7180·7280·8180X·8280XP, SDM630·845, SM6115·6350·6375·8150·8250·8350·8450·8550·8650, X1E80100용 compatible 뒤에 `qcom,tsens-v2`를 둡니다.

상한·하한·critical 조건을 하나의 인터럽트로 합친 v2 구현은 `qcom,ipq5332-tsens`, `qcom,ipq5424-tsens`, `qcom,ipq8074-tsens`를 직접 사용할 수 있습니다. IPQ6018과 IPQ9574는 각 SoC compatible 뒤에 `qcom,ipq8074-tsens`를 fallback으로 둡니다.

- description: v1 of TSENS
  items:
    - enum:
        - qcom,ipq5018-tsens
        - qcom,msm8937-tsens
        - qcom,msm8956-tsens
        - qcom,msm8976-tsens
        - qcom,qcs404-tsens
    - const: qcom,tsens-v1

- description: v2 of TSENS
  items:
    - enum:
        - qcom,glymur-tsens
        - qcom,milos-tsens
        - qcom,msm8953-tsens
        - qcom,msm8996-tsens
        - qcom,msm8998-tsens
        - qcom,qcm2290-tsens
        - qcom,qcs615-tsens
        - qcom,sa8255p-tsens
        - qcom,sa8775p-tsens
        - qcom,sar2130p-tsens
        - qcom,sc7180-tsens
        - qcom,sc7280-tsens
        - qcom,sc8180x-tsens
        - qcom,sc8280xp-tsens
        - qcom,sdm630-tsens
        - qcom,sdm845-tsens
        - qcom,sm6115-tsens
        - qcom,sm6350-tsens
        - qcom,sm6375-tsens
        - qcom,sm8150-tsens
        - qcom,sm8250-tsens
        - qcom,sm8350-tsens
        - qcom,sm8450-tsens
        - qcom,sm8550-tsens
        - qcom,sm8650-tsens
        - qcom,x1e80100-tsens
    - const: qcom,tsens-v2

- description: v2 of TSENS with combined interrupt
  enum:
    - qcom,ipq5332-tsens
    - qcom,ipq5424-tsens
    - qcom,ipq8074-tsens

- description: v2 of TSENS with combined interrupt
  items:
    - enum:
        - qcom,ipq6018-tsens
        - qcom,ipq9574-tsens
    - const: qcom,ipq8074-tsens

TM·SROT 레지스터와 인터럽트

93-105

`reg`는 두 항목을 순서대로 받으며 첫 번째가 TM 레지스터, 두 번째가 SROT 레지스터입니다. `interrupts`와 `interrupt-names`는 각각 최소 1개, 최대 2개를 허용합니다. 실제 개수와 이름은 뒤의 세대별 조건에서 결정됩니다.

reg:
  items:
    - description: TM registers
    - description: SROT registers

interrupts:
  minItems: 1
  maxItems: 2

interrupt-names:
  minItems: 1
  maxItems: 2

NVMEM 보정 데이터 참조

106-122

`nvmem-cells`에는 세 형태가 있습니다. 첫째, 보정 데이터를 담은 NVMEM 노드 참조 1~2개를 사용합니다. 둘째, 보정 모드, 두 개의 보정 base, 센서마다 두 셀을 두어 5~35개를 사용합니다. 셋째, MSM8974/APQ8084의 특수 형식은 main·backup 사본과 `use_backup` 셀까지 포함해 최대 51개를 사용합니다.

nvmem-cells:
  oneOf:
    - minItems: 1
      maxItems: 2
      description:
        Reference to an nvmem node for the calibration data
    - minItems: 5
      maxItems: 35
      description: |
        Reference to nvmem cells for the calibration mode, two calibration
        bases and two cells per each sensor
      # special case for msm8974 / apq8084
    - maxItems: 51
      description: |
        Reference to nvmem cells for the calibration mode, two calibration
        bases and two cells per each sensor, main and backup copies, plus use_backup cell

일반 NVMEM 셀 이름

123-168

`nvmem-cell-names`의 첫 형식은 반드시 `calib`로 시작하고 선택적으로 `calib_backup` 또는 `calib_sel`을 둡니다. 두 번째 형식은 최소 5개이며 `mode`, `base1`, `base2` 뒤에 각 센서의 point 1과 point 2 보정값을 뜻하는 `s[번호]_p1`, `s[번호]_p2` 쌍을 배치합니다. 스키마는 최대 16개 센서에 대응하도록 이 패턴 쌍을 반복합니다.

nvmem-cell-names:
  oneOf:
    - minItems: 1
      items:
        - const: calib
        - enum:
            - calib_backup
            - calib_sel
    - minItems: 5
      items:
        - const: mode
        - const: base1
        - const: base2
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
        - pattern: '^s[0-9]+_p1$'
        - pattern: '^s[0-9]+_p2$'
      # special case for msm8974 / apq8084

MSM8974/APQ8084와 offset 형식

169-233

MSM8974/APQ8084 특수 형식은 `mode`, `base1`, `base2`, `use_backup`, backup용 mode·base 두 개를 먼저 둡니다. 이어 센서 0~10의 `p1`·`p2` main 셀과 같은 센서 범위의 backup 셀을 정확한 순서로 나열합니다. 다른 offset 형식은 최소 8개이며 `mode`, `base0`, `base1` 뒤에 `tsens_sens[번호]_off` 패턴의 센서 offset 셀을 이어 붙입니다.

- items:
    - const: mode
    - const: base1
    - const: base2
    - const: use_backup
    - const: mode_backup
    - const: base1_backup
    - const: base2_backup
    - const: s0_p1
    - const: s0_p2
    - const: s1_p1
    - const: s1_p2
    - const: s2_p1
    - const: s2_p2
    - const: s3_p1
    - const: s3_p2
    - const: s4_p1
    - const: s4_p2
    - const: s5_p1
    - const: s5_p2
    - const: s6_p1
    - const: s6_p2
    - const: s7_p1
    - const: s7_p2
    - const: s8_p1
    - const: s8_p2
    - const: s9_p1
    - const: s9_p2
    - const: s10_p1
    - const: s10_p2
    - const: s0_p1_backup
    - const: s0_p2_backup
    - const: s1_p1_backup
    - const: s1_p2_backup
    - const: s2_p1_backup
    - const: s2_p2_backup
    - const: s3_p1_backup
    - const: s3_p2_backup
    - const: s4_p1_backup
    - const: s4_p2_backup
    - const: s5_p1_backup
    - const: s5_p2_backup
    - const: s6_p1_backup
    - const: s6_p2_backup
    - const: s7_p1_backup
    - const: s7_p2_backup
    - const: s8_p1_backup
    - const: s8_p2_backup
    - const: s9_p1_backup
    - const: s9_p2_backup
    - const: s10_p1_backup
    - const: s10_p2_backup
- minItems: 8
  items:
    - const: mode
    - const: base0
    - const: base1
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'
    - pattern: '^tsens_sens[0-9]+_off$'

센서 수와 provider cell

234-252

`#qcom,sensors`는 플랫폼에서 활성화한 센서 수를 나타내는 `uint32`이며 1~16 범위입니다. `#thermal-sensor-cells`는 센서 ID 한 셀을 받도록 1입니다. `compatible`, `interrupts`, `interrupt-names`, `#qcom,sensors`는 필수이며 공통 `thermal-sensor.yaml#` 스키마를 함께 적용합니다.

  "#qcom,sensors":
    description:
      Number of sensors enabled on this platform
    $ref: /schemas/types.yaml#/definitions/uint32
    minimum: 1
    maximum: 16

  "#thermal-sensor-cells":
    const: 1

required:
  - compatible
  - interrupts
  - interrupt-names
  - "#qcom,sensors"

allOf:
  - $ref: thermal-sensor.yaml#

구형 세대의 uplow 인터럽트

253-271

IPQ5018, IPQ8064, MSM8960 또는 `qcom,tsens-v0_1`·`qcom,tsens-v1`을 포함하는 구현은 인터럽트 하나를 사용합니다. 이 인터럽트는 상한 또는 하한 임계값을 넘었을 때 발생하는 결합 인터럽트이며 `interrupt-names` 값은 `uplow`입니다.

- if:
    properties:
      compatible:
        contains:
          enum:
            - qcom,ipq5018-tsens
            - qcom,ipq8064-tsens
            - qcom,msm8960-tsens
            - qcom,tsens-v0_1
            - qcom,tsens-v1
  then:
    properties:
      interrupts:
        items:
          - description: Combined interrupt if upper or lower threshold crossed
      interrupt-names:
        items:
          - const: uplow

v2와 IPQ 결합 인터럽트

272-303

`qcom,tsens-v2`를 포함하는 일반 v2 구현은 인터럽트 두 개를 순서대로 사용합니다. 첫 번째 `uplow`는 상한 또는 하한 임계값을 넘을 때, 두 번째 `critical`은 critical 임계값을 넘을 때 발생합니다. IPQ5332, IPQ5424, IPQ8074 변형은 세 임계 조건을 모두 하나로 합친 인터럽트 한 개를 사용하며 이름은 `combined`입니다.

- if:
    properties:
      compatible:
        contains:
          const: qcom,tsens-v2
  then:
    properties:
      interrupts:
        items:
          - description: Combined interrupt if upper or lower threshold crossed
          - description: Interrupt if critical threshold crossed
      interrupt-names:
        items:
          - const: uplow
          - const: critical

- if:
    properties:
      compatible:
        contains:
          enum:
            - qcom,ipq5332-tsens
            - qcom,ipq5424-tsens
            - qcom,ipq8074-tsens
  then:
    properties:
      interrupts:
        items:
          - description: Combined interrupt if upper, lower or critical thresholds crossed
      interrupt-names:
        items:
          - const: combined

세대 식별 구현의 reg 요구 조건

304-322

IPQ5332·IPQ5424·IPQ8074와 `qcom,tsens-v0_1`·`qcom,tsens-v1`·`qcom,tsens-v2` 가운데 하나를 포함하면 `reg`가 필수입니다. `unevaluatedProperties: false`이므로 공통 thermal sensor 스키마와 이 binding에서 평가하지 않은 속성은 허용하지 않습니다.


  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,ipq5332-tsens
              - qcom,ipq5424-tsens
              - qcom,ipq8074-tsens
              - qcom,tsens-v0_1
              - qcom,tsens-v1
              - qcom,tsens-v2

    then:
      required:
        - reg

unevaluatedProperties: false

IPQ8064 기존 보정 예제

323-337

첫 예제는 `qcom,ipq8064-tsens`를 사용하고 `tsens_calib`와 `tsens_calib_backup` NVMEM 참조를 `calib`, `calib_backup`으로 연결합니다. GIC SPI 178 level-high 인터럽트의 이름은 `uplow`이며 센서 11개와 1-cell thermal sensor provider를 선언합니다.

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    thermal-sensor {
        compatible = "qcom,ipq8064-tsens";

        nvmem-cells = <&tsens_calib>, <&tsens_calib_backup>;
        nvmem-cell-names = "calib", "calib_backup";
        interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-names = "uplow";

        #qcom,sensors = <11>;
        #thermal-sensor-cells = <1>;
    };

v0.1 새 보정 데이터 예제

338-367

두 번째 예제는 v1 이전 IP의 새 보정 데이터 형식입니다. MSM8916 v0.1의 TM과 SROT 레지스터를 지정하고 `mode`, `base1`, `base2`, 센서 0·1·2·4·5의 `p1`·`p2` 셀을 같은 순서의 이름과 연결합니다. GIC SPI 184 `uplow` 인터럽트, 센서 5개, 1-cell provider를 선언합니다.

- |
  #include <dt-bindings/interrupt-controller/arm-gic.h>
  // Example 1 (new calibration data: for pre v1 IP):
  thermal-sensor@4a9000 {
      compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
      reg = <0x4a9000 0x1000>, /* TM */
            <0x4a8000 0x1000>; /* SROT */

      nvmem-cells = <&tsens_mode>,
                    <&tsens_base1>, <&tsens_base2>,
                    <&tsens_s0_p1>, <&tsens_s0_p2>,
                    <&tsens_s1_p1>, <&tsens_s1_p2>,
                    <&tsens_s2_p1>, <&tsens_s2_p2>,
                    <&tsens_s4_p1>, <&tsens_s4_p2>,
                    <&tsens_s5_p1>, <&tsens_s5_p2>;
      nvmem-cell-names = "mode",
                         "base1", "base2",
                         "s0_p1", "s0_p2",
                         "s1_p1", "s1_p2",
                         "s2_p1", "s2_p2",
                         "s4_p1", "s4_p2",
                         "s5_p1", "s5_p2";

      interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
      interrupt-names = "uplow";

      #qcom,sensors = <5>;
      #thermal-sensor-cells = <1>;
  };

v0.1 legacy 보정 예제

368-385

세 번째 예제도 MSM8916 v0.1이지만 legacy 보정 형식을 사용합니다. `tsens_caldata`와 `tsens_calsel`을 각각 `calib`, `calib_sel`에 연결하고 같은 TM·SROT 주소, GIC SPI 184 `uplow` 인터럽트, 센서 5개를 선언합니다.

- |
  #include <dt-bindings/interrupt-controller/arm-gic.h>
  // Example 1 (legacy: for pre v1 IP):
  tsens1: thermal-sensor@4a9000 {
      compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
      reg = <0x4a9000 0x1000>, /* TM */
            <0x4a8000 0x1000>; /* SROT */

      nvmem-cells = <&tsens_caldata>, <&tsens_calsel>;
      nvmem-cell-names = "calib", "calib_sel";

      interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
      interrupt-names = "uplow";

      #qcom,sensors = <5>;
      #thermal-sensor-cells = <1>;
  };

TSENS v1 예제

386-403

네 번째 예제는 QCS404와 `qcom,tsens-v1` 조합입니다. TM·SROT 레지스터와 단일 `calib` NVMEM 참조를 사용하고 GIC SPI 506 `uplow` 인터럽트, 센서 10개, 1-cell provider를 선언합니다.

- |
  #include <dt-bindings/interrupt-controller/arm-gic.h>
  // Example 2 (for any platform containing v1 of the TSENS IP):
  tsens2: thermal-sensor@4a9000 {
      compatible = "qcom,qcs404-tsens", "qcom,tsens-v1";
      reg = <0x004a9000 0x1000>, /* TM */
            <0x004a8000 0x1000>; /* SROT */

      nvmem-cells = <&tsens_caldata>;
      nvmem-cell-names = "calib";

      interrupts = <GIC_SPI 506 IRQ_TYPE_LEVEL_HIGH>;
      interrupt-names = "uplow";

      #qcom,sensors = <10>;
      #thermal-sensor-cells = <1>;
  };

TSENS v2 예제

404-419

다섯 번째 예제는 SDM845와 `qcom,tsens-v2` 조합입니다. 두 레지스터 영역과 GIC SPI 506·508 인터럽트를 지정하며 이름은 각각 `uplow`, `critical`입니다. 플랫폼은 센서 13개를 활성화합니다.

- |
  #include <dt-bindings/interrupt-controller/arm-gic.h>
  // Example 3 (for any platform containing v2 of the TSENS IP):
  tsens3: thermal-sensor@c263000 {
      compatible = "qcom,sdm845-tsens", "qcom,tsens-v2";
      reg = <0xc263000 0x1ff>,
            <0xc222000 0x1ff>;

      interrupts = <GIC_SPI 506 IRQ_TYPE_LEVEL_HIGH>,
                   <GIC_SPI 508 IRQ_TYPE_LEVEL_HIGH>;
      interrupt-names = "uplow", "critical";

      #qcom,sensors = <13>;
      #thermal-sensor-cells = <1>;
  };

IPQ8074 결합 인터럽트 예제

420-434

마지막 예제는 `qcom,ipq8074-tsens`를 사용합니다. TM·SROT 레지스터와 GIC SPI 184 인터럽트 하나를 지정하고 이름을 `combined`로 둡니다. 상한·하한·critical 조건이 이 하나의 인터럽트로 합쳐지며 센서 16개와 1-cell provider를 선언합니다.

  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    // Example 4 (for any IPQ8074 based SoC-s):
    tsens4: thermal-sensor@4a9000 {
        compatible = "qcom,ipq8074-tsens";
        reg = <0x4a9000 0x1000>,
              <0x4a8000 0x1000>;

        interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-names = "combined";

        #qcom,sensors = <16>;
        #thermal-sensor-cells = <1>;
    };
...