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

title: STMicroelectonics Multi-Function eXpander (STMFX)

description: ST Multi-Function eXpander (STMFX) is a slave controller using I2C for
               communication with the main MCU. Its main features are GPIO expansion,
               main MCU IDD measurement (IDD is the amount of current that flows
               through VDD) and resistive touchscreen controller.

maintainers:
  - Amelie Delaunay <amelie.delaunay@foss.st.com>

properties:
  compatible:
    const: st,stmfx-0300

  reg:
    enum: [ 0x42, 0x43 ]

  interrupts:
    maxItems: 1

  drive-open-drain: true

  vdd-supply: true

  pinctrl:
    type: object

    properties:
      compatible:
        const: st,stmfx-0300-pinctrl

      "#gpio-cells":
        const: 2

      "#interrupt-cells":
        const: 2

      gpio-controller: true

      interrupt-controller: true

      gpio-ranges:
        description: if all STMFX pins[24:0] are available (no other STMFX function in use),
                     you should use gpio-ranges = <&stmfx_pinctrl 0 0 24>;
                     if agpio[3:0] are not available (STMFX Touchscreen function in use),
                     you should use gpio-ranges = <&stmfx_pinctrl 0 0 16>, <&stmfx_pinctrl 20 20 4>;
                     if agpio[7:4] are not available (STMFX IDD function in use),
                     you should use gpio-ranges = <&stmfx_pinctrl 0 0 20>;
        maxItems: 1

    patternProperties:
      "^[a-zA-Z]*-pins$":
        type: object
        additionalProperties: false

        allOf:
          - $ref: ../pinctrl/pinmux-node.yaml

        properties:
          pins: true
          bias-disable: true
          bias-pull-up: true
          bias-pull-pin-default: true
          bias-pull-down: true
          drive-open-drain: true
          drive-push-pull: true
          output-high: true
          output-low: true

    additionalProperties: false

    required:
      - compatible
      - "#gpio-cells"
      - "#interrupt-cells"
      - gpio-controller
      - interrupt-controller
      - gpio-ranges

additionalProperties: false

required:
  - compatible
  - reg
  - interrupts

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    i2c {
      #address-cells = <1>;
      #size-cells = <0>;
      stmfx@42 {
        compatible = "st,stmfx-0300";
        reg = <0x42>;
        interrupts = <8 IRQ_TYPE_EDGE_RISING>;
        interrupt-parent = <&gpioi>;
        vdd-supply = <&v3v3>;

        stmfx_pinctrl: pinctrl {
          compatible = "st,stmfx-0300-pinctrl";
          #gpio-cells = <2>;
          #interrupt-cells = <2>;
          gpio-controller;
          interrupt-controller;
          gpio-ranges = <&stmfx_pinctrl 0 0 24>;

          joystick_pins: joystick-pins {
            pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
            drive-push-pull;
            bias-pull-up;
          };
        };
      };
    };
...