diff options
author | Stefan Reinauer <reinauer@chromium.org> | 2013-05-15 14:54:07 -0700 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2013-07-10 20:08:29 +0200 |
commit | dc006c1db4fa3606d657c78cc87dc13d056e970d (patch) | |
tree | 7479203a6e08b0b465a104f64316e687885305f5 /src/cpu/samsung/exynos5250/gpio.c | |
parent | 08dc3571463d7226068d4a4c19d453859b148957 (diff) | |
download | coreboot-dc006c1db4fa3606d657c78cc87dc13d056e970d.tar.xz |
ARMv7: De-uboot-ify Exynos5250 GPIO code
The Exynos GPIO code has three different APIs that, unfortunately,
were widely used throughout the code base. This patch is cleaning
up the mess.
Change-Id: I09ccc7819fb892dbace9693c786dacc62f3f8eac
Signed-off-by: Stefan Reinauer <reinauer@google.com>
Signed-off-by: Gabe Black <gabeblack@chromium.org>
Reviewed-on: http://review.coreboot.org/3643
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/cpu/samsung/exynos5250/gpio.c')
-rw-r--r-- | src/cpu/samsung/exynos5250/gpio.c | 161 |
1 files changed, 27 insertions, 134 deletions
diff --git a/src/cpu/samsung/exynos5250/gpio.c b/src/cpu/samsung/exynos5250/gpio.c index 223f6a1eef..b8ebb0a4ed 100644 --- a/src/cpu/samsung/exynos5250/gpio.c +++ b/src/cpu/samsung/exynos5250/gpio.c @@ -55,7 +55,7 @@ static const struct gpio_info gpio_data[EXYNOS_GPIO_NUM_PARTS] = { /* This macro gets gpio pin offset from 0..7 */ #define GPIO_BIT(x) ((x) & 0x7) -static struct s5p_gpio_bank *gpio_get_bank(unsigned int gpio) +static struct gpio_bank *gpio_get_bank(unsigned int gpio) { const struct gpio_info *data; unsigned int upto; @@ -64,9 +64,9 @@ static struct s5p_gpio_bank *gpio_get_bank(unsigned int gpio) for (i = upto = 0, data = gpio_data; i < EXYNOS_GPIO_NUM_PARTS; i++, upto = data->max_gpio, data++) { if (gpio < data->max_gpio) { - struct s5p_gpio_bank *bank; + struct gpio_bank *bank; - bank = (struct s5p_gpio_bank *)data->reg_addr; + bank = (struct gpio_bank *)data->reg_addr; bank += (gpio - upto) / GPIO_PER_BANK; return bank; } @@ -76,118 +76,11 @@ static struct s5p_gpio_bank *gpio_get_bank(unsigned int gpio) return NULL; } -/* TODO: Deprecation this interface in favour of asm-generic/gpio.h */ -void s5p_gpio_cfg_pin(struct s5p_gpio_bank *bank, int gpio, int cfg) -{ - unsigned int value; - - value = readl(&bank->con); - value &= ~CON_MASK(gpio); - value |= CON_SFR(gpio, cfg); - writel(value, &bank->con); -} - -void s5p_gpio_direction_output(struct s5p_gpio_bank *bank, int gpio, int en) -{ - unsigned int value; - - s5p_gpio_cfg_pin(bank, gpio, EXYNOS_GPIO_OUTPUT); - - value = readl(&bank->dat); - value &= ~DAT_MASK(gpio); - if (en) - value |= DAT_SET(gpio); - writel(value, &bank->dat); -} - -void s5p_gpio_direction_input(struct s5p_gpio_bank *bank, int gpio) -{ - s5p_gpio_cfg_pin(bank, gpio, EXYNOS_GPIO_INPUT); -} - -void s5p_gpio_set_value(struct s5p_gpio_bank *bank, int gpio, int en) -{ - unsigned int value; - - value = readl(&bank->dat); - value &= ~DAT_MASK(gpio); - if (en) - value |= DAT_SET(gpio); - writel(value, &bank->dat); -} - -unsigned int s5p_gpio_get_value(struct s5p_gpio_bank *bank, int gpio) -{ - unsigned int value; - - value = readl(&bank->dat); - return !!(value & DAT_MASK(gpio)); -} - -void s5p_gpio_set_pull(struct s5p_gpio_bank *bank, int gpio, int mode) -{ - unsigned int value; - - value = readl(&bank->pull); - value &= ~PULL_MASK(gpio); - - switch (mode) { - case EXYNOS_GPIO_PULL_DOWN: - case EXYNOS_GPIO_PULL_UP: - value |= PULL_MODE(gpio, mode); - break; - default: - break; - } - - writel(value, &bank->pull); -} - -void s5p_gpio_set_drv(struct s5p_gpio_bank *bank, int gpio, int mode) -{ - unsigned int value; - - value = readl(&bank->drv); - value &= ~DRV_MASK(gpio); - - switch (mode) { - case EXYNOS_GPIO_DRV_1X: - case EXYNOS_GPIO_DRV_2X: - case EXYNOS_GPIO_DRV_3X: - case EXYNOS_GPIO_DRV_4X: - value |= DRV_SET(gpio, mode); - break; - default: - return; - } - - writel(value, &bank->drv); -} - -void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode) -{ - unsigned int value; - - value = readl(&bank->drv); - value &= ~RATE_MASK(gpio); - - switch (mode) { - case EXYNOS_GPIO_DRV_FAST: - case EXYNOS_GPIO_DRV_SLOW: - value |= RATE_SET(gpio); - break; - default: - return; - } - - writel(value, &bank->drv); -} - /* Common GPIO API - only available on Exynos5 */ void gpio_cfg_pin(int gpio, int cfg) { unsigned int value; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); value = readl(&bank->con); value &= ~CON_MASK(GPIO_BIT(gpio)); @@ -197,7 +90,7 @@ void gpio_cfg_pin(int gpio, int cfg) static int gpio_get_cfg(int gpio) { - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); int shift = GPIO_BIT(gpio) << 2; return (readl(&bank->con) & CON_MASK(GPIO_BIT(gpio))) >> shift; @@ -206,14 +99,14 @@ static int gpio_get_cfg(int gpio) void gpio_set_pull(int gpio, int mode) { unsigned int value; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); value = readl(&bank->pull); value &= ~PULL_MASK(GPIO_BIT(gpio)); switch (mode) { - case EXYNOS_GPIO_PULL_DOWN: - case EXYNOS_GPIO_PULL_UP: + case GPIO_PULL_DOWN: + case GPIO_PULL_UP: value |= PULL_MODE(GPIO_BIT(gpio), mode); break; default: @@ -226,16 +119,16 @@ void gpio_set_pull(int gpio, int mode) void gpio_set_drv(int gpio, int mode) { unsigned int value; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); value = readl(&bank->drv); value &= ~DRV_MASK(GPIO_BIT(gpio)); switch (mode) { - case EXYNOS_GPIO_DRV_1X: - case EXYNOS_GPIO_DRV_2X: - case EXYNOS_GPIO_DRV_3X: - case EXYNOS_GPIO_DRV_4X: + case GPIO_DRV_1X: + case GPIO_DRV_2X: + case GPIO_DRV_3X: + case GPIO_DRV_4X: value |= DRV_SET(GPIO_BIT(gpio), mode); break; default: @@ -248,14 +141,14 @@ void gpio_set_drv(int gpio, int mode) void gpio_set_rate(int gpio, int mode) { unsigned int value; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); value = readl(&bank->drv); value &= ~RATE_MASK(GPIO_BIT(gpio)); switch (mode) { - case EXYNOS_GPIO_DRV_FAST: - case EXYNOS_GPIO_DRV_SLOW: + case GPIO_DRV_FAST: + case GPIO_DRV_SLOW: value |= RATE_SET(GPIO_BIT(gpio)); break; default: @@ -267,7 +160,7 @@ void gpio_set_rate(int gpio, int mode) int gpio_direction_input(unsigned gpio) { - gpio_cfg_pin(gpio, EXYNOS_GPIO_INPUT); + gpio_cfg_pin(gpio, GPIO_INPUT); return 0; } @@ -275,9 +168,9 @@ int gpio_direction_input(unsigned gpio) int gpio_direction_output(unsigned gpio, int value) { unsigned int val; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); - gpio_cfg_pin(gpio, EXYNOS_GPIO_OUTPUT); + gpio_cfg_pin(gpio, GPIO_OUTPUT); val = readl(&bank->dat); val &= ~DAT_MASK(GPIO_BIT(gpio)); @@ -291,7 +184,7 @@ int gpio_direction_output(unsigned gpio, int value) int gpio_get_value(unsigned gpio) { unsigned int value; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); value = readl(&bank->dat); return !!(value & DAT_MASK(GPIO_BIT(gpio))); @@ -300,7 +193,7 @@ int gpio_get_value(unsigned gpio) int gpio_set_value(unsigned gpio, int value) { unsigned int val; - struct s5p_gpio_bank *bank = gpio_get_bank(gpio); + struct gpio_bank *bank = gpio_get_bank(gpio); val = readl(&bank->dat); val &= ~DAT_MASK(GPIO_BIT(gpio)); @@ -333,10 +226,10 @@ int gpio_read_mvl3(unsigned gpio) return -1; gpio_direction_input(gpio); - gpio_set_pull(gpio, EXYNOS_GPIO_PULL_UP); + gpio_set_pull(gpio, GPIO_PULL_UP); udelay(GPIO_DELAY_US); high = gpio_get_value(gpio); - gpio_set_pull(gpio, EXYNOS_GPIO_PULL_DOWN); + gpio_set_pull(gpio, GPIO_PULL_DOWN); udelay(GPIO_DELAY_US); low = gpio_get_value(gpio); @@ -355,7 +248,7 @@ int gpio_read_mvl3(unsigned gpio) * above test. */ if (value == LOGIC_1) - gpio_set_pull(gpio, EXYNOS_GPIO_PULL_UP); + gpio_set_pull(gpio, GPIO_PULL_UP); return value; } @@ -372,14 +265,14 @@ void gpio_info(void) int cfg = gpio_get_cfg(gpio); printk(BIOS_INFO, "GPIO_%-3d: ", gpio); - if (cfg == EXYNOS_GPIO_INPUT) + if (cfg == GPIO_INPUT) printk(BIOS_INFO, "input"); - else if (cfg == EXYNOS_GPIO_OUTPUT) + else if (cfg == GPIO_OUTPUT) printk(BIOS_INFO, "output"); else printk(BIOS_INFO, "func %d", cfg); - if (cfg == EXYNOS_GPIO_INPUT || cfg == EXYNOS_GPIO_OUTPUT) + if (cfg == GPIO_INPUT || cfg == GPIO_OUTPUT) printk(BIOS_INFO, ", value = %d", gpio_get_value(gpio)); printk(BIOS_INFO, "\n"); } |