Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Jean-Pierre André" <jean-pierre.andre@wanadoo.fr>
To: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Cc: tiwai@suse.de, alsa-devel@alsa-project.org, tim.barnette@gmail.com
Subject: Re: [Fwd: HP DV4 1155 SE - No Sound through speakers...]
Date: Tue, 03 Feb 2009 14:49:39 +0100	[thread overview]
Message-ID: <49884B73.7050906@wanadoo.fr> (raw)
In-Reply-To: <200902021620.52104.herton@mandriva.com.br>

[-- Attachment #1: Type: text/plain, Size: 5242 bytes --]

Hi Herton,

Thank you for trying to sort his out,

Herton Ronaldo Krzesinski wrote:
> Em Sábado 31 Janeiro 2009, às 05:52:19, Jean-Pierre André escreveu:
>   
>> Hi,
>>
>>     
>>> Hi all, I have an HP DV4 1155-SE, I've been unable to get sound working
>>> through the speakers, although it does work through the headhpones. I ran
>>> alsa-.upgrade which downloaded compiled, and installed 1.0.19 - still no
>>> luck.
>>>   
>>>       
>> I have the same IDT codec 92HD71B7X on another
>> HP DV4 model, and I have tracked the problem to be
>> the kernel configuring IRQ 22 through the APIC, but
>> interrupts triggerring IRQ 20 (on kernel 2.6.27 and
>> alsa 1.0.19). It would be interesting if you could
>> confirm this by analyzing /proc/interrupts.
>>
>> The workarounds I know of are :
>> - adding irqpoll to the boot options,
>> - or adding noapic to the boot options,
>> - using mplayer to play music.
>>
>> There are with option "snd-hda-intel model=hp-m4"
>> (this option is for HP DV5/DV7, but HP DV4
>> is probably different)
>>
>> I have not enough knowledge to tell where the problem
>> lies : kernel, apic, alsa.
>>     
>
> It looks like some of these HP laptops have some sort of IRQ issue indeed, to 
> me it was reported that enabling pci MSI (both system wide and with 
> enable_msi=1 given to snd-hda-intel) cured issues in some cases, along with 
> some changes to sigmatel codec handling code in snd-hda-intel
>
> I have a ticked opened where people started to complain about sound issues 
> with hda-intel+sigmatel codec starting with alsa 1.0.18rc3 (sorry, it's a 
> great mess, type of the ticket everyone says sound doesn't work and report in, 
> but where I tried to filter some things out): 
> https://qa.mandriva.com/show_bug.cgi?id=44855
> Also some reports are hard to understand sometimes.
> With alsa 1.0.18 final in 2.6.27 (or 2.6.28) many issues related on the ticket 
> were fixed, but issues with HP laptops remained.
>
> I don't have any of affected HP laptops for test, but based on sigmatel 
> datasheets, reports of users and pin cfgs used in .ini files of sigmatel 
> windows drivers I made some changes to sigmatel code, plus added patch to set 
> enable_msi. The only issue I have with the changes, and that's why I didn't 
> submit yet, is that I should have split them, don't know if everything is 
> really required, and ask here to clarify some things below; also the changes 
> are outdated compared to current sound git tree.
>   

Thank you for your suggested patches. I had some difficulties in
applying them as your reference version is not from the lasted build.
(for instance from alsa-driver-1.0.19.0.g5aa59.6.gb162b.tar.bz2)
Actually, to get patch_sigmatel to compile, I had to reintegrate
old deprecated code. Attached are the patches I really applied.

And the result is worse than before : no sound at all, using option
"model hp-m4-2", as I see in the patch that this was designed for
my sound device (subsystem id 0x30f7). I am also using option
enable_msi=1.

And still no IRQ 22 seen, IRQ 20 instead, could be another problem,
but what can I do to clarify this ?

With the original code, this is what I get in the syslog,

Feb  3 12:27:18 pavilion2 kernel: HDA Intel 0000:00:1b.0: power state 
changed by ACPI to D0
Feb  3 12:27:18 pavilion2 kernel: HDA Intel 0000:00:1b.0: PCI INT B -> 
GSI 22 (level, low) -> IRQ 22
Feb  3 12:27:19 pavilion2 kernel: ALSA 
/var/tmp/bach-build/BUILD/alsa-driver-1.0.19/pci/hda/hda_intel.c:634: 
hda_intel: azx_get_response timeout, switching to polling mode: last 
cmd=0x000f0000
Feb  3 12:27:19 pavilion2 kernel: input: HDA Digital PCBeep as 
/devices/pci0000:00/0000:00:1b.0/input/input38
Feb  3 12:27:19 pavilion2 kernel: input: HDA Intel at 0xdf300000 irq 22 
Line In at Ext Rear Jack as /devices/pci0000:00/0000:00:1b.0/input/input39
Feb  3 12:27:19 pavilion2 kernel: input: HDA Intel at 0xdf300000 irq 22 
Mic at Ext Front Jack as /devices/pci0000:00/0000:00:1b.0/input/input40
Feb  3 12:27:19 pavilion2 kernel: input: HDA Intel at 0xdf300000 irq 22 
HP Out at Ext Front Jack as /devices/pci0000:00/0000:00:1b.0/input/input41

With the patched one, the last line does not appear, this should
lead to the point where the patch has broken something :

Feb  3 11:23:47 pavilion2 kernel: HDA Intel 0000:00:1b.0: power state 
changed by ACPI to D0
Feb  3 11:23:47 pavilion2 kernel: HDA Intel 0000:00:1b.0: PCI INT B -> 
GSI 22 (level, low) -> IRQ 22
Feb  3 11:23:48 pavilion2 kernel: ALSA 
/home/linux/rpmbuild/BUILD/alsa-driver-1.0.19/pci/hda/hda_intel.c:634: 
hda_intel: azx_get_response timeout, switching to polling mode: last 
cmd=0x000f0000
Feb  3 11:23:48 pavilion2 kernel: input: HDA Digital PCBeep as 
/devices/pci0000:00/0000:00:1b.0/input/input19
Feb  3 11:23:48 pavilion2 kernel: input: HDA Intel at 0xdf300000 irq 22 
Mic at Ext Front Jack as /devices/pci0000:00/0000:00:1b.0/input/input20
Feb  3 11:23:48 pavilion2 kernel: input: HDA Intel at 0xdf300000 irq 22 
HP Out at Ext Front Jack as /devices/pci0000:00/0000:00:1b.0/input/input21

I am open to any further test which you might suggest

Regards

Jean-Pierre


[-- Attachment #2: herton-sigmatel.patch --]
[-- Type: text/plain, Size: 28984 bytes --]

--- alsa-driver-1.0.19/alsa-kernel/pci/hda/patch_sigmatel.c.old	2009-01-19 12:08:58.000000000 +0100
+++ alsa-driver-1.0.19/alsa-kernel/pci/hda/patch_sigmatel.c	2009-02-03 12:37:12.000000000 +0100
@@ -85,12 +85,26 @@
 };
 
 enum {
+	STAC_92HD71B5_REF,
+	STAC_92HD71B5_MODELS
+};
+
+enum {
+	STAC_92HD75B_5PORT_REF,
+	STAC_HP_M4,
+	STAC_92HD75B_5PORT_MODELS
+};
+
+enum {
 	STAC_92HD71BXX_REF,
 	STAC_DELL_M4_1,
 	STAC_DELL_M4_2,
 	STAC_DELL_M4_3,
-	STAC_HP_M4,
-	STAC_HP_DV5,
+	STAC_HP_M4_1,
+	STAC_HP_M4_2,
+	STAC_HP_M4_3,
+	STAC_HP_M4_4,
+	STAC_HP_M4_5,
 	STAC_92HD71BXX_MODELS
 };
 
@@ -224,6 +238,7 @@
 	hda_nid_t *pin_nids;
 	unsigned int num_pins;
 	unsigned int *pin_configs;
+	unsigned int *bios_pin_configs;
 
 	/* codec specific stuff */
 	struct hda_verb *init;
@@ -341,10 +356,6 @@
 	0xc,
 };
 
