On Thu, 2023-12-07 at 18:20 +0000, Mark Brown wrote: > On Thu, Dec 07, 2023 at 12:59:44AM +0100, Gergo Koteles wrote: > > > The amp has 3 level addressing (BOOK, PAGE, REG). > > The regcache couldn't handle it. > > So the books aren't currently used so the driver actually works? > It writes to the book 0 and 8c. The initialization works with regcache, because it writes also the i2c devices. > > static int tas2781_system_suspend(struct device *dev) > > @@ -770,10 +758,7 @@ static int tas2781_system_suspend(struct device *dev) > > return ret; > > > > /* Shutdown chip before system suspend */ > > - regcache_cache_only(tas_priv->regmap, false); > > tasdevice_tuning_switch(tas_priv, 1); > > - regcache_cache_only(tas_priv->regmap, true); > > - regcache_mark_dirty(tas_priv->regmap); > > > > /* > > * Reset GPIO may be shared, so cannot reset here. > > How can this work over system suspend? This just removes the cache with > no replacement so if the device looses power over suspend (which seems > likely) then all the register state will be lost. A similar issue may > potentially exist over runtime suspend on an ACPI system with > sufficiently heavily optimised power management. In runtime_resume, only one of the two amplifiers goes back. The runtime_suspend sets the current book/prog/conf to -1 on all devices, and tas2781_hda_playback_hook will restore the program/configuration/profile with tasdevice_tuning_switch. And only one, because tasdevice_change_chn_book directly changes the address of i2c_client, so the unlucky one gets invalid values in its actual book from regcache_sync. system_restore doesn't work at all, because regcache_cache_only stays true since system_suspend. It works without the regcache functions.