# 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/hal_espressif/tree/zephyr/include/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:
    - name: base.yaml
    - name: pincfg-node-group.yaml
      child-binding:
        child-binding:
          property-allowlist:
            - bias-disable
            - bias-pull-down
            - bias-pull-up
            - drive-push-pull
            - drive-open-drain
            - input-enable
            - output-enable
            - output-high
            - output-low

child-binding:
  description: |
    Espressif pin controller pin configuration state nodes.
  child-binding:
    description:
      Espressif pin controller pin configuration group.
    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.
