ASoC: cs42l42: Split probe() and remove() into stages
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Thu, 15 Sep 2022 09:44:37 +0000 (11:44 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 19 Sep 2022 17:05:30 +0000 (18:05 +0100)
commit0285042feda799edca63b35cea0cda32ed0c47c2
tree43f6523ead2c71fb419c06b767eee6e85cef49f5
parent2feab7e7d8c01b67d9ffbfb902d1591c08e9d564
ASoC: cs42l42: Split probe() and remove() into stages

To prepare for adding SoundWire the probe must be split into three
parts:

1) The bus-specific probe
2) Common bus-agnostic probe steps
3) Initialization of the peripheral registers

Step (3) must be separate because on SoundWire devices the probe must
enable power supplies and release reset so that the peripheral can be
enumerated by the bus, but it isn't possible to access registers until
enumeration has completed.

The call to devm_snd_soc_register_component() must be done at stage (2)
so that it can EPROBE_DEFER if necessary. In SoundWire systems stage (3)
is not a probe event so a deferral at this stage would not result in
re-probing dependencies.

A new init_done flag indicates that the chip has been identified and
initialized. This is used to prevent cs42l42_remove(), cs42l42_suspend(),
cs42l42_restore() and cs42l42_irq_thread() from attempting register
accesses if the chip was not successfully initialized. Although this
cannot happen on I2C, because the entire probe would fail, it is
possible on SoundWire if probe succeeds but the cs42l42 is never
enumerated.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Martin PoviĊĦer <povik+lin@cutebit.org>
Link: https://lore.kernel.org/r/20220915094444.11434-5-povik+lin@cutebit.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l42.c
sound/soc/codecs/cs42l42.h