Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[firefly-linux-kernel-4.4.55.git] / drivers / pinctrl / pinctrl-at91.c
index 7cce066c71b6790fd3e4f13f3ff46340fd683e64..f350fd2e170ef3b38ec765764bee32236ba287f4 100644 (file)
@@ -325,7 +325,7 @@ static void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask)
 
 static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin)
 {
-       return (readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1;
+       return !((readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1);
 }
 
 static void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on)
@@ -445,7 +445,7 @@ static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,
 
 static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
 {
-       return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1;
+       return !((__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1);
 }
 
 static void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on)
@@ -736,30 +736,40 @@ static int at91_pinconf_get(struct pinctrl_dev *pctldev,
 }
 
 static int at91_pinconf_set(struct pinctrl_dev *pctldev,
-                            unsigned pin_id, unsigned long config)
+                            unsigned pin_id, unsigned long *configs,
+                            unsigned num_configs)
 {
        struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
        unsigned mask;
        void __iomem *pio;
-
-       dev_dbg(info->dev, "%s:%d, pin_id=%d, config=0x%lx", __func__, __LINE__, pin_id, config);
-       pio = pin_to_controller(info, pin_to_bank(pin_id));
-       mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK);
-
-       if (config & PULL_UP && config & PULL_DOWN)
-               return -EINVAL;
-
-       at91_mux_set_pullup(pio, mask, config & PULL_UP);
-       at91_mux_set_multidrive(pio, mask, config & MULTI_DRIVE);
-       if (info->ops->set_deglitch)
-               info->ops->set_deglitch(pio, mask, config & DEGLITCH);
-       if (info->ops->set_debounce)
-               info->ops->set_debounce(pio, mask, config & DEBOUNCE,
+       int i;
+       unsigned long config;
+
+       for (i = 0; i < num_configs; i++) {
+               config = configs[i];
+
+               dev_dbg(info->dev,
+                       "%s:%d, pin_id=%d, config=0x%lx",
+                       __func__, __LINE__, pin_id, config);
+               pio = pin_to_controller(info, pin_to_bank(pin_id));
+               mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK);
+
+               if (config & PULL_UP && config & PULL_DOWN)
+                       return -EINVAL;
+
+               at91_mux_set_pullup(pio, mask, config & PULL_UP);
+               at91_mux_set_multidrive(pio, mask, config & MULTI_DRIVE);
+               if (info->ops->set_deglitch)
+                       info->ops->set_deglitch(pio, mask, config & DEGLITCH);
+               if (info->ops->set_debounce)
+                       info->ops->set_debounce(pio, mask, config & DEBOUNCE,
                                (config & DEBOUNCE_VAL) >> DEBOUNCE_VAL_SHIFT);
-       if (info->ops->set_pulldown)
-               info->ops->set_pulldown(pio, mask, config & PULL_DOWN);
-       if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT)
-               info->ops->disable_schmitt_trig(pio, mask);
+               if (info->ops->set_pulldown)
+                       info->ops->set_pulldown(pio, mask, config & PULL_DOWN);
+               if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT)
+                       info->ops->disable_schmitt_trig(pio, mask);
+
+       } /* for each config */
 
        return 0;
 }