aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@ingics.com>2013-08-18 22:07:46 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-08-28 07:13:05 -0400
commit9b77ace409e1419c331209c4c8eb2c8bc990e9fd (patch)
tree0bb3a43aee693c3fe68924a2dfc07254ef3f69b3 /drivers/pinctrl
parent406044695fb286110324491f26f3e05048488809 (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.c4
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}
572EXPORT_SYMBOL_GPL(pinctrl_request_gpio); 576EXPORT_SYMBOL_GPL(pinctrl_request_gpio);