Skip to content

Commit

Permalink
pinctrl: pinmux: Release all taken pins in pinmux_enable_setting erro…
Browse files Browse the repository at this point in the history
…r 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 <axel.lin@ingics.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Axel Lin authored and Linus Walleij committed Nov 11, 2012
1 parent 89377aa commit e38d457
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions drivers/pinctrl/pinmux.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand All @@ -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)
Expand Down

0 comments on commit e38d457

Please sign in to comment.