-static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
-	0x0a, 0x0d, 0x0f
-};
-
 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
 	0x12, 0x13,
 };
@@ -353,6 +364,10 @@
 	0x1a, 0x1b
 };
 
+static hda_nid_t stac92hd71bxx_dac_nids[2] = {
+	0x10, /*0x11, */
+};
+
 static hda_nid_t stac92hd71bxx_dmux_nids[2] = {
 	0x1c, 0x1d,
 };
@@ -361,6 +376,11 @@
 	0x24, 0x25,
 };
 
+#define STAC92HD75B_5PORT_NUM_DMICS 1
+static hda_nid_t stac92hd75b_5port_dmic_nids[STAC92HD75B_5PORT_NUM_DMICS + 1] = {
+	0x18, 0
+};
+
 #define STAC92HD71BXX_NUM_DMICS	2
 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
 	0x18, 0x19, 0
@@ -476,10 +496,22 @@
 	0x0f, 0x10, 0x11, 0x12, 0x13,
 	0x1d, 0x1e, 0x1f, 0x20
 };
-static hda_nid_t stac92hd71bxx_pin_nids[11] = {
+
+static hda_nid_t stac92hd71b5_pin_nids[11] = {
+	0x0a, 0x0b, 0x0c, 0x0d, 0x14,
+	0x18, 0x19, 0x1e, 0x1f, 0x20,
+	0x27
+};
+
+static hda_nid_t stac92hd75b_5port_pin_nids[10] = {
+	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
+	0x14, 0x18, 0x1e, 0x1f, 0x20
+};
+
+static hda_nid_t stac92hd71bxx_pin_nids[13] = {
 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 	0x0f, 0x14, 0x18, 0x19, 0x1e,
-	0x1f,
+	0x1f, 0x20, 0x27
 };
 
 static hda_nid_t stac927x_pin_nids[14] = {
@@ -857,10 +889,17 @@
 static struct hda_verb stac92hd71bxx_core_init[] = {
 	/* set master volume and direct control */
 	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
-	/* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
+  	/* connect headphone jack to dac1 */
+  	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
+ 	/* connect port D/mono out to dac0 */
+ 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	{ 0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	/* make sure dmuxes are initially connected to analog muxes */
+ 	{ 0x1c, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	{ 0x1d, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	/* unmute right and left channels for nodes 0x0a, 0xd */
 	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
-	{ 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 	{}
 };
 
@@ -876,6 +915,14 @@
 
 	/* set master volume and direct control */
 	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+  	/* connect headphone jack to dac1 */
+  	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
+ 	/* connect port D/mono out to dac0 */
+ 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	{ 0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
+ 	/* unmute and max step for dac0/dac1 inputs in mixer */
+ 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
+ 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x711f},
 	/* unmute right and left channels for nodes 0x0a, 0xd */
 	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
@@ -1098,7 +1145,6 @@
 
 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {
 	STAC_INPUT_SOURCE(2),
-	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2),
 
 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
@@ -1127,7 +1173,6 @@
 
 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
 	STAC_INPUT_SOURCE(2),
-	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2),
 
 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
@@ -1751,28 +1796,107 @@
 	{} /* terminator */
 };
 
-static unsigned int ref92hd71bxx_pin_configs[11] = {
+static unsigned int ref92hd71b5_pin_configs[] = {
+	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
+	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x01452050,
+	0x98560060, 0x40f000f0, 0x40f000f0,
+};
+
+static unsigned int *stac92hd71b5_brd_tbl[STAC_92HD71B5_MODELS] = {
+	[STAC_92HD71B5_REF] = ref92hd71b5_pin_configs,
+};
+
+static const char *stac92hd71b5_models[STAC_92HD71B5_MODELS] = {
+	[STAC_92HD71B5_REF] = "ref",
+};
+
+static struct snd_pci_quirk stac92hd71b5_cfg_tbl[] = {
+	{} /* terminator */
+};
+
+static unsigned int ref92hd75b_5port_pin_configs[] = {
+	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
+	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x01452050,
+	0x98560060, 0x40f000f0,
+};
+
+static unsigned int *stac92hd75b_5port_brd_tbl[STAC_92HD75B_5PORT_MODELS] = {
+	[STAC_92HD75B_5PORT_REF]	= ref92hd75b_5port_pin_configs,
+	[STAC_HP_M4]			= NULL,
+};
+
+static const char *stac92hd75b_5port_models[STAC_92HD75B_5PORT_MODELS] = {
+	[STAC_92HD75B_5PORT_REF] = "ref",
+	[STAC_HP_M4]		 = "hp-m4",
+};
+
+static struct snd_pci_quirk stac92hd75b_5port_cfg_tbl[] = {
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
+				"unknown HP", STAC_HP_M4),
+	{} /* terminator */
+};
+
+static unsigned int ref92hd71bxx_pin_configs[13] = {
 	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
 	0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
-	0x90a000f0, 0x01452050, 0x01452050,
+	0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
+	0x00000000,
 };
 
-static unsigned int dell_m4_1_pin_configs[11] = {
+static unsigned int dell_m4_1_pin_configs[13] = {
 	0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
 	0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
-	0x40f000f0, 0x4f0000f0, 0x4f0000f0,
+	0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
+	0x00000000,
 };
 
-static unsigned int dell_m4_2_pin_configs[11] = {
+static unsigned int dell_m4_2_pin_configs[13] = {
 	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
 	0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
-	0x40f000f0, 0x044413b0, 0x044413b0,
+	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
+	0x00000000,
 };
 
-static unsigned int dell_m4_3_pin_configs[11] = {
+static unsigned int dell_m4_3_pin_configs[13] = {
 	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
 	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
-	0x40f000f0, 0x044413b0, 0x044413b0,
+	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
+	0x00000000,
+};
+
+static unsigned int hp_m4_1_pin_configs[13] = {
+	0x0221201f, 0x02a12050, 0x40f000f0, 0x90170010,
+	0x40f000f1, 0x0221201f, 0x40f000f2, 0x90a60040,
+	0x50f000f3, 0x28466060, 0x50f000f4, 0x00000000,
+	0x90300041,
+};
+
+static unsigned int hp_m4_2_pin_configs[13] = {
+	0x0221201f, 0x02a1205e, 0x40f000f1, 0x90170010,
+	0x4080005f, 0x40f000f5, 0x40f000f2, 0x90a60070,
+	0x50f000f3, 0x50f000f4, 0x50f000f5, 0x28466060,
+	0x9030005a,
+};
+
+static unsigned int hp_m4_3_pin_configs[13] = {
+	0x0221201f, 0x02a1205e, 0x40f000f1, 0x90170010,
+	0x4080005f, 0x40f000f5, 0x40f000f2, 0x90a60070,
+	0x50f000f3, 0x28466060, 0x50f000f4, 0x40f000f0,
+	0x9030005a,
+};
+
+static unsigned int hp_m4_4_pin_configs[13] = {
+	0x0221201f, 0x02a12050, 0x90a70040, 0x90170010,
+	0x40f000f1, 0x40f000f5, 0x40f000f2, 0x50f000f6,
+	0x50f000f3, 0x50f000f7, 0x50f000f4, 0x28466060,
+	0x9030005a,
+};
+
+static unsigned int hp_m4_5_pin_configs[13] = {
+	0x0221201f, 0x02a1205e, 0x90a70070, 0x90170010,
+	0x4080005f, 0x40f000f5, 0x40f000f2, 0x50f000f1,
+	0x50f000f3, 0x50f000f6, 0x50f000f4, 0x28466060,
+	0x9030005a,
 };
 
 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
@@ -1780,8 +1904,11 @@
 	[STAC_DELL_M4_1]	= dell_m4_1_pin_configs,
 	[STAC_DELL_M4_2]	= dell_m4_2_pin_configs,
 	[STAC_DELL_M4_3]	= dell_m4_3_pin_configs,
-	[STAC_HP_M4]		= NULL,
-	[STAC_HP_DV5]		= NULL,
+	[STAC_HP_M4_1]		= hp_m4_1_pin_configs,
+	[STAC_HP_M4_2]		= hp_m4_2_pin_configs,
+	[STAC_HP_M4_3]		= hp_m4_3_pin_configs,
+	[STAC_HP_M4_4]		= hp_m4_4_pin_configs,
+	[STAC_HP_M4_5]		= hp_m4_5_pin_configs,
 };
 
 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
@@ -1789,24 +1916,59 @@
 	[STAC_DELL_M4_1] = "dell-m4-1",
 	[STAC_DELL_M4_2] = "dell-m4-2",
 	[STAC_DELL_M4_3] = "dell-m4-3",
-	[STAC_HP_M4] = "hp-m4",
-	[STAC_HP_DV5] = "hp-dv5",
+	[STAC_HP_M4_1] = "hp-m4-1",
+	[STAC_HP_M4_2] = "hp-m4-2",
+	[STAC_HP_M4_3] = "hp-m4-3",
+	[STAC_HP_M4_4] = "hp-m4-4",
+	[STAC_HP_M4_5] = "hp-m4-5",
 };
 
 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
 	/* SigmaTel reference board */
 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
 		      "DFI LanParty", STAC_92HD71BXX_REF),
-	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
-		      "HP dv5", STAC_HP_M4),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30de,
+		      "unknown HP", STAC_HP_M4_1),
+	SND_PCI_QUIRK(0x30de, 0x103c,
+		      "unknown HP", STAC_HP_M4_1),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1505,
+		      "unknown HP", STAC_HP_M4_1),
+	SND_PCI_QUIRK(0x1505, 0x103c,
+		      "unknown HP", STAC_HP_M4_1),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f3,
+		      "unknown HP", STAC_HP_M4_2),
 	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4,
