• Richard Fitzgerald's avatar
    ASoC: cs42l42: Split probe() and remove() into stages · 0285042f
    Richard Fitzgerald authored
    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: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Signed-off-by: default avatarMartin Povišer <povik+lin@cutebit.org>
    Link: https://lore.kernel.org/r/20220915094444.11434-5-povik+lin@cutebit.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    0285042f
cs42l42.c 72.9 KB