[alsa-devel] Diagnosing why DAPM config is not correctly applied

Daniel Drake dsd at laptop.org
Fri May 4 23:11:01 CEST 2012


Hi,

I'm working with Linux 3.3 and the soc/codecs/rt5631.c driver in an
OLPC XO-1.75 laptop.
We are only getting silence when playing back sound.

I have added in some debug messages in soc-io.c and enabled DEBUG and
VERBOSE_DEBUG in soc-dapm.c.

Here are boot messages:
http://dev.laptop.org/~dsd/20120504/boot.log

At time X in the above log, I start "speaker-test -c 2 -t wav" and
leave it running for the remainder of this test.

Here is the "amixer" output at this point:
http://dev.laptop.org/~dsd/20120504/amixer-initial.txt

speaker-test seems happy but no audio can be heard :(

However, I have found that the following tweak to the sound controls
will fix the left channel:

  # amixer sset 'Left SPKVOL Mux' 'Vmid'
  # amixer sset 'Left SPKVOL Mux' 'SPKMIXL'

Note that the original value was SPKMIXL (see initial amixer output)
so this should have had no effect. However, the result is that sound
is now heard through the left channel. (A very similar sound control
change will fix the right channel too)

While running these commands, the following kernel messages appear:

(amixer sset 'Left SPKVOL Mux' 'Vmid')
 read c = 0
 read c = 0
 read 10 = 606
 read 10 = 606
 read c = 0
 read c = 0
 read a = 0
 read a = 0
 read 6 = a080
 read 1e = 88c0
 read 1e = 88c0
 read 1e = 88c0
 read 1e = 88c0
 read 6 = a080
 read 20 = 88c0
 read 20 = 88c0
 read 20 = 88c0
 read 20 = 88c0
 read 24 = 3000
 read 24 = 3000
 read 24 = 3000
 read 24 = 3000
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 2c = 0
 read 2c = 0
 read 4 = c0c0
 read 6 = a080
 read 2 = 4040
 read 22 = 7700
 read 22 = 7700
 read e = 0
 read 22 = 7700
 read 22 = 7700
 read e = 0
 read 2c = 0
 read 6 = a080
 read 26 = 8404
 read 26 = 8404
 read 26 = 8404
 read 2a = 6c00
 read 2a = 6c00
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 2 = 4040
 read 2 = 4040
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 4 = c0c0
 read 6 = a080
 read 2 = 4040
 read 40 = 4e00
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 2c = 0
 read 2a = 6c00
 read 2a = 6c00
 read 2c = 0
 read 2a = 6c00
 read 2a = 6c00
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 read 2 = 4040
 rt5631 0-001a: Marking Vmid dirty due to mux connection
 rt5631 0-001a: Marking Left SPKVOL Mux dirty due to mux change
 read 2 = 4040
 write 2 = 40 (cached)
 read 2 = 40


(amixer sset 'Left SPKVOL Mux' 'SPKMIXL')
 read c = 0
 read c = 0
 read 10 = 606
 read 10 = 606
 read c = 0
 read c = 0
 read a = 0
 read a = 0
 read 6 = a080
 read 1e = 88c0
 read 1e = 88c0
 read 1e = 88c0
 read 1e = 88c0
 read 6 = a080
 read 20 = 88c0
 read 20 = 88c0
 read 20 = 88c0
 read 20 = 88c0
 read 24 = 3000
 read 24 = 3000
 read 24 = 3000
 read 24 = 3000
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 4 = c0c0
 read 2c = 0
 read 2c = 0
 read 4 = c0c0
 read 6 = a080
 read 2 = 40
 read 22 = 7700
 read 22 = 7700
 read e = 0
 read 22 = 7700
 read 22 = 7700
 read e = 0
 read 2c = 0
 read 6 = a080
 read 26 = 8404
 read 26 = 8404
 read 26 = 8404
 read 2a = 6c00
 read 2a = 6c00
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1a = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 1c = dfc0
 read 2 = 40
 read 2 = 40
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 14 = b0b0
 read 4 = c0c0
 read 6 = a080
 read 2 = 40
 read 40 = 4e00
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 28 = d8d8
 read 2c = 0
 read 2a = 6c00
 read 2a = 6c00
 read 2c = 0
 read 2a = 6c00
 read 2a = 6c00
 read 2 = 40
 read 2 = 40
 read 2 = 40
 read 2 = 40
 read 2 = 40
 read 2 = 40
 read 2 = 40
 read 2 = 40
 rt5631 0-001a: Marking Vmid dirty due to mux disconnection
 rt5631 0-001a: Marking SPKMIXL Mixer dirty due to mux connection
 rt5631 0-001a: Marking Left SPKVOL Mux dirty due to mux change
 rt5631 0-001a: Marking Left DAC dirty due to peer state change
 rt5631 0-001a: Marking Left DAC To Mixer dirty due to peer state change
 rt5631 0-001a: Marking DAC REF dirty due to peer state change
 rt5631 0-001a: Marking I2S dirty due to peer state change
 rt5631 0-001a: Marking PLL1 dirty due to peer state change
 rt5631 0-001a: Marking Left DAC_HP dirty due to peer state change
 rt5631 0-001a: Marking OUTMIXL Mixer dirty due to peer state change
 read 1a = dfc0
 read 28 = d8d8
 read 42 = 0
 read 42 = 0
 read 42 = 0
 read 42 = 0
 read 2 = 40
 write 2 = 4040 (cached)
 read 3a = 1000
 write 3a = 90c0 (cached)
 read 3a = 90c0
 write 3a = 92c0 (cached)
 read 3b = c
 write 3b = 200c (cached)
 read 2 = 4040

So, changing these settings in a way that should have no effect seems
to kick DAPM into applying quite a different config from the one
initially applied. In particular, the register value register 0x3a
(RT5631_PWR_MANAG_ADD1) is quite different from the one applied
earlier, and I think this is the key to having playback working.

I've spent some time trying to get my head around the dapm code and
see whats happening here, without much luck. If someone more
experienced here could take a quick look at these messages and the
dapm routes in rt5631.c for anything obvious, it would be much
appreciated. Further debugging tips welcome too.

Thanks,
Daniel


More information about the Alsa-devel mailing list