summaryrefslogtreecommitdiff
path: root/include/reset.h
diff options
context:
space:
mode:
authorMichal Simek <[email protected]>2026-05-25 13:45:42 +0200
committerMichal Simek <[email protected]>2026-06-08 10:50:06 +0200
commit19f7def2646f2ec2926e8a0fcff50d4b754eec92 (patch)
tree4c2f6d7b1a04203930f44a71f3a5fdc2006f706d /include/reset.h
parent4706bd020886bc8fd583efb91aa227ed99c95c45 (diff)
reset: Add reset_reset() and reset_reset_bulk() API
Add reset_reset() and reset_reset_bulk() functions to the reset controller API. These functions assert and then deassert reset signals in a single call, providing a convenient way to pulse/toggle a reset line. This mimics the Linux kernel's reset_control_reset() and reset_control_bulk_reset() APIs. The new functions are useful for drivers that need to cycle a reset line during initialization or error recovery but with also passing delay parameter. If a driver implements the rst_reset op, it will be called directly with the delay parameter. Otherwise, the reset core performs reset_assert(), optional udelay(), and reset_deassert() as fallback. Reviewed-by: Simon Glass <[email protected]> Signed-off-by: Michal Simek <[email protected]> Link: https://lore.kernel.org/r/55ddd313c9e7b2d4dc79ab36bdd0040f871610f6.1779709539.git.michal.simek@amd.com
Diffstat (limited to 'include/reset.h')
-rw-r--r--include/reset.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/include/reset.h b/include/reset.h
index 036a786d2ac..58574b983f6 100644
--- a/include/reset.h
+++ b/include/reset.h
@@ -321,6 +321,45 @@ int reset_deassert(struct reset_ctl *reset_ctl);
int reset_deassert_bulk(struct reset_ctl_bulk *bulk);
/**
+ * reset_reset - Reset a HW module by asserting and deasserting a reset signal.
+ *
+ * This function will assert and then deassert the specified reset signal,
+ * thus resetting the affected HW module. This is a convenience function
+ * that combines reset_assert() and reset_deassert().
+ *
+ * If the controller implements struct reset_ops.rst_reset, that callback
+ * is used and @delay_us is interpreted as documented there. Otherwise the
+ * core performs reset_assert(), udelay(@delay_us), then reset_deassert().
+ *
+ * @reset_ctl: A reset control struct that was previously successfully
+ * requested by reset_get_by_*().
+ * @delay_us: Delay in microseconds between assert and deassert on the
+ * fallback path; meaning is driver-specific when rst_reset is used.
+ * Use 0 for no delay on the fallback path.
+ * Return: 0 if OK, or a negative error code.
+ */
+int reset_reset(struct reset_ctl *reset_ctl, ulong delay_us);
+
+/**
+ * reset_reset_bulk - Reset all HW modules in a reset control bulk struct.
+ *
+ * This calls reset_reset() on each entry in order. Each line therefore
+ * completes its own assert/delay/deassert (or controller rst_reset) before
+ * the next entry starts. That matches Linux reset_control_bulk_reset().
+ *
+ * When several lines must stay asserted together for @delay_us (typical
+ * multi-reset controllers), use reset_assert_bulk(), udelay(@delay_us),
+ * and reset_deassert_bulk() instead.
+ *
+ * @bulk: A reset control bulk struct that was previously successfully
+ * requested by reset_get_bulk().
+ * @delay_us: Delay in microseconds passed to each reset_reset(); see
+ * reset_reset() and struct reset_ops.rst_reset.
+ * Return: 0 if OK, or a negative error code.
+ */
+int reset_reset_bulk(struct reset_ctl_bulk *bulk, ulong delay_us);
+
+/**
* rst_status - Check reset signal status.
*
* @reset_ctl: The reset signal to check.
@@ -443,6 +482,16 @@ static inline int reset_deassert_bulk(struct reset_ctl_bulk *bulk)
return 0;
}
+static inline int reset_reset(struct reset_ctl *reset_ctl, ulong delay_us)
+{
+ return -ENOSYS;
+}
+
+static inline int reset_reset_bulk(struct reset_ctl_bulk *bulk, ulong delay_us)
+{
+ return -ENOSYS;
+}
+
static inline int reset_status(struct reset_ctl *reset_ctl)
{
return -ENOTSUPP;