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,sm8650-mdss.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Qualcomm SM8650 Display MDSS
8
9maintainers:
10  - Neil Armstrong <neil.armstrong@linaro.org>
11
12description:
13  SM8650 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,sm8650-mdss
21
22  clocks:
23    items:
24      - description: Display AHB
25      - description: Display hf AXI
26      - description: Display core
27
28  iommus:
29    maxItems: 1
30
31  interconnects:
32    maxItems: 2
33
34  interconnect-names:
35    maxItems: 2
36
37patternProperties:
38  "^display-controller@[0-9a-f]+$":
39    type: object
40    properties:
41      compatible:
42        const: qcom,sm8650-dpu
43
44  "^displayport-controller@[0-9a-f]+$":
45    type: object
46    properties:
47      compatible:
48        const: qcom,sm8650-dp
49
50  "^dsi@[0-9a-f]+$":
51    type: object
52    properties:
53      compatible:
54        items:
55          - const: qcom,sm8650-dsi-ctrl
56          - const: qcom,mdss-dsi-ctrl
57
58  "^phy@[0-9a-f]+$":
59    type: object
60    properties:
61      compatible:
62        const: qcom,sm8650-dsi-phy-4nm
63
64required:
65  - compatible
66
67unevaluatedProperties: false
68
69examples:
70  - |
71    #include <dt-bindings/clock/qcom,rpmh.h>
72    #include <dt-bindings/interrupt-controller/arm-gic.h>
73    #include <dt-bindings/power/qcom,rpmhpd.h>
74
75    display-subsystem@ae00000 {
76        compatible = "qcom,sm8650-mdss";
77        reg = <0x0ae00000 0x1000>;
78        reg-names = "mdss";
79
80        resets = <&dispcc_core_bcr>;
81
82        power-domains = <&dispcc_gdsc>;
83
84        clocks = <&gcc_ahb_clk>,
85                 <&gcc_axi_clk>,
86                 <&dispcc_mdp_clk>;
87        clock-names = "bus", "nrt_bus", "core";
88
89        interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
90        interrupt-controller;
91        #interrupt-cells = <1>;
92
93        iommus = <&apps_smmu 0x1c00 0x2>;
94
95        #address-cells = <1>;
96        #size-cells = <1>;
97        ranges;
98
99        display-controller@ae01000 {
100            compatible = "qcom,sm8650-dpu";
101            reg = <0x0ae01000 0x8f000>,
102                  <0x0aeb0000 0x2008>;
103            reg-names = "mdp", "vbif";
104
105            clocks = <&gcc_axi_clk>,
106                     <&dispcc_ahb_clk>,
107                     <&dispcc_mdp_lut_clk>,
108                     <&dispcc_mdp_clk>,
109                     <&dispcc_mdp_vsync_clk>;
110            clock-names = "nrt_bus",
111                          "iface",
112                          "lut",
113                          "core",
114                          "vsync";
115
116            assigned-clocks = <&dispcc_mdp_vsync_clk>;
117            assigned-clock-rates = <19200000>;
118
119            operating-points-v2 = <&mdp_opp_table>;
120            power-domains = <&rpmhpd RPMHPD_MMCX>;
121
122            interrupt-parent = <&mdss>;
123            interrupts = <0>;
124
125            ports {
126                #address-cells = <1>;
127                #size-cells = <0>;
128
129                port@0 {
130                    reg = <0>;
131                    dpu_intf1_out: endpoint {
132                        remote-endpoint = <&dsi0_in>;
133                    };
134                };
135
136                port@1 {
137                    reg = <1>;
138                    dpu_intf2_out: endpoint {
139                        remote-endpoint = <&dsi1_in>;
140                    };
141                };
142            };
143
144            mdp_opp_table: opp-table {
145                compatible = "operating-points-v2";
146
147                opp-200000000 {
148                    opp-hz = /bits/ 64 <200000000>;
149                    required-opps = <&rpmhpd_opp_low_svs>;
150                };
151
152                opp-325000000 {
153                    opp-hz = /bits/ 64 <325000000>;
154                    required-opps = <&rpmhpd_opp_svs>;
155                };
156
157                opp-375000000 {
158                    opp-hz = /bits/ 64 <375000000>;
159                    required-opps = <&rpmhpd_opp_svs_l1>;
160                };
161
162                opp-514000000 {
163                    opp-hz = /bits/ 64 <514000000>;
164                    required-opps = <&rpmhpd_opp_nom>;
165                };
166            };
167        };
168
169        dsi@ae94000 {
170            compatible = "qcom,sm8650-dsi-ctrl", "qcom,mdss-dsi-ctrl";
171            reg = <0x0ae94000 0x400>;
172            reg-names = "dsi_ctrl";
173
174            interrupt-parent = <&mdss>;
175            interrupts = <4>;
176
177            clocks = <&dispc_byte_clk>,
178                     <&dispcc_intf_clk>,
179                     <&dispcc_pclk>,
180                     <&dispcc_esc_clk>,
181                     <&dispcc_ahb_clk>,
182                     <&gcc_bus_clk>;
183            clock-names = "byte",
184                          "byte_intf",
185                          "pixel",
186                          "core",
187                          "iface",
188                          "bus";
189
190            assigned-clocks = <&dispcc_byte_clk>,
191                              <&dispcc_pclk>;
192            assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>;
193
194            operating-points-v2 = <&dsi_opp_table>;
195            power-domains = <&rpmhpd RPMHPD_MMCX>;
196
197            phys = <&dsi0_phy>;
198            phy-names = "dsi";
199
200            #address-cells = <1>;
201            #size-cells = <0>;
202
203            ports {
204                #address-cells = <1>;
205                #size-cells = <0>;
206
207                port@0 {
208                    reg = <0>;
209                    dsi0_in: endpoint {
210                        remote-endpoint = <&dpu_intf1_out>;
211                    };
212                };
213
214                port@1 {
215                    reg = <1>;
216                    dsi0_out: endpoint {
217                    };
218                };
219            };
220
221            dsi_opp_table: opp-table {
222                compatible = "operating-points-v2";
223
224                opp-187500000 {
225                    opp-hz = /bits/ 64 <187500000>;
226                    required-opps = <&rpmhpd_opp_low_svs>;
227                };
228
229                opp-300000000 {
230                    opp-hz = /bits/ 64 <300000000>;
231                    required-opps = <&rpmhpd_opp_svs>;
232                };
233
234                opp-358000000 {
235                    opp-hz = /bits/ 64 <358000000>;
236                    required-opps = <&rpmhpd_opp_svs_l1>;
237                };
238            };
239        };
240
241        dsi0_phy: phy@ae94400 {
242            compatible = "qcom,sm8650-dsi-phy-4nm";
243            reg = <0x0ae95000 0x200>,
244                  <0x0ae95200 0x280>,
245                  <0x0ae95500 0x400>;
246            reg-names = "dsi_phy",
247                        "dsi_phy_lane",
248                        "dsi_pll";
249
250            #clock-cells = <1>;
251            #phy-cells = <0>;
252
253            clocks = <&dispcc_iface_clk>,
254                     <&rpmhcc_ref_clk>;
255            clock-names = "iface", "ref";
256        };
257
258        dsi@ae96000 {
259            compatible = "qcom,sm8650-dsi-ctrl", "qcom,mdss-dsi-ctrl";
260            reg = <0x0ae96000 0x400>;
261            reg-names = "dsi_ctrl";
262
263            interrupt-parent = <&mdss>;
264            interrupts = <5>;
265
266            clocks = <&dispc_byte_clk>,
267                     <&dispcc_intf_clk>,
268                     <&dispcc_pclk>,
269                     <&dispcc_esc_clk>,
270                     <&dispcc_ahb_clk>,
271                     <&gcc_bus_clk>;
272            clock-names = "byte",
273                          "byte_intf",
274                          "pixel",
275                          "core",
276                          "iface",
277                          "bus";
278
279            assigned-clocks = <&dispcc_byte_clk>,
280                              <&dispcc_pclk>;
281            assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>;
282
283            operating-points-v2 = <&dsi_opp_table>;
284            power-domains = <&rpmhpd RPMHPD_MMCX>;
285
286            phys = <&dsi1_phy>;
287            phy-names = "dsi";
288
289            #address-cells = <1>;
290            #size-cells = <0>;
291
292            ports {
293                #address-cells = <1>;
294                #size-cells = <0>;
295
296                port@0 {
297                    reg = <0>;
298                    dsi1_in: endpoint {
299                        remote-endpoint = <&dpu_intf2_out>;
300                    };
301                };
302
303                port@1 {
304                    reg = <1>;
305                    dsi1_out: endpoint {
306                    };
307                };
308            };
309        };
310
311        dsi1_phy: phy@ae96400 {
312            compatible = "qcom,sm8650-dsi-phy-4nm";
313            reg = <0x0ae97000 0x200>,
314                  <0x0ae97200 0x280>,
315                  <0x0ae97500 0x400>;
316            reg-names = "dsi_phy",
317                        "dsi_phy_lane",
318                        "dsi_pll";
319
320            #clock-cells = <1>;
321            #phy-cells = <0>;
322
323            clocks = <&dispcc_iface_clk>,
324                     <&rpmhcc_ref_clk>;
325            clock-names = "iface", "ref";
326        };
327    };
328...
329