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

title: MediaTek MT6370 SubPMIC

maintainers:
  - ChiYuan Huang <cy_huang@richtek.com>

description: |
  MT6370 is a highly-integrated smart power management IC, which includes a
  single cell Li-Ion/Li-Polymer switching battery charger, a USB Type-C &
  Power Delivery (PD) controller, dual flash LED current sources, a RGB LED
  driver, a backlight WLED driver, a display bias driver and a general LDO for
  portable devices.

properties:
  compatible:
    const: mediatek,mt6370

  reg:
    maxItems: 1

  wakeup-source: true

  interrupts:
    maxItems: 1

  interrupt-controller: true

  "#interrupt-cells":
    const: 1

  adc:
    type: object
    additionalProperties: false
    description: |
      Provides 9 channels for system monitoring, including VBUSDIV5 (lower
      accuracy, higher measure range), VBUSDIV2 (higher accuracy, lower
      measure range), VBAT, VSYS, CHG_VDDP, TS_BAT, IBUS, IBAT, and TEMP_JC.

    properties:
      compatible:
        const: mediatek,mt6370-adc

      "#io-channel-cells":
        const: 1

    required:
      - compatible
      - "#io-channel-cells"

  backlight:
    type: object
    $ref: /schemas/leds/backlight/mediatek,mt6370-backlight.yaml#

  charger:
    type: object
    $ref: /schemas/power/supply/mediatek,mt6370-charger.yaml#

  tcpc:
    type: object
    $ref: /schemas/usb/mediatek,mt6370-tcpc.yaml#

  indicator:
    type: object
    $ref: /schemas/leds/mediatek,mt6370-indicator.yaml#

  flashlight:
    type: object
    $ref: /schemas/leds/mediatek,mt6370-flashlight.yaml#

  regulators:
    type: object
    additionalProperties: false
    description: |
      List all supported regulators, which support the control for DisplayBias
      voltages and one general purpose LDO which commonly used to drive the
      vibrator.

    patternProperties:
      "^(dsvbst|vibldo)$":
        $ref: /schemas/regulator/regulator.yaml#
        type: object
        unevaluatedProperties: false

      "^(dsvpos|dsvneg)$":
        $ref: /schemas/regulator/regulator.yaml#
        type: object
        unevaluatedProperties: false

        properties:
          enable-gpios:
            maxItems: 1

required:
  - compatible
  - reg
  - interrupts
  - interrupt-controller
  - "#interrupt-cells"
  - regulators
  - adc
  - backlight
  - indicator
  - tcpc
  - charger
  - flashlight

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/leds/common.h>
    #include <dt-bindings/iio/adc/mediatek,mt6370_adc.h>
    #include <dt-bindings/usb/pd.h>
    i2c {
      #address-cells = <1>;
      #size-cells = <0>;

      pmic@34 {
        compatible = "mediatek,mt6370";
        reg = <0x34>;
        wakeup-source;
        interrupts-extended = <&gpio26 3 IRQ_TYPE_LEVEL_LOW>;
        interrupt-controller;
        #interrupt-cells = <1>;

        mt6370_adc: adc {
          compatible = "mediatek,mt6370-adc";
          #io-channel-cells = <1>;
        };

        backlight {
          compatible = "mediatek,mt6370-backlight";
          mediatek,bled-channel-use = /bits/ 8 <15>;
        };

        charger {
          compatible = "mediatek,mt6370-charger";
          interrupts = <68>, <48>, <6>;
          interrupt-names = "uvp_d_evt", "attach_i", "mivr";
          io-channels = <&mt6370_adc MT6370_CHAN_IBUS>;

          mt6370_otg_vbus: usb-otg-vbus-regulator {
            regulator-name = "mt6370-usb-otg-vbus";
            regulator-min-microvolt = <4350000>;
            regulator-max-microvolt = <5800000>;
            regulator-min-microamp = <500000>;
            regulator-max-microamp = <3000000>;
          };
        };

        indicator {
          compatible = "mediatek,mt6370-indicator";
          #address-cells = <1>;
          #size-cells = <0>;

          multi-led@0 {
            reg = <0>;
            function = LED_FUNCTION_INDICATOR;
            color = <LED_COLOR_ID_RGB>;
            led-max-microamp = <24000>;
            #address-cells = <1>;
            #size-cells = <0>;
            led@0 {
              reg = <0>;
              color = <LED_COLOR_ID_RED>;
            };
            led@1 {
              reg = <1>;
              color = <LED_COLOR_ID_GREEN>;
            };
            led@2 {
              reg = <2>;
              color = <LED_COLOR_ID_BLUE>;
            };
          };
          led@3 {
            reg = <3>;
            function = LED_FUNCTION_INDICATOR;
            color = <LED_COLOR_ID_WHITE>;
            led-max-microamp = <6000>;
          };
        };

        flashlight {
          compatible = "mediatek,mt6370-flashlight";
          #address-cells = <1>;
          #size-cells = <0>;
          led@0 {
            reg = <0>;
            led-sources = <0>;
            function = LED_FUNCTION_FLASH;
            color = <LED_COLOR_ID_WHITE>;
            function-enumerator = <1>;
            led-max-microamp = <200000>;
            flash-max-microamp = <500000>;
            flash-max-timeout-us = <1248000>;
          };
          led@1 {
            reg = <1>;
            led-sources = <1>;
            function = LED_FUNCTION_FLASH;
            color = <LED_COLOR_ID_WHITE>;
            function-enumerator = <2>;
            led-max-microamp = <200000>;
            flash-max-microamp = <500000>;
            flash-max-timeout-us = <1248000>;
          };
        };

        tcpc {
          compatible = "mediatek,mt6370-tcpc";
          interrupts-extended = <&gpio26 4 IRQ_TYPE_LEVEL_LOW>;

          connector {
            compatible = "usb-c-connector";
            label = "USB-C";
            vbus-supply = <&mt6370_otg_vbus>;
            data-role = "dual";
            power-role = "dual";
            try-power-role = "sink";
            source-pdos = <PDO_FIXED(5000, 1000, PDO_FIXED_DUAL_ROLE | PDO_FIXED_DATA_SWAP)>;
            sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_DUAL_ROLE | PDO_FIXED_DATA_SWAP)>;
            op-sink-microwatt = <10000000>;

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

              port@0 {
                reg = <0>;
                endpoint {
                  remote-endpoint = <&usb_hs>;
                };
              };
              port@1 {
                reg = <1>;
                endpoint {
                  remote-endpoint = <&usb_ss>;
                };
              };
              port@2 {
                reg = <2>;
                endpoint {
                  remote-endpoint = <&dp_aux>;
                };
              };
            };
          };
        };

        regulators {
          dsvbst {
            regulator-name = "mt6370-dsv-vbst";
            regulator-min-microvolt = <4000000>;
            regulator-max-microvolt = <6200000>;
          };
          dsvpos {
            regulator-name = "mt6370-dsv-vpos";
            regulator-min-microvolt = <4000000>;
            regulator-max-microvolt = <6000000>;
            regulator-boot-on;
          };
          dsvneg {
            regulator-name = "mt6370-dsv-vneg";
            regulator-min-microvolt = <4000000>;
            regulator-max-microvolt = <6000000>;
            regulator-boot-on;
          };
          vibldo {
            regulator-name = "mt6370-vib-ldo";
            regulator-min-microvolt = <1600000>;
            regulator-max-microvolt = <4000000>;
          };
        };
      };
    };