wait: add a function to wait for a register ready by pulling method

The register status is checked by polling its value in request time

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
This commit is contained in:
Rander Wang 2018-09-17 17:22:45 +08:00 committed by Pan Xiuli
parent 3b966f3d57
commit a2f0dd0931
1 changed files with 24 additions and 0 deletions

View File

@ -36,6 +36,7 @@
#include <stdint.h>
#include <errno.h>
#include <arch/wait.h>
#include <sof/io.h>
#include <sof/debug.h>
#include <sof/work.h>
#include <sof/timer.h>
@ -186,4 +187,27 @@ static inline int poll_for_completion_delay(completion_t *comp, uint64_t us)
return 0;
}
static inline int poll_for_register_delay(uint32_t reg,
uint32_t mask,
uint32_t val, uint64_t us)
{
uint64_t tick = clock_us_to_ticks(CLK_CPU, us);
uint32_t tries = DEFAULT_TRY_TIMES;
uint64_t delta = tick / tries;
if (!delta) {
delta = us;
tries = 1;
}
while ((io_reg_read(reg) & mask) != val) {
if (!tries--) {
trace_error(TRACE_CLASS_WAIT, "ewt");
return -EIO;
}
wait_delay(delta);
}
return 0;
}
#endif