aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pinctrl/core.c35
-rw-r--r--drivers/pinctrl/core.h4
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}
482EXPORT_SYMBOL_GPL(pinctrl_get_group_pins); 482EXPORT_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 */
489struct pinctrl_gpio_range * 484struct pinctrl_gpio_range *
490pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, 485pinctrl_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
510out: 504 return NULL;
505}
506EXPORT_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 */
513struct pinctrl_gpio_range *
514pinctrl_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}
514EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin); 525EXPORT_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
185extern struct pinctrl_gpio_range *
186pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev,
187 unsigned int pin);
188
185int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps, 189int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
186 bool dup); 190 bool dup);
187void pinctrl_unregister_map(struct pinctrl_map const *map); 191void pinctrl_unregister_map(struct pinctrl_map const *map);