# 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) sate.

    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:
    - name: base.yaml
    - name: pincfg-node.yaml
      child-binding:
        property-allowlist:
          - bias-high-impedance
          - bias-pull-pin-default
          - bias-pull-up
          - bias-pull-down
          - input-enable

child-binding:
    description: |
        This binding gives a base representation of the ITE IT8XXX2 pins configration.
    properties:
        pinmuxs:
          required: true
          type: phandle-array
          description: |
              ITE IT8XXX2 pin's configuration (pinctrl node, pin and function).

        gpio-voltage:
          required: false
          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
          default: "3v3"
          enum:
          - "3v3"
          - "1v8"
