# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/soc/samsung/exynos-pmu.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Samsung Exynos SoC series Power Management Unit (PMU)

maintainers:
  - Krzysztof Kozlowski <krzk@kernel.org>

# Custom select to avoid matching all nodes with 'syscon'
select:
  properties:
    compatible:
      contains:
        enum:
          - google,gs101-pmu
          - samsung,exynos3250-pmu
          - samsung,exynos4210-pmu
          - samsung,exynos4212-pmu
          - samsung,exynos4412-pmu
          - samsung,exynos5250-pmu
          - samsung,exynos5260-pmu
          - samsung,exynos5410-pmu
          - samsung,exynos5420-pmu
          - samsung,exynos5433-pmu
          - samsung,exynos7-pmu
          - samsung,exynos850-pmu
          - samsung-s5pv210-pmu
  required:
    - compatible

properties:
  compatible:
    oneOf:
      - items:
          - enum:
              - google,gs101-pmu
              - samsung,exynos3250-pmu
              - samsung,exynos4210-pmu
              - samsung,exynos4212-pmu
              - samsung,exynos4412-pmu
              - samsung,exynos5250-pmu
              - samsung,exynos5260-pmu
              - samsung,exynos5410-pmu
              - samsung,exynos5420-pmu
              - samsung,exynos5433-pmu
              - samsung,exynos7-pmu
              - samsung,exynos850-pmu
              - samsung-s5pv210-pmu
          - const: syscon
      - items:
          - enum:
              - samsung,exynos7885-pmu
              - samsung,exynosautov9-pmu
              - samsung,exynosautov920-pmu
              - tesla,fsd-pmu
          - const: samsung,exynos7-pmu
          - const: syscon
      - items:
          - enum:
              - samsung,exynos3250-pmu
              - samsung,exynos4210-pmu
              - samsung,exynos4212-pmu
              - samsung,exynos4412-pmu
              - samsung,exynos5250-pmu
              - samsung,exynos5420-pmu
              - samsung,exynos5433-pmu
          - const: simple-mfd
          - const: syscon

  reg:
    maxItems: 1

  '#clock-cells':
    const: 1

  clock-names:
    description:
      List of clock names for particular CLKOUT mux inputs
    minItems: 1
    maxItems: 32
    items:
      pattern: '^clkout([0-9]|[12][0-9]|3[0-1])$'

  clocks:
    minItems: 1
    maxItems: 32

  dp-phy:
    $ref: /schemas/phy/samsung,dp-video-phy.yaml
    unevaluatedProperties: false

  interrupt-controller:
    description:
      Some PMUs are capable of behaving as an interrupt controller (mostly
      to wake up a suspended PMU).

  '#interrupt-cells':
    description:
      Must be identical to the that of the parent interrupt controller.
    const: 3

  mipi-phy:
    $ref: /schemas/phy/samsung,mipi-video-phy.yaml
    unevaluatedProperties: false

  reboot-mode:
    $ref: /schemas/power/reset/syscon-reboot-mode.yaml
    type: object
    description:
      Reboot mode to alter bootloader behavior for the next boot

  syscon-poweroff:
    $ref: /schemas/power/reset/syscon-poweroff.yaml#
    type: object
    description:
      Node for power off method

  syscon-reboot:
    $ref: /schemas/power/reset/syscon-reboot.yaml#
    type: object
    description:
      Node for reboot method

required:
  - compatible
  - reg

additionalProperties: false

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,exynos3250-pmu
              - samsung,exynos4210-pmu
              - samsung,exynos4212-pmu
              - samsung,exynos4412-pmu
              - samsung,exynos5250-pmu
              - samsung,exynos5410-pmu
              - samsung,exynos5420-pmu
              - samsung,exynos5433-pmu
    then:
      required:
        - '#clock-cells'
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,exynos3250-pmu
              - samsung,exynos4210-pmu
              - samsung,exynos4212-pmu
              - samsung,exynos4412-pmu
              - samsung,exynos5250-pmu
              - samsung,exynos5420-pmu
              - samsung,exynos5433-pmu
    then:
      properties:
        mipi-phy: true
    else:
      properties:
        mipi-phy: false

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,exynos5250-pmu
              - samsung,exynos5420-pmu
              - samsung,exynos5433-pmu
    then:
      properties:
        dp-phy: true
    else:
      properties:
        dp-phy: false

examples:
  - |
    #include <dt-bindings/clock/exynos5250.h>

    pmu_system_controller: system-controller@10040000 {
        compatible = "samsung,exynos5250-pmu", "syscon";
        reg = <0x10040000 0x5000>;
        interrupt-controller;
        #interrupt-cells = <3>;
        interrupt-parent = <&gic>;
        #clock-cells = <1>;
        clock-names = "clkout16";
        clocks = <&clock CLK_FIN_PLL>;

        dp-phy {
            compatible = "samsung,exynos5250-dp-video-phy";
            #phy-cells = <0>;
        };

        mipi-phy {
            compatible = "samsung,s5pv210-mipi-video-phy";
            #phy-cells = <1>;
        };
    };
