[alsa-devel] Asus N751JK - push/merge patches on mailinglist

Raymond Yau superquad.vortex2 at gmail.com
Thu Sep 17 11:24:11 CEST 2015


2015-09-13 16:13 GMT+08:00 Takashi Iwai <tiwai at suse.de>:

> On Sat, 12 Sep 2015 23:09:43 +0200,
> Arthur Borsboom wrote:
> >
> > Hi Takashi,
> >
> > Previous month Raymond Yau has done great work to get the audio working
> for
> > the Asus N751JK laptop.
> > He developed 7 patches, which I have tested and confirmed working on this
> > laptop.
> >
> > Raymond is not responding for about two weeks (maybe on holiday?).
> > Would you mind to post these patches on the mailinglist (the correct way)
> > and/or merge them in a way the get into the mainline kernel a.s.a.p?
>
> Sorry, it can't be done like that.  The patches aren't yet in
> acceptable forms, and it needs more changes to be merged to mainline.
> It must be done by someone who did it originally or who has the
> hardware and test.
>

I don't have the hardware, the alternate approach is to create headset jack
(SND_JACK_HEADSET) and skip the creation of headset mic phanton jack
instead of headphone jack and headset mic jack since implement sense_nid
and slave_nid is not easy to debug

What you need is adding "Jack Headset" to pulseaudio
analog-input-headset-mic.conf since "Headset Jack" kctl already in
analog-out-headphones.conf

 static int get_input_jack_type(struct hda_codec *codec, hda_nid_t nid)
 {
+    struct hda_gen_spec *spec = codec->spec;
+    struct auto_pin_cfg *cfg = &spec->autocfg;
     unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
     switch (get_defcfg_device(def_conf)) {
     case AC_JACK_LINE_OUT:
     case AC_JACK_SPEAKER:
         return SND_JACK_LINEOUT;
     case AC_JACK_HP_OUT:
+        if (spec->hs_mic_use_hp_sense &&
+            (nid == auto_cfg_hp_pins(cfg)[0]))
+            return SND_JACK_HEADSET;
         return SND_JACK_HEADPHONE;
     case AC_JACK_SPDIF_OUT:
     case AC_JACK_DIG_OTHER_OUT:



               const struct auto_pin_cfg *cfg)
 {
     const hda_nid_t *p;
+    struct hda_gen_spec *spec = codec->spec;
     int i, err;

     for (i = 0; i < cfg->num_inputs; i++) {
@@ -482,6 +499,12 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec,
                 err = add_jack_kctl(codec, cfg->inputs[i].pin,
                             cfg, "Headphone Mic");
         } else
+        if (cfg->inputs[i].is_headset_mic &&
+            spec->hs_mic_use_hp_sense &&
+            !is_jack_detectable(codec, cfg->inputs[i].pin)) {
+            err = 0;
+
+        } else
             err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg,
                         NULL);
         if (err < 0)
@@ -489,14 +512,21 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec,
     }

     for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) {
-        err = add_jack_kctl(codec, *p, cfg, NULL);
+        if (is_subwoofer(codec, *p, i, cfg->line_outs) &&
+            is_external_pin(codec, *p))
+            err = add_jack_kctl(codec, *p, cfg, "Ext Subwoofer");
+        else
+            err = add_jack_kctl(codec, *p, cfg, NULL);
         if (err < 0)
             return err;
     }
     for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) {
         if (*p == *cfg->line_out_pins) /* might be duplicated */
             break;
-        err = add_jack_kctl(codec, *p, cfg, NULL);
+        if (i == 0 && spec->hs_mic_use_hp_sense)
+            err = add_jack_kctl(codec, *p, cfg, "Headset");
+        else
+            err = add_jack_kctl(codec, *p, cfg, NULL);
         if (err < 0)
             return err;
     }


change the pin to hp pin when mic pin is headset mic

+bool is_headset_mic(struct hda_codec *codec, hda_nid_t nid)
+{
+    struct hda_gen_spec *spec = codec->spec;
+    struct auto_pin_cfg *cfg = &spec->autocfg;
+    int i;
+
+    for (i = 0; i < cfg->num_inputs; i++)
+        if (nid == cfg->inputs[i].pin)
+            return cfg->inputs[i].is_headset_mic;
+    return false;
+}
+


@@ -4384,6 +4399,8 @@ void snd_hda_gen_mic_autoswitch(struct hda_codec
*codec,
         /* don't detect pins retasked as outputs */
         if (snd_hda_codec_get_pin_target(codec, pin) & AC_PINCTL_OUT_EN)
             continue;
+        if (is_headset_mic(codec, pin) && spec->hs_mic_use_hp_sense)
+            pin = auto_cfg_hp_pins(cfg)[0];
         if (snd_hda_jack_detect_state(codec, pin) == HDA_JACK_PRESENT) {
             mux_select(codec, 0, spec->am_entry[i].idx);
             return;


More information about the Alsa-devel mailing list