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