пт, 19 вер. 2025 р. о 13:11 Lukasz Majewski <lu...@nabladev.com> пише:
>
> In some Tegra SoC (like e.g. T30) there is a possibility that one will
> configure at early boot state a pin as GPIO (to use it for e.g. carrier
> board detection). However, afterwards (i.e. in Linux) the same pin will
> be used as the special function one.
>
> Current Tegra gpio driver doesn't allow this, so callback for set_flags()
> has been defined to properly setup the GPIO when required.

Please write the commit message in the imperative mood.

> For now following flags are supported:
> - GPIOD_IS_AF (i.e. "alternate function").
> - GPIOD_IS_IN
> - GPIOD_IS_OUT
>
> In long term the tegra_gpio_set_flags() is going to replace
> direction_{input|output} callbacks.
>

It is not a book chapter, describe what the commit does briefly.

> Signed-off-by: Lukasz Majewski <lu...@nabladev.com>
> ---
>  drivers/gpio/tegra_gpio.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/drivers/gpio/tegra_gpio.c b/drivers/gpio/tegra_gpio.c
> index 3d1e18854f2..1e8bd051875 100644
> --- a/drivers/gpio/tegra_gpio.c
> +++ b/drivers/gpio/tegra_gpio.c
> @@ -258,6 +258,29 @@ static int tegra_gpio_rfree(struct udevice *dev, 
> unsigned int offset)
>         return 0;
>  }
>
> +static int tegra_gpio_set_flags(struct udevice *dev, unsigned int offset,
> +                               ulong flags)
> +{
> +       struct tegra_port_info *state = dev_get_priv(dev);
> +       int gpio = state->base_gpio + offset;
> +
> +       debug("gpio_set_flags: pin = %d (port %d:bit %d), flag = %d\n",
> +             gpio, GPIO_FULLPORT(gpio), GPIO_BIT(gpio), flags);
> +

Have you even built this code yourself? "flags" is of type ulong, not int

> +       if (flags & GPIOD_IS_AF) {
> +               set_config(gpio, CFG_SFIO);
> +               return 0;
> +       } else if (flags & GPIOD_IS_IN) {
> +               return tegra_gpio_direction_input(dev, offset);
> +       } else if (flags & GPIOD_IS_OUT) {
> +               bool value = flags & GPIOD_IS_OUT_ACTIVE;
> +
> +               return tegra_gpio_direction_output(dev, offset, value);
> +       }
> +
> +       return -EINVAL;
> +}
> +
>  static const struct dm_gpio_ops gpio_tegra_ops = {
>         .direction_input        = tegra_gpio_direction_input,
>         .direction_output       = tegra_gpio_direction_output,
> @@ -266,6 +289,7 @@ static const struct dm_gpio_ops gpio_tegra_ops = {
>         .get_function           = tegra_gpio_get_function,
>         .xlate                  = tegra_gpio_xlate,
>         .rfree                  = tegra_gpio_rfree,
> +       .set_flags              = tegra_gpio_set_flags,

If you are already touching this anyway, then touch it properly. Since
set_flags op is meant to remove direction ops, then remove latter too.

>  };
>
>  /*
> --
> 2.39.5
>

This commit causes regression on LG P990 board, backlight is located
on gpio i2c line and with this patch gpio i2c refuses to work

(bootloader) Core:  114 devices, 27 uclasses, devicetree: separate
(bootloader) MMC:   sdhci@c8000400: 1, sdhci@c8000600: 0
(bootloader) Loading Environment from MMC... Reading from MMC(0)... ***
(bootloader) Warning - bad CRC, using default environment
(bootloader)
(bootloader) Can't get i2c-5 gpios! Error: -22
(bootloader) Can't get i2c-5 gpios! Error: -16
(bootloader) In:    serial,usbkbd,button-kbd
(bootloader) Out:   serial,vidconsole
(bootloader) Err:   serial,vidconsole
(bootloader) Net:   No ethernet found.
(bootloader)
(bootloader) Autoboot in 0 seconds

Reply via email to