• Tony Lindgren's avatar
    spi: omap2-mcspi: Idle hardware during suspend and resume · 5a686b2c
    Tony Lindgren authored
    We currently are calling mcspi suspend and resume without considering
    that mcspi might provide resources for other device driver such as
    regulators. This means resume can fail and will produce -EACCES if
    errors if anything calls mcspi functions between device_prepare()
    and device_complete().
    
    To fix the issue, let's do the following changes:
    
    1. Let's add checking for return values for pm_runtime_get calls,
       and call pm_runtime_put_noidle() on errors. Things still fail
       after this change, but at least we see something is wrong as
       we now see -EACCES errors on resume.
    
    2. Let's use noirq level for suspend and resume as other drivers
       can still call SPI related functions on suspend and resume. This
       still won't fix the -EACCES issue, but gets us to something a bit
       saner.
    
    3. Finally, let's modify suspend and resume to call to make sure
       the device is idled properly on suspend. We have device_prepare()
       call pm_runtime_get_noresume() that won't get released until in
       device_complete() when it calls pm_runtime_put(). So if SPI is
       still active on entering suspend, it will never get idled unless
       we add calls to pm_runtime_force_suspend() and resume. This also
       fixes the -EACCES errors on resume together with changes 1 and 2
       above.
    
    And since we're already rewriting suspend resume functions, let's
    arrange the order of suspend and resume functions to be like they
    usually are with suspend first.
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    5a686b2c
spi-omap2-mcspi.c 38.5 KB