# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/display/msm/dsi-controller-main.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm Display DSI controller

maintainers:
  - Krishna Manikandan <quic_mkrishn@quicinc.com>

properties:
  compatible:
    oneOf:
      - items:
          - enum:
              - qcom,apq8064-dsi-ctrl
              - qcom,msm8226-dsi-ctrl
              - qcom,msm8916-dsi-ctrl
              - qcom,msm8953-dsi-ctrl
              - qcom,msm8974-dsi-ctrl
              - qcom,msm8996-dsi-ctrl
              - qcom,msm8998-dsi-ctrl
              - qcom,qcm2290-dsi-ctrl
              - qcom,sc7180-dsi-ctrl
              - qcom,sc7280-dsi-ctrl
              - qcom,sdm660-dsi-ctrl
              - qcom,sdm845-dsi-ctrl
              - qcom,sm6115-dsi-ctrl
              - qcom,sm6125-dsi-ctrl
              - qcom,sm6350-dsi-ctrl
              - qcom,sm6375-dsi-ctrl
              - qcom,sm8150-dsi-ctrl
              - qcom,sm8250-dsi-ctrl
              - qcom,sm8350-dsi-ctrl
              - qcom,sm8450-dsi-ctrl
              - qcom,sm8550-dsi-ctrl
          - const: qcom,mdss-dsi-ctrl
      - enum:
          - qcom,dsi-ctrl-6g-qcm2290
          - qcom,mdss-dsi-ctrl # This should always come with an SoC-specific compatible
        deprecated: true

  reg:
    maxItems: 1

  reg-names:
    const: dsi_ctrl

  interrupts:
    maxItems: 1

  clocks:
    description: |
      Several clocks are used, depending on the variant. Typical ones are::
       - bus:: Display AHB clock.
       - byte:: Display byte clock.
       - byte_intf:: Display byte interface clock.
       - core:: Display core clock.
       - core_mss:: Core MultiMedia SubSystem clock.
       - iface:: Display AXI clock.
       - mdp_core:: MDP Core clock.
       - mnoc:: MNOC clock
       - pixel:: Display pixel clock.
    minItems: 3
    maxItems: 9

  clock-names:
    minItems: 3
    maxItems: 9

  phys:
    maxItems: 1

  phy-names:
    deprecated: true
    const: dsi

  syscon-sfpb:
    description: A phandle to mmss_sfpb syscon node (only for DSIv2).
    $ref: /schemas/types.yaml#/definitions/phandle

  qcom,dual-dsi-mode:
    type: boolean
    description: |
      Indicates if the DSI controller is driving a panel which needs
      2 DSI links.

  qcom,master-dsi:
    type: boolean
    description: |
      Indicates if the DSI controller is the master DSI controller when
      qcom,dual-dsi-mode enabled.

  qcom,sync-dual-dsi:
    type: boolean
    description: |
      Indicates if the DSI controller needs to sync the other DSI controller
      with MIPI DCS commands when qcom,dual-dsi-mode enabled.

  assigned-clocks:
    minItems: 2
    maxItems: 4
    description: |
      Parents of "byte" and "pixel" for the given platform.
      For DSIv2 platforms this should contain "byte", "esc", "src" and
      "pixel_src" clocks.

  assigned-clock-parents:
    minItems: 2
    maxItems: 4
    description: |
      The Byte clock and Pixel clock PLL outputs provided by a DSI PHY block.

  power-domains:
    maxItems: 1

  operating-points-v2: true

  opp-table:
    type: object

  ports:
    $ref: /schemas/graph.yaml#/properties/ports
    description: |
      Contains DSI controller input and output ports as children, each
      containing one endpoint subnode.

    properties:
      port@0:
        $ref: /schemas/graph.yaml#/$defs/port-base
        unevaluatedProperties: false
        description: |
          Input endpoints of the controller.
        properties:
          endpoint:
            $ref: /schemas/media/video-interfaces.yaml#
            unevaluatedProperties: false
            properties:
              data-lanes:
                maxItems: 4
                minItems: 1
                items:
                  enum: [ 0, 1, 2, 3 ]

      port@1:
        $ref: /schemas/graph.yaml#/$defs/port-base
        unevaluatedProperties: false
        description: |
          Output endpoints of the controller.
        properties:
          endpoint:
            $ref: /schemas/media/video-interfaces.yaml#
            unevaluatedProperties: false
            properties:
              data-lanes:
                maxItems: 4
                minItems: 1
                items:
                  enum: [ 0, 1, 2, 3 ]

    required:
      - port@0
      - port@1

  avdd-supply:
    description:
      Phandle to vdd regulator device node

  refgen-supply:
    description:
      Phandle to REFGEN regulator device node

  vcca-supply:
    description:
      Phandle to vdd regulator device node

  vdd-supply:
    description:
      VDD regulator

  vddio-supply:
    description:
      VDD-IO regulator

  vdda-supply:
    description:
      VDDA regulator

