# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mailbox/qcom,apcs-kpss-global.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm APCS global block

description:
  This binding describes the APCS "global" block found in various Qualcomm
  platforms.

maintainers:
  - Jassi Brar <jassisinghbrar@gmail.com>

properties:
  compatible:
    oneOf:
      - items:
          - enum:
              - qcom,ipq5018-apcs-apps-global
              - qcom,ipq5332-apcs-apps-global
              - qcom,ipq5424-apcs-apps-global
              - qcom,ipq8074-apcs-apps-global
              - qcom,ipq9574-apcs-apps-global
          - const: qcom,ipq6018-apcs-apps-global
      - items:
          - enum:
              - qcom,msm8226-apcs-kpss-global
              - qcom,qcs404-apcs-apps-global
          - const: qcom,msm8916-apcs-kpss-global
          - const: syscon
      - items:
          - enum:
              - qcom,msm8974-apcs-kpss-global
              - qcom,msm8976-apcs-kpss-global
          - const: qcom,msm8994-apcs-kpss-global
          - const: syscon
      - items:
          - enum:
              - qcom,msm8998-apcs-hmss-global
              - qcom,sdm660-apcs-hmss-global
              - qcom,sm4250-apcs-hmss-global
              - qcom,sm6115-apcs-hmss-global
              - qcom,sm6125-apcs-hmss-global
          - const: qcom,msm8994-apcs-kpss-global
      - items:
          - enum:
              - qcom,qcs615-apss-shared
              - qcom,sc7180-apss-shared
              - qcom,sc8180x-apss-shared
              - qcom,shikra-apss-shared
              - qcom,sm7150-apss-shared
              - qcom,sm8150-apss-shared
          - const: qcom,sdm845-apss-shared
      - items:
          - enum:
              - qcom,msm8916-apcs-kpss-global
              - qcom,msm8939-apcs-kpss-global
              - qcom,msm8953-apcs-kpss-global
              - qcom,msm8994-apcs-kpss-global
              - qcom,sdx55-apcs-gcc
          - const: syscon
      - enum:
          - qcom,ipq6018-apcs-apps-global
          - qcom,msm8996-apcs-hmss-global
          - qcom,qcm2290-apcs-hmss-global
          - qcom,sdm845-apss-shared

  reg:
    maxItems: 1

  clocks:
    description: phandles to the parent clocks of the clock driver
    minItems: 2
    maxItems: 3
    deprecated: true

  '#mbox-cells':
    const: 1

  '#clock-cells':
    enum: [0, 1]

  clock-names:
    minItems: 2
    maxItems: 3
    deprecated: true

  clock-controller:
    type: object
    additionalProperties: false
    properties:
      clocks:
        description: phandles to the parent clocks of the clock driver
        minItems: 2
        maxItems: 3

      '#clock-cells':
        enum: [0, 1]

      clock-names:
        minItems: 2
        maxItems: 3

required:
  - compatible
  - reg
  - '#mbox-cells'

additionalProperties: false

# Clocks should be specified either on the parent node or on the child node
oneOf:
  - required:
      - clock-controller
    properties:
      clocks: false
      clock-names: false
      '#clock-cells': false
  - properties:
      clock-controller: false

$defs:
  msm8916-apcs-clock-controller:
    properties:
      clocks:
        items:
          - description: primary pll parent of the clock driver
          - description: auxiliary parent
      clock-names:
        items:
          - const: pll
          - const: aux
      '#clock-cells':
        const: 0

  msm8939-apcs-clock-controller:
    properties:
      clocks:
        items:
          - description: primary pll parent of the clock driver
          - description: auxiliary parent
          - description: reference clock
      clock-names:
        items:
          - const: pll
          - const: aux
          - const: ref
      '#clock-cells':
        const: 0

  sdx55-apcs-clock-controller:
    properties:
      clocks:
        items:
          - description: reference clock
          - description: primary pll parent of the clock driver
          - description: auxiliary parent
      clock-names:
        items:
          - const: ref
          - const: pll
          - const: aux
      '#clock-cells':
        const: 0

  ipq6018-apcs-clock-controller:
    properties:
      clocks:
        items:
          - description: primary pll parent of the clock driver
          - description: XO clock
          - description: GCC GPLL0 clock source
      clock-names:
        items:
          - const: pll
          - const: xo
          - const: gpll0
      '#clock-cells':
        const: 1

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8916-apcs-kpss-global
    then:
      $ref: '#/$defs/msm8916-apcs-clock-controller'
      properties:
        clock-controller:
          $ref: '#/$defs/msm8916-apcs-clock-controller'

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8939-apcs-kpss-global
    then:
      $ref: '#/$defs/msm8939-apcs-clock-controller'
      properties:
        clock-controller:
          $ref: '#/$defs/msm8939-apcs-clock-controller'

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,sdx55-apcs-gcc
    then:
      $ref: '#/$defs/sdx55-apcs-clock-controller'
      properties:
        clock-controller:
          $ref: '#/$defs/sdx55-apcs-clock-controller'

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,ipq6018-apcs-apps-global
    then:
      $ref: '#/$defs/ipq6018-apcs-clock-controller'
      properties:
        clock-controller:
          $ref: '#/$defs/ipq6018-apcs-clock-controller'

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8953-apcs-kpss-global
              - qcom,msm8994-apcs-kpss-global
              - qcom,msm8996-apcs-hmss-global
              - qcom,qcm2290-apcs-hmss-global
              - qcom,sdm845-apss-shared
    then:
      properties:
        clocks: false
        clock-names: false
        clock-controller: false
        '#clock-cells':
          const: 0

examples:

  # Example apcs with msm8996
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    mailbox@9820000 {
        compatible = "qcom,msm8996-apcs-hmss-global";
        reg = <0x9820000 0x1000>;

        #mbox-cells = <1>;
        #clock-cells = <0>;
    };

  # Example apcs with qcs404
  - |
    #define GCC_APSS_AHB_CLK_SRC  1
    #define GCC_GPLL0_AO_OUT_MAIN 123
    mailbox@b011000 {
        compatible = "qcom,qcs404-apcs-apps-global",
                     "qcom,msm8916-apcs-kpss-global", "syscon";
        reg = <0x0b011000 0x1000>;
        #mbox-cells = <1>;

        apcs_clk: clock-controller {
          clocks = <&apcs_hfpll>, <&gcc GCC_GPLL0_AO_OUT_MAIN>;
          clock-names = "pll", "aux";
          #clock-cells = <0>;
        };
    };

  # Example apcs with qcs404 (deprecated: use clock-controller subnode)
  - |
    #define GCC_APSS_AHB_CLK_SRC  1
    #define GCC_GPLL0_AO_OUT_MAIN 123
    apcs: mailbox@b011000 {
        compatible = "qcom,qcs404-apcs-apps-global",
                     "qcom,msm8916-apcs-kpss-global", "syscon";
        reg = <0x0b011000 0x1000>;
        #mbox-cells = <1>;
        clocks = <&apcs_hfpll>, <&gcc GCC_GPLL0_AO_OUT_MAIN>;
        clock-names = "pll", "aux";
        #clock-cells = <0>;
    };