Re: [PATCH] ASoC: tas2783-sdw: restore the volume controls after re-initialisation

From: Matthew Schwartz

Date: Sun Oct 18 2026 - 01:37:41 EST


On 10/16/26 3:28 AM, Lee Mann wrote:
> - return snd_soc_put_volsw(kcontrol, ucontrol);
> + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> + struct tas2783_prv *tas_dev = snd_soc_component_get_drvdata(component);
> + s32 ret = snd_soc_put_volsw(kcontrol, ucontrol);
> +
> + if (ret >= 0)
> + tas2783_save_vol(tas_dev, TAS2783_DVC_LVL,
> + &tas_dev->user_dvc_lvl, &tas_dev->user_dvc_set);


Hi Lee,

I ran into the same bug bringing up the ASUS ROG Xbox Ally X20 (two
TAS2783 on one AMD link), and there's one more case this doesn't cover.

On for-next idle_bias_on is 0, so the amps runtime suspend whenever
nothing is playing. The cache is dropped on attach and after the
firmware download, so until something writes the volume registers
again they aren't cached, and snd_soc_get_volsw()/put_volsw() fail with
-EBUSY from regmap in cache-only mode while the amp is suspended. Your
restore fixes that once a value has been set during playback, but at
boot nothing has set it yet, so the first mixer accesses fail and every
boot logs "ASoC error (-16)" for both registers. On the X20 the link
is also powered off when idle, so the amps are re-initialized on every
wake, not just after system suspend.

I have a fix I was working on that addresses the same issue but keeps
both values in the driver instead of the register cache, so get/put
work while the amp is suspended and the values are programmed again
after every init and resume. It's part of a small series with two
other tas2783 fixes. I'll post it shortly with you on Cc with a
Reported-by on the relevant patch if that's okay with you.

Thanks,
Matt