# Copyright (c) 2022 ITE Corporation. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

description: |
    The ITE IT8XXX2 pin controller is a node responsible for controlling
    pin function selection and pin properties. For example, you can
    use this node to route UART1 RX and TX setting the alternate
    function 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 pins and functions for the SoC used by the board */
      #include <dt-bindings/pinctrl/it8xxx2-pinctrl.h>

      &pinctrl {
        /* configuration for I2C0 default state */
        i2c0_clk_pb3_default: i2c0_clk_pb3_default {
                pinmuxs = <&pinctrlb 3 IT8XXX2_ALT_FUNC_1>;
                gpio-voltage = "1p8";
        };
        i2c0_data_pb4_default: i2c0_data_pb4_default {
                pinmuxs = <&pinctrlb 4 IT8XXX2_ALT_FUNC_1>;
                gpio-voltage = "1v8";
        };
        /* configuration for UART0 default state */
        uart1_rx_pb0_default: uart1_rx_pb0_default {
                pinmuxs = <&pinctrlb 0 IT8XXX2_ALT_FUNC_3>;
                bias-pull-up;
        };
        uart1_tx_pb1_default: uart1_tx_pb1_default {
                pinmuxs = <&pinctrlb 1 IT8XXX2_ALT_FUNC_3>;
        };
      };

    The 'uart1_rx_pb0_default' child node encodes the pin configurations
    for a particular state of a device; in this case, the default
    (that is, active) state.

    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"

      &uart0 {
        pinctrl-0 = <&uart1_rx_pb0_default &uart1_tx_pb1_default>;
        pinctrl-1 = <&uart1_rx_pb0_sleep &uart1_tx_pb1_sleep>;
        pinctrl-names = "default", "sleep";
      };

compatible: "ite,it8xxx2-pinctrl"

include: base.yaml

child-binding:
  description: |
      This binding gives a base representation of the ITE IT8XXX2 pins configuration.

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

  properties:
    pinmuxs:
      required: true
      type: phandle-array
      description: |
          ITE IT8XXX2 pin's configuration (pinctrl node, pin and function).

    gpio-voltage:
      type: string
      description: |
          Pin input voltage selection 3.3V or 1.8V. All gpio pins support 3.3V.
          This property only needs to be configured if the board specifies a
          pin as 1.8V. So the default is 3.3V.
          kSI[7:0] and KSO[15:0] pins only support 3.3V.
      default: "3v3"
      enum:
        - "3v3"
        - "1v8"
