[alsa-devel] I2C controller vs. WM8903 suspend ordering

Stephen Warren swarren at nvidia.com
Tue Aug 2 20:34:18 CEST 2011

Mark, Liam,

We're facing a suspend ordering issue on Tegra, when playing audio when
suspend is initiated. Specifically, the I2C controller to which the WM8903
codec is attached is suspended before snd_soc_suspend is executed. This
then prevents any I2C register accesses during snd_soc_suspend, so various
analog paths are left active within the WM8903 during suspend, and this
causes a pop noise during resume.

(For reference, this is in the chromeos-2.6.38 kernel, with ASoC back-
ported from a point prior to 2.6.39)

We've found that switching the Tegra I2C controller from struct
platform_driver.{suspend,resume} to .{suspend,resume}_noirq solves this.
However, this seems like it's more of an accident than registering an
explicit dependency, especially since most I2C controllers just use
suspend rather than suspend_noirq.

Is there a way to explicitly indicate that sound should be suspended before
the I2C controller? I assume the issue is more that snd_soc_suspend shuts
down various DAPM paths, which can't actually program the HW for this when
this happens after I2C is shut down, rather than just the I2C controller
being suspended before the WM8903 driver itself (which I assume doesn't
happen, but didn't check).

Thanks for any pointers!


More information about the Alsa-devel mailing list