1# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: "http://devicetree.org/schemas/iio/adc/st,stm32-adc.yaml#"
5$schema: "http://devicetree.org/meta-schemas/core.yaml#"
6
7title: STMicroelectronics STM32 ADC
8
9description: |
10  STM32 ADC is a successive approximation analog-to-digital converter.
11  It has several multiplexed input channels. Conversions can be performed
12  in single, continuous, scan or discontinuous mode. Result of the ADC is
13  stored in a left-aligned or right-aligned 32-bit data register.
14  Conversions can be launched in software or using hardware triggers.
15
16  The analog watchdog feature allows the application to detect if the input
17  voltage goes beyond the user-defined, higher or lower thresholds.
18
19  Each STM32 ADC block can have up to 3 ADC instances.
20
21maintainers:
22  - Fabrice Gasnier <fabrice.gasnier@foss.st.com>
23
24properties:
25  compatible:
26    enum:
27      - st,stm32f4-adc-core
28      - st,stm32h7-adc-core
29      - st,stm32mp1-adc-core
30      - st,stm32mp13-adc-core
31
32  reg:
33    maxItems: 1
34
35  interrupts:
36    description: |
37      One or more interrupts for ADC block, depending on part used:
38        - stm32f4 and stm32h7 share a common ADC interrupt line.
39        - stm32mp1 has two separate interrupt lines, one for each ADC within
40          ADC block.
41        - stm32mp13 has an interrupt line per ADC block.
42    minItems: 1
43    maxItems: 2
44
45  clocks:
46    minItems: 1
47    maxItems: 2
48    description: |
49      Core can use up to two clocks, depending on part used:
50        - "adc" clock: for the analog circuitry, common to all ADCs.
51          It's required on stm32f4.
52          It's optional on stm32h7 and stm32mp1.
53        - "bus" clock: for registers access, common to all ADCs.
54          It's not present on stm32f4.
55          It's required on stm32h7 and stm32mp1.
56
57  clock-names: true
58
59  st,max-clk-rate-hz:
60    description:
61      Allow to specify desired max clock rate used by analog circuitry.
62
63  vdda-supply:
64    description: Phandle to the vdda input analog voltage.
65
66  vref-supply:
67    description: Phandle to the vref input analog reference voltage.
68
69  booster-supply:
70    description:
71      Phandle to the embedded booster regulator that can be used to supply ADC
72      analog input switches on stm32h7 and stm32mp1.
73
74  vdd-supply:
75    description:
76      Phandle to the vdd input voltage. It can be used to supply ADC analog
77      input switches on stm32mp1.
78
79  st,syscfg:
80    description:
81      Phandle to system configuration controller. It can be used to control the
82      analog circuitry on stm32mp1.
83    $ref: "/schemas/types.yaml#/definitions/phandle-array"
84
85  interrupt-controller: true
86
87  '#interrupt-cells':
88    const: 1
89
90  '#address-cells':
91    const: 1
92
93  '#size-cells':
94    const: 0
95
96allOf:
97  - if:
98      properties:
99        compatible:
100          contains:
101            const: st,stm32f4-adc-core
102
103    then:
104      properties:
105        clocks:
106          maxItems: 1
107
108        clock-names:
109          const: adc
110
111        interrupts:
112          items:
113            - description: interrupt line common for all ADCs
114
115        st,max-clk-rate-hz:
116          minimum: 600000
117          maximum: 36000000
118          default: 36000000
119
120        booster-supply: false
121
122        vdd-supply: false
123
124        st,syscfg: false
125
126  - if:
127      properties:
128        compatible:
129          contains:
130            const: st,stm32h7-adc-core
131
132    then:
133      properties:
134        clocks:
135          minItems: 1
136          maxItems: 2
137
138        clock-names:
139          items:
140            - const: bus
141            - const: adc
142          minItems: 1
143
144        interrupts:
145          items:
146            - description: interrupt line common for all ADCs
147
148        st,max-clk-rate-hz:
149          minimum: 120000
150          maximum: 36000000
151          default: 36000000
152
153        vdd-supply: false
154
155        st,syscfg: false
156
157  - if:
158      properties:
159        compatible:
160          contains:
161            const: st,stm32mp1-adc-core
162
163    then:
164      properties:
165        clocks:
166          minItems: 1
167          maxItems: 2
168
169        clock-names:
170          items:
171            - const: bus
172            - const: adc
173          minItems: 1
174
175        interrupts:
176          items:
177            - description: interrupt line for ADC1
178            - description: interrupt line for ADC2
179
180        st,max-clk-rate-hz:
181          minimum: 120000
182          maximum: 36000000
183          default: 36000000
184
185  - if:
186      properties:
187        compatible:
188          contains:
189            const: st,stm32mp13-adc-core
190
191    then:
192      properties:
193        clocks:
194          minItems: 1
195          maxItems: 2
196
197        clock-names:
198          items:
199            - const: bus
200            - const: adc
201          minItems: 1
202
203        interrupts:
204          items:
205            - description: ADC interrupt line
206
207        st,max-clk-rate-hz:
208          minimum: 150000
209          maximum: 75000000
210          default: 75000000
211
212additionalProperties: false
213
214required:
215  - compatible
216  - reg
217  - interrupts
218  - clocks
219  - clock-names
220  - vdda-supply
221  - vref-supply
222  - interrupt-controller
223  - '#interrupt-cells'
224  - '#address-cells'
225  - '#size-cells'
226
227patternProperties:
228  "^adc@[0-9]+$":
229    type: object
230    description:
231      An ADC block node should contain at least one subnode, representing an
232      ADC instance available on the machine.
233
234    properties:
235      compatible:
236        enum:
237          - st,stm32f4-adc
238          - st,stm32h7-adc
239          - st,stm32mp1-adc
240          - st,stm32mp13-adc
241
242      reg:
243        description: |
244          Offset of ADC instance in ADC block. Valid values are:
245            - 0x0:   ADC1
246            - 0x100: ADC2
247            - 0x200: ADC3 (stm32f4 only)
248        maxItems: 1
249
250      '#io-channel-cells':
251        const: 1
252
253      '#address-cells':
254        const: 1
255
256      '#size-cells':
257        const: 0
258
259      interrupts:
260        description: |
261          IRQ Line for the ADC instance. Valid values are:
262            - 0 for adc@0 (single adc for stm32mp13)
263            - 1 for adc@100
264            - 2 for adc@200 (stm32f4 only)
265        maxItems: 1
266
267      clocks:
268        description:
269          Input clock private to this ADC instance. It's required only on
270          stm32f4, that has per instance clock input for registers access.
271        maxItems: 1
272
273      dmas:
274        description: RX DMA Channel
275        maxItems: 1
276
277      dma-names:
278        const: rx
279
280      assigned-resolution-bits:
281        description: |
282          Resolution (bits) to use for conversions:
283            - can be 6, 8, 10 or 12 on stm32f4 and stm32mp13
284            - can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
285
286      st,adc-channels:
287        description: |
288          List of single-ended channels muxed for this ADC. It can have up to:
289            - 16 channels, numbered from 0 to 15 (for in0..in15) on stm32f4
290            - 19 channels, numbered from 0 to 18 (for in0..in18) on stm32mp13.
291            - 20 channels, numbered from 0 to 19 (for in0..in19) on stm32h7 and
292              stm32mp1.
293        $ref: /schemas/types.yaml#/definitions/uint32-array
294        deprecated: true
295
296      st,adc-diff-channels:
297        description: |
298          List of differential channels muxed for this ADC. Some channels can
299          be configured as differential instead of single-ended on stm32h7 and
300          on stm32mp1. Positive and negative inputs pairs are listed:
301          <vinp vinn>, <vinp vinn>,... vinp and vinn are numbered from 0 to 19.
302
303          Note: At least one of "st,adc-channels" or "st,adc-diff-channels" is
304          required if no adc generic channel is defined. These legacy channel
305          properties are exclusive with adc generic channel bindings.
306          Both properties can be used together. Some channels can be
307          used as single-ended and some other ones as differential (mixed). But
308          channels can't be configured both as single-ended and differential.
309        $ref: /schemas/types.yaml#/definitions/uint32-matrix
310        items:
311          items:
312            - description: |
313                "vinp" indicates positive input number
314              minimum: 0
315              maximum: 19
316            - description: |
317                "vinn" indicates negative input number
318              minimum: 0
319              maximum: 19
320        deprecated: true
321
322      st,min-sample-time-nsecs:
323        description:
324          Minimum sampling time in nanoseconds. Depending on hardware (board)
325          e.g. high/low analog input source impedance, fine tune of ADC
326          sampling time may be recommended. This can be either one value or an
327          array that matches "st,adc-channels" and/or "st,adc-diff-channels"
328          list, to set sample time resp. for all channels, or independently for
329          each channel.
330        $ref: /schemas/types.yaml#/definitions/uint32-array
331        deprecated: true
332
333      nvmem-cells:
334        items:
335          - description: Phandle to the calibration vrefint data provided by otp
336
337      nvmem-cell-names:
338        items:
339          - const: vrefint
340
341    patternProperties:
342      "^channel@([0-9]|1[0-9])$":
343        type: object
344        $ref: "adc.yaml"
345        description: Represents the external channels which are connected to the ADC.
346
347        properties:
348          reg:
349            items:
350              minimum: 0
351              maximum: 19
352
353          label:
354            description: |
355              Unique name to identify which channel this is.
356              Reserved label names "vddcore", "vddcpu", "vddq_ddr", "vrefint" and "vbat"
357              are used to identify internal channels with matching names.
358
359          diff-channels:
360            $ref: /schemas/types.yaml#/definitions/uint32-array
361            items:
362              minimum: 0
363              maximum: 19
364
365          st,min-sample-time-ns:
366            description: |
367              Minimum sampling time in nanoseconds. Depending on hardware (board)
368              e.g. high/low analog input source impedance, fine tune of ADC
369              sampling time may be recommended.
370
371        required:
372          - reg
373
374        additionalProperties: false
375
376    allOf:
377      - if:
378          properties:
379            compatible:
380              contains:
381                const: st,stm32f4-adc
382
383        then:
384          properties:
385            reg:
386              enum:
387                - 0x0
388                - 0x100
389                - 0x200
390
391            interrupts:
392              minimum: 0
393              maximum: 2
394
395            assigned-resolution-bits:
396              enum: [6, 8, 10, 12]
397              default: 12
398
399            st,adc-channels:
400              minItems: 1
401              maxItems: 16
402              items:
403                minimum: 0
404                maximum: 15
405
406            st,adc-diff-channels: false
407
408            st,min-sample-time-nsecs:
409              minItems: 1
410              maxItems: 16
411              items:
412                minimum: 80
413
414          required:
415            - clocks
416
417      - if:
418          properties:
419            compatible:
420              contains:
421                enum:
422                  - st,stm32h7-adc
423                  - st,stm32mp1-adc
424
425        then:
426          properties:
427            reg:
428              enum:
429                - 0x0
430                - 0x100
431
432            interrupts:
433              minimum: 0
434              maximum: 1
435
436            assigned-resolution-bits:
437              enum: [8, 10, 12, 14, 16]
438              default: 16
439
440            st,adc-channels:
441              minItems: 1
442              maxItems: 20
443              items:
444                minimum: 0
445                maximum: 19
446
447            st,min-sample-time-nsecs:
448              minItems: 1
449              maxItems: 20
450              items:
451                minimum: 40
452
453
454      - if:
455          properties:
456            compatible:
457              contains:
458                const: st,stm32mp13-adc
459
460        then:
461          properties:
462            reg:
463              const: 0x0
464
465            interrupts:
466              const: 0
467
468            assigned-resolution-bits:
469              enum: [6, 8, 10, 12]
470              default: 12
471
472            st,adc-channels:
473              minItems: 1
474              maxItems: 19
475              items:
476                minimum: 0
477                maximum: 18
478
479            st,min-sample-time-nsecs:
480              minItems: 1
481              maxItems: 19
482              items:
483                minimum: 40
484    additionalProperties: false
485
486    required:
487      - compatible
488      - reg
489      - interrupts
490      - '#io-channel-cells'
491
492examples:
493  - |
494    // Example 1: with stm32f429, ADC1, single-ended channel 8
495      adc123: adc@40012000 {
496        compatible = "st,stm32f4-adc-core";
497        reg = <0x40012000 0x400>;
498        interrupts = <18>;
499        clocks = <&rcc 0 168>;
500        clock-names = "adc";
501        st,max-clk-rate-hz = <36000000>;
502        vdda-supply = <&vdda>;
503        vref-supply = <&vref>;
504        interrupt-controller;
505        #interrupt-cells = <1>;
506        #address-cells = <1>;
507        #size-cells = <0>;
508        adc@0 {
509          compatible = "st,stm32f4-adc";
510          #io-channel-cells = <1>;
511          reg = <0x0>;
512          clocks = <&rcc 0 168>;
513          interrupt-parent = <&adc123>;
514          interrupts = <0>;
515          st,adc-channels = <8>;
516          dmas = <&dma2 0 0 0x400 0x0>;
517          dma-names = "rx";
518          assigned-resolution-bits = <8>;
519        };
520        // ...
521        // other adc child nodes follow...
522      };
523
524  - |
525    // Example 2: with stm32mp157c to setup ADC1 with:
526    // - channels 0 & 1 as single-ended
527    // - channels 2 & 3 as differential (with resp. 6 & 7 negative inputs)
528      #include <dt-bindings/interrupt-controller/arm-gic.h>
529      #include <dt-bindings/clock/stm32mp1-clks.h>
530      adc12: adc@48003000 {
531        compatible = "st,stm32mp1-adc-core";
532        reg = <0x48003000 0x400>;
533        interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
534                     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
535        clocks = <&rcc ADC12>, <&rcc ADC12_K>;
536        clock-names = "bus", "adc";
537        booster-supply = <&booster>;
538        vdd-supply = <&vdd>;
539        vdda-supply = <&vdda>;
540        vref-supply = <&vref>;
541        st,syscfg = <&syscfg>;
542        interrupt-controller;
543        #interrupt-cells = <1>;
544        #address-cells = <1>;
545        #size-cells = <0>;
546        adc@0 {
547          compatible = "st,stm32mp1-adc";
548          #io-channel-cells = <1>;
549          reg = <0x0>;
550          interrupt-parent = <&adc12>;
551          interrupts = <0>;
552          st,adc-channels = <0 1>;
553          st,adc-diff-channels = <2 6>, <3 7>;
554          st,min-sample-time-nsecs = <5000>;
555          dmas = <&dmamux1 9 0x400 0x05>;
556          dma-names = "rx";
557        };
558        // ...
559        // other adc child node follow...
560      };
561
562  - |
563    // Example 3: with stm32mp157c to setup ADC2 with:
564    // - internal channels 13, 14, 15.
565      #include <dt-bindings/interrupt-controller/arm-gic.h>
566      #include <dt-bindings/clock/stm32mp1-clks.h>
567      adc122: adc@48003000 {
568        compatible = "st,stm32mp1-adc-core";
569        reg = <0x48003000 0x400>;
570        interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
571                     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
572        clocks = <&rcc ADC12>, <&rcc ADC12_K>;
573        clock-names = "bus", "adc";
574        booster-supply = <&booster>;
575        vdd-supply = <&vdd>;
576        vdda-supply = <&vdda>;
577        vref-supply = <&vref>;
578        st,syscfg = <&syscfg>;
579        interrupt-controller;
580        #interrupt-cells = <1>;
581        #address-cells = <1>;
582        #size-cells = <0>;
583        adc@100 {
584          compatible = "st,stm32mp1-adc";
585          #io-channel-cells = <1>;
586          reg = <0x100>;
587          interrupts = <1>;
588          #address-cells = <1>;
589          #size-cells = <0>;
590          channel@13 {
591            reg = <13>;
592            label = "vrefint";
593            st,min-sample-time-ns = <9000>;
594          };
595          channel@14 {
596            reg = <14>;
597            label = "vddcore";
598            st,min-sample-time-ns = <9000>;
599          };
600          channel@15 {
601            reg = <15>;
602            label = "vbat";
603            st,min-sample-time-ns = <9000>;
604          };
605        };
606      };
607
608...
609