-		      "HP dv7", STAC_HP_M4),
+		      "HP dv7", STAC_HP_M4_2),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f7,
+		      "unknown HP", STAC_HP_M4_2),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
+		      "unknown HP", STAC_HP_M4_2),
 	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc,
-		      "HP dv7", STAC_HP_M4),
+		      "unknown HP", STAC_HP_M4_2),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fd,
+		      "unknown HP", STAC_HP_M4_2),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
+		      "HP dv5", STAC_HP_M4_3),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3600,
+		      "unknown HP", STAC_HP_M4_3),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3602,
+		      "unknown HP", STAC_HP_M4_3),
 	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3603,
-		      "HP dv5", STAC_HP_DV5),
-	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
-				"unknown HP", STAC_HP_M4),
+		      "unknown HP", STAC_HP_M4_3),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x360f,
+		      "unknown HP", STAC_HP_M4_3),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
+		      "unknown HP", STAC_HP_M4_3),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30ff,
+		      "unknown HP", STAC_HP_M4_4),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3601,
+		      "unknown HP", STAC_HP_M4_4),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3607,
+		      "unknown HP", STAC_HP_M4_4),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f8,
+		      "unknown HP", STAC_HP_M4_5),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fe,
+		      "unknown HP", STAC_HP_M4_5),
 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
 				"unknown Dell", STAC_DELL_M4_1),
 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
