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

title: RK817 Power Management Integrated Circuit

maintainers:
  - Chris Zhong <zyw@rock-chips.com>
  - Zhang Qing <zhangqing@rock-chips.com>

description: |
  Rockchip RK817 series PMIC. This device consists of an i2c controlled MFD
  that includes regulators, an RTC, a power button, an audio codec, and a
  battery charger manager.

properties:
  compatible:
    enum:
      - rockchip,rk817

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  '#clock-cells':
    description:
      See <dt-bindings/clock/rockchip,rk808.h> for clock IDs.
    minimum: 0
    maximum: 1

  clock-output-names:
    description:
      From common clock binding to override the default output clock name.

  rockchip,system-power-controller:
    type: boolean
    description:
      Telling whether or not this PMIC is controlling the system power.

  wakeup-source:
    type: boolean
    description:
      Device can be used as a wakeup source.

  vcc1-supply:
    description:
      The input supply for DCDC_REG1.

  vcc2-supply:
    description:
      The input supply for DCDC_REG2.

  vcc3-supply:
    description:
      The input supply for DCDC_REG3.

  vcc4-supply:
    description:
      The input supply for DCDC_REG4.

  vcc5-supply:
    description:
      The input supply for LDO_REG1, LDO_REG2, and LDO_REG3.

  vcc6-supply:
    description:
      The input supply for LDO_REG4, LDO_REG5, and LDO_REG6.

  vcc7-supply:
    description:
      The input supply for LDO_REG7, LDO_REG8, and LDO_REG9.

  vcc8-supply:
    description:
      The input supply for BOOST.

  vcc9-supply:
    description:
      The input supply for OTG_SWITCH.

  regulators:
    type: object
    patternProperties:
      "^(LDO_REG[1-9]|DCDC_REG[1-4]|BOOST|OTG_SWITCH)$":
        type: object
        unevaluatedProperties: false
        $ref: ../regulator/regulator.yaml#
    unevaluatedProperties: false

  clocks:
    description:
      The input clock for the audio codec.

  clock-names:
    description:
      The clock name for the codec clock.
    items:
      - const: mclk

  '#sound-dai-cells':
    description:
      Needed for the interpretation of sound dais.
    const: 0

  codec:
    description: |
      The child node for the codec to hold additional properties. If no
      additional properties are required for the codec, this node can be
      omitted.
    type: object
    additionalProperties: false
    properties:
      rockchip,mic-in-differential:
        type: boolean
        description:
          Describes if the microphone uses differential mode.

  charger:
    description: |
      The child node for the charger to hold additional properties. If a
      battery is not in use, this node can be omitted.
    type: object
    $ref: /schemas/power/supply/power-supply.yaml

    properties:
      monitored-battery:
        description: |
          A phandle to a monitored battery node that contains a valid
          value for:
          charge-full-design-microamp-hours,
          charge-term-current-microamp,
          constant-charge-current-max-microamp,
          constant-charge-voltage-max-microvolt,
          voltage-max-design-microvolt,
          voltage-min-design-microvolt,
          and a valid ocv-capacity table.

      rockchip,resistor-sense-micro-ohms:
        description: |
          Value in microohms of the battery sense resistor. This value is
          used by the driver to set the correct divisor value to translate
          ADC readings into the proper units of measure.
        enum: [10000, 20000]

      rockchip,sleep-enter-current-microamp:
        description: |
          Value in microamps of the sleep enter current for the charger.
          Value is used by the driver to calibrate the relax threshold.

      rockchip,sleep-filter-current-microamp:
        description:
          Value in microamps of the sleep filter current for the charger.
          Value is used by the driver to derive the sleep sample current.

    required:
      - monitored-battery
      - rockchip,resistor-sense-micro-ohms
      - rockchip,sleep-enter-current-microamp
      - rockchip,sleep-filter-current-microamp

    additionalProperties: false

allOf:
  - if:
      properties:
        '#clock-cells':
          const: 0

    then:
      properties:
        clock-output-names:
          maxItems: 1

    else:
      properties:
        clock-output-names:
          maxItems: 2

