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-nomadik.c
index a8b8a5377b77a43c9112fe8b1124a222187c1a8b..d7c3ae300fa716555c37dd906f7ed4e74c528393 100644 (file)
@@ -1055,10 +1055,6 @@ static int nmk_gpio_probe(struct platform_device *dev)
                pdata->num_gpio   = NMK_GPIO_PER_CHIP;
        }
 
-       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -ENOENT;
-
        irq = platform_get_irq(dev, 0);
        if (irq < 0)
                return irq;
@@ -1067,6 +1063,7 @@ static int nmk_gpio_probe(struct platform_device *dev)
        if (secondary_irq >= 0 && !pdata->get_secondary_status)
                return -EINVAL;
 
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
        base = devm_ioremap_resource(&dev->dev, res);
        if (IS_ERR(base))
                return PTR_ERR(base);
@@ -1698,7 +1695,7 @@ static int nmk_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
 }
 
 static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
-                             unsigned long config)
+                             unsigned long *configs, unsigned num_configs)
 {
        static const char *pullnames[] = {
                [NMK_GPIO_PULL_NONE]    = "none",
@@ -1715,20 +1712,9 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
        struct pinctrl_gpio_range *range;
        struct gpio_chip *chip;
        unsigned bit;
-
-       /*
-        * The pin config contains pin number and altfunction fields, here
-        * we just ignore that part. It's being handled by the framework and
-        * pinmux callback respectively.
-        */
-       pin_cfg_t cfg = (pin_cfg_t) config;
-       int pull = PIN_PULL(cfg);
-       int slpm = PIN_SLPM(cfg);
-       int output = PIN_DIR(cfg);
-       int val = PIN_VAL(cfg);
-       bool lowemi = PIN_LOWEMI(cfg);
-       bool gpiomode = PIN_GPIOMODE(cfg);
-       bool sleep = PIN_SLEEPMODE(cfg);
+       pin_cfg_t cfg;
+       int pull, slpm, output, val, i;
+       bool lowemi, gpiomode, sleep;
 
        range = nmk_match_gpio_range(pctldev, pin);
        if (!range) {
@@ -1743,54 +1729,74 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
        chip = range->gc;
        nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
 
-       if (sleep) {
-               int slpm_pull = PIN_SLPM_PULL(cfg);
-               int slpm_output = PIN_SLPM_DIR(cfg);
-               int slpm_val = PIN_SLPM_VAL(cfg);
-
-               /* All pins go into GPIO mode at sleep */
-               gpiomode = true;
-
+       for (i = 0; i < num_configs; i++) {
                /*
-                * The SLPM_* values are normal values + 1 to allow zero to
-                * mean "same as normal".
+                * The pin config contains pin number and altfunction fields,
+                * here we just ignore that part. It's being handled by the
+                * framework and pinmux callback respectively.
                 */
-               if (slpm_pull)
-                       pull = slpm_pull - 1;
-               if (slpm_output)
-                       output = slpm_output - 1;
-               if (slpm_val)
-                       val = slpm_val - 1;
-
-               dev_dbg(nmk_chip->chip.dev, "pin %d: sleep pull %s, dir %s, val %s\n",
-                       pin,
-                       slpm_pull ? pullnames[pull] : "same",
-                       slpm_output ? (output ? "output" : "input") : "same",
-                       slpm_val ? (val ? "high" : "low") : "same");
-       }
+               cfg = (pin_cfg_t) configs[i];
+               pull = PIN_PULL(cfg);
+               slpm = PIN_SLPM(cfg);
+               output = PIN_DIR(cfg);
+               val = PIN_VAL(cfg);
+               lowemi = PIN_LOWEMI(cfg);
+               gpiomode = PIN_GPIOMODE(cfg);
+               sleep = PIN_SLEEPMODE(cfg);
+
+               if (sleep) {
+                       int slpm_pull = PIN_SLPM_PULL(cfg);
+                       int slpm_output = PIN_SLPM_DIR(cfg);
+                       int slpm_val = PIN_SLPM_VAL(cfg);
+
+                       /* All pins go into GPIO mode at sleep */
+                       gpiomode = true;
+
+                       /*
+                        * The SLPM_* values are normal values + 1 to allow zero
+                        * to mean "same as normal".
+                        */
+                       if (slpm_pull)
+                               pull = slpm_pull - 1;
+                       if (slpm_output)
+                               output = slpm_output - 1;
+                       if (slpm_val)
+                               val = slpm_val - 1;
+
+                       dev_dbg(nmk_chip->chip.dev,
+                               "pin %d: sleep pull %s, dir %s, val %s\n",
+                               pin,
+                               slpm_pull ? pullnames[pull] : "same",
+                               slpm_output ? (output ? "output" : "input")
+                               : "same",
+                               slpm_val ? (val ? "high" : "low") : "same");
+               }
 
-       dev_dbg(nmk_chip->chip.dev, "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
-               pin, cfg, pullnames[pull], slpmnames[slpm],
-               output ? "output " : "input",
-               output ? (val ? "high" : "low") : "",
-               lowemi ? "on" : "off");
+               dev_dbg(nmk_chip->chip.dev,
+                       "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
+                       pin, cfg, pullnames[pull], slpmnames[slpm],
+                       output ? "output " : "input",
+                       output ? (val ? "high" : "low") : "",
+                       lowemi ? "on" : "off");
 
-       clk_enable(nmk_chip->clk);
-       bit = pin % NMK_GPIO_PER_CHIP;
-       if (gpiomode)
-               /* No glitch when going to GPIO mode */
-               __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
-       if (output)
-               __nmk_gpio_make_output(nmk_chip, bit, val);
-       else {
-               __nmk_gpio_make_input(nmk_chip, bit);
-               __nmk_gpio_set_pull(nmk_chip, bit, pull);
-       }
-       /* TODO: isn't this only applicable on output pins? */
-       __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi);
+               clk_enable(nmk_chip->clk);
+               bit = pin % NMK_GPIO_PER_CHIP;
+               if (gpiomode)
+                       /* No glitch when going to GPIO mode */
+                       __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
+               if (output)
+                       __nmk_gpio_make_output(nmk_chip, bit, val);
+               else {
+                       __nmk_gpio_make_input(nmk_chip, bit);
+                       __nmk_gpio_set_pull(nmk_chip, bit, pull);
+               }
+               /* TODO: isn't this only applicable on output pins? */
+               __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi);
+
+               __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
+               clk_disable(nmk_chip->clk);
+       } /* for each config */
 
-       __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
-       clk_disable(nmk_chip->clk);
        return 0;
 }