pub fn read_poll_timeout<Op, Cond, T>(
    op: Op,
    cond: Cond,
    sleep_delta: Delta,
    timeout_delta: Delta,
) -> Result<T>Expand description
Polls periodically until a condition is met, an error occurs, or the timeout is reached.
The function repeatedly executes the given operation op closure and
checks its result using the condition closure cond.
If cond returns true, the function returns successfully with
the result of op. Otherwise, it waits for a duration specified
by sleep_delta before executing op again.
This process continues until either op returns an error, cond
returns true, or the timeout specified by timeout_delta is
reached.
This function can only be used in a nonatomic context.
§Errors
If op returns an error, then that error is returned directly.
If the timeout specified by timeout_delta is reached, then
Err(ETIMEDOUT) is returned.
§Examples
use kernel::io::{Io, poll::read_poll_timeout};
use kernel::time::Delta;
const HW_READY: u16 = 0x01;
fn wait_for_hardware<const SIZE: usize>(io: &Io<SIZE>) -> Result<()> {
    match read_poll_timeout(
        // The `op` closure reads the value of a specific status register.
        || io.try_read16(0x1000),
        // The `cond` closure takes a reference to the value returned by `op`
        // and checks whether the hardware is ready.
        |val: &u16| *val == HW_READY,
        Delta::from_millis(50),
        Delta::from_secs(3),
    ) {
        Ok(_) => {
            // The hardware is ready. The returned value of the `op` closure
            // isn't used.
            Ok(())
        }
        Err(e) => Err(e),
    }
}