[U-Boot] [PATCH V3 02/11] dm: gpio: vf610: Add GPIO driver support

Stefano Babic sbabic at denx.de
Mon Jun 8 08:46:50 CEST 2015


On 01/06/2015 15:07, Bhuvanchandra DV wrote:
> Add GPIO driver support to Freescale VF610
> 
> Signed-off-by: Bhuvanchandra DV <bhuvanchandra.dv at toradex.com>
> ---
>  arch/arm/imx-common/iomux-v3.c             |  26 +++++
>  arch/arm/include/asm/arch-vf610/gpio.h     |  29 +++++
>  arch/arm/include/asm/arch-vf610/imx-regs.h |   5 +
>  arch/arm/include/asm/imx-common/iomux-v3.h |   6 +
>  drivers/gpio/Kconfig                       |   7 ++
>  drivers/gpio/Makefile                      |   1 +
>  drivers/gpio/vybrid_gpio.c                 | 169 +++++++++++++++++++++++++++++
>  7 files changed, 243 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-vf610/gpio.h
>  create mode 100644 drivers/gpio/vybrid_gpio.c
> 
> diff --git a/arch/arm/imx-common/iomux-v3.c b/arch/arm/imx-common/iomux-v3.c
> index e88e6e2..7fb23dd 100644
> --- a/arch/arm/imx-common/iomux-v3.c
> +++ b/arch/arm/imx-common/iomux-v3.c
> @@ -92,3 +92,29 @@ void imx_iomux_set_gpr_register(int group, int start_bit,
>  	reg |= (value << start_bit);
>  	writel(reg, base + group * 4);
>  }
> +
> +#ifdef CONFIG_IOMUX_SHARE_CONF_REG
> +void imx_iomux_gpio_set_direction(unsigned int gpio,
> +				unsigned int direction)
> +{
> +	u32 reg;
> +	/*
> +	 * Only on Vybrid the input/output buffer enable flags
> +	 * are part of the shared mux/conf register.
> +	 */
> +	reg = readl(base + (gpio << 2));
> +
> +	if (direction)
> +		reg |= 0x2;
> +	else
> +		reg &= ~0x2;
> +
> +	writel(reg, base + (gpio << 2));
> +}
> +
> +void imx_iomux_gpio_get_function(unsigned int gpio, u32 *gpio_state)
> +{
> +	*gpio_state = readl(base + (gpio << 2)) &
> +		((0X07 << PAD_MUX_MODE_SHIFT) | PAD_CTL_OBE_IBE_ENABLE);
> +}
> +#endif
> diff --git a/arch/arm/include/asm/arch-vf610/gpio.h b/arch/arm/include/asm/arch-vf610/gpio.h
> new file mode 100644
> index 0000000..622b8f0
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-vf610/gpio.h
> @@ -0,0 +1,29 @@
> +/*
> + * Copyright (C) 2015
> + * Bhuvanchandra DV, Toradex, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0
> + */
> +
> +#ifndef __ASM_ARCH_VF610_GPIO_H
> +#define __ASM_ARCH_VF610_GPIO_H
> +
> +#define VYBRID_GPIO_COUNT		32
> +#define VF610_GPIO_DIRECTION_IN	0x0
> +#define VF610_GPIO_DIRECTION_OUT	0x1
> +
> +/* GPIO registers */
> +struct vybrid_gpio_regs {
> +	u32 gpio_pdor;
> +	u32 gpio_psor;
> +	u32 gpio_pcor;
> +	u32 gpio_ptor;
> +	u32 gpio_pdir;
> +};
> +
> +struct vybrid_gpio_platdata {
> +	unsigned int chip;
> +	u32 base;
> +	const char *port_name;
> +};
> +#endif	/* __ASM_ARCH_VF610_GPIO_H */
> diff --git a/arch/arm/include/asm/arch-vf610/imx-regs.h b/arch/arm/include/asm/arch-vf610/imx-regs.h
> index 2021981..7df3b1e 100644
> --- a/arch/arm/include/asm/arch-vf610/imx-regs.h
> +++ b/arch/arm/include/asm/arch-vf610/imx-regs.h
> @@ -81,6 +81,11 @@
>  #define VREG_DIG_BASE_ADDR	(AIPS0_BASE_ADDR + 0x0006D000)
>  #define SRC_BASE_ADDR		(AIPS0_BASE_ADDR + 0x0006E000)
>  #define CMU_BASE_ADDR		(AIPS0_BASE_ADDR + 0x0006F000)
> +#define GPIO0_BASE_ADDR		(AIPS0_BASE_ADDR + 0x000FF000)
> +#define GPIO1_BASE_ADDR		(AIPS0_BASE_ADDR + 0x000FF040)
> +#define GPIO2_BASE_ADDR		(AIPS0_BASE_ADDR + 0x000FF080)
> +#define GPIO3_BASE_ADDR		(AIPS0_BASE_ADDR + 0x000FF0C0)
> +#define GPIO4_BASE_ADDR		(AIPS0_BASE_ADDR + 0x000FF100)
>  
>  /* AIPS 1 */
>  #define OCOTP_BASE_ADDR		(AIPS1_BASE_ADDR + 0x00025000)
> diff --git a/arch/arm/include/asm/imx-common/iomux-v3.h b/arch/arm/include/asm/imx-common/iomux-v3.h
> index e0a49be..2581019 100644
> --- a/arch/arm/include/asm/imx-common/iomux-v3.h
> +++ b/arch/arm/include/asm/imx-common/iomux-v3.h
> @@ -187,6 +187,12 @@ void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
>  */
>  void imx_iomux_set_gpr_register(int group, int start_bit,
>  					 int num_bits, int value);
> +#ifdef CONFIG_IOMUX_SHARE_CONF_REG
> +void imx_iomux_gpio_set_direction(unsigned int gpio,
> +				unsigned int direction);
> +void imx_iomux_gpio_get_function(unsigned int gpio,
> +				u32 *gpio_state);
> +#endif
>  
>  /* macros for declaring and using pinmux array */
>  #if defined(CONFIG_MX6QDL)
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 0840a30..0c43777 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -35,3 +35,10 @@ config SANDBOX_GPIO_COUNT
>  	  are specified using the device tree. But you can also have a number
>  	  of 'anonymous' GPIOs that do not belong to any device or bank.
>  	  Select a suitable value depending on your needs.
> +
> +config VYBRID_GPIO
> +	bool "Vybrid GPIO driver"
> +	depends on DM
> +	default n
> +	help
> +	  Say yes here to support Vybrid vf610 GPIOs.
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index ba9efe8..5864850 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -45,3 +45,4 @@ obj-$(CONFIG_SUNXI_GPIO)	+= sunxi_gpio.o
>  obj-$(CONFIG_LPC32XX_GPIO)	+= lpc32xx_gpio.o
>  obj-$(CONFIG_STM32_GPIO)	+= stm32_gpio.o
>  obj-$(CONFIG_ZYNQ_GPIO)		+= zynq_gpio.o
> +obj-$(CONFIG_VYBRID_GPIO)	+= vybrid_gpio.o
> diff --git a/drivers/gpio/vybrid_gpio.c b/drivers/gpio/vybrid_gpio.c
> new file mode 100644
> index 0000000..6eaf0a9
> --- /dev/null
> +++ b/drivers/gpio/vybrid_gpio.c
> @@ -0,0 +1,169 @@
> +/*
> + * Copyright (C) 2015
> + * Bhuvanchandra DV, Toradex, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <errno.h>
> +#include <fdtdec.h>
> +#include <asm/gpio.h>
> +#include <asm/imx-common/iomux-v3.h>
> +#include <asm/io.h>
> +#include <malloc.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +struct vybrid_gpios {
> +	unsigned int chip;
> +	struct vybrid_gpio_regs *reg;
> +};
> +
> +static int vybrid_gpio_direction_input(struct udevice *dev, unsigned gpio)
> +{
> +	const struct vybrid_gpios *gpios = dev_get_priv(dev);
> +
> +	gpio = gpio + (gpios->chip * VYBRID_GPIO_COUNT);
> +	imx_iomux_gpio_set_direction(gpio, VF610_GPIO_DIRECTION_IN);
> +
> +	return 0;
> +}
> +
> +static int vybrid_gpio_direction_output(struct udevice *dev, unsigned gpio,
> +					 int value)
> +{
> +	const struct vybrid_gpios *gpios = dev_get_priv(dev);
> +
> +	gpio = gpio + (gpios->chip * VYBRID_GPIO_COUNT);
> +	gpio_set_value(gpio, value);
> +	imx_iomux_gpio_set_direction(gpio, VF610_GPIO_DIRECTION_OUT);
> +
> +	return 0;
> +}
> +
> +static int vybrid_gpio_get_value(struct udevice *dev, unsigned gpio)
> +{
> +	const struct vybrid_gpios *gpios = dev_get_priv(dev);
> +
> +	return ((readl(&gpios->reg->gpio_pdir) & (1 << gpio))) ? 1 : 0;
> +}
> +
> +static int vybrid_gpio_set_value(struct udevice *dev, unsigned gpio,
> +				  int value)
> +{
> +	const struct vybrid_gpios *gpios = dev_get_priv(dev);
> +	if (value)
> +		writel((1 << gpio), &gpios->reg->gpio_psor);
> +	else
> +		writel((1 << gpio), &gpios->reg->gpio_pcor);
> +
> +	return 0;
> +}
> +
> +static int vybrid_gpio_get_function(struct udevice *dev, unsigned gpio)
> +{
> +	const struct vybrid_gpios *gpios = dev_get_priv(dev);
> +	u32 g_state = 0;
> +
> +	gpio = gpio + (gpios->chip * VYBRID_GPIO_COUNT);
> +
> +	imx_iomux_gpio_get_function(gpio, &g_state);
> +
> +	if (((g_state & (0x07 << PAD_MUX_MODE_SHIFT)) >> PAD_MUX_MODE_SHIFT) > 0)

Fixed by applying:

WARNING: line over 80 characters

#274: FILE: drivers/gpio/vybrid_gpio.c:74:
+	if (((g_state & (0x07 << PAD_MUX_MODE_SHIFT)) >> PAD_MUX_MODE_SHIFT) > 0)

Applied to u-boot-imx, thanks !

Best regards,
Stefano Babic



-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list