1# SPDX-License-Identifier: GPL-2.0
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/mmc/mtk-sd.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: MTK MSDC Storage Host Controller
8
9maintainers:
10  - Chaotian Jing <chaotian.jing@mediatek.com>
11  - Wenbin Mei <wenbin.mei@mediatek.com>
12
13properties:
14  compatible:
15    oneOf:
16      - enum:
17          - mediatek,mt2701-mmc
18          - mediatek,mt2712-mmc
19          - mediatek,mt6779-mmc
20          - mediatek,mt6795-mmc
21          - mediatek,mt7620-mmc
22          - mediatek,mt7622-mmc
23          - mediatek,mt7986-mmc
24          - mediatek,mt8135-mmc
25          - mediatek,mt8173-mmc
26          - mediatek,mt8183-mmc
27          - mediatek,mt8516-mmc
28      - items:
29          - const: mediatek,mt7623-mmc
30          - const: mediatek,mt2701-mmc
31      - items:
32          - enum:
33              - mediatek,mt8186-mmc
34              - mediatek,mt8188-mmc
35              - mediatek,mt8192-mmc
36              - mediatek,mt8195-mmc
37          - const: mediatek,mt8183-mmc
38
39  reg:
40    minItems: 1
41    items:
42      - description: base register (required).
43      - description: top base register (required for MT8183).
44
45  clocks:
46    description:
47      Should contain phandle for the clock feeding the MMC controller.
48    minItems: 2
49    maxItems: 7
50
51  clock-names:
52    minItems: 2
53    maxItems: 7
54
55  interrupts:
56    description:
57      Should at least contain MSDC GIC interrupt. To support SDIO in-band wakeup, an extended
58      interrupt is required and be configured as wakeup source irq.
59    minItems: 1
60    maxItems: 2
61
62  interrupt-names:
63    items:
64      - const: msdc
65      - const: sdio_wakeup
66
67  pinctrl-names:
68    description:
69      Should at least contain default and state_uhs. To support SDIO in-band wakeup, dat1 pin
70      will be switched between GPIO mode and SDIO DAT1 mode, state_eint is mandatory in this
71      scenario.
72    minItems: 2
73    items:
74      - const: default
75      - const: state_uhs
76      - const: state_eint
77
78  pinctrl-0:
79    description:
80      should contain default/high speed pin ctrl.
81    maxItems: 1
82
83  pinctrl-1:
84    description:
85      should contain uhs mode pin ctrl.
86    maxItems: 1
87
88  pinctrl-2:
89    description:
90      should switch dat1 pin to GPIO mode.
91    maxItems: 1
92
93  assigned-clocks:
94    description:
95      PLL of the source clock.
96    maxItems: 1
97
98  assigned-clock-parents:
99    description:
100      parent of source clock, used for HS400 mode to get 400Mhz source clock.
101    maxItems: 1
102
103  hs400-ds-delay:
104    $ref: /schemas/types.yaml#/definitions/uint32
105    description:
106      HS400 DS delay setting.
107    minimum: 0
108    maximum: 0xffffffff
109
110  mediatek,hs200-cmd-int-delay:
111    $ref: /schemas/types.yaml#/definitions/uint32
112    description:
113      HS200 command internal delay setting.
114      This field has total 32 stages.
115      The value is an integer from 0 to 31.
116    minimum: 0
117    maximum: 31
118
119  mediatek,hs400-cmd-int-delay:
120    $ref: /schemas/types.yaml#/definitions/uint32
121    description:
122      HS400 command internal delay setting.
123      This field has total 32 stages.
124      The value is an integer from 0 to 31.
125    minimum: 0
126    maximum: 31
127
128  mediatek,hs400-cmd-resp-sel-rising:
129    $ref: /schemas/types.yaml#/definitions/flag
130    description:
131      HS400 command response sample selection.
132      If present, HS400 command responses are sampled on rising edges.
133      If not present, HS400 command responses are sampled on falling edges.
134
135  mediatek,hs400-ds-dly3:
136    $ref: /schemas/types.yaml#/definitions/uint32
137    description:
138      Gear of the third delay line for DS for input data latch in data
139      pad macro, there are 32 stages from 0 to 31.
140      For different corner IC, the time is different about one step, it is
141      about 100ps.
142      The value is confirmed by doing scan and calibration to find a best
143      value with corner IC and it is valid only for HS400 mode.
144    minimum: 0
145    maximum: 31
146
147  mediatek,latch-ck:
148    $ref: /schemas/types.yaml#/definitions/uint32
149    description:
150      Some SoCs do not support enhance_rx, need set correct latch-ck to avoid
151      data crc error caused by stop clock(fifo full) Valid range = [0:0x7].
152      if not present, default value is 0.
153      applied to compatible "mediatek,mt2701-mmc".
154    minimum: 0
155    maximum: 7
156
157  resets:
158    maxItems: 1
159
160  reset-names:
161    const: hrst
162
163required:
164  - compatible
165  - reg
166  - interrupts
167  - clocks
168  - clock-names
169  - pinctrl-names
170  - pinctrl-0
171  - pinctrl-1
172  - vmmc-supply
173  - vqmmc-supply
174
175allOf:
176  - $ref: mmc-controller.yaml#
177  - if:
178      properties:
179        compatible:
180          enum:
181            - mediatek,mt2701-mmc
182            - mediatek,mt6779-mmc
183            - mediatek,mt6795-mmc
184            - mediatek,mt7620-mmc
185            - mediatek,mt7622-mmc
186            - mediatek,mt7623-mmc
187            - mediatek,mt8135-mmc
188            - mediatek,mt8173-mmc
189            - mediatek,mt8183-mmc
190            - mediatek,mt8186-mmc
191            - mediatek,mt8188-mmc
192            - mediatek,mt8195-mmc
193            - mediatek,mt8516-mmc
194    then:
195      properties:
196        clocks:
197          minItems: 2
198          items:
199            - description: source clock
200            - description: HCLK which used for host
201            - description: independent source clock gate
202        clock-names:
203          minItems: 2
204          items:
205            - const: source
206            - const: hclk
207            - const: source_cg
208
209  - if:
210      properties:
211        compatible:
212          contains:
213            const: mediatek,mt2712-mmc
214    then:
215      properties:
216        clocks:
217          minItems: 3
218          items:
219            - description: source clock
220            - description: HCLK which used for host
221            - description: independent source clock gate
222            - description: bus clock used for internal register access (required for MSDC0/3).
223        clock-names:
224          minItems: 3
225          items:
226            - const: source
227            - const: hclk
228            - const: source_cg
229            - const: bus_clk
230
231  - if:
232      properties:
233        compatible:
234          contains:
235            const: mediatek,mt8183-mmc
236    then:
237      properties:
238        reg:
239          minItems: 2
240
241  - if:
242      properties:
243        compatible:
244          contains:
245            enum:
246              - mediatek,mt7986-mmc
247    then:
248      properties:
249        clocks:
250          minItems: 3
251          items:
252            - description: source clock
253            - description: HCLK which used for host
254            - description: independent source clock gate
255            - description: bus clock used for internal register access (required for MSDC0/3).
256            - description: msdc subsys clock gate
257        clock-names:
258          minItems: 3
259          items:
260            - const: source
261            - const: hclk
262            - const: source_cg
263            - const: bus_clk
264            - const: sys_cg
265
266  - if:
267      properties:
268        compatible:
269          enum:
270            - mediatek,mt8186-mmc
271            - mediatek,mt8188-mmc
272            - mediatek,mt8195-mmc
273    then:
274      properties:
275        clocks:
276          items:
277            - description: source clock
278            - description: HCLK which used for host
279            - description: independent source clock gate
280            - description: crypto clock used for data encrypt/decrypt (optional)
281        clock-names:
282          items:
283            - const: source
284            - const: hclk
285            - const: source_cg
286            - const: crypto
287
288  - if:
289      properties:
290        compatible:
291          contains:
292            const: mediatek,mt8192-mmc
293    then:
294      properties:
295        clocks:
296          items:
297            - description: source clock
298            - description: HCLK which used for host
299            - description: independent source clock gate
300            - description: msdc subsys clock gate
301            - description: peripheral bus clock gate
302            - description: AXI bus clock gate
303            - description: AHB bus clock gate
304        clock-names:
305          items:
306            - const: source
307            - const: hclk
308            - const: source_cg
309            - const: sys_cg
310            - const: pclk_cg
311            - const: axi_cg
312            - const: ahb_cg
313
314unevaluatedProperties: false
315
316examples:
317  - |
318    #include <dt-bindings/interrupt-controller/irq.h>
319    #include <dt-bindings/interrupt-controller/arm-gic.h>
320    #include <dt-bindings/clock/mt8173-clk.h>
321    mmc0: mmc@11230000 {
322        compatible = "mediatek,mt8173-mmc";
323        reg = <0x11230000 0x1000>;
324        interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_LOW>;
325        vmmc-supply = <&mt6397_vemc_3v3_reg>;
326        vqmmc-supply = <&mt6397_vio18_reg>;
327        clocks = <&pericfg CLK_PERI_MSDC30_0>,
328                 <&topckgen CLK_TOP_MSDC50_0_H_SEL>;
329        clock-names = "source", "hclk";
330        pinctrl-names = "default", "state_uhs";
331        pinctrl-0 = <&mmc0_pins_default>;
332        pinctrl-1 = <&mmc0_pins_uhs>;
333        assigned-clocks = <&topckgen CLK_TOP_MSDC50_0_SEL>;
334        assigned-clock-parents = <&topckgen CLK_TOP_MSDCPLL_D2>;
335        hs400-ds-delay = <0x14015>;
336        mediatek,hs200-cmd-int-delay = <26>;
337        mediatek,hs400-cmd-int-delay = <14>;
338        mediatek,hs400-cmd-resp-sel-rising;
339    };
340
341    mmc3: mmc@11260000 {
342        compatible = "mediatek,mt8173-mmc";
343        reg = <0x11260000 0x1000>;
344        clock-names = "source", "hclk";
345        clocks = <&pericfg CLK_PERI_MSDC30_3>,
346                 <&topckgen CLK_TOP_MSDC50_2_H_SEL>;
347        interrupt-names = "msdc", "sdio_wakeup";
348        interrupts-extended = <&gic GIC_SPI 74 IRQ_TYPE_LEVEL_LOW 0>,
349                     <&pio 23 IRQ_TYPE_LEVEL_LOW>;
350        pinctrl-names = "default", "state_uhs", "state_eint";
351        pinctrl-0 = <&mmc2_pins_default>;
352        pinctrl-1 = <&mmc2_pins_uhs>;
353        pinctrl-2 = <&mmc2_pins_eint>;
354        bus-width = <4>;
355        max-frequency = <200000000>;
356        cap-sd-highspeed;
357        sd-uhs-sdr104;
358        keep-power-in-suspend;
359        wakeup-source;
360        cap-sdio-irq;
361        no-mmc;
362        no-sd;
363        non-removable;
364        vmmc-supply = <&sdio_fixed_3v3>;
365        vqmmc-supply = <&mt6397_vgp3_reg>;
366        mmc-pwrseq = <&wifi_pwrseq>;
367    };
368
369...
370