From 2ff444d07d62174e24b7bf0c16cac6191cacaed2 Mon Sep 17 00:00:00 2001 From: Svyatoslav Ryhel Date: Fri, 9 Aug 2024 21:10:31 +0300 Subject: [PATCH] drivers: tegra_gpio: add early SPL functions 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 --- drivers/gpio/tegra_gpio.c | 50 +++++++++++++++++++++++++++++++++++++++ include/spl_gpio.h | 19 +++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/drivers/gpio/tegra_gpio.c b/drivers/gpio/tegra_gpio.c index 0c40d36c41..8220d2921e 100644 --- a/drivers/gpio/tegra_gpio.c +++ b/drivers/gpio/tegra_gpio.c @@ -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 * diff --git a/include/spl_gpio.h b/include/spl_gpio.h index e39ac3f624..b33261a648 100644 --- a/include/spl_gpio.h +++ b/include/spl_gpio.h @@ -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 */ -- 2.39.5