@@ -2339,9 +2501,11 @@
  	if (!spec->pin_configs)
  		return;
 
-	for (i = 0; i < spec->num_pins; i++)
-		stac92xx_set_config_reg(codec, spec->pin_nids[i],
-					spec->pin_configs[i]);
+	for (i = 0; i < spec->num_pins; i++) {
+		if (spec->pin_configs[i])
+			stac92xx_set_config_reg(codec, spec->pin_nids[i],
+						spec->pin_configs[i]);
+	}
 }
 
 static int stac_save_pin_cfgs(struct hda_codec *codec, unsigned int *pins)
@@ -4583,6 +4747,50 @@
 	return 0;
 }
 
+#ifdef SND_HDA_NEEDS_RESUME  /* JPA reinserting old code, had been removed */
+static void stac92hd71xx_set_power_state(struct hda_codec *codec, int pwr)
+{
+	struct sigmatel_spec *spec = codec->spec;
+	int i;
+	snd_hda_codec_write_cache(codec, codec->afg, 0,
+		AC_VERB_SET_POWER_STATE, pwr);
+
+	msleep(1);
+	for (i = 0; i < spec->num_adcs; i++) {
+		snd_hda_codec_write_cache(codec,
+			spec->adc_nids[i], 0,
+			AC_VERB_SET_POWER_STATE, pwr);
+	}
+};
+
+static int stac92hd71xx_resume(struct hda_codec *codec)
+{
+	stac92hd71xx_set_power_state(codec, AC_PWRST_D0);
+	return stac92xx_resume(codec);
+}
+
+static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state)
+{
+	stac92hd71xx_set_power_state(codec, AC_PWRST_D3);
+	return stac92xx_suspend(codec, state);
+};
+
+#endif
+
+static struct hda_codec_ops stac92hd71bxx_patch_ops = {
+	.build_controls = stac92xx_build_controls,
+	.build_pcms = stac92xx_build_pcms,
+	.init = stac92xx_init,
+	.free = stac92xx_free,
+	.unsol_event = stac92xx_unsol_event,
+#ifdef SND_HDA_NEEDS_RESUME
+	.suspend = stac92hd71xx_suspend,
+	.resume = stac92hd71xx_resume,
+#endif
+};
+/* JPA end of old code */
+
+
 static struct hda_input_mux stac92hd73xx_dmux = {
 	.num_items = 4,
 	.items = {
@@ -4830,6 +5038,282 @@
 	return 0;
 }
 
+static int stac92hd71bxx_connected_ports(struct hda_codec *codec,
+					 hda_nid_t *nids, int num_nids)
+{
+	struct sigmatel_spec *spec = codec->spec;
+	int idx, num;
+	unsigned int def_conf;
+
+	for (num = 0; num < num_nids; num++) {
+		for (idx = 0; idx < spec->num_pins; idx++)
+			if (spec->pin_nids[idx] == nids[num])
+				break;
+		if (idx >= spec->num_pins)
+			break;
+		def_conf = get_defcfg_connect(spec->pin_configs[idx]);
+		if (def_conf == AC_JACK_PORT_NONE) 
+			break;
+	}
+	return num;
+}
+
+static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
+					  hda_nid_t dig0pin)
+{
+	struct sigmatel_spec *spec = codec->spec;
+	int idx;
+
+	for (idx = 0; idx < spec->num_pins; idx++)
+		if (spec->pin_nids[idx] == dig0pin)
+			break;
+	if ((idx + 2) >= spec->num_pins)
+		return 0;
+
+	/* dig1pin case */
+	if (get_defcfg_connect(spec->pin_configs[idx+1]) != AC_JACK_PORT_NONE)
+		return 2;
+
+	/* dig0pin + dig2pin case */
+	if (get_defcfg_connect(spec->pin_configs[idx+2]) != AC_JACK_PORT_NONE)
+		return 2;
+	if (get_defcfg_connect(spec->pin_configs[idx]) != AC_JACK_PORT_NONE)
+		return 1;
+	else
+		return 0;
+}
+
+static struct hda_input_mux stac92hd71b5_dmux = {
+	.num_items = 3,
+	.items = {
+		{ "Analog Inputs", 0x00 },
+		{ "Digital Mic 1", 0x02 },
+		{ "Digital Mic 2", 0x03 },
+	}
+};
+
+static int patch_stac92hd71b5(struct hda_codec *codec)
+{
+	struct sigmatel_spec *spec;
+	int err = 0;
+
+	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
+	if (spec == NULL)
+		return -ENOMEM;
+
+	codec->spec = spec;
+	codec->patch_ops = stac92xx_patch_ops;
+	spec->num_pins = ARRAY_SIZE(stac92hd71b5_pin_nids);
+	spec->pin_nids = stac92hd71b5_pin_nids;
+
+	memcpy(&spec->private_dimux, &stac92hd71b5_dmux,
+			sizeof(stac92hd71b5_dmux));
+	spec->board_config = snd_hda_check_board_config(codec,
+							STAC_92HD71B5_MODELS,
+							stac92hd71b5_models,
+							stac92hd71b5_cfg_tbl);
+again:
+	if (spec->board_config < 0) {
+		snd_printdd(KERN_INFO "hda_codec: Unknown model for"
+			" STAC92HD71B5, using BIOS defaults\n");
+		err = stac92xx_save_bios_config_regs(codec);
+		if (err < 0) {
+			stac92xx_free(codec);
+			return err;
+		}
+		spec->pin_configs = spec->bios_pin_configs;
+	} else {
+		spec->pin_configs = stac92hd71b5_brd_tbl[spec->board_config];
+		stac92xx_set_config_regs(codec);
+	}
+
+	if (spec->board_config > STAC_92HD71B5_REF) {
+		/* GPIO0 = EAPD */
+		spec->gpio_mask = 0x01;
+		spec->gpio_dir = 0x01;
+		spec->gpio_data = 0x01;
+		spec->eapd_mask = 0x01; /* needed? */
+		spec->eapd_switch = 1;  /* needed? */
+	}
+
+	spec->mixer = stac92hd71bxx_mixer;
+	spec->init = stac92hd71bxx_core_init;
+	codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
+
+	spec->num_pwrs = 0;
+	spec->powerdown_adcs = 1;
+	spec->digbeep_nid = 0x26;
+
+	spec->mux_nids = stac92hd71bxx_mux_nids;
+	spec->adc_nids = stac92hd71bxx_adc_nids;
+	spec->dmic_nids = stac92hd71bxx_dmic_nids;
+	spec->dmux_nids = stac92hd71bxx_dmux_nids;
+	spec->smux_nids = stac92hd71bxx_smux_nids;
+	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
+	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
+	spec->num_dmics = stac92hd71bxx_connected_ports(codec,
+				stac92hd71bxx_dmic_nids,
+				STAC92HD71BXX_NUM_DMICS);
+	if (spec->num_dmics) {
+		spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
+		spec->dinput_mux = &spec->private_dimux;
+		spec->private_dimux.num_items += spec->num_dmics -
+			(ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1);
+	}
+	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
+
+	spec->multiout.num_dacs = 1;
+	spec->multiout.hp_nid = 0x11;
+	spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
+
+	err = stac92xx_parse_auto_config(codec, 0x21, 0);
+	if (!err) {
+		if (spec->board_config < 0) {
+			printk(KERN_WARNING "hda_codec: No auto-config is "
+			       "available, default to model=ref\n");
+			spec->board_config = STAC_92HD71B5_REF;
+			goto again;
+		}
+		err = -EINVAL;
+	}
+
+	if (err < 0) {
+		stac92xx_free(codec);
+		return err;
+	}
+
+	return 0;
+}
+
+static struct hda_input_mux stac92hd75b_5port_dmux = {
+	.num_items = 3,
+	.items = {
+		{ "Analog Inputs", 0x00 },
+		{ "Mixer", 0x01 },
+		{ "Digital Mic 1", 0x02 },
+	}
+};
+
+static int patch_stac92hd75b_5port(struct hda_codec *codec)
+{
+	struct sigmatel_spec *spec;
+	int err = 0;
+
+	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
+	if (spec == NULL)
+		return -ENOMEM;
+
+	codec->spec = spec;
+	codec->patch_ops = stac92xx_patch_ops;
+	spec->num_pins = ARRAY_SIZE(stac92hd75b_5port_pin_nids);
+	spec->pin_nids = stac92hd75b_5port_pin_nids;
+
+	memcpy(&spec->private_dimux, &stac92hd75b_5port_dmux,
+			sizeof(stac92hd75b_5port_dmux));
+	spec->board_config = snd_hda_check_board_config(codec,
+							STAC_92HD75B_5PORT_MODELS,
+							stac92hd75b_5port_models,
+							stac92hd75b_5port_cfg_tbl);
+again:
+	if (spec->board_config < 0) {
+		snd_printdd(KERN_INFO "hda_codec: Unknown model for"
+			" STAC92HD75B_5PORT, using BIOS defaults\n");
+		err = stac92xx_save_bios_config_regs(codec);
+		if (err < 0) {
+			stac92xx_free(codec);
+			return err;
+		}
+		spec->pin_configs = spec->bios_pin_configs;
+	} else {
+		spec->pin_configs = stac92hd75b_5port_brd_tbl[spec->board_config];
+		if (!spec->pin_configs) {
+			err = stac92xx_save_bios_config_regs(codec);
+			if (err < 0) {
+				stac92xx_free(codec);
+				return err;
+			}
+			spec->pin_configs = spec->bios_pin_configs;
+		} else
+			stac92xx_set_config_regs(codec);
+	}
+
+	if (spec->board_config > STAC_92HD75B_5PORT_REF) {
+		/* GPIO0 = EAPD */
+		spec->gpio_mask = 0x01;
+		spec->gpio_dir = 0x01;
+		spec->gpio_data = 0x01;
+		spec->eapd_mask = 0x01; /* needed? */
+		spec->eapd_switch = 1;  /* needed? */
+	}
+
+	if (spec->board_config == STAC_HP_M4) {
+		/* Enable VREF power saving on GPIO1 detect */
+		snd_hda_codec_write_cache(codec, codec->afg, 0,
+			AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
+		snd_hda_codec_write_cache(codec, codec->afg, 0,
+				AC_VERB_SET_UNSOLICITED_ENABLE,
+				(AC_USRSP_EN | STAC_VREF_EVENT | 0x01));
+		spec->gpio_mask |= 0x02;
+		stac92xx_set_config_reg(codec, 0x0e, 0x01813040);
+					stac92xx_auto_set_pinctl(codec, 0x0e,
+					AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
+		spec->pin_configs[4] = 0x01813040;
+	}
+	if ((codec->revision_id & 0xf) == 0 ||
+			(codec->revision_id & 0xf) == 1) {
+#ifdef SND_HDA_NEEDS_RESUME
+		codec->patch_ops = stac92hd71bxx_patch_ops;
+#endif
+		spec->stream_delay = 40; /* 40 milliseconds */
+	}
+
+	spec->mixer = stac92hd71bxx_analog_mixer;
+	spec->dinput_mux = &spec->private_dimux;
+	spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];
+	codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
+
+	spec->num_pwrs = 0;
+	spec->powerdown_adcs = 1;
+	spec->digbeep_nid = 0x26;
+
+	spec->mux_nids = stac92hd71bxx_mux_nids;
+	spec->adc_nids = stac92hd71bxx_adc_nids;
+	spec->dmic_nids = stac92hd75b_5port_dmic_nids;
+	spec->dmux_nids = stac92hd71bxx_dmux_nids;
+	spec->smux_nids = stac92hd71bxx_smux_nids;
+	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
+	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
+	spec->num_dmics = stac92hd71bxx_connected_ports(codec,
+				stac92hd75b_5port_dmic_nids,
+				STAC92HD75B_5PORT_NUM_DMICS);
+	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
+	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
+
+	spec->multiout.num_dacs = 1;
+	spec->multiout.hp_nid = 0x11;
+	spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
+	spec->private_dimux.num_items += spec->num_dmics -
+		(ARRAY_SIZE(stac92hd75b_5port_dmic_nids) - 1);
+
+	err = stac92xx_parse_auto_config(codec, 0x21, 0);
+	if (!err) {
+		if (spec->board_config < 0) {
+			printk(KERN_WARNING "hda_codec: No auto-config is "
+			       "available, default to model=ref\n");
+			spec->board_config = STAC_92HD75B_5PORT_REF;
+			goto again;
+		}
+		err = -EINVAL;
+	}
+
+	if (err < 0) {
+		stac92xx_free(codec);
+		return err;
+	}
+
+	return 0;
+}
+
 static struct hda_input_mux stac92hd71bxx_dmux = {
 	.num_items = 4,
 	.items = {
@@ -4852,10 +5336,12 @@
 	codec->spec = spec;
 	codec->patch_ops = stac92xx_patch_ops;
 	spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids);
-	spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
 	spec->pin_nids = stac92hd71bxx_pin_nids;
-	memcpy(&spec->private_dimux, &stac92hd71bxx_dmux,
-			sizeof(stac92hd71bxx_dmux));
+
+	/* On 92HD75B3/92HD75B4 0x27 isn't a pin nid */
+	if (codec->vendor_id == 0x111d7603)
+		spec->num_pins--;
+
 	spec->board_config = snd_hda_check_board_config(codec,
 							STAC_92HD71BXX_MODELS,
 							stac92hd71bxx_models,
@@ -4875,112 +5361,73 @@
 
 	if (spec->board_config > STAC_92HD71BXX_REF) {
 		/* GPIO0 = EAPD */
+/* JPA start of patch from Herton Ronaldo, manually applied */
 		spec->gpio_mask = 0x01;
 		spec->gpio_dir = 0x01;
 		spec->gpio_data = 0x01;
+		spec->eapd_mask = 0x01; /* needed? */
+		spec->eapd_switch = 1;  /* needed? */
 	}
 
+	spec->mux_nids = stac92hd71bxx_mux_nids;
+	spec->adc_nids = stac92hd71bxx_adc_nids;
+	spec->dmic_nids = stac92hd71bxx_dmic_nids;
+	spec->dmux_nids = stac92hd71bxx_dmux_nids;
+	spec->smux_nids = stac92hd71bxx_smux_nids;
+	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
+	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
+	spec->num_dmics = stac92hd71bxx_connected_ports(codec,
+				stac92hd71bxx_dmic_nids,
+				STAC92HD71BXX_NUM_DMICS);
+	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
+
 	switch (codec->vendor_id) {
-	case 0x111d76b6: /* 4 Port without Analog Mixer */
-	case 0x111d76b7:
 	case 0x111d76b4: /* 6 Port without Analog Mixer */
 	case 0x111d76b5:
+		memcpy(&spec->private_dimux, &stac92hd71b5_dmux,
+			sizeof(stac92hd71b5_dmux));
+		if (spec->num_dmics) {
+			spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
+			spec->dinput_mux = &spec->private_dimux;
+		}
 		spec->mixer = stac92hd71bxx_mixer;
 		spec->init = stac92hd71bxx_core_init;
 		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
 		break;
-	case 0x111d7608: /* 5 Port with Analog Mixer */
-		switch (spec->board_config) {
-		case STAC_HP_M4:
-			/* Enable VREF power saving on GPIO1 detect */
-			err = stac_add_event(spec, codec->afg,
-					     STAC_VREF_EVENT, 0x02);
-			if (err < 0)
-				return err;
-			snd_hda_codec_write_cache(codec, codec->afg, 0,
-				AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
-			snd_hda_codec_write_cache(codec, codec->afg, 0,
-				AC_VERB_SET_UNSOLICITED_ENABLE,
-				AC_USRSP_EN | err);
-			spec->gpio_mask |= 0x02;
-			break;
-		}
-		if ((codec->revision_id & 0xf) == 0 ||
-		    (codec->revision_id & 0xf) == 1)
-			spec->stream_delay = 40; /* 40 milliseconds */
-
-		/* no output amps */
-		spec->num_pwrs = 0;
-		spec->mixer = stac92hd71bxx_analog_mixer;
-		spec->dinput_mux = &spec->private_dimux;
-
-		/* disable VSW */
-		spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];
-		stac_change_pin_config(codec, 0xf, 0x40f000f0);
-		break;
 	case 0x111d7603: /* 6 Port with Analog Mixer */
-		if ((codec->revision_id & 0xf) == 1)
+		if ((codec->revision_id & 0xf) == 1) {
+#ifdef SND_HDA_NEEDS_RESUME
+		codec->patch_ops = stac92hd71bxx_patch_ops; /* JPA guessed code */
+#endif
 			spec->stream_delay = 40; /* 40 milliseconds */
-
-		/* no output amps */
-		spec->num_pwrs = 0;
+		}
 		/* fallthru */
 	default:
+		memcpy(&spec->private_dimux, &stac92hd71bxx_dmux,
+			sizeof(stac92hd71bxx_dmux));
 		spec->dinput_mux = &spec->private_dimux;
+		spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
 		spec->mixer = stac92hd71bxx_analog_mixer;
 		spec->init = stac92hd71bxx_analog_core_init;
 		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
 	}
 
-	spec->aloopback_mask = 0x50;
-	spec->aloopback_shift = 0;
-
+	spec->num_pwrs = 0;
 	spec->powerdown_adcs = 1;
 	spec->digbeep_nid = 0x26;
-	spec->mux_nids = stac92hd71bxx_mux_nids;
-	spec->adc_nids = stac92hd71bxx_adc_nids;
-	spec->dmic_nids = stac92hd71bxx_dmic_nids;
-	spec->dmux_nids = stac92hd71bxx_dmux_nids;
-	spec->smux_nids = stac92hd71bxx_smux_nids;
-	spec->pwr_nids = stac92hd71bxx_pwr_nids;
 
-	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
-	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
-
-	switch (spec->board_config) {
-	case STAC_HP_M4:
-		/* enable internal microphone */
-		stac_change_pin_config(codec, 0x0e, 0x01813040);
-		stac92xx_auto_set_pinctl(codec, 0x0e,
-			AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
-		/* fallthru */
-	case STAC_DELL_M4_2:
-		spec->num_dmics = 0;
-		spec->num_smuxes = 0;
-		spec->num_dmuxes = 0;
-		break;
-	case STAC_DELL_M4_1:
-	case STAC_DELL_M4_3:
-		spec->num_dmics = 1;
-		spec->num_smuxes = 0;
-		spec->num_dmuxes = 0;
-		break;
-	default:
-		spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
-		spec->num_smuxes = ARRAY_SIZE(stac92hd71bxx_smux_nids);
-		spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
-	};
-
-	spec->multiout.dac_nids = spec->dac_nids;
-	if (spec->dinput_mux)
-		spec->private_dimux.num_items +=
+	spec->multiout.num_dacs = 1;
+	spec->multiout.hp_nid = 0x11;
+	spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
+	spec->private_dimux.num_items +=
 			spec->num_dmics -
 				(ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1);
 
-	err = stac92xx_parse_auto_config(codec, 0x21, 0x23);
+	err = stac92xx_parse_auto_config(codec, 0x21, 0);
 	if (!err) {
 		if (spec->board_config < 0) {
 			printk(KERN_WARNING "hda_codec: No auto-config is "
+/* JPA en dof patch from Herton Ronaldo, manually applied */
 			       "available, default to model=ref\n");
 			spec->board_config = STAC_92HD71BXX_REF;
 			goto again;
@@ -4996,7 +5443,7 @@
 	codec->proc_widget_hook = stac92hd7x_proc_hook;
 
 	return 0;
-};
+}
 
 static int patch_stac922x(struct hda_codec *codec)
 {
@@ -5616,10 +6063,10 @@
  	{ .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
  	{ .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
  	{ .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
-	{ .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
-	{ .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
-	{ .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
-	{ .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
+	{ .id = 0x111d7603, .name = "92HD75B3/4", .patch = patch_stac92hd71bxx },
+	{ .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx },
+	{ .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx },
+	{ .id = 0x111d7608, .name = "92HD75B1/2", .patch = patch_stac92hd75b_5port },
 	{ .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
 	{ .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
 	{ .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
@@ -5629,8 +6076,8 @@
 	{ .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
 	{ .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
 	{ .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
-	{ .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
-	{ .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
+	{ .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71b5 },
+	{ .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71b5 },
 	{} /* terminator */
 };
 
--- alsa-driver-1.0.19/alsa-kernel/pci/hda/hda_intel.c.old	2009-01-19 12:08:58.000000000 +0100
+++ alsa-driver-1.0.19/alsa-kernel/pci/hda/hda_intel.c	2009-02-03 09:40:11.000000000 +0100
@@ -2049,6 +2049,30 @@
 }
 
 /*
+ * white/black-listing for enable_msi
+ */
+static struct snd_pci_quirk msi_list[] __devinitdata = {
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, "HP dv7", 0x01),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc, "HP dv7", 0x01),
+	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fd, "HP dv7", 0x01),
+	{}
+};
+
+static void __devinit check_msi(struct azx *chip)
+{
+	const struct snd_pci_quirk *q;
+
+	q = snd_pci_quirk_lookup(chip->pci, msi_list);
+	if (q) {
+		printk(KERN_INFO
+		       "hda_intel: enable_msi set to 0x%x "
+		       "for device %04x:%04x\n",
+		       q->value, q->subvendor, q->subdevice);
+		enable_msi = q->value;
+	}
+}
+
+/*
  * white/black-listing for position_fix
  */
 static struct snd_pci_quirk position_fix_list[] __devinitdata = {
@@ -2151,6 +2175,7 @@
 	chip->pci = pci;
 	chip->irq = -1;
 	chip->driver_type = driver_type;
+	check_msi(chip);
 	chip->msi = enable_msi;
 	chip->dev_index = dev;
 	INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);

[-- Attachment #3: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

  parent reply	other threads:[~2009-02-03 13:49 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <4983FE7A.1040201@wanadoo.fr>
2009-01-31  7:52 ` [Fwd: HP DV4 1155 SE - No Sound through speakers...] Jean-Pierre André
2009-01-31  9:20   ` Takashi Iwai
2009-02-01 22:34   ` Tim Barnette
2009-02-02  6:45     ` Takashi Iwai
2009-02-02 15:17       ` Tim Barnette
2009-02-02 15:25         ` Takashi Iwai
2009-02-02 16:26           ` Tim Barnette
2009-02-02 16:28             ` Takashi Iwai
2009-02-02 17:01               ` Tim Barnette
2009-02-02 17:10                 ` Takashi Iwai
2009-02-13 19:16           ` Tim Barnette
2009-02-13 19:22             ` Tim Barnette
2009-02-14 10:24               ` Takashi Iwai
2009-02-14 19:13                 ` Herton Ronaldo Krzesinski
2009-02-16 10:48                   ` Takashi Iwai
2009-02-16 13:21                     ` Takashi Iwai
2009-02-17 19:51                       ` Tim Barnette
2009-02-18 13:16                         ` Herton Ronaldo Krzesinski
2009-02-24 18:08                           ` Tim Barnette
2009-02-02 18:20   ` Herton Ronaldo Krzesinski
2009-02-02 18:52     ` Takashi Iwai
2009-02-02 19:19     ` Tim Barnette
2009-02-02 19:48       ` Herton Ronaldo Krzesinski
2009-02-03 13:49     ` Jean-Pierre André [this message]
2009-02-04 17:01       ` Jean-Pierre André
2009-02-04 17:09         ` Takashi Iwai
2009-02-04 17:37           ` Jean-Pierre André
2009-02-04 17:40           ` Herton Ronaldo Krzesinski
2009-02-04 22:42             ` Takashi Iwai
2009-02-05  2:46               ` Tim Barnette
2009-02-05  7:06                 ` Takashi Iwai
2009-02-05  7:04               ` Takashi Iwai
2009-02-04 17:49         ` Herton Ronaldo Krzesinski
     [not found] <mailman.2709.1234557113.1965.alsa-devel@alsa-project.org>
2009-02-16  5:25 ` [Fwd: HP DV4 1155 SE - No Sound through, speakers...] Guy Stalnaker
2009-02-16 10:47   ` Takashi Iwai
2009-02-18  4:10     ` Guy Stalnaker

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=49884B73.7050906@wanadoo.fr \
    --to=jean-pierre.andre@wanadoo.fr \
    --cc=alsa-devel@alsa-project.org \
    --cc=herton@mandriva.com.br \
    --cc=tim.barnette@gmail.com \
    --cc=tiwai@suse.de \
    /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