From 8116639e560958c48e367e0e1dea923f247cbb76 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 11 Nov 2024 15:44:38 +0100 Subject: [PATCH] alsactl: 90-alsa-restore.rules - add support for AMD ACP digital microphone The UCM configuration for AMD ACP digital microphones combines HDA analog card with ASoC AMD ACP digital microphone card. When the ACP microphone card is detected later than HDA analog card, the UCM initialization for HDA analog card should be executed again. Additional changes: Added --with-alsactl-udev-extra-test argument to handle the tests for directories. The default value was kept. Added --alsactl-udev-args argument to pass extra arguments to alsactl in the udev rule. Note: The autoconf does not handle correctly spaces so configure call like 'configure --alsactl-udev-args="-E ENV=abcd"' is not allowed. Substitue '__' string as ' ' for this reason. Example: configure --with-alsactl-udev-args="-E__ENV=abcd" \ --with-alsactl-udev-extra-test='TEST=="/abcd",__TEST=="/xyz",' Closes: https://github.com/alsa-project/alsa-utils/issues/278 Signed-off-by: Jaroslav Kysela --- alsactl/90-alsa-restore.rules.in | 26 +++++++++++++++++++++++--- alsactl/Makefile.am | 4 ++++ configure.ac | 15 +++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/alsactl/90-alsa-restore.rules.in b/alsactl/90-alsa-restore.rules.in index 1a411c994..85f0b15f4 100644 --- a/alsactl/90-alsa-restore.rules.in +++ b/alsactl/90-alsa-restore.rules.in @@ -1,8 +1,28 @@ -ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="@sbindir@", TEST=="@mydatadir@", GOTO="alsa_restore_go" +# do not edit this file, it will be overwritten on update + +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*",@extratest@ GOTO="alsa_restore_go" GOTO="alsa_restore_end" +ENV{ALSA_CARD_NUMBER}="$attr{device/number}" + +# mark HDA analog card; HDMI/DP card does not have capture devices +DRIVERS=="snd_hda_intel", TEST=="device/pcmC$env{ALSA_CARD_NUMBER}D0p", RUN+="/bin/sh -c 'echo ALSA_CARD_HDA_ANALOG=$env{ALSA_CARD_NUMBER} >> /run/udev/alsa-hda-analog-card'" + +# check for ACP hardware +TEST=="device/device/acp3x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp6x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp63-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp-pdm-dmic", GOTO="alsa_hda_analog" +GOTO="alsa_restore_std" + +LABEL="alsa_hda_analog" +# restore configuration for profile with combined cards (HDA + digital mic) +TEST!="/run/udev/alsa-hda-analog-card", GOTO="alsa_restore_std" +IMPORT{program}="/usr/bin/cat /run/udev/alsa-hda-analog-card" +ENV{ALSA_CARD_HDA_ANALOG}!="", ENV{ALSA_CARD_NUMBER}="$env{ALSA_CARD_HDA_ANALOG}" + LABEL="alsa_restore_go" -TEST!="@daemonswitch@", RUN+="@sbindir@/alsactl restore $devnode" -TEST=="@daemonswitch@", RUN+="@sbindir@/alsactl nrestore $devnode" +TEST!="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ restore $env{ALSA_CARD_NUMBER}" +TEST=="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ nrestore $env{ALSA_CARD_NUMBER}" LABEL="alsa_restore_end" diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am index fb32c4f3a..e77171739 100644 --- a/alsactl/Makefile.am +++ b/alsactl/Makefile.am @@ -43,10 +43,14 @@ install-data-hook: endif edit = \ + extratest=$$(echo ' $(ALSACTL_UDEV_EXTRATEST)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ + args=$$(echo ' $(ALSACTL_UDEV_ARGS)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ $(SED) -r -e 's,@sbindir\@,$(sbindir),g' \ -e 's,@mydatadir\@,$(mydatadir),g' \ -e 's,@daemonswitch\@,$(ALSACTL_DAEMONSWITCH),g' \ -e 's,@asoundrcfile\@,$(ASOUND_STATE_DIR)/asound.state,g' \ + -e "s;@extratest\@;$${extratest};g" \ + -e "s;@args\@;$${args};g" \ < $< > $@ || rm $@ alsa-state.service: alsa-state.service.in diff --git a/configure.ac b/configure.ac index 4156985dc..1cf74d7fa 100644 --- a/configure.ac +++ b/configure.ac @@ -446,6 +446,21 @@ AC_ARG_WITH([alsactl-daemonswitch], [ALSACTL_DAEMONSWITCH="/etc/alsa/state-daemon.conf"]) AC_SUBST(ALSACTL_DAEMONSWITCH) +AC_ARG_WITH([alsactl-udev-extra-test], + AS_HELP_STRING([--with-alsactl-udev-extra-test=TEST], [Extra udev tests]), + [ALSACTL_UDEV_EXTRATEST="$withval"], + [ALSACTL_UDEV_EXTRATEST="default"]) +if test "$ALSACTL_UDEV_EXTRATEST" = "default"; then + ALSACTL_UDEV_EXTRATEST="TEST==\"${sbindir}\", TEST==\"${mydatadir}\"," +fi +AC_SUBST(ALSACTL_UDEV_EXTRATEST) + +AC_ARG_WITH([alsactl-udev-args], + AS_HELP_STRING([--with-alsactl-udev-args=ARGS], [Extra alsactl arguments (udev rules)]), + [ALSACTL_UDEV_ARGS="$withval"], + [ALSACTL_UDEV_ARGS=""]) +AC_SUBST(ALSACTL_UDEV_ARGS) + dnl pre-process plugin directory AC_ARG_WITH(plugindir, AS_HELP_STRING([--with-plugindir=dir],