All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Soller <jeremy@system76.com>
To: alsa-devel@alsa-project.org
Subject: [PATCH] Add support for Sabre HiFi on System76 and Clevo laptops
Date: Wed, 01 Feb 2017 13:57:13 -0700	[thread overview]
Message-ID: <1485982633.3862207.867226728.4BAFFCC3@webmail.messagingengine.com> (raw)

This patch adds support for the ESS Sabre HiFi DAC found on some
System76 and Clevo laptops. These devices can be identified using the
Clevo subvendor id, and the Realtek ALC898 codec vendor ID. When a
connection is detected on the ESS DAC, identified by GPIO pin 2 being
set low, the 0x1b pin VREF should be set to 80%. Otherwise, it should be
set to HIZ. Testing has been performed on the current System76 line of
laptops, with and without DACs, no regressions have been found.

---
 sound/pci/hda/patch_realtek.c | 53
 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/sound/pci/hda/patch_realtek.c
b/sound/pci/hda/patch_realtek.c
index 7d660ee..ed15317 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -1797,6 +1797,7 @@ enum {
 	ALC882_FIXUP_NO_PRIMARY_HP,
 	ALC887_FIXUP_ASUS_BASS,
 	ALC887_FIXUP_BASS_CHMAP,
+       ALC898_FIXUP_CLEVO_SPDIF,
 };
 
 static void alc889_fixup_coef(struct hda_codec *codec,
@@ -1956,6 +1957,43 @@ static void alc882_fixup_no_primary_hp(struct
hda_codec *codec,
 	}
 }
 
+static void alc898_clevo_dac_hook(struct hda_codec *codec,
+                                   struct hda_jack_callback *jack)
+{
+       int val;
+
+       // Read ESS DAC status
+       snd_hda_codec_write(codec, codec->core.afg, 0,
AC_VERB_SET_GPIO_MASK, 4);
+       snd_hda_codec_write(codec, codec->core.afg, 0,
AC_VERB_SET_GPIO_DIRECTION, 0);
+       val = snd_hda_codec_read(codec, codec->core.afg, 0,
AC_VERB_GET_GPIO_DATA, 0);
+       val &= 0x04;
+
+       if (val == 0) {
+               // Set VREF on headphone pin to 80%
+               val = snd_hda_codec_get_pin_target(codec, 0x1b);
+               val |= AC_PINCTL_VREF_80;
+               snd_hda_set_pin_ctl(codec, 0x1b, val);
+       } else {
+               // Set VREF on headphone pin to HIZ
+               val = snd_hda_codec_get_pin_target(codec, 0x1b);
+               val = val & 0xfff8;
+               snd_hda_set_pin_ctl(codec, 0x1b, val);
+       }
+}
+
+static void alc898_fixup_clevo(struct hda_codec *codec,
+                                      const struct hda_fixup *fix, int
action)
+{
+       switch (action) {
+       case HDA_FIXUP_ACT_PRE_PROBE:
+               snd_hda_jack_detect_enable_callback(codec, 0x1b,
alc898_clevo_dac_hook);
+               break;
+       case HDA_FIXUP_ACT_INIT:
+               snd_hda_codec_read(codec, 0x1b, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, 4);
+               break;
+       }
+}
+
 static void alc_fixup_bass_chmap(struct hda_codec *codec,
 				 const struct hda_fixup *fix, int
 				 action);
 
@@ -2195,6 +2233,10 @@ static const struct hda_fixup alc882_fixups[] = {
 		.type = HDA_FIXUP_FUNC,
 		.v.func = alc_fixup_bass_chmap,
 	},
+       [ALC898_FIXUP_CLEVO_SPDIF] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc898_fixup_clevo,
+       },
 };
 
 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
@@ -2271,6 +2313,10 @@ static const struct snd_pci_quirk
alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
 	{}
 };
+static const struct snd_pci_quirk alc898_fixup_tbl[] = {
+       SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop",
ALC898_FIXUP_CLEVO_SPDIF),
+       {}
+};
 
 static const struct hda_model_fixup alc882_fixup_models[] = {
 	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name =
 	"acer-aspire-4930g"},
@@ -2310,6 +2356,11 @@ static int patch_alc882(struct hda_codec *codec)
 	case 0x10ec0885:
 	case 0x10ec0900:
 		break;
+       case 0x10ec0898:
+       case 0x10ec0899:
+               snd_hda_pick_fixup(codec, NULL, alc898_fixup_tbl,
+                      alc882_fixups);
+               break;
 	default:
 		/* ALC883 and variants */
 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
@@ -4357,7 +4408,7 @@ static void
alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
 		struct alc_spec *spec = codec->spec;
 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
 		alc255_set_default_jack_type(codec);
-       } 
+       }
 	else
 		alc_fixup_headset_mode(codec, fix, action);
 }
-- 
2.9.3

             reply	other threads:[~2017-02-01 20:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-01 20:57 Jeremy Soller [this message]
2017-02-08 13:11 ` [PATCH] Add support for Sabre HiFi on System76 and Clevo laptops Takashi Iwai
2019-08-11 22:19 Dennis Mungai
2019-08-14  6:46 ` 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=1485982633.3862207.867226728.4BAFFCC3@webmail.messagingengine.com \
    --to=jeremy@system76.com \
    --cc=alsa-devel@alsa-project.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.