Re: 3.19 on Nokia n900: audio quality awful

Peter Ujfalusi
2015-01-29T11:20:34Z

On 01/29/2015 09:35 AM, Jarkko Nikula wrote:
> On Wed, Jan 28, 2015 at 11:41:44PM +0100, Pavel Machek wrote:
>> On Wed 2015-01-28 20:15:46, Jarkko Nikula wrote:
>>> On 01/26/2015 03:20 PM, Peter Ujfalusi wrote:
>>>> On 01/18/2015 02:01 PM, Pavel Machek wrote:
>>> No need to go that far. N900 has been supported in mainline since 2.6.39
>>> or so. Part A of AIC34 (which is basically dual AIC33 in a same package)
>>> drives 2 V for the digital microphone bias and part B 2.5 V for the headset.
>>
>> Let me try... Umm, no change here :-(
>>
>> root@n900:/tmp# arecord delme
>> Recording WAVE 'delme' : Unsigned 8 bit, Rate 8000 Hz, Mono
>> ^CAborted by signal Interrupt...
>> root@n900:/tmp# hexdump delme
>> 0000000 4952 4646 987c 0000 4157 4556 6d66 2074
>> 0000010 0010 0000 0001 0001 1f40 0000 1f40 0000
>> 0000020 0001 0008 6164 6174 9858 0000 8080 8080
>> 0000030 8080 8080 8080 8080 8080 8080 8080 8080
>> *
>> 0009880
>> root@n900:/tmp# aplay delme
>> Playing WAVE 'delme' : Unsigned 8 bit, Rate 8000 Hz, Mono
>> root@n900:/tmp#
>>
>> I did this:
>>
>> I'm not sure which one is "main" microphone and which is headset, but
>> I guess 2V should be "close enough" to 2.5V to produce something
>> different from zeros..?
>>
> Main or integrated is digital microphone which does AD conversion itself
> and headset is analogue. If DMIC is without bias codec will sample plain
> zeros from DMIC input but analogue input should always produce some random
> LSB bits from codec's AD converter.
>
> If codec produces zeros also from analogue input then I suppose codec
> ADC is not powered up or similar. One way to hunt regression if
> bisecting is not possible due reason or another is to dump and diff codec
> registers from /sys/kernel/debug/regmap/ using both working commit and head.
>
>> diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts
>> index 48b0987..f18a5b0 100644
>> --- a/arch/arm/boot/dts/omap3-n900.dts
>> +++ b/arch/arm/boot/dts/omap3-n900.dts
>> @@ -491,6 +491,8 @@
>> DRVDD-supply = <&vmmc2>;
>> IOVDD-supply = <&vio>;
>> DVDD-supply = <&vio>;
>> +
>> + ai3x-micbias-vg = <1>;
>> };
> Looks ok for digital mic.
>
>>
>> tlv320aic3x_aux: tlv320aic3x@19 {
>> @@ -502,6 +504,8 @@
>> DRVDD-supply = <&vmmc2>;
>> IOVDD-supply = <&vio>;
>> DVDD-supply = <&vio>;
>> +
>> + ai3x-micbias-vg = <1>;
>> };
> This should be 2, i.e. 2.5 V according to
> Documentation/devicetree/bindings/sound/tlv320aic3x.txt. I think 2 V is
> too low for some headset mics and that was the reason for 2.5 V.

Can you also try this patch to correct the DAPM route for the rx51:

diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c
index 04896d6252a2..7f299357c2d2 100644
--- a/sound/soc/omap/rx51.c
+++ b/sound/soc/omap/rx51.c
@@ -250,14 +250,14 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"FM Transmitter", NULL, "LLOUT"},
{"FM Transmitter", NULL, "RLOUT"},

- {"DMic Rate 64", NULL, "Mic Bias"},
- {"Mic Bias", NULL, "DMic"},
+ {"DMic Rate 64", NULL, "DMic"},
+ {"DMic", NULL, "Mic Bias"},

{"b LINE2R", NULL, "MONO_LOUT"},
{"Earphone", NULL, "b HPLOUT"},

- {"LINE1L", NULL, "b Mic Bias"},
- {"b Mic Bias", NULL, "HS Mic"}
+ {"LINE1L", NULL, "HS Mic"},
+ {"HS Mic", NULL, "b Mic Bias"},
};

static const char * const spk_function[] = {"Off", "On"};

--
Péter