[alsa-devel] ASOC and 12 bit volume control

Jon Smirl jonsmirl at gmail.com
Sun Jul 20 17:51:12 CEST 2008

Another problem is the crossbar mixer. It is a full 8x4 crossbar with
28 bit gain controls on each path. There are four 32 byte registers,
each register holds 8 32 bit wide gain fields. There are several more
mixers with 28 bit gain controls.

28 bit gain fields are all on all of the bass/loudness/etc control.

On 7/20/08, Mark Brown <broonie at opensource.wolfsonmicro.com> wrote:
> On Sat, Jul 19, 2008 at 10:18:55PM -0400, Jon Smirl wrote:
>  > How do I define a volume control that is the bottom 12 bits of a 32
>  > bit register?
>  > #define SOC_SINGLE_VALUE(reg, shift, max, invert) ((reg) | ((shift) << 8) |\
>  >       ((shift) << 12) | ((max) << 16) | ((invert) << 24))
>  > This looks like it only support an 8 bit max. Is there another way to do it?
> SOC_SINGLE() (or SOC_SINGLE_TLV() if you've got dB scale information for
>  the volume control, which is likely?) is the way to do it but like you
>  say it's not able to cope currently.  Since invert is a boolean so there
>  should actually be enough space to store a 12 bit max so it shouldn't be
>  such a major job to adjust for this unless I'm missing something, I've
>  only had a brief look.
>  Also note that the core currently has assumptions in it that registers
>  aren't bigger than 16 bits - the main thing is that it uses unsigned
>  shorts for passing them around.  Someone posted in the past week about
>  fixing this.
>  If you don't want to do core changes then either write a custom control
>  or (if the stuff in the upper bits will allow it) adjust the shift to
>  ignore the bottom 4 bits of the control.  The ASoC control macros all
>  boil down to standard ALSA controls types and you can mix in regular ALSA
>  controls without problems if required - the macros just save having to
>  implement standard register accesses by hand.

Jon Smirl
jonsmirl at gmail.com

More information about the Alsa-devel mailing list