X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=drivers%2Fgpio%2Fmxc_gpio.c;h=2c79bff62b6376c659e6da6afb03ae411deec465;hb=9fe2cfb43aab2225a8c970a69341534b2488da8c;hp=663141f1b4690f79286f9b1904ae619139a91936;hpb=ddf71e4cfffb4792445d3473cfc9326d07e6557c;p=karo-tx-uboot.git diff --git a/drivers/gpio/mxc_gpio.c b/drivers/gpio/mxc_gpio.c index 663141f1b4..2c79bff62b 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, * + * Copyright (C) 2011 + * Stefano Babic, DENX Software Engineering, + * * See file CREDITS for list of people who contributed to this * project. * @@ -21,33 +24,45 @@ * MA 02111-1307 USA */ #include -#ifdef CONFIG_MX31 -#include -#endif -#ifdef CONFIG_MX51 #include -#endif +#include #include -#include +#include + +enum mxc_gpio_direction { + MXC_GPIO_DIRECTION_IN, + MXC_GPIO_DIRECTION_OUT, +}; + +#define GPIO_TO_PORT(n) (n / 32) /* GPIO port description */ static unsigned long gpio_ports[] = { [0] = GPIO1_BASE_ADDR, [1] = GPIO2_BASE_ADDR, [2] = GPIO3_BASE_ADDR, -#ifdef CONFIG_MX51 +#if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \ + defined(CONFIG_MX53) || defined(CONFIG_MX6Q) [3] = GPIO4_BASE_ADDR, #endif +#if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6Q) + [4] = GPIO5_BASE_ADDR, + [5] = GPIO6_BASE_ADDR, +#endif +#if defined(CONFIG_MX53) || defined(CONFIG_MX6Q) + [6] = GPIO7_BASE_ADDR, +#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; + unsigned int port = GPIO_TO_PORT(gpio); struct gpio_regs *regs; u32 l; if (port >= ARRAY_SIZE(gpio_ports)) - return 1; + return -1; gpio &= 0x1f; @@ -67,14 +82,14 @@ int mxc_gpio_direction(unsigned int gpio, enum mxc_gpio_direction direction) return 0; } -void mxc_gpio_set(unsigned int gpio, unsigned int value) +int gpio_set_value(unsigned gpio, int value) { - unsigned int port = gpio >> 5; + unsigned int port = GPIO_TO_PORT(gpio); struct gpio_regs *regs; u32 l; if (port >= ARRAY_SIZE(gpio_ports)) - return; + return -1; gpio &= 0x1f; @@ -86,13 +101,15 @@ void mxc_gpio_set(unsigned int gpio, unsigned int value) else l &= ~(1 << gpio); writel(l, ®s->gpio_dr); + + return 0; } -int mxc_gpio_get(unsigned int gpio) +int gpio_get_value(unsigned gpio) { - unsigned int port = gpio >> 5; + unsigned int port = GPIO_TO_PORT(gpio); struct gpio_regs *regs; - u32 l; + u32 val; if (port >= ARRAY_SIZE(gpio_ports)) return -1; @@ -101,7 +118,35 @@ int mxc_gpio_get(unsigned int gpio) regs = (struct gpio_regs *)gpio_ports[port]; - l = (readl(®s->gpio_dr) >> gpio) & 0x01; + val = (readl(®s->gpio_psr) >> gpio) & 0x01; + + return val; +} + +int gpio_request(unsigned gpio, const char *label) +{ + unsigned int port = GPIO_TO_PORT(gpio); + if (port >= ARRAY_SIZE(gpio_ports)) + return -1; + return 0; +} + +int gpio_free(unsigned gpio) +{ + return 0; +} + +int gpio_direction_input(unsigned gpio) +{ + return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_IN); +} + +int gpio_direction_output(unsigned gpio, int value) +{ + int ret = mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_OUT); + + if (ret < 0) + return ret; - return l; + return gpio_set_value(gpio, value); }