Revision 81302b1c7c997e8a56c1c2fc63a296ebeb0cd2d0 authored by Takashi Iwai on 18 May 2023, 11:35:20 UTC, committed by Takashi Iwai on 22 May 2023, 12:20:29 UTC
It's reported that the recording started right after the driver probe
doesn't work properly, and it turned out that this is related with the
codec auto-suspend.  Namely, after the probe phase, the usage count
goes zero, and the auto-suspend is programmed, but the codec is kept
still active until the auto-suspend expiration.  When an application
(e.g. alsactl) updates the mixer values at this moment, the values are
cached but not actually written.  Then, starting arecord thereafter
also results in the silence because of the missing unmute.

The root cause is the handling of "lazy update" mode; when a mixer
value is updated *after* the suspend, it should update only the cache
and exits.  At the resume, the cached value is written to the device,
in turn.  The problem is that the current code misinterprets the state
of auto-suspend as if it were already suspended.

Although we can add the check of the actual device state after
pm_runtime_get_if_in_use() for catching the missing state, this won't
suffice; the second call of regmap_update_bits_check() will skip
writing the register because the cache has been already updated by the
first call.  So we'd need fixes in two different places.

OTOH, a simpler fix is to replace pm_runtime_get_if_in_use() with
pm_runtime_get_if_active() (with ign_usage_count=true).  This change
implies that the driver takes the pm refcount if the device is still
in ACTIVE state and continues the processing.  A small caveat is that
this will leave the auto-suspend timer.  But, since the timer callback
itself checks the device state and aborts gracefully when it's active,
this won't be any substantial problem.

Long story short: we address the missing register-write problem just
by replacing the pm_runtime_*() call in snd_hda_keep_power_up().

