Re: [U-Boot] [PATCH] gpio: add Xilinx Zynq PS GPIO driver

2015-03-25 Thread Michal Simek
On 03/20/2015 04:00 PM, r...@dave-tech.it wrote:
 From: Andrea Scian andrea.sc...@dave.eu
 
 Most of the code is taken (and adapted) from Linux kernel driver.
 
 Just add CONFIG_ZYNQ_GPIO to you config to enable it
 
 Signed-off-by: Andrea Scian andrea.sc...@dave.eu
 ---
  arch/arm/include/asm/arch-zynq/gpio.h |   66 ++
  drivers/gpio/Makefile |1 +
  drivers/gpio/zynq_gpio.c  |  220 
 +
  3 files changed, 287 insertions(+)
  create mode 100644 drivers/gpio/zynq_gpio.c
 
 diff --git a/arch/arm/include/asm/arch-zynq/gpio.h 
 b/arch/arm/include/asm/arch-zynq/gpio.h
 index a26ae87..9e1e7da 100644
 --- a/arch/arm/include/asm/arch-zynq/gpio.h
 +++ b/arch/arm/include/asm/arch-zynq/gpio.h
 @@ -1,5 +1,6 @@
  /*
   * Copyright (c) 2013 Xilinx, Inc.
 + * Copyright (c) 2015 DAVE Embedded Systems
   *
   * SPDX-License-Identifier:  GPL-2.0+
   */
 @@ -7,4 +8,69 @@
  #ifndef _ZYNQ_GPIO_H
  #define _ZYNQ_GPIO_H
  
 +#define ZYNQ_GPIO_BASE_ADDRESS 0xE000A000
 +
 +/* Maximum banks */
 +#define ZYNQ_GPIO_MAX_BANK   4
 +
 +#define ZYNQ_GPIO_BANK0_NGPIO32
 +#define ZYNQ_GPIO_BANK1_NGPIO22
 +#define ZYNQ_GPIO_BANK2_NGPIO32
 +#define ZYNQ_GPIO_BANK3_NGPIO32
 +
 +#define ZYNQ_GPIO_NR_GPIOS   (ZYNQ_GPIO_BANK0_NGPIO + \
 +  ZYNQ_GPIO_BANK1_NGPIO + \
 +  ZYNQ_GPIO_BANK2_NGPIO + \
 +  ZYNQ_GPIO_BANK3_NGPIO)
 +
 +#define ZYNQ_GPIO_BANK0_PIN_MIN  0
 +#define ZYNQ_GPIO_BANK0_PIN_MAX  (ZYNQ_GPIO_BANK0_PIN_MIN + \
 + ZYNQ_GPIO_BANK0_NGPIO - 1)
 +#define ZYNQ_GPIO_BANK1_PIN_MIN  (ZYNQ_GPIO_BANK0_PIN_MAX + 1)
 +#define ZYNQ_GPIO_BANK1_PIN_MAX  (ZYNQ_GPIO_BANK1_PIN_MIN + \
 + ZYNQ_GPIO_BANK1_NGPIO - 1)
 +#define ZYNQ_GPIO_BANK2_PIN_MIN  (ZYNQ_GPIO_BANK1_PIN_MAX + 1)
 +#define ZYNQ_GPIO_BANK2_PIN_MAX  (ZYNQ_GPIO_BANK2_PIN_MIN + \
 + ZYNQ_GPIO_BANK2_NGPIO - 1)
 +#define ZYNQ_GPIO_BANK3_PIN_MIN  (ZYNQ_GPIO_BANK2_PIN_MAX + 1)
 +#define ZYNQ_GPIO_BANK3_PIN_MAX  (ZYNQ_GPIO_BANK3_PIN_MIN + \
 + ZYNQ_GPIO_BANK3_NGPIO - 1)
 +
 +/* Register offsets for the GPIO device */
 +/* LSW Mask  Data -WO */
 +#define ZYNQ_GPIO_DATA_LSW_OFFSET(BANK)  (0x000 + (8 * BANK))
 +/* MSW Mask  Data -WO */
 +#define ZYNQ_GPIO_DATA_MSW_OFFSET(BANK)  (0x004 + (8 * BANK))
 +/* Data Register-RW */
 +#define ZYNQ_GPIO_DATA_RO_OFFSET(BANK)   (0x060 + (4 * BANK))
 +/* Direction mode reg-RW */
 +#define ZYNQ_GPIO_DIRM_OFFSET(BANK)  (0x204 + (0x40 * BANK))
 +/* Output enable reg-RW */
 +#define ZYNQ_GPIO_OUTEN_OFFSET(BANK) (0x208 + (0x40 * BANK))
 +/* Interrupt mask reg-RO */
 +#define ZYNQ_GPIO_INTMASK_OFFSET(BANK)   (0x20C + (0x40 * BANK))
 +/* Interrupt enable reg-WO */
 +#define ZYNQ_GPIO_INTEN_OFFSET(BANK) (0x210 + (0x40 * BANK))
 +/* Interrupt disable reg-WO */
 +#define ZYNQ_GPIO_INTDIS_OFFSET(BANK)(0x214 + (0x40 * BANK))
 +/* Interrupt status reg-RO */
 +#define ZYNQ_GPIO_INTSTS_OFFSET(BANK)(0x218 + (0x40 * BANK))
 +/* Interrupt type reg-RW */
 +#define ZYNQ_GPIO_INTTYPE_OFFSET(BANK)   (0x21C + (0x40 * BANK))
 +/* Interrupt polarity reg-RW */
 +#define ZYNQ_GPIO_INTPOL_OFFSET(BANK)(0x220 + (0x40 * BANK))
 +/* Interrupt on any, reg-RW */
 +#define ZYNQ_GPIO_INTANY_OFFSET(BANK)(0x224 + (0x40 * BANK))
 +
 +/* Disable all interrupts mask */
 +#define ZYNQ_GPIO_IXR_DISABLE_ALL0x
 +
 +/* Mid pin number of a bank */
 +#define ZYNQ_GPIO_MID_PIN_NUM 16
 +
 +/* GPIO upper 16 bit mask */
 +#define ZYNQ_GPIO_UPPER_MASK 0x
 +
 +#define BIT(x) (1x)
 +
  #endif /* _ZYNQ_GPIO_H */
 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
 index fe9a3b2..916ecb5 100644
 --- a/drivers/gpio/Makefile
 +++ b/drivers/gpio/Makefile
 @@ -41,3 +41,4 @@ obj-$(CONFIG_ADI_GPIO2) += adi_gpio2.o
  obj-$(CONFIG_TCA642X)+= tca642x.o
  oby-$(CONFIG_SX151X) += sx151x.o
  obj-$(CONFIG_SUNXI_GPIO) += sunxi_gpio.o
 +obj-$(CONFIG_ZYNQ_GPIO)  += zynq_gpio.o
 diff --git a/drivers/gpio/zynq_gpio.c b/drivers/gpio/zynq_gpio.c
 new file mode 100644
 index 000..83a2c46
 --- /dev/null
 +++ b/drivers/gpio/zynq_gpio.c
 @@ -0,0 +1,220 @@
 +/*
 + * Xilinx Zynq GPIO device driver
 + *
 + * Copyright (C) 2015 DAVE Embedded Systems de...@dave.eu
 + *
 + * Most of code taken from linux kernel driver 
 (linux/drivers/gpio/gpio-zynq.c)
 + * Copyright (C) 2009 - 2014 Xilinx, Inc.
 + *
 + * SPDX-License-Identifier:  GPL-2.0+
 + */
 +
 +#include common.h
 +#include asm/gpio.h
 +#include asm/io.h
 +#include asm/errno.h
 +
 +/**
 + * zynq_gpio_get_bank_pin - Get the bank number and pin number within that 
 bank
 + * for a given pin in the GPIO device
 + * @pin_num: gpio pin number within the device
 + * @bank_num:an output parameter used to 

[U-Boot] [PATCH] gpio: add Xilinx Zynq PS GPIO driver

2015-03-20 Thread rnd4
From: Andrea Scian andrea.sc...@dave.eu

Most of the code is taken (and adapted) from Linux kernel driver.

Just add CONFIG_ZYNQ_GPIO to you config to enable it

Signed-off-by: Andrea Scian andrea.sc...@dave.eu
---
 arch/arm/include/asm/arch-zynq/gpio.h |   66 ++
 drivers/gpio/Makefile |1 +
 drivers/gpio/zynq_gpio.c  |  220 +
 3 files changed, 287 insertions(+)
 create mode 100644 drivers/gpio/zynq_gpio.c

diff --git a/arch/arm/include/asm/arch-zynq/gpio.h 
b/arch/arm/include/asm/arch-zynq/gpio.h
index a26ae87..9e1e7da 100644
--- a/arch/arm/include/asm/arch-zynq/gpio.h
+++ b/arch/arm/include/asm/arch-zynq/gpio.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013 Xilinx, Inc.
+ * Copyright (c) 2015 DAVE Embedded Systems
  *
  * SPDX-License-Identifier:GPL-2.0+
  */
