On Tue, Apr 26, 2022 at 12:41 PM Charles Keepax ckeepax@opensource.cirrus.com wrote:
On Tue, Apr 26, 2022 at 11:36:26AM -0500, Adam Ford wrote:
I have an imx8m Mini with a wm8962 codec. If I run a speaker test and suspend the board while the speaker test is running, I get the following upon wake:
wm8962 3-001a: ASoC: error at soc_component_read_no_lock on wm8962.3-001a: -16
This message repeats itself over and over again. If I attempt to use any audio, it fails until I reboot the board.
If I run the audio test, then exit and suspend, the audio works upon resume, so it appears to be related to suspending while running.
I am hoping someone might have a suggestion as to what I might be able to do or try to allow this to successfully suspend and resume if the device is playing sound.
Hmm... EBUSY is what regmap returns when a volatile register is read whilst the chip is still in cache only. The driver does appear to be missing the usually fairly important work around to avoid the IRQ and the PM runtime deadlocking on resume. Although not sure that would actually lead to the error message you are seeing.
Would be really handy to see a little more of the log leading up to the failure if that is possible? And would be really awesome if you had any idea which read was returning the error? You could shove a dump_stack in _soc_component_ret next to the error message.
Because NXP had a downstream kernel, and it didn't appear to happen when using their downstream kernel, I wanted to see the difference. I found this:
static const struct dev_pm_ops wm8962_pm = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) SET_RUNTIME_PM_OPS(wm8962_runtime_suspend, wm8962_runtime_resume, NULL) };
I applied this, and it appears to make the issue go away on a 5.15 kernel. I haven't tried it on a 5.18 yet. If this fixes the issue, would that be an acceptable solution to push upstream?
adam
Thanks, Charles