Re: [PATCH 2/7] ASoC: codecs: lpass-wsa-macro: fix compander volume hack

From: Johan Hovold
Date: Tue Jan 16 2024 - 08:10:26 EST


On Tue, Jan 16, 2024 at 11:10:21AM +0000, Srinivas Kandagatla wrote:
> Thanks Johan for this patch,
>
> On 16/01/2024 09:38, Johan Hovold wrote:
> > The LPASS WSA macro codec driver is updating the digital gain settings
> > behind the back of user space on DAPM events if companding has been
> > enabled.
> >
> > As compander control is exported to user space, this can result in the
> > digital gain setting being incremented (or decremented) every time the
> > sound server is started and the codec suspended depending on what the
> > UCM configuration looks like.
> >
> > Soon enough playback will become distorted (or too quiet).
> >
> > This is specifically a problem on the Lenovo ThinkPad X13s as this
> > bypasses the limit for the digital gain setting that has been set by the
> > machine driver.
> >
> > Fix this by simply dropping the compander gain hack. If someone cares
> > about modelling the impact of the compander setting this can possibly be
> > done by exporting it as a volume control later.
> >
> This is not a hack, wsa codec requires gain to be programmed after the
> clk is enabled for that particular interpolator.

Ok, but then it's also broken as, as I mentioned off-list, these
registers are cached so unless companding is enabled, the write on
enable will have no effect.

> However I agree with you on programming the gain that is different to
> what user set it.
>
> This is because of unimplemented or half baked implementation of half-db
> feature of gain control in this codec.
>
> We can clean that half baked implementation for now and still continue
> to program the gain values after the clks are enabled.
>
> lets remove spkr_gain_offset and associated code paths in this codec,
> which should fix the issue that you have reported and still do the right
> thing of programming gain after clks are enabled.

Removing the offset which can alter the gain, will cause both of these
writes to become no-ops as the registers are cached (e.g. just as for
the follow-on codec cleanups). So then we might as well just remove
this too.

How is the half-dB feature supposed to work?

And are you sure that you need to reprogram the gain value after
enabling the clock? Everything seems to work without doing so.

Johan