# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

description: |
    The nRF pin controller is a singleton node responsible for controlling
    pin function selection and pin properties. For example, you can use this
    node to route UART0 RX to pin P0.1 and enable the pull-up resistor on the
    pin.

    The node has the 'pinctrl' node label set in your SoC's devicetree,
    so you can modify it like this:

      &pinctrl {
              /* your modifications go here */
      };

    All device pin configurations should be placed in child nodes of the
    'pinctrl' node, as shown in this example:

      /* You can put this in places like a board-pinctrl.dtsi file in
       * your board directory, or a devicetree overlay in your application.
       */
      &pinctrl {
        /* configuration for uart0 device, default state */
        uart0_default: uart0_default {
          /* group 1 ('group1' name is arbitrary) */
          group1 {
            /* configure P0.1 as UART_TX and P0.2 as UART_RTS */
            psels = <NRF_PSEL(UART_TX, 0, 1)>, <NRF_PSEL(UART_RTS, 0, 2)>;
          };
          /* group 2 */
          group2 {
            /* configure P0.3 as UART_RX and P0.4 as UART_CTS */
            psels = <NRF_PSEL(UART_RX, 0, 3)>, <NRF_PSEL(UART_CTS, 0, 4)>;
            /* both P0.3 and P0.4 are configured with pull-up */
            bias-pull-up;
          };
        };
      };

    The 'uart0_default' child node encodes the pin configurations for a
    particular state of a device; in this case, the default (that is, active)
    state. You would specify the low-power configuration for the same device
    in a separate child node.

    As shown, pin configurations are organized in groups within each child node.
    Each group can specify a list of pin function selections in the 'psels'
    property. The NRF_PSEL macro is used to specify a pin function selection.
    If a pin needs to be explicitly disconnected, there is also the
    NRF_PSEL_DISCONNECTED macro.
    Available pin functions can be found in the
    include/zephyr/dt-bindings/pinctrl/nrf-pinctrl.h header file.

    A group can also specify shared pin properties common to all the specified
    pins, such as the 'bias-pull-up' property in group 2. Here is a list of
    supported standard pin properties:

    - bias-disable: Disable pull-up/down (default behavior, not required).
    - bias-pull-up: Enable pull-up resistor.
    - bias-pull-down: Enable pull-down resistor.
    - low-power-enable: Configure pin as an input with input buffer
      disconnected.

    Note that bias options are mutually exclusive.

    To link this pin configuration with a device, use a pinctrl-N property
    for some number N, like this example you could place in your board's DTS
    file:

       #include "board-pinctrl.dtsi"

       &uart0 {
             pinctrl-0 = <&uart0_default>;
             pinctrl-names = "default";
       };

compatible: "nordic,nrf-pinctrl"

include:
    - name: base.yaml
    - name: pincfg-node-group.yaml
      child-binding:
        child-binding:
          property-allowlist:
            - bias-disable
            - bias-pull-down
            - bias-pull-up
            - low-power-enable

child-binding:
  description: |
    nRF pin controller pin configuration state nodes.
  child-binding:
    description: |
      nRF pin controller pin configuration group.
    properties:
      psels:
        required: true
        type: array
        description: |
          An array of pins sharing the same group properties. The pins should
          be defined using the NRF_PSEL utility macro that encodes the port,
          pin and function. NRF_PSEL_DISCONNECTED is also available to explicitly
          disconnect a pin.

      nordic,drive-mode:
        type: int
        default: 0
        description: |
          Pin output drive mode. Available drive modes are pre-defined in
          nrf-pinctrl.h. Note that extra modes may not be available on certain
          devices. Defaults to standard mode for 0 and 1 (NRF_DRIVE_S0S1), the
          SoC default, except for the "nordic,nrf-twi" and "nordic,nrf-twim"
          nodes where NRF_DRIVE_S0S1 is always overridden with NRF_DRIVE_S0D1
          (standard '0', disconnect '1').

      nordic,invert:
        type: boolean
        description: |
          Invert pin polarity (set the active state to low).
          Only valid for PWM channel output pins.