required:
  - compatible
  - reg
  - reg-names
  - interrupts
  - clocks
  - clock-names
  - phys
  - assigned-clocks
  - assigned-clock-parents
  - ports

allOf:
  - $ref: ../dsi-controller.yaml#
  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,apq8064-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 7
        clock-names:
          items:
            - const: iface
            - const: bus
            - const: core_mmss
            - const: src
            - const: byte
            - const: pixel
            - const: core

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8916-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 6
        clock-names:
          items:
            - const: mdp_core
            - const: iface
            - const: bus
            - const: byte
            - const: pixel
            - const: core

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8953-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 6
        clock-names:
          items:
            - const: mdp_core
            - const: iface
            - const: bus
            - const: byte
            - const: pixel
            - const: core

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8226-dsi-ctrl
              - qcom,msm8974-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 7
        clock-names:
          items:
            - const: mdp_core
            - const: iface
            - const: bus
            - const: byte
            - const: pixel
            - const: core
            - const: core_mmss

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8996-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 7
        clock-names:
          items:
            - const: mdp_core
            - const: byte
            - const: iface
            - const: bus
            - const: core_mmss
            - const: pixel
            - const: core

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8998-dsi-ctrl
              - qcom,sm6125-dsi-ctrl
              - qcom,sm6350-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 6
        clock-names:
          items:
            - const: byte
            - const: byte_intf
            - const: pixel
            - const: core
            - const: iface
            - const: bus

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,sc7180-dsi-ctrl
              - qcom,sc7280-dsi-ctrl
              - qcom,sm8150-dsi-ctrl
              - qcom,sm8250-dsi-ctrl
              - qcom,sm8350-dsi-ctrl
              - qcom,sm8450-dsi-ctrl
              - qcom,sm8550-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 6
        clock-names:
          items:
            - const: byte
            - const: byte_intf
            - const: pixel
            - const: core
            - const: iface
            - const: bus

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,sdm660-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 9
        clock-names:
          items:
            - const: mdp_core
            - const: byte
            - const: byte_intf
            - const: mnoc
            - const: iface
            - const: bus
            - const: core_mmss
            - const: pixel
            - const: core

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,sdm845-dsi-ctrl
              - qcom,sm6115-dsi-ctrl
              - qcom,sm6375-dsi-ctrl
    then:
      properties:
        clocks:
          maxItems: 6
        clock-names:
          items:
            - const: byte
            - const: byte_intf
            - const: pixel
            - const: core
            - const: iface
            - const: bus

unevaluatedProperties: false

examples:
  - |
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     #include <dt-bindings/clock/qcom,dispcc-sdm845.h>
     #include <dt-bindings/clock/qcom,gcc-sdm845.h>
     #include <dt-bindings/power/qcom-rpmpd.h>

     dsi@ae94000 {
           compatible = "qcom,sc7180-dsi-ctrl", "qcom,mdss-dsi-ctrl";
           reg = <0x0ae94000 0x400>;
           reg-names = "dsi_ctrl";

           #address-cells = <1>;
           #size-cells = <0>;

           interrupt-parent = <&mdss>;
           interrupts = <4>;

           clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>,
                    <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>,
                    <&dispcc DISP_CC_MDSS_PCLK0_CLK>,
                    <&dispcc DISP_CC_MDSS_ESC0_CLK>,
                    <&dispcc DISP_CC_MDSS_AHB_CLK>,
                    <&dispcc DISP_CC_MDSS_AXI_CLK>;
           clock-names = "byte",
                         "byte_intf",
                         "pixel",
                         "core",
                         "iface",
                         "bus";

           phys = <&dsi0_phy>;
           phy-names = "dsi";

           assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>;
           assigned-clock-parents = <&dsi_phy 0>, <&dsi_phy 1>;

           power-domains = <&rpmhpd SC7180_CX>;
           operating-points-v2 = <&dsi_opp_table>;

           ports {
                  #address-cells = <1>;
                  #size-cells = <0>;

                  port@0 {
                          reg = <0>;
                          dsi0_in: endpoint {
                                   remote-endpoint = <&dpu_intf1_out>;
                          };
                  };

                  port@1 {
                          reg = <1>;
                          dsi0_out: endpoint {
                                   remote-endpoint = <&sn65dsi86_in>;
                                   data-lanes = <0 1 2 3>;
                          };
                  };
           };
     };
...