diff options
-rw-r--r-- | drivers/pinctrl/core.c | 35 | ||||
-rw-r--r-- | drivers/pinctrl/core.h | 4 |
2 files changed, 27 insertions, 12 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 2686a4450dfc..f67a8b7a4e18 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -481,18 +481,12 @@ int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group, | |||
481 | } | 481 | } |
482 | EXPORT_SYMBOL_GPL(pinctrl_get_group_pins); | 482 | EXPORT_SYMBOL_GPL(pinctrl_get_group_pins); |
483 | 483 | ||
484 | /** | ||
485 | * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin | ||
486 | * @pctldev: the pin controller device to look in | ||
487 | * @pin: a controller-local number to find the range for | ||
488 | */ | ||
489 | struct pinctrl_gpio_range * | 484 | struct pinctrl_gpio_range * |
490 | pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, | 485 | pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev, |
491 | unsigned int pin) | 486 | unsigned int pin) |
492 | { | 487 | { |
493 | struct pinctrl_gpio_range *range; | 488 | struct pinctrl_gpio_range *range; |
494 | 489 | ||
495 | mutex_lock(&pctldev->mutex); | ||
496 | /* Loop over the ranges */ | 490 | /* Loop over the ranges */ |
497 | list_for_each_entry(range, &pctldev->gpio_ranges, node) { | 491 | list_for_each_entry(range, &pctldev->gpio_ranges, node) { |
498 | /* Check if we're in the valid range */ | 492 | /* Check if we're in the valid range */ |
@@ -500,15 +494,32 @@ pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, | |||
500 | int a; | 494 | int a; |
501 | for (a = 0; a < range->npins; a++) { | 495 | for (a = 0; a < range->npins; a++) { |
502 | if (range->pins[a] == pin) | 496 | if (range->pins[a] == pin) |
503 | goto out; | 497 | return range; |
504 | } | 498 | } |
505 | } else if (pin >= range->pin_base && | 499 | } else if (pin >= range->pin_base && |
506 | pin < range->pin_base + range->npins) | 500 | pin < range->pin_base + range->npins) |
507 | goto out; | 501 | return range; |
508 | } | 502 | } |
509 | range = NULL; | 503 | |
510 | out: | 504 | return NULL; |
505 | } | ||
506 | EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin_nolock); | ||
507 | |||
508 | /** | ||
509 | * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin | ||
510 | * @pctldev: the pin controller device to look in | ||
511 | * @pin: a controller-local number to find the range for | ||
512 | */ | ||
513 | struct pinctrl_gpio_range * | ||
514 | pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, | ||
515 | unsigned int pin) | ||
516 | { | ||
517 | struct pinctrl_gpio_range *range; | ||
518 | |||
519 | mutex_lock(&pctldev->mutex); | ||
520 | range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin); | ||
511 | mutex_unlock(&pctldev->mutex); | 521 | mutex_unlock(&pctldev->mutex); |
522 | |||
512 | return range; | 523 | return range; |
513 | } | 524 | } |
514 | EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin); | 525 | EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin); |
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index b24ea846c867..ca08723b9ee1 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
@@ -182,6 +182,10 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, | |||
182 | return radix_tree_lookup(&pctldev->pin_desc_tree, pin); | 182 | return radix_tree_lookup(&pctldev->pin_desc_tree, pin); |
183 | } | 183 | } |
184 | 184 | ||
185 | extern struct pinctrl_gpio_range * | ||
186 | pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev, | ||
187 | unsigned int pin); | ||
188 | |||
185 | int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps, | 189 | int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps, |
186 | bool dup); | 190 | bool dup); |
187 | void pinctrl_unregister_map(struct pinctrl_map const *map); | 191 | void pinctrl_unregister_map(struct pinctrl_map const *map); |