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

title: Amlogic PWM

maintainers:
  - Heiner Kallweit <hkallweit1@gmail.com>

properties:
  compatible:
    oneOf:
      - enum:
          - amlogic,meson8b-pwm
          - amlogic,meson-gxbb-pwm
          - amlogic,meson-gxbb-ao-pwm
          - amlogic,meson-axg-ee-pwm
          - amlogic,meson-axg-ao-pwm
          - amlogic,meson-g12a-ee-pwm
          - amlogic,meson-g12a-ao-pwm-ab
          - amlogic,meson-g12a-ao-pwm-cd
        deprecated: true
      - items:
          - const: amlogic,meson-gx-pwm
          - const: amlogic,meson-gxbb-pwm
        deprecated: true
      - items:
          - const: amlogic,meson-gx-ao-pwm
          - const: amlogic,meson-gxbb-ao-pwm
        deprecated: true
      - items:
          - const: amlogic,meson8-pwm
          - const: amlogic,meson8b-pwm
        deprecated: true
      - enum:
          - amlogic,meson8-pwm-v2
          - amlogic,meson-s4-pwm
      - items:
          - enum:
              - amlogic,meson-a1-pwm
          - const: amlogic,meson-s4-pwm
      - items:
          - enum:
              - amlogic,meson8b-pwm-v2
              - amlogic,meson-gxbb-pwm-v2
              - amlogic,meson-axg-pwm-v2
              - amlogic,meson-g12-pwm-v2
          - const: amlogic,meson8-pwm-v2

  reg:
    maxItems: 1

  clocks:
    minItems: 1
    maxItems: 4

  clock-names:
    minItems: 1
    maxItems: 2

  power-domains:
    maxItems: 1

  "#pwm-cells":
    const: 3

required:
  - compatible
  - reg

allOf:
  - $ref: pwm.yaml#

  - if:
      properties:
        compatible:
          contains:
            enum:
              - amlogic,meson8-pwm
              - amlogic,meson8b-pwm
              - amlogic,meson-gxbb-pwm
              - amlogic,meson-gxbb-ao-pwm
              - amlogic,meson-axg-ee-pwm
              - amlogic,meson-axg-ao-pwm
              - amlogic,meson-g12a-ee-pwm
              - amlogic,meson-g12a-ao-pwm-ab
              - amlogic,meson-g12a-ao-pwm-cd
    then:
      # Obsolete historic bindings tied to the driver implementation
      # The clocks provided here are meant to be matched with the input
      # known (hard-coded) in the driver and used to select pwm clock
      # source. Currently, the linux driver ignores this.
      # This is kept to maintain ABI backward compatibility.
      properties:
        clocks:
          maxItems: 2
        clock-names:
          oneOf:
            - items:
                - enum: [clkin0, clkin1]
            - items:
                - const: clkin0
                - const: clkin1

  # Newer binding where clock describe the actual clock inputs of the pwm
  # block. These are necessary but some inputs may be grounded.
  - if:
      properties:
        compatible:
          contains:
            enum:
              - amlogic,meson8-pwm-v2
    then:
      properties:
        clocks:
          minItems: 1
          items:
            - description: input clock 0 of the pwm block
            - description: input clock 1 of the pwm block
            - description: input clock 2 of the pwm block
            - description: input clock 3 of the pwm block
        clock-names: false
      required:
        - clocks

  # Newer IP block take a single input per channel, instead of 4 inputs
  # for both channels
  - if:
      properties:
        compatible:
          contains:
            enum:
              - amlogic,meson-s4-pwm
    then:
      properties:
        clocks:
          items:
            - description: input clock of PWM channel A
            - description: input clock of PWM channel B
        clock-names: false
      required:
        - clocks

  - if:
      properties:
        compatible:
          contains:
            enum:
              - amlogic,meson-a1-pwm
    then:
      required:
        - power-domains

additionalProperties: false

examples:
  - |
    pwm@8550 {
      compatible = "amlogic,meson-gxbb-pwm";
      reg = <0x08550 0x10>;
      clocks = <&xtal>, <&xtal>;
      clock-names = "clkin0", "clkin1";
      #pwm-cells = <3>;
    };
  - |
    pwm@2000 {
      compatible = "amlogic,meson8-pwm-v2";
      reg = <0x1000 0x10>;
      clocks = <&xtal>, <0>, <&fdiv4>, <&fdiv5>;
      #pwm-cells = <3>;
    };
  - |
    pwm@1000 {
      compatible = "amlogic,meson-s4-pwm";
      reg = <0x1000 0x10>;
      clocks = <&pwm_src_a>, <&pwm_src_b>;
      #pwm-cells = <3>;
    };
