summaryrefslogtreecommitdiff
path: root/Documentation/devicetree/bindings/mmc/marvell,xenon-sdhci.yaml
blob: 3a8e74894ae0184473c1a1bad7ee3bad60461de3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mmc/marvell,xenon-sdhci.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Marvell Xenon SDHCI Controller

description: |
  This file documents differences between the core MMC properties described by
  mmc-controller.yaml and the properties used by the Xenon implementation.

  Multiple SDHCs might be put into a single Xenon IP, to save size and cost.
  Each SDHC is independent and owns independent resources, such as register
  sets, clock and PHY.

  Each SDHC should have an independent device tree node.

maintainers:
  - Ulf Hansson <ulf.hansson@linaro.org>

properties:
  compatible:
    oneOf:
      - enum:
          - marvell,armada-cp110-sdhci
          - marvell,armada-ap806-sdhci

      - items:
          - const: marvell,armada-ap807-sdhci
          - const: marvell,armada-ap806-sdhci

      - items:
          - const: marvell,armada-3700-sdhci
          - const: marvell,sdhci-xenon

  reg:
    minItems: 1
    maxItems: 2
    description: |
      For "marvell,armada-3700-sdhci", two register areas.  The first one
      for Xenon IP register. The second one for the Armada 3700 SoC PHY PAD
      Voltage Control register.  Please follow the examples with compatible
      "marvell,armada-3700-sdhci" in below.
      Please also check property marvell,pad-type in below.

      For other compatible strings, one register area for Xenon IP.

  clocks:
    minItems: 1
    maxItems: 2

  clock-names:
    minItems: 1
    items:
      - const: core
      - const: axi

  interrupts:
    maxItems: 1

  marvell,xenon-sdhc-id:
    $ref: /schemas/types.yaml#/definitions/uint32
    minimum: 0
    maximum: 7
    description: |
      Indicate the corresponding bit index of current SDHC in SDHC System
      Operation Control Register Bit[7:0].  Set/clear the corresponding bit to
      enable/disable current SDHC.

  marvell,xenon-phy-type:
    $ref: /schemas/types.yaml#/definitions/string
    enum:
      - emmc 5.1 phy
      - emmc 5.0 phy
    description: |
      Xenon support multiple types of PHYs. To select eMMC 5.1 PHY, set:
      marvell,xenon-phy-type = "emmc 5.1 phy" eMMC 5.1 PHY is the default
      choice if this property is not provided.  To select eMMC 5.0 PHY, set:
      marvell,xenon-phy-type = "emmc 5.0 phy"

      All those types of PHYs can support eMMC, SD and SDIO. Please note that
      this property only presents the type of PHY.  It doesn't stand for the
      entire SDHC type or property.  For example, "emmc 5.1 phy" doesn't mean
      that this Xenon SDHC only supports eMMC 5.1.

  marvell,xenon-phy-znr:
    $ref: /schemas/types.yaml#/definitions/uint32
    minimum: 0
    maximum: 0x1f
    default: 0xf
    description: |
      Set PHY ZNR value.
      Only available for eMMC PHY.

  marvell,xenon-phy-zpr:
    $ref: /schemas/types.yaml#/definitions/uint32
    minimum: 0
    maximum: 0x1f
    default: 0xf
    description: |
      Set PHY ZPR value.
      Only available for eMMC PHY.

  marvell,xenon-phy-nr-success-tun:
    $ref: /schemas/types.yaml#/definitions/uint32
    minimum: 1
    maximum: 7
    default: 0x4
    description: |
      Set the number of required consecutive successful sampling points
      used to identify a valid sampling window, in tuning process.

  marvell,xenon-phy-tun-step-divider:
    $ref: /schemas/types.yaml#/definitions/uint32
    default: 64
    description: |
      Set the divider for calculating TUN_STEP.

  marvell,xenon-phy-slow-mode:
    type: boolean
    description: |
      If this property is selected, transfers will bypass PHY.
      Only available when bus frequency lower than 55MHz in SDR mode.
      Disabled by default. Please only try this property if timing issues
      always occur with PHY enabled in eMMC HS SDR, SD SDR12, SD SDR25,
      SD Default Speed and HS mode and eMMC legacy speed mode.

  marvell,xenon-tun-count:
    $ref: /schemas/types.yaml#/definitions/uint32
    default: 0x9
    description: |
      Xenon SDHC SoC usually doesn't provide re-tuning counter in
      Capabilities Register 3 Bit[11:8].
      This property provides the re-tuning counter.

