pinctrl: pinmux: Release all taken pins in pinmux_enable_setting error paths
PATCH 1/1 pinctrl: pinmux: Release all taken pins in pinmux_enable_setting error paths
Currently pinmux_enable_setting does not release all taken pins if ops->enable() returns error. This patch ensures all taken pins are released in any error paths.
Signed-off-by Axel Lin <[email protected]>
--- drivers/pinctrl/pinmux.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
drivers/pinctrl/pinmux.c +21 -7
@@ -409,11 +409,7 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)dev_err (pctldev->dev,"could not request pin %d on device %s\n" , pins[i],pinctrl_dev_get_name (pctldev)); -/* On error release all taken pins */ - i--;/* this pin just failed */ -for (; i >=0 ; i--) -pin_free (pctldev, pins[i],NULL ); -return -ENODEV ; + goto err_pin_request; } }
@@ -429,8 +425,26 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) desc->mux_setting = &(setting->data.mux); } -return ops->enable (pctldev, setting->data.mux.func, - setting->data.mux.group); + ret = ops->enable (pctldev, setting->data.mux.func, + setting->data.mux.group); + +if (ret) + goto err_enable; + +return 0 ; + +err_enable: +for (i =0 ; i < num_pins; i++) { + desc =pin_desc_get (pctldev, pins[i]); +if (desc) + desc->mux_setting =NULL ; + } +err_pin_request: +/* On error release all taken pins */ +while (--i >=0 ) +pin_free (pctldev, pins[i],NULL ); + +return ret; }void pinmux_disable_setting (struct pinctrl_setting const *setting)
Signature · 1 line
1.7.9.5
Quoted 5 lines · Axel Lin
Currently
pinmux_enable_settingdoes not release all taken pins ifops->enable()returns error. This patch ensures all taken pins are released in any error paths.Signed-off-by Axel Lin <[email protected]>
Thanks a *lot* that's a pretty important fix Axel! :-)
Patch applied.
Yours,
Linus Walleij