# 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: base.yaml

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.

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

    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.
