diff options
| -rw-r--r-- | drivers/gpio/gpiolib-acpi.c | 18 | ||||
| -rw-r--r-- | drivers/gpio/gpiolib.c | 10 | ||||
| -rw-r--r-- | drivers/gpio/gpiolib.h | 10 | ||||
| -rw-r--r-- | include/linux/gpio/driver.h | 9 |
4 files changed, 24 insertions, 23 deletions
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 540cbc88c7a2..682070d20f00 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c | |||
| @@ -71,29 +71,29 @@ static int acpi_gpiochip_find(struct gpio_chip *gc, void *data) | |||
| 71 | * controller uses pin controller and the mapping is not contiguous the | 71 | * controller uses pin controller and the mapping is not contiguous the |
| 72 | * offset might be different. | 72 | * offset might be different. |
| 73 | */ | 73 | */ |
| 74 | static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip, int pin) | 74 | static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, int pin) |
| 75 | { | 75 | { |
| 76 | struct gpio_pin_range *pin_range; | 76 | struct gpio_pin_range *pin_range; |
| 77 | 77 | ||
| 78 | /* If there are no ranges in this chip, use 1:1 mapping */ | 78 | /* If there are no ranges in this chip, use 1:1 mapping */ |
| 79 | if (list_empty(&chip->pin_ranges)) | 79 | if (list_empty(&gdev->pin_ranges)) |
| 80 | return pin; | 80 | return pin; |
| 81 | 81 | ||
| 82 | list_for_each_entry(pin_range, &chip->pin_ranges, node) { | 82 | list_for_each_entry(pin_range, &gdev->pin_ranges, node) { |
| 83 | const struct pinctrl_gpio_range *range = &pin_range->range; | 83 | const struct pinctrl_gpio_range *range = &pin_range->range; |
| 84 | int i; | 84 | int i; |
| 85 | 85 | ||
| 86 | if (range->pins) { | 86 | if (range->pins) { |
| 87 | for (i = 0; i < range->npins; i++) { | 87 | for (i = 0; i < range->npins; i++) { |
| 88 | if (range->pins[i] == pin) | 88 | if (range->pins[i] == pin) |
| 89 | return range->base + i - chip->base; | 89 | return range->base + i - gdev->base; |
| 90 | } | 90 | } |
| 91 | } else { | 91 | } else { |
| 92 | if (pin >= range->pin_base && | 92 | if (pin >= range->pin_base && |
| 93 | pin < range->pin_base + range->npins) { | 93 | pin < range->pin_base + range->npins) { |
| 94 | unsigned gpio_base; | 94 | unsigned gpio_base; |
| 95 | 95 | ||
| 96 | gpio_base = range->base - chip->base; | 96 | gpio_base = range->base - gdev->base; |
| 97 | return gpio_base + pin - range->pin_base; | 97 | return gpio_base + pin - range->pin_base; |
| 98 | } | 98 | } |
| 99 | } | 99 | } |
| @@ -102,7 +102,7 @@ static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip, int pin) | |||
| 102 | return -EINVAL; | 102 | return -EINVAL; |
| 103 | } | 103 | } |
| 104 | #else | 104 | #else |
| 105 | static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip, | 105 | static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, |
| 106 | int pin) | 106 | int pin) |
| 107 | { | 107 | { |
| 108 | return pin; | 108 | return pin; |
| @@ -134,7 +134,7 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin) | |||
| 134 | if (!chip) | 134 | if (!chip) |
| 135 | return ERR_PTR(-EPROBE_DEFER); | 135 | return ERR_PTR(-EPROBE_DEFER); |
| 136 | 136 | ||
| 137 | offset = acpi_gpiochip_pin_to_gpio_offset(chip, pin); | 137 | offset = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin); |
| 138 | if (offset < 0) | 138 | if (offset < 0) |
| 139 | return ERR_PTR(offset); | 139 | return ERR_PTR(offset); |
| 140 | 140 | ||
| @@ -202,7 +202,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, | |||
| 202 | if (!handler) | 202 | if (!handler) |
| 203 | return AE_BAD_PARAMETER; | 203 | return AE_BAD_PARAMETER; |
| 204 | 204 | ||
| 205 | pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin); | 205 | pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin); |
| 206 | if (pin < 0) | 206 | if (pin < 0) |
| 207 | return AE_BAD_PARAMETER; | 207 | return AE_BAD_PARAMETER; |
| 208 | 208 | ||
| @@ -673,7 +673,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, | |||
| 673 | struct gpio_desc *desc; | 673 | struct gpio_desc *desc; |
| 674 | bool found; | 674 | bool found; |
| 675 | 675 | ||
| 676 | pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin); | 676 | pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin); |
| 677 | if (pin < 0) { | 677 | if (pin < 0) { |
| 678 | status = AE_BAD_PARAMETER; | 678 | status = AE_BAD_PARAMETER; |
| 679 | goto out; | 679 | goto out; |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 646dea4f96ff..28984bbc079c 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
| @@ -532,8 +532,7 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data) | |||
| 532 | spin_unlock_irqrestore(&gpio_lock, flags); | 532 | spin_unlock_irqrestore(&gpio_lock, flags); |
| 533 | 533 | ||
| 534 | #ifdef CONFIG_PINCTRL | 534 | #ifdef CONFIG_PINCTRL |
| 535 | /* FIXME: move pin ranges to gpio_device */ | 535 | INIT_LIST_HEAD(&gdev->pin_ranges); |
| 536 | INIT_LIST_HEAD(&chip->pin_ranges); | ||
| 537 | #endif | 536 | #endif |
| 538 | 537 | ||
| 539 | status = gpiochip_set_desc_names(chip); | 538 | status = gpiochip_set_desc_names(chip); |
| @@ -1036,7 +1035,7 @@ int gpiochip_add_pingroup_range(struct gpio_chip *chip, | |||
| 1036 | gpio_offset, gpio_offset + pin_range->range.npins - 1, | 1035 | gpio_offset, gpio_offset + pin_range->range.npins - 1, |
| 1037 | pinctrl_dev_get_devname(pctldev), pin_group); | 1036 | pinctrl_dev_get_devname(pctldev), pin_group); |
| 1038 | 1037 | ||
| 1039 | list_add_tail(&pin_range->node, &chip->pin_ranges); | 1038 | list_add_tail(&pin_range->node, &gdev->pin_ranges); |
| 1040 | 1039 | ||
| 1041 | return 0; | 1040 | return 0; |
| 1042 | } | 1041 | } |
| @@ -1085,7 +1084,7 @@ int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | |||
| 1085 | pinctl_name, | 1084 | pinctl_name, |
| 1086 | pin_offset, pin_offset + npins - 1); | 1085 | pin_offset, pin_offset + npins - 1); |
| 1087 | 1086 | ||
| 1088 | list_add_tail(&pin_range->node, &chip->pin_ranges); | 1087 | list_add_tail(&pin_range->node, &gdev->pin_ranges); |
| 1089 | 1088 | ||
| 1090 | return 0; | 1089 | return 0; |
| 1091 | } | 1090 | } |
| @@ -1098,8 +1097,9 @@ EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); | |||
| 1098 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip) | 1097 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip) |
| 1099 | { | 1098 | { |
| 1100 | struct gpio_pin_range *pin_range, *tmp; | 1099 | struct gpio_pin_range *pin_range, *tmp; |
| 1100 | struct gpio_device *gdev = chip->gpiodev; | ||
| 1101 | 1101 | ||
| 1102 | list_for_each_entry_safe(pin_range, tmp, &chip->pin_ranges, node) { | 1102 | list_for_each_entry_safe(pin_range, tmp, &gdev->pin_ranges, node) { |
| 1103 | list_del(&pin_range->node); | 1103 | list_del(&pin_range->node); |
| 1104 | pinctrl_remove_gpio_range(pin_range->pctldev, | 1104 | pinctrl_remove_gpio_range(pin_range->pctldev, |
| 1105 | &pin_range->range); | 1105 | &pin_range->range); |
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index d154984c71d9..5a36908fd39d 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h | |||
| @@ -55,6 +55,16 @@ struct gpio_device { | |||
| 55 | int base; | 55 | int base; |
| 56 | u16 ngpio; | 56 | u16 ngpio; |
| 57 | struct list_head list; | 57 | struct list_head list; |
| 58 | |||
| 59 | #ifdef CONFIG_PINCTRL | ||
| 60 | /* | ||
| 61 | * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally | ||
| 62 | * describe the actual pin range which they serve in an SoC. This | ||
| 63 | * information would be used by pinctrl subsystem to configure | ||
| 64 | * corresponding pins for gpio usage. | ||
| 65 | */ | ||
| 66 | struct list_head pin_ranges; | ||
| 67 | #endif | ||
| 58 | }; | 68 | }; |
| 59 | 69 | ||
| 60 | /** | 70 | /** |
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 41c6144c473b..e2a934ce3e64 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h | |||
| @@ -181,15 +181,6 @@ struct gpio_chip { | |||
| 181 | int (*of_xlate)(struct gpio_chip *gc, | 181 | int (*of_xlate)(struct gpio_chip *gc, |
| 182 | const struct of_phandle_args *gpiospec, u32 *flags); | 182 | const struct of_phandle_args *gpiospec, u32 *flags); |
| 183 | #endif | 183 | #endif |
| 184 | #ifdef CONFIG_PINCTRL | ||
| 185 | /* | ||
| 186 | * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally | ||
| 187 | * describe the actual pin range which they serve in an SoC. This | ||
| 188 | * information would be used by pinctrl subsystem to configure | ||
| 189 | * corresponding pins for gpio usage. | ||
| 190 | */ | ||
| 191 | struct list_head pin_ranges; | ||
| 192 | #endif | ||
| 193 | }; | 184 | }; |
| 194 | 185 | ||
| 195 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, | 186 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, |