@@ -7,4 +8,69 @@
 #ifndef _ZYNQ_GPIO_H
 #define _ZYNQ_GPIO_H
 
+#define ZYNQ_GPIO_BASE_ADDRESS 0xE000A000
+
+/* Maximum banks */
+#define ZYNQ_GPIO_MAX_BANK 4
+
+#define ZYNQ_GPIO_BANK0_NGPIO  32
+#define ZYNQ_GPIO_BANK1_NGPIO  22
+#define ZYNQ_GPIO_BANK2_NGPIO  32
+#define ZYNQ_GPIO_BANK3_NGPIO  32
+
+#define ZYNQ_GPIO_NR_GPIOS (ZYNQ_GPIO_BANK0_NGPIO + \
+ZYNQ_GPIO_BANK1_NGPIO + \
+ZYNQ_GPIO_BANK2_NGPIO + \
+ZYNQ_GPIO_BANK3_NGPIO)
+
+#define ZYNQ_GPIO_BANK0_PIN_MIN0
+#define ZYNQ_GPIO_BANK0_PIN_MAX(ZYNQ_GPIO_BANK0_PIN_MIN + \
+   ZYNQ_GPIO_BANK0_NGPIO - 1)
+#define ZYNQ_GPIO_BANK1_PIN_MIN(ZYNQ_GPIO_BANK0_PIN_MAX + 1)
+#define ZYNQ_GPIO_BANK1_PIN_MAX(ZYNQ_GPIO_BANK1_PIN_MIN + \
+   ZYNQ_GPIO_BANK1_NGPIO - 1)
+#define ZYNQ_GPIO_BANK2_PIN_MIN(ZYNQ_GPIO_BANK1_PIN_MAX + 1)
+#define ZYNQ_GPIO_BANK2_PIN_MAX(ZYNQ_GPIO_BANK2_PIN_MIN + \
+   ZYNQ_GPIO_BANK2_NGPIO - 1)
+#define ZYNQ_GPIO_BANK3_PIN_MIN(ZYNQ_GPIO_BANK2_PIN_MAX + 1)
+#define ZYNQ_GPIO_BANK3_PIN_MAX(ZYNQ_GPIO_BANK3_PIN_MIN + \
+   ZYNQ_GPIO_BANK3_NGPIO - 1)
+
+/* Register offsets for the GPIO device */
+/* LSW Mask  Data -WO */
+#define ZYNQ_GPIO_DATA_LSW_OFFSET(BANK)(0x000 + (8 * BANK))
+/* MSW Mask  Data -WO */
+#define ZYNQ_GPIO_DATA_MSW_OFFSET(BANK)(0x004 + (8 * BANK))
+/* Data Register-RW */
+#define ZYNQ_GPIO_DATA_RO_OFFSET(BANK) (0x060 + (4 * BANK))
+/* Direction mode reg-RW */
+#define ZYNQ_GPIO_DIRM_OFFSET(BANK)(0x204 + (0x40 * BANK))
+/* Output enable reg-RW */
+#define ZYNQ_GPIO_OUTEN_OFFSET(BANK)   (0x208 + (0x40 * BANK))
+/* Interrupt mask reg-RO */
+#define ZYNQ_GPIO_INTMASK_OFFSET(BANK) (0x20C + (0x40 * BANK))
+/* Interrupt enable reg-WO */
+#define ZYNQ_GPIO_INTEN_OFFSET(BANK)   (0x210 + (0x40 * BANK))
+/* Interrupt disable reg-WO */
+#define ZYNQ_GPIO_INTDIS_OFFSET(BANK)  (0x214 + (0x40 * BANK))
+/* Interrupt status reg-RO */
+#define ZYNQ_GPIO_INTSTS_OFFSET(BANK)  (0x218 + (0x40 * BANK))
+/* Interrupt type reg-RW */
+#define ZYNQ_GPIO_INTTYPE_OFFSET(BANK) (0x21C + (0x40 * BANK))
+/* Interrupt polarity reg-RW */
+#define ZYNQ_GPIO_INTPOL_OFFSET(BANK)  (0x220 + (0x40 * BANK))
+/* Interrupt on any, reg-RW */
+#define ZYNQ_GPIO_INTANY_OFFSET(BANK)  (0x224 + (0x40 * BANK))
+
+/* Disable all interrupts mask */
+#define ZYNQ_GPIO_IXR_DISABLE_ALL  0x
+
+/* Mid pin number of a bank */
+#define ZYNQ_GPIO_MID_PIN_NUM 16
+
+/* GPIO upper 16 bit mask */
+#define ZYNQ_GPIO_UPPER_MASK 0x
+
+#define BIT(x) (1x)
+
 #endif /* _ZYNQ_GPIO_H */
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index fe9a3b2..916ecb5 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -41,3 +41,4 @@ obj-$(CONFIG_ADI_GPIO2)   += adi_gpio2.o
 obj-$(CONFIG_TCA642X)  += tca642x.o
 oby-$(CONFIG_SX151X)   += sx151x.o
 obj-$(CONFIG_SUNXI_GPIO)   += sunxi_gpio.o
