[PATCH v2 1/4] reset: Add reset_reset() and reset_reset_bulk() API
Simon Glass
sjg at chromium.org
Fri May 15 16:10:44 CEST 2026
Hi Michal,
On Wed, 13 May 2026 at 02:25, Michal Simek <michal.simek at amd.com> wrote:
>
>
>
> On 5/7/26 23:11, Simon Glass wrote:
> > Hi Michal,
> >
> > On 2026-05-05T12:30:28, Michal Simek <michal.simek at amd.com> wrote:
> >> 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.
> >>
> >> Signed-off-by: Michal Simek <michal.simek at amd.com>
> >>
> >> drivers/reset/reset-uclass.c | 34 ++++++++++++++++++++++++++++++++++
> >> include/reset-uclass.h | 12 ++++++++++++
> >> include/reset.h | 41 +++++++++++++++++++++++++++++++++++++++++
> >> 3 files changed, 87 insertions(+)
> >
> > Reviewed-by: Simon Glass <sjg at chromium.org>
> >
> > optional nits / thoughts below
> >
> >> diff --git a/include/reset-uclass.h b/include/reset-uclass.h
> >> @@ -76,6 +76,18 @@ struct reset_ops {
> >> + /**
> >> + * rst_reset - Reset a HW module.
> >> + *
> >> + * This optional function triggers a reset pulse on the reset line,
> >> + * asserting and then deasserting the reset signal. If not implemented,
> >> + * the reset core will use rst_assert followed by rst_deassert.
> >> + *
> >> + * @reset_ctl: The reset signal to pulse.
> >> + * @delay_us: Delay in microseconds between assert and deassert.
> >> + * @return 0 if OK, or a negative error code.
> >> + */
> >> + int (*rst_reset)(struct reset_ctl *reset_ctl, ulong delay_us);
> >
> > Please document that the core inserts a udelay(delay_us) between
> > rst_assert and rst_deassert in the fallback path, and clarify whether
> > an rst_reset implementation must honour delay_us or may treat it as a
> > hint. Without that, authors don't really know what to do with the
> > value.
>
> ok. Will fix in v3.
>
>
> >> diff --git a/drivers/reset/reset-uclass.c b/drivers/reset/reset-uclass.c
> >> @@ -225,6 +226,39 @@ int reset_deassert_bulk(struct reset_ctl_bulk *bulk)
> >> +int reset_reset_bulk(struct reset_ctl_bulk *bulk, ulong delay_us)
> >> +{
> >> + int i, ret;
> >> +
> >> + for (i = 0; i < bulk->count; i++) {
> >> + ret = reset_reset(&bulk->resets[i], delay_us);
> >> + if (ret < 0)
> >> + return ret;
> >> + }
> >> +
> >> + return 0;
> >> +}
> >
> > Just to check - pulsing each reset sequentially means the first
> > finishes its full assert/delay/deassert before the next starts
> > asserting. For the cadence_qspi case in 3/4, where multiple OSPI reset
> > lines are expected to be asserted together, the previous code did
> > assert_bulk() / udelay() / deassert_bulk() so all lines were held low
> > simultaneously. The new behaviour is different. Is that intentional,
> > and have you confirmed the cadence controller is happy with it?
>
> You are right that behavior has changed but it is aligned with what Linux kernel
> is doing.
> We are using only one reset line that's why not an issue for us. But it saves
> one firmware call (per reset line).
>
> int reset_control_bulk_reset(int num_rstcs,
> struct reset_control_bulk_data *rstcs)
> {
> int ret, i;
>
> for (i = 0; i < num_rstcs; i++) {
> ret = reset_control_reset(rstcs[i].rstc);
> if (ret)
> return ret;
> }
>
> return 0;
> }
> EXPORT_SYMBOL_GPL(reset_control_bulk_reset);
>
>
> If it is problematic we can go back to assert_bulk/delay/deassert_bulk in
> cadence driver.
Well if it matches Linux we should be OK.
Regards,
Simon
More information about the U-Boot
mailing list