Fixes: fc4f000bf8c0 ("ALSA: hda - Fix unexpected resume through regmap code path")
Reported-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Closes: https://lore.kernel.org/r/a7478636-af11-92ab-731c-9b13c582a70d@linux.intel.com
Suggested-by: Cezary Rojewski <cezary.rojewski@intel.com>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20230518113520.15213-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent 7843380
History
File Mode Size
atomic
basic
clang-tools
coccinelle
dtc
dummy-tools
gcc-plugins
gdb
genksyms
kconfig
ksymoops
mod
package
selinux
tracing
.gitignore -rw-r--r-- 174 bytes
Kbuild.include -rw-r--r-- 10.1 KB
Kconfig.include -rw-r--r-- 2.6 KB
Lindent -rwxr-xr-x 502 bytes
Makefile -rw-r--r-- 1.7 KB
Makefile.asm-generic -rw-r--r-- 1.8 KB
Makefile.build -rw-r--r-- 17.6 KB
Makefile.clang -rw-r--r-- 1.6 KB
Makefile.clean -rw-r--r-- 1.7 KB
Makefile.compiler -rw-r--r-- 2.8 KB
Makefile.debug -rw-r--r-- 1.1 KB
Makefile.defconf -rw-r--r-- 1.2 KB
Makefile.dtbinst -rw-r--r-- 998 bytes
Makefile.extrawarn -rw-r--r-- 3.5 KB
Makefile.gcc-plugins -rw-r--r-- 2.6 KB
Makefile.headersinst -rw-r--r-- 2.9 KB
Makefile.host -rw-r--r-- 5.6 KB
Makefile.kasan -rw-r--r-- 2.5 KB
Makefile.kcov -rw-r--r-- 333 bytes
Makefile.kcsan -rw-r--r-- 1004 bytes
Makefile.kmsan -rw-r--r-- 208 bytes
Makefile.lib -rw-r--r-- 21.0 KB
Makefile.modfinal -rw-r--r-- 2.9 KB
Makefile.modinst -rw-r--r-- 2.6 KB
Makefile.modpost -rw-r--r-- 4.4 KB
Makefile.package -rw-r--r-- 9.7 KB
Makefile.randstruct -rw-r--r-- 511 bytes
Makefile.ubsan -rw-r--r-- 770 bytes
Makefile.userprogs -rw-r--r-- 1.6 KB
Makefile.vmlinux -rw-r--r-- 1.4 KB
Makefile.vmlinux_o -rw-r--r-- 3.2 KB
adjust_autoksyms.sh -rwxr-xr-x 2.1 KB
as-version.sh -rwxr-xr-x 2.0 KB
asn1_compiler.c -rw-r--r-- 35.3 KB
bloat-o-meter -rwxr-xr-x 3.8 KB
bootgraph.pl -rwxr-xr-x 5.6 KB
bpf_doc.py -rwxr-xr-x 31.7 KB
cc-can-link.sh -rwxr-xr-x 166 bytes
cc-version.sh -rwxr-xr-x 1.4 KB
check-git -rwxr-xr-x 298 bytes
check-local-export -rwxr-xr-x 1.7 KB
check-sysctl-docs -rwxr-xr-x 3.9 KB
check_extable.sh -rwxr-xr-x 4.9 KB
checkdeclares.pl -rwxr-xr-x 1.1 KB
checkincludes.pl -rwxr-xr-x 1.9 KB
checkkconfigsymbols.py -rwxr-xr-x 15.7 KB
checkpatch.pl -rwxr-xr-x 230.4 KB
checkstack.pl -rwxr-xr-x 5.8 KB
checksyscalls.sh -rwxr-xr-x 7.5 KB
checkversion.pl -rwxr-xr-x 2.2 KB
cleanfile -rwxr-xr-x 3.5 KB
cleanpatch -rwxr-xr-x 5.1 KB
coccicheck -rwxr-xr-x 7.9 KB
config -rwxr-xr-x 4.7 KB
const_structs.checkpatch -rw-r--r-- 1.4 KB
decode_stacktrace.sh -rwxr-xr-x 7.2 KB
decodecode -rwxr-xr-x 4.8 KB
depmod.sh -rwxr-xr-x 1.4 KB
dev-needs.sh -rwxr-xr-x 6.1 KB
diffconfig -rwxr-xr-x 4.1 KB
documentation-file-ref-check -rwxr-xr-x 5.7 KB
export_report.pl -rwxr-xr-x 4.5 KB
extract-ikconfig -rwxr-xr-x 1.7 KB
extract-module-sig.pl -rwxr-xr-x 3.7 KB
extract-sys-certs.pl -rwxr-xr-x 3.7 KB
extract-vmlinux -rwxr-xr-x 1.7 KB
extract_xc3028.pl -rwxr-xr-x 44.6 KB
faddr2line -rwxr-xr-x 8.3 KB
file-size.sh -rwxr-xr-x 86 bytes
find-unused-docs.sh -rwxr-xr-x 1.3 KB
gcc-x86_32-has-stack-protector.sh -rwxr-xr-x 408 bytes
gcc-x86_64-has-stack-protector.sh -rwxr-xr-x 198 bytes
gen-randstruct-seed.sh -rwxr-xr-x 228 bytes
gen_autoksyms.sh -rwxr-xr-x 1.5 KB
gen_ksymdeps.sh -rwxr-xr-x 556 bytes
generate_initcall_order.pl -rwxr-xr-x 5.9 KB
generate_rust_analyzer.py -rwxr-xr-x 4.0 KB
generate_rust_target.rs -rw-r--r-- 5.2 KB
get_abi.pl -rwxr-xr-x 25.3 KB
get_dvb_firmware -rwxr-xr-x 24.5 KB
get_feat.pl -rwxr-xr-x 14.6 KB
get_maintainer.pl -rwxr-xr-x 67.2 KB
gfp-translate -rwxr-xr-x 1.7 KB
head-object-list.txt -rw-r--r-- 1.4 KB
headerdep.pl -rwxr-xr-x 3.5 KB
headers_install.sh -rwxr-xr-x 3.0 KB
insert-sys-cert.c -rw-r--r-- 8.9 KB
install.sh -rwxr-xr-x 986 bytes
is_rust_module.sh -rwxr-xr-x 568 bytes
jobserver-exec -rwxr-xr-x 2.6 KB
kallsyms.c -rw-r--r-- 19.1 KB
kernel-doc -rwxr-xr-x 66.1 KB
ld-version.sh -rwxr-xr-x 1.7 KB
leaking_addresses.pl -rwxr-xr-x 12.8 KB
link-vmlinux.sh -rwxr-xr-x 7.5 KB
makelst -rwxr-xr-x 808 bytes
markup_oops.pl -rwxr-xr-x 7.9 KB
min-tool-version.sh -rwxr-xr-x 519 bytes
misc-check -rwxr-xr-x 509 bytes
mkcompile_h -rwxr-xr-x 642 bytes
mksysmap -rwxr-xr-x 2.6 KB
mkuboot.sh -rwxr-xr-x 414 bytes
module.lds.S -rw-r--r-- 1.4 KB
modules-check.sh -rwxr-xr-x 443 bytes
nsdeps -rw-r--r-- 1.6 KB
objdiff -rwxr-xr-x 2.8 KB
objdump-func -rwxr-xr-x 848 bytes
pahole-flags.sh -rwxr-xr-x 716 bytes
pahole-version.sh -rwxr-xr-x 269 bytes
parse-maintainers.pl -rwxr-xr-x 4.5 KB
patch-kernel -rwxr-xr-x 9.9 KB
profile2linkerlist.pl -rwxr-xr-x 414 bytes
prune-kernel -rwxr-xr-x 912 bytes
recordmcount.c -rw-r--r-- 17.6 KB
recordmcount.h -rw-r--r-- 19.4 KB
recordmcount.pl -rwxr-xr-x 17.5 KB
relocs_check.sh -rwxr-xr-x 717 bytes
remove-stale-files -rwxr-xr-x 1.2 KB
rust_is_available.sh -rwxr-xr-x 5.6 KB
rust_is_available_bindgen_libclang.h -rw-r--r-- 91 bytes
setlocalversion -rwxr-xr-x 4.2 KB
show_delta -rwxr-xr-x 3.0 KB
sign-file.c -rw-r--r-- 9.9 KB
sorttable.c -rw-r--r-- 7.7 KB
sorttable.h -rw-r--r-- 12.9 KB
spdxcheck-test.sh -rw-r--r-- 284 bytes
spdxcheck.py -rwxr-xr-x 15.2 KB
spdxexclude -rw-r--r-- 417 bytes
spelling.txt -rw-r--r-- 33.5 KB
sphinx-pre-install -rwxr-xr-x 25.4 KB
split-man.pl -rwxr-xr-x 604 bytes
stackdelta -rwxr-xr-x 1.8 KB
stackusage -rwxr-xr-x 794 bytes
subarch.include -rw-r--r-- 647 bytes
syscallhdr.sh -rwxr-xr-x 1.9 KB
syscallnr.sh -rwxr-xr-x 1.5 KB
syscalltbl.sh -rwxr-xr-x 1.5 KB
tags.sh -rwxr-xr-x 10.5 KB
test_fortify.sh -rw-r--r-- 2.2 KB
tools-support-relr.sh -rwxr-xr-x 726 bytes
unifdef.c -rw-r--r-- 34.8 KB
ver_linux -rwxr-xr-x 2.6 KB
xen-hypercalls.sh -rwxr-xr-x 386 bytes
xz_wrap.sh -rwxr-xr-x 563 bytes

back to top