gpio: Added zynq specific check for special pins on bank zero
authorNava kishore Manne <nava.manne@xilinx.com>
Fri, 23 Sep 2016 11:26:58 +0000 (16:56 +0530)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 23 Sep 2016 13:26:20 +0000 (15:26 +0200)
This patch adds zynq specific check for bank 0 pins 7 and 8
are special and cannot be used as inputs

Signed-off-by: Nava kishore Manne <navam@xilinx.com>
Reported-by: Jonas Karlsson <Jonas.d.karlsson@gmail.com>
Acked-by: Sören Brinkmann <soren.brinkmann@xilinx.com>
Acked-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-zynq.c

index e72794e463aa3fd5f3adb6e05128a3f01126932b..6b4d10d6e10f6c81bf820e54e7804a0c33e2488b 100644 (file)
@@ -96,6 +96,9 @@
 /* GPIO upper 16 bit mask */
 #define ZYNQ_GPIO_UPPER_MASK 0xFFFF0000
 
+/* For GPIO quirks */
+#define ZYNQ_GPIO_QUIRK_FOO    BIT(0)
+
 /**
  * struct zynq_gpio - gpio device private data structure
  * @chip:      instance of the gpio_chip
@@ -122,6 +125,7 @@ struct zynq_gpio {
 */
 struct zynq_platform_data {
        const char *label;
+       u32 quirks;
        u16 ngpio;
        int max_bank;
        int bank_min[ZYNQMP_GPIO_MAX_BANK];
@@ -238,13 +242,19 @@ static void zynq_gpio_set_value(struct gpio_chip *chip, unsigned int pin,
 static int zynq_gpio_dir_in(struct gpio_chip *chip, unsigned int pin)
 {
        u32 reg;
+       bool is_zynq_gpio;
        unsigned int bank_num, bank_pin_num;
        struct zynq_gpio *gpio = gpiochip_get_data(chip);
 
+       is_zynq_gpio = gpio->p_data->quirks & ZYNQ_GPIO_QUIRK_FOO;
        zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio);
 
-       /* bank 0 pins 7 and 8 are special and cannot be used as inputs */
-       if (bank_num == 0 && (bank_pin_num == 7 || bank_pin_num == 8))
+       /*
+        * On zynq bank 0 pins 7 and 8 are special and cannot be used
+        * as inputs.
+        */
+       if (is_zynq_gpio && bank_num == 0 &&
+               (bank_pin_num == 7 || bank_pin_num == 8))
                return -EINVAL;
 
        /* clear the bit in direction mode reg to set the pin as input */
@@ -627,6 +637,7 @@ static const struct zynq_platform_data zynqmp_gpio_def = {
 
 static const struct zynq_platform_data zynq_gpio_def = {
        .label = "zynq_gpio",
+       .quirks = ZYNQ_GPIO_QUIRK_FOO,
        .ngpio = ZYNQ_GPIO_NR_GPIOS,
        .max_bank = ZYNQ_GPIO_MAX_BANK,
        .bank_min[0] = ZYNQ_GPIO_BANK0_PIN_MIN(),