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 bindings
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@st.com>
23
24properties:
25  compatible:
26    enum:
27      - st,stm32f4-adc-core
28      - st,stm32h7-adc-core
29      - st,stm32mp1-adc-core
30
31  reg:
32    maxItems: 1
33
34  interrupts:
35    description: |
36      One or more interrupts for ADC block, depending on part used:
37        - stm32f4 and stm32h7 share a common ADC interrupt line.
38        - stm32mp1 has two separate interrupt lines, one for each ADC within
39          ADC block.
40    minItems: 1
41    maxItems: 2
42
43  clocks:
44    description: |
45      Core can use up to two clocks, depending on part used:
46        - "adc" clock: for the analog circuitry, common to all ADCs.
47          It's required on stm32f4.
48          It's optional on stm32h7 and stm32mp1.
49        - "bus" clock: for registers access, common to all ADCs.
50          It's not present on stm32f4.
51          It's required on stm32h7 and stm32mp1.
52
53  clock-names: true
54
55  st,max-clk-rate-hz:
56    description:
57      Allow to specify desired max clock rate used by analog circuitry.
58
59  vdda-supply:
60    description: Phandle to the vdda input analog voltage.
61
62  vref-supply:
63    description: Phandle to the vref input analog reference voltage.
64
65  booster-supply:
66    description:
67      Phandle to the embedded booster regulator that can be used to supply ADC
68      analog input switches on stm32h7 and stm32mp1.
69
70  vdd-supply:
71    description:
72      Phandle to the vdd input voltage. It can be used to supply ADC analog
73      input switches on stm32mp1.
74
75  st,syscfg:
76    description:
77      Phandle to system configuration controller. It can be used to control the
78      analog circuitry on stm32mp1.
79    $ref: "/schemas/types.yaml#/definitions/phandle-array"
80
81  interrupt-controller: true
82
83  '#interrupt-cells':
84    const: 1
85
86  '#address-cells':
87    const: 1
88
89  '#size-cells':
90    const: 0
91
92allOf:
93  - if:
94      properties:
95        compatible:
96          contains:
97            const: st,stm32f4-adc-core
98
99    then:
100      properties:
101        clocks:
102          maxItems: 1
103
104        clock-names:
105          const: adc
106
107        interrupts:
108          items:
109            - description: interrupt line common for all ADCs
110
111        st,max-clk-rate-hz:
112          minimum: 600000
113          maximum: 36000000
114          default: 36000000
115
116        booster-supply: false
117
118        vdd-supply: false
119
120        st,syscfg: false
121
122  - if:
123      properties:
124        compatible:
125          contains:
126            const: st,stm32h7-adc-core
127
128    then:
129      properties:
130        clocks:
131          minItems: 1
132          maxItems: 2
133
134        clock-names:
135          items:
136            - const: bus
137            - const: adc
138          minItems: 1
139          maxItems: 2
140
141        interrupts:
142          items:
143            - description: interrupt line common for all ADCs
144
145        st,max-clk-rate-hz:
146          minimum: 120000
147          maximum: 36000000
148          default: 36000000
149
150        vdd-supply: false
151
152        st,syscfg: false
153
154  - if:
155      properties:
156        compatible:
157          contains:
158            const: st,stm32mp1-adc-core
159
160    then:
161      properties:
162        clocks:
163          minItems: 1
164          maxItems: 2
165
166        clock-names:
167          items:
168            - const: bus
169            - const: adc
170          minItems: 1
171          maxItems: 2
172
173        interrupts:
174          items:
175            - description: interrupt line for ADC1
176            - description: interrupt line for ADC2
177
178        st,max-clk-rate-hz:
179          minimum: 120000
180          maximum: 36000000
181          default: 36000000
182
183additionalProperties: false
184
185required:
186  - compatible
187  - reg
188  - interrupts
189  - clocks
190  - clock-names
191  - vdda-supply
192  - vref-supply
193  - interrupt-controller
194  - '#interrupt-cells'
195  - '#address-cells'
196  - '#size-cells'
197
198patternProperties:
199  "^adc@[0-9]+$":
200    type: object
201    description:
202      An ADC block node should contain at least one subnode, representing an
203      ADC instance available on the machine.
204
205    properties:
206      compatible:
207        enum:
208          - st,stm32f4-adc
209          - st,stm32h7-adc
210          - st,stm32mp1-adc
211
212      reg:
213        description: |
214          Offset of ADC instance in ADC block. Valid values are:
215            - 0x0:   ADC1
216            - 0x100: ADC2
217            - 0x200: ADC3 (stm32f4 only)
218        maxItems: 1
219
220      '#io-channel-cells':
221        const: 1
222
223      interrupts:
224        description: |
225          IRQ Line for the ADC instance. Valid values are:
226            - 0 for adc@0
227            - 1 for adc@100
228            - 2 for adc@200 (stm32f4 only)
229        maxItems: 1
230
231      clocks:
232        description:
233          Input clock private to this ADC instance. It's required only on
234          stm32f4, that has per instance clock input for registers access.
235        maxItems: 1
236
237      dmas:
238        description: RX DMA Channel
239        maxItems: 1
240
241      dma-names:
242        const: rx
243
244      assigned-resolution-bits:
245        description: |
246          Resolution (bits) to use for conversions:
247            - can be 6, 8, 10 or 12 on stm32f4
248            - can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
249        $ref: /schemas/types.yaml#/definitions/uint32
250
251      st,adc-channels:
252        description: |
253          List of single-ended channels muxed for this ADC. It can have up to:
254            - 16 channels, numbered from 0 to 15 (for in0..in15) on stm32f4
255            - 20 channels, numbered from 0 to 19 (for in0..in19) on stm32h7 and
256              stm32mp1.
257        $ref: /schemas/types.yaml#/definitions/uint32-array
258
259      st,adc-diff-channels:
260        description: |
261          List of differential channels muxed for this ADC. Some channels can
262          be configured as differential instead of single-ended on stm32h7 and
263          on stm32mp1. Positive and negative inputs pairs are listed:
264          <vinp vinn>, <vinp vinn>,... vinp and vinn are numbered from 0 to 19.
265
266          Note: At least one of "st,adc-channels" or "st,adc-diff-channels" is
267          required. Both properties can be used together. Some channels can be
268          used as single-ended and some other ones as differential (mixed). But
269          channels can't be configured both as single-ended and differential.
270        $ref: /schemas/types.yaml#/definitions/uint32-matrix
271        items:
272          items:
273            - description: |
274                "vinp" indicates positive input number
275              minimum: 0
276              maximum: 19
277            - description: |
278                "vinn" indicates negative input number
279              minimum: 0
280              maximum: 19
281
282      st,min-sample-time-nsecs:
283        description:
284          Minimum sampling time in nanoseconds. Depending on hardware (board)
285          e.g. high/low analog input source impedance, fine tune of ADC
286          sampling time may be recommended. This can be either one value or an
287          array that matches "st,adc-channels" and/or "st,adc-diff-channels"
288          list, to set sample time resp. for all channels, or independently for
289          each channel.
290        $ref: /schemas/types.yaml#/definitions/uint32-array
291
292    allOf:
293      - if:
294          properties:
295            compatible:
296              contains:
297                const: st,stm32f4-adc
298
299        then:
300          properties:
301            reg:
302              enum:
303                - 0x0
304                - 0x100
305                - 0x200
306
307            interrupts:
308              minimum: 0
309              maximum: 2
310
311            assigned-resolution-bits:
312              enum: [6, 8, 10, 12]
313              default: 12
314
315            st,adc-channels:
316              minItems: 1
317              maxItems: 16
318              items:
319                minimum: 0
320                maximum: 15
321
322            st,adc-diff-channels: false
323
324            st,min-sample-time-nsecs:
325              minItems: 1
326              maxItems: 16
327              items:
328                minimum: 80
329
330          required:
331            - clocks
332
333      - if:
334          properties:
335            compatible:
336              contains:
337                enum:
338                  - st,stm32h7-adc
339                  - st,stm32mp1-adc
340
341        then:
342          properties:
343            reg:
344              enum:
345                - 0x0
346                - 0x100
347
348            interrupts:
349              minimum: 0
350              maximum: 1
351
352            assigned-resolution-bits:
353              enum: [8, 10, 12, 14, 16]
354              default: 16
355
356            st,adc-channels:
357              minItems: 1
358              maxItems: 20
359              items:
360                minimum: 0
361                maximum: 19
362
363            st,min-sample-time-nsecs:
364              minItems: 1
365              maxItems: 20
366              items:
367                minimum: 40
368
369    additionalProperties: false
370
371    anyOf:
372      - required:
373          - st,adc-channels
374      - required:
375          - st,adc-diff-channels
376
377    required:
378      - compatible
379      - reg
380      - interrupts
381      - '#io-channel-cells'
382
383examples:
384  - |
385    // Example 1: with stm32f429, ADC1, single-ended channel 8
386      adc123: adc@40012000 {
387        compatible = "st,stm32f4-adc-core";
388        reg = <0x40012000 0x400>;
389        interrupts = <18>;
390        clocks = <&rcc 0 168>;
391        clock-names = "adc";
392        st,max-clk-rate-hz = <36000000>;
393        vdda-supply = <&vdda>;
394        vref-supply = <&vref>;
395        interrupt-controller;
396        #interrupt-cells = <1>;
397        #address-cells = <1>;
398        #size-cells = <0>;
399        adc@0 {
400          compatible = "st,stm32f4-adc";
401          #io-channel-cells = <1>;
402          reg = <0x0>;
403          clocks = <&rcc 0 168>;
404          interrupt-parent = <&adc123>;
405          interrupts = <0>;
406          st,adc-channels = <8>;
407          dmas = <&dma2 0 0 0x400 0x0>;
408          dma-names = "rx";
409          assigned-resolution-bits = <8>;
410        };
411        // ...
412        // other adc child nodes follow...
413      };
414
415  - |
416    // Example 2: with stm32mp157c to setup ADC1 with:
417    // - channels 0 & 1 as single-ended
418    // - channels 2 & 3 as differential (with resp. 6 & 7 negative inputs)
419      #include <dt-bindings/interrupt-controller/arm-gic.h>
420      #include <dt-bindings/clock/stm32mp1-clks.h>
421      adc12: adc@48003000 {
422        compatible = "st,stm32mp1-adc-core";
423        reg = <0x48003000 0x400>;
424        interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
425                     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
426        clocks = <&rcc ADC12>, <&rcc ADC12_K>;
427        clock-names = "bus", "adc";
428        booster-supply = <&booster>;
429        vdd-supply = <&vdd>;
430        vdda-supply = <&vdda>;
431        vref-supply = <&vref>;
432        st,syscfg = <&syscfg>;
433        interrupt-controller;
434        #interrupt-cells = <1>;
435        #address-cells = <1>;
436        #size-cells = <0>;
437        adc@0 {
438          compatible = "st,stm32mp1-adc";
439          #io-channel-cells = <1>;
440          reg = <0x0>;
441          interrupt-parent = <&adc12>;
442          interrupts = <0>;
443          st,adc-channels = <0 1>;
444          st,adc-diff-channels = <2 6>, <3 7>;
445          st,min-sample-time-nsecs = <5000>;
446          dmas = <&dmamux1 9 0x400 0x05>;
447          dma-names = "rx";
448        };
449        // ...
450        // other adc child node follow...
451      };
452
453...
454