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