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

title: MediaTek MT6358 Regulator

maintainers:
  - Zhiyong Tao <zhiyong.tao@mediatek.com>

description:
  Regulator node of the PMIC. This node should under the PMIC's device node.
  All voltage regulators provided by the PMIC are described as sub-nodes of
  this node.

properties:
  compatible:
    oneOf:
      - const: mediatek,mt6358-regulator
      - items:
          - const: mediatek,mt6366-regulator
          - const: mediatek,mt6358-regulator

  vsys-ldo1-supply:
    description: Supply for LDOs vfe28, vxo22, vcn28, vaux18, vaud28, vsim1, vusb, vbif28
  vsys-ldo2-supply:
    description: Supply for LDOs vldo28 (MT6358 only), vio28, vmc, vmch, vsim2
  vsys-ldo3-supply:
    description: Supply for LDOs vcn33, vcama[12] (MT6358 only), vemc, vibr
  vsys-vcore-supply:
    description: Supply for buck regulator vcore
  vsys-vdram1-supply:
    description: Supply for buck regulator vdram1
  vsys-vgpu-supply:
    description: Supply for buck regulator vgpu
  vsys-vmodem-supply:
    description: Supply for buck regulator vmodem
  vsys-vpa-supply:
    description: Supply for buck regulator vpa
  vsys-vproc11-supply:
    description: Supply for buck regulator vproc11
  vsys-vproc12-supply:
    description: Supply for buck regulator vproc12
  vsys-vs1-supply:
    description: Supply for buck regulator vs1
  vsys-vs2-supply:
    description: Supply for buck regulator vs2
  vs1-ldo1-supply:
    description:
      Supply for LDOs vrf18, vefuse, vcn18, vcamio (MT6358 only), vio18, vm18 (MT6366 only)
  vs2-ldo1-supply:
    description: Supply for LDOs vdram2, vmddr (MT6366 only)
  vs2-ldo2-supply:
    description: Supply for LDOs vrf12, va12
  vs2-ldo3-supply:
    description:
      Supply for LDOs vsram-core (MT6366 only), vsram-gpu, vsram-others, vsram-proc11, vsram-proc12
  vs2-ldo4-supply:
    description: Supply for LDO vcamd

patternProperties:
  "^(buck_)?v(core|dram1|gpu|modem|pa|proc1[12]|s[12])$":
    description: Buck regulators
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes:
        description: |
          Buck regulatpr operating modes allowed. Valid values below.
          Users should use the macros from dt-bindings/regulator/mediatek,mt6397-regulator.h
            0 (MT6397_BUCK_MODE_AUTO): Auto PFM/PWM mode
            1 (MT6397_BUCK_MODE_FORCE_PWM): Forced PWM mode
        items:
          enum: [0, 1]
    unevaluatedProperties: false

  "^(ldo_)?v(a|rf)12$":
    description: LDOs with fixed 1.2V output and 0~100/10mV tuning
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?v((aux|cn|io|rf)18|camio)$":
    description:
      LDOs with fixed 1.8V output and 0~100/10mV tuning (vcn18 on MT6366 has variable output)
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?vxo22$":
    description: LDOs with fixed 2.2V output and 0~100/10mV tuning
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?v(aud|bif|cn|fe|io)28$":
    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?vusb$":
    description: LDOs with fixed 3.0V output and 0~100/10mV tuning
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?vsram[_-](core|gpu|others|proc1[12])$":
    description: LDOs with variable output
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

  "^(ldo_)?v(cama[12]|camd|cn33|dram2|efuse|emc|ibr|ldo28|m18|mc|mch|mddr|sim[12])$":
    description: LDOs with variable output and 0~100/10mV tuning
    type: object
    $ref: regulator.yaml#
    properties:
      regulator-allowed-modes: false
    unevaluatedProperties: false

required:
  - compatible

additionalProperties: false

allOf:
  - if:
      properties:
        compatible:
          const: mediatek,mt6358-regulator
    then:
      patternProperties:
        # Old regulator node name scheme (with prefix and underscores) only
        # ([^y-] is used to avoid matching -supply
        "^(?<!buck_)(?<!ldo_)v.*[^y-](?!-supply)$": false
        "^ldo_vsram-": false
        # vsram_core regulator doesn't exist on MT6358
        "^ldo_vsram[-_]core$": false

      properties:
        # vm18 and vmddr regulators don't exist on MT6358
        ldo_vm18: false
        ldo_vmddr: false

  - if:
      properties:
        compatible:
          contains:
            const: mediatek,mt6366-regulator
    then:
      patternProperties:
        # Prefer cleaned up regulator node names
        "^(buck|ldo)_": false
        # Don't allow underscores
        "^vsram_": false
        # vcam* regulators don't exist on MT6366
        "^vcam": false

      properties:
        # vldo28 regulator doesn't exist on MT6366
        vldo28: false
        # vs2_ldo4 supply pin doesn't exist on MT6366
        vs2-ldo4-supply: false

examples:
  - |
    #include <dt-bindings/regulator/mediatek,mt6397-regulator.h>

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

        buck_vgpu {
            regulator-name = "vgpu";
            regulator-min-microvolt = <625000>;
            regulator-max-microvolt = <900000>;
            regulator-ramp-delay = <6250>;
            regulator-enable-ramp-delay = <200>;
            regulator-allowed-modes = <MT6397_BUCK_MODE_AUTO
                                       MT6397_BUCK_MODE_FORCE_PWM>;
        };

        ldo_vsram_gpu {
            regulator-name = "vsram_gpu";
            regulator-min-microvolt = <850000>;
            regulator-max-microvolt = <1000000>;
            regulator-ramp-delay = <6250>;
            regulator-enable-ramp-delay = <240>;
        };
    };

  - |
    #include <dt-bindings/regulator/mediatek,mt6397-regulator.h>

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

        vdram1 {
            regulator-name = "pp1125_emi_vdd2";
            regulator-min-microvolt = <1125000>;
            regulator-max-microvolt = <1125000>;
            regulator-ramp-delay = <12500>;
            regulator-enable-ramp-delay = <0>;
            regulator-allowed-modes = <MT6397_BUCK_MODE_AUTO
                                       MT6397_BUCK_MODE_FORCE_PWM>;
            regulator-always-on;
        };

        vproc11 {
            regulator-name = "ppvar_dvdd_proc_bc_mt6366";
            regulator-min-microvolt = <600000>;
            regulator-max-microvolt = <1200000>;
            regulator-ramp-delay = <6250>;
            regulator-enable-ramp-delay = <200>;
            regulator-allowed-modes = <MT6397_BUCK_MODE_AUTO
                                       MT6397_BUCK_MODE_FORCE_PWM>;
            regulator-always-on;
        };

        vmddr {
            regulator-name = "pm0750_emi_vmddr";
            regulator-min-microvolt = <700000>;
            regulator-max-microvolt = <750000>;
            regulator-enable-ramp-delay = <325>;
            regulator-always-on;
        };

        vsram-proc11 {
            regulator-name = "pp0900_dvdd_sram_bc";
            regulator-min-microvolt = <850000>;
            regulator-max-microvolt = <1120000>;
            regulator-ramp-delay = <6250>;
            regulator-enable-ramp-delay = <240>;
            regulator-always-on;
        };
    };
...
