Patchwork [U-Boot,01/14] IMX: uniform GPIO interface using GPIO framework

login
register
mail settings
Submitter Stefano Babic
Date Aug. 21, 2011, 10:28 a.m.
Message ID <1313922509-10083-1-git-send-email-sbabic@denx.de>
Download mbox | patch
Permalink /patch/110815/
State Accepted
Commit d8e0ca851b91b8ac16c648d437f668997b606e6b
Headers show

Comments

Stefano Babic - Aug. 21, 2011, 10:28 a.m.
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>
---
 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
Fabio Estevam - Aug. 21, 2011, 4:37 p.m.
Hi Stefano,

On Sun, Aug 21, 2011 at 7:28 AM, Stefano Babic <sbabic@denx.de> wrote:
> 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

This is a nice series. I am wondering if mx51evk is missing.

Regards,

Fabio Estevam
Stefano Babic - Aug. 22, 2011, 7:54 a.m.
On 08/21/2011 06:37 PM, Fabio Estevam wrote:
> Hi Stefano,
> 

Hi Fabio,

> On Sun, Aug 21, 2011 at 7:28 AM, Stefano Babic <sbabic@denx.de> wrote:
>> 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
> 
> This is a nice series. I am wondering if mx51evk is missing.

mx51evk is nastier because it access directly GPIOs register instead of
using the driver. I prepared the patch to clean up and I post now as
last of the series.

Stefano

Patch

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;
+}
diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
index 81381d9..2fa7486 100644
--- a/drivers/spi/mxc_spi.c
+++ b/drivers/spi/mxc_spi.c
@@ -23,7 +23,7 @@ 
 #include <spi.h>
 #include <asm/errno.h>
 #include <asm/io.h>
-#include <mxc_gpio.h>
+#include <asm/gpio.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/clock.h>
 
@@ -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 f673dce..0000000
--- a/include/mxc_gpio.h
+++ /dev/null
@@ -1,57 +0,0 @@ 
-/*
- *
- * (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
- *
- * 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