summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinmux.c
diff options
context:
space:
mode:
authorRichard Genoud <richard.genoud@gmail.com>2013-03-21 12:21:47 +0100
committerLinus Walleij <linus.walleij@linaro.org>2013-03-21 19:26:18 +0100
commit740924a267e85de09707ea158bbf594b4d8bae01 (patch)
tree7780a503c52891a2aac500cad9d9d3388fb5b648 /drivers/pinctrl/pinmux.c
parent48a23fac5eb0030a2d578ee2bde21b6e035b3d57 (diff)
downloadlinux-740924a267e85de09707ea158bbf594b4d8bae01.tar.gz
linux-740924a267e85de09707ea158bbf594b4d8bae01.tar.bz2
linux-740924a267e85de09707ea158bbf594b4d8bae01.zip
pinmux: forbid mux_usecount to be set at UINT_MAX
If pin_free is called on a pin already freed, mux_usecount is set to UINT_MAX which is really a bad idea. This will issue a warning, so that we can correct the code responsible for the double free. Signed-off-by: Richard Genoud <richard.genoud@gmail.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
-rw-r--r--drivers/pinctrl/pinmux.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index 1a00658b3ea0..bd83c8b01cd1 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -194,6 +194,11 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
}
if (!gpio_range) {
+ /*
+ * A pin should not be freed more times than allocated.
+ */
+ if (WARN_ON(!desc->mux_usecount))
+ return NULL;
desc->mux_usecount--;
if (desc->mux_usecount)
return NULL;