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

title: Active-semi ACT8945a regulator

maintainers:
  - Paul Cercueil <paul@crapouillou.net>

properties:
  compatible:
    const: active-semi,act8945a

  reg:
    maxItems: 1

  system-power-controller:
    description:
      Indicates that the ACT8945a is responsible for powering OFF
      the system.
    type: boolean

  active-semi,vsel-high:
    description:
      Indicates the VSEL pin is high. If this property is missing,
      the VSEL pin is assumed to be low.
    type: boolean

  regulators:
    type: object
    additionalProperties: false

    properties:
      REG_DCDC1:
        type: object
        $ref: /schemas/regulator/regulator.yaml#
        unevaluatedProperties: false

        properties:
          vp1-supply:
            description: Handle to the VP1 input supply

      REG_DCDC2:
        type: object
        $ref: /schemas/regulator/regulator.yaml#
        unevaluatedProperties: false

        properties:
          vp2-supply:
            description: Handle to the VP2 input supply

      REG_DCDC3:
        type: object
        $ref: /schemas/regulator/regulator.yaml#
        unevaluatedProperties: false

        properties:
          vp3-supply:
            description: Handle to the VP3 input supply

    patternProperties:
      "^REG_LDO[1-2]$":
        type: object
        $ref: /schemas/regulator/regulator.yaml#
        unevaluatedProperties: false

        properties:
          inl45-supply:
            description: Handle to the INL45 input supply

      "^REG_LDO[3-4]$":
        type: object
        $ref: /schemas/regulator/regulator.yaml#
        unevaluatedProperties: false

        properties:
          inl67-supply:
            description: Handle to the INL67 input supply

  charger:
    type: object
    additionalProperties: false

    properties:
      compatible:
        const: active-semi,act8945a-charger

      interrupts:
        maxItems: 1

      active-semi,chglev-gpios:
        description: charge current level GPIO
        maxItems: 1

      active-semi,lbo-gpios:
        description: low battery voltage detect GPIO
        maxItems: 1

      active-semi,input-voltage-threshold-microvolt:
        description:
          Specifies the charger's input over-voltage threshold value. Despite
          the name, specified values are in millivolt (mV).
        enum: [ 6600, 7000, 7500, 8000 ]
        default: 6600

      active-semi,precondition-timeout:
        description:
          Specifies the charger's PRECONDITION safety timer setting value in
          minutes. If 0, it means to disable this timer.
        enum: [ 0, 40, 60, 80 ]
        default: 40
        $ref: /schemas/types.yaml#/definitions/uint32

      active-semi,total-timeout:
        description:
          Specifies the charger's total safety timer setting value in hours; If
          0, it means to disable this timer;
        enum: [ 0, 3, 4, 5 ]
        default: 3
        $ref: /schemas/types.yaml#/definitions/uint32

    required:
      - compatible
      - interrupts
      - active-semi,chglev-gpios
      - active-semi,lbo-gpios

additionalProperties: false

required:
  - reg
  - compatible
  - regulators

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/mfd/atmel-flexcom.h>
    #include <dt-bindings/regulator/active-semi,8945a-regulator.h>

    i2c {
      #address-cells = <1>;
      #size-cells = <0>;

      pmic@5b {
        compatible = "active-semi,act8945a";
        reg = <0x5b>;
        active-semi,vsel-high;

        regulators {
          REG_DCDC1 {
            regulator-name = "VDD_1V35";
            regulator-min-microvolt = <1350000>;
            regulator-max-microvolt = <1350000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_FIXED>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_FIXED>;
            regulator-always-on;

            regulator-state-mem {
              regulator-on-in-suspend;
              regulator-suspend-min-microvolt = <1400000>;
              regulator-suspend-max-microvolt = <1400000>;
              regulator-changeable-in-suspend;
              regulator-mode = <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            };
          };

          REG_DCDC2 {
            regulator-name = "VDD_1V2";
            regulator-min-microvolt = <1100000>;
            regulator-max-microvolt = <1300000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_FIXED>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_FIXED>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };

          REG_DCDC3 {
            regulator-name = "VDD_3V3";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_FIXED>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_FIXED>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };

          REG_LDO1 {
            regulator-name = "VDD_FUSE";
            regulator-min-microvolt = <2500000>;
            regulator-max-microvolt = <2500000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_NORMAL>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_NORMAL>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };

          REG_LDO2 {
            regulator-name = "VDD_3V3_LP";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_NORMAL>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_NORMAL>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };

          REG_LDO3 {
            regulator-name = "VDD_LED";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_NORMAL>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_NORMAL>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };

          REG_LDO4 {
            regulator-name = "VDD_SDHC_1V8";
            regulator-min-microvolt = <1800000>;
            regulator-max-microvolt = <1800000>;
            regulator-allowed-modes = <ACT8945A_REGULATOR_MODE_NORMAL>,
                                      <ACT8945A_REGULATOR_MODE_LOWPOWER>;
            regulator-initial-mode = <ACT8945A_REGULATOR_MODE_NORMAL>;
            regulator-always-on;

            regulator-state-mem {
              regulator-off-in-suspend;
            };
          };
        };

        charger {
          compatible = "active-semi,act8945a-charger";
          pinctrl-names = "default";
          pinctrl-0 = <&pinctrl_charger_chglev &pinctrl_charger_lbo &pinctrl_charger_irq>;
          interrupt-parent = <&pioA>;
          interrupts = <45 IRQ_TYPE_EDGE_RISING>;

          active-semi,chglev-gpios = <&pioA 12 GPIO_ACTIVE_HIGH>;
          active-semi,lbo-gpios = <&pioA 72 GPIO_ACTIVE_LOW>;
          active-semi,input-voltage-threshold-microvolt = <6600>;
          active-semi,precondition-timeout = <40>;
          active-semi,total-timeout = <3>;
        };
      };
    };
