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

Commit 22815f18 authored by Thierry Reding's avatar Thierry Reding Committed by Philipp Zabel
Browse files

reset: Add acquire/release support for arrays



Add implementations that apply acquire and release operations to all
reset controls part of a reset control array.

Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Reviewed-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent f31d5c24
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -245,6 +245,34 @@ static int reset_control_array_deassert(struct reset_control_array *resets)
	return ret;
}

static int reset_control_array_acquire(struct reset_control_array *resets)
{
	unsigned int i;
	int err;

	for (i = 0; i < resets->num_rstcs; i++) {
		err = reset_control_acquire(resets->rstc[i]);
		if (err < 0)
			goto release;
	}

	return 0;

release:
	while (i--)
		reset_control_release(resets->rstc[i]);

	return err;
}

static void reset_control_array_release(struct reset_control_array *resets)
{
	unsigned int i;

	for (i = 0; i < resets->num_rstcs; i++)
		reset_control_release(resets->rstc[i]);
}

static inline bool reset_control_is_array(struct reset_control *rstc)
{
	return rstc->array;
@@ -464,6 +492,9 @@ int reset_control_acquire(struct reset_control *rstc)
	if (WARN_ON(IS_ERR(rstc)))
		return -EINVAL;

	if (reset_control_is_array(rstc))
		return reset_control_array_acquire(rstc_to_array(rstc));

	mutex_lock(&reset_list_mutex);

	if (rstc->acquired) {
@@ -502,6 +533,9 @@ void reset_control_release(struct reset_control *rstc)
	if (!rstc || WARN_ON(IS_ERR(rstc)))
		return;

	if (reset_control_is_array(rstc))
		reset_control_array_release(rstc_to_array(rstc));
	else
		rstc->acquired = false;
}
EXPORT_SYMBOL_GPL(reset_control_release);
+6 −0
Original line number Diff line number Diff line
@@ -470,6 +470,12 @@ of_reset_control_array_get_exclusive(struct device_node *node)
	return of_reset_control_array_get(node, false, false, true);
}

static inline struct reset_control *
of_reset_control_array_get_exclusive_released(struct device_node *node)
{
	return of_reset_control_array_get(node, false, false, false);
}

static inline struct reset_control *
of_reset_control_array_get_shared(struct device_node *node)
{