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

title: Generic Pin Controller with a Single Register for One or More Pins

maintainers:
  - Tony Lindgren <tony@atomide.com>

description:
  Some pin controller devices use a single register for one or more pins. The
  range of pin control registers can vary from one to many for each controller
  instance. Some SoCs from Altera, Broadcom, HiSilicon, Ralink, and TI have this
  kind of pin controller instances.

properties:
  compatible:
    oneOf:
      - enum:
          - pinctrl-single
          - pinconf-single
      - items:
          - enum:
              - ti,am437-padconf
              - ti,am654-padconf
              - ti,dra7-padconf
              - ti,omap2420-padconf
              - ti,omap2430-padconf
              - ti,omap3-padconf
              - ti,omap4-padconf
              - ti,omap5-padconf
              - ti,j7200-padconf
          - const: pinctrl-single

  reg:
    maxItems: 1

  interrupt-controller: true

  '#interrupt-cells':
    const: 1

  '#address-cells':
    const: 1

  '#size-cells':
    const: 0

  '#pinctrl-cells':
    description:
      Number of cells. Usually 2, consisting of register offset, pin configuration
      value, and pinmux mode. Some controllers may use 1 for just offset and value.
    enum: [ 1, 2 ]

  pinctrl-single,bit-per-mux:
    description: Optional flag to indicate register controls more than one pin
    type: boolean

  pinctrl-single,function-mask:
    description: Mask of the allowed register bits
    $ref: /schemas/types.yaml#/definitions/uint32

  pinctrl-single,function-off:
    description: Optional function off mode for disabled state
    $ref: /schemas/types.yaml#/definitions/uint32

  pinctrl-single,register-width:
    description: Width of pin specific bits in the register
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 8, 16, 32 ]

  pinctrl-single,gpio-range:
    description: Optional list of pin base, nr pins & gpio function
    $ref: /schemas/types.yaml#/definitions/phandle-array
    items:
      items:
        - description: phandle of a gpio-range node
        - description: pin base
        - description: number of pins
        - description: gpio function

  '#gpio-range-cells':
    description: No longer needed, may exist in older files for gpio-ranges
    deprecated: true
    const: 3

  gpio-range:
    description: Optional node for gpio range cells
    type: object
    additionalProperties: false
    properties:
      '#pinctrl-single,gpio-range-cells':
        description: Number of gpio range cells
        const: 3
        $ref: /schemas/types.yaml#/definitions/uint32

patternProperties:
  '-pins(-[0-9]+)?$|-pin$':
    description:
      Pin group node name using naming ending in -pins followed by an optional
      instance number
    type: object
    additionalProperties: false

    properties:
      pinctrl-single,pins:
        description:
          Array of pins as described in pinmux-node.yaml for pinctrl-pin-array
        $ref: /schemas/types.yaml#/definitions/uint32-array

      pinctrl-single,bits:
        description: Register bit configuration for pinctrl-single,bit-per-mux
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: register offset
          - description: value
          - description: pin bitmask in the register

      pinctrl-single,bias-pullup:
        description: Optional bias pull up configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: input
          - description: enabled pull up bits
          - description: disabled pull up bits
          - description: bias pull up mask

      pinctrl-single,bias-pulldown:
        description: Optional bias pull down configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: input
          - description: enabled pull down bits
          - description: disabled pull down bits
          - description: bias pull down mask

      pinctrl-single,drive-strength:
        description: Optional drive strength configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: drive strength current
          - description: drive strength mask

      pinctrl-single,input-schmitt:
        description: Optional schmitt strength configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: schmitt strength current
          - description: schmitt strength mask

      pinctrl-single,input-schmitt-enable:
        description: Optional input schmitt configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: input
          - description: enable bits
          - description: disable bits
          - description: input schmitt mask

      pinctrl-single,low-power-mode:
        description: Optional low power mode configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: low power mode value
          - description: low power mode mask

      pinctrl-single,slew-rate:
        description: Optional slew rate configuration
        $ref: /schemas/types.yaml#/definitions/uint32-array
        items:
          - description: slew rate
          - description: slew rate mask

allOf:
  - $ref: pinctrl.yaml#

required:
  - compatible
  - reg
  - pinctrl-single,register-width

additionalProperties: false

examples:
  - |
    soc {
      #address-cells = <1>;
      #size-cells = <1>;

      pinmux@4a100040 {
        compatible = "pinctrl-single";
        reg = <0x4a100040 0x0196>;
        #address-cells = <1>;
        #size-cells = <0>;
        #pinctrl-cells = <2>;
        #interrupt-cells = <1>;
        interrupt-controller;
        pinctrl-single,register-width = <16>;
        pinctrl-single,function-mask = <0xffff>;
        pinctrl-single,gpio-range = <&range 0 3 0>;
        range: gpio-range {
          #pinctrl-single,gpio-range-cells = <3>;
        };

        uart2-pins {
          pinctrl-single,pins =
            <0xd8 0x118>,
            <0xda 0>,
            <0xdc 0x118>,
            <0xde 0>;
        };
      };
    };
