Hello Michal,

> From: Michal Simek <[email protected]>
> On 5/18/26 14:07, Maarten Brock wrote:
> >> From: Michal Simek <[email protected]>
> >> On 5/18/26 12:21, Maarten Brock wrote:
> >>
> >> I expect you would like to do it like this right?
> >>
> >> int reset_reset_bulk(struct reset_ctl_bulk *bulk, ulong delay_us)
> >> {
> >>    int ret;
> >>
> >>    ret = reset_assert_bulk(bulk);
> >>    if (ret) {
> >>            dev_err(bus, "Failed to assert reset: %d\n", ret);
> >>            return ret;
> >>    }
> >>
> >>    udelay(delay_us);
> >>
> >>    /* Deassert all OSPI reset lines */
> >>    ret = reset_deassert_bulk(bulk);
> >>    if (ret) {
> >>            dev_err(bus, "Failed to deassert reset: %d\n", ret);
> >>            return ret;
> >>    }
> >>
> >>    return 0;
> >> }
> >
> > That is correct.
> > And a single delay of delay_us takes less time than N*delay_us (for N>1), 
> > so the total startup time is smaller (a.k.a. faster startup).
> 
> It really depends on other factors and delay time. In our case it is not just
> MMIO access. But it is SMC to TF-A and then seconding request over mailbox to
> another firmware to ack it first and then do it. And with above you would have
> to do twice compare to once.
> 
> I can do another optimization which is that if bulk->count is 1 then call
> reset_reset() directly and for others do what you see above.
> 
> What do you think?

I very much doubt that all sorts of actions and compares will ever take more 
time than 1 us, unless some serial protocol is involved (uart/spi/i2c).
So, I expect that delay_us is always the dominant elapsed time. And N*delay_us 
even more so.

I do understand that if the delay is handled by rst_reset() and underlying 
hardware, things might be different.
So special handling of bulk->count=1 or *all* bulk resets are handled by 
rst_reset() could be a good idea.

How about something like this?

int reset_reset_bulk(struct reset_ctl_bulk *bulk, ulong delay_us)
{
        int i, ret, soft = 0;

        for (i = 0; i < bulk->count; i++) {
                struct reset_ops *ops = reset_dev_ops(bulk->resets[i].dev);

                if (ops->rst_reset) {
                        ret = ops->rst_reset(&bulk->resets[i], delay_us);
                } else {
                        ret = reset_assert(&bulk->resets[i]);
                        soft++;
                }
                if (ret < 0)
                        return ret;
        }

        if (soft == 0)
                return 0;

        udelay(delay_us);

        for (i = 0; i < bulk->count; i++) {
                struct reset_ops *ops = reset_dev_ops(bulk->resets[i].dev);

                if (!ops->rst_reset) {
                        ret = reset_deassert(&bulk->resets[i]);
                        if (ret < 0)
                                return ret;
                }
        }

        return 0;
}

Kind regards,
Maarten Brock

Reply via email to