The "sysclk = 24000000" value is supposed to come from the "clock-frequency"
field of ac108_mclk / ac10x_mclk, but somehow it isn't on 5.4 (vs 4.19). This
is a temporary work-around. For some strange unknown reasons, this affects
only the square 4-mic device, but not the linear 4-mic nor the 6-mics device.
The other two devices have two ac108's, and seem to work fine without it.
In v4.19:
seeed_voice_card_probe [snd_soc_seeed_voicecard]
-> devm_snd_soc_register_card [snd_soc_core]
-> snd_soc_register_card [snd_soc_core]
-> seeed_voice_card_dai_init [snd_soc_seeed_voicecard]
-> asoc_simple_card_init_dai [snd_soc_simple_card_utils]
-> snd_soc_dai_set_sysclk [snd_soc_core]
-> ac108_set_sysclk [snd_soc_ac108]
In 5.4:
seeed_voice_card_probe [snd_soc_seeed_voicecard]
-> devm_snd_soc_register_card [snd_soc_core]
-> snd_soc_register_card [snd_soc_core]
-> snd_soc_instantiate_card [snd_soc_core]
-> seeed_voice_card_dai_init [snd_soc_seeed_voicecard]
-> asoc_simple_init_dai.part.0 [snd_soc_seeed_voicecard]
-> snd_soc_dai_set_sysclk [snd_soc_core]
-> ac108_set_sysclk [snd_soc_ac108]
Which results in the "ac108_set_sysclk :24000000" kernel message.
Note the extra snd_soc_instantiate_card(), and the copied/renamed
asoc_simple_init_dai() - it became static and not-available to other drivers
in v5.x.
See https://github.com/respeaker/seeed-voicecard/issues/246
See, for example,
commit b78b30e32a19f1ac79c26e0a3e9f7bc7385a02a2
Author: j-schambacher <joerg@i2audio.com>
Date: Tue May 19 13:56:17 2020 +0200
Switch to snd_soc_dai_set_bclk_ratio
Replaces obsolete function snd_soc_dai_set_tdm_slot
See upstream -
https://github.com/raspberrypi/documentation/issues/1671https://github.com/raspberrypi/documentation/pull/1673
Quoted here:
* Only Device Tree nodes at the top level of the tree and children of
a bus node will be probed. For nodes added at run-time there is the
further limitation that the bus must register for notifications of
the addition and removal of children. However, there are exceptions
that break this rule and cause confusion: the kernel explicitly
scans the entire tree for some device types - clocks and interrupt
controller being the two main ones - in order to (for clocks)
initialise them early and/or (for interrupt controllers) in a
particular order. This search mechanism only happens during booting
and so doesn't work for nodes added by an overlay at run-time. It is
therefore recommended for overlays to place fixed-clock nodes in the
root of the tree unless it is guaranteed that the overlay will not
be used at run-time.
The snd_bcm2835.enable_compat_alsa option:
enable_compat_alsa:Enables ALSA compatibility virtual audio device (bool)
is off these days, since the beginning of 2020 apparently.
Reference:
raspi-config (20200120) buster; urgency=medium
* Add audio switching for discrete internal ALSA devices
-- Simon Long <simon@raspberrypi.org> Mon, 20 Jan 2020 11:38:37 +0000
The "sysclk = 24000000" value is supposed to come from the "clock-frequency"
field of ac108_mclk / ac10x_mclk, but somehow it isn't on 5.4 (vs 4.19). This
is a temporary work-around. For some strange unknown reasons, this affects
only the square 4-mic device, but not the linear 4-mic nor the 6-mics device.
The other two devices have two ac108's, and seem to work fine without it.
In v4.19:
seeed_voice_card_probe [snd_soc_seeed_voicecard]
-> devm_snd_soc_register_card [snd_soc_core]
-> snd_soc_register_card [snd_soc_core]
-> seeed_voice_card_dai_init [snd_soc_seeed_voicecard]
-> asoc_simple_card_init_dai [snd_soc_simple_card_utils]
-> snd_soc_dai_set_sysclk [snd_soc_core]
-> ac108_set_sysclk [snd_soc_ac108]
In 5.4:
seeed_voice_card_probe [snd_soc_seeed_voicecard]
-> devm_snd_soc_register_card [snd_soc_core]
-> snd_soc_register_card [snd_soc_core]
-> snd_soc_instantiate_card [snd_soc_core]
-> seeed_voice_card_dai_init [snd_soc_seeed_voicecard]
-> asoc_simple_init_dai.part.0 [snd_soc_seeed_voicecard]
-> snd_soc_dai_set_sysclk [snd_soc_core]
-> ac108_set_sysclk [snd_soc_ac108]
Which results in the "ac108_set_sysclk :24000000" kernel message.
Note the extra snd_soc_instantiate_card(), and the copied/renamed
asoc_simple_init_dai() - it became static and not-available to other drivers
in v5.x.
See https://github.com/respeaker/seeed-voicecard/issues/246
The "-c 1" was simply wrong. The default (-c 0) sound device of
older kernel / alsa has a numid=3 selector for auto vs headphone vs hdmi .
Newer kernel simply has multiple devices. Also, headphone is -c 0 .
$ amixer contents
numid=2,iface=MIXER,name='Headphone Playback Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=1,iface=MIXER,name='Headphone Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
: values=-2000
| dBscale-min=-102.39dB,step=0.01dB,mute=1
TODO: For now, broadly dividing by kernel v4.x vs v5.x is good enough, but
it would be nice to find out when / which kernel /alsa this is relevant.
closes https://github.com/respeaker/seeed-voicecard/issues/240