+obj-$(CONFIG_ZYNQ_GPIO)+= zynq_gpio.o
diff --git a/drivers/gpio/zynq_gpio.c b/drivers/gpio/zynq_gpio.c
new file mode 100644
index 000..83a2c46
--- /dev/null
+++ b/drivers/gpio/zynq_gpio.c
@@ -0,0 +1,220 @@
+/*
+ * Xilinx Zynq GPIO device driver
+ *
+ * Copyright (C) 2015 DAVE Embedded Systems de...@dave.eu
+ *
+ * Most of code taken from linux kernel driver (linux/drivers/gpio/gpio-zynq.c)
+ * Copyright (C) 2009 - 2014 Xilinx, Inc.
+ *
+ * SPDX-License-Identifier:GPL-2.0+
+ */
+
+#include common.h
+#include asm/gpio.h
+#include asm/io.h
+#include asm/errno.h
+
+/**
+ * zynq_gpio_get_bank_pin - Get the bank number and pin number within that bank
+ * for a given pin in the GPIO device
+ * @pin_num:   gpio pin number within the device
+ * @bank_num:  an output parameter used to return the bank number of the gpio
+ * pin
+ * @bank_pin_num: an output parameter used to return pin number within a bank
+ *   for the given gpio pin
+ *
+ * Returns the bank number