From d8e0ca851b91b8ac16c648d437f668997b606e6b Mon Sep 17 00:00:00 2001 From: Stefano Babic Date: Sun, 21 Aug 2011 10:45:44 +0200 Subject: [PATCH] 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 --- drivers/gpio/mxc_gpio.c | 51 +++++++++++++++++++++++++++++++++--- drivers/spi/mxc_spi.c | 8 +++--- include/mxc_gpio.h | 57 ----------------------------------------- 3 files changed, 51 insertions(+), 65 deletions(-) delete mode 100644 include/mxc_gpio.h diff --git a/drivers/gpio/mxc_gpio.c b/drivers/gpio/mxc_gpio.c index 6efbb02c16..a7f36b2933 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. * @@ -22,10 +25,16 @@ */ #include #include +#include #include -#include #include +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, ®s->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; +} diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c index 81381d9b9a..2fa748608f 100644 --- a/drivers/spi/mxc_spi.c +++ b/drivers/spi/mxc_spi.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -145,14 +145,14 @@ void spi_cs_activate(struct spi_slave *slave) { struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave); if (mxcs->gpio > 0) - mxc_gpio_set(mxcs->gpio, mxcs->ss_pol); + gpio_set_value(mxcs->gpio, mxcs->ss_pol); } void spi_cs_deactivate(struct spi_slave *slave) { struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave); if (mxcs->gpio > 0) - mxc_gpio_set(mxcs->gpio, + gpio_set_value(mxcs->gpio, !(mxcs->ss_pol)); } @@ -468,7 +468,7 @@ static int decode_cs(struct mxc_spi_slave *mxcs, unsigned int cs) if (cs > 3) { mxcs->gpio = cs >> 8; cs &= 3; - ret = mxc_gpio_direction(mxcs->gpio, OUT); + ret = gpio_direction_output(mxcs->gpio, 0); if (ret) { printf("mxc_spi: cannot setup gpio %d\n", mxcs->gpio); return -EINVAL; diff --git a/include/mxc_gpio.h b/include/mxc_gpio.h deleted file mode 100644 index f673dcecd6..0000000000 --- a/include/mxc_gpio.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * (c) 2007 Pengutronix, Sascha Hauer - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#ifndef __MXC_GPIO_H -#define __MXC_GPIO_H - -/* Converts a GPIO port number and the internal bit position - * to the GPIO number - */ -#define MXC_GPIO_PORT_TO_NUM(port, bit) (((port - 1) << 5) + (bit & 0x1f)) - -enum mxc_gpio_direction { - MXC_GPIO_DIRECTION_IN, - MXC_GPIO_DIRECTION_OUT, -}; - -#ifdef CONFIG_MXC_GPIO -extern int mxc_gpio_direction(unsigned int gpio, - enum mxc_gpio_direction direction); -extern void mxc_gpio_set(unsigned int gpio, unsigned int value); -extern int mxc_gpio_get(unsigned int gpio); -#else -static inline int mxc_gpio_direction(unsigned int gpio, - enum mxc_gpio_direction direction) -{ - return 1; -} -static inline int mxc_gpio_get(unsigned int gpio) -{ - return 1; -} -static inline void mxc_gpio_set(unsigned int gpio, unsigned int value) -{ -} -#endif - -#endif -- 2.25.1