]> Git Repo - linux.git/commitdiff
Merge tag 'pinctrl-v4.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <[email protected]>
Thu, 19 May 2016 19:50:56 +0000 (12:50 -0700)
committerLinus Torvalds <[email protected]>
Thu, 19 May 2016 19:50:56 +0000 (12:50 -0700)
Pull pin control updates from Linus Walleij:
 "This kernel cycle was quite calm when it comes to pin control and
  there is really just one major change, and that is the introduction of
  devm_pinctrl_register() managed resources.

  Apart from that linear development, details below.

  Core changes:

   - Add the devm_pinctrl_register() API and switch all applicable
     drivers to use it, saving lots of lines of code all over the place.

  New drivers:

   - driver for the Broadcom NS2 SoC

   - subdriver for the PXA25x SoCs

   - subdriver for the AMLogic Meson GXBB SoC

  Driver improvements:

   - the Intel Baytrail driver now properly supports pin control

   - Nomadik, Rockchip, Broadcom BCM2835 support the .get_direction()
     callback in the GPIO portions

   - continued development and stabilization of several SH-PFC SoC
     subdrivers: r8a7795, r8a7790, r8a7794 etc"

* tag 'pinctrl-v4.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (85 commits)
  Revert "pinctrl: tegra: avoid parked_reg and parked_bank"
  pinctrl: meson: Fix eth_tx_en bit index
  pinctrl: tegra: avoid parked_reg and parked_bank
  pinctrl: tegra: Correctly check the supported configuration
  pinctrl: amlogic: Add support for Amlogic Meson GXBB SoC
  pinctrl: rockchip: fix pull setting error for rk3399
  pinctrl: stm32: Implement .pin_config_dbg_show()
  pinctrl: nomadik: hide nmk_gpio_get_mode when unused
  pinctrl: ns2: rename pinctrl_utils_dt_free_map
  pinctrl: at91: Merge clk_prepare and clk_enable into clk_prepare_enable
  pinctrl: at91: Make at91_gpio_template const
  pinctrl: baytrail: fix some error handling in debugfs
  pinctrl: ns2: add pinmux driver support for Broadcom NS2 SoC
  pinctrl: sirf/atlas7: trivial fix of spelling mistake on flagged
  pinctrl: sh-pfc: Kill unused variable in sh_pfc_remove()
  pinctrl: nomadik: implement .get_direction()
  pinctrl: nomadik: use BIT() with offsets consequently
  pinctrl: exynos5440: Use off-stack memory for pinctrl_gpio_range
  pinctrl: zynq: Use devm_pinctrl_register() for pinctrl registration
  pinctrl: u300: Use devm_pinctrl_register() for pinctrl registration
  ...

1  2 
drivers/pinctrl/freescale/pinctrl-imx.c
drivers/pinctrl/intel/pinctrl-intel.c
drivers/pinctrl/mediatek/pinctrl-mtk-common.c
drivers/pinctrl/nomadik/pinctrl-nomadik.c
drivers/pinctrl/pinctrl-at91-pio4.c
drivers/pinctrl/pinctrl-pistachio.c
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/stm32/pinctrl-stm32.c
drivers/pinctrl/sunxi/pinctrl-sunxi.c
drivers/pinctrl/tegra/pinctrl-tegra-xusb.c

index 9cfa544072b5a357251889328e2bff7e576ed88c,74d603501eec5fe3e4cbef615e90e2cd188c1548..47ccfcc8a647ccacdd0880ab770dc2c102d2ba9c
@@@ -762,18 -762,19 +762,18 @@@ int imx_pinctrl_probe(struct platform_d
  
        if (of_property_read_bool(dev_np, "fsl,input-sel")) {
                np = of_parse_phandle(dev_np, "fsl,input-sel", 0);
 -              if (np) {
 -                      ipctl->input_sel_base = of_iomap(np, 0);
 -                      if (IS_ERR(ipctl->input_sel_base)) {
 -                              of_node_put(np);
 -                              dev_err(&pdev->dev,
 -                                      "iomuxc input select base address not found\n");
 -                              return PTR_ERR(ipctl->input_sel_base);
 -                      }
 -              } else {
 +              if (!np) {
                        dev_err(&pdev->dev, "iomuxc fsl,input-sel property not found\n");
                        return -EINVAL;
                }
 +
 +              ipctl->input_sel_base = of_iomap(np, 0);
                of_node_put(np);
 +              if (!ipctl->input_sel_base) {
 +                      dev_err(&pdev->dev,
 +                              "iomuxc input select base address not found\n");
 +                      return -ENOMEM;
 +              }
        }
  
        imx_pinctrl_desc.name = dev_name(&pdev->dev);
        ipctl->info = info;
        ipctl->dev = info->dev;
        platform_set_drvdata(pdev, ipctl);
-       ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl);
+       ipctl->pctl = devm_pinctrl_register(&pdev->dev, &imx_pinctrl_desc, ipctl);
        if (IS_ERR(ipctl->pctl)) {
                dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
                return PTR_ERR(ipctl->pctl);
  
        return 0;
  }
- int imx_pinctrl_remove(struct platform_device *pdev)
- {
-       struct imx_pinctrl *ipctl = platform_get_drvdata(pdev);
-       pinctrl_unregister(ipctl->pctl);
-       return 0;
- }
index 6c2c816f8e5f49dfa8bee2727ccd5d115cfdd643,457e740e941e3bd5dd9c459e8951aad45134a182..3584e50fa2c6908d32419395679774158f13f0b6
@@@ -665,35 -665,6 +665,35 @@@ static void intel_gpio_irq_ack(struct i
        spin_unlock(&pctrl->lock);
  }
  
 +static void intel_gpio_irq_enable(struct irq_data *d)
 +{
 +      struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 +      struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
 +      const struct intel_community *community;
 +      unsigned pin = irqd_to_hwirq(d);
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&pctrl->lock, flags);
 +
 +      community = intel_get_community(pctrl, pin);
 +      if (community) {
 +              unsigned padno = pin_to_padno(community, pin);
 +              unsigned gpp_size = community->gpp_size;
 +              unsigned gpp_offset = padno % gpp_size;
 +              unsigned gpp = padno / gpp_size;
 +              u32 value;
 +
 +              /* Clear interrupt status first to avoid unexpected interrupt */
 +              writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
 +
 +              value = readl(community->regs + community->ie_offset + gpp * 4);
 +              value |= BIT(gpp_offset);
 +              writel(value, community->regs + community->ie_offset + gpp * 4);
 +      }
 +
 +      spin_unlock_irqrestore(&pctrl->lock, flags);
 +}
 +
  static void intel_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
  {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@@ -770,9 -741,8 +770,9 @@@ static int intel_gpio_irq_type(struct i
                value |= PADCFG0_RXINV;
        } else if (type & IRQ_TYPE_EDGE_RISING) {
                value |= PADCFG0_RXEVCFG_EDGE << PADCFG0_RXEVCFG_SHIFT;
 -      } else if (type & IRQ_TYPE_LEVEL_LOW) {
 -              value |= PADCFG0_RXINV;
 +      } else if (type & IRQ_TYPE_LEVEL_MASK) {
 +              if (type & IRQ_TYPE_LEVEL_LOW)
 +                      value |= PADCFG0_RXINV;
        } else {
                value |= PADCFG0_RXEVCFG_DISABLED << PADCFG0_RXEVCFG_SHIFT;
        }
@@@ -882,7 -852,6 +882,7 @@@ static irqreturn_t intel_gpio_irq(int i
  
  static struct irq_chip intel_gpio_irqchip = {
        .name = "intel-gpio",
 +      .irq_enable = intel_gpio_irq_enable,
        .irq_ack = intel_gpio_irq_ack,
        .irq_mask = intel_gpio_irq_mask,
        .irq_unmask = intel_gpio_irq_unmask,
@@@ -1045,17 -1014,16 +1045,16 @@@ int intel_pinctrl_probe(struct platform
        pctrl->pctldesc.pins = pctrl->soc->pins;
        pctrl->pctldesc.npins = pctrl->soc->npins;
  
-       pctrl->pctldev = pinctrl_register(&pctrl->pctldesc, &pdev->dev, pctrl);
+       pctrl->pctldev = devm_pinctrl_register(&pdev->dev, &pctrl->pctldesc,
+                                              pctrl);
        if (IS_ERR(pctrl->pctldev)) {
                dev_err(&pdev->dev, "failed to register pinctrl driver\n");
                return PTR_ERR(pctrl->pctldev);
        }
  
        ret = intel_gpio_probe(pctrl, irq);
-       if (ret) {
-               pinctrl_unregister(pctrl->pctldev);
+       if (ret)
                return ret;
-       }
  
        platform_set_drvdata(pdev, pctrl);
  
@@@ -1068,7 -1036,6 +1067,6 @@@ int intel_pinctrl_remove(struct platfor
        struct intel_pinctrl *pctrl = platform_get_drvdata(pdev);
  
        gpiochip_remove(&pctrl->chip);
-       pinctrl_unregister(pctrl->pctldev);
  
        return 0;
  }
index 6ab8c3ccdeea4cd8b82504f707382f4a6e3c65ce,4091f9d9c4d41b4398d69d84400a4f11ac79f5c8..207b13b618cf16c2b7c9ff863481580879d58ced
@@@ -605,7 -605,7 +605,7 @@@ static int mtk_pctrl_dt_node_to_map(str
                ret = mtk_pctrl_dt_subnode_to_map(pctldev, np, map,
                                &reserved_maps, num_maps);
                if (ret < 0) {
-                       pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
+                       pinctrl_utils_free_map(pctldev, *map, *num_maps);
                        of_node_put(np);
                        return ret;
                }
@@@ -644,7 -644,7 +644,7 @@@ static int mtk_pctrl_get_group_pins(str
  
  static const struct pinctrl_ops mtk_pctrl_ops = {
        .dt_node_to_map         = mtk_pctrl_dt_node_to_map,
-       .dt_free_map            = pinctrl_utils_dt_free_map,
+       .dt_free_map            = pinctrl_utils_free_map,
        .get_groups_count       = mtk_pctrl_get_groups_count,
        .get_group_name         = mtk_pctrl_get_group_name,
        .get_group_pins         = mtk_pctrl_get_group_pins,
@@@ -1004,8 -1004,7 +1004,8 @@@ static int mtk_gpio_set_debounce(struc
        struct mtk_pinctrl *pctl = dev_get_drvdata(chip->parent);
        int eint_num, virq, eint_offset;
        unsigned int set_offset, bit, clr_bit, clr_offset, rst, i, unmask, dbnc;
 -      static const unsigned int dbnc_arr[] = {0 , 1, 16, 32, 64, 128, 256};
 +      static const unsigned int debounce_time[] = {500, 1000, 16000, 32000, 64000,
 +                                              128000, 256000};
        const struct mtk_desc_pin *pin;
        struct irq_data *d;
  
        if (!mtk_eint_can_en_debounce(pctl, eint_num))
                return -ENOSYS;
  
 -      dbnc = ARRAY_SIZE(dbnc_arr);
 -      for (i = 0; i < ARRAY_SIZE(dbnc_arr); i++) {
 -              if (debounce <= dbnc_arr[i]) {
 +      dbnc = ARRAY_SIZE(debounce_time);
 +      for (i = 0; i < ARRAY_SIZE(debounce_time); i++) {
 +              if (debounce <= debounce_time[i]) {
                        dbnc = i;
                        break;
                }
@@@ -1396,17 -1395,16 +1396,16 @@@ int mtk_pctrl_init(struct platform_devi
        pctl->pctl_desc.pmxops = &mtk_pmx_ops;
        pctl->dev = &pdev->dev;
  
-       pctl->pctl_dev = pinctrl_register(&pctl->pctl_desc, &pdev->dev, pctl);
+       pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc,
+                                              pctl);
        if (IS_ERR(pctl->pctl_dev)) {
                dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
                return PTR_ERR(pctl->pctl_dev);
        }
  
        pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
-       if (!pctl->chip) {
-               ret = -ENOMEM;
-               goto pctrl_error;
-       }
+       if (!pctl->chip)
+               return -ENOMEM;
  
        *pctl->chip = mtk_gpio_chip;
        pctl->chip->ngpio = pctl->devdata->npins;
        pctl->chip->base = -1;
  
        ret = gpiochip_add_data(pctl->chip, pctl);
-       if (ret) {
-               ret = -EINVAL;
-               goto pctrl_error;
-       }
+       if (ret)
+               return -EINVAL;
  
        /* Register the GPIO to pin mappings. */
        ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev),
  
  chip_error:
        gpiochip_remove(pctl->chip);
- pctrl_error:
-       pinctrl_unregister(pctl->pctl_dev);
        return ret;
  }
  
index c8969dd494497c88d75d1525e1f7f646998bb388,f3b5c395285ba516f4f42c251ffb855ed5c90515..ccbfc325c7789e05ff2072fb021d73118990f1c1
@@@ -24,6 -24,7 +24,7 @@@
  #include <linux/slab.h>
  #include <linux/of_device.h>
  #include <linux/of_address.h>
+ #include <linux/bitops.h>
  #include <linux/pinctrl/machine.h>
  #include <linux/pinctrl/pinctrl.h>
  #include <linux/pinctrl/pinmux.h>
@@@ -292,15 -293,14 +293,14 @@@ static DEFINE_SPINLOCK(nmk_gpio_slpm_lo
  static void __nmk_gpio_set_mode(struct nmk_gpio_chip *nmk_chip,
                                unsigned offset, int gpio_mode)
  {
-       u32 bit = 1 << offset;
        u32 afunc, bfunc;
  
-       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~bit;
-       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~bit;
+       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~BIT(offset);
+       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~BIT(offset);
        if (gpio_mode & NMK_GPIO_ALT_A)
-               afunc |= bit;
+               afunc |= BIT(offset);
        if (gpio_mode & NMK_GPIO_ALT_B)
-               bfunc |= bit;
+               bfunc |= BIT(offset);
        writel(afunc, nmk_chip->addr + NMK_GPIO_AFSLA);
        writel(bfunc, nmk_chip->addr + NMK_GPIO_AFSLB);
  }
  static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip,
                                unsigned offset, enum nmk_gpio_slpm mode)
  {
-       u32 bit = 1 << offset;
        u32 slpm;
  
        slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC);
        if (mode == NMK_GPIO_SLPM_NOCHANGE)
-               slpm |= bit;
+               slpm |= BIT(offset);
        else
-               slpm &= ~bit;
+               slpm &= ~BIT(offset);
        writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC);
  }
  
  static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
                                unsigned offset, enum nmk_gpio_pull pull)
  {
-       u32 bit = 1 << offset;
        u32 pdis;
  
        pdis = readl(nmk_chip->addr + NMK_GPIO_PDIS);
        if (pull == NMK_GPIO_PULL_NONE) {
-               pdis |= bit;
-               nmk_chip->pull_up &= ~bit;
+               pdis |= BIT(offset);
+               nmk_chip->pull_up &= ~BIT(offset);
        } else {
-               pdis &= ~bit;
+               pdis &= ~BIT(offset);
        }
  
        writel(pdis, nmk_chip->addr + NMK_GPIO_PDIS);
  
        if (pull == NMK_GPIO_PULL_UP) {
-               nmk_chip->pull_up |= bit;
-               writel(bit, nmk_chip->addr + NMK_GPIO_DATS);
+               nmk_chip->pull_up |= BIT(offset);
+               writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DATS);
        } else if (pull == NMK_GPIO_PULL_DOWN) {
-               nmk_chip->pull_up &= ~bit;
-               writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
+               nmk_chip->pull_up &= ~BIT(offset);
+               writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DATC);
        }
  }
  
  static void __nmk_gpio_set_lowemi(struct nmk_gpio_chip *nmk_chip,
                                  unsigned offset, bool lowemi)
  {
-       u32 bit = BIT(offset);
-       bool enabled = nmk_chip->lowemi & bit;
+       bool enabled = nmk_chip->lowemi & BIT(offset);
  
        if (lowemi == enabled)
                return;
  
        if (lowemi)
-               nmk_chip->lowemi |= bit;
+               nmk_chip->lowemi |= BIT(offset);
        else
-               nmk_chip->lowemi &= ~bit;
+               nmk_chip->lowemi &= ~BIT(offset);
  
        writel_relaxed(nmk_chip->lowemi,
                       nmk_chip->addr + NMK_GPIO_LOWEMI);
  static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
                                  unsigned offset)
  {
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
+       writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DIRC);
  }
  
  static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip,
                                  unsigned offset, int val)
  {
        if (val)
-               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS);
+               writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DATS);
        else
-               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC);
+               writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DATC);
  }
  
  static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip,
                                  unsigned offset, int val)
  {
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS);
+       writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DIRS);
        __nmk_gpio_set_output(nmk_chip, offset, val);
  }
  
@@@ -614,34 -611,7 +611,7 @@@ static int __maybe_unused nmk_prcm_gpio
        return NMK_GPIO_ALT_C;
  }
  
- int nmk_gpio_get_mode(int gpio)
- {
-       struct nmk_gpio_chip *nmk_chip;
-       u32 afunc, bfunc, bit;
-       nmk_chip = nmk_gpio_chips[gpio / NMK_GPIO_PER_CHIP];
-       if (!nmk_chip)
-               return -EINVAL;
-       bit = 1 << (gpio % NMK_GPIO_PER_CHIP);
-       clk_enable(nmk_chip->clk);
-       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & bit;
-       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & bit;
-       clk_disable(nmk_chip->clk);
-       return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0);
- }
- EXPORT_SYMBOL(nmk_gpio_get_mode);
  /* IRQ functions */
- static inline int nmk_gpio_get_bitmask(int gpio)
- {
-       return 1 << (gpio % NMK_GPIO_PER_CHIP);
- }
  
  static void nmk_gpio_irq_ack(struct irq_data *d)
  {
        struct nmk_gpio_chip *nmk_chip = gpiochip_get_data(chip);
  
        clk_enable(nmk_chip->clk);
-       writel(nmk_gpio_get_bitmask(d->hwirq), nmk_chip->addr + NMK_GPIO_IC);
+       writel(BIT(d->hwirq), nmk_chip->addr + NMK_GPIO_IC);
        clk_disable(nmk_chip->clk);
  }
  
@@@ -659,10 -629,9 +629,9 @@@ enum nmk_gpio_irq_type 
  };
  
  static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
-                                 int gpio, enum nmk_gpio_irq_type which,
+                                 int offset, enum nmk_gpio_irq_type which,
                                  bool enable)
  {
-       u32 bitmask = nmk_gpio_get_bitmask(gpio);
        u32 *rimscval;
        u32 *fimscval;
        u32 rimscreg;
        }
  
        /* we must individually set/clear the two edges */
-       if (nmk_chip->edge_rising & bitmask) {
+       if (nmk_chip->edge_rising & BIT(offset)) {
                if (enable)
-                       *rimscval |= bitmask;
+                       *rimscval |= BIT(offset);
                else
-                       *rimscval &= ~bitmask;
+                       *rimscval &= ~BIT(offset);
                writel(*rimscval, nmk_chip->addr + rimscreg);
        }
-       if (nmk_chip->edge_falling & bitmask) {
+       if (nmk_chip->edge_falling & BIT(offset)) {
                if (enable)
-                       *fimscval |= bitmask;
+                       *fimscval |= BIT(offset);
                else
-                       *fimscval &= ~bitmask;
+                       *fimscval &= ~BIT(offset);
                writel(*fimscval, nmk_chip->addr + fimscreg);
        }
  }
  
  static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip,
-                               int gpio, bool on)
+                               int offset, bool on)
  {
        /*
         * Ensure WAKEUP_ENABLE is on.  No need to disable it if wakeup is
         * wakeup is anyhow controlled by the RIMSC and FIMSC registers.
         */
        if (nmk_chip->sleepmode && on) {
-               __nmk_gpio_set_slpm(nmk_chip, gpio % NMK_GPIO_PER_CHIP,
+               __nmk_gpio_set_slpm(nmk_chip, offset,
                                    NMK_GPIO_SLPM_WAKEUP_ENABLE);
        }
  
-       __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on);
+       __nmk_gpio_irq_modify(nmk_chip, offset, WAKE, on);
  }
  
  static int nmk_gpio_irq_maskunmask(struct irq_data *d, bool enable)
  {
        struct nmk_gpio_chip *nmk_chip;
        unsigned long flags;
-       u32 bitmask;
  
        nmk_chip = irq_data_get_irq_chip_data(d);
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
        if (!nmk_chip)
                return -EINVAL;
  
  
        __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, enable);
  
-       if (!(nmk_chip->real_wake & bitmask))
+       if (!(nmk_chip->real_wake & BIT(d->hwirq)))
                __nmk_gpio_set_wake(nmk_chip, d->hwirq, enable);
  
        spin_unlock(&nmk_chip->lock);
@@@ -754,12 -721,10 +721,10 @@@ static int nmk_gpio_irq_set_wake(struc
  {
        struct nmk_gpio_chip *nmk_chip;
        unsigned long flags;
-       u32 bitmask;
  
        nmk_chip = irq_data_get_irq_chip_data(d);
        if (!nmk_chip)
                return -EINVAL;
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
  
        clk_enable(nmk_chip->clk);
        spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
                __nmk_gpio_set_wake(nmk_chip, d->hwirq, on);
  
        if (on)
-               nmk_chip->real_wake |= bitmask;
+               nmk_chip->real_wake |= BIT(d->hwirq);
        else
-               nmk_chip->real_wake &= ~bitmask;
+               nmk_chip->real_wake &= ~BIT(d->hwirq);
  
        spin_unlock(&nmk_chip->lock);
        spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
@@@ -786,10 -751,8 +751,8 @@@ static int nmk_gpio_irq_set_type(struc
        bool wake = irqd_is_wakeup_set(d);
        struct nmk_gpio_chip *nmk_chip;
        unsigned long flags;
-       u32 bitmask;
  
        nmk_chip = irq_data_get_irq_chip_data(d);
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
        if (!nmk_chip)
                return -EINVAL;
        if (type & IRQ_TYPE_LEVEL_HIGH)
        if (enabled || wake)
                __nmk_gpio_irq_modify(nmk_chip, d->hwirq, WAKE, false);
  
-       nmk_chip->edge_rising &= ~bitmask;
+       nmk_chip->edge_rising &= ~BIT(d->hwirq);
        if (type & IRQ_TYPE_EDGE_RISING)
-               nmk_chip->edge_rising |= bitmask;
+               nmk_chip->edge_rising |= BIT(d->hwirq);
  
-       nmk_chip->edge_falling &= ~bitmask;
+       nmk_chip->edge_falling &= ~BIT(d->hwirq);
        if (type & IRQ_TYPE_EDGE_FALLING)
-               nmk_chip->edge_falling |= bitmask;
+               nmk_chip->edge_falling |= BIT(d->hwirq);
  
        if (enabled)
                __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, true);
@@@ -884,13 -847,27 +847,27 @@@ static void nmk_gpio_latent_irq_handler
  
  /* I/O Functions */
  
+ static int nmk_gpio_get_dir(struct gpio_chip *chip, unsigned offset)
+ {
+       struct nmk_gpio_chip *nmk_chip = gpiochip_get_data(chip);
+       int dir;
+       clk_enable(nmk_chip->clk);
+       dir = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & BIT(offset));
+       clk_disable(nmk_chip->clk);
+       return dir;
+ }
  static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
  {
        struct nmk_gpio_chip *nmk_chip = gpiochip_get_data(chip);
  
        clk_enable(nmk_chip->clk);
  
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
+       writel(BIT(offset), nmk_chip->addr + NMK_GPIO_DIRC);
  
        clk_disable(nmk_chip->clk);
  
  static int nmk_gpio_get_input(struct gpio_chip *chip, unsigned offset)
  {
        struct nmk_gpio_chip *nmk_chip = gpiochip_get_data(chip);
-       u32 bit = 1 << offset;
        int value;
  
        clk_enable(nmk_chip->clk);
  
-       value = (readl(nmk_chip->addr + NMK_GPIO_DAT) & bit) != 0;
+       value = !!(readl(nmk_chip->addr + NMK_GPIO_DAT) & BIT(offset));
  
        clk_disable(nmk_chip->clk);
  
@@@ -939,6 -915,19 +915,19 @@@ static int nmk_gpio_make_output(struct 
  }
  
  #ifdef CONFIG_DEBUG_FS
+ static int nmk_gpio_get_mode(struct nmk_gpio_chip *nmk_chip, int offset)
+ {
+       u32 afunc, bfunc;
+       clk_enable(nmk_chip->clk);
+       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & BIT(offset);
+       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & BIT(offset);
+       clk_disable(nmk_chip->clk);
+       return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0);
+ }
  
  #include <linux/seq_file.h>
  
@@@ -952,7 -941,6 +941,6 @@@ static void nmk_gpio_dbg_show_one(struc
        bool is_out;
        bool data_out;
        bool pull;
-       u32 bit = 1 << offset;
        const char *modes[] = {
                [NMK_GPIO_ALT_GPIO]     = "gpio",
                [NMK_GPIO_ALT_A]        = "altA",
        };
  
        clk_enable(nmk_chip->clk);
-       is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit);
-       pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
-       data_out = !!(readl(nmk_chip->addr + NMK_GPIO_DAT) & bit);
-       mode = nmk_gpio_get_mode(gpio);
+       is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & BIT(offset));
+       pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & BIT(offset));
+       data_out = !!(readl(nmk_chip->addr + NMK_GPIO_DAT) & BIT(offset));
+       mode = nmk_gpio_get_mode(nmk_chip, offset);
        if ((mode == NMK_GPIO_ALT_C) && pctldev)
                mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio);
  
                int val;
  
                if (pull)
 -                      pullidx = data_out ? 1 : 2;
 +                      pullidx = data_out ? 2 : 1;
  
                seq_printf(s, " gpio-%-3d (%-20.20s) in  %s %s",
                           gpio,
                 */
                if (irq > 0 && desc && desc->action) {
                        char *trigger;
-                       u32 bitmask = nmk_gpio_get_bitmask(gpio);
  
-                       if (nmk_chip->edge_rising & bitmask)
+                       if (nmk_chip->edge_rising & BIT(offset))
                                trigger = "edge-rising";
-                       else if (nmk_chip->edge_falling & bitmask)
+                       else if (nmk_chip->edge_falling & BIT(offset))
                                trigger = "edge-falling";
                        else
                                trigger = "edge-undefined";
@@@ -1246,6 -1233,7 +1233,7 @@@ static int nmk_gpio_probe(struct platfo
        chip = &nmk_chip->chip;
        chip->request = gpiochip_generic_request;
        chip->free = gpiochip_generic_free;
+       chip->get_direction = nmk_gpio_get_dir;
        chip->direction_input = nmk_gpio_make_input;
        chip->get = nmk_gpio_get_input;
        chip->direction_output = nmk_gpio_make_output;
@@@ -1612,7 -1600,7 +1600,7 @@@ static int nmk_pinctrl_dt_node_to_map(s
                ret = nmk_pinctrl_dt_subnode_to_map(pctldev, np, map,
                                &reserved_maps, num_maps);
                if (ret < 0) {
-                       pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
+                       pinctrl_utils_free_map(pctldev, *map, *num_maps);
                        return ret;
                }
        }
@@@ -1626,7 -1614,7 +1614,7 @@@ static const struct pinctrl_ops nmk_pin
        .get_group_pins = nmk_get_group_pins,
        .pin_dbg_show = nmk_pin_dbg_show,
        .dt_node_to_map = nmk_pinctrl_dt_node_to_map,
-       .dt_free_map = pinctrl_utils_dt_free_map,
+       .dt_free_map = pinctrl_utils_free_map,
  };
  
  static int nmk_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
@@@ -2044,7 -2032,7 +2032,7 @@@ static int nmk_pinctrl_probe(struct pla
        nmk_pinctrl_desc.npins = npct->soc->npins;
        npct->dev = &pdev->dev;
  
-       npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct);
+       npct->pctl = devm_pinctrl_register(&pdev->dev, &nmk_pinctrl_desc, npct);
        if (IS_ERR(npct->pctl)) {
                dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n");
                return PTR_ERR(npct->pctl);
index 2c447130b954fa15421858a03dfe7cdf887de80c,6f77756ed9d98c919e79fe74cbb72eda6d020a67..a025b40d246bdb66b9556d4fdb306d4cbe3fe8ca
@@@ -579,7 -579,7 +579,7 @@@ static int atmel_pctl_dt_node_to_map(st
        }
  
        if (ret < 0) {
-               pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
+               pinctrl_utils_free_map(pctldev, *map, *num_maps);
                dev_err(pctldev->dev, "can't create maps for node %s\n",
                        np_config->full_name);
        }
@@@ -592,7 -592,7 +592,7 @@@ static const struct pinctrl_ops atmel_p
        .get_group_name         = atmel_pctl_get_group_name,
        .get_group_pins         = atmel_pctl_get_group_pins,
        .dt_node_to_map         = atmel_pctl_dt_node_to_map,
-       .dt_free_map            = pinctrl_utils_dt_free_map,
+       .dt_free_map            = pinctrl_utils_free_map,
  };
  
  static int atmel_pmx_get_functions_count(struct pinctrl_dev *pctldev)
@@@ -722,11 -722,9 +722,11 @@@ static int atmel_conf_pin_config_group_
                        break;
                case PIN_CONFIG_BIAS_PULL_UP:
                        conf |= ATMEL_PIO_PUEN_MASK;
 +                      conf &= (~ATMEL_PIO_PDEN_MASK);
                        break;
                case PIN_CONFIG_BIAS_PULL_DOWN:
                        conf |= ATMEL_PIO_PDEN_MASK;
 +                      conf &= (~ATMEL_PIO_PUEN_MASK);
                        break;
                case PIN_CONFIG_DRIVE_OPEN_DRAIN:
                        if (arg == 0)
@@@ -1036,18 -1034,19 +1036,19 @@@ static int atmel_pinctrl_probe(struct p
                goto clk_prepare_enable_error;
        }
  
-       atmel_pioctrl->pinctrl_dev = pinctrl_register(&atmel_pinctrl_desc,
-                                                     &pdev->dev,
-                                                     atmel_pioctrl);
-       if (!atmel_pioctrl->pinctrl_dev) {
+       atmel_pioctrl->pinctrl_dev = devm_pinctrl_register(&pdev->dev,
+                                                          &atmel_pinctrl_desc,
+                                                          atmel_pioctrl);
+       if (IS_ERR(atmel_pioctrl->pinctrl_dev)) {
+               ret = PTR_ERR(atmel_pioctrl->pinctrl_dev);
                dev_err(dev, "pinctrl registration failed\n");
-               goto pinctrl_register_error;
+               goto clk_unprep;
        }
  
        ret = gpiochip_add_data(atmel_pioctrl->gpio_chip, atmel_pioctrl);
        if (ret) {
                dev_err(dev, "failed to add gpiochip\n");
-               goto gpiochip_add_error;
+               goto clk_unprep;
        }
  
        ret = gpiochip_add_pin_range(atmel_pioctrl->gpio_chip, dev_name(dev),
  
        return 0;
  
- clk_prepare_enable_error:
-       irq_domain_remove(atmel_pioctrl->irq_domain);
- pinctrl_register_error:
-       clk_disable_unprepare(atmel_pioctrl->clk);
- gpiochip_add_error:
-       pinctrl_unregister(atmel_pioctrl->pinctrl_dev);
  gpiochip_add_pin_range_error:
        gpiochip_remove(atmel_pioctrl->gpio_chip);
  
+ clk_unprep:
+       clk_disable_unprepare(atmel_pioctrl->clk);
+ clk_prepare_enable_error:
+       irq_domain_remove(atmel_pioctrl->irq_domain);
        return ret;
  }
  
@@@ -1079,7 -1078,6 +1080,6 @@@ int atmel_pinctrl_remove(struct platfor
  
        irq_domain_remove(atmel_pioctrl->irq_domain);
        clk_disable_unprepare(atmel_pioctrl->clk);
-       pinctrl_unregister(atmel_pioctrl->pinctrl_dev);
        gpiochip_remove(atmel_pioctrl->gpio_chip);
  
        return 0;
index 2673cd9d106ef60e7d2a6417b5cf6599e7655f47,a532d888855992037b0e9f512ce0ac2cecd5a897..c6d410ef8de08ec9bdaf6ee9ce803f1879b288a1
@@@ -469,27 -469,27 +469,27 @@@ static const char * const pistachio_mip
        "mfio83",
  };
  
 -static const char * const pistachio_sys_pll_lock_groups[] = {
 +static const char * const pistachio_audio_pll_lock_groups[] = {
        "mfio84",
  };
  
 -static const char * const pistachio_wifi_pll_lock_groups[] = {
 +static const char * const pistachio_rpu_v_pll_lock_groups[] = {
        "mfio85",
  };
  
 -static const char * const pistachio_bt_pll_lock_groups[] = {
 +static const char * const pistachio_rpu_l_pll_lock_groups[] = {
        "mfio86",
  };
  
 -static const char * const pistachio_rpu_v_pll_lock_groups[] = {
 +static const char * const pistachio_sys_pll_lock_groups[] = {
        "mfio87",
  };
  
 -static const char * const pistachio_rpu_l_pll_lock_groups[] = {
 +static const char * const pistachio_wifi_pll_lock_groups[] = {
        "mfio88",
  };
  
 -static const char * const pistachio_audio_pll_lock_groups[] = {
 +static const char * const pistachio_bt_pll_lock_groups[] = {
        "mfio89",
  };
  
@@@ -559,12 -559,12 +559,12 @@@ enum pistachio_mux_option 
        PISTACHIO_FUNCTION_DREQ4,
        PISTACHIO_FUNCTION_DREQ5,
        PISTACHIO_FUNCTION_MIPS_PLL_LOCK,
 +      PISTACHIO_FUNCTION_AUDIO_PLL_LOCK,
 +      PISTACHIO_FUNCTION_RPU_V_PLL_LOCK,
 +      PISTACHIO_FUNCTION_RPU_L_PLL_LOCK,
        PISTACHIO_FUNCTION_SYS_PLL_LOCK,
        PISTACHIO_FUNCTION_WIFI_PLL_LOCK,
        PISTACHIO_FUNCTION_BT_PLL_LOCK,
 -      PISTACHIO_FUNCTION_RPU_V_PLL_LOCK,
 -      PISTACHIO_FUNCTION_RPU_L_PLL_LOCK,
 -      PISTACHIO_FUNCTION_AUDIO_PLL_LOCK,
        PISTACHIO_FUNCTION_DEBUG_RAW_CCA_IND,
        PISTACHIO_FUNCTION_DEBUG_ED_SEC20_CCA_IND,
        PISTACHIO_FUNCTION_DEBUG_ED_SEC40_CCA_IND,
@@@ -620,12 -620,12 +620,12 @@@ static const struct pistachio_function 
        FUNCTION(dreq4),
        FUNCTION(dreq5),
        FUNCTION(mips_pll_lock),
 +      FUNCTION(audio_pll_lock),
 +      FUNCTION(rpu_v_pll_lock),
 +      FUNCTION(rpu_l_pll_lock),
        FUNCTION(sys_pll_lock),
        FUNCTION(wifi_pll_lock),
        FUNCTION(bt_pll_lock),
 -      FUNCTION(rpu_v_pll_lock),
 -      FUNCTION(rpu_l_pll_lock),
 -      FUNCTION(audio_pll_lock),
        FUNCTION(debug_raw_cca_ind),
        FUNCTION(debug_ed_sec20_cca_ind),
        FUNCTION(debug_ed_sec40_cca_ind),
@@@ -913,7 -913,7 +913,7 @@@ static const struct pinctrl_ops pistach
        .get_group_name = pistachio_pinctrl_get_group_name,
        .get_group_pins = pistachio_pinctrl_get_group_pins,
        .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
-       .dt_free_map = pinctrl_utils_dt_free_map,
+       .dt_free_map = pinctrl_utils_free_map,
  };
  
  static int pistachio_pinmux_get_functions_count(struct pinctrl_dev *pctldev)
@@@ -1457,8 -1457,8 +1457,8 @@@ static int pistachio_pinctrl_probe(stru
        pistachio_pinctrl_desc.pins = pctl->pins;
        pistachio_pinctrl_desc.npins = pctl->npins;
  
-       pctl->pctldev = pinctrl_register(&pistachio_pinctrl_desc, &pdev->dev,
-                                        pctl);
+       pctl->pctldev = devm_pinctrl_register(&pdev->dev, &pistachio_pinctrl_desc,
+                                             pctl);
        if (IS_ERR(pctl->pctldev)) {
                dev_err(&pdev->dev, "Failed to register pinctrl device\n");
                return PTR_ERR(pctl->pctldev);
index ee0c1f2567d9f3eec5fe11401ff4d3a4384b7cfc,da2bf79339064b372c244bab5e037af8d537d707..9b9cee06ec59aad30b82dafde1a35537b62878e1
@@@ -175,6 -175,21 +175,21 @@@ void sh_pfc_write_raw_reg(void __iomem 
        BUG();
  }
  
+ u32 sh_pfc_read_reg(struct sh_pfc *pfc, u32 reg, unsigned int width)
+ {
+       return sh_pfc_read_raw_reg(sh_pfc_phys_to_virt(pfc, reg), width);
+ }
+ void sh_pfc_write_reg(struct sh_pfc *pfc, u32 reg, unsigned int width, u32 data)
+ {
+       if (pfc->info->unlock_reg)
+               sh_pfc_write_raw_reg(
+                       sh_pfc_phys_to_virt(pfc, pfc->info->unlock_reg), 32,
+                       ~data);
+       sh_pfc_write_raw_reg(sh_pfc_phys_to_virt(pfc, reg), width, data);
+ }
  static void sh_pfc_config_reg_helper(struct sh_pfc *pfc,
                                     const struct pinmux_cfg_reg *crp,
                                     unsigned int in_pos,
@@@ -546,9 -561,7 +561,9 @@@ static int sh_pfc_probe(struct platform
                        return ret;
        }
  
 -      pinctrl_provide_dummies();
 +      /* Enable dummy states for those platforms without pinctrl support */
 +      if (!of_have_populated_dt())
 +              pinctrl_provide_dummies();
  
        ret = sh_pfc_init_ranges(pfc);
        if (ret < 0)
  
  static int sh_pfc_remove(struct platform_device *pdev)
  {
-       struct sh_pfc *pfc = platform_get_drvdata(pdev);
  #ifdef CONFIG_PINCTRL_SH_PFC_GPIO
-       sh_pfc_unregister_gpiochip(pfc);
+       sh_pfc_unregister_gpiochip(platform_get_drvdata(pdev));
  #endif
-       sh_pfc_unregister_pinctrl(pfc);
  
        return 0;
  }
index 8deb566ed4cd63477c40c8cf56ccdf40308b7b5e,e51c1cf5270b11c0113bde6069fe6af02e74339b..ae9fab82a1b9ac1fe274ae7e01681ed7850e2851
@@@ -358,7 -358,7 +358,7 @@@ static int stm32_pctrl_dt_node_to_map(s
                ret = stm32_pctrl_dt_subnode_to_map(pctldev, np, map,
                                &reserved_maps, num_maps);
                if (ret < 0) {
-                       pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
+                       pinctrl_utils_free_map(pctldev, *map, *num_maps);
                        return ret;
                }
        }
@@@ -396,7 -396,7 +396,7 @@@ static int stm32_pctrl_get_group_pins(s
  
  static const struct pinctrl_ops stm32_pctrl_ops = {
        .dt_node_to_map         = stm32_pctrl_dt_node_to_map,
-       .dt_free_map            = pinctrl_utils_dt_free_map,
+       .dt_free_map            = pinctrl_utils_free_map,
        .get_groups_count       = stm32_pctrl_get_groups_count,
        .get_group_name         = stm32_pctrl_get_group_name,
        .get_group_pins         = stm32_pctrl_get_group_pins,
@@@ -454,6 -454,29 +454,29 @@@ static void stm32_pmx_set_mode(struct s
        clk_disable(bank->clk);
  }
  
+ static void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
+               int pin, u32 *mode, u32 *alt)
+ {
+       u32 val;
+       int alt_shift = (pin % 8) * 4;
+       int alt_offset = STM32_GPIO_AFRL + (pin / 8) * 4;
+       unsigned long flags;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = readl_relaxed(bank->base + alt_offset);
+       val &= GENMASK(alt_shift + 3, alt_shift);
+       *alt = val >> alt_shift;
+       val = readl_relaxed(bank->base + STM32_GPIO_MODER);
+       val &= GENMASK(pin * 2 + 1, pin * 2);
+       *mode = val >> (pin * 2);
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+ }
  static int stm32_pmx_set_mux(struct pinctrl_dev *pctldev,
                            unsigned function,
                            unsigned group)
@@@ -525,6 -548,24 +548,24 @@@ static void stm32_pconf_set_driving(str
        clk_disable(bank->clk);
  }
  
+ static u32 stm32_pconf_get_driving(struct stm32_gpio_bank *bank,
+       unsigned int offset)
+ {
+       unsigned long flags;
+       u32 val;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = readl_relaxed(bank->base + STM32_GPIO_TYPER);
+       val &= BIT(offset);
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+       return (val >> offset);
+ }
  static void stm32_pconf_set_speed(struct stm32_gpio_bank *bank,
        unsigned offset, u32 speed)
  {
        clk_disable(bank->clk);
  }
  
+ static u32 stm32_pconf_get_speed(struct stm32_gpio_bank *bank,
+       unsigned int offset)
+ {
+       unsigned long flags;
+       u32 val;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = readl_relaxed(bank->base + STM32_GPIO_SPEEDR);
+       val &= GENMASK(offset * 2 + 1, offset * 2);
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+       return (val >> (offset * 2));
+ }
  static void stm32_pconf_set_bias(struct stm32_gpio_bank *bank,
        unsigned offset, u32 bias)
  {
        clk_disable(bank->clk);
  }
  
+ static u32 stm32_pconf_get_bias(struct stm32_gpio_bank *bank,
+       unsigned int offset)
+ {
+       unsigned long flags;
+       u32 val;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = readl_relaxed(bank->base + STM32_GPIO_PUPDR);
+       val &= GENMASK(offset * 2 + 1, offset * 2);
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+       return (val >> (offset * 2));
+ }
+ static bool stm32_pconf_input_get(struct stm32_gpio_bank *bank,
+       unsigned int offset)
+ {
+       unsigned long flags;
+       u32 val;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = !!(readl_relaxed(bank->base + STM32_GPIO_IDR) & BIT(offset));
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+       return val;
+ }
+ static bool stm32_pconf_output_get(struct stm32_gpio_bank *bank,
+       unsigned int offset)
+ {
+       unsigned long flags;
+       u32 val;
+       clk_enable(bank->clk);
+       spin_lock_irqsave(&bank->lock, flags);
+       val = !!(readl_relaxed(bank->base + STM32_GPIO_ODR) & BIT(offset));
+       spin_unlock_irqrestore(&bank->lock, flags);
+       clk_disable(bank->clk);
+       return val;
+ }
  static int stm32_pconf_parse_conf(struct pinctrl_dev *pctldev,
                unsigned int pin, enum pin_config_param param,
                enum pin_config_param arg)
@@@ -634,9 -744,73 +744,73 @@@ static int stm32_pconf_group_set(struc
        return 0;
  }
  
 -              seq_printf(s, "%d - %s -%s", alt,
+ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev,
+                                struct seq_file *s,
+                                unsigned int pin)
+ {
+       struct pinctrl_gpio_range *range;
+       struct stm32_gpio_bank *bank;
+       int offset;
+       u32 mode, alt, drive, speed, bias;
+       static const char * const modes[] = {
+                       "input", "output", "alternate", "analog" };
+       static const char * const speeds[] = {
+                       "low", "medium", "high", "very high" };
+       static const char * const biasing[] = {
+                       "floating", "pull up", "pull down", "" };
+       bool val;
+       range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
+       bank = gpio_range_to_bank(range);
+       offset = stm32_gpio_pin(pin);
+       stm32_pmx_get_mode(bank, offset, &mode, &alt);
+       bias = stm32_pconf_get_bias(bank, offset);
+       seq_printf(s, "%s ", modes[mode]);
+       switch (mode) {
+       /* input */
+       case 0:
+               val = stm32_pconf_input_get(bank, offset);
+               seq_printf(s, "- %s - %s",
+                          val ? "high" : "low",
+                          biasing[bias]);
+               break;
+       /* output */
+       case 1:
+               drive = stm32_pconf_get_driving(bank, offset);
+               speed = stm32_pconf_get_speed(bank, offset);
+               val = stm32_pconf_output_get(bank, offset);
+               seq_printf(s, "- %s - %s - %s - %s %s",
+                          val ? "high" : "low",
+                          drive ? "open drain" : "push pull",
+                          biasing[bias],
+                          speeds[speed], "speed");
+               break;
+       /* alternate */
+       case 2:
+               drive = stm32_pconf_get_driving(bank, offset);
+               speed = stm32_pconf_get_speed(bank, offset);
++              seq_printf(s, "%d - %s - %s - %s %s", alt,
+                          drive ? "open drain" : "push pull",
+                          biasing[bias],
+                          speeds[speed], "speed");
+               break;
+       /* analog */
+       case 3:
+               break;
+       }
+ }
  static const struct pinconf_ops stm32_pconf_ops = {
        .pin_config_group_get   = stm32_pconf_group_get,
        .pin_config_group_set   = stm32_pconf_group_set,
+       .pin_config_dbg_show    = stm32_pconf_dbg_show,
  };
  
  static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
@@@ -813,10 -987,11 +987,11 @@@ int stm32_pctl_probe(struct platform_de
        pctl->pctl_desc.pmxops = &stm32_pmx_ops;
        pctl->dev = &pdev->dev;
  
-       pctl->pctl_dev = pinctrl_register(&pctl->pctl_desc, &pdev->dev, pctl);
-       if (!pctl->pctl_dev) {
+       pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc,
+                                              pctl);
+       if (IS_ERR(pctl->pctl_dev)) {
                dev_err(&pdev->dev, "Failed pinctrl registration\n");
-               return -EINVAL;
+               return PTR_ERR(pctl->pctl_dev);
        }
  
        for (i = 0; i < pctl->nbanks; i++)
index 3b017dbd289cad993c6b6882c153364bed53d6ff,4a316619356214eeb21075d0c199afb1f38ed050..54455af566ec6805b6e7b0596232884d32223326
@@@ -579,7 -579,7 +579,7 @@@ static void sunxi_pinctrl_irq_release_r
  static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
  {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
 -      u32 reg = sunxi_irq_cfg_reg(d->hwirq);
 +      u32 reg = sunxi_irq_cfg_reg(d->hwirq, pctl->desc->irq_bank_base);
        u8 index = sunxi_irq_cfg_offset(d->hwirq);
        unsigned long flags;
        u32 regval;
  static void sunxi_pinctrl_irq_ack(struct irq_data *d)
  {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
 -      u32 status_reg = sunxi_irq_status_reg(d->hwirq);
 +      u32 status_reg = sunxi_irq_status_reg(d->hwirq,
 +                                            pctl->desc->irq_bank_base);
        u8 status_idx = sunxi_irq_status_offset(d->hwirq);
  
        /* Clear the IRQ */
  static void sunxi_pinctrl_irq_mask(struct irq_data *d)
  {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
 -      u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
 +      u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base);
        u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
        unsigned long flags;
        u32 val;
  static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
  {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
 -      u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
 +      u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base);
        u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
        unsigned long flags;
        u32 val;
@@@ -746,7 -745,7 +746,7 @@@ static void sunxi_pinctrl_irq_handler(s
        if (bank == pctl->desc->irq_banks)
                return;
  
 -      reg = sunxi_irq_status_reg_from_bank(bank);
 +      reg = sunxi_irq_status_reg_from_bank(bank, pctl->desc->irq_bank_base);
        val = readl(pctl->membase + reg);
  
        if (val) {
@@@ -933,18 -932,15 +933,15 @@@ int sunxi_pinctrl_init(struct platform_
        pctrl_desc->pctlops = &sunxi_pctrl_ops;
        pctrl_desc->pmxops =  &sunxi_pmx_ops;
  
-       pctl->pctl_dev = pinctrl_register(pctrl_desc,
-                                         &pdev->dev, pctl);
+       pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, pctrl_desc, pctl);
        if (IS_ERR(pctl->pctl_dev)) {
                dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
                return PTR_ERR(pctl->pctl_dev);
        }
  
        pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
-       if (!pctl->chip) {
-               ret = -ENOMEM;
-               goto pinctrl_error;
-       }
+       if (!pctl->chip)
+               return -ENOMEM;
  
        last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number;
        pctl->chip->owner = THIS_MODULE;
  
        ret = gpiochip_add_data(pctl->chip, pctl);
        if (ret)
-               goto pinctrl_error;
+               return ret;
  
        for (i = 0; i < pctl->desc->npins; i++) {
                const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
  
        for (i = 0; i < pctl->desc->irq_banks; i++) {
                /* Mask and clear all IRQs before registering a handler */
 -              writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i));
 +              writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i,
 +                                              pctl->desc->irq_bank_base));
                writel(0xffffffff,
 -                      pctl->membase + sunxi_irq_status_reg_from_bank(i));
 +                     pctl->membase + sunxi_irq_status_reg_from_bank(i,
 +                                              pctl->desc->irq_bank_base));
  
                irq_set_chained_handler_and_data(pctl->irq[i],
                                                 sunxi_pinctrl_irq_handler,
@@@ -1044,7 -1038,5 +1041,5 @@@ clk_error
        clk_disable_unprepare(clk);
  gpiochip_error:
        gpiochip_remove(pctl->chip);
- pinctrl_error:
-       pinctrl_unregister(pctl->pctl_dev);
        return ret;
  }
index 946cda3fee35354636e5c7ac8c4452ae8d11d64e,5ce174ad4fb33ff99ff3a26d10d27d2271e99054..6f68a9eebc58ba85703293dd836c4c5a29af7d92
@@@ -267,7 -267,7 +267,7 @@@ static const struct pinctrl_ops tegra_x
        .get_group_name = tegra_xusb_padctl_get_group_name,
        .get_group_pins = tegra_xusb_padctl_get_group_pins,
        .dt_node_to_map = tegra_xusb_padctl_dt_node_to_map,
-       .dt_free_map = pinctrl_utils_dt_free_map,
+       .dt_free_map = pinctrl_utils_free_map,
  };
  
  static int tegra_xusb_padctl_get_functions_count(struct pinctrl_dev *pinctrl)
@@@ -873,7 -873,7 +873,7 @@@ static const struct of_device_id tegra_
  };
  MODULE_DEVICE_TABLE(of, tegra_xusb_padctl_of_match);
  
 -static int tegra_xusb_padctl_probe(struct platform_device *pdev)
 +int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev)
  {
        struct tegra_xusb_padctl *padctl;
        const struct of_device_id *match;
        padctl->desc.confops = &tegra_xusb_padctl_pinconf_ops;
        padctl->desc.owner = THIS_MODULE;
  
-       padctl->pinctrl = pinctrl_register(&padctl->desc, &pdev->dev, padctl);
+       padctl->pinctrl = devm_pinctrl_register(&pdev->dev, &padctl->desc,
+                                               padctl);
        if (IS_ERR(padctl->pinctrl)) {
                dev_err(&pdev->dev, "failed to register pincontrol\n");
                err = PTR_ERR(padctl->pinctrl);
        phy = devm_phy_create(&pdev->dev, NULL, &pcie_phy_ops);
        if (IS_ERR(phy)) {
                err = PTR_ERR(phy);
-               goto unregister;
+               goto reset;
        }
  
        padctl->phys[TEGRA_XUSB_PADCTL_PCIE] = phy;
        phy = devm_phy_create(&pdev->dev, NULL, &sata_phy_ops);
        if (IS_ERR(phy)) {
                err = PTR_ERR(phy);
-               goto unregister;
+               goto reset;
        }
  
        padctl->phys[TEGRA_XUSB_PADCTL_SATA] = phy;
        if (IS_ERR(padctl->provider)) {
                err = PTR_ERR(padctl->provider);
                dev_err(&pdev->dev, "failed to register PHYs: %d\n", err);
-               goto unregister;
+               goto reset;
        }
  
        return 0;
  
- unregister:
-       pinctrl_unregister(padctl->pinctrl);
  reset:
        reset_control_assert(padctl->rst);
        return err;
  }
 +EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_probe);
  
 -static int tegra_xusb_padctl_remove(struct platform_device *pdev)
 +int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev)
  {
        struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev);
        int err;
  
-       pinctrl_unregister(padctl->pinctrl);
        err = reset_control_assert(padctl->rst);
        if (err < 0)
                dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
  
        return err;
  }
 -
 -static struct platform_driver tegra_xusb_padctl_driver = {
 -      .driver = {
 -              .name = "tegra-xusb-padctl",
 -              .of_match_table = tegra_xusb_padctl_of_match,
 -      },
 -      .probe = tegra_xusb_padctl_probe,
 -      .remove = tegra_xusb_padctl_remove,
 -};
 -module_platform_driver(tegra_xusb_padctl_driver);
 -
 -MODULE_AUTHOR("Thierry Reding <[email protected]>");
 -MODULE_DESCRIPTION("Tegra 124 XUSB Pad Control driver");
 -MODULE_LICENSE("GPL v2");
 +EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_remove);
This page took 0.191816 seconds and 4 git commands to generate.