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

title: MediaTek MT6397/MT6323 PMIC

maintainers:
  - Sen Chu <sen.chu@mediatek.com>
  - Macpaul Lin <macpaul.lin@mediatek.com>

description: |
  MT6397/MT6323 is a power management system chip.
  Please see the sub-modules below for supported features.

  MT6397/MT6323 is a multifunction device with the following sub modules:
  - Regulators
  - RTC
  - ADC
  - Audio codec
  - GPIO
  - Clock
  - LED
  - Keys
  - Power controller

  It is interfaced to host controller using SPI interface by a proprietary hardware
  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
  See the following for pwrap node definitions:
  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml

properties:
  compatible:
    oneOf:
      - enum:
          - mediatek,mt6323
          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
          - mediatek,mt6328
          - mediatek,mt6358
          - mediatek,mt6359
          - mediatek,mt6397
      - items:
          - enum:
              - mediatek,mt6366
          - const: mediatek,mt6358

  interrupts:
    maxItems: 1

  interrupt-controller: true

  "#interrupt-cells":
    const: 2

  rtc:
    type: object
    $ref: /schemas/rtc/rtc.yaml#
    unevaluatedProperties: false
    description:
      MT6397 Real Time Clock.

    properties:
      compatible:
        oneOf:
          - enum:
              - mediatek,mt6323-rtc
              - mediatek,mt6331-rtc
              - mediatek,mt6358-rtc
              - mediatek,mt6397-rtc
          - items:
              - enum:
                  - mediatek,mt6366-rtc
              - const: mediatek,mt6358-rtc

      start-year: true

    required:
      - compatible

  regulators:
    type: object
    description:
      List of child nodes that specify the regulators.
    additionalProperties: true

    properties:
      compatible:
        oneOf:
          - enum:
              - mediatek,mt6323-regulator
              - mediatek,mt6328-regulator
              - mediatek,mt6358-regulator
              - mediatek,mt6359-regulator
              - mediatek,mt6397-regulator
          - items:
              - enum:
                  - mediatek,mt6366-regulator
              - const: mediatek,mt6358-regulator

    required:
      - compatible

  adc:
    type: object
    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml#
    unevaluatedProperties: false

  audio-codec:
    type: object
    description:
      Audio codec support with MT6358 and MT6397.
    additionalProperties: true

    properties:
      compatible:
        oneOf:
          - enum:
              - mediatek,mt6358-sound
              - mediatek,mt6359-codec
              - mediatek,mt6397-codec
          - items:
              - enum:
                  - mediatek,mt6366-sound
              - const: mediatek,mt6358-sound

    required:
      - compatible

  clocks:
    type: object
    additionalProperties: false
    description:
      This is a clock buffer node for mt6397. However, there are no sub nodes
      or any public document exposed in public.

    properties:
      compatible:
        const: mediatek,mt6397-clk

      '#clock-cells':
        const: 1

    required:
      - compatible

  leds:
    type: object
    additionalProperties: false
    description: |
      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
      controllers are defined as the subnode of the function node provided by MT6323
      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
      using shared bus called PMIC wrapper for each subfunction to access remote
      MT6323 PMIC hardware.

      Each led is represented as a child node of the mediatek,mt6323-led that
      describes the initial behavior for each LED physically and currently only four
      LED child nodes can be supported.

    properties:
      compatible:
        enum:
          - mediatek,mt6323-led
          - mediatek,mt6331-led
          - mediatek,mt6332-led

      reg:
        maxItems: 1

      "#address-cells":
        const: 1

      "#size-cells":
        const: 0

    patternProperties:
      "^led@[0-3]$":
        type: object
        $ref: /schemas/leds/common.yaml#
        unevaluatedProperties: false

        properties:
          reg:
            description:
              LED channel number (0..3)
            minimum: 0
            maximum: 3

        required:
          - reg

    required:
      - compatible
      - "#address-cells"
      - "#size-cells"

  keys:
    type: object
    $ref: /schemas/input/mediatek,pmic-keys.yaml
    unevaluatedProperties: false
    description:
      Power and Home keys.

  power-controller:
    type: object
    additionalProperties: false
    description:
      The power controller which could be found on PMIC is responsible for
      externally powering off or on the remote MediaTek SoC through the
      circuit BBPU (baseband power up).

    properties:
      compatible:
        const: mediatek,mt6323-pwrc

      '#power-domain-cells':
        const: 0

  pinctrl:
    type: object
    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
    unevaluatedProperties: false
    description:
      Pin controller