allOf:
  - $ref: mmc-controller.yaml#
  - if:
      properties:
        compatible:
          contains:
            const: marvell,armada-3700-sdhci

    then:
      properties:
        reg:
          items:
            - description: Xenon IP registers
            - description: Armada 3700 SoC PHY PAD Voltage Control register

        marvell,pad-type:
          $ref: /schemas/types.yaml#/definitions/string
          enum:
            - sd
            - fixed-1-8v
          description: |
            Type of Armada 3700 SoC PHY PAD Voltage Controller register.
            If "sd" is selected, SoC PHY PAD is set as 3.3V at the beginning
            and is switched to 1.8V when later in higher speed mode.
            If "fixed-1-8v" is selected, SoC PHY PAD is fixed 1.8V, such as for
            eMMC.
            Please follow the examples with compatible
            "marvell,armada-3700-sdhci" in below.

      required:
        - marvell,pad-type

  - if:
      properties:
        compatible:
          contains:
            enum:
              - marvell,armada-cp110-sdhci
              - marvell,armada-ap807-sdhci
              - marvell,armada-ap806-sdhci

    then:
      properties:
        clocks:
          minItems: 2

        clock-names:
          items:
            - const: core
            - const: axi


required:
  - compatible
  - reg
  - clocks
  - clock-names

unevaluatedProperties: false

examples:
  - |
    // For eMMC
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    mmc@aa0000 {
      compatible = "marvell,armada-ap807-sdhci", "marvell,armada-ap806-sdhci";
      reg = <0xaa0000 0x1000>;
      interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
      clocks = <&emmc_clk 0>, <&axi_clk 0>;
      clock-names = "core", "axi";
      bus-width = <4>;
      marvell,xenon-phy-slow-mode;
      marvell,xenon-tun-count = <11>;
      non-removable;
      no-sd;
      no-sdio;

      /* Vmmc and Vqmmc are both fixed */
    };

  - |
    // For SD/SDIO
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    mmc@ab0000 {
      compatible = "marvell,armada-cp110-sdhci";
      reg = <0xab0000 0x1000>;
      interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
      vqmmc-supply = <&sd_vqmmc_regulator>;
      vmmc-supply = <&sd_vmmc_regulator>;
      clocks = <&sdclk 0>, <&axi_clk 0>;
      clock-names = "core", "axi";
      bus-width = <4>;
      marvell,xenon-tun-count = <9>;
    };

  - |
    // For eMMC with compatible "marvell,armada-3700-sdhci":
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    mmc@aa0000 {
      compatible = "marvell,armada-3700-sdhci", "marvell,sdhci-xenon";
      reg = <0xaa0000 0x1000>,
            <0x17808 0x4>;
      interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
      clocks = <&emmcclk 0>;
      clock-names = "core";
      bus-width = <8>;
      mmc-ddr-1_8v;
      mmc-hs400-1_8v;
      non-removable;
      no-sd;
      no-sdio;

      /* Vmmc and Vqmmc are both fixed */

      marvell,pad-type = "fixed-1-8v";
    };

  - |
    // For SD/SDIO with compatible "marvell,armada-3700-sdhci":
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    mmc@ab0000 {
      compatible = "marvell,armada-3700-sdhci", "marvell,sdhci-xenon";
      reg = <0xab0000 0x1000>,
            <0x17808 0x4>;
      interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
      vqmmc-supply = <&sd_regulator>;
      /* Vmmc is fixed */
      clocks = <&sdclk 0>;
      clock-names = "core";
      bus-width = <4>;

      marvell,pad-type = "sd";
    };