Merge tag 'gpio-v5.4-updates-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 3 Sep 2019 14:04:19 +0000 (16:04 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 3 Sep 2019 14:04:19 +0000 (16:04 +0200)
gpio: updates for v5.4

- use a helper variable for &pdev->dev in gpio-em
- tweak the ifdefs in GPIO headers
- fix function links in HTML docs
- remove an unneeded error message from ixp4xx
- use the optional clk_get in gpio-mxc instead of checking the return value
- a couple improvements in pca953x
- allow to build gpio-lpc32xx on non-lpc32xx targets

1  2 
Documentation/driver-api/gpio/driver.rst
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/gpio-ixp4xx.c
include/linux/gpio/driver.h

Simple merge
Simple merge
index 1a57e74fdb9196e4d269290ad74a55c23085efbe,2b2b89b6cd1872d04ea028941acf82d2254e4698..b3b050604e0be02ab165fc2a7ce6a15a66e14ad8
@@@ -204,40 -321,9 +204,38 @@@ static int ixp4xx_gpio_probe(struct pla
  
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        g->base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(g->base)) {
-               dev_err(dev, "ioremap error\n");
+       if (IS_ERR(g->base))
                return PTR_ERR(g->base);
-       }
  
 +      /*
 +       * When we convert to device tree we will simply look up the
 +       * parent irqdomain using irq_find_host(parent) as parent comes
 +       * from IRQCHIP_DECLARE(), then use of_node_to_fwnode() to get
 +       * the fwnode. For now we need this boardfile style code.
 +       */
 +      if (np) {
 +              struct device_node *irq_parent;
 +
 +              irq_parent = of_irq_find_parent(np);
 +              if (!irq_parent) {
 +                      dev_err(dev, "no IRQ parent node\n");
 +                      return -ENODEV;
 +              }
 +              parent = irq_find_host(irq_parent);
 +              if (!parent) {
 +                      dev_err(dev, "no IRQ parent domain\n");
 +                      return -ENODEV;
 +              }
 +              g->fwnode = of_node_to_fwnode(np);
 +      } else {
 +              parent = ixp4xx_get_irq_domain();
 +              g->fwnode = irq_domain_alloc_fwnode(&res->start);
 +              if (!g->fwnode) {
 +                      dev_err(dev, "no domain base\n");
 +                      return -ENODEV;
 +              }
 +      }
 +
        /*
         * Make sure GPIO 14 and 15 are NOT used as clocks but GPIO on
         * specific machines.
index 8d06a054abc85ebc2e72929d68a31c3b7a614b1e,f28f534f451a8b1ea34495ccd7b90e648be50e3d..b74a3bee85e5dee590d0f81f388978fea3af0b66
@@@ -20,12 -20,6 +20,8 @@@ struct module
  enum gpiod_flags;
  enum gpio_lookup_flags;
  
- #ifdef CONFIG_GPIOLIB
- #ifdef CONFIG_GPIOLIB_IRQCHIP
 +struct gpio_chip;
 +
  /**
   * struct gpio_irq_chip - GPIO interrupt controller
   */
@@@ -520,38 -443,6 +513,35 @@@ struct bgpio_pdata 
        int ngpio;
  };
  
- #if IS_ENABLED(CONFIG_GPIO_GENERIC)
 +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
 +
 +void gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
 +                                           struct irq_fwspec *fwspec,
 +                                           unsigned int parent_hwirq,
 +                                           unsigned int parent_type);
 +void gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
 +                                            struct irq_fwspec *fwspec,
 +                                            unsigned int parent_hwirq,
 +                                            unsigned int parent_type);
 +
 +#else
 +
 +static inline void gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
 +                                                  struct irq_fwspec *fwspec,
 +                                                  unsigned int parent_hwirq,
 +                                                  unsigned int parent_type)
 +{
 +}
 +
 +static inline void gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
 +                                                   struct irq_fwspec *fwspec,
 +                                                   unsigned int parent_hwirq,
 +                                                   unsigned int parent_type)
 +{
 +}
 +
 +#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */
 +
  int bgpio_init(struct gpio_chip *gc, struct device *dev,
               unsigned long sz, void __iomem *dat, void __iomem *set,
               void __iomem *clr, void __iomem *dirout, void __iomem *dirin,
@@@ -720,10 -603,11 +702,14 @@@ void gpiochip_free_own_desc(struct gpio
  void devprop_gpiochip_set_names(struct gpio_chip *chip,
                                const struct fwnode_handle *fwnode);
  
 +/* lock/unlock as IRQ */
 +int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset);
 +void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset);
  
+ #ifdef CONFIG_GPIOLIB
+ struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc);
  #else /* CONFIG_GPIOLIB */
  
  static inline struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)
        return ERR_PTR(-ENODEV);
  }
  
 +static inline int gpiochip_lock_as_irq(struct gpio_chip *chip,
 +                                     unsigned int offset)
 +{
 +      WARN_ON(1);
 +      return -EINVAL;
 +}
 +
 +static inline void gpiochip_unlock_as_irq(struct gpio_chip *chip,
 +                                        unsigned int offset)
 +{
 +      WARN_ON(1);
 +}
  #endif /* CONFIG_GPIOLIB */
  
- #endif
+ #endif /* __LINUX_GPIO_DRIVER_H */