required:
  - compatible
  - reg
  - interrupts
  - "#clock-cells"

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/px30-cru.h>
    #include <dt-bindings/pinctrl/rockchip.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/gpio/gpio.h>
    i2c {
        #address-cells = <1>;
        #size-cells = <0>;

        rk817: pmic@20 {
            compatible = "rockchip,rk817";
            reg = <0x20>;
            interrupt-parent = <&gpio0>;
            interrupts = <RK_PB2 IRQ_TYPE_LEVEL_LOW>;
            clock-output-names = "rk808-clkout1", "xin32k";
            clock-names = "mclk";
            clocks = <&cru SCLK_I2S1_OUT>;
            pinctrl-names = "default";
            pinctrl-0 = <&pmic_int>, <&i2s1_2ch_mclk>;
            wakeup-source;
            #clock-cells = <1>;
            #sound-dai-cells = <0>;

            vcc1-supply = <&vccsys>;
            vcc2-supply = <&vccsys>;
            vcc3-supply = <&vccsys>;
            vcc4-supply = <&vccsys>;
            vcc5-supply = <&vccsys>;
            vcc6-supply = <&vccsys>;
            vcc7-supply = <&vccsys>;

            regulators {
                vdd_logic: DCDC_REG1 {
                    regulator-name = "vdd_logic";
                    regulator-min-microvolt = <950000>;
                    regulator-max-microvolt = <1150000>;
                    regulator-ramp-delay = <6001>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <950000>;
                    };
                };

                vdd_arm: DCDC_REG2 {
                    regulator-name = "vdd_arm";
                    regulator-min-microvolt = <950000>;
                    regulator-max-microvolt = <1350000>;
                    regulator-ramp-delay = <6001>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-off-in-suspend;
                        regulator-suspend-microvolt = <950000>;
                    };
                };

                vcc_ddr: DCDC_REG3 {
                    regulator-name = "vcc_ddr";
                    regulator-always-on;
                    regulator-boot-on;

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

                vcc_3v3: DCDC_REG4 {
                    regulator-name = "vcc_3v3";
                    regulator-min-microvolt = <3300000>;
                    regulator-max-microvolt = <3300000>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-off-in-suspend;
                        regulator-suspend-microvolt = <3300000>;
                    };
                };

                vcc_1v8: LDO_REG2 {
                    regulator-name = "vcc_1v8";
                    regulator-min-microvolt = <1800000>;
                    regulator-max-microvolt = <1800000>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <1800000>;
                    };
                };

                vdd_1v0: LDO_REG3 {
                    regulator-name = "vdd_1v0";
                    regulator-min-microvolt = <1000000>;
                    regulator-max-microvolt = <1000000>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <1000000>;
                    };
                };

                vcc3v3_pmu: LDO_REG4 {
                    regulator-name = "vcc3v3_pmu";
                    regulator-min-microvolt = <3300000>;
                    regulator-max-microvolt = <3300000>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <3300000>;
                    };
                };

                vccio_sd: LDO_REG5 {
                    regulator-name = "vccio_sd";
                    regulator-min-microvolt = <1800000>;
                    regulator-max-microvolt = <3300000>;
                    regulator-always-on;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <3300000>;
                    };
                };

                vcc_sd: LDO_REG6 {
                    regulator-name = "vcc_sd";
                    regulator-min-microvolt = <3300000>;
                    regulator-max-microvolt = <3300000>;
                    regulator-boot-on;

                    regulator-state-mem {
                        regulator-on-in-suspend;
                        regulator-suspend-microvolt = <3300000>;
                    };
                };

                vcc_bl: LDO_REG7 {
                    regulator-name = "vcc_bl";
                    regulator-min-microvolt = <3300000>;
                    regulator-max-microvolt = <3300000>;

                    regulator-state-mem {
                        regulator-off-in-suspend;
                        regulator-suspend-microvolt = <3300000>;
                    };
                };

                vcc_lcd: LDO_REG8 {
                    regulator-name = "vcc_lcd";
                    regulator-min-microvolt = <2800000>;
                    regulator-max-microvolt = <2800000>;

                    regulator-state-mem {
                        regulator-off-in-suspend;
                        regulator-suspend-microvolt = <2800000>;
                    };
                };

                vcc_cam: LDO_REG9 {
                    regulator-name = "vcc_cam";
                    regulator-min-microvolt = <3000000>;
                    regulator-max-microvolt = <3000000>;

                    regulator-state-mem {
                        regulator-off-in-suspend;
                        regulator-suspend-microvolt = <3000000>;
                    };
                };
            };

            rk817_charger: charger {
                monitored-battery = <&battery>;
                rockchip,resistor-sense-micro-ohms = <10000>;
                rockchip,sleep-enter-current-microamp = <300000>;
                rockchip,sleep-filter-current-microamp = <100000>;
            };

            rk817_codec: codec {
                rockchip,mic-in-differential;
            };
        };
    };