# Copyright (c) 2023 Antmicro <www.antmicro.com>
# SPDX-License-Identifier: Apache-2.0

description: |
    The Ambiq Apollo4 pin controller is a node responsible for controlling
    pin function selection and pin properties, such as routing a UART0 TX
    to pin 60 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/ambiq-apollo4-pinctrl.h>

      &pinctrl {
        uart0_default: uart0_default {
          group1 {
            pinmux = <UART0TX_P60>;
          };
          group2 {
            pinmux = <UART0RX_P47>;
            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.

compatible: "ambiq,apollo4-pinctrl"

include: base.yaml

child-binding:
  description: |
    Definitions for a pinctrl state.
  child-binding:

    include:
      - name: pincfg-node.yaml
        property-allowlist:
          - input-enable
          - drive-push-pull
          - drive-open-drain
          - bias-high-impedance
          - bias-pull-up
          - bias-pull-down

    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:
        type: string
        enum:
          - "0.1"
          - "0.5"
          - "0.75"
          - "1.0"
        default: "0.1"
        description: |
          The drive strength of a pin, relative to full-driver strength.
          The default value is 0.1, which is the reset value.
      slew-rate:
        type: string
        enum:
          - "slow"
          - "fast"
        default: "slow"
        description: |
          Select slew rate for a pin. The default is slow, which is the reset value.
      ambiq,pull-up-ohms:
        type: int
        enum:
          - 1500
          - 6000
          - 12000
          - 24000
          - 50000
          - 100000
        default: 1500
        description: |
          The pullup resistor value. The default value is 1500 ohms.
      ambiq,iom-nce-module:
        type: int
        default: 0
        description: |
          IOM nCE module select, selects the SPI channel (CE) number (0-42).
            0,     IOM0CE0 : IOM 0 NCE 0 module
            1,     IOM0CE1 : IOM 0 NCE 1 module
            2,     IOM0CE2 : IOM 0 NCE 2 module
            3,     IOM0CE3 : IOM 0 NCE 3 module
            4,     IOM1CE0 : IOM 1 NCE 0 module
            5,     IOM1CE1 : IOM 1 NCE 1 module
            6,     IOM1CE2 : IOM 1 NCE 2 module
            7,     IOM1CE3 : IOM 1 NCE 3 module
            8,     IOM2CE0 : IOM 2 NCE 0 module
            9,     IOM2CE1 : IOM 2 NCE 1 module
            10,    IOM2CE2 : IOM 2 NCE 2 module
            11,    IOM2CE3 : IOM 2 NCE 3 module
            12,    IOM3CE0 : IOM 3 NCE 0 module
            13,    IOM3CE1 : IOM 3 NCE 1 module
            14,    IOM3CE2 : IOM 3 NCE 2 module
            15,    IOM3CE3 : IOM 3 NCE 3 module
            16,    IOM4CE0 : IOM 4 NCE 0 module
            17,    IOM4CE1 : IOM 4 NCE 1 module
            18,    IOM4CE2 : IOM 4 NCE 2 module
            19,    IOM4CE3 : IOM 4 NCE 3 module
            20,    IOM5CE0 : IOM 5 NCE 0 module
            21,    IOM5CE1 : IOM 5 NCE 1 module
            22,    IOM5CE2 : IOM 5 NCE 2 module
            23,    IOM5CE3 : IOM 5 NCE 3 module
            24,    IOM6CE0 : IOM 6 NCE 0 module
            25,    IOM6CE1 : IOM 6 NCE 1 module
            26,    IOM6CE2 : IOM 6 NCE 2 module
            27,    IOM6CE3 : IOM 6 NCE 3 module
            28,    IOM7CE0 : IOM 7 NCE 0 module
            29,    IOM7CE1 : IOM 7 NCE 1 module
            30,    IOM7CE2 : IOM 7 NCE 2 module
            31,    IOM7CE3 : IOM 7 NCE 3 module
            32,    MSPI0CEN0 : MSPI 0 NCE 0 module
            33,    MSPI0CEN1 : MSPI 0 NCE 1 module
            34,    MSPI1CEN0 : MSPI 1 NCE 0 module
            35,    MSPI1CEN1 : MSPI 1 NCE 1 module
            36,    MSPI2CEN0 : MSPI 2 NCE 0 module
            37,    MSPI2CEN1 : MSPI 2 NCE 1 module
            38,    DC_DPI_DE : DC DPI DE module
            39,    DISP_CONT_CSX : DISP CONT CSX module
            40,    DC_SPI_CS_N : DC SPI CS_N module
            41,    DC_QSPI_CS_N : DC QSPI CS_N module
            42,    DC_RESX : DC module RESX
          If the pin is not a CE, this descriptor will be ignored.
          Default value 0, which is the reset value.
      ambiq,iom-mspi:
        type: int
        default: 0
        description: |
          Indicates the module which uses specific CE pin, 1 if CE is IOM, 0 if MSPI.
          Default value 0, which is the reset value.
          If the pin is not a CE, this descriptor will be ignored.
      ambiq,iom-num:
        type: int
        default: 0
        description: |
          Indicates the instance which uses specific CE pin.
          IOM number (0-7) or MSPI (0-2).
          Default value 0, which is the reset value.
          If the pin is not a CE, this descriptor will be ignored.
      ambiq,interrupt-direction:
        type: int
        default: 0
        description: |
          Indicates the pininterrupt direction.
          Default value 0, which is the reset value.
