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

description: |
    The GD32 pin controller (AFIO model) is a singleton node responsible for
    controlling pin function selection and pin properties. For example, you can
    use this node to route USART0 RX to pin PA10 and enable the pull-up resistor
    on the pin. Remapping is also supported.

    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/gd32f403z(k-i-g-e-c-b)xx-pinctrl.h>

      &pinctrl {
        /* configuration for the usart0 "default" state */
        usart0_default: usart0_default {
          /* group 1 */
          group1 {
            /* configure PA9 as USART0 TX and PA11 as USART0 CTS (no remap) */
            pinmux = <USART0_TX_PA9_NORMP>, <USART0_CTS_PA11_NORMP>;
          };
          /* group 2 */
          group2 {
            /* configure PA10 as USART0 RX and PA12 as USART0 RTS (no remap) */
            pinmux = <USART0_RX_PA10_NORMP>, <USART0_RTS_PA12_NORMP>;
            /* both PA10 and PA12 have pull-up enabled */
            bias-pull-up;
          };

        /* configuration for the usart0 "sleep" state */
        usart0_sleep: usart0_sleep {
          /* group 1 */
          group1 {
            /* configure PA9, PA10, PA11 and PA12 in analog mode */
            pinmux = <ANALOG_PA9>, <ANALOG_PA10>, <ANALOG_PA12>, <ANALOG_PA11>;
          };
        };

    The 'usart0_default' child node encodes the pin configurations for a
    particular state of a device; in this case, the default (that is, active)
    state. Similarly, 'usart0_sleep' child node encodes the pin configurations
    for the sleep state (used in device low power mode). Note that analog mode
    is used for low power states because it disconnects the pin pull-up/down
    resistor, schmitt trigger, and output buffer.

    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 'bias-pull-up' property in group 2. Here is a list of
    supported standard pin properties:

    - drive-push-pull: Push-pull drive mode (default, not required). Only
      applies for GPIO_IN mode.
    - drive-open-drain: Open-drain drive mode. Only applies for GPIO_IN mode.
    - bias-disable: Disable pull-up/down (default, not required). Only applies
      for GPIO_IN mode.
    - bias-pull-up: Enable pull-up resistor. Only applies for GPIO_IN mode.
    - bias-pull-down: Enable pull-down resistor. Only applies for GPIO_IN mode.
    - slew-rate: Set the maximum speed (and so the slew-rate) of the output
      signal (default: 2MHz). Only applies for ALTERNATE mode.

    Note that drive and bias options are mutually exclusive.

    Peripherals that are remappable will have their pre-defined macros suffixed
    with the remap option being selected, for example:

      - CAN0_RX_PA11_NORMP: No remap
      - CAN0_RX_PB8_PRMP: Partial remap
      - CAN0_RX_PD0_FRMP: Full remap

    It is important that **ALL** pinmux entries share the same remap. For
    example:

      &pinctrl {
        can0_default: can0_default {
          group1 {
            pinmux = <CAN0_RX_PD0_FRMP>, <CAN0_TX_PD1_FRMP>;
            /*                    ^^^^                ^^^^           */
            /* CAN0 pins are remapped choosing the full remap option */
          };
        };
      };

    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"

       &usart0 {
             pinctrl-0 = <&usart0_default>;
             pinctrl-1 = <&usart0_sleep>;
             pinctrl-names = "default", "sleep";
       };

compatible: "gd,gd32-pinctrl-afio"

include: gd,gd32-pinctrl-common.yaml

child-binding:
  description: |
    Each child node defines the configuration for a particular state.
  child-binding:
    description: |
      The grandchild nodes group pins that share the same pin configuration.
    properties:
      slew-rate:
        required: false
        type: string
        default: "max-speed-2mhz"
        enum:
          - "max-speed-10mhz"
          - "max-speed-2mhz"
          - "max-speed-50mhz"
          - "max-speed-highest"
        description: |
          Set the maximum speed of a pin. This setting effectively limits the
          slew rate of the output signal. Defaults to "max-speed-2mhz", the SoC
          default. The max-speed-highest option may not be available on all SoC
          variants. If selected and not available the 50 MHz maximum speed will
          be used instead. Note that usage of max-speed-highest may require
          enabling the I/O compensation cell (refer to the gd,gd32-afio binding
          for more details).