required:
  - compatible
  - regulators

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/leds/common.h>

    pmic {
        compatible = "mediatek,mt6323";
        interrupt-parent = <&pio>;
        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-controller;
        #interrupt-cells = <2>;

        leds {
            compatible = "mediatek,mt6323-led";
            #address-cells = <1>;
            #size-cells = <0>;
        };

        regulators {
            compatible = "mediatek,mt6323-regulator";

            buck_vproc {
                regulator-name = "vproc";
                regulator-min-microvolt = < 700000>;
                regulator-max-microvolt = <1350000>;
                regulator-ramp-delay = <12500>;
                regulator-always-on;
                regulator-boot-on;
            };

            buck_vsys {
                regulator-name = "vsys";
                regulator-min-microvolt = <1400000>;
                regulator-max-microvolt = <2987500>;
                regulator-ramp-delay = <25000>;
                regulator-always-on;
                regulator-boot-on;
            };

            buck_vpa {
                regulator-name = "vpa";
                regulator-min-microvolt = < 500000>;
                regulator-max-microvolt = <3650000>;
            };

            ldo_vtcxo {
                regulator-name = "vtcxo";
                regulator-min-microvolt = <2800000>;
                regulator-max-microvolt = <2800000>;
                regulator-enable-ramp-delay = <90>;
                regulator-always-on;
                regulator-boot-on;
            };

            ldo_vcn28 {
                regulator-name = "vcn28";
                regulator-min-microvolt = <2800000>;
                regulator-max-microvolt = <2800000>;
                regulator-enable-ramp-delay = <185>;
            };

            ldo_vcn33_bt {
                regulator-name = "vcn33_bt";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3600000>;
                regulator-enable-ramp-delay = <185>;
            };

            ldo_vcn33_wifi {
                regulator-name = "vcn33_wifi";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3600000>;
                regulator-enable-ramp-delay = <185>;
            };

            ldo_va {
                regulator-name = "va";
                regulator-min-microvolt = <2800000>;
                regulator-max-microvolt = <2800000>;
                regulator-enable-ramp-delay = <216>;
                regulator-always-on;
                regulator-boot-on;
            };

            ldo_vcama {
                regulator-name = "vcama";
                regulator-min-microvolt = <1500000>;
                regulator-max-microvolt = <2800000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vio28 {
                regulator-name = "vio28";
                regulator-min-microvolt = <2800000>;
                regulator-max-microvolt = <2800000>;
                regulator-enable-ramp-delay = <216>;
                regulator-always-on;
                regulator-boot-on;
            };

            ldo_vusb {
                regulator-name = "vusb";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <216>;
                regulator-boot-on;
            };

            ldo_vmc {
                regulator-name = "vmc";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <36>;
                regulator-boot-on;
            };

            ldo_vmch {
                regulator-name = "vmch";
                regulator-min-microvolt = <3000000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <36>;
                regulator-boot-on;
            };

            ldo_vemc3v3 {
                regulator-name = "vemc3v3";
                regulator-min-microvolt = <3000000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <36>;
                regulator-boot-on;
            };

            ldo_vgp1 {
                regulator-name = "vgp1";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vgp2 {
                regulator-name = "vgp2";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3000000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vgp3 {
                regulator-name = "vgp3";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vcn18 {
                regulator-name = "vcn18";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vsim1 {
                regulator-name = "vsim1";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3000000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vsim2 {
                regulator-name = "vsim2";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3000000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vrtc {
                regulator-name = "vrtc";
                regulator-min-microvolt = <2800000>;
                regulator-max-microvolt = <2800000>;
                regulator-always-on;
                regulator-boot-on;
            };

            ldo_vcamaf {
                regulator-name = "vcamaf";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vibr {
                regulator-name = "vibr";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <36>;
            };

            ldo_vrf18 {
                regulator-name = "vrf18";
                regulator-min-microvolt = <1825000>;
                regulator-max-microvolt = <1825000>;
                regulator-enable-ramp-delay = <187>;
            };

            ldo_vm {
                regulator-name = "vm";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
                regulator-always-on;
                regulator-boot-on;
            };

            ldo_vio18 {
                regulator-name = "vio18";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
                regulator-always-on;
                regulator-boot-on;
            };

           ldo_vcamd {
                regulator-name = "vcamd";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
            };

            ldo_vcamio {
                regulator-name = "vcamio";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
                regulator-enable-ramp-delay = <216>;
            };
        };

        keys {
            compatible = "mediatek,mt6323-keys";
            mediatek,long-press-mode = <1>;
            power-off-time-sec = <0>;

            power {
                linux,keycodes = <116>;
                wakeup-source;
            };

            home {
                linux,keycodes = <114>;
            };
        };

        power-controller {
            compatible = "mediatek,mt6323-pwrc";
            #power-domain-cells = <0>;
        };

        rtc {
            compatible = "mediatek,mt6323-rtc";
        };
    };

  - |
    #include <dt-bindings/input/input.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    pmic {
        compatible = "mediatek,mt6358";
        interrupt-controller;
        #interrupt-cells = <2>;

        audio-codec {
            compatible = "mediatek,mt6358-sound";
            Avdd-supply = <&mt6358_vaud28_reg>;
            mediatek,dmic-mode = <0>;
        };

        regulators {
            compatible = "mediatek,mt6358-regulator";

            buck_vdram1 {
                regulator-name = "vdram1";
                regulator-min-microvolt = <500000>;
                regulator-max-microvolt = <2087500>;
                regulator-ramp-delay = <12500>;
                regulator-enable-ramp-delay = <0>;
                regulator-always-on;
                regulator-allowed-modes = <0 1>;
            };

            // ...

            ldo_vsim2 {
                regulator-name = "vsim2";
                regulator-min-microvolt = <1700000>;
                regulator-max-microvolt = <3100000>;
                regulator-enable-ramp-delay = <540>;
            };
        };

        rtc {
            compatible = "mediatek,mt6358-rtc";
        };

        keys {
            compatible = "mediatek,mt6358-keys";

            power {
                linux,keycodes = <KEY_POWER>;
                wakeup-source;
            };

            home {
                linux,keycodes = <KEY_HOME>;
            };
        };
    };

  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    pmic {
        compatible = "mediatek,mt6397";

        interrupt-parent = <&pio>;
        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-controller;
        #interrupt-cells = <2>;

        audio-codec {
            compatible = "mediatek,mt6397-codec";
        };

        clocks {
            compatible = "mediatek,mt6397-clk";
            #clock-cells = <1>;
        };

        pinctrl {
            compatible = "mediatek,mt6397-pinctrl";
            gpio-controller;
            #gpio-cells = <2>;
        };

        regulators {
            compatible = "mediatek,mt6397-regulator";

            buck_vpca15 {
                regulator-name = "vpca15";
                regulator-min-microvolt = < 850000>;
                regulator-max-microvolt = <1350000>;
                regulator-ramp-delay = <12500>;
                regulator-enable-ramp-delay = <200>;
            };

            // ...

            ldo_vibr {
                regulator-name = "vibr";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3300000>;
                regulator-enable-ramp-delay = <218>;
            };
        };

        rtc {
            compatible = "mediatek,mt6397-rtc";
        };
    };
