diff --git a/Documentation/devicetree/bindings/sound/qcom,apq8039.yaml b/Documentation/devicetree/bindings/sound/qcom,apq8039.yaml
new file mode 100644
index 000000000000..f1c4fb99ccbb
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/qcom,apq8039.yaml
@@ -0,0 +1,370 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/qcom,apq8039.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Technologies APQ8039 ASoC sound card
+
+maintainers:
+  - Pantelis Antoniou <pantelis.antoniou@linaro.org>
+
+properties:
+  compatible:
+    items:
+      - const: qcom,apq8039-sndcard
+
+  pinctrl-0:
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    description: |
+      Should specify pin control groups used for this controller matching
+      the first entry in pinctrl-names.
+
+  pinctrl-1:
+    description: |
+      Should specify pin control groups used for this controller matching
+      the second entry in pinctrl-names.
+
+  pinctrl-names:
+    minItems: 1
+    items:
+      - const: default
+      - const: sleep
+    description:
+      Names for the pin configuration(s); may be "default" or "sleep",
+      where the "sleep" configuration may describe the state
+      the pins should be in during system suspend.
+
+  reg:
+    description: Must contain an address for each entry in "reg-names".
+    minItems: 2
+    maxItems: 2
+
+  reg-names:
+    items:
+      - const: mic-iomux
+      - const: spkr-iomux
+
+  qcom,model:
+    $ref: /schemas/types.yaml#/definitions/string
+    description: The user-visible name of the sound complex.
+
+  qcom,audio-routing:
+    $ref: /schemas/types.yaml#/definitions/non-unique-string-array
+    description: |
+      List of the connections between audio components;  each entry is a
+      pair of strings, the first being the connection's sink, the second
+      being the connection's source; valid names could be power supplies
+      and MicBias of msm8916-analoc-wcd codec.
+
+  function-definition:
+    type: object
+    description: |
+      Functional configuration for the sound complex via a
+      simple control. allows fixed and dynamically constructed
+      function selection.
+
+    properties:
+      mixer-control:
+        $ref: /schemas/types.yaml#/definitions/string
+        description: |
+          Name of the exported alsa mix control.
+
+      function-list:
+        $ref: /schemas/types.yaml#/definitions/phandle-array
+        description: |
+          phandle(s) of the functions which the sound complex
+          exposes via the control.
+
+      system-list:
+        $ref: /schemas/types.yaml#/definitions/phandle-array
+        description: |
+          phandle(s) of the default, init and shutdown functions
+          Must be one of the declared ones in the function property.
+          The default function is the one selected by default on
+          startup (after the init function's sequence is executed).
+          On shutdown the shutdown function sequence will be executed.
+          Typically init and shutdown are the same and it's purpose
+          is to initialize the sound complex mixer controls to the
+          all off state, and be ready for a regular function selection.
+
+    patternProperties:
+      "^[A-Za-z_][A-Aa-z0-9_]*$":
+        type: object
+        description:
+          Function description subnodes. The name of the function
+          is simply the name of the subnode, so restrictions apply
+          to the valid node names.
+
+          The function definition of each subnode is either a cooked
+          function (i.e. which is not dependent on state inputs), or
+          a function that is selecting a cooked function based on the
+          state inputs and the generated state vector.
+
+        oneOf:
+          # non-cooked function
+          - properties:
+              enable:
+                $ref: /schemas/types.yaml#/definitions/non-unique-string-array
+                description: |
+                  Sequence of alsa mixer controls to apply when this state is to
+                  be enabled.
+
+              disable:
+                $ref: /schemas/types.yaml#/definitions/non-unique-string-array
+                description: |
+                  Sequence of alsa mixer controls to apply when this state is to
+                  be disabled.
+
+            required:
+              - enable
+
+          # cooked function
+          - properties:
+              state-inputs:
+                description: |
+                  A list of state inputs to be used in constructing a state
+                  vector.
+                type: array
+                uniqueItems: true
+                minItems: 1
+                items:
+                  anyOf:
+                    - const: JACK_HEADPHONE
+                    - const: JACK_MICROPHONE
+
+              state-input-bits:
+                $ref: /schemas/types.yaml#/definitions/uint32-array
+                description: |
+                  Number of bits to use for each state-input in the
+                  state vector creation. For now only the value 1 is
+                  supported for JACK_HEADPHONE and JACK_MICROPHONE.
+
+              state-input-defaults:
+                $ref: /schemas/types.yaml#/definitions/uint32-array
+                description: |
+                  The default value to use as a state input at startup.
+
+              state-map:
+                $ref: /schemas/types.yaml#/definitions/phandle-array
+                description: |
+                  The mapping of this function to a cooked function. The
+                  format used is a sequence of phandle to a state, the mask
+                  to apply to the state vector, and the equality value.
+
+                  Take the example's configuration
+
+                    state-inputs         = "JACK_HEADPHONE", "JACK_MICROPHONE";
+                    state-input-bits     = <1>, <1>;
+                    state-input-defaults = <0>, <0>;
+
+                    state-map = <&speaker    0x1 0x0>,
+                                <&headphones 0x3 0x1>,
+                                <&headset    0x3 0x3>;
+
+                  is decoded as follows.
+
+                  There are 3 possible cooked functions to be selected.
+                  speaker, headphone and headset. The state-inputs are
+                  the JACK_HEADPHONE and JACK_MICROPHONE, which are single
+                  bit values, being placed at bit 0 and bit 1 of the
+                  constructed vector.
+
+                  The 4 possible state vectors are:
+                    MICROPHONE=0, HEADPHONE=0, 0
+                    MICROPHONE=0, HEADPHONE=1, 1
+                    MICROPHONE=1, HEADPHONE=0, 2
+                    MICROPHONE=1, HEADPHONE=1, 3
+
+                  The speaker function is selected when HEADPHONE=0 because
+                  both (0 & 1) == (2 & 1) == 0.
+
+                  The headphones function is selected when HEADPHONE=1 and
+                  MICROPHONE=0 because (1 & 3) == 1.
+
+                  The headset function is selected when both HEADPHONE=1 and
+                  MICROPHONE=1 because (3 & 3) == 3.
+
+            required:
+              - state-inputs
+              - state-input-bits
+              - state-input-defaults
+              - state-map
+
+patternProperties:
+  "^.*dai-link-[0-9]+$":
+    type: object
+    description: |-
+      cpu and codec child nodes:
+        Container for cpu and codec dai sub-nodes.
+        One cpu and one codec sub-node must exist.
+
+    properties:
+      link-name:
+        description: The link name
+
+      cpu:
+        type: object
+        properties:
+
+          sound-dai:
+            $ref: /schemas/types.yaml#/definitions/phandle-array
+            description: phandle(s) of the CPU DAI(s)
+
+        required:
+          - sound-dai
+
+      codec:
+        type: object
+        properties:
+
+          sound-dai:
+            $ref: /schemas/types.yaml#/definitions/phandle-array
+            description: phandle(s) of the codec DAI(s)
+
+        required:
+          - sound-dai
+
+    required:
+      - link-name
+      - cpu
+      - codec
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - qcom,model
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/sound/apq8016-lpass.h>
+
+    sound: sound@7702000  {
+        compatible = "qcom,apq8039-sndcard";
+        reg = <0x07702000 0x4>, <0x07702004 0x4>;
+        reg-names = "mic-iomux", "spkr-iomux";
+
+        status = "okay";
+        pinctrl-0 = <&cdc_pdm_lines_act>;
+        pinctrl-1 = <&cdc_pdm_lines_sus>;
+        pinctrl-names = "default", "sleep";
+        qcom,model = "APQ8039";
+        qcom,audio-routing = "AMIC2", "MIC BIAS Internal2";
+
+        internal-codec-playback-dai-link-0 {
+            link-name = "WCD";
+            cpu {
+                sound-dai = <&lpass MI2S_PRIMARY>;
+            };
+            codec {
+                sound-dai = <&lpass_codec 0>, <&wcd_codec 0>;
+            };
+        };
+
+        internal-codec-capture-dai-link-0 {
+            link-name = "WCD-Capture";
+            cpu {
+                sound-dai = <&lpass MI2S_TERTIARY>;
+            };
+            codec {
+                sound-dai = <&lpass_codec 1>, <&wcd_codec 1>;
+            };
+        };
+
+        function-definition {
+
+            mixer-control = "Jack Function";
+            function-list = <&auto &headphones &headset &speaker &off>;
+            system-list = <&auto &off &off>;  // default, init, shutdown
+
+            auto: Automatic {
+                // Headphone presence bit 0 (1) - H
+                // Microphone presence bit 1 (2) - M
+                state-inputs         = "JACK_HEADPHONE", "JACK_MICROPHONE";
+                state-input-bits     = <1>, <1>;
+                state-input-defaults = <0>, <0>;
+
+                // HM & MASK
+                state-map =
+                    <&speaker    0x1 0x0>,  // no headphone -> speaker
+                    <&headphones 0x3 0x1>,  // headphone but no mic -> headphones
+                    <&headset    0x3 0x3>;  // headphone & mic -> headset
+            };
+            headphones: Headphones {
+                enable =
+                    "RX1 MIX1 INP1", "RX1",
+                    "RX2 MIX1 INP1", "RX2",
+                    "RDAC2 MUX", "RX2",
+                    "RX1 Digital Volume", "128",
+                    "RX2 Digital Volume", "128",
+                    "HPHL", "Switch",
+                    "HPHR", "Switch";
+
+                disable =
+                    "RX1 Digital Volume", "0",
+                    "RX2 Digital Volume", "0",
+                    "HPHL", "ZERO",
+                    "HPHR", "ZERO",
+                    "RDAC2 MUX", "RX1",
+                    "RX1 MIX1 INP1", "ZERO",
+                    "RX2 MIX1 INP1", "ZERO";
+            };
+            headset: Headset {
+                enable =
+                    "RX1 MIX1 INP1", "RX1",
+                    "RX2 MIX1 INP1", "RX2",
+                    "RDAC2 MUX", "RX2",
+                    "RX1 Digital Volume", "128",
+                    "RX2 Digital Volume", "128",
+                    "DEC1 MUX", "ADC2",
+                    "CIC1 MUX", "AMIC",
+                    "ADC2 Volume", "8",
+                    "ADC2 MUX", "INP2",
+                    "HPHL", "Switch",
+                    "HPHR", "Switch";
+
+                disable =
+                    "RX1 Digital Volume", "0",
+                    "RX2 Digital Volume", "0",
+                    "HPHL", "ZERO",
+                    "HPHR", "ZERO",
+                    "RDAC2 MUX", "RX1",
+                    "RX1 MIX1 INP1", "ZERO",
+                    "RX2 MIX1 INP1", "ZERO",
+                    "ADC2 MUX", "ZERO",
+                    "ADC2 Volume", "0",
+                    "DEC1 MUX", "ZERO";
+            };
+            speaker: Speaker {
+                enable =
+                    "SPK DAC Switch", "1",
+                    "RX3 MIX1 INP1", "RX1",
+                    "RX3 MIX1 INP2", "RX2",
+                    "RX3 Digital Volume", "128";
+
+                disable =
+                    "SPK DAC Switch", "0",
+                    "RX3 MIX1 INP1", "ZERO",
+                    "RX3 MIX1 INP2", "ZERO";
+            };
+            off: Off {
+                enable =
+                    "RX1 Digital Volume", "0",
+                    "RX2 Digital Volume", "0",
+                    "HPHL", "ZERO",
+                    "HPHR", "ZERO",
+                    "RDAC2 MUX", "RX1",
+                    "RX1 MIX1 INP1", "ZERO",
+                    "RX2 MIX1 INP1", "ZERO",
+                    "ADC2 MUX", "ZERO",
+                    "ADC2 Volume", "0",
+                    "DEC1 MUX", "ZERO",
+                    "SPK DAC Switch", "0",
+                    "RX3 MIX1 INP1", "ZERO",
+                    "RX3 MIX1 INP2", "ZERO";
+            };
+        };
+    };
