>> +/* >> + * Hardware recommendations are to wait ~10us before checking any hardware transition >> + * reported by bits changing status. >> + * This value does not need to be super-precise, a slack of 5us is perfectly acceptable. >> + * The worst-case is about 1ms before reporting an issue >> + */ >> +#define HDAML_POLL_DELAY_MIN_US 10 >> +#define HDAML_POLL_DELAY_SLACK_US 5 >> +#define HDAML_POLL_DELAY_RETRY 100 >> + >> +static int check_power_active(u32 __iomem *lctl, int sublink, bool enable) >> +{ >> + int mask = BIT(sublink) << AZX_ML_LCTL_CPA_SHIFT; >> + int retry = HDAML_POLL_DELAY_RETRY; >> + u32 val; >> + >> + usleep_range(HDAML_POLL_DELAY_MIN_US, >> + HDAML_POLL_DELAY_MIN_US + HDAML_POLL_DELAY_SLACK_US); >> + do { >> + val = readl(lctl); >> + if (enable) { >> + if (val & mask) >> + return 0; >> + } else { >> + if (!(val & mask)) >> + return 0; >> + } >> + usleep_range(HDAML_POLL_DELAY_MIN_US, >> + HDAML_POLL_DELAY_MIN_US + HDAML_POLL_DELAY_SLACK_US); >> + >> + } while (--retry); >> + >> + return -EIO; >> +} > > Can read_poll_timeout() and co be alternative? Yes they can. I chose the simple route because I find it clearer, and because we modified the sleep/retries compared to previous implementations. here's what I wrote in the commit message: " Note that the _check_power_active() implementation is similar to previous helpers in sound/hda/ext, with sleep duration and timeout aligned with hardware recommendations. If desired, this helper could be modified in a second step with .e.g. readl_poll_timeout() " If you want to jump directly to the next step that'd be fine. Peter had the same comment, so I'll go with the flow.