summaryrefslogtreecommitdiff
path: root/drivers/gpio/mxc_gpio.c
diff options
context:
space:
mode:
authorStefano Babic <sbabic@denx.de>2011-08-21 10:45:44 +0200
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2011-09-04 11:36:11 +0200
commitd8e0ca851b91b8ac16c648d437f668997b606e6b (patch)
treeea8f4cdfb6613d0219ad9a68baea4320b6b037ff /drivers/gpio/mxc_gpio.c
parent7acec2594840b2602054c5a9d1e14792837fd9db (diff)
downloadu-boot-imx-d8e0ca851b91b8ac16c648d437f668997b606e6b.zip
u-boot-imx-d8e0ca851b91b8ac16c648d437f668997b606e6b.tar.gz
u-boot-imx-d8e0ca851b91b8ac16c648d437f668997b606e6b.tar.bz2
IMX: uniform GPIO interface using GPIO framework
IMX processors has a slightly different interface to access GPIOs and do not make use of the provided GPIO framework. The patch substitutes mxc_ specific functions and make use of the API in asm/gpio.h Signed-off-by: Stefano Babic <sbabic@denx.de>
Diffstat (limited to 'drivers/gpio/mxc_gpio.c')
-rw-r--r--drivers/gpio/mxc_gpio.c51
1 files changed, 47 insertions, 4 deletions
diff --git a/drivers/gpio/mxc_gpio.c b/drivers/gpio/mxc_gpio.c
index 6efbb02..a7f36b2 100644
--- a/drivers/gpio/mxc_gpio.c
+++ b/drivers/gpio/mxc_gpio.c
@@ -2,6 +2,9 @@
* Copyright (C) 2009
* Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
*
+ * Copyright (C) 2011
+ * Stefano Babic, DENX Software Engineering, <sbabic@denx.de>
+ *
* See file CREDITS for list of people who contributed to this
* project.
*
@@ -22,10 +25,16 @@
*/
#include <common.h>
#include <asm/arch/imx-regs.h>
+#include <asm/gpio.h>
#include <asm/io.h>
-#include <mxc_gpio.h>
#include <errno.h>
+enum mxc_gpio_direction {
+ MXC_GPIO_DIRECTION_IN,
+ MXC_GPIO_DIRECTION_OUT,
+};
+
+
/* GPIO port description */
static unsigned long gpio_ports[] = {
[0] = GPIO1_BASE_ADDR,
@@ -41,7 +50,8 @@ static unsigned long gpio_ports[] = {
#endif
};
-int mxc_gpio_direction(unsigned int gpio, enum mxc_gpio_direction direction)
+static int mxc_gpio_direction(unsigned int gpio,
+ enum mxc_gpio_direction direction)
{
unsigned int port = gpio >> 5;
struct gpio_regs *regs;
@@ -68,7 +78,7 @@ int mxc_gpio_direction(unsigned int gpio, enum mxc_gpio_direction direction)
return 0;
}
-void mxc_gpio_set(unsigned int gpio, unsigned int value)
+void gpio_set_value(int gpio, int value)
{
unsigned int port = gpio >> 5;
struct gpio_regs *regs;
@@ -89,7 +99,7 @@ void mxc_gpio_set(unsigned int gpio, unsigned int value)
writel(l, &regs->gpio_dr);
}
-int mxc_gpio_get(unsigned int gpio)
+int gpio_get_value(int gpio)
{
unsigned int port = gpio >> 5;
struct gpio_regs *regs;
@@ -106,3 +116,36 @@ int mxc_gpio_get(unsigned int gpio)
return l;
}
+
+int gpio_request(int gp, const char *label)
+{
+ unsigned int port = gp >> 5;
+ if (port >= ARRAY_SIZE(gpio_ports))
+ return -EINVAL;
+ return 0;
+}
+
+void gpio_free(int gp)
+{
+}
+
+void gpio_toggle_value(int gp)
+{
+ gpio_set_value(gp, !gpio_get_value(gp));
+}
+
+int gpio_direction_input(int gp)
+{
+ return mxc_gpio_direction(gp, MXC_GPIO_DIRECTION_IN);
+}
+
+int gpio_direction_output(int gp, int value)
+{
+ int ret = mxc_gpio_direction(gp, MXC_GPIO_DIRECTION_OUT);
+
+ if (ret < 0)
+ return ret;
+
+ gpio_set_value(gp, value);
+ return 0;
+}