static int jh7100_reset_update()

in reset-starfive-jh7100.c [64:94]


static int jh7100_reset_update(struct reset_controller_dev *rcdev,
			       unsigned long id, bool assert)
{
	struct jh7100_reset *data = jh7100_reset_from(rcdev);
	unsigned long offset = BIT_ULL_WORD(id);
	u64 mask = BIT_ULL_MASK(id);
	void __iomem *reg_assert = data->base + JH7100_RESET_ASSERT0 + offset * sizeof(u64);
	void __iomem *reg_status = data->base + JH7100_RESET_STATUS0 + offset * sizeof(u64);
	u64 done = jh7100_reset_asserted[offset] & mask;
	u64 value;
	unsigned long flags;
	int ret;

	if (!assert)
		done ^= mask;

	spin_lock_irqsave(&data->lock, flags);

	value = readq(reg_assert);
	if (assert)
		value |= mask;
	else
		value &= ~mask;
	writeq(value, reg_assert);

	/* if the associated clock is gated, deasserting might otherwise hang forever */
	ret = readq_poll_timeout_atomic(reg_status, value, (value & mask) == done, 0, 1000);

	spin_unlock_irqrestore(&data->lock, flags);
	return ret;
}