Linux Sound subsystem development
 help / color / mirror / Atom feed
From: wangdich9700@163.com
To: bo.liu@senarytech.com, perex@perex.cz, tiwai@suse.com
Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
	wangdicheng <wangdicheng@kylinos.cn>
Subject: [PATCH 3/4] ALSA: hda/senary: Add dynamic EAPD control via playback hook
Date: Thu,  5 Mar 2026 11:27:41 +0800	[thread overview]
Message-ID: <20260305032741.236048-1-wangdich9700@163.com> (raw)

From: wangdicheng <wangdicheng@kylinos.cn>

To reduce power consumption and eliminate static noise during idle,
this patch introduces dynamic EAPD switching. It hooks into the PCM
playback stream to turn EAPD on only when audio is playing and off
when the stream stops.

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

diff --git a/sound/hda/codecs/senarytech.c b/sound/hda/codecs/senarytech.c
index 8ebd974817ac..c589b3b01171 100644
--- a/sound/hda/codecs/senarytech.c
+++ b/sound/hda/codecs/senarytech.c
@@ -132,6 +132,36 @@ static void senary_init_verb(struct hda_codec *codec)
 	snd_hda_override_pin_caps(codec, 0x19, 0x2124);
 }
 
+static void senary_set_port_eapd(struct hda_codec *codec, hda_nid_t nid, bool enable)
+{
+	unsigned char port_eapd = 0, eapd_value = enable << 1;
+
+	port_eapd = snd_hda_codec_read(codec, nid, 0, 0xf0c, 0x0);
+	if (port_eapd != eapd_value)
+		snd_hda_codec_write(codec, nid, 0, 0x70c, eapd_value);
+}
+
+static void senary_playback_hook(struct hda_pcm_stream *hinfo,
+		struct hda_codec *codec,
+		struct snd_pcm_substream *substream,
+		int action)
+{
+	struct senary_spec *spec = codec->spec;
+	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
+	int i;
+
+	switch (action) {
+	case HDA_GEN_PCM_ACT_PREPARE:
+		for (i = 0; i < cfg->speaker_outs; i++)
+			senary_set_port_eapd(codec, cfg->speaker_pins[i], true);
+		break;
+	case HDA_GEN_PCM_ACT_CLEANUP:
+		for (i = 0; i < cfg->speaker_outs; i++)
+			senary_set_port_eapd(codec, cfg->speaker_pins[i], false);
+		break;
+	}
+}
+
 static void senary_auto_turn_eapd(struct hda_codec *codec, int num_pins,
 			      const hda_nid_t *pins, bool on)
 {
@@ -270,6 +300,13 @@ static int senary_probe(struct hda_codec *codec, const struct hda_device_id *id)
 	if (err < 0)
 		goto error;
 
+	/* Register playback hook for dynamic EAPD control.
+	 * Vendor driver applies this specifically for subsystem 0x14f10101,
+	 * but we apply it broadly for SN6186 to fix noise issues.
+	 */
+	if (codec->core.vendor_id == 0x1fa86186)
+		spec->gen.pcm_playback_hook = senary_playback_hook;
+
 	/* Some laptops with Senary chips show stalls in S3 resume,
 	 * which falls into the single-cmd mode.
 	 * Better to make reset, then.
-- 
2.25.1


             reply	other threads:[~2026-03-05  3:28 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-05  3:27 wangdich9700 [this message]
2026-03-05 11:41 ` [PATCH 3/4] ALSA: hda/senary: Add dynamic EAPD control via playback hook Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260305032741.236048-1-wangdich9700@163.com \
    --to=wangdich9700@163.com \
    --cc=bo.liu@senarytech.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.com \
    --cc=wangdicheng@kylinos.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox