Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e38d457d authored by Axel Lin's avatar Axel Lin Committed by Linus Walleij
Browse files

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: default avatarAxel Lin <axel.lin@ingics.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 89377aa5
Loading
Loading
Loading
Loading
+21 −7
Original line number Original line Diff line number Diff line
@@ -409,11 +409,7 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
			dev_err(pctldev->dev,
			dev_err(pctldev->dev,
				"could not request pin %d on device %s\n",
				"could not request pin %d on device %s\n",
				pins[i], pinctrl_dev_get_name(pctldev));
				pins[i], pinctrl_dev_get_name(pctldev));
			/* On error release all taken pins */
			goto err_pin_request;
			i--; /* this pin just failed */
			for (; i >= 0; i--)
				pin_free(pctldev, pins[i], NULL);
			return -ENODEV;
		}
		}
	}
	}


@@ -429,8 +425,26 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
		desc->mux_setting = &(setting->data.mux);
		desc->mux_setting = &(setting->data.mux);
	}
	}


	return ops->enable(pctldev, setting->data.mux.func,
	ret = ops->enable(pctldev, setting->data.mux.func,
			  setting->data.mux.group);
			  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)
void pinmux_disable_setting(struct pinctrl_setting const *setting)