1# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/display/msm/qcom,sm8450-mdss.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Qualcomm SM8450 Display MDSS
8
9maintainers:
10  - Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
11
12description:
13  SM8450 MSM Mobile Display Subsystem(MDSS), which encapsulates sub-blocks like
14  DPU display controller, DSI and DP interfaces etc.
15
16$ref: /schemas/display/msm/mdss-common.yaml#
17
18properties:
19  compatible:
20    const: qcom,sm8450-mdss
21
22  clocks:
23    items:
24      - description: Display AHB
25      - description: Display hf AXI
26      - description: Display sf AXI
27      - description: Display core
28
29  iommus:
30    maxItems: 1
31
32  interconnects:
33    maxItems: 3
34
35  interconnect-names:
36    maxItems: 3
37
38patternProperties:
39  "^display-controller@[0-9a-f]+$":
40    type: object
41    additionalProperties: true
42
43    properties:
44      compatible:
45        const: qcom,sm8450-dpu
46
47  "^displayport-controller@[0-9a-f]+$":
48    type: object
49    additionalProperties: true
50
51    properties:
52      compatible:
53        items:
54          - const: qcom,sm8450-dp
55          - const: qcom,sm8350-dp
56
57  "^dsi@[0-9a-f]+$":
58    type: object
59    additionalProperties: true
60
61    properties:
62      compatible:
63        items:
64          - const: qcom,sm8450-dsi-ctrl
65          - const: qcom,mdss-dsi-ctrl
66
67  "^phy@[0-9a-f]+$":
68    type: object
69    additionalProperties: true
70
71    properties:
72      compatible:
73        const: qcom,sm8450-dsi-phy-5nm
74
75required:
76  - compatible
77
78unevaluatedProperties: false
79
80examples:
81  - |
82    #include <dt-bindings/clock/qcom,sm8450-dispcc.h>
83    #include <dt-bindings/clock/qcom,gcc-sm8450.h>
84    #include <dt-bindings/clock/qcom,rpmh.h>
85    #include <dt-bindings/interrupt-controller/arm-gic.h>
86    #include <dt-bindings/interconnect/qcom,sm8450.h>
87    #include <dt-bindings/power/qcom,rpmhpd.h>
88
89    display-subsystem@ae00000 {
90        compatible = "qcom,sm8450-mdss";
91        reg = <0x0ae00000 0x1000>;
92        reg-names = "mdss";
93
94        interconnects = <&mmss_noc MASTER_MDP_DISP &mc_virt SLAVE_EBI1_DISP>,
95                        <&mmss_noc MASTER_MDP_DISP &mc_virt SLAVE_EBI1_DISP>,
96                        <&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_DISPLAY_CFG>;
97        interconnect-names = "mdp0-mem",
98                             "mdp1-mem",
99                             "cpu-cfg";
100
101        resets = <&dispcc DISP_CC_MDSS_CORE_BCR>;
102
103        power-domains = <&dispcc MDSS_GDSC>;
104
105        clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>,
106                 <&gcc GCC_DISP_HF_AXI_CLK>,
107                 <&gcc GCC_DISP_SF_AXI_CLK>,
108                 <&dispcc DISP_CC_MDSS_MDP_CLK>;
109        clock-names = "iface", "bus", "nrt_bus", "core";
110
111        interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
112        interrupt-controller;
113        #interrupt-cells = <1>;
114
115        iommus = <&apps_smmu 0x2800 0x402>;
116
117        #address-cells = <1>;
118        #size-cells = <1>;
119        ranges;
120
121        display-controller@ae01000 {
122            compatible = "qcom,sm8450-dpu";
123            reg = <0x0ae01000 0x8f000>,
124                  <0x0aeb0000 0x2008>;
125            reg-names = "mdp", "vbif";
126
127            clocks = <&gcc GCC_DISP_HF_AXI_CLK>,
128                    <&gcc GCC_DISP_SF_AXI_CLK>,
129                    <&dispcc DISP_CC_MDSS_AHB_CLK>,
130                    <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>,
131                    <&dispcc DISP_CC_MDSS_MDP_CLK>,
132                    <&dispcc DISP_CC_MDSS_VSYNC_CLK>;
133            clock-names = "bus",
134                          "nrt_bus",
135                          "iface",
136                          "lut",
137                          "core",
138                          "vsync";
139
140            assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>;
141            assigned-clock-rates = <19200000>;
142
143            operating-points-v2 = <&mdp_opp_table>;
144            power-domains = <&rpmhpd RPMHPD_MMCX>;
145
146            interrupt-parent = <&mdss>;
147            interrupts = <0>;
148
149            ports {
150                #address-cells = <1>;
151                #size-cells = <0>;
152
153                port@0 {
154                    reg = <0>;
155                    dpu_intf1_out: endpoint {
156                        remote-endpoint = <&dsi0_in>;
157                    };
158                };
159
160                port@1 {
161                    reg = <1>;
162                    dpu_intf2_out: endpoint {
163                        remote-endpoint = <&dsi1_in>;
164                    };
165                };
166            };
167
168            mdp_opp_table: opp-table {
169                compatible = "operating-points-v2";
170
171                opp-172000000{
172                    opp-hz = /bits/ 64 <172000000>;
173                    required-opps = <&rpmhpd_opp_low_svs_d1>;
174                };
175
176                opp-200000000 {
177                    opp-hz = /bits/ 64 <200000000>;
178                    required-opps = <&rpmhpd_opp_low_svs>;
179                };
180
181                opp-325000000 {
182                    opp-hz = /bits/ 64 <325000000>;
183                    required-opps = <&rpmhpd_opp_svs>;
184                };
185
186                opp-375000000 {
187                    opp-hz = /bits/ 64 <375000000>;
188                    required-opps = <&rpmhpd_opp_svs_l1>;
189                };
190
191                opp-500000000 {
192                    opp-hz = /bits/ 64 <500000000>;
193                    required-opps = <&rpmhpd_opp_nom>;
194                };
195            };
196        };
197
198        dsi@ae94000 {
199            compatible = "qcom,sm8450-dsi-ctrl", "qcom,mdss-dsi-ctrl";
200            reg = <0x0ae94000 0x400>;
201            reg-names = "dsi_ctrl";
202
203            interrupt-parent = <&mdss>;
204            interrupts = <4>;
205
206            clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>,
207                     <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>,
208                     <&dispcc DISP_CC_MDSS_PCLK0_CLK>,
209                     <&dispcc DISP_CC_MDSS_ESC0_CLK>,
210                     <&dispcc DISP_CC_MDSS_AHB_CLK>,
211                     <&gcc GCC_DISP_HF_AXI_CLK>;
212            clock-names = "byte",
213                          "byte_intf",
214                          "pixel",
215                          "core",
216                          "iface",
217                          "bus";
218
219            assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>,
220                              <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>;
221            assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>;
222
223            operating-points-v2 = <&dsi_opp_table>;
224            power-domains = <&rpmhpd RPMHPD_MMCX>;
225
226            phys = <&dsi0_phy>;
227            phy-names = "dsi";
228
229            #address-cells = <1>;
230            #size-cells = <0>;
231
232            ports {
233                #address-cells = <1>;
234                #size-cells = <0>;
235
236                port@0 {
237                    reg = <0>;
238                    dsi0_in: endpoint {
239                        remote-endpoint = <&dpu_intf1_out>;
240                    };
241                };
242
243                port@1 {
244                    reg = <1>;
245                    dsi0_out: endpoint {
246                    };
247                };
248            };
249
250            dsi_opp_table: opp-table {
251                compatible = "operating-points-v2";
252
253                opp-160310000{
254                    opp-hz = /bits/ 64 <160310000>;
255                    required-opps = <&rpmhpd_opp_low_svs_d1>;
256                };
257
258                opp-187500000 {
259                    opp-hz = /bits/ 64 <187500000>;
260                    required-opps = <&rpmhpd_opp_low_svs>;
261                };
262
263                opp-300000000 {
264                    opp-hz = /bits/ 64 <300000000>;
265                    required-opps = <&rpmhpd_opp_svs>;
266                };
267
268                opp-358000000 {
269                    opp-hz = /bits/ 64 <358000000>;
270                    required-opps = <&rpmhpd_opp_svs_l1>;
271                };
272            };
273        };
274
275        dsi0_phy: phy@ae94400 {
276            compatible = "qcom,sm8450-dsi-phy-5nm";
277            reg = <0x0ae94400 0x200>,
278                  <0x0ae94600 0x280>,
279                  <0x0ae94900 0x260>;
280            reg-names = "dsi_phy",
281                        "dsi_phy_lane",
282                        "dsi_pll";
283
284            #clock-cells = <1>;
285            #phy-cells = <0>;
286
287            clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>,
288                     <&rpmhcc RPMH_CXO_CLK>;
289            clock-names = "iface", "ref";
290            vdds-supply = <&vreg_dsi_phy>;
291        };
292
293        dsi@ae96000 {
294            compatible = "qcom,sm8450-dsi-ctrl", "qcom,mdss-dsi-ctrl";
295            reg = <0x0ae96000 0x400>;
296            reg-names = "dsi_ctrl";
297
298            interrupt-parent = <&mdss>;
299            interrupts = <5>;
300
301            clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK>,
302                     <&dispcc DISP_CC_MDSS_BYTE1_INTF_CLK>,
303                     <&dispcc DISP_CC_MDSS_PCLK1_CLK>,
304                     <&dispcc DISP_CC_MDSS_ESC1_CLK>,
305                     <&dispcc DISP_CC_MDSS_AHB_CLK>,
306                     <&gcc GCC_DISP_HF_AXI_CLK>;
307            clock-names = "byte",
308                          "byte_intf",
309                          "pixel",
310                          "core",
311                          "iface",
312                          "bus";
313
314            assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK_SRC>,
315                              <&dispcc DISP_CC_MDSS_PCLK1_CLK_SRC>;
316            assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>;
317
318            operating-points-v2 = <&dsi_opp_table>;
319            power-domains = <&rpmhpd RPMHPD_MMCX>;
320
321            phys = <&dsi1_phy>;
322            phy-names = "dsi";
323
324            #address-cells = <1>;
325            #size-cells = <0>;
326
327            ports {
328                #address-cells = <1>;
329                #size-cells = <0>;
330
331                port@0 {
332                    reg = <0>;
333                    dsi1_in: endpoint {
334                        remote-endpoint = <&dpu_intf2_out>;
335                    };
336                };
337
338                port@1 {
339                    reg = <1>;
340                    dsi1_out: endpoint {
341                    };
342                };
343            };
344        };
345
346        dsi1_phy: phy@ae96400 {
347            compatible = "qcom,sm8450-dsi-phy-5nm";
348            reg = <0x0ae96400 0x200>,
349                  <0x0ae96600 0x280>,
350                  <0x0ae96900 0x260>;
351            reg-names = "dsi_phy",
352                        "dsi_phy_lane",
353                        "dsi_pll";
354
355            #clock-cells = <1>;
356            #phy-cells = <0>;
357
358            clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>,
359                     <&rpmhcc RPMH_CXO_CLK>;
360            clock-names = "iface", "ref";
361            vdds-supply = <&vreg_dsi_phy>;
362        };
363    };
364...
365