gpio: move the pin ranges into gpio_device
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 11 Feb 2016 10:03:06 +0000 (11:03 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 15 Feb 2016 23:20:02 +0000 (00:20 +0100)
Instead of keeping this reference to the pin ranges in the
client driver-supplied gpio_chip, move it to the internal
gpio_device as the drivers have no need to inspect this.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib-acpi.c
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.h
include/linux/gpio/driver.h

index 540cbc88c7a202f8264c9caa1317953ba11b1c3d..682070d20f001dce1aef51147d99aca97cb2938c 100644 (file)
@@ -71,29 +71,29 @@ static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
  * controller uses pin controller and the mapping is not contiguous the
  * offset might be different.
  */
-static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip, int pin)
+static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, int pin)
 {
        struct gpio_pin_range *pin_range;
 
        /* If there are no ranges in this chip, use 1:1 mapping */
-       if (list_empty(&chip->pin_ranges))
+       if (list_empty(&gdev->pin_ranges))
                return pin;
 
-       list_for_each_entry(pin_range, &chip->pin_ranges, node) {
+       list_for_each_entry(pin_range, &gdev->pin_ranges, node) {
                const struct pinctrl_gpio_range *range = &pin_range->range;
                int i;
 
                if (range->pins) {
                        for (i = 0; i < range->npins; i++) {
                                if (range->pins[i] == pin)
-                                       return range->base + i - chip->base;
+                                       return range->base + i - gdev->base;
                        }
                } else {
                        if (pin >= range->pin_base &&
                            pin < range->pin_base + range->npins) {
                                unsigned gpio_base;
 
-                               gpio_base = range->base - chip->base;
+                               gpio_base = range->base - gdev->base;
                                return gpio_base + pin - range->pin_base;
                        }
                }
@@ -102,7 +102,7 @@ static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip, int pin)
        return -EINVAL;
 }
 #else
-static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip,
+static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev,
                                                   int pin)
 {
        return pin;
@@ -134,7 +134,7 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
        if (!chip)
                return ERR_PTR(-EPROBE_DEFER);
 
-       offset = acpi_gpiochip_pin_to_gpio_offset(chip, pin);
+       offset = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
        if (offset < 0)
                return ERR_PTR(offset);
 
@@ -202,7 +202,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
        if (!handler)
                return AE_BAD_PARAMETER;
 
-       pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin);
+       pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
        if (pin < 0)
                return AE_BAD_PARAMETER;
 
@@ -673,7 +673,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
                struct gpio_desc *desc;
                bool found;
 
-               pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin);
+               pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
                if (pin < 0) {
                        status = AE_BAD_PARAMETER;
                        goto out;
index 646dea4f96ffbd374638da3d6e28fdd37f317f7f..28984bbc079c03f4c757dcc41fbedeff0cc29558 100644 (file)
@@ -532,8 +532,7 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
        spin_unlock_irqrestore(&gpio_lock, flags);
 
 #ifdef CONFIG_PINCTRL
-       /* FIXME: move pin ranges to gpio_device */
-       INIT_LIST_HEAD(&chip->pin_ranges);
+       INIT_LIST_HEAD(&gdev->pin_ranges);
 #endif
 
        status = gpiochip_set_desc_names(chip);
@@ -1036,7 +1035,7 @@ int gpiochip_add_pingroup_range(struct gpio_chip *chip,
                 gpio_offset, gpio_offset + pin_range->range.npins - 1,
                 pinctrl_dev_get_devname(pctldev), pin_group);
 
-       list_add_tail(&pin_range->node, &chip->pin_ranges);
+       list_add_tail(&pin_range->node, &gdev->pin_ranges);
 
        return 0;
 }
@@ -1085,7 +1084,7 @@ int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
                 pinctl_name,
                 pin_offset, pin_offset + npins - 1);
 
-       list_add_tail(&pin_range->node, &chip->pin_ranges);
+       list_add_tail(&pin_range->node, &gdev->pin_ranges);
 
        return 0;
 }
@@ -1098,8 +1097,9 @@ EXPORT_SYMBOL_GPL(gpiochip_add_pin_range);
 void gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 {
        struct gpio_pin_range *pin_range, *tmp;
+       struct gpio_device *gdev = chip->gpiodev;
 
-       list_for_each_entry_safe(pin_range, tmp, &chip->pin_ranges, node) {
+       list_for_each_entry_safe(pin_range, tmp, &gdev->pin_ranges, node) {
                list_del(&pin_range->node);
                pinctrl_remove_gpio_range(pin_range->pctldev,
                                &pin_range->range);
index d154984c71d9717a6dd91a95d031e7f0d1383c0f..5a36908fd39d7f67265e660175633d7dd2d27c68 100644 (file)
@@ -55,6 +55,16 @@ struct gpio_device {
        int                     base;
        u16                     ngpio;
        struct list_head        list;
+
+#ifdef CONFIG_PINCTRL
+       /*
+        * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally
+        * describe the actual pin range which they serve in an SoC. This
+        * information would be used by pinctrl subsystem to configure
+        * corresponding pins for gpio usage.
+        */
+       struct list_head pin_ranges;
+#endif
 };
 
 /**
index 41c6144c473b1c8d2abd7be7b617044bedab4cc1..e2a934ce3e641736abd1183ea17c202c8310a3ad 100644 (file)
@@ -181,15 +181,6 @@ struct gpio_chip {
        int (*of_xlate)(struct gpio_chip *gc,
                        const struct of_phandle_args *gpiospec, u32 *flags);
 #endif
-#ifdef CONFIG_PINCTRL
-       /*
-        * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally
-        * describe the actual pin range which they serve in an SoC. This
-        * information would be used by pinctrl subsystem to configure
-        * corresponding pins for gpio usage.
-        */
-       struct list_head pin_ranges;
-#endif
 };
 
 extern const char *gpiochip_is_requested(struct gpio_chip *chip,