[PATCH] ALSA: hda/senary: Fix beep error handling and optimize EAPD switching

wangdich9700@163.com posted 1 patch 1 month ago
sound/hda/codecs/senarytech.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
[PATCH] ALSA: hda/senary: Fix beep error handling and optimize EAPD switching
Posted by wangdich9700@163.com 1 month ago
From: wangdicheng <wangdicheng@kylinos.cn>

This patch addresses a potential state inconsistency bug and optimizes
runtime performance:

1. Fix error handling in set_beep_amp():
   Previously, beep_nid was assigned before adding kcontrols. If
   kcontrol creation failed, the function returned error but left
   beep_nid set, causing inconsistent driver state. Moved the
   assignment to the end of the function.

2. Optimize senary_auto_turn_eapd():
   Removed the redundant snd_hda_query_pin_caps() check inside the
   loop. The target pins are sourced from spec->eapds, which is
   strictly filtered during the initial parse phase. Checking
   capabilities again during every mute/unmute hook is unnecessary
   overhead.

Signed-off-by: wangdicheng <wangdicheng@kylinos.cn>
---
 sound/hda/codecs/senarytech.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/sound/hda/codecs/senarytech.c b/sound/hda/codecs/senarytech.c
index 6239a25bb8f3..61b0dcf76305 100644
--- a/sound/hda/codecs/senarytech.c
+++ b/sound/hda/codecs/senarytech.c
@@ -50,7 +50,6 @@ static int set_beep_amp(struct senary_spec *spec, hda_nid_t nid,
 	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir);
 	int i;
 
-	spec->gen.beep_nid = nid;
 	for (i = 0; i < ARRAY_SIZE(senary_beep_mixer); i++) {
 		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
 					    &senary_beep_mixer[i]);
@@ -58,6 +57,8 @@ static int set_beep_amp(struct senary_spec *spec, hda_nid_t nid,
 			return -ENOMEM;
 		knew->private_value = beep_amp;
 	}
+
+	spec->gen.beep_nid = nid;
 	return 0;
 }
 
@@ -99,10 +100,9 @@ static void senary_auto_turn_eapd(struct hda_codec *codec, int num_pins,
 	int i;
 
 	for (i = 0; i < num_pins; i++) {
-		if (snd_hda_query_pin_caps(codec, pins[i]) & AC_PINCAP_EAPD)
-			snd_hda_codec_write(codec, pins[i], 0,
-					    AC_VERB_SET_EAPD_BTLENABLE,
-					    on ? 0x02 : 0);
+		snd_hda_codec_write(codec, pins[i], 0,
+				    AC_VERB_SET_EAPD_BTLENABLE,
+				    on ? 0x02 : 0);
 	}
 }
 
-- 
2.25.1
Re: [PATCH] ALSA: hda/senary: Fix beep error handling and optimize EAPD switching
Posted by Takashi Iwai 4 weeks, 1 day ago
On Tue, 10 Mar 2026 03:36:49 +0100,
wangdich9700@163.com wrote:
> 
> From: wangdicheng <wangdicheng@kylinos.cn>
> 
> This patch addresses a potential state inconsistency bug and optimizes
> runtime performance:
> 
> 1. Fix error handling in set_beep_amp():
>    Previously, beep_nid was assigned before adding kcontrols. If
>    kcontrol creation failed, the function returned error but left
>    beep_nid set, causing inconsistent driver state. Moved the
>    assignment to the end of the function.
> 
> 2. Optimize senary_auto_turn_eapd():
>    Removed the redundant snd_hda_query_pin_caps() check inside the
>    loop. The target pins are sourced from spec->eapds, which is
>    strictly filtered during the initial parse phase. Checking
>    capabilities again during every mute/unmute hook is unnecessary
>    overhead.
> 
> Signed-off-by: wangdicheng <wangdicheng@kylinos.cn>

Applied to for-next branch now.  Thanks.


Takashi