# Copyright (c) 2020, Linaro Limited
# Copyright (c) 2021-2022, Gerson Fernando Budke
# SPDX-License-Identifier: Apache-2.0

description: |
  Atmel SAM0 Pinctrl container node

  The Atmel SAM0 pin controller is a singleton node responsible for controlling
  pin function selection and pin properties. For example, you can use this node
  to route SERCOM0 as UART were RX to pin PAD1 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.
      */

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

    &pinctrl {
      /* configuration for the usart0 "default" state */
      sercom0_uart_default: sercom0_uart_default {
        /* group 1 */
        group1 {
          /* configure PA6 as USART0 TX and PA8 as USART0 CTS */
          pinmux = <PA5D_SERCOM0_PAD1>, <PA6D_SERCOM0_PAD2>;
        };
        /* group 2 */
        group2 {
          /* configure PA5 as USART0 RX and PA7 as USART0 RTS */
          pinmux = <PA4D_SERCOM0_PAD0>, <PA7D_SERCOM0_PAD3>;
          /* both PA5 and PA7 have pull-up enabled */
          bias-pull-up;
        };
      };
    };

  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.

  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:

  - bias-pull-up: Enable pull-up resistor.
  - bias-pull-down: Enable pull-down resistor.
  - drive-strength: Increase sink current.
  - input-enable: Enable input on pin.
  - output-enable: Enable output on a pin without actively driving it.

  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-names = "default";
    };

compatible: "atmel,sam0-pinctrl"

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

properties:
    reg:
      required: true

properties:
    "#address-cells":
      required: true
      const: 1
    "#size-cells":
      required: true
      const: 1

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:
      pinmux:
        required: true
        type: array
        description: |
          An array of pins sharing the same group properties. The pins should
          be defined using pre-defined macros or, alternatively, using the
          SAM_PINMUX utility macros depending on the pinmux model used by the
          SoC series.
      drive-strength:
        enum:
          - 0
          - 1
        default: 0
        description: |
          The drive strength controls the output driver strength of an I/O pin
          configured as an output.
            0: Pin drive strength is set to normal drive strength.
            1: Pin drive strength is set to stronger drive strength.
