1*7a1970f4SGhennadi Procopciuc /* 2*7a1970f4SGhennadi Procopciuc * Copyright 2025 NXP 3*7a1970f4SGhennadi Procopciuc * 4*7a1970f4SGhennadi Procopciuc * SPDX-License-Identifier: BSD-3-Clause 5*7a1970f4SGhennadi Procopciuc */ 6*7a1970f4SGhennadi Procopciuc 7*7a1970f4SGhennadi Procopciuc #ifndef MMIO_POLL_H 8*7a1970f4SGhennadi Procopciuc #define MMIO_POLL_H 9*7a1970f4SGhennadi Procopciuc 10*7a1970f4SGhennadi Procopciuc #include <errno.h> 11*7a1970f4SGhennadi Procopciuc #include <drivers/delay_timer.h> 12*7a1970f4SGhennadi Procopciuc #include <lib/mmio.h> 13*7a1970f4SGhennadi Procopciuc 14*7a1970f4SGhennadi Procopciuc /** 15*7a1970f4SGhennadi Procopciuc * mmio_read_poll_timeout - Continuously check an address until a specific 16*7a1970f4SGhennadi Procopciuc * condition is satisfied or a timeout is reached. 17*7a1970f4SGhennadi Procopciuc * @op: The mmio_read_* operator to read the register 18*7a1970f4SGhennadi Procopciuc * @val: The variable where the read value is stored. 19*7a1970f4SGhennadi Procopciuc * @cond: The condition used to stop polling, which can be a macro using @val. 20*7a1970f4SGhennadi Procopciuc * @timeout_us: Timeout in microseconds. 21*7a1970f4SGhennadi Procopciuc * @args: Arguments to be passed to @op. 22*7a1970f4SGhennadi Procopciuc * 23*7a1970f4SGhennadi Procopciuc * Return: 0 if the condition @cond is evaluated to true within @timeout_us 24*7a1970f4SGhennadi Procopciuc * microseconds, or -ETIMEOUT in case of a timeout. In either case, 25*7a1970f4SGhennadi Procopciuc * the last read value will be stored in @val. 26*7a1970f4SGhennadi Procopciuc */ 27*7a1970f4SGhennadi Procopciuc #define mmio_read_poll_timeout(op, val, cond, timeout_us, args...)\ 28*7a1970f4SGhennadi Procopciuc ({\ 29*7a1970f4SGhennadi Procopciuc int _rv = -ETIMEDOUT; \ 30*7a1970f4SGhennadi Procopciuc uint32_t _tout_us = (timeout_us); \ 31*7a1970f4SGhennadi Procopciuc uint64_t _tout = timeout_init_us(_tout_us);\ 32*7a1970f4SGhennadi Procopciuc do {\ 33*7a1970f4SGhennadi Procopciuc (val) = (op)(args);\ 34*7a1970f4SGhennadi Procopciuc if (cond) { \ 35*7a1970f4SGhennadi Procopciuc _rv = 0;\ 36*7a1970f4SGhennadi Procopciuc break;\ 37*7a1970f4SGhennadi Procopciuc } \ 38*7a1970f4SGhennadi Procopciuc } while (!timeout_elapsed(_tout));\ 39*7a1970f4SGhennadi Procopciuc _rv;\ 40*7a1970f4SGhennadi Procopciuc }) 41*7a1970f4SGhennadi Procopciuc 42*7a1970f4SGhennadi Procopciuc #define mmio_read_32_poll_timeout(addr, val, cond, timeout_us) \ 43*7a1970f4SGhennadi Procopciuc mmio_read_poll_timeout(&mmio_read_32, val, cond, timeout_us, addr) 44*7a1970f4SGhennadi Procopciuc 45*7a1970f4SGhennadi Procopciuc #endif /* MMIO_POLL_H */ 46