# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/sound/qcom,lpass-cpu.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm Technologies Inc. LPASS CPU dai driver

maintainers:
  - Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
  - Rohit kumar <quic_rohkumar@quicinc.com>

description: |
  Qualcomm Technologies Inc. SOC Low-Power Audio SubSystem (LPASS) that consist
  of MI2S interface for audio data transfer on external codecs. LPASS cpu driver
  is a module to configure Low-Power Audio Interface(LPAIF) core registers
  across different IP versions.

properties:
  compatible:
    enum:
      - qcom,lpass-cpu
      - qcom,apq8016-lpass-cpu
      - qcom,sc7180-lpass-cpu
      - qcom,sc7280-lpass-cpu

  reg:
    minItems: 1
    maxItems: 6
    description: LPAIF core registers

  reg-names:
    minItems: 1
    maxItems: 6

  clocks:
    minItems: 3
    maxItems: 10

  clock-names:
    minItems: 1
    maxItems: 10

  interrupts:
    minItems: 1
    maxItems: 4
    description: LPAIF DMA buffer interrupt

  interrupt-names:
    minItems: 1
    maxItems: 4

  qcom,adsp:
    $ref: /schemas/types.yaml#/definitions/phandle
    description: Phandle for the audio DSP node

  iommus:
    minItems: 2
    maxItems: 3
    description: Phandle to apps_smmu node with sid mask

  power-domains:
    maxItems: 1

  power-domain-names:
    maxItems: 1

  required-opps:
    maxItems: 1

  '#sound-dai-cells':
    const: 1

  '#address-cells':
    const: 1

  '#size-cells':
    const: 0

patternProperties:
  "^dai-link@[0-9a-f]+$":
    type: object
    description: |
      LPASS CPU dai node for each I2S device or Soundwire device. Bindings of each node
      depends on the specific driver providing the functionality and
      properties.
    properties:
      reg:
        maxItems: 1
        description: Must be one of the DAI ID

      qcom,playback-sd-lines:
        $ref: /schemas/types.yaml#/definitions/uint32-array
        description: list of MI2S data lines for playback

      qcom,capture-sd-lines:
        $ref: /schemas/types.yaml#/definitions/uint32-array
        description: list of MI2S data lines for capture

    required:
      - reg

    additionalProperties: false

required:
  - compatible
  - reg
  - reg-names
  - clocks
  - clock-names
  - interrupts
  - interrupt-names
  - '#sound-dai-cells'

unevaluatedProperties: false

allOf:
  - $ref: dai-common.yaml#
  - if:
      properties:
        compatible:
          contains:
            const: qcom,lpass-cpu

    then:
      properties:
        clocks:
          maxItems: 3
        clock-names:
          items:
            - const: ahbix-clk
            - const: mi2s-osr-clk
            - const: mi2s-bit-clk

  - if:
      properties:
        compatible:
          contains:
            const: qcom,apq8016-lpass-cpu

    then:
      properties:
        clocks:
          minItems: 7
          maxItems: 7
        clock-names:
          items:
            - const: ahbix-clk
            - const: mi2s-bit-clk0
            - const: mi2s-bit-clk1
            - const: mi2s-bit-clk2
            - const: mi2s-bit-clk3
            - const: pcnoc-mport-clk
            - const: pcnoc-sway-clk

  - if:
      properties:
        compatible:
          contains:
            const: qcom,sc7180-lpass-cpu

    then:
      properties:
        clocks:
          minItems: 6
          maxItems: 6
        clock-names:
          items:
            - const: pcnoc-sway-clk
            - const: audio-core
            - const: mclk0
            - const: pcnoc-mport-clk
            - const: mi2s-bit-clk0
            - const: mi2s-bit-clk1
        reg:
          minItems: 2
          maxItems: 2
        reg-names:
          items:
            - const: lpass-hdmiif
            - const: lpass-lpaif
        interrupts:
          minItems: 2
          maxItems: 2
        interrupt-names:
          items:
            - const: lpass-irq-lpaif
            - const: lpass-irq-hdmi
      required:
        - iommus
        - power-domains

  - if:
      properties:
        compatible:
          contains:
            const: qcom,sc7280-lpass-cpu

    then:
      properties:
        clocks:
          minItems: 10
          maxItems: 10
        clock-names:
          items:
            - const: aon_cc_audio_hm_h
            - const: audio_cc_ext_mclk0
            - const: core_cc_sysnoc_mport_core
            - const: core_cc_ext_if0_ibit
            - const: core_cc_ext_if1_ibit
            - const: audio_cc_codec_mem
            - const: audio_cc_codec_mem0
            - const: audio_cc_codec_mem1
            - const: audio_cc_codec_mem2
            - const: aon_cc_va_mem0
        reg:
          minItems: 6
          maxItems: 6
        reg-names:
          items:
            - const: lpass-hdmiif
            - const: lpass-lpaif
            - const: lpass-rxtx-cdc-dma-lpm
            - const: lpass-rxtx-lpaif
            - const: lpass-va-lpaif
            - const: lpass-va-cdc-dma-lpm
        interrupts:
          minItems: 4
          maxItems: 4
        interrupt-names:
          items:
            - const: lpass-irq-lpaif
            - const: lpass-irq-hdmi
            - const: lpass-irq-vaif
            - const: lpass-irq-rxtxif
        power-domain-names:
          items:
            - const: lcx

      required:
        - iommus
        - power-domains

examples:
  - |
    #include <dt-bindings/sound/sc7180-lpass.h>

    soc {
        #address-cells = <2>;
        #size-cells = <2>;
        lpass@62d80000 {
            compatible = "qcom,sc7180-lpass-cpu";

            reg = <0 0x62d87000 0 0x68000>,
                  <0 0x62f00000 0 0x29000>;
            reg-names = "lpass-hdmiif",
                        "lpass-lpaif";
            iommus = <&apps_smmu 0x1020 0>,
                     <&apps_smmu 0x1032 0>;
            power-domains = <&lpass_hm 0>;

            clocks = <&gcc 131>,
                 <&lpasscorecc 6>,
                 <&lpasscorecc 7>,
                 <&lpasscorecc 10>,
                 <&lpasscorecc 8>,
                 <&lpasscorecc 9>;

            clock-names = "pcnoc-sway-clk", "audio-core",
                          "mclk0", "pcnoc-mport-clk",
                          "mi2s-bit-clk0", "mi2s-bit-clk1";

            interrupts = <0 160 1>,
                         <0 268 1>;
            interrupt-names = "lpass-irq-lpaif",
                              "lpass-irq-hdmi";
            #sound-dai-cells = <1>;

            #address-cells = <1>;
            #size-cells = <0>;
            /* Optional to set different MI2S SD lines */
            dai-link@0 {
                reg = <MI2S_PRIMARY>;
                qcom,playback-sd-lines = <1>;
                qcom,capture-sd-lines = <0>;
            };
        };
    };

...