• Richard Fitzgerald's avatar
    ASoC: cs35l56: Add basic system suspend handling · f9dc6b87
    Richard Fitzgerald authored
    This adds the main handling for system suspend but does not handle
    re-patching the firmware after system resume.
    
    This is a multi-stage suspend and resume because if there is a
    RESET line it is almost certain that it will be shared by all the
    amps. So every amp must have done its suspend before we can
    assert RESET. Likewise we must de-assert RESET before the amps
    can resume.
    
    It's preferable to assert RESET before we turning off regulators, and
    while they power up.
    
    The actual suspend and resume is done by using the pair
    pm_runtime_force_suspend() and pm_runtime_force_resume() to
    re-use our runtime suspend/resume sequences.
    
    pm_runtime_force_suspend() will disable our pm_runtime. If we were
    runtime-resumed it calls our runtime_suspend().
    
    pm_runtime_force_resume() re-enables pm_runtime and if we were
    originally runtime-resumed before the pm_runtime_force_suspend()
    it calls our runtime_resume(). Otherwise it leaves us
    runtime-suspended.
    
    The general process is therefore:
    
     suspend() -> finish dsp_work and then run our runtime_suspend
     suspend_late() -> assert RESET and turn off supplies
     resume_early() -> enable supplies and de-assert RESET
     resume() -> pm_runtime_force_resume()
    
    In addition, to prevent the IRQ handler running in the period
    between pm_runtime_force_suspend() and pm_runtime_force_resume()
    the parent IRQ is temporarily disabled:
     - from suspend until suspend_noirq
     - from resume_noirq until resume
    Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20230411152528.329803-6-rf@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    f9dc6b87
cs35l56.h 2.37 KB