# Copyright (c) 2022 Renesas Electronics Corporation
# SPDX-License-Identifier: Apache-2.0

description: |
    The SmartBond pin controller is a singleton node responsible for controlling
    pin function selection and pin properties, such as routing a UART RX to pin
    P1.8 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 definitions and utility macros for the SoC used by the board */
     #include <dt-bindings/pinctrl/smartbond-pinctrl.h>

      &pinctrl {
        /* configuration for uart device, default state */
        uart_default: uart_default {
          /* group 1 */
          group1 {
            /* route UART TX to P0.9 */
            pinmux = <SMARTBOND_PINMUX(UART_TX, 0, 9)>;
          };
          /* group 2 */
          group2 {
            /* route UART RX to P0.8 and enable pull-up */
            pinmux = <SMARTBOND_PINMUX(UART_RX, 0, 8)>;
            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.

    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. Note that 'pinmux' property is an array so you can configure multiple
    pins at once there. The SMARTBOND_PINMUX macro is used to create pinmux value.

    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-pull-up: Enable pull-up resistor.
    - bias-pull-down: Enable pull-down resistor.

    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"

       &uart {
             pinctrl-0 = <&uart_default>;
             pinctrl-names = "default";
       };

compatible: "renesas,smartbond-pinctrl"

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

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. The pins should
          be defined using the SMARTBOND_PINMUX utility macro that encodes the port,
          pin and function.
