summaryrefslogtreecommitdiff
path: root/src/cpu/samsung/exynos5250/gpio.c
diff options
context:
space:
mode:
authorStefan Reinauer <reinauer@chromium.org>2013-05-15 14:54:07 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-07-10 20:08:29 +0200
commitdc006c1db4fa3606d657c78cc87dc13d056e970d (patch)
tree7479203a6e08b0b465a104f64316e687885305f5 /src/cpu/samsung/exynos5250/gpio.c
parent08dc3571463d7226068d4a4c19d453859b148957 (diff)
downloadcoreboot-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.c161
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");
}