On 2022-10-27 1:05 PM, Takashi Iwai wrote:
On Thu, 27 Oct 2022 12:29:35 +0200,
Amadeusz Sławiński wrote:
On 10/27/2022 12:21 PM, Takashi Iwai wrote:
On Thu, 27 Oct 2022 10:23:25 +0200,
Cezary Rojewski wrote:
--- a/sound/hda/hdac_stream.c
+++ b/sound/hda/hdac_stream.c
@@ -821,6 +821,27 @@ void snd_hdac_stream_drsm_enable(struct hdac_bus *bus,
}
EXPORT_SYMBOL_GPL(snd_hdac_stream_drsm_enable);
+/*
+ * snd_hdac_stream_wait_drsm - wait for HW to clear RSM for a stream
+ * @azx_dev: HD-audio core stream to await RSM for
+ *
+ * Returns 0 on success and -ETIMEDOUT upon a timeout.
+ */
+int snd_hdac_stream_wait_drsm(struct hdac_stream *azx_dev)
+{
+ struct hdac_bus *bus = azx_dev->bus;
+ u32 mask, reg;
+ int ret;
+
+ mask = 1 << azx_dev->index;
+
+ ret = readb_poll_timeout(bus->drsmcap + AZX_REG_DRSM_CTL, reg, !(reg & mask), 250, 2000);
Remember that HD-audio bus doesn't always allow readb(). Tegra
requires the aligned access, for example.
The readb_poll_timeout macro was updated to take care of that,
https://lore.kernel.org/all/20221007084856.1638302-1-amadeuszx.slawinski@xxxxxxxxxxxxxxx/
so it should be fine?
This patch doesn't use that macro...
Thanks for spotting this out! There's even more to that. The DRSMCTL
register is u32 reg, not u8. Since we are using lower amount of streams
in these tests, it works just fine but with a higher number, the
scenario can fail.
'Just copy-paste things'. Will update the function to make use of u32
equivalent.
Regards,
Czarek