Merge tag 'pinctrl-v4.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 25 Jun 2015 02:21:02 +0000 (19:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 25 Jun 2015 02:21:02 +0000 (19:21 -0700)
Pull pin control updates from Linus Walleij:
 "Here is the bulk of pin control changes for the v4.2 series: Quite a
  lot of new SoC subdrivers and two new main drivers this time, apart
  from that business as usual.

  Details:

  Core functionality:
   - Enable exclusive pin ownership: it is possible to flag a pin
     controller so that GPIO and other functions cannot use a single pin
     simultaneously.

  New drivers:
   - NXP LPC18xx System Control Unit pin controller
   - Imagination Pistachio SoC pin controller

  New subdrivers:
   - Freescale i.MX7d SoC
   - Intel Sunrisepoint-H PCH
   - Renesas PFC R8A7793
   - Renesas PFC R8A7794
   - Mediatek MT6397, MT8127
   - SiRF Atlas 7
   - Allwinner A33
   - Qualcomm MSM8660
   - Marvell Armada 395
   - Rockchip RK3368

  Cleanups:
   - A big cleanup of the Marvell MVEBU driver rectifying it to
     correspond to reality
   - Drop platform device probing from the SH PFC driver, we are now a
     DT only shop for SuperH
   - Drop obsolte multi-platform check for SH PFC
   - Various janitorial: constification, grammar etc

  Improvements:
   - The AT91 GPIO portions now supports the set_multiple() feature
   - Split out SPI pins on the Xilinx Zynq
   - Support DTs without specific function nodes in the i.MX driver"

* tag 'pinctrl-v4.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (99 commits)
  pinctrl: rockchip: add support for the rk3368
  pinctrl: rockchip: generalize perpin driver-strength setting
  pinctrl: sh-pfc: r8a7794: add SDHI pin groups
  pinctrl: sh-pfc: r8a7794: add MMCIF pin groups
  pinctrl: sh-pfc: add R8A7794 PFC support
  pinctrl: make pinctrl_register() return proper error code
  pinctrl: mvebu: armada-39x: add support for Armada 395 variant
  pinctrl: mvebu: armada-39x: add missing SATA functions
  pinctrl: mvebu: armada-39x: add missing PCIe functions
  pinctrl: mvebu: armada-38x: add ptp functions
  pinctrl: mvebu: armada-38x: add ua1 functions
  pinctrl: mvebu: armada-38x: add nand functions
  pinctrl: mvebu: armada-38x: add sata functions
  pinctrl: mvebu: armada-xp: add dram functions
  pinctrl: mvebu: armada-xp: add nand rb function
  pinctrl: mvebu: armada-xp: add spi1 function
  pinctrl: mvebu: armada-39x: normalize ref clock naming
  pinctrl: mvebu: armada-xp: rename spi to spi0
  pinctrl: mvebu: armada-370: align spi1 clock pin naming
  pinctrl: mvebu: armada-370: align VDD cpu-pd pin naming with datasheet
  ...

1  2 
drivers/gpio/gpio-bcm-kona.c
drivers/pinctrl/bcm/pinctrl-cygnus-gpio.c
drivers/pinctrl/core.c
drivers/pinctrl/intel/pinctrl-cherryview.c
drivers/pinctrl/mediatek/pinctrl-mtk-common.c
drivers/pinctrl/meson/pinctrl-meson.c
drivers/pinctrl/mvebu/pinctrl-armada-370.c
drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
drivers/pinctrl/qcom/pinctrl-spmi-mpp.c

@@@ -122,16 -122,6 +122,16 @@@ static void bcm_kona_gpio_unlock_gpio(s
        spin_unlock_irqrestore(&kona_gpio->lock, flags);
  }
  
 +static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
 +{
 +      struct bcm_kona_gpio *kona_gpio = to_kona_gpio(chip);
 +      void __iomem *reg_base = kona_gpio->reg_base;
 +      u32 val;
 +
 +      val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK;
 +      return val ? GPIOF_DIR_IN : GPIOF_DIR_OUT;
 +}
 +
  static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
  {
        struct bcm_kona_gpio *kona_gpio;
        reg_base = kona_gpio->reg_base;
        spin_lock_irqsave(&kona_gpio->lock, flags);
  
 -      /* determine the GPIO pin direction */
 -      val = readl(reg_base + GPIO_CONTROL(gpio));
 -      val &= GPIO_GPCTR0_IOTR_MASK;
 -
        /* this function only applies to output pin */
 -      if (GPIO_GPCTR0_IOTR_CMD_INPUT == val)
 +      if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN)
                goto out;
  
        reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id);
@@@ -172,12 -166,13 +172,12 @@@ static int bcm_kona_gpio_get(struct gpi
        reg_base = kona_gpio->reg_base;
        spin_lock_irqsave(&kona_gpio->lock, flags);
  
 -      /* determine the GPIO pin direction */
 -      val = readl(reg_base + GPIO_CONTROL(gpio));
 -      val &= GPIO_GPCTR0_IOTR_MASK;
 +      if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN)
 +              reg_offset = GPIO_IN_STATUS(bank_id);
 +      else
 +              reg_offset = GPIO_OUT_STATUS(bank_id);
  
        /* read the GPIO bank status */
 -      reg_offset = (GPIO_GPCTR0_IOTR_CMD_INPUT == val) ?
 -          GPIO_IN_STATUS(bank_id) : GPIO_OUT_STATUS(bank_id);
        val = readl(reg_base + reg_offset);
  
        spin_unlock_irqrestore(&kona_gpio->lock, flags);
@@@ -315,7 -310,6 +315,7 @@@ static struct gpio_chip template_chip 
        .owner = THIS_MODULE,
        .request = bcm_kona_gpio_request,
        .free = bcm_kona_gpio_free,
 +      .get_direction = bcm_kona_gpio_get_dir,
        .direction_input = bcm_kona_gpio_direction_input,
        .get = bcm_kona_gpio_get,
        .direction_output = bcm_kona_gpio_direction_output,
@@@ -540,7 -534,7 +540,7 @@@ static void bcm_kona_gpio_irq_unmap(str
        irq_set_chip_data(irq, NULL);
  }
  
