[alsa-devel] Support Dell headset mode for ALC288
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
Thanks.
BR, Kailang
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void alc_determine_headset_type(struct hda_codec *codec) conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void alc_update_headset_jack_cb(struct hda_codec *codec, struct hda_jack_callback *jack) { struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id == 0x10ec0288)
/* Headset Mic enable and disable, ony for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it instead. Or, put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id == 0x10ec0288)
/* Headset Mic enable and disable, ony for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it instead. Or, put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
Ok! I will split it for two patches. But spec->gen.hp_automute_hook = alc_update_headset_jack_cb in alc_fixup_headset_mode(). If I move dell specific part to fixup table by SSID, spec->gen.hp_automute_hook will be reinit to new. So, I just place the code here.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
Hi Takashi,
Attach patch is support alc288 headset mode.
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id == 0x10ec0288)
/* Headset Mic enable and disable, ony for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it instead. Or, put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
At Wed, 8 Apr 2015 07:31:33 +0000, Kailang wrote:
Hi Takashi,
Attach patch is support alc288 headset mode.
This also supports ALC286, too, right?
Takashi
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id == 0x10ec0288)
/* Headset Mic enable and disable, ony for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it instead. Or, put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
[2 0000-alc288-headset-mode.patch <application/octet-stream (base64)>]
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Wednesday, April 08, 2015 3:40 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Wed, 8 Apr 2015 07:31:33 +0000, Kailang wrote:
Hi Takashi,
Attach patch is support alc288 headset mode.
This also supports ALC286, too, right?
Yes, they are brother.
Takashi
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id
== 0x10ec0288)
/* Headset Mic enable and disable, ony
for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it
instead. Or,
put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
[2 0000-alc288-headset-mode.patch <application/octet-stream
(base64)>]
At Wed, 8 Apr 2015 08:08:47 +0000, Kailang wrote:
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Wednesday, April 08, 2015 3:40 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Wed, 8 Apr 2015 07:31:33 +0000, Kailang wrote:
Hi Takashi,
Attach patch is support alc288 headset mode.
This also supports ALC286, too, right?
Yes, they are brother.
OK, I applied this with rephrasing the changelog mentioning ALC286, too.
Since this one and Dell patch are relative large changes, I queued them to for-next branch instead of for-linus, i.e. the merge to Linus tree will be postponed to 4.1-rc1.
thanks,
Takashi
Takashi
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id
== 0x10ec0288)
/* Headset Mic enable and disable, ony
for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it
instead. Or,
put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
[2 0000-alc288-headset-mode.patch <application/octet-stream
(base64)>]
On 04/08/2015 04:40 AM, Takashi Iwai wrote:
At Wed, 8 Apr 2015 08:08:47 +0000, Kailang wrote: OK, I applied this with rephrasing the changelog mentioning ALC286, too.
Since this one and Dell patch are relative large changes, I queued them to for-next branch instead of for-linus, i.e. the merge to Linus tree will be postponed to 4.1-rc1.
thanks,
Takashi
Takashi,
It's a bit unfortunate that these are landing in 4.1 rather than 4.0. 4.1 they actually won't be very useful in the default kernel due to this patch landing: https://github.com/torvalds/linux/commit/b1ef2972586577e0ca9675254ee141f65a8...
With 4.1 the XPS 13 will run in I2S audio mode.
Is there any chance at backporting these to @stable? Some of the distros (Ubuntu and Fedora) are already backporting this into some of their kernel versions, but I think this should benefit the community at large if the other distributions that tracked @stable could pick this up too.
Thanks,
At Mon, 20 Apr 2015 15:12:59 -0500, Mario Limonciello wrote:
On 04/08/2015 04:40 AM, Takashi Iwai wrote:
At Wed, 8 Apr 2015 08:08:47 +0000, Kailang wrote: OK, I applied this with rephrasing the changelog mentioning ALC286, too.
Since this one and Dell patch are relative large changes, I queued them to for-next branch instead of for-linus, i.e. the merge to Linus tree will be postponed to 4.1-rc1.
thanks,
Takashi
Takashi,
It's a bit unfortunate that these are landing in 4.1 rather than 4.0. 4.1 they actually won't be very useful in the default kernel due to this patch landing: https://github.com/torvalds/linux/commit/b1ef2972586577e0ca9675254ee141f65a8...
With 4.1 the XPS 13 will run in I2S audio mode.
Is there any chance at backporting these to @stable? Some of the distros (Ubuntu and Fedora) are already backporting this into some of their kernel versions, but I think this should benefit the community at large if the other distributions that tracked @stable could pick this up too.
It's easy, you just need to send a post to stable kernel to tell the commit id to cherry-pick.
At best it should be done by the people who actually test the backport, as this is no generic fix I can confirm.
Takashi
Hi Takashi,
Attach patch is Dell specific for headset mode. I splited it and done some modification.
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Wednesday, April 08, 2015 3:40 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Wed, 8 Apr 2015 07:31:33 +0000, Kailang wrote:
Hi Takashi,
Attach patch is support alc288 headset mode.
This also supports ALC286, too, right?
Takashi
BR, Kailang
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Saturday, April 04, 2015 8:43 PM To: Kailang Cc: (alsa-devel@alsa-project.org) Subject: Re: Support Dell headset mode for ALC288
At Tue, 31 Mar 2015 08:01:57 +0000, Kailang wrote:
Hi Takashi,
Dell has new platform with ALC288. Attach patch is support headset mode for ALC288.
@@ -3828,6 +3894,11 @@ static void
alc_determine_headset_type(struct hda_codec *codec)
conteol) */ {} };
- static struct coef_fw coef0286[] = {
//UPDATE_COEF(0x4f, 0xfcc0, 0x5400), /* Combo
Jack auto detect */
UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
Why is this commented out and what's the next line does instead? And it's 0286? Not 0288?
@@ -3949,8 +4027,15 @@ static void
alc_update_headset_jack_cb(struct hda_codec *codec,
struct hda_jack_callback
*jack) {
struct alc_spec *spec = codec->spec;
- int present; spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; snd_hda_gen_hp_automute(codec, jack);
- present = spec->gen.hp_jack_present ? 0x40 : 0;
- if (codec->bus->pci->subsystem_vendor == 0x1028 &&
codec->core.vendor_id
== 0x10ec0288)
/* Headset Mic enable and disable, ony
for Dell Dino */
snd_hda_codec_write(codec, 0x01, 0,
AC_VERB_SET_GPIO_DATA,
present);
This is too ugly to put in the common function. For Dell, prepare its own callback function and use it
instead. Or,
put a new hook there to call additionally. This avoids the PCI ID check in each place.
So, better to split to a few patches. One for adding ALC286 (or 288?) support generically. And another for adding Dell-specific things.
thanks,
Takashi
------Please consider the environment before printing this e-mail.
[2 0000-alc288-headset-mode.patch <application/octet-stream
(base64)>]
At Wed, 8 Apr 2015 08:13:21 +0000, Kailang wrote:
Hi Takashi,
Attach patch is Dell specific for headset mode. I splited it and done some modification.
The patch doesn't compile. I fixed it manually and also did the simple refactoring as below. Now it's applied to for-next branch.
thanks,
Takashi
-- 8< -- From: Kailang Yang kailang@realtek.com Subject: [PATCH] ALSA: hda/realtek - Support Dell headset mode for ALC288
Dell create new platform with ALC288 codec. This patch will enable headset mode for Dino platform.
[slight code refactoring and compile fix by tiwai]
Signed-off-by: Kailang Yang kailang@realtek.com Signed-off-by: Takashi Iwai tiwai@suse.de --- sound/pci/hda/patch_realtek.c | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index ceb599a87803..7b5c93e0e78c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -4121,6 +4121,29 @@ static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec, alc_fixup_headset_mode(codec, fix, action); }
+static void alc288_update_headset_jack_cb(struct hda_codec *codec, + struct hda_jack_callback *jack) +{ + struct alc_spec *spec = codec->spec; + int present; + + alc_update_headset_jack_cb(codec, jack); + /* Headset Mic enable or disable, only for Dell Dino */ + present = spec->gen.hp_jack_present ? 0x40 : 0; + snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, + present); +} + +static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + alc_fixup_headset_mode(codec, fix, action); + if (action == HDA_FIXUP_ACT_PROBE) { + struct alc_spec *spec = codec->spec; + spec->gen.hp_automute_hook = alc288_update_headset_jack_cb; + } +} + static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec, const struct hda_fixup *fix, int action) { @@ -4460,6 +4483,9 @@ enum { ALC286_FIXUP_HP_GPIO_LED, ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, ALC280_FIXUP_HP_DOCK_PINS, + ALC288_FIXUP_DELL_HEADSET_MODE, + ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC288_FIXUP_DELL_XPS_13_GPIO6, };
static const struct hda_fixup alc269_fixups[] = { @@ -4948,6 +4974,33 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC280_FIXUP_HP_GPIO4 }, + [ALC288_FIXUP_DELL_HEADSET_MODE] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_headset_mode_dell_alc288, + .chained = true, + .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED + }, + [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ + { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE + }, + [ALC288_FIXUP_DELL_XPS_13_GPIO6] = { + .type = HDA_FIXUP_VERBS, + .v.verbs = (const struct hda_verb[]) { + {0x01, AC_VERB_SET_GPIO_MASK, 0x40}, + {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x40}, + {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, + { } + }, + .chained = true, + .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE + }, };
static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -5174,6 +5227,13 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {0x1b, 0x411111f0}, \ {0x1e, 0x411111f0}
+#define ALC288_STANDARD_PINS \ + {0x17, 0x411111f0}, \ + {0x18, 0x411111f0}, \ + {0x19, 0x411111f0}, \ + {0x1a, 0x411111f0}, \ + {0x1e, 0x411111f0} + #define ALC290_STANDARD_PINS \ {0x12, 0x99a30130}, \ {0x13, 0x40000000}, \ @@ -5369,6 +5429,13 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x19, 0x03a11020}, {0x1d, 0x40e00001}, {0x21, 0x0321101f}), + SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL_XPS_13_GPIO6, + ALC288_STANDARD_PINS, + {0x12, 0x90a60120}, + {0x13, 0x40000000}, + {0x14, 0x90170110}, + {0x1d, 0x4076832d}, + {0x21, 0x0321101f}), SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, ALC290_STANDARD_PINS, {0x14, 0x411111f0},
participants (3)
-
Kailang
-
Mario Limonciello
-
Takashi Iwai