# Copyright (c) 2021 Teslabs Engineering S.L.
# Copyright (c) 2021 Yonatan Schachter
# SPDX-License-Identifier: Apache-2.0

description: |
    The RPi Pico pin controller is a node responsible for controlling
    pin function selection and pin properties, such as routing a UART0 Rx
    to pin 1 and enabling the pullup resistor on that 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.
       */

      /* include pre-defined combinations for the SoC variant used by the board */
      #include <dt-bindings/pinctrl/rpi-pico-rp2040-pinctrl.h>

      &pinctrl {
        /* configuration for the usart0 "default" state */
        uart0_default: uart0_default {
          /* group 1 */
          group1 {
            /* configure P0 as UART0 TX */
            pinmux = <UART0_TX_P0>;
          };
          /* group 2 */
          group2 {
            /* configure P1 as UART0 RX */
            pinmux = <UART0_RX_P1>;
            /* enable input on pin 1 */
            input-enable;
          };
        };
      };

    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.

    As shown, pin configurations are organized in groups within each child node.
    Each group can specify a list of pin function selections in the 'pinmux'
    property.

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

    - bias-disable: Disable pull-up/down (default, not required).
    - bias-pull-up: Enable pull-up resistor.
    - bias-pull-down: Enable pull-down resistor.
    - input-enable: Enable input from the pin.
    - input-schmitt-enable: Enable input hysteresys.
    - drive-strength: Set the drive strength of the pin, in milliamps. Possible
      values are: 2, 4, 8, 12 (default: 4mA)
    - slew-rate: If set to 0, slew rate is set to slow. If set to 1, it is set
      to fast.

    To link pin configurations 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-1 = <&uart0_sleep>;
             pinctrl-names = "default", "sleep";
       };

compatible: "raspberrypi,pico-pinctrl"

include:
    - name: base.yaml
    - name: pincfg-node-group.yaml
      child-binding:
        child-binding:
          property-allowlist:
            - bias-disable
            - bias-pull-down
            - bias-pull-up
            - input-enable
            - input-schmitt-enable
            - drive-strength
            - slew-rate

child-binding:
  description: |
    Definitions for a pinctrl state.
  child-binding:
    properties:
      pinmux:
        required: true
        type: array
        description: |
          An array of pins sharing the same group properties. Each
          element of the array is an integer constructed from the
          pin number and the alternative function of the pin.
      drive-strength:
        enum:
          - 2
          - 4
          - 8
          - 12
        default: 4
        description: |
          The drive strength of a pin, in mA. The default value is 4mA, as this
          is the power on reset value.
      slew-rate:
        enum:
          - 0
          - 1
        default: 0
        description: |
          The slew rate of a pin. 0 corresponds to slow, and 1 corresponds to fast.
          The default value is 0 (slow), as this is the power on reset value.