- static struct irq_domain_ops bcm_kona_irq_ops = {
+ static const struct irq_domain_ops bcm_kona_irq_ops = {
        .map = bcm_kona_gpio_irq_map,
        .unmap = bcm_kona_gpio_irq_unmap,
        .xlate = irq_domain_xlate_twocell,
@@@ -38,7 -38,7 +38,7 @@@
  #define CYGNUS_GPIO_DATA_IN_OFFSET   0x00
  #define CYGNUS_GPIO_DATA_OUT_OFFSET  0x04
  #define CYGNUS_GPIO_OUT_EN_OFFSET    0x08
- #define CYGNUS_GPIO_IN_TYPE_OFFSET   0x0c
+ #define CYGNUS_GPIO_INT_TYPE_OFFSET  0x0c
  #define CYGNUS_GPIO_INT_DE_OFFSET    0x10
  #define CYGNUS_GPIO_INT_EDGE_OFFSET  0x14
  #define CYGNUS_GPIO_INT_MSK_OFFSET   0x18
@@@ -264,7 -264,7 +264,7 @@@ static int cygnus_gpio_irq_set_type(str
        }
  
        spin_lock_irqsave(&chip->lock, flags);
-       cygnus_set_bit(chip, CYGNUS_GPIO_IN_TYPE_OFFSET, gpio,
+       cygnus_set_bit(chip, CYGNUS_GPIO_INT_TYPE_OFFSET, gpio,
                       level_triggered);
        cygnus_set_bit(chip, CYGNUS_GPIO_INT_DE_OFFSET, gpio, dual_edge);
        cygnus_set_bit(chip, CYGNUS_GPIO_INT_EDGE_OFFSET, gpio,
@@@ -643,9 -643,7 +643,9 @@@ static const struct cygnus_gpio_pin_ran
        CYGNUS_PINRANGE(87, 104, 12),
        CYGNUS_PINRANGE(99, 102, 2),
        CYGNUS_PINRANGE(101, 90, 4),
 -      CYGNUS_PINRANGE(105, 116, 10),
 +      CYGNUS_PINRANGE(105, 116, 6),
 +      CYGNUS_PINRANGE(111, 100, 2),
 +      CYGNUS_PINRANGE(113, 122, 4),
        CYGNUS_PINRANGE(123, 11, 1),
        CYGNUS_PINRANGE(124, 38, 4),
        CYGNUS_PINRANGE(128, 43, 1),
@@@ -750,9 -748,9 +750,9 @@@ static int cygnus_gpio_register_pinconf
        pctldesc->confops = &cygnus_pconf_ops;
  
        chip->pctl = pinctrl_register(pctldesc, chip->dev, chip);
-       if (!chip->pctl) {
+       if (IS_ERR(chip->pctl)) {
                dev_err(chip->dev, "unable to register pinctrl device\n");
-               return -EINVAL;
+               return PTR_ERR(chip->pctl);
        }
  
        return 0;
diff --combined drivers/pinctrl/core.c
@@@ -558,7 -558,7 +558,7 @@@ int pinctrl_get_group_selector(struct p
  }
  
  /**
-  * pinctrl_request_gpio() - request a single pin to be used in as GPIO
+  * pinctrl_request_gpio() - request a single pin to be used as GPIO
   * @gpio: the GPIO pin number from the GPIO subsystem number space
   *
   * This function should *ONLY* be used from gpiolib-based GPIO drivers,
@@@ -1110,12 -1110,12 +1110,12 @@@ void devm_pinctrl_put(struct pinctrl *p
  EXPORT_SYMBOL_GPL(devm_pinctrl_put);
  
  int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
 -                       bool dup, bool locked)
 +                       bool dup)
  {
        int i, ret;
        struct pinctrl_maps *maps_node;
  
-       pr_debug("add %d pinmux maps\n", num_maps);
+       pr_debug("add %u pinctrl maps\n", num_maps);
  
        /* First sanity check the new mapping */
        for (i = 0; i < num_maps; i++) {
                maps_node->maps = maps;
        }
  
 -      if (!locked)
 -              mutex_lock(&pinctrl_maps_mutex);
 +      mutex_lock(&pinctrl_maps_mutex);
        list_add_tail(&maps_node->node, &pinctrl_maps);
 -      if (!locked)
 -              mutex_unlock(&pinctrl_maps_mutex);
 +      mutex_unlock(&pinctrl_maps_mutex);
  
        return 0;
  }
  int pinctrl_register_mappings(struct pinctrl_map const *maps,
                              unsigned num_maps)
  {
 -      return pinctrl_register_map(maps, num_maps, true, false);
 +      return pinctrl_register_map(maps, num_maps, true);
  }
  
  void pinctrl_unregister_map(struct pinctrl_map const *map)
@@@ -1704,14 -1706,14 +1704,14 @@@ struct pinctrl_dev *pinctrl_register(st
        int ret;
  
        if (!pctldesc)
-               return NULL;
+               return ERR_PTR(-EINVAL);
        if (!pctldesc->name)
-               return NULL;
+               return ERR_PTR(-EINVAL);
  
        pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
        if (pctldev == NULL) {
                dev_err(dev, "failed to alloc struct pinctrl_dev\n");
-               return NULL;
+               return ERR_PTR(-ENOMEM);
        }
  
        /* Initialize pin control device struct */
        mutex_init(&pctldev->mutex);
  
        /* check core ops for sanity */
-       if (pinctrl_check_ops(pctldev)) {
+       ret = pinctrl_check_ops(pctldev);
+       if (ret) {
                dev_err(dev, "pinctrl ops lacks necessary functions\n");
                goto out_err;
        }
  
        /* If we're implementing pinmuxing, check the ops for sanity */
        if (pctldesc->pmxops) {
-               if (pinmux_check_ops(pctldev))
+               ret = pinmux_check_ops(pctldev);
+               if (ret)
                        goto out_err;
        }
  
        /* If we're implementing pinconfig, check the ops for sanity */
        if (pctldesc->confops) {
-               if (pinconf_check_ops(pctldev))
+               ret = pinconf_check_ops(pctldev);
+               if (ret)
                        goto out_err;
        }
  
  out_err:
        mutex_destroy(&pctldev->mutex);
        kfree(pctldev);
-       return NULL;
+       return ERR_PTR(ret);
  }
  EXPORT_SYMBOL_GPL(pinctrl_register);
  
@@@ -1292,49 -1292,6 +1292,49 @@@ static void chv_gpio_irq_unmask(struct 
        chv_gpio_irq_mask_unmask(d, false);
  }
  
 +static unsigned chv_gpio_irq_startup(struct irq_data *d)
 +{
 +      /*
 +       * Check if the interrupt has been requested with 0 as triggering
 +       * type. In that case it is assumed that the current values
 +       * programmed to the hardware are used (e.g BIOS configured
 +       * defaults).
 +       *
 +       * In that case ->irq_set_type() will never be called so we need to
 +       * read back the values from hardware now, set correct flow handler
 +       * and update mappings before the interrupt is being used.
 +       */
 +      if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) {
 +              struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 +              struct chv_pinctrl *pctrl = gpiochip_to_pinctrl(gc);
 +              unsigned offset = irqd_to_hwirq(d);
 +              int pin = chv_gpio_offset_to_pin(pctrl, offset);
 +              irq_flow_handler_t handler;
 +              unsigned long flags;
 +              u32 intsel, value;
 +
 +              intsel = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0));
 +              intsel &= CHV_PADCTRL0_INTSEL_MASK;
 +              intsel >>= CHV_PADCTRL0_INTSEL_SHIFT;
 +
 +              value = readl(chv_padreg(pctrl, pin, CHV_PADCTRL1));
 +              if (value & CHV_PADCTRL1_INTWAKECFG_LEVEL)
 +                      handler = handle_level_irq;
 +              else
 +                      handler = handle_edge_irq;
 +
 +              spin_lock_irqsave(&pctrl->lock, flags);
 +              if (!pctrl->intr_lines[intsel]) {
 +                      __irq_set_handler_locked(d->irq, handler);
 +                      pctrl->intr_lines[intsel] = offset;
 +              }
 +              spin_unlock_irqrestore(&pctrl->lock, flags);
 +      }
 +
 +      chv_gpio_irq_unmask(d);
 +      return 0;
 +}
 +
  static int chv_gpio_irq_type(struct irq_data *d, unsigned type)
  {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
  
  static struct irq_chip chv_gpio_irqchip = {
        .name = "chv-gpio",
 +      .irq_startup = chv_gpio_irq_startup,
        .irq_ack = chv_gpio_irq_ack,
        .irq_mask = chv_gpio_irq_mask,
        .irq_unmask = chv_gpio_irq_unmask,
@@@ -1533,9 -1489,9 +1533,9 @@@ static int chv_pinctrl_probe(struct pla
        pctrl->pctldesc.npins = pctrl->community->npins;
  
        pctrl->pctldev = pinctrl_register(&pctrl->pctldesc, &pdev->dev, pctrl);
-       if (!pctrl->pctldev) {
+       if (IS_ERR(pctrl->pctldev)) {
                dev_err(&pdev->dev, "failed to register pinctrl driver\n");
-               return -ENODEV;
+               return PTR_ERR(pctrl->pctldev);
        }
  
        ret = chv_gpio_probe(pctrl, irq);
@@@ -107,28 -107,38 +107,38 @@@ static void mtk_gpio_set(struct gpio_ch
        regmap_write(mtk_get_regmap(pctl, offset), reg_addr, bit);
  }
  
- static void mtk_pconf_set_ies_smt(struct mtk_pinctrl *pctl, unsigned pin,
-               int value, enum pin_config_param param)
+ static int mtk_pconf_set_ies_smt(struct mtk_pinctrl *pctl, unsigned pin,
+               int value, enum pin_config_param arg)
  {
        unsigned int reg_addr, offset;
        unsigned int bit;
-       int ret;
+       /**
+        * Due to some soc are not support ies/smt config, add this special
+        * control to handle it.
+        */
+       if (!pctl->devdata->spec_ies_smt_set &&
+               pctl->devdata->ies_offset == MTK_PINCTRL_NOT_SUPPORT &&
+                       arg == PIN_CONFIG_INPUT_ENABLE)
+               return -EINVAL;
+       if (!pctl->devdata->spec_ies_smt_set &&
+               pctl->devdata->smt_offset == MTK_PINCTRL_NOT_SUPPORT &&
+                       arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
+               return -EINVAL;
  
        /*
         * Due to some pins are irregular, their input enable and smt
-        * control register are discontinuous, but they are mapping together.
-        * So we need this special handle.
+        * control register are discontinuous, so we need this special handle.
         */
        if (pctl->devdata->spec_ies_smt_set) {
-               ret = pctl->devdata->spec_ies_smt_set(mtk_get_regmap(pctl, pin),
-                       pin, pctl->devdata->port_align, value);
-               if (!ret)
-                       return;
+               return pctl->devdata->spec_ies_smt_set(mtk_get_regmap(pctl, pin),
+                       pin, pctl->devdata->port_align, value, arg);
        }
  
        bit = BIT(pin & 0xf);
  
-       if (param == PIN_CONFIG_INPUT_ENABLE)
+       if (arg == PIN_CONFIG_INPUT_ENABLE)
                offset = pctl->devdata->ies_offset;
        else
                offset = pctl->devdata->smt_offset;
                reg_addr = CLR_ADDR(mtk_get_port(pctl, pin) + offset, pctl);
  
        regmap_write(mtk_get_regmap(pctl, pin), reg_addr, bit);
+       return 0;
+ }
+ int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
+               const struct mtk_pin_ies_smt_set *ies_smt_infos, unsigned int info_num,
+               unsigned int pin, unsigned char align, int value)
+ {
+       unsigned int i, reg_addr, bit;
+       for (i = 0; i < info_num; i++) {
+               if (pin >= ies_smt_infos[i].start &&
+                               pin <= ies_smt_infos[i].end) {
+                       break;
+               }
+       }
+       if (i == info_num)
+               return -EINVAL;
+       if (value)
+               reg_addr = ies_smt_infos[i].offset + align;
+       else
+               reg_addr = ies_smt_infos[i].offset + (align << 1);
+       bit = BIT(ies_smt_infos[i].bit);
+       regmap_write(regmap, reg_addr, bit);
+       return 0;
  }
  
  static const struct mtk_pin_drv_grp *mtk_find_pin_drv_grp_by_pin(
@@@ -186,6 -223,66 +223,66 @@@ static int mtk_pconf_set_driving(struc
        return -EINVAL;
  }
  
+ int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap,
+               const struct mtk_pin_spec_pupd_set_samereg *pupd_infos,
+               unsigned int info_num, unsigned int pin,
+               unsigned char align, bool isup, unsigned int r1r0)
+ {
+       unsigned int i;
+       unsigned int reg_pupd, reg_set, reg_rst;
+       unsigned int bit_pupd, bit_r0, bit_r1;
+       const struct mtk_pin_spec_pupd_set_samereg *spec_pupd_pin;
+       bool find = false;
+       for (i = 0; i < info_num; i++) {
+               if (pin == pupd_infos[i].pin) {
+                       find = true;
+                       break;
+               }
+       }
+       if (!find)
+               return -EINVAL;
+       spec_pupd_pin = pupd_infos + i;
+       reg_set = spec_pupd_pin->offset + align;
+       reg_rst = spec_pupd_pin->offset + (align << 1);
+       if (isup)
+               reg_pupd = reg_rst;
+       else
+               reg_pupd = reg_set;
+       bit_pupd = BIT(spec_pupd_pin->pupd_bit);
+       regmap_write(regmap, reg_pupd, bit_pupd);
+       bit_r0 = BIT(spec_pupd_pin->r0_bit);
+       bit_r1 = BIT(spec_pupd_pin->r1_bit);
+       switch (r1r0) {
+       case MTK_PUPD_SET_R1R0_00:
+               regmap_write(regmap, reg_rst, bit_r0);
+               regmap_write(regmap, reg_rst, bit_r1);
+               break;
+       case MTK_PUPD_SET_R1R0_01:
+               regmap_write(regmap, reg_set, bit_r0);
+               regmap_write(regmap, reg_rst, bit_r1);
+               break;
+       case MTK_PUPD_SET_R1R0_10:
+               regmap_write(regmap, reg_rst, bit_r0);
+               regmap_write(regmap, reg_set, bit_r1);
+               break;
+       case MTK_PUPD_SET_R1R0_11:
+               regmap_write(regmap, reg_set, bit_r0);
+               regmap_write(regmap, reg_set, bit_r1);
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+ }
  static int mtk_pconf_set_pull_select(struct mtk_pinctrl *pctl,
                unsigned int pin, bool enable, bool isup, unsigned int arg)
  {
@@@ -235,36 -332,37 +332,37 @@@ static int mtk_pconf_parse_conf(struct 
                unsigned int pin, enum pin_config_param param,
                enum pin_config_param arg)
  {
+       int ret = 0;
        struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  
        switch (param) {
        case PIN_CONFIG_BIAS_DISABLE:
-               mtk_pconf_set_pull_select(pctl, pin, false, false, arg);
+               ret = mtk_pconf_set_pull_select(pctl, pin, false, false, arg);
                break;
        case PIN_CONFIG_BIAS_PULL_UP:
-               mtk_pconf_set_pull_select(pctl, pin, true, true, arg);
+               ret = mtk_pconf_set_pull_select(pctl, pin, true, true, arg);
                break;
        case PIN_CONFIG_BIAS_PULL_DOWN:
-               mtk_pconf_set_pull_select(pctl, pin, true, false, arg);
+               ret = mtk_pconf_set_pull_select(pctl, pin, true, false, arg);
                break;
        case PIN_CONFIG_INPUT_ENABLE:
-               mtk_pconf_set_ies_smt(pctl, pin, arg, param);
+               ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param);
                break;
        case PIN_CONFIG_OUTPUT:
                mtk_gpio_set(pctl->chip, pin, arg);
-               mtk_pmx_gpio_set_direction(pctldev, NULL, pin, false);
+               ret = mtk_pmx_gpio_set_direction(pctldev, NULL, pin, false);
                break;
        case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
-               mtk_pconf_set_ies_smt(pctl, pin, arg, param);
+               ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param);
                break;
        case PIN_CONFIG_DRIVE_STRENGTH:
-               mtk_pconf_set_driving(pctl, pin, arg);
+               ret = mtk_pconf_set_driving(pctl, pin, arg);
                break;
        default:
-               return -EINVAL;
+               ret = -EINVAL;
        }
  
-       return 0;
+       return ret;
  }
  
  static int mtk_pconf_group_get(struct pinctrl_dev *pctldev,
@@@ -283,12 -381,14 +381,14 @@@ static int mtk_pconf_group_set(struct p
  {
        struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
        struct mtk_pinctrl_group *g = &pctl->groups[group];
-       int i;
+       int i, ret;
  
        for (i = 0; i < num_configs; i++) {
-               mtk_pconf_parse_conf(pctldev, g->pin,
+               ret = mtk_pconf_parse_conf(pctldev, g->pin,
                        pinconf_to_config_param(configs[i]),
                        pinconf_to_config_argument(configs[i]));
+               if (ret < 0)
+                       return ret;
  
                g->config = configs[i];
        }
@@@ -881,8 -981,6 +981,8 @@@ static int mtk_gpio_set_debounce(struc
        if (!mtk_eint_get_mask(pctl, eint_num)) {
                mtk_eint_mask(d);
                unmask = 1;
 +      } else {
 +              unmask = 0;
        }
  
        clr_bit = 0xff << eint_offset;
@@@ -1109,7 -1207,8 +1209,8 @@@ static struct pinctrl_desc mtk_pctrl_de
  };
  
  int mtk_pctrl_init(struct platform_device *pdev,
-               const struct mtk_pinctrl_devdata *data)
+               const struct mtk_pinctrl_devdata *data,
+               struct regmap *regmap)
  {
        struct pinctrl_pin_desc *pins;
        struct mtk_pinctrl *pctl;
                pctl->regmap1 = syscon_node_to_regmap(node);
                if (IS_ERR(pctl->regmap1))
                        return PTR_ERR(pctl->regmap1);
+       } else if (regmap) {
+               pctl->regmap1  = regmap;
+       } else {
+               dev_err(&pdev->dev, "Pinctrl node has not register regmap.\n");
+               return -EINVAL;
        }
  
        /* Only 8135 has two base addr, other SoCs have only one. */
        mtk_pctrl_desc.npins = pctl->devdata->npins;
        pctl->dev = &pdev->dev;
        pctl->pctl_dev = pinctrl_register(&mtk_pctrl_desc, &pdev->dev, pctl);
-       if (!pctl->pctl_dev) {
+       if (IS_ERR(pctl->pctl_dev)) {
                dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
-               return -EINVAL;
+               return PTR_ERR(pctl->pctl_dev);
        }
  
        pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
                goto pctrl_error;
        }
  
-       pctl->chip = &mtk_gpio_chip;
+       *pctl->chip = mtk_gpio_chip;
        pctl->chip->ngpio = pctl->devdata->npins;
        pctl->chip->label = dev_name(&pdev->dev);
        pctl->chip->dev = &pdev->dev;
-       pctl->chip->base = 0;
+       pctl->chip->base = -1;
  
        ret = gpiochip_add(pctl->chip);
        if (ret) {
                goto chip_error;
        }
  
+       if (!of_property_read_bool(np, "interrupt-controller"))
+               return 0;
        /* Get EINT register base from dts. */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
@@@ -569,7 -569,7 +569,7 @@@ static int meson_gpiolib_register(struc
                domain->chip.direction_output = meson_gpio_direction_output;
                domain->chip.get = meson_gpio_get;
                domain->chip.set = meson_gpio_set;
 -              domain->chip.base = -1;
 +              domain->chip.base = domain->data->pin_base;
                domain->chip.ngpio = domain->data->num_pins;
                domain->chip.can_sleep = false;
                domain->chip.of_node = domain->of_node;
@@@ -738,9 -738,9 +738,9 @@@ static int meson_pinctrl_probe(struct p
        pc->desc.npins          = pc->data->num_pins;
  
        pc->pcdev = pinctrl_register(&pc->desc, pc->dev, pc);
-       if (!pc->pcdev) {
+       if (IS_ERR(pc->pcdev)) {
                dev_err(pc->dev, "can't register pinctrl device");
-               return -EINVAL;
+               return PTR_ERR(pc->pcdev);
        }
  
        ret = meson_gpiolib_register(pc);
@@@ -52,12 -52,12 +52,12 @@@ static struct mvebu_mpp_mode mv88f6710_
           MPP_FUNCTION(0x2, "uart0", "rxd")),
        MPP_MODE(4,
           MPP_FUNCTION(0x0, "gpio", NULL),
-          MPP_FUNCTION(0x1, "cpu_pd", "vdd")),
+          MPP_FUNCTION(0x1, "vdd", "cpu-pd")),
        MPP_MODE(5,
           MPP_FUNCTION(0x0, "gpo", NULL),
-          MPP_FUNCTION(0x1, "ge0", "txclko"),
+          MPP_FUNCTION(0x1, "ge0", "txclkout"),
           MPP_FUNCTION(0x2, "uart1", "txd"),
-          MPP_FUNCTION(0x4, "spi1", "clk"),
+          MPP_FUNCTION(0x4, "spi1", "sck"),
           MPP_FUNCTION(0x5, "audio", "mclk")),
        MPP_MODE(6,
           MPP_FUNCTION(0x0, "gpio", NULL),
@@@ -68,7 -68,7 +68,7 @@@
        MPP_MODE(7,
           MPP_FUNCTION(0x0, "gpo", NULL),
           MPP_FUNCTION(0x1, "ge0", "txd1"),
-          MPP_FUNCTION(0x4, "tdm", "tdx"),
+          MPP_FUNCTION(0x4, "tdm", "dtx"),
           MPP_FUNCTION(0x5, "audio", "lrclk")),
        MPP_MODE(8,
           MPP_FUNCTION(0x0, "gpio", NULL),
           MPP_FUNCTION(0x2, "spi0", "cs0")),
        MPP_MODE(34,
           MPP_FUNCTION(0x0, "gpo", NULL),
-          MPP_FUNCTION(0x1, "dev", "wen0"),
+          MPP_FUNCTION(0x1, "dev", "we0"),
           MPP_FUNCTION(0x2, "spi0", "mosi")),
        MPP_MODE(35,
           MPP_FUNCTION(0x0, "gpo", NULL),
-          MPP_FUNCTION(0x1, "dev", "oen"),
+          MPP_FUNCTION(0x1, "dev", "oe"),
           MPP_FUNCTION(0x2, "spi0", "sck")),
        MPP_MODE(36,
           MPP_FUNCTION(0x0, "gpo", NULL),
           MPP_FUNCTION(0x1, "dev", "ale1"),
           MPP_FUNCTION(0x2, "uart1", "rxd"),
           MPP_FUNCTION(0x3, "sata0", "prsnt"),
-          MPP_FUNCTION(0x4, "pcie", "rst-out"),
+          MPP_FUNCTION(0x4, "pcie", "rstout"),
           MPP_FUNCTION(0x5, "audio", "sdi")),
        MPP_MODE(61,
           MPP_FUNCTION(0x0, "gpo", NULL),
-          MPP_FUNCTION(0x1, "dev", "wen1"),
+          MPP_FUNCTION(0x1, "dev", "we1"),
           MPP_FUNCTION(0x2, "uart1", "txd"),
-          MPP_FUNCTION(0x5, "audio", "rclk")),
+          MPP_FUNCTION(0x5, "audio", "lrclk")),
        MPP_MODE(62,
           MPP_FUNCTION(0x0, "gpio", NULL),
           MPP_FUNCTION(0x1, "dev", "a2"),
           MPP_FUNCTION(0x5, "audio", "mclk"),
           MPP_FUNCTION(0x6, "uart0", "cts")),
        MPP_MODE(63,
 -         MPP_FUNCTION(0x0, "gpo", NULL),
 +         MPP_FUNCTION(0x0, "gpio", NULL),
           MPP_FUNCTION(0x1, "spi0", "sck"),
           MPP_FUNCTION(0x2, "tclk", NULL)),
        MPP_MODE(64,
           MPP_FUNCTION(0x0, "gpio", NULL),
           MPP_FUNCTION(0x1, "spi0", "miso"),
-          MPP_FUNCTION(0x2, "spi0-1", "cs1")),
+          MPP_FUNCTION(0x2, "spi0", "cs1")),
        MPP_MODE(65,
           MPP_FUNCTION(0x0, "gpio", NULL),
           MPP_FUNCTION(0x1, "spi0", "mosi"),
-          MPP_FUNCTION(0x2, "spi0-1", "cs2")),
+          MPP_FUNCTION(0x2, "spi0", "cs2")),
  };
  
  static struct mvebu_pinctrl_soc_info armada_370_pinctrl_info;
@@@ -260,7 -260,6 +260,7 @@@ static int pmic_gpio_set_mux(struct pin
                        val = 1;
        }
  
 +      val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
        val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
        val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
  
@@@ -418,7 -417,7 +418,7 @@@ static int pmic_gpio_config_set(struct 
                return ret;
  
        val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT;
 -      val = pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
 +      val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
  
        ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL, val);
        if (ret < 0)
@@@ -467,13 -466,12 +467,13 @@@ static void pmic_gpio_config_dbg_show(s
                seq_puts(s, " ---");
        } else {
  
 -              if (!pad->input_enabled) {
 +              if (pad->input_enabled) {
                        ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
 -                      if (!ret) {
 -                              ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
 -                              pad->out_value = ret;
 -                      }
 +                      if (ret < 0)
 +                              return;
 +
 +                      ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
 +                      pad->out_value = ret;
                }
  
                seq_printf(s, " %-4s", pad->output_enabled ? "out" : "in");
@@@ -778,8 -776,8 +778,8 @@@ static int pmic_gpio_probe(struct platf
        state->chip.can_sleep = false;
  
        state->ctrl = pinctrl_register(pctrldesc, dev, state);
-       if (!state->ctrl)
-               return -ENODEV;
+       if (IS_ERR(state->ctrl))
+               return PTR_ERR(state->ctrl);
  
        ret = gpiochip_add(&state->chip);
        if (ret) {
@@@ -370,7 -370,6 +370,7 @@@ static int pmic_mpp_set_mux(struct pinc
                }
        }
  
 +      val = val << PMIC_MPP_REG_MODE_DIR_SHIFT;
        val |= pad->function << PMIC_MPP_REG_MODE_FUNCTION_SHIFT;
        val |= pad->out_value & PMIC_MPP_REG_MODE_VALUE_MASK;
  
@@@ -577,11 -576,10 +577,11 @@@ static void pmic_mpp_config_dbg_show(st
  
                if (pad->input_enabled) {
                        ret = pmic_mpp_read(state, pad, PMIC_MPP_REG_RT_STS);
 -                      if (!ret) {
 -                              ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
 -                              pad->out_value = ret;
 -                      }
 +                      if (ret < 0)
 +                              return;
 +
 +                      ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
 +                      pad->out_value = ret;
                }
  
                seq_printf(s, " %-4s", pad->output_enabled ? "out" : "in");
@@@ -892,8 -890,8 +892,8 @@@ static int pmic_mpp_probe(struct platfo
        state->chip.can_sleep = false;
  
        state->ctrl = pinctrl_register(pctrldesc, dev, state);
-       if (!state->ctrl)
-               return -ENODEV;
+       if (IS_ERR(state->ctrl))
+               return PTR_ERR(state->ctrl);
  
        ret = gpiochip_add(&state->chip);
        if (ret) {