diff options
author | Axel Lin <axel.lin@ingics.com> | 2013-08-18 22:07:46 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2013-08-28 07:13:05 -0400 |
commit | 9b77ace409e1419c331209c4c8eb2c8bc990e9fd (patch) | |
tree | 0bb3a43aee693c3fe68924a2dfc07254ef3f69b3 /drivers/pinctrl | |
parent | 406044695fb286110324491f26f3e05048488809 (diff) |
pinctrl: core: Add proper mutex lock in pinctrl_request_gpio
This one is missed in commit 42fed7ba "pinctrl: move subsystem mutex to
pinctrl_dev struct".
I think this fixes the race between pin_free() and pin_request() calls.
It protects accessing the members of pctldev->desc.
(e.g. update desc->mux_usecount, desc->gpio_owner, desc->mux_owner, etc)
Current code grabs pctldev->mutex before calling pinmux_free_gpio(),
but did not grab the mutex while calling pinmux_request_gpio().
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/core.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 7094a8129008..054d14b43db4 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -562,11 +562,15 @@ int pinctrl_request_gpio(unsigned gpio) | |||
562 | return ret; | 562 | return ret; |
563 | } | 563 | } |
564 | 564 | ||
565 | mutex_lock(&pctldev->mutex); | ||
566 | |||
565 | /* Convert to the pin controllers number space */ | 567 | /* Convert to the pin controllers number space */ |
566 | pin = gpio_to_pin(range, gpio); | 568 | pin = gpio_to_pin(range, gpio); |
567 | 569 | ||
568 | ret = pinmux_request_gpio(pctldev, range, pin, gpio); | 570 | ret = pinmux_request_gpio(pctldev, range, pin, gpio); |
569 | 571 | ||
572 | mutex_unlock(&pctldev->mutex); | ||
573 | |||
570 | return ret; | 574 | return ret; |
571 | } | 575 | } |
572 | EXPORT_SYMBOL_GPL(pinctrl_request_gpio); | 576 | EXPORT_SYMBOL_GPL(pinctrl_request_gpio); |