Hi all...
I'm posting this via GMane since my server at home seems to be down, hopefully it gets through. I hope to put a version of the TLV320AIC3204 driver that I've been working on up there -- I did try posting it to the list, but I suspect it's either been left in the moderation queue or silently dropped. In short, I got the sound working; just testing playback for now... Recording should work, once I get the mixer set up.
My query though; the mixer on this CODEC provides gain settings, helpfully scaled in dB, as signed integers. For instance; the four line level output drivers: Headphone left/right,and Line Out left/right, can all be adjusted in gain from -6dB through to +29dB.
These are set in individual registers as the lower 6 bits; so: -6 dB is represented as 111010 (0x3a) 29 dB is represented as 011101 (0x1d)
At the moment, things "half work" with the following code: /* * DAC digital volumes. From -63.5 to +24 dB in 0.5 dB steps */ static DECLARE_TLV_DB_MINMAX(dac_tlv, -6350, 2400); /* ADC PGA gain volumes. From 0 to 59.5 dB in 0.5 dB steps */ static DECLARE_TLV_DB_MINMAX(adc_tlv, 0, 0); /* * Output driver stage volumes; -6dB through to +29dB */ static DECLARE_TLV_DB_MINMAX(output_stage_tlv, -600, 2900);
static const struct snd_kcontrol_new aic3204_snd_controls[] = { /* Output */ SOC_DOUBLE_R_TLV("Headphone Output Volume", AIC3204_HPLGAIN, AIC3204_HPRGAIN, 0, 29, 0, output_stage_tlv), SOC_DOUBLE_R_TLV("Line Output Volume", AIC3204_LOLGAIN, AIC3204_LORGAIN, 0, 29, 0, output_stage_tlv), SOC_DOUBLE_R_TLV("PCM Playback Volume", AIC3204_LDACVOL, AIC3204_RDACVOL, 0, 127, 0, dac_tlv), ...
However; it treats the bitfield as unsigned, which is wrong in this case. The bitfield is a signed integer in two's complement format. How do I convince ALSA that these integers have a sign bit?
Regards, Stuart Longland