# Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
# SPDX-License-Identifier: Apache-2.0

description: |
    Espressif's pin controller is in charge of controlling pin configurations, pin
    functionalities and pin properties as defined by pin states. In its turn, pin
    states are composed by groups of pre-defined pin muxing definitions and user
    provided pin properties.

    Each Zephyr-based application has its own set of pin muxing/pin configuration
    requirements. The next steps use ESP-WROVER-KIT's I2C_0 to illustrate how one
    could change a node's pin state properties. Though based on a particular board,
    the same steps can be tweaked to address specifics of any other target board.

    Suppose an application running on top of the ESP-WROVER-KIT board, for some
    reason it needs I2C_0's SDA signal to be routed to GPIO_33. When looking at
    that board's original device tree source file (i.e., 'esp_wrover_kit.dts'),
    you'll notice that the I2C_0 node is already assigned to a pre-defined state.
    Below is highlighted the information that most interests us on that file


        #include "esp_wrover_kit-pinctrl.dtsi"

        &i2c0 {
                ...
                pinctrl-0 = <&i2c0_default>;
                pinctrl-names = "default";
        };


    From the above excerpt, the pincrl-0 property is assigned the 'i2c0_default'
    state value. This and other pin states of the board are defined on another file
    (in this case, 'esp_wrover_kit-pinctrl.dtsi') on the same folder of the DTS file.
    Check below the excerpt describing I2C_0's default state on that file


        i2c0_default: i2c0_default {
                group1 {
                        pinmux = <I2C0_SDA_GPIO21>,
                                 <I2C0_SCL_GPIO22>;
                        bias-pull-up;
                        drive-open-drain;
                        output-high;
                };
        };


    Only the 'pinmux' property above is actually required, other properties can
    be chosen if meaningful for the target application and, of course, supported
    by your target hardware. For example, some custom board may have an external
    pull-up resistor soldered to GPIO_21's pin pad, in which case, 'bias-pull-up'
    could be no longer required.

    Back to our fictional application, the previous I2C_0 state definition does not
    meet our expectations as we would like to route I2C_0's SDA signal to GPIO_33
    instead of to GPIO_21. To achieve it, we need to update the 'pinmux' property
    accordingly.

    Note that replacing 'I2C0_SDA_GPIO21' by 'I2C0_SDA_GPIO33' is very tempting and
    may even work, however, unless you have checked the hardware documentation first,
    it is not recommended. That's because there are no guarantees that a particular
    IO pin has the capability to route any specific signal.

    The recommendation is to check the pinmux macros definitions available for the
    target SoC in the following URL


    https://github.com/zephyrproject-rtos/zephyr/tree/main/include/zephyr/dt-bindings/pinctrl


    The ESP-WROVER-KIT board is based on the ESP32 SoC, in that case, we search
    through the file 'esp32-pinctrl.h' in the above URL. Luckily for us, there is
    one definition on that file that corresponds to our needs


        #define I2C0_SDA_GPIO33 \
                ESP32_PINMUX(33, ESP_I2CEXT0_SDA_IN, ESP_I2CEXT0_SDA_OUT)


    Now, we go back to edit 'esp_wrover_kit-pinctrl.dtsi' and create a new pin state
    on that file (or replace/update the one already defined) using the pinmux macro
    definition above, yielding


        i2c0_default: i2c0_default {
                group1 {
                        pinmux = <I2C0_SDA_GPIO33>,
                                 <I2C0_SCL_GPIO22>;
                        bias-pull-up;
                        drive-open-drain;
                        output-high;
                };
        };


    With proper modifications, the same steps above apply when using different
    combinations of boards, SoCs, peripherals and peripheral pins.

    Note: Not all pins are available for a given peripheral, it depends if that
          pin supports a set of properties required by the target peripheral.

          When defining a state, the pin muxing information is constrained to
          the definitions at 'hal_espressif', however, pin properties (like
          bias-push-pull, drive-open-drain, etc) can be freely chosen, given the
          property is meaningful to the peripheral signal and that it is also
          available in the target GPIO.

          Another thing worth noting is that all pin properties should be grouped.
          All pins sharing common properties go under a common group (in the above
          example, all pins are in 'group1'). Other peripherals can have more than
          one group.

compatible: "espressif,esp32-pinctrl"

include: base.yaml

child-binding:
  description: |
    Espressif pin controller pin configuration state nodes.
  child-binding:
    description:
      Espressif pin controller pin configuration group.

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

    properties:
      pinmux:
        required: true
        type: array
        description: |
          Each array element represents pin muxing information of an individual
          pin. The array elements are pre-declared macros taken from Espressif's
          HAL.
