Звук после саспенда
Это одна из двук наиболее актуальных проблем. Вторая - неправильное управление питанием (в частности нужно будет выкидывать функцию android_inits).
Что мы имеем После суспенда не работает звук. Ни в наушниках, ни в колонках. Мне с этой проблемой помогла справиться перезагрузка модулей snd_soc_tegra_paz00 и snd_soc_alc5632
sudo rmmod snd_soc_tegra_paz00 sudo rmmod snd_soc_alc5632 sudo modprobe snd_soc_alc5632 sudo modprobe snd_soc_tegra_paz00
Однако ogra сказал, что ему это не помогало. Он пробовал различные комбинации и даже выгружал все до модуля snd. leonro также не помогла перезагрузка модулей.
План действий
* заставить суспенд вызыватся * застащитх звук работать после суспенда * заставить работать микрофон * выкинуть андроид_инит * почистить срач
UPD: leonro сделал вызов нашей функции суспенда (alc5632_suspend) форсированным и добавил принудительное сохранение регистров в кеше. На резьюме звук появился.
Epic fail
Есть два способа получить регистры звуковухи:
sudo mount -t debugfs none /sys/kernel/debug cat /sys/kernel/debug/asoc/tegra-paz00/alc5632.0-001e/codec_reg
и утилита alc-ctl (исходный код alc-ctl.c), читающая (и способная записать) регистры через i2c девайс.
sudo modprobe i2c-dev sudo ./alc-ctl /dev/i2c-0 r 26 sudo ./alc-ctl /dev/i2c-0 w 26 000f
Самый большой облом оказался в том, что эти два способа дают нам разный результат. Полагаю лечше использовать alc-ctl.
Делаем дамп регистров full-dump.sh
for reg in `seq 0 2 96 | xargs -L1 -I% echo "obase=16; %" | bc | tr '[:upper:]' '[:lower:]'` ; do sudo ./alc-ctl /dev/i2c-0 r $reg done
./full-dump.sh > x01-before-playback.txt
Первая цель (ГОТОВО) - получить дамп регистров до саспенда и после (я нашел проблему с разным результатом дампа недавно и не имел возможности сделать его самостоятельно). http://dl.dropbox.com/u/36754970/x01-after-playback.txt http://dl.dropbox.com/u/36754970/x01-after-suspend.txt http://dl.dropbox.com/u/36754970/x01-after-suspend-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5.txt
02: 8080 02: 0000 - Speaker Output Volume 06: 8080 06: 9c9c - AUXOUT Volume 08: c800 08: c000 - Phone Input 0a: e808 0a: e000 - LINE_IN Volume 0c: 1010 0c: 0c0c - STEREO DAC Input Volume 0e: 0808 0e: 0000 - MIC Input Volume 10: ee0f 10: e801 - Stereo DAC and MIC Routing Control 12: cbcb 12: dcdc - ADC Record Gain 14: 7f7f 14: 3f3f - ADC Record Mixer Control 18: e010 18: e035 - Voice DAC Volume 1c: 8008 1c: 0b88 - Output Mixer Control 22: 0000 22: 0a00 - Microphone Control 24: 00c0 24: 00c7 - Codec Digital MIC / Digital Boost Control 26: ef00 26: 000c - Power Down Control/Status
Вторая цель (ГОТОВО) - попробовать сохранять регистры в кэш прямо перед суспендом. По словам leonro сохранение регистров не помогло. UPD не вызывалась функция суспенда. Поменяли на принудительный вызов и внутри стали сохранять регистры - после резбюма звук заработал. Savalik: Тащем-та получить какой либо вывод так и не удалось. То ли alc5632_suspend и resume сами не вызываются..(не успевают вызываться) то ли нужен какой то фокус чтобы услышать ответ от туда. Stuw, ну ты понял. <-- была попытка добавить дамп регистров в лог, но никаких записей не появилось. Возможно проблемы с переводом драйвера в суспенд.
<leonro> если в кратце, то глобальный суспенд вызывает с SND_SOC_BIAS_ON <leonro> поэтому вот этот свитч <leonro> switch (codec->dapm.bias_level) { <leonro> не запускает нан суспенд <leonro> теперь надо понять, почему alc5632_set_bias_level не вызывается <leonro> это дифф, только он загаже <leonro> загаже <leonro> загажен <leonro> http://paste.ubuntu.com/707283/ <leonro> а это греп на лог <leonro> http://paste.ubuntu.com/707286/ <stuw> спасибо <stuw> leonro, а ты запускал проигрывание музыки? <leonro> да <stuw> у нас при попытке суспенда карточка находится в состоянии ON, хотя функция суспенда ожидает STANDBY или OFF. <leonro> ага <stuw> по идее у нас должно быть в дмесг сообщение CODEC is on over suspend <leonro> нет, не должен <leonro> зависит от дебаг левел <stuw> ах да, там не просто принтк <stuw> возможно нам надо DAMP виджеты править, чтобы правильно звуковуха переходила между состояниями <leonro> надо надо патчи взять с апстрима, я сделал гит лог на сок-кор.с <leonro> у нас <leonro> commit 5b54391a00b20031637ab2ced6d211f75d929195 <leonro> Author: Stephen Warren <[email protected]> <leonro> Date: Fri Apr 15 13:37:05 2011 -0700 <leonro> в апстрием <leonro> commit f0e8ed858edb327802ee65fd695cc1538286226f <leonro> Author: Mark Brown <[email protected]> <leonro> Date: Tue Sep 20 11:41:54 2011 +0100 <stuw> хм... тоже хорошая идея ) <leonro> плюс я подвинул codec->driver->suspend(codec, PMSG_SUSPEND); <leonro> чуть выше, и заработал наш суспенд и резьюм, правда звук нет
<leonro> в кратце, звук после суспенда заработал <stuw> что ты для этого сделал? <stuw> в 2-х словах <leonro> я пишу :) <leonro> сек <leonro> подвинул вот эту строчку <leonro> 1131 codec->driver->suspend(codec, PMSG_SUSPEND); <leonro> в snd_soc_suspend наверх <leonro> кто-то выставляет <leonro> в функции alc5632_set_bias_level <leonro> вот это значение SND_SOC_BIAS_ON <leonro> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level; <leonro> из soc_core.c <leonro> корочен надо найти и понят кто играется с dapm.bias_level <leonro> вот этим я и занимался, время от времени :) <stuw> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level; <--- она вроде ни на что не влияет, т.к. ниже проверяется bias_level а не suspend_bias_level <stuw> ты сохранение регистров добавлял в alc5632_suspend ? <stuw> или оно и так заработало? <leonro> да, я прогнал <leonro> да у меня филл_кеш в суспенд
Третья цель - собрать dmesg с дебажного ядра
в .config выставить y для:
CONFIG_DEBUG_KERNEL=y
а также
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
CONFIG_PM_VERBOSE=y
CONFIG_PM_SLEEP_ADVANCED_DEBUG=y
Спасибо leonro за принты - http://paste.ubuntu.com/707922/
282 /* dapm stream operations */ 283 #define SND_SOC_DAPM_STREAM_NOP 0x0 284 #define SND_SOC_DAPM_STREAM_START 0x1 285 #define SND_SOC_DAPM_STREAM_STOP 0x2 286 #define SND_SOC_DAPM_STREAM_SUSPEND 0x4 287 #define SND_SOC_DAPM_STREAM_RESUME 0x8 288 #define SND_SOC_DAPM_STREAM_PAUSE_PUSH 0x10 289 #define SND_SOC_DAPM_STREAM_PAUSE_RELEASE 0x20
[ 148.627511] snd_ snd_soc_suspend: capture.stream_name=Capture [ 148.627558] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Capture event 4 [ 148.627607] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Capture event 4 [ 148.627653] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Capture event 4 [ 148.627700] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Capture event 4 [ 148.628541] snd_ dapm_power_widgets: Run all the bias changes in parallel [ 149.109072] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Playback event 8 [ 149.109139] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Playback event 8 [ 149.109190] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Playback event 8 [ 149.109237] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Playback event 8 [ 149.111545] snd_ dapm_power_widgets: Run all the bias changes in parallel
Т.е. события на suspend-resume приходят, но мы остаемся с неправильным биас левел
Нужно потрейсить функции
dapm_pre_sequence_async dapm_post_sequence_async
При суспенде: первая переводит в режим PREPARE (если d->dev_power = 0), потом меняются значения виджетов, потом вторая переводит из PREPARE в STANBY (что по идее должно позволять суспенд).
dmesg_suspend_log.txt dmesg_suspend_log.patch В логе видно, что для Mic Bias1 почему-то форсится питание. snd_ dapm_power_widgets: force power to 1 for Mic Bias1 Из-за этого похоже девайс и остается во включенном состоянии.
<leonro_> закоментирощал вот эти строчки http://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line155 и http://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line163 <stuw> leonro_, https://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line220 <stuw> ее не хватает, чтобы мы не уходили в суспенд? <stuw> в смысле закоментировать только ее если <leonro_> stuw: возможно, я вчера много чего закоментировал :), ... Возможно хватит 220 строки, чтобы мы начали в суспенд уходить.
Цель четвертая - разобраться с колонками
Вообщем включение колонок после саспенда благодаря leonro было осилено:
http://pastebin.com/vqimtdcs
Предсонный diff от leonro: http://paste.ubuntu.com/708928/