]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: tegra_gpio: add early SPL functions
authorSvyatoslav Ryhel <clamor95@gmail.com>
Fri, 9 Aug 2024 18:10:31 +0000 (21:10 +0300)
committerSvyatoslav Ryhel <clamor95@gmail.com>
Sun, 13 Oct 2024 14:20:26 +0000 (17:20 +0300)
In some cases access to GPIOs is needed so early that DM
is not ready even nearly. These functions are exactly for
this case.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/gpio/tegra_gpio.c
include/spl_gpio.h

index 0c40d36c41e205073c02b95bf7abd0d511092517..8220d2921e029b843a087bac86004cd8dc29689b 100644 (file)
@@ -257,6 +257,56 @@ static const struct dm_gpio_ops gpio_tegra_ops = {
        .xlate                  = tegra_gpio_xlate,
 };
 
+/*
+ * SPL GPIO functions.
+ */
+int spl_gpio_output(void *regs, uint gpio, int value)
+{
+       /* Configure GPIO output value. */
+       set_level(gpio, value);
+
+       /* Configure GPIO direction as output. */
+       set_direction(gpio, DIRECTION_OUTPUT);
+
+       /* Enable the pin as a GPIO */
+       set_config(gpio, 1);
+
+       return 0;
+}
+
+int spl_gpio_input(void *regs, uint gpio)
+{
+       /* Configure GPIO direction as input. */
+       set_direction(gpio, DIRECTION_INPUT);
+
+       /* Enable the pin as a GPIO */
+       set_config(gpio, 1);
+
+       return 0;
+}
+
+int spl_gpio_get_value(void *regs, uint gpio)
+{
+       struct gpio_ctlr *ctlr = (struct gpio_ctlr *)NV_PA_GPIO_BASE;
+       struct gpio_ctlr_bank *bank = &ctlr->gpio_bank[GPIO_BANK(gpio)];
+       int val;
+
+       if (get_direction(gpio) == DIRECTION_INPUT)
+               val = readl(&bank->gpio_in[GPIO_PORT(gpio)]);
+       else
+               val = readl(&bank->gpio_out[GPIO_PORT(gpio)]);
+
+       return (val >> GPIO_BIT(gpio)) & 1;
+}
+
+int spl_gpio_set_value(void *regs, uint gpio, int value)
+{
+       /* Configure GPIO output value. */
+       set_level(gpio, value);
+
+       return 0;
+}
+
 /**
  * Returns the name of a GPIO port
  *
index e39ac3f624ba0e81507f36e5096b5a9ed450c4bb..b33261a6485ad9813cb4533d9208a509e4cdc2d5 100644 (file)
@@ -59,4 +59,23 @@ int spl_gpio_output(void *regs, uint gpio, int value);
  */
 int spl_gpio_input(void *regs, uint gpio);
 
+/**
+ * spl_gpio_get_value() - Get GPIO value
+ *
+ * @regs: Pointer to GPIO registers
+ * @gpio: GPIO to adjust (SoC-specific)
+ * Return: return GPIO value if OK, -ve on error
+ */
+int spl_gpio_get_value(void *regs, uint gpio);
+
+/**
+ * spl_gpio_set_value() - Set value on GPIO
+ *
+ * @regs: Pointer to GPIO registers
+ * @gpio: GPIO to adjust (SoC-specific)
+ * @value: 0 to set the output low, 1 to set it high
+ * Return: return 0 if OK, -ve on error
+ */
+int spl_gpio_set_value(void *regs, uint gpio, int value);
+
 #endif /* __SPL_GPIO_H */