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