Merge tag 'gpio-v5.2-updates-for-linus-part1' of git://git.kernel.org/pub/scm/linux...
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 8 Apr 2019 13:48:11 +0000 (15:48 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 8 Apr 2019 13:48:11 +0000 (15:48 +0200)
gpio: updates for v5.2 (part 1)

- batch of improvements for the vf610 driver which shrink the code and
  make use of resource managed helpers
- support for a new variant of pca953x
- make gpio-mockup buildable on systems without IOMEM
- make gpio-74x164 more flexible by using generic device properties
  plus minor improvements
- new driver for Mellanox BlueField
- fixes for wakeup GPIOs in gpio-omap
- use devm_platform_ioremap_resource() in gpio-mxc
- a couple improvements of kernel docs for ACPI code
- don't WARN() in gpiod_put() on optional GPIOs

1  2 
drivers/gpio/Kconfig
drivers/gpio/gpio-omap.c
drivers/gpio/gpio-pca953x.c
drivers/gpio/gpio-vf610.c
drivers/gpio/gpiolib.c

Simple merge
index cf4a8727786a26c633422236379783eb3b1ee387,4d1bf884fcbcf5aef7bef7d721b0dff4f6fb821f..8cbb109928cbf156d3d550a0729d0905ca10fdd5
@@@ -1437,37 -1579,115 +1444,35 @@@ static void omap_gpio_unidle(struct gpi
                writel_relaxed(old0, bank->base + bank->regs->leveldetect0);
                writel_relaxed(old1, bank->base + bank->regs->leveldetect1);
        }
-       bank->workaround_enabled = false;
  }
  
 -static void omap_gpio_init_context(struct gpio_bank *p)
 +static int gpio_omap_cpu_notifier(struct notifier_block *nb,
 +                                unsigned long cmd, void *v)
  {
 -      struct omap_gpio_reg_offs *regs = p->regs;
 -      void __iomem *base = p->base;
 +      struct gpio_bank *bank;
 +      unsigned long flags;
  
 -      p->context.ctrl         = readl_relaxed(base + regs->ctrl);
 -      p->context.oe           = readl_relaxed(base + regs->direction);
 -      p->context.wake_en      = readl_relaxed(base + regs->wkup_en);
 -      p->context.leveldetect0 = readl_relaxed(base + regs->leveldetect0);
 -      p->context.leveldetect1 = readl_relaxed(base + regs->leveldetect1);
 -      p->context.risingdetect = readl_relaxed(base + regs->risingdetect);
 -      p->context.fallingdetect = readl_relaxed(base + regs->fallingdetect);
 -      p->context.irqenable1   = readl_relaxed(base + regs->irqenable);
 -      p->context.irqenable2   = readl_relaxed(base + regs->irqenable2);
 +      bank = container_of(nb, struct gpio_bank, nb);
  
 -      if (regs->set_dataout && p->regs->clr_dataout)
 -              p->context.dataout = readl_relaxed(base + regs->set_dataout);
 -      else
 -              p->context.dataout = readl_relaxed(base + regs->dataout);
 +      raw_spin_lock_irqsave(&bank->lock, flags);
 +      switch (cmd) {
 +      case CPU_CLUSTER_PM_ENTER:
 +              if (bank->is_suspended)
 +                      break;
 +              omap_gpio_idle(bank, true);
 +              break;
 +      case CPU_CLUSTER_PM_ENTER_FAILED:
 +      case CPU_CLUSTER_PM_EXIT:
 +              if (bank->is_suspended)
 +                      break;
 +              omap_gpio_unidle(bank);
 +              break;
 +      }
 +      raw_spin_unlock_irqrestore(&bank->lock, flags);
  
 -      p->context_valid = true;
 +      return NOTIFY_OK;
  }
  
 -static void omap_gpio_restore_context(struct gpio_bank *bank)
 -{
 -      writel_relaxed(bank->context.wake_en,
 -                              bank->base + bank->regs->wkup_en);
 -      writel_relaxed(bank->context.ctrl, bank->base + bank->regs->ctrl);
 -      writel_relaxed(bank->context.leveldetect0,
 -                              bank->base + bank->regs->leveldetect0);
 -      writel_relaxed(bank->context.leveldetect1,
 -                              bank->base + bank->regs->leveldetect1);
 -      writel_relaxed(bank->context.risingdetect,
 -                              bank->base + bank->regs->risingdetect);
 -      writel_relaxed(bank->context.fallingdetect,
 -                              bank->base + bank->regs->fallingdetect);
 -      if (bank->regs->set_dataout && bank->regs->clr_dataout)
 -              writel_relaxed(bank->context.dataout,
 -                              bank->base + bank->regs->set_dataout);
 -      else
 -              writel_relaxed(bank->context.dataout,
 -                              bank->base + bank->regs->dataout);
 -      writel_relaxed(bank->context.oe, bank->base + bank->regs->direction);
 -
 -      if (bank->dbck_enable_mask) {
 -              writel_relaxed(bank->context.debounce, bank->base +
 -                                      bank->regs->debounce);
 -              writel_relaxed(bank->context.debounce_en,
 -                                      bank->base + bank->regs->debounce_en);
 -      }
 -
 -      writel_relaxed(bank->context.irqenable1,
 -                              bank->base + bank->regs->irqenable);
 -      writel_relaxed(bank->context.irqenable2,
 -                              bank->base + bank->regs->irqenable2);
 -}
 -
 -static int __maybe_unused omap_gpio_runtime_suspend(struct device *dev)
 -{
 -      struct gpio_bank *bank = dev_get_drvdata(dev);
 -      unsigned long flags;
 -      int error = 0;
 -
 -      raw_spin_lock_irqsave(&bank->lock, flags);
 -      /* Must be idled only by CPU_CLUSTER_PM_ENTER? */
 -      if (bank->irq_usage) {
 -              error = -EBUSY;
 -              goto unlock;
 -      }
 -      omap_gpio_idle(bank, true);
 -      bank->is_suspended = true;
 -unlock:
 -      raw_spin_unlock_irqrestore(&bank->lock, flags);
 -
 -      return error;
 -}
 -
 -static int __maybe_unused omap_gpio_runtime_resume(struct device *dev)
 -{
 -      struct gpio_bank *bank = dev_get_drvdata(dev);
 -      unsigned long flags;
 -      int error = 0;
 -
 -      raw_spin_lock_irqsave(&bank->lock, flags);
 -      /* Must be unidled only by CPU_CLUSTER_PM_ENTER? */
 -      if (bank->irq_usage) {
 -              error = -EBUSY;
 -              goto unlock;
 -      }
 -      omap_gpio_unidle(bank);
 -      bank->is_suspended = false;
 -unlock:
 -      raw_spin_unlock_irqrestore(&bank->lock, flags);
 -
 -      return error;
 -}
 -
 -#ifdef CONFIG_ARCH_OMAP2PLUS
 -static const struct dev_pm_ops gpio_pm_ops = {
 -      SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
 -                                                                      NULL)
 -};
 -#else
 -static const struct dev_pm_ops gpio_pm_ops;
 -#endif        /* CONFIG_ARCH_OMAP2PLUS */
 -
 -#if defined(CONFIG_OF)
  static struct omap_gpio_reg_offs omap2_gpio_regs = {
        .revision =             OMAP24XX_GPIO_REVISION,
        .direction =            OMAP24XX_GPIO_OE,
Simple merge
index 4b86a2dee7f2d21ab2a1190c056a4fbeac612610,6f6558715b881566ba22e8038a64020d99217df4..30aef41e3b7e64ce51629552b8244ea07680c500
@@@ -251,7 -242,9 +242,8 @@@ static int vf610_gpio_probe(struct plat
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct vf610_gpio_port *port;
 -      struct resource *iores;
        struct gpio_chip *gc;
+       struct irq_chip *ic;
        int i;
        int ret;
  
Simple merge