Unverified Commit 914809c6 authored by Mark Brown's avatar Mark Brown
Browse files

Samsung S2MPG10 regulator and S2MPG11 PMIC drivers

Merge series from André Draszik <andre.draszik@linaro.org>:

This series extends the existing S2MPG10 PMIC driver to add support for
the regulators, and adds new S2MPG11 core and regulator drivers.

The patches are kept together in one series, due to S2MPG11 and its
regulators being very similar to S2MPG10.

The Samsung S2MPG11 PMIC is a Power Management IC for mobile
applications with buck converters, various LDOs, power meters, and
additional GPIO interfaces. It typically complements an S2MPG10 PMIC in
a main/sub configuration as the sub-PMIC and both are used on the
Google Pixel 6 and 6 Pro (oriole / raven).

A DT update for Oriole / Raven to enable these is required which I will
send out separately.
parents 20c4701b fe8429a2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ examples:
            interrupts-extended = <&gpa0 6 IRQ_TYPE_LEVEL_LOW>;

            regulators {
                LDO1 {
                ldo1m {
                    regulator-name = "vdd_ldo1";
                    regulator-min-microvolt = <700000>;
                    regulator-max-microvolt = <1300000>;
@@ -84,7 +84,7 @@ examples:

                // ...

                BUCK1 {
                buck8m {
                    regulator-name = "vdd_mif";
                    regulator-min-microvolt = <450000>;
                    regulator-max-microvolt = <1300000>;
+120 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/mfd/samsung,s2mpg10-pmic.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Samsung S2MPG10 Power Management IC

maintainers:
  - André Draszik <andre.draszik@linaro.org>

description: |
  This is part of the device tree bindings for the S2MPG10 Power Management IC
  (PMIC).

  The Samsung S2MPG10 is a Power Management IC for mobile applications with buck
  converters, various LDOs, power meters, RTC, clock outputs, and additional
  GPIO interfaces and is typically complemented by S2MPG10 PMIC in a main/sub
  configuration as the main PMIC.

properties:
  compatible:
    const: samsung,s2mpg10-pmic

  clocks:
    $ref: /schemas/clock/samsung,s2mps11.yaml
    description:
      Child node describing clock provider.

  interrupts:
    maxItems: 1

  regulators:
    type: object
    $ref: /schemas/regulator/samsung,s2mpg10-regulator.yaml
    description:
      List of child nodes that specify the regulators.

  system-power-controller: true

  wakeup-source: true

patternProperties:
  "^vinb([1-9]|10)m-supply$":
    description:
      Phandle to the power supply for each buck rail of this PMIC. There is a
      1:1 mapping of supply to rail, e.g. vinb1m-supply supplies buck1m.

  "^vinl([1-9]|1[0-5])m-supply$":
    description: |
      Phandle to the power supply for one or multiple LDO rails of this PMIC.
      The mapping of supply to rail(s) is as follows:
        vinl1m - ldo13m
        vinl2m - ldo15m
        vinl3m - ldo1m, ldo5m, ldo7m
        vinl4m - ldo3m, ldo8m
        vinl5m - ldo16m
        vinl6m - ldo17m
        vinl7m - ldo6m, ldo11m, ldo24m, ldo28m
        vinl8m - ldo12m
        vinl9m - ldo2m, ldo4m
        vinl10m - ldo9m, ldo14m, ldo18m, 19m, ldo20m, ldo25m
        vinl11m - ldo23m, ldo31m
        vinl12m - ldo29m
        vinl13m - ldo30m
        vinl14m - ldo21m
        vinl15m - ldo10m, ldo22m, ldo26m, ldo27m

required:
  - compatible
  - interrupts
  - regulators

additionalProperties: false

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/regulator/samsung,s2mpg10-regulator.h>

    pmic {
        compatible = "samsung,s2mpg10-pmic";
        interrupts-extended = <&gpa0 6 IRQ_TYPE_LEVEL_LOW>;
        pinctrl-names = "default";
        pinctrl-0 = <&pmic_int>;
        system-power-controller;
        wakeup-source;

        vinl3m-supply = <&buck8m>;

        clocks {
            compatible = "samsung,s2mpg10-clk";
            #clock-cells = <1>;
            clock-output-names = "rtc32k_ap", "peri32k1", "peri32k2";
        };

        regulators {
            buck8m {
                regulator-name = "vdd_mif";
                regulator-min-microvolt = <450000>;
                regulator-max-microvolt = <1300000>;
                regulator-ramp-delay = <6250>;
            };

            ldo1m {
                regulator-name = "vdd_ldo1";
                regulator-min-microvolt = <700000>;
                regulator-max-microvolt = <1300000>;
            };

            ldo20m {
                regulator-name = "vdd_dmics";
                regulator-min-microvolt = <700000>;
                regulator-max-microvolt = <1300000>;
                regulator-always-on;
                samsung,ext-control = <S2MPG10_EXTCTRL_LDO20M_EN2>;
            };
        };
    };
+88 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/mfd/samsung,s2mpg11-pmic.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Samsung S2MPG11 Power Management IC

maintainers:
  - André Draszik <andre.draszik@linaro.org>

description: |
  This is part of the device tree bindings for the S2MPG11 Power Management IC
  (PMIC).

  The Samsung S2MPG11 is a Power Management IC for mobile applications with buck
  converters, various LDOs, power meters, NTC thermistor inputs, and additional
  GPIO interfaces and typically complements an S2MPG10 PMIC in a main/sub
  configuration as the sub-PMIC.

properties:
  compatible:
    const: samsung,s2mpg11-pmic

  interrupts:
    maxItems: 1

  regulators:
    type: object
    $ref: /schemas/regulator/samsung,s2mpg11-regulator.yaml
    description:
      List of child nodes that specify the regulators.

  wakeup-source: true

patternProperties:
  "^vinb(([1-9]|10)s|[abd])-supply$":
    description:
      Phandle to the power supply for each buck rail of this PMIC. There is a
      1:1 mapping of numbered supply to rail, e.g. vinb1s-supply supplies
      buck1s. The remaining mapping is as follows
        vinba - bucka
        vinbb - buck boost
        vinbd - buckd

  "^vinl[1-6]s-supply$":
    description: |
      Phandle to the power supply for one or multiple LDO rails of this PMIC.
      The mapping of supply to rail(s) is as follows
        vinl1s - ldo1s, ldo2s
        vinl2s - ldo8s, ldo9s
        vinl3s - ldo3s, ldo5s, ldo7s, ldo15s
        vinl4s - ldo10s, ldo11s, ldo12s, ldo14s
        vinl5s - ldo4s, ldo6s
        vinl6s - ldo13s

required:
  - compatible
  - interrupts
  - regulators

additionalProperties: false

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/regulator/samsung,s2mpg10-regulator.h>

    pmic {
        compatible = "samsung,s2mpg11-pmic";
        interrupts-extended = <&gpa0 7 IRQ_TYPE_LEVEL_LOW>;
        pinctrl-names = "default";
        pinctrl-0 = <&pmic_int>;
        wakeup-source;

        vinl1s-supply = <&buck8m>;
        vinl2s-supply = <&buck6s>;

        regulators {
            buckd {
                regulator-name = "vcc_ufs";
                regulator-ramp-delay = <6250>;
                enable-gpios = <&gpp0 1 GPIO_ACTIVE_HIGH>;
                samsung,ext-control = <S2MPG11_EXTCTRL_UFS_EN>;
            };
        };
    };
+1 −28
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ description: |
properties:
  compatible:
    enum:
      - samsung,s2mpg10-pmic
      - samsung,s2mps11-pmic
      - samsung,s2mps13-pmic
      - samsung,s2mps14-pmic
@@ -59,42 +58,16 @@ properties:
      reset (setting buck voltages to default values).
    type: boolean

  system-power-controller: true

  wakeup-source: true

required:
  - compatible
  - reg
  - regulators

additionalProperties: false

allOf:
  - if:
      properties:
        compatible:
          contains:
            const: samsung,s2mpg10-pmic
    then:
      properties:
        reg: false
        samsung,s2mps11-acokb-ground: false
        samsung,s2mps11-wrstbi-ground: false

      # oneOf is required, because dtschema's fixups.py doesn't handle this
      # nesting here. Its special treatment to allow either interrupt property
      # when only one is specified in the binding works at the top level only.
      oneOf:
        - required: [interrupts]
        - required: [interrupts-extended]

    else:
      properties:
        system-power-controller: false

      required:
        - reg

  - if:
      properties:
        compatible:
+158 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/samsung,s2mpg10-regulator.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Samsung S2MPG10 Power Management IC regulators

maintainers:
  - André Draszik <andre.draszik@linaro.org>

description: |
  This is part of the device tree bindings for the S2MG10 Power Management IC
  (PMIC).

  The S2MPG10 PMIC provides 10 buck and 31 LDO regulators.

  See also Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml for
  additional information and example.

properties:
  # 1 LDO with possible (but limited) external control
  ldo20m:
    type: object
    $ref: regulator.yaml#
    unevaluatedProperties: false
    description:
      Properties for a single LDO regulator.

    allOf:
      - $ref: "#/$defs/s2mpg10-ext-control"

    properties:
      regulator-ramp-delay: false

      samsung,ext-control:
        minimum: 11

patternProperties:
  # 10 bucks
  "^buck([1-9]|10)m$":
    type: object
    $ref: regulator.yaml#
    unevaluatedProperties: false
    description:
      Properties for a single buck regulator.

    allOf:
      - $ref: "#/$defs/s2mpg10-ext-control"

    properties:
      regulator-ramp-delay:
        enum: [6250, 12500, 25000]
        default: 6250

      samsung,ext-control:
        maximum: 10

  # 12 standard LDOs
  "^ldo(2[1-9]?|3[0-1])m$":
    type: object
    $ref: regulator.yaml#
    unevaluatedProperties: false
    description:
      Properties for single LDO regulator.

    properties:
      regulator-ramp-delay: false

  # 12 LDOs with possible external control
  "^ldo([3-689]|1[046-9])m$":
    type: object
    $ref: regulator.yaml#
    unevaluatedProperties: false
    description:
      Properties for a single LDO regulator.

    allOf:
      - $ref: "#/$defs/s2mpg10-ext-control"

    properties:
      regulator-ramp-delay: false

      samsung,ext-control:
        maximum: 10

  # 6 LDOs with ramp support, 5 out of those with possible external control
  "^ldo(1[1235]?|7)m$":
    type: object
    $ref: regulator.yaml#
    unevaluatedProperties: false
    description:
      Properties for a single LDO regulator.

    allOf:
      - $ref: "#/$defs/s2mpg10-ext-control"

    properties:
      regulator-ramp-delay:
        enum: [6250, 12500]
        default: 6250

      samsung,ext-control:
        maximum: 10

$defs:
  s2mpg10-ext-control:
    properties:
      samsung,ext-control:
        description: |
          These rails can be controlled via one of several possible external
          (hardware) signals. If so, this property configures the signal the PMIC
          should monitor. For S2MPG10 rails where external control is possible other
          than ldo20m, the following values generally corresponding to the
          respective on-chip pin are valid:
            - 0 # S2MPG10_EXTCTRL_PWREN - PWREN pin
            - 1 # S2MPG10_EXTCTRL_PWREN_MIF - PWREN_MIF pin
            - 2 # S2MPG10_EXTCTRL_AP_ACTIVE_N - ~AP_ACTIVE_N pin
            - 3 # S2MPG10_EXTCTRL_CPUCL1_EN - CPUCL1_EN pin
            - 4 # S2MPG10_EXTCTRL_CPUCL1_EN2 - CPUCL1_EN & PWREN pins
            - 5 # S2MPG10_EXTCTRL_CPUCL2_EN - CPUCL2_EN pin
            - 6 # S2MPG10_EXTCTRL_CPUCL2_EN2 - CPUCL2_E2 & PWREN pins
            - 7 # S2MPG10_EXTCTRL_TPU_EN - TPU_EN pin
            - 8 # S2MPG10_EXTCTRL_TPU_EN2 - TPU_EN & ~AP_ACTIVE_N pins
            - 9 # S2MPG10_EXTCTRL_TCXO_ON - TCXO_ON pin
            - 10 # S2MPG10_EXTCTRL_TCXO_ON2 - TCXO_ON & ~AP_ACTIVE_N pins

          For S2MPG10 ldo20m, the following values are valid
            - 11 # S2MPG10_EXTCTRL_LDO20M_EN2 - VLDO20M_EN & LDO20M_SFR
            - 12 # S2MPG10_EXTCTRL_LDO20M_EN - VLDO20M_EN pin

        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 12

      enable-gpios:
        description:
          For rails where external control is done via a GPIO, this optional
          property describes the GPIO line used.

    dependentRequired:
      enable-gpios: [ "samsung,ext-control" ]

allOf:
  # Bucks 8, 9, and LDO 1 can not be controlled externally - above definition
  # allows it and we deny it here. This approach reduces repetition.
  - if:
      anyOf:
        - required: [buck8m]
        - required: [buck9m]
        - required: [ldo1m]
    then:
      patternProperties:
        "^(buck[8-9]|ldo1)m$":
          properties:
            samsung,ext-control: false

additionalProperties: false
Loading