
-----Original Message----- From: Ajay Bhargav [mailto:ajay.bhargav@einfochips.com] Sent: Thursday, July 21, 2011 11:10 AM To: Prafulla Wadaskar Cc: u-boot@lists.denx.de; Ajay Bhargav Subject: [PATCH 1/2] gpio: Add GPIO driver framework for Marvell SoCs
This patch adds generic GPIO driver framework support for Marvell SoCs.
To enable GPIO driver define CONFIG_MV_GPIO and for GPIO commands define CONFIG_CMD_GPIO in your board configuration file.
Signed-off-by: Ajay Bhargav ajay.bhargav@einfochips.com
drivers/gpio/Makefile | 1 + drivers/gpio/mvgpio.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ include/mvgpio.h | 52 ++++++++++++++++++++ 3 files changed, 178 insertions(+), 0 deletions(-) create mode 100644 drivers/gpio/mvgpio.c create mode 100644 include/mvgpio.h
I don't think mvgpio.h is needed here, basically header file in include/ is intended to provide interface to other subsystems.
In this case mvgpio.c is enabling support for gpio framework that will be interfaced using asm/gpio.h.
1. You can split stuff in mvgpio.h to asm/arch/gpio.h and/or mvgpio.c 2. you can move it to drivers/gpio/
I would recommend first option.
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 62ec97d..c6f652f 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -28,6 +28,7 @@ LIB := $(obj)libgpio.o COBJS-$(CONFIG_AT91_GPIO) += at91_gpio.o COBJS-$(CONFIG_KIRKWOOD_GPIO) += kw_gpio.o COBJS-$(CONFIG_MARVELL_MFP) += mvmfp.o +COBJS-$(CONFIG_MV_GPIO) += mvgpio.o
Make it CONFIG_MARVELL_GPIO to sync with other configurations i.e. CONFIG_MARVELL_MFP
COBJS-$(CONFIG_MXC_GPIO) += mxc_gpio.o COBJS-$(CONFIG_PCA953X) += pca953x.o COBJS-$(CONFIG_S5P) += s5p_gpio.o diff --git a/drivers/gpio/mvgpio.c b/drivers/gpio/mvgpio.c new file mode 100644 index 0000000..d64f0db --- /dev/null +++ b/drivers/gpio/mvgpio.c @@ -0,0 +1,125 @@ +/*
- (C) Copyright 2011
- eInfochips Ltd. <www.einfochips.com>
- Written-by: Ajay Bhargav ajay.bhargav@einfochips.com
- (C) Copyright 2010
- Marvell Semiconductor <www.marvell.com>
- 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., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301 USA
- */
+#include <common.h> +#include <asm/io.h> +#include <asm/errno.h> +#include <asm/gpio.h>
+char gpio_names[MV_MAX_GPIO][GPIO_LABEL_MAX];
This is overhead, what is need? Just avoid it.
+static int get_gpio_base(int bank) +{
- switch (bank) {
- case 0:
return GPIO_BANK0_BASE;
- case 1:
return GPIO_BANK1_BASE;
- case 2:
return GPIO_BANK2_BASE;
- case 3:
return GPIO_BANK3_BASE;
- }
- return 0;
+}
As discussed, this would be preferred macro in gpio.h
+int gpio_request(int gp, const char *label) +{
- if (gp >= MV_MAX_GPIO)
return -EINVAL;
Minimum fulfillment, this should be okay here.
- if (strlen(gpio_names[gp]) == 0) {
strncpy(gpio_names[gp], label, GPIO_LABEL_MAX);
gpio_names[gp][GPIO_LABEL_MAX - 1] = '\0';
- } else {
return -EBUSY;
Pls remove this.
- }
- return 0;
+}
+void gpio_free(int gp) +{
Just return
- gpio_names[gp][0] = '\0';
+}
+void gpio_toggle_value(int gp) +{
- gpio_set_value(gp, !gpio_get_value(gp));
+}
+int gpio_direction_input(int gp) +{
- struct gpio_reg *gpio_reg_bank;
- if (gp >= MV_MAX_GPIO)
return -EINVAL;
- gpio_reg_bank = (struct gpio_reg *) get_gpio_base(GPIO_TO_REG(gp));
- writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gcdr);
- return 0;
+}
+int gpio_direction_output(int gp, int value) +{
- struct gpio_reg *gpio_reg_bank;
- if (gp >= MV_MAX_GPIO)
return -EINVAL;
- gpio_reg_bank = (struct gpio_reg *) get_gpio_base(GPIO_TO_REG(gp));
- writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gsdr);
- gpio_set_value(gp, value);
- return 0;
+}
+int gpio_get_value(int gp) +{
- struct gpio_reg *gpio_reg_bank;
- u32 gp_val;
- if (gp >= MV_MAX_GPIO)
return -EINVAL;
- gpio_reg_bank = (struct gpio_reg *) get_gpio_base(GPIO_TO_REG(gp));
- gp_val = readl(&gpio_reg_bank->gplr);
- return GPIO_VAL(gp, gp_val);
+}
+void gpio_set_value(int gp, int value) +{
- struct gpio_reg *gpio_reg_bank;
- if (gp >= MV_MAX_GPIO)
return;
- gpio_reg_bank = (struct gpio_reg *) get_gpio_base(GPIO_TO_REG(gp));
- if (value)
writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gpsr);
- else
writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gpcr);
+} diff --git a/include/mvgpio.h b/include/mvgpio.h new file mode 100644 index 0000000..7d0258f --- /dev/null +++ b/include/mvgpio.h @@ -0,0 +1,52 @@ +/*
- (C) Copyright 2011
- eInfochips Ltd. <www.einfochips.com>
- Written-by: Ajay Bhargav ajay.bhargav@einfochips.com
- (C) Copyright 2010
- Marvell Semiconductor <www.marvell.com>
- 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., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301 USA
- */
+#ifndef _MV_GPIO_H +#define _MV_GPIO_H
+#include <asm/types.h>
+#if defined(CONFIG_MV_GPIO)
+#define MV_GPIO_BASE 0xD4019000 +#define GPIO_BANK0_BASE (MV_GPIO_BASE + 0x0000) +#define GPIO_BANK1_BASE (MV_GPIO_BASE + 0x0004) +#define GPIO_BANK2_BASE (MV_GPIO_BASE + 0x0008) +#define GPIO_BANK3_BASE (MV_GPIO_BASE + 0x0100)
Above BAR should go in armada100.h like- #define ARMD1_GPIO0_BASE 0xD4019000 #define ARMD1_GPIO1_BASE 0xD4019004 #define ARMD1_GPIO2_BASE 0xD4019008 #define ARMD1_GPIO3_BASE 0xD4019100
Rest stuff should go in asm/arch/gpio.h
+#define GPIO_LABEL_MAX 20 +#define MV_MAX_GPIO 128
+#define GPIO_TO_REG(gp) (gp >> 5) +#define GPIO_TO_BIT(gp) (1 << (gp & 0x1F)) +#define GPIO_VAL(gp, val) ((val >> (gp & 0x1F)) & 0x01)
+#define GPIO_SET 1 +#define GPIO_CLR 0
+#endif /* CONFIG_MV_GPIO */
+#endif /* _MV_GPIO_H */
1.7.0.4
Regards.. Prafulla . .