diff options
Diffstat (limited to 'src/soc/nvidia')
-rw-r--r-- | src/soc/nvidia/tegra/gpio.c | 68 | ||||
-rw-r--r-- | src/soc/nvidia/tegra/gpio.h | 23 |
2 files changed, 17 insertions, 74 deletions
diff --git a/src/soc/nvidia/tegra/gpio.c b/src/soc/nvidia/tegra/gpio.c index b10cded12d..17b90aa1d9 100644 --- a/src/soc/nvidia/tegra/gpio.c +++ b/src/soc/nvidia/tegra/gpio.c @@ -23,6 +23,7 @@ #include <stddef.h> #include <stdint.h> #include <delay.h> +#include <gpiolib.h> #include "gpio.h" #include "pinmux.h" @@ -175,58 +176,6 @@ int gpio_get_in_value(gpio_t gpio) return (port & (1 << bit)) != 0; } -int gpio_get_in_tristate_values(gpio_t gpio[], int num_gpio, int value[]) -{ - /* - * GPIOs which are tied to stronger external pull up or pull down - * will stay there regardless of the internal pull up or pull - * down setting. - * - * GPIOs which are floating will go to whatever level they're - * internally pulled to. - */ - - int temp; - int index; - - /* Enable internal pull up */ - for (index = 0; index < num_gpio; ++index) - gpio_input_pullup(gpio[index]); - - /* Wait until signals become stable */ - udelay(10); - - /* Get gpio values at internal pull up */ - for (index = 0; index < num_gpio; ++index) - value[index] = gpio_get_in_value(gpio[index]); - - /* Enable internal pull down */ - for (index = 0; index < num_gpio; ++index) - gpio_input_pulldown(gpio[index]); - - /* Wait until signals become stable */ - udelay(10); - - /* - * Get gpio values at internal pull down. - * Compare with gpio pull up value and then - * determine a gpio final value/state: - * 0: pull down - * 1: pull up - * 2: floating - */ - for (index = 0; index < num_gpio; ++index) { - temp = gpio_get_in_value(gpio[index]); - value[index] = ((value[index] ^ temp) << 1) | temp; - } - - /* Disable pull up / pull down to conserve power */ - for (index = 0; index < num_gpio; ++index) - gpio_input(gpio[index]); - - return 0; -} - int gpio_get_int_status(gpio_t gpio) { int bit = gpio % GPIO_GPIOS_PER_PORT; @@ -279,3 +228,18 @@ void gpio_set_int_clear(gpio_t gpio) offsetof(struct gpio_bank, int_clear), 1 << bit, 1 << bit); } + +void gpio_input_pulldown(gpio_t gpio) +{ + __gpio_input(gpio, PINMUX_PULL_DOWN); +} + +void gpio_input_pullup(gpio_t gpio) +{ + __gpio_input(gpio, PINMUX_PULL_UP); +} + +void gpio_input(gpio_t gpio) +{ + __gpio_input(gpio, PINMUX_PULL_NONE); +} diff --git a/src/soc/nvidia/tegra/gpio.h b/src/soc/nvidia/tegra/gpio.h index 5f6833af79..43f898958e 100644 --- a/src/soc/nvidia/tegra/gpio.h +++ b/src/soc/nvidia/tegra/gpio.h @@ -21,12 +21,10 @@ #define __SOC_NVIDIA_TEGRA_GPIO_H__ #include <stdint.h> +#include <gpiolib.h> #include "pinmux.h" -/* Wrapper type for GPIOs. Always use GPIO() macro to generate. */ -typedef u32 gpio_t; - #define GPIO_PINMUX_SHIFT 16 #define GPIO(name) ((gpio_t)(GPIO_##name##_INDEX | \ (PINMUX_GPIO_##name << GPIO_PINMUX_SHIFT))) @@ -46,21 +44,6 @@ static inline void gpio_output_open_drain(gpio_t gpio, int value) __gpio_output(gpio, value, PINMUX_OPEN_DRAIN); } -static inline void gpio_input(gpio_t gpio) -{ - __gpio_input(gpio, PINMUX_PULL_NONE); -} - -static inline void gpio_input_pulldown(gpio_t gpio) -{ - __gpio_input(gpio, PINMUX_PULL_DOWN); -} - -static inline void gpio_input_pullup(gpio_t gpio) -{ - __gpio_input(gpio, PINMUX_PULL_UP); -} - /* Functions to modify specific GPIO control values. */ enum gpio_mode { @@ -77,12 +60,8 @@ int gpio_get_lock(gpio_t gpio); void gpio_set_out_enable(gpio_t gpio, int enable); int gpio_get_out_enable(gpio_t gpio); -void gpio_set_out_value(gpio_t gpio, int value); int gpio_get_out_value(gpio_t gpio); -int gpio_get_in_value(gpio_t gpio); -int gpio_get_in_tristate_values(gpio_t gpio[], int num_gpio, int value[]); - int gpio_get_int_status(gpio_t gpio); void gpio_set_int_enable(gpio_t gpio, int enable); |