> No, the minimum value we expose to userspace is always scaled so that
> userspace sees a range starting from zero and that's where platform_max
> is referenced to - we're applying this limit before we start remapping
> to actual register values. The code would be a lot simpler if we didn't
> do this rescaling.
These are the results that I got from debugging my phone
which has a wcd9340 audio codec and a kernel version of 4.9.314:
The control is defined like
-- SOC_SINGLE_S8_TLV("IIR0 INP0 Volume",
WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40, digital_gain) --
Now the OEM mixer_path.xml file defines the value of the aforementioned
control as 54
which is read by the user-mode Qualcomm HAL, the HAL then uses the
library libalsa-intf
to issue an IOCTL to pass this value directly to the ALSA driver.
At this point, the snd_soc_put_volsw_sx is called and the $val is 54 as
expected.
$mc->platform_max is 40, $mc->max is also 40 and $mc->min is -84.
The problem is that the snd_soc_put_volsw_sx, checks the userspace value
that has a range
starting from 0, directly against the $mc->platform_max value mentioned
above
which is set to 40 at that point so it checks for the incorrect range.