On Mon, Sep 25, 2017 at 01:30:51AM +0200, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki > > As reported by Rajat Jain, there are problems when ACPI operation > region handlers or similar, called at the ->resume_early() time, for > I2C client devices try to access an I2C controller that has already > been suspended at that point. To avoid that, move the suspend/resume > of i2c-designware-platdrv to the late/early stages, respectively. > > While at it, avoid resuming the device from runtime suspend in the > driver's ->suspend callback which isn't particularly nice. [A better > approach would be to make the driver track the PM state of the device > so that it doesn't need to resume it in ->suspend, so implement it.] > > First, drop dw_i2c_plat_suspend() added by commit a23318feeff6 (i2c: > designware: Fix system suspend) and rename dw_i2c_plat_runtime_suspend() > back to dw_i2c_plat_suspend(). > > Second, point the driver's ->late_suspend and ->early_resume > callbacks, rather than its ->suspend and ->resume callbacks, > to dw_i2c_plat_suspend() and dw_i2c_plat_resume(), respectively, > so that they are not executed in parallel with each other, for > example if runtime resume of the device takes place during system > suspend. > > Finally, add "suspended" and "skip_resume" flags to struct dw_i2c_dev > and make dw_i2c_plat_suspend() and dw_i2c_plat_resume() use them to > avoid suspending or resuming the device twice in a row and to avoid > resuming a previously runtime-suspended device during system resume. > > Signed-off-by: Rafael J. Wysocki > Tested-by: Jarkko Nikula > Tested-by: Mika Westerberg > Tested-by: Johannes Stezenbach > Tested-by: Rajat Jain Applied to for-next, thanks!