From miguel@anjos.strangled.net  Sun Oct 28 11:47:57 2007
Return-Path: <miguel@anjos.strangled.net>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 89DC416A417
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 28 Oct 2007 11:47:57 +0000 (UTC)
	(envelope-from miguel@anjos.strangled.net)
Received: from mailrly06.isp.novis.pt (mailrly06.isp.novis.pt [195.23.133.216])
	by mx1.freebsd.org (Postfix) with ESMTP id 483CF13C4A7
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 28 Oct 2007 11:47:56 +0000 (UTC)
	(envelope-from miguel@anjos.strangled.net)
Received: (qmail 15980 invoked from network); 28 Oct 2007 11:21:14 -0000
Received: from unknown (HELO mailfrt01.isp.novis.pt) ([195.23.133.193])
          (envelope-sender <miguel@anjos.strangled.net>)
          by mailrly06.isp.novis.pt with compressed SMTP; 28 Oct 2007 11:21:14 -0000
Received: (qmail 29806 invoked from network); 28 Oct 2007 11:21:13 -0000
Received: from unknown (HELO satan.anjos.strangled.net) ([89.180.34.12])
          (envelope-sender <miguel@anjos.strangled.net>)
          by mailfrt01.isp.novis.pt with SMTP; 28 Oct 2007 11:21:13 -0000
Received: from satan.anjos.strangled.net (localhost [127.0.0.1])
	by satan.anjos.strangled.net (8.14.1/8.14.1) with ESMTP id l9SBLAAA002324;
	Sun, 28 Oct 2007 11:21:11 GMT
	(envelope-from miguel@satan.anjos.strangled.net)
Received: (from miguel@localhost)
	by satan.anjos.strangled.net (8.14.1/8.14.1/Submit) id l9SBLArJ002323;
	Sun, 28 Oct 2007 11:21:10 GMT
	(envelope-from miguel)
Message-Id: <200710281121.l9SBLArJ002323@satan.anjos.strangled.net>
Date: Sun, 28 Oct 2007 11:21:10 GMT
From: Miguel Lopes Santos Ramos <miguel@anjos.strangled.net>
Reply-To: Miguel Lopes Santos Ramos <miguel@anjos.strangled.net>
To: FreeBSD-gnats-submit@freebsd.org
Cc: miguel@anjos.strangled.net
Subject: Audio routing problem NVIDIA MCP51 HDA
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         117599
>Category:       kern
>Synopsis:       [snd_hda] Audio routing problem NVIDIA MCP51 HDA
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-multimedia
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Oct 28 11:50:05 UTC 2007
>Closed-Date:    Wed Jan 07 17:13:10 UTC 2009
>Last-Modified:  Wed Jan 07 17:13:10 UTC 2009
>Originator:     Miguel Lopes Santos Ramos
>Release:        FreeBSD 6.3-PRERELEASE i386
>Organization:
>Environment:
System: FreeBSD satan.anjos.strangled.net 6.3-PRERELEASE FreeBSD 6.3-PRERELEASE #2: Sat Oct 27 23:45:33 WEST 2007 root@satan.anjos.strangled.net:/usr/obj/usr/src/sys/SATAN i386

AMD Athlon64 X2 4400
ASUS M2NPV-VM motherboard
NVIDIA MCP51 HDA

Mixer vol      is currently set to  75:75
Mixer pcm      is currently set to  75:75
Mixer speaker  is currently set to  75:75
Mixer mic      is currently set to   0:0
Mixer cd       is currently set to  75:75
Mixer rec      is currently set to   0:0
Recording source: mic
 devices: vol, pcm, speaker, mic, cd, rec
 rec devices: vol, mic, cd

pcm0: <NVidia MCP51 High Definition Audio Controller> mem 0xfe024000-0xfe027fff irq 22 at device 16.1 on pci0
pcm0: DMA Coherency: Uncacheable / vendor=0x10de
pcm0: Reserved 0x4000 bytes for rid 0x10 type 3 at 0xfe024000
ioapic0: Assigning PCI IRQ 22 to local APIC 1
ioapic0: routing intpin 22 (PCI IRQ 22) to vector 63
pcm0: [MPSAFE]
pcm0: hdac_dma_alloc: size=1024 -> roundsz=1024
pcm0: hdac_dma_alloc: size=2048 -> roundsz=2048
pcm0: HDA_DEBUG: HDA Config: on=0x00000000 off=0x00000000
pcm0: HDA_DEBUG: Starting CORB Engine...
pcm0: HDA_DEBUG: Starting RIRB Engine...
pcm0: HDA_DEBUG: Enabling controller interrupt...
pcm0: HDA_DEBUG: Scanning HDA codecs...
pcm0: HDA_DEBUG: Probing codec: 0
pcm0: HDA_DEBUG: 	startnode=1 endnode=2
pcm0: HDA_DEBUG: 	Found AFG nid=1 [startnode=1 endnode=2]
pcm0: HDA_DEBUG: Parsing AFG nid=1 cad=0
pcm0:        Vendor: 0x000011d4
pcm0:        Device: 0x00001986
pcm0:      Revision: 0x00000005
pcm0:      Stepping: 0x00000000
pcm0: PCI Subvendor: 0x81cb1043
pcm0:         Nodes: start=2 endnode=44 total=42
pcm0:     CORB size: 256
pcm0:     RIRB size: 256
pcm0:       Streams: ISS=4 OSS=4 BSS=0
pcm0:          GPIO: 0x00000100
pcm0:                NumGPIO=0 NumGPO=1 NumGPI=0 GPIWake=0 GPIUnsol=0
pcm0: hdac_widget_connection_parse: GHOST: nid=2 j=0 entnum=4 index=0 res=0x00000601
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=2 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=6 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=7 entries=8 found=8
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=8 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=9 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=10 entries=3 found=3
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=11 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=12 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=13 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=14 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=15 entries=8 found=8
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=16 entries=3 found=3
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=17 entries=2 found=2
pcm0: hdac_widget_connection_parse: nid=18 WARNING: zero cnid entnum=4 j=2 index=0 entries=8 found=2 res=0x21002211
pcm0: hdac_widget_connection_parse: GHOST: nid=18 j=2 entnum=4 index=0 res=0x21002211
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=18 entries=8 found=8
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=19 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=20 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=21 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=22 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=23 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=24 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=26 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=27 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=28 entries=1 found=1
pcm0: HDA_DEBUG: Pin config nid=28 0x01013012 -> 0x01813012
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=29 entries=1 found=1
pcm0: HDA_DEBUG: Pin config nid=29 0x01019015 -> 0x01a19015
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=30 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=37 entries=1 found=1
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=38 entries=8 found=8
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=39 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=40 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=41 entries=2 found=2
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=42 entries=3 found=3
pcm0: HDA_DEBUG: hdac_widget_connection_parse: nid=43 entries=1 found=1
pcm0: HDA_DEBUG: Parsing Ctls...
pcm0: HDA_DEBUG: Parsing vendor patch...
pcm0: HDA_DEBUG: Building AFG tree...
pcm0: HDA_DEBUG: HWiP: HDA Widget Parser - Revision 1
pcm0: HDA_DEBUG: HWiP: Found 2 DAC path using HDA_PARSE_MIXER strategy.
pcm0: HDA_DEBUG: AFG commit...
pcm0: HDA_DEBUG: Ctls commit...
pcm0: [ 2] Ctl nid=4 DISABLED
pcm0: [ 3] Ctl nid=5 DISABLED
pcm0: [ 4] Ctl nid=9 Bind to NONE
pcm0: [ 5] Ctl nid=9 childnid=4 DISABLED
pcm0: [ 6] Ctl nid=9 childnid=5 DISABLED
pcm0: [ 9] Ctl nid=19 Bind to NONE
pcm0: [10] Ctl nid=20 Bind to NONE
pcm0: [12] Ctl nid=22 Bind to NONE
pcm0: [13] Ctl nid=23 Bind to NONE
pcm0: [15] Ctl nid=26 Bind to NONE
pcm0: [16] Ctl nid=27 Bind to NONE
pcm0: [17] Ctl nid=28 Bind to NONE
pcm0: [18] Ctl nid=29 Bind to NONE
pcm0: [19] Ctl nid=30 DISABLED
pcm0: HDA_DEBUG: PCMDIR_PLAY setup...
pcm0: HDA_DEBUG: PCMDIR_REC setup...
pcm0: HDA_DEBUG: OSS mixer initialization...
pcm0: Mixer "vol":
pcm0: Mixer "pcm":
pcm0: Mixer "speaker":
pcm0: Mixer "mic":
pcm0: Mixer "cd":
pcm0: Mixer "rec":
pcm0: HDA_DEBUG: Registering PCM channels...
pcm0: hdac_dma_alloc: size=4096 -> roundsz=4096
pcm0: sndbuf_setmap 7b3ba000, 4000; 0xeb95d000 -> 7b3ba000
pcm0: hdac_dma_alloc: size=4096 -> roundsz=4096
pcm0: sndbuf_setmap 7b3b6000, 4000; 0xeb961000 -> 7b3b6000
pcm0: <HDA Codec: Analog Devices AD1986A>
pcm0: <HDA Codec ID: 0x11d41986>
pcm0: <HDA Driver Revision: 20070710_0047>
pcm0: 
pcm0: HDA config/quirks: forcestereo ivref50 ivref80 ivref100 ivref
pcm0: 
pcm0: +-------------------+
pcm0: | DUMPING HDA NODES |
pcm0: +-------------------+
pcm0: 
pcm0: Default Parameter
pcm0: -----------------
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x000e007f
pcm0:        PCM size: 16 20 24
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:          IN amp: 0x80000000
pcm0:         OUT amp: 0x80051f1f
pcm0: 
pcm0:             nid: 2 [DIGITAL] [DISABLED]
pcm0:            name: audio output
pcm0:      widget_cap: 0x00030311
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Stream cap: 0x00000005
pcm0:          Format: AC3 PCM
pcm0:         PCM cap: 0x00020060
pcm0:        PCM size: 16
pcm0:        PCM rate: 44 48
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=1 [GHOST!] [UNKNOWN]
pcm0:           |
pcm0:           + <- nid=6 [audio input]
pcm0: 
pcm0:             nid: 3 [ANALOG]
pcm0:            name: audio output
pcm0:      widget_cap: 0x0000044d
pcm0:     Parse flags: 0x00000001
pcm0:       Ctl flags: 0x00000011
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x000e007f
pcm0:        PCM size: 16 20 24
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 4 [ANALOG] [DISABLED]
pcm0:            name: audio output
pcm0:      widget_cap: 0x0000040d
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x000e007f
pcm0:        PCM size: 16 20 24
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 5 [ANALOG] [DISABLED]
pcm0:            name: audio output
pcm0:      widget_cap: 0x0000040d
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x000e007f
pcm0:        PCM size: 16 20 24
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 6 [ANALOG]
pcm0:            name: audio input
pcm0:      widget_cap: 0x00100511
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000800
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x0006007f
pcm0:        PCM size: 16 20
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=18 [audio selector]
pcm0: 
pcm0:             nid: 7 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200101
pcm0:     Parse flags: 0x00000003
pcm0:       Ctl flags: 0x000001b1
pcm0:     connections: 8
pcm0:           |
pcm0:           + <- nid=3 [audio output]
pcm0:           |
pcm0:           + <- nid=9 [audio mixer]
pcm0:           |
pcm0:           + <- nid=19 [audio selector]
pcm0:           |
pcm0:           + <- nid=20 [audio selector]
pcm0:           |
pcm0:           + <- nid=21 [audio selector]
pcm0:           |
pcm0:           + <- nid=22 [audio selector]
pcm0:           |
pcm0:           + <- nid=23 [audio selector]
pcm0:           |
pcm0:           + <- nid=24 [audio selector]
pcm0: 
pcm0:             nid: 8 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200100
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=7 [audio mixer]
pcm0: 
pcm0:             nid: 9 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x0020010e
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Output amp: 0x80000000
pcm0:                  mute=1 step=0 size=0 offset=0
pcm0:       Input amp: 0x80000000
pcm0:                  mute=1 step=0 size=0 offset=0
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=4 [audio output] [DISABLED]
pcm0:           |
pcm0:           + <- nid=5 [audio output] [DISABLED]
pcm0: 
pcm0:             nid: 10 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300101
pcm0:     Parse flags: 0x00000001
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 3
pcm0:           |
pcm0:           + <- nid=7 [audio mixer] (selected)
pcm0:           |
pcm0:           + <- nid=4 [audio output] [DISABLED]
pcm0:           |
pcm0:           + <- nid=5 [audio output] [DISABLED]
pcm0: 
pcm0:             nid: 11 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300101
pcm0:     Parse flags: 0x00000001
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=7 [audio mixer] (selected)
pcm0:           |
pcm0:           + <- nid=4 [audio output] [DISABLED]
pcm0: 
pcm0:             nid: 12 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300101
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=4 [audio output] [DISABLED] (selected)
pcm0:           |
pcm0:           + <- nid=7 [audio mixer]
pcm0: 
pcm0:             nid: 13 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300101
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=5 [audio output] [DISABLED] (selected)
pcm0:           |
pcm0:           + <- nid=8 [audio mixer]
pcm0: 
pcm0:             nid: 14 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300100
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=8 [audio mixer] (selected)
pcm0:           |
pcm0:           + <- nid=17 [audio selector]
pcm0: 
pcm0:             nid: 15 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000081
pcm0:      Output amp: 0x00270300
pcm0:                  mute=0 step=3 size=39 offset=0
pcm0:     connections: 8
pcm0:           |
pcm0:           + <- nid=31 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=32 [pin: line in (jack)]
pcm0:           |
pcm0:           + <- nid=29 [pin: Mic in (jack)] (selected)
pcm0:           |
pcm0:           + <- nid=29 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=39 [audio mixer]
pcm0:           |
pcm0:           + <- nid=40 [audio mixer]
pcm0:           |
pcm0:           + <- nid=41 [audio mixer]
pcm0:           |
pcm0:           + <- nid=42 [audio mixer]
pcm0: 
pcm0:             nid: 16 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300101
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 3
pcm0:           |
pcm0:           + <- nid=32 [pin: line in (jack)]
pcm0:           |
pcm0:           + <- nid=28 [pin: line in (jack)] (selected)
pcm0:           |
pcm0:           + <- nid=31 [pin: Mic in (jack)]
pcm0: 
pcm0:             nid: 17 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x00300941
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000081
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=15 [audio selector] (selected)
pcm0:           |
pcm0:           + <- nid=43 [audio mixer]
pcm0: 
pcm0:             nid: 18 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000006
pcm0:       Ctl flags: 0x00000800
pcm0:      Output amp: 0x80050f00
pcm0:                  mute=1 step=15 size=5 offset=0
pcm0:     connections: 8
pcm0:           |
pcm0:           + <- nid=17 [audio selector] (selected)
pcm0:           |
pcm0:           + <- nid=34 [pin: CD (fixed)]
pcm0:           |
pcm0:           + <- nid=0 [GHOST!] [UNKNOWN]
pcm0:           |
pcm0:           + <- nid=33 [pin: AUX (none)] [DISABLED]
pcm0:           |
pcm0:           + <- nid=16 [audio selector]
pcm0:           |
pcm0:           + <- nid=7 [audio mixer]
pcm0:           |
pcm0:           + <- nid=8 [audio mixer]
pcm0:           |
pcm0:           + <- nid=35 [pin: telephony (none)] [DISABLED]
pcm0: 
pcm0:             nid: 19 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000081
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=17 [audio selector]
pcm0: 
pcm0:             nid: 20 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010c
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=35 [pin: telephony (none)] [DISABLED]
pcm0: 
pcm0:             nid: 21 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000101
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=34 [pin: CD (fixed)]
pcm0: 
pcm0:             nid: 22 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=33 [pin: AUX (none)] [DISABLED]
pcm0: 
pcm0:             nid: 23 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010d
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:      Output amp: 0x80051f17
pcm0:                  mute=1 step=31 size=5 offset=23
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=16 [audio selector]
pcm0: 
pcm0:             nid: 24 [ANALOG]
pcm0:            name: audio selector
pcm0:      widget_cap: 0x0030010c
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000021
pcm0:      Output amp: 0x800b0f0f
pcm0:                  mute=1 step=15 size=11 offset=15
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=25 [beep widget] (selected)
pcm0:           |
pcm0:           + <- nid=36 [pin: other (fixed)]
pcm0: 
pcm0:             nid: 25 [ANALOG]
pcm0:            name: beep widget
pcm0:      widget_cap: 0x00700000
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000021
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 26 [ANALOG]
pcm0:            name: pin: headphones out (jack)
pcm0:      widget_cap: 0x00400185
pcm0:     Parse flags: 0x00000001
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x0000001f
pcm0:                  ISC TRQD HP OUT : UNSOL
pcm0:      Pin config: 0x02214021
pcm0:     Pin control: 0x000000c0 HP OUT
pcm0:      Output amp: 0x80051f1f
pcm0:                  mute=1 step=31 size=5 offset=31
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=10 [audio selector]
pcm0: 
pcm0:             nid: 27 [ANALOG]
pcm0:            name: pin: line out (jack)
pcm0:      widget_cap: 0x00400185
pcm0:     Parse flags: 0x00000001
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x0001001f
pcm0:                  ISC TRQD HP OUT EAPD : UNSOL
pcm0:      Pin config: 0x01014011
pcm0:     Pin control: 0x00000040 OUT
pcm0:            EAPD: 0x00000002
pcm0:      Output amp: 0x80051f1f
pcm0:                  mute=1 step=31 size=5 offset=31
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=11 [audio selector]
pcm0: 
pcm0:             nid: 28 [ANALOG]
pcm0:            name: pin: line in (jack)
pcm0:      widget_cap: 0x00400185
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000037
pcm0:                  ISC TRQD OUT IN : UNSOL
pcm0:      Pin config: 0x01813012
pcm0:     Pin control: 0x00000020 IN
pcm0:      Output amp: 0x80051f1f
pcm0:                  mute=1 step=31 size=5 offset=31
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=12 [audio selector]
pcm0: 
pcm0:             nid: 29 [ANALOG]
pcm0:            name: pin: Mic in (jack)
pcm0:      widget_cap: 0x00400985
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000081
pcm0:         Pin cap: 0x00001737
pcm0:                  ISC TRQD OUT IN VREF[ 50 80 GROUND HIZ ] : UNSOL
pcm0:      Pin config: 0x01a19015
pcm0:     Pin control: 0x00000024 IN
pcm0:      Output amp: 0x80051f1f
pcm0:                  mute=1 step=31 size=5 offset=31
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=13 [audio selector]
pcm0: 
pcm0:             nid: 30 [ANALOG] [DISABLED]
pcm0:            name: pin: speaker (none)
pcm0:      widget_cap: 0x00400104
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000010
pcm0:                  OUT
pcm0:      Pin config: 0x501700f0
pcm0:     Pin control: 0x00000040 OUT
pcm0:      Output amp: 0x80051f1f
pcm0:                  mute=1 step=31 size=5 offset=31
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=14 [audio selector]
pcm0: 
pcm0:             nid: 31 [ANALOG]
pcm0:            name: pin: Mic in (jack)
pcm0:      widget_cap: 0x00400081
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00001727
pcm0:                  ISC TRQD IN VREF[ 50 80 GROUND HIZ ] : UNSOL
pcm0:      Pin config: 0x02a190f0
pcm0:     Pin control: 0x00000024 IN
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 32 [ANALOG]
pcm0:            name: pin: line in (jack)
pcm0:      widget_cap: 0x00400081
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00001727
pcm0:                  ISC TRQD IN VREF[ 50 80 GROUND HIZ ] : UNSOL
pcm0:      Pin config: 0x018130f0
pcm0:     Pin control: 0x00000024 IN
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 33 [ANALOG] [DISABLED]
pcm0:            name: pin: AUX (none)
pcm0:      widget_cap: 0x00400081
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000027
pcm0:                  ISC TRQD IN : UNSOL
pcm0:      Pin config: 0x509700f0
pcm0:     Pin control: 0x00000020 IN
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 34 [ANALOG]
pcm0:            name: pin: CD (fixed)
pcm0:      widget_cap: 0x00400001
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000101
pcm0:         Pin cap: 0x00000020
pcm0:                  IN
pcm0:      Pin config: 0x993310f0
pcm0:     Pin control: 0x00000020 IN
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 35 [ANALOG] [DISABLED]
pcm0:            name: pin: telephony (none)
pcm0:      widget_cap: 0x00400000
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000020
pcm0:                  IN
pcm0:      Pin config: 0x50b700f0
pcm0:     Pin control: 0x00000020 IN
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 36 [ANALOG]
pcm0:            name: pin: other (fixed)
pcm0:      widget_cap: 0x00400000
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000020
pcm0:                  IN
pcm0:      Pin config: 0x90f700f0
pcm0:     Pin control: 0x00000000
pcm0:     connections: 0
pcm0: 
pcm0:             nid: 37 [DIGITAL] [DISABLED]
pcm0:            name: pin: SPDIF out (jack)
pcm0:      widget_cap: 0x00400301
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:         Pin cap: 0x00000010
pcm0:                  OUT
pcm0:      Pin config: 0x014510f0
pcm0:     Pin control: 0x00000040 OUT
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=2 [audio output] [DISABLED]
pcm0: 
pcm0:             nid: 38 [ANALOG]
pcm0:            name: power widget
pcm0:      widget_cap: 0x00500500
pcm0:     Parse flags: 0x00000000
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 8
pcm0:           |
pcm0:           + <- nid=7 [audio mixer] (selected)
pcm0:           |
pcm0:           + <- nid=8 [audio mixer]
pcm0:           |
pcm0:           + <- nid=19 [audio selector]
pcm0:           |
pcm0:           + <- nid=20 [audio selector]
pcm0:           |
pcm0:           + <- nid=21 [audio selector]
pcm0:           |
pcm0:           + <- nid=22 [audio selector]
pcm0:           |
pcm0:           + <- nid=23 [audio selector]
pcm0:           |
pcm0:           + <- nid=24 [audio selector]
pcm0: 
pcm0:             nid: 39 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200101
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=31 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=29 [pin: Mic in (jack)]
pcm0: 
pcm0:             nid: 40 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200101
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=31 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=32 [pin: line in (jack)]
pcm0: 
pcm0:             nid: 41 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200101
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 2
pcm0:           |
pcm0:           + <- nid=29 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=32 [pin: line in (jack)]
pcm0: 
pcm0:             nid: 42 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200101
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 3
pcm0:           |
pcm0:           + <- nid=31 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=29 [pin: Mic in (jack)]
pcm0:           |
pcm0:           + <- nid=32 [pin: line in (jack)]
pcm0: 
pcm0:             nid: 43 [ANALOG]
pcm0:            name: audio mixer
pcm0:      widget_cap: 0x00200100
pcm0:     Parse flags: 0x00000002
pcm0:       Ctl flags: 0x00000000
pcm0:     connections: 1
pcm0:           |
pcm0:           + <- nid=15 [audio selector]
pcm0: 
pcm0: +------------------------+
pcm0: | DUMPING HDA AMPLIFIERS |
pcm0: +------------------------+
pcm0: 
pcm0:   1: nid=3 dir=0x1 index=0 ossmask=0x00000011 ossdev=4
pcm0:   2: nid=4 dir=0x1 index=0 ossmask=0x00000000 ossdev=0 [DISABLED]
pcm0:   3: nid=5 dir=0x1 index=0 ossmask=0x00000000 ossdev=0 [DISABLED]
pcm0:   4: nid=9 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:   5: nid=9 cnid=4 dir=0x2 index=0 ossmask=0x00000000 ossdev=0 [DISABLED]
pcm0:   6: nid=9 cnid=5 dir=0x2 index=1 ossmask=0x00000000 ossdev=0 [DISABLED]
pcm0:   7: nid=15 dir=0x1 index=0 ossmask=0x00000081 ossdev=7
pcm0:   8: nid=18 dir=0x1 index=0 ossmask=0x00000800 ossdev=0
pcm0:   9: nid=19 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  10: nid=20 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  11: nid=21 dir=0x1 index=0 ossmask=0x00000101 ossdev=8
pcm0:  12: nid=22 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  13: nid=23 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  14: nid=24 dir=0x1 index=0 ossmask=0x00000021 ossdev=5
pcm0:  15: nid=26 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  16: nid=27 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  17: nid=28 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  18: nid=29 dir=0x1 index=0 ossmask=0x00000000 ossdev=0
pcm0:  19: nid=30 dir=0x1 index=0 ossmask=0x00000000 ossdev=0 [DISABLED]
pcm0: 
pcm0: +-----------------------------------+
pcm0: | DUMPING HDA AUDIO/VOLUME CONTROLS |
pcm0: +-----------------------------------+
pcm0: 
pcm0: Master Volume (OSS: vol)
pcm0:    |
pcm0:    +-  nid:  3 index:  0           mute: 1 step:  31 size:   5 off:  23 dir=0x1 ossmask=0x00000011
pcm0:    |
pcm0:    +-  nid: 15 index:  0           mute: 0 step:   3 size:  39 off:   0 dir=0x1 ossmask=0x00000081
pcm0:    |
pcm0:    +-  nid: 21 index:  0           mute: 1 step:  31 size:   5 off:  23 dir=0x1 ossmask=0x00000101
pcm0:    |
pcm0:    +-  nid: 24 index:  0           mute: 1 step:  15 size:  11 off:  15 dir=0x1 ossmask=0x00000021
pcm0: 
pcm0: PCM Volume (OSS: pcm)
pcm0:    |
pcm0:    +-  nid:  3 index:  0           mute: 1 step:  31 size:   5 off:  23 dir=0x1 ossmask=0x00000011
pcm0: 
pcm0: CD Volume (OSS: cd)
pcm0:    |
pcm0:    +-  nid: 21 index:  0           mute: 1 step:  31 size:   5 off:  23 dir=0x1 ossmask=0x00000101
pcm0: 
pcm0: Microphone Volume (OSS: mic)
pcm0:    |
pcm0:    +-  nid: 15 index:  0           mute: 0 step:   3 size:  39 off:   0 dir=0x1 ossmask=0x00000081
pcm0: 
pcm0: Recording Level (OSS: rec)
pcm0:    |
pcm0:    +-  nid: 18 index:  0           mute: 1 step:  15 size:   5 off:   0 dir=0x1 ossmask=0x00000800
pcm0: 
pcm0: Speaker/Beep (OSS: speaker)
pcm0:    |
pcm0:    +-  nid: 24 index:  0           mute: 1 step:  15 size:  11 off:  15 dir=0x1 ossmask=0x00000021
pcm0: 
pcm0: Playback path:
pcm0: 
pcm0:     nid=26 [pin: headphones out (jack)]
pcm0:       ^
pcm0:       |
pcm0:       +-----<------+
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=10 [audio selector]
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=7 [audio mixer]
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=3 [audio output]
pcm0: 
pcm0:     nid=27 [pin: line out (jack)]
pcm0:       ^
pcm0:       |
pcm0:       +-----<------+
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=11 [audio selector]
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=7 [audio mixer]
pcm0:                    ^
pcm0:                    |
pcm0:                  nid=3 [audio output]
pcm0: 
pcm0: Recording sources:
pcm0: 
pcm0:     nid=18 [audio selector]
pcm0:       |
pcm0:       + <- nid=17 [audio selector] [recsrc: vol, mic]
pcm0:       |
pcm0:       + <- nid=34 [pin: CD (fixed)] [recsrc: vol, cd]
pcm0:       |
pcm0:       + <- nid=16 [audio selector]
pcm0:       |
pcm0:       + <- nid=7 [audio mixer] [recsrc: vol, pcm, speaker, mic, cd]
pcm0:       |
pcm0:       + <- nid=8 [audio mixer]
pcm0: 
pcm0: +--------------------------------------+
pcm0: | DUMPING PCM Playback/Record Channels |
pcm0: +--------------------------------------+
pcm0: 
pcm0:    PCM Playback: 1
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x000e007f
pcm0:        PCM size: 16 20 24
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:             DAC: 3
pcm0: 
pcm0:      PCM Record: 1
pcm0:      Stream cap: 0x00000001
pcm0:          Format: PCM
pcm0:         PCM cap: 0x0006007f
pcm0:        PCM size: 16 20
pcm0:        PCM rate: 8 11 16 22 32 44 48
pcm0:             ADC: 6

>Description:

I only have the back panel plugs available. Line out and mic are OK but
the line in entrance is not working.

Looks like a routing problem. Looking at the verbose dmesg, it would
appear that nid 28 and 32 are the two line ins, and that 28 is selected.
Perhaps all that would be needed would be to have nid 32 selected.
Unfortunately, there seems to be no userland tweaking interface, through
sysctl or ioctl.

>How-To-Repeat:

Its systematic on this hardware.

>Fix:

	


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->ariff 
Responsible-Changed-By: remko 
Responsible-Changed-When: Fri Nov 16 11:05:58 UTC 2007 
Responsible-Changed-Why:  
Hi Ariff, can you have a look at this please? 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117599 
Responsible-Changed-From-To: ariff->freebsd-multimedia 
Responsible-Changed-By: ariff 
Responsible-Changed-When: Fri Nov 16 11:59:53 UTC 2007 
Responsible-Changed-Why:  
Reassign to multimedia@ . I'll look into this someday 
(not now, too busy). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117599 
State-Changed-From-To: open->patched 
State-Changed-By: mav 
State-Changed-When: Tue Oct 14 20:37:52 UTC 2008 
State-Changed-Why:  
New snd_hda driver committed to the -CURRENT should 
manadge this situation better. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117599 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/117599: commit references a PR
Date: Wed,  7 Jan 2009 15:29:06 +0000 (UTC)

 Author: mav
 Date: Wed Jan  7 15:28:47 2009
 New Revision: 186862
 URL: http://svn.freebsd.org/changeset/base/186862
 
 Log:
   Merge updated snd_hda driver version 20081226_0122 from CURRENT.
   
   This update gives:
    - multiple codec per HDA bus support;
    - multiple functional groups per codec support;
    - multiple audio devices per functional group support;
    - digital (SPDIF/HDMI) audio input/output support;
    - better UAA specification compliance with wide configureability;
    - headphones redirection controlled by UAA configuration instead of quirks;
    - improved codec parser, that gives working playback and recording with all
      of the long list of tested codecs and systems;
    - suspend/resume support;
    - part of multichannel audio support (requires OSS improvement to be used);
   
   Note, that due to added HDMI audio and logical audio devices support, updated
   driver often provides several PCM devices. In some cases it can make system
   default audio device no longer corresponding to the users's habbitual audio
   connectors. In such cases wanted device can be specified in audio application
   setup or defined globally via hw.snd.default_unit sysctl according to
   sound(4) man page.
   
   Additional information information about driver operation can be obtained
   from the updated man page and verbose boot messages.
   
   PR:		kern/119181, kern/120144, kern/117599, kern/117729,
   		kern/119671, kern/124645, kern/125822, kern/126217,
   		kern/127105
 
 Modified:
   stable/7/sys/dev/sound/pci/hda/hda_reg.h
   stable/7/sys/dev/sound/pci/hda/hdac.c
   stable/7/sys/dev/sound/pci/hda/hdac_private.h
 
 Modified: stable/7/sys/dev/sound/pci/hda/hda_reg.h
 ==============================================================================
 --- stable/7/sys/dev/sound/pci/hda/hda_reg.h	Wed Jan  7 14:00:44 2009	(r186861)
 +++ stable/7/sys/dev/sound/pci/hda/hda_reg.h	Wed Jan  7 15:28:47 2009	(r186862)
 @@ -180,13 +180,14 @@
      HDA_CMD_VERB_SET_CONV_FMT, (payload)))
  
  /* Digital Converter Control */
 -#define HDA_CMD_VERB_GET_DIGITAL_CONV_FMT		0xf0d
 +#define HDA_CMD_VERB_GET_DIGITAL_CONV_FMT1		0xf0d
 +#define HDA_CMD_VERB_GET_DIGITAL_CONV_FMT2		0xf0e
  #define HDA_CMD_VERB_SET_DIGITAL_CONV_FMT1		0x70d
  #define HDA_CMD_VERB_SET_DIGITAL_CONV_FMT2		0x70e
  
  #define HDA_CMD_GET_DIGITAL_CONV_FMT(cad, nid)				\
      (HDA_CMD_12BIT((cad), (nid),					\
 -    HDA_CMD_VERB_GET_DIGITAL_CONV_FMTT, 0x0))
 +    HDA_CMD_VERB_GET_DIGITAL_CONV_FMT1, 0x0))
  #define HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, nid, payload)		\
      (HDA_CMD_12BIT((cad), (nid),					\
      HDA_CMD_VERB_SET_DIGITAL_CONV_FMT1, (payload)))
 @@ -1034,7 +1035,7 @@
      HDA_PARAM_PIN_CAP_HEADPHONE_CAP_SHIFT)
  #define HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(param)			\
      (((param) & HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP_MASK) >>		\
 -    HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP_MASK)
 +    HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP_SHIFT)
  #define HDA_PARAM_PIN_CAP_TRIGGER_REQD(param)				\
      (((param) & HDA_PARAM_PIN_CAP_TRIGGER_REQD_MASK) >>			\
      HDA_PARAM_PIN_CAP_TRIGGER_REQD_SHIFT)
 @@ -1193,14 +1194,47 @@
      HDA_PARAM_VOLUME_KNOB_CAP_NUM_STEPS_SHIFT)
  
  
 -#define HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK		0x00000000f
 -#define HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK		0x0000000f0
 -#define HDA_CONFIG_DEFAULTCONF_MISC_MASK			0x000000f00
 -#define HDA_CONFIG_DEFAULTCONF_COLOR_MASK			0x00000f000
 -#define HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK		0x000f00000
 -#define HDA_CONFIG_DEFAULTCONF_DEVICE_MASK			0x000f00000
 -#define HDA_CONFIG_DEFAULTCONF_LOCATION_MASK		0x03f000000
 -#define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK		0x0c0000000
 +#define HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK		0x0000000f
 +#define HDA_CONFIG_DEFAULTCONF_SEQUENCE_SHIFT		0
 +#define HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK		0x000000f0
 +#define HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT	4
 +#define HDA_CONFIG_DEFAULTCONF_MISC_MASK		0x00000f00
 +#define HDA_CONFIG_DEFAULTCONF_MISC_SHIFT		8
 +#define HDA_CONFIG_DEFAULTCONF_COLOR_MASK		0x0000f000
 +#define HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT		12
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK	0x000f0000
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_SHIFT	16
 +#define HDA_CONFIG_DEFAULTCONF_DEVICE_MASK		0x00f00000
 +#define HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT		20
 +#define HDA_CONFIG_DEFAULTCONF_LOCATION_MASK		0x3f000000
 +#define HDA_CONFIG_DEFAULTCONF_LOCATION_SHIFT		24
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK	0xc0000000
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT	30
 +
 +#define HDA_CONFIG_DEFAULTCONF_SEQUENCE(conf)				\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK) >>			\
 +    HDA_CONFIG_DEFAULTCONF_SEQUENCE_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_ASSOCIATION(conf)			\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK) >>		\
 +    HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_MISC(conf)				\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_MISC_MASK) >>			\
 +    HDA_CONFIG_DEFAULTCONF_MISC_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_COLOR(conf)				\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_COLOR_MASK) >>			\
 +    HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE(conf)			\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK) >>		\
 +    HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_DEVICE(conf)				\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) >>			\
 +    HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_LOCATION(conf)				\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_LOCATION_MASK) >>			\
 +    HDA_CONFIG_DEFAULTCONF_LOCATION_SHIFT)
 +#define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY(conf)			\
 +    (((conf) & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) >>		\
 +    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT)
  
  #define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK		(0<<30)
  #define HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE		(1<<30)
 
 Modified: stable/7/sys/dev/sound/pci/hda/hdac.c
 ==============================================================================
 --- stable/7/sys/dev/sound/pci/hda/hdac.c	Wed Jan  7 14:00:44 2009	(r186861)
 +++ stable/7/sys/dev/sound/pci/hda/hdac.c	Wed Jan  7 15:28:47 2009	(r186862)
 @@ -1,6 +1,7 @@
  /*-
   * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
   * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
 + * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org>
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
 @@ -61,6 +62,7 @@
   *    *              Daniel Eischen <deischen@FreeBSD.org>              *
   *    *             Maxime Guillaud <bsd-ports@mguillaud.net>           *
   *    *              Ariff Abdullah <ariff@FreeBSD.org>                 *
 + *    *             Alexander Motin <mav@FreeBSD.org>                   *
   *    *                                                                 *
   *    *   ....and various people from freebsd-multimedia@FreeBSD.org    *
   *    *                                                                 *
 @@ -81,8 +83,7 @@
  
  #include "mixer_if.h"
  
 -#define HDA_DRV_TEST_REV	"20080420_0052"
 -#define HDA_WIDGET_PARSER_REV	1
 +#define HDA_DRV_TEST_REV	"20081226_0122"
  
  SND_DECLARE_FILE("$FreeBSD$");
  
 @@ -92,6 +93,12 @@ SND_DECLARE_FILE("$FreeBSD$");
  	}						\
  } while(0)
  
 +#define HDA_BOOTHVERBOSE(stmt)	do {			\
 +	if (snd_verbose > 3) {				\
 +		stmt					\
 +	}						\
 +} while(0)
 +
  #if 1
  #undef HDAC_INTR_EXTRA
  #define HDAC_INTR_EXTRA		1
 @@ -141,6 +148,8 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define HDA_INTEL_82801G	HDA_MODEL_CONSTRUCT(INTEL, 0x27d8)
  #define HDA_INTEL_82801H	HDA_MODEL_CONSTRUCT(INTEL, 0x284b)
  #define HDA_INTEL_82801I	HDA_MODEL_CONSTRUCT(INTEL, 0x293e)
 +#define HDA_INTEL_82801J	HDA_MODEL_CONSTRUCT(INTEL, 0x3a3e)
 +#define HDA_INTEL_SCH		HDA_MODEL_CONSTRUCT(INTEL, 0x811b)
  #define HDA_INTEL_ALL		HDA_MODEL_CONSTRUCT(INTEL, 0xffff)
  
  /* Nvidia */
 @@ -153,6 +162,16 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define HDA_NVIDIA_MCP65_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x044b)
  #define HDA_NVIDIA_MCP67_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x055c)
  #define HDA_NVIDIA_MCP67_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x055d)
 +#define HDA_NVIDIA_MCP78_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0774)
 +#define HDA_NVIDIA_MCP78_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0775)
 +#define HDA_NVIDIA_MCP78_3	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0776)
 +#define HDA_NVIDIA_MCP78_4	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0777)
 +#define HDA_NVIDIA_MCP73_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fc)
 +#define HDA_NVIDIA_MCP73_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fd)
 +#define HDA_NVIDIA_MCP79_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac0)
 +#define HDA_NVIDIA_MCP79_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac1)
 +#define HDA_NVIDIA_MCP79_3	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac2)
 +#define HDA_NVIDIA_MCP79_4	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac3)
  #define HDA_NVIDIA_ALL		HDA_MODEL_CONSTRUCT(NVIDIA, 0xffff)
  
  /* ATI */
 @@ -171,6 +190,11 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define HDA_SIS_966		HDA_MODEL_CONSTRUCT(SIS, 0x7502)
  #define HDA_SIS_ALL		HDA_MODEL_CONSTRUCT(SIS, 0xffff)
  
 +/* ULI */
 +#define ULI_VENDORID		0x10b9
 +#define HDA_ULI_M5461		HDA_MODEL_CONSTRUCT(ULI, 0x5461)
 +#define HDA_ULI_ALL		HDA_MODEL_CONSTRUCT(ULI, 0xffff)
 +
  /* OEM/subvendors */
  
  /* Intel */
 @@ -195,6 +219,7 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define DELL_VENDORID		0x1028
  #define DELL_D630_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01f9)
  #define DELL_D820_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01cc)
 +#define DELL_V1400_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x0227)
  #define DELL_V1500_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x0228)
  #define DELL_I1300_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01c9)
  #define DELL_XPSM1210_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01d7)
 @@ -213,6 +238,7 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define ACER_A4710_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x012f)
  #define ACER_A4715_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x0133)
  #define ACER_3681WXM_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x0110)
 +#define ACER_T6292_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x011b)
  #define ACER_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0xffff)
  
  /* Asus */
 @@ -260,6 +286,11 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define APPLE_VENDORID		0x106b
  #define APPLE_MB3_SUBVENDOR	HDA_MODEL_CONSTRUCT(APPLE, 0x00a1)
  
 +/* Sony */
 +#define SONY_VENDORID		0x104d
 +#define SONY_S5_SUBVENDOR	HDA_MODEL_CONSTRUCT(SONY, 0x81cc)
 +#define SONY_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(SONY, 0xffff)
 +
  /*
   * Apple Intel MacXXXX seems using Sigmatel codec/vendor id
   * instead of their own, which is beyond my comprehension
 @@ -308,6 +339,7 @@ SND_DECLARE_FILE("$FreeBSD$");
  
  
  /* Misc constants.. */
 +#define HDA_AMP_VOL_DEFAULT	(-1)
  #define HDA_AMP_MUTE_DEFAULT	(0xffffffff)
  #define HDA_AMP_MUTE_NONE	(0)
  #define HDA_AMP_MUTE_LEFT	(1 << 0)
 @@ -317,16 +349,10 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define HDA_AMP_LEFT_MUTED(v)	((v) & (HDA_AMP_MUTE_LEFT))
  #define HDA_AMP_RIGHT_MUTED(v)	(((v) & HDA_AMP_MUTE_RIGHT) >> 1)
  
 -#define HDA_DAC_PATH	(1 << 0)
 -#define HDA_ADC_PATH	(1 << 1)
 -#define HDA_ADC_RECSEL	(1 << 2)
 -
 -#define HDA_DAC_LOCKED	(1 << 3)
 -#define HDA_ADC_LOCKED	(1 << 4)
 -
 -#define HDA_CTL_OUT	(1 << 0)
 -#define HDA_CTL_IN	(1 << 1)
 -#define HDA_CTL_BOTH	(HDA_CTL_IN | HDA_CTL_OUT)
 +#define HDA_ADC_MONITOR		(1 << 0)
 +
 +#define HDA_CTL_OUT		1
 +#define HDA_CTL_IN		2
  
  #define HDA_GPIO_MAX		8
  /* 0 - 7 = GPIO , 8 = Flush */
 @@ -346,6 +372,7 @@ SND_DECLARE_FILE("$FreeBSD$");
  #define HDA_QUIRK_FORCESTEREO	(1 << 11)
  #define HDA_QUIRK_EAPDINV	(1 << 12)
  #define HDA_QUIRK_DMAPOS	(1 << 13)
 +#define HDA_QUIRK_SENSEINV	(1 << 14)
  
  /* 26 - 31 = vrefs */
  #define HDA_QUIRK_IVREF50	(1 << 26)
 @@ -361,9 +388,6 @@ SND_DECLARE_FILE("$FreeBSD$");
  							HDA_QUIRK_OVREF100)
  #define HDA_QUIRK_VREF		(HDA_QUIRK_IVREF | HDA_QUIRK_OVREF)
  
 -#define SOUND_MASK_SKIP		(1 << 30)
 -#define SOUND_MASK_DISABLE	(1 << 31)
 -
  #if __FreeBSD_version < 600000
  #define taskqueue_drain(...)
  #endif
 @@ -386,6 +410,7 @@ static const struct {
  	{ "forcestereo", HDA_QUIRK_FORCESTEREO },
  	{ "eapdinv", HDA_QUIRK_EAPDINV },
  	{ "dmapos", HDA_QUIRK_DMAPOS },
 +	{ "senseinv", HDA_QUIRK_SENSEINV },
  	{ "ivref50", HDA_QUIRK_IVREF50 },
  	{ "ivref80", HDA_QUIRK_IVREF80 },
  	{ "ivref100", HDA_QUIRK_IVREF100 },
 @@ -413,14 +438,18 @@ static const struct {
  #define HDA_PARSE_MAXDEPTH	10
  
  #define HDAC_UNSOLTAG_EVENT_HP		0x00
 -#define HDAC_UNSOLTAG_EVENT_TEST	0x01
  
  MALLOC_DEFINE(M_HDAC, "hdac", "High Definition Audio Controller");
  
 -enum {
 -	HDA_PARSE_MIXER,
 -	HDA_PARSE_DIRECT
 -};
 +const char *HDA_COLORS[16] = {"Unknown", "Black", "Grey", "Blue", "Green", "Red",
 +    "Orange", "Yellow", "Purple", "Pink", "Res.A", "Res.B", "Res.C", "Res.D",
 +    "White", "Other"};
 +
 +const char *HDA_DEVS[16] = {"Line-out", "Speaker", "Headphones", "CD",
 +    "SPDIF-out", "Digital-out", "Modem-line", "Modem-handset", "Line-in",
 +    "AUX", "Mic", "Telephony", "SPDIF-in", "Digital-in", "Res.E", "Other"};
 +
 +const char *HDA_CONNS[4] = {"Jack", "None", "Fixed", "Both"};
  
  /* Default */
  static uint32_t hdac_fmt[] = {
 @@ -439,6 +468,8 @@ static const struct {
  	{ HDA_INTEL_82801G,  "Intel 82801G" },
  	{ HDA_INTEL_82801H,  "Intel 82801H" },
  	{ HDA_INTEL_82801I,  "Intel 82801I" },
 +	{ HDA_INTEL_82801J,  "Intel 82801J" },
 +	{ HDA_INTEL_SCH,     "Intel SCH" },
  	{ HDA_NVIDIA_MCP51,  "NVidia MCP51" },
  	{ HDA_NVIDIA_MCP55,  "NVidia MCP55" },
  	{ HDA_NVIDIA_MCP61_1, "NVidia MCP61" },
 @@ -447,16 +478,28 @@ static const struct {
  	{ HDA_NVIDIA_MCP65_2, "NVidia MCP65" },
  	{ HDA_NVIDIA_MCP67_1, "NVidia MCP67" },
  	{ HDA_NVIDIA_MCP67_2, "NVidia MCP67" },
 +	{ HDA_NVIDIA_MCP73_1, "NVidia MCP73" },
 +	{ HDA_NVIDIA_MCP73_2, "NVidia MCP73" },
 +	{ HDA_NVIDIA_MCP78_1, "NVidia MCP78" },
 +	{ HDA_NVIDIA_MCP78_2, "NVidia MCP78" },
 +	{ HDA_NVIDIA_MCP78_3, "NVidia MCP78" },
 +	{ HDA_NVIDIA_MCP78_4, "NVidia MCP78" },
 +	{ HDA_NVIDIA_MCP79_1, "NVidia MCP79" },
 +	{ HDA_NVIDIA_MCP79_2, "NVidia MCP79" },
 +	{ HDA_NVIDIA_MCP79_3, "NVidia MCP79" },
 +	{ HDA_NVIDIA_MCP79_4, "NVidia MCP79" },
  	{ HDA_ATI_SB450,     "ATI SB450"    },
  	{ HDA_ATI_SB600,     "ATI SB600"    },
  	{ HDA_VIA_VT82XX,    "VIA VT8251/8237A" },
  	{ HDA_SIS_966,       "SiS 966" },
 +	{ HDA_ULI_M5461,     "ULI M5461" },
  	/* Unknown */
  	{ HDA_INTEL_ALL,  "Intel (Unknown)"  },
  	{ HDA_NVIDIA_ALL, "NVidia (Unknown)" },
  	{ HDA_ATI_ALL,    "ATI (Unknown)"    },
  	{ HDA_VIA_ALL,    "VIA (Unknown)"    },
  	{ HDA_SIS_ALL,    "SiS (Unknown)"    },
 +	{ HDA_ULI_ALL,    "ULI (Unknown)"    },
  };
  #define HDAC_DEVICES_LEN (sizeof(hdac_devices) / sizeof(hdac_devices[0]))
  
 @@ -526,8 +569,13 @@ static const struct {
  #define REALTEK_VENDORID	0x10ec
  #define HDA_CODEC_ALC260	HDA_CODEC_CONSTRUCT(REALTEK, 0x0260)
  #define HDA_CODEC_ALC262	HDA_CODEC_CONSTRUCT(REALTEK, 0x0262)
 +#define HDA_CODEC_ALC267	HDA_CODEC_CONSTRUCT(REALTEK, 0x0267)
  #define HDA_CODEC_ALC268	HDA_CODEC_CONSTRUCT(REALTEK, 0x0268)
 +#define HDA_CODEC_ALC269	HDA_CODEC_CONSTRUCT(REALTEK, 0x0269)
 +#define HDA_CODEC_ALC272	HDA_CODEC_CONSTRUCT(REALTEK, 0x0272)
  #define HDA_CODEC_ALC660	HDA_CODEC_CONSTRUCT(REALTEK, 0x0660)
 +#define HDA_CODEC_ALC662	HDA_CODEC_CONSTRUCT(REALTEK, 0x0662)
 +#define HDA_CODEC_ALC663	HDA_CODEC_CONSTRUCT(REALTEK, 0x0663)
  #define HDA_CODEC_ALC861	HDA_CODEC_CONSTRUCT(REALTEK, 0x0861)
  #define HDA_CODEC_ALC861VD	HDA_CODEC_CONSTRUCT(REALTEK, 0x0862)
  #define HDA_CODEC_ALC880	HDA_CODEC_CONSTRUCT(REALTEK, 0x0880)
 @@ -535,16 +583,26 @@ static const struct {
  #define HDA_CODEC_ALC883	HDA_CODEC_CONSTRUCT(REALTEK, 0x0883)
  #define HDA_CODEC_ALC885	HDA_CODEC_CONSTRUCT(REALTEK, 0x0885)
  #define HDA_CODEC_ALC888	HDA_CODEC_CONSTRUCT(REALTEK, 0x0888)
 +#define HDA_CODEC_ALC889	HDA_CODEC_CONSTRUCT(REALTEK, 0x0889)
  #define HDA_CODEC_ALCXXXX	HDA_CODEC_CONSTRUCT(REALTEK, 0xffff)
  
  /* Analog Devices */
  #define ANALOGDEVICES_VENDORID	0x11d4
 +#define HDA_CODEC_AD1884A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x184a)
 +#define HDA_CODEC_AD1882	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1882)
 +#define HDA_CODEC_AD1883	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1883)
 +#define HDA_CODEC_AD1884	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1884)
 +#define HDA_CODEC_AD1984A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194a)
 +#define HDA_CODEC_AD1984B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194b)
  #define HDA_CODEC_AD1981HD	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1981)
  #define HDA_CODEC_AD1983	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1983)
  #define HDA_CODEC_AD1984	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1984)
  #define HDA_CODEC_AD1986A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1986)
 +#define HDA_CODEC_AD1987	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1987)
  #define HDA_CODEC_AD1988	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1988)
  #define HDA_CODEC_AD1988B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x198b)
 +#define HDA_CODEC_AD1882A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x882a)
 +#define HDA_CODEC_AD1989B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989b)
  #define HDA_CODEC_ADXXXX	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0xffff)
  
  /* CMedia */
 @@ -554,29 +612,77 @@ static const struct {
  
  /* Sigmatel */
  #define SIGMATEL_VENDORID	0x8384
 +#define HDA_CODEC_STAC9230X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7612)
 +#define HDA_CODEC_STAC9230D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7613)
 +#define HDA_CODEC_STAC9229X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7614)
 +#define HDA_CODEC_STAC9229D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7615)
 +#define HDA_CODEC_STAC9228X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7616)
 +#define HDA_CODEC_STAC9228D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7617)
 +#define HDA_CODEC_STAC9227X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618)
 +#define HDA_CODEC_STAC9227D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7619)
 +#define HDA_CODEC_STAC9274	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7620)
 +#define HDA_CODEC_STAC9274D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7621)
 +#define HDA_CODEC_STAC9273X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7622)
 +#define HDA_CODEC_STAC9273D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7623)
 +#define HDA_CODEC_STAC9272X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7624)
 +#define HDA_CODEC_STAC9272D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7625)
 +#define HDA_CODEC_STAC9271X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7626)
 +#define HDA_CODEC_STAC9271D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627)
 +#define HDA_CODEC_STAC9274X5NH	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7628)
 +#define HDA_CODEC_STAC9274D5NH	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7629)
 +#define HDA_CODEC_STAC9250	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7634)
 +#define HDA_CODEC_STAC9251	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7636)
 +#define HDA_CODEC_IDT92HD700X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7638)
 +#define HDA_CODEC_IDT92HD700D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639)
 +#define HDA_CODEC_IDT92HD206X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645)
 +#define HDA_CODEC_IDT92HD206D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646)
 +#define HDA_CODEC_STAC9872AK	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662)
  #define HDA_CODEC_STAC9221	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680)
 +#define HDA_CODEC_STAC922XD	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681)
 +#define HDA_CODEC_STAC9221_A2	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682)
  #define HDA_CODEC_STAC9221D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7683)
  #define HDA_CODEC_STAC9220	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7690)
 -#define HDA_CODEC_STAC922XD	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681)
 -#define HDA_CODEC_STAC9227	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618)
 -#define HDA_CODEC_STAC9271D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627)
 -#define HDA_CODEC_STAC9205	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0)
 -#define HDA_CODEC_STAC9872AK	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662)
 +#define HDA_CODEC_STAC9200D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7691)
 +#define HDA_CODEC_IDT92HD005	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7698)
 +#define HDA_CODEC_IDT92HD005D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7699)
 +#define HDA_CODEC_STAC9205X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0)
 +#define HDA_CODEC_STAC9205D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a1)
 +#define HDA_CODEC_STAC9204X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a2)
 +#define HDA_CODEC_STAC9204D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a3)
 +#define HDA_CODEC_STAC9220_A2	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7880)
 +#define HDA_CODEC_STAC9220_A1	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7882)
  #define HDA_CODEC_STACXXXX	HDA_CODEC_CONSTRUCT(SIGMATEL, 0xffff)
  
 -/*
 - * Conexant
 - *
 - * Ok, the truth is, I don't have any idea at all whether
 - * it is "Venice" or "Waikiki" or other unnamed CXyadayada. The only
 - * place that tell me it is "Venice" is from its Windows driver INF.
 - *
 - *  Venice - CX?????
 - * Waikiki - CX20551-22
 - */
 +/* IDT */
 +#define IDT_VENDORID		0x111d
 +#define HDA_CODEC_IDT92HD75BX	HDA_CODEC_CONSTRUCT(IDT, 0x7603)
 +#define HDA_CODEC_IDT92HD83C1X	HDA_CODEC_CONSTRUCT(IDT, 0x7604)
 +#define HDA_CODEC_IDT92HD81B1X	HDA_CODEC_CONSTRUCT(IDT, 0x7605)
 +#define HDA_CODEC_IDT92HD75B3	HDA_CODEC_CONSTRUCT(IDT, 0x7608)
 +#define HDA_CODEC_IDT92HD73D1	HDA_CODEC_CONSTRUCT(IDT, 0x7674)
 +#define HDA_CODEC_IDT92HD73C1	HDA_CODEC_CONSTRUCT(IDT, 0x7675)
 +#define HDA_CODEC_IDT92HD73E1	HDA_CODEC_CONSTRUCT(IDT, 0x7676)
 +#define HDA_CODEC_IDT92HD71B8	HDA_CODEC_CONSTRUCT(IDT, 0x76b0)
 +#define HDA_CODEC_IDT92HD71B7	HDA_CODEC_CONSTRUCT(IDT, 0x76b2)
 +#define HDA_CODEC_IDT92HD71B5	HDA_CODEC_CONSTRUCT(IDT, 0x76b6)
 +#define HDA_CODEC_IDT92HD83C1C	HDA_CODEC_CONSTRUCT(IDT, 0x76d4)
 +#define HDA_CODEC_IDT92HD81B1C	HDA_CODEC_CONSTRUCT(IDT, 0x76d5)
 +#define HDA_CODEC_IDTXXXX	HDA_CODEC_CONSTRUCT(IDT, 0xffff)
 +
 +/* Silicon Image */
 +#define SII_VENDORID	0x1095
 +#define HDA_CODEC_SII1392	HDA_CODEC_CONSTRUCT(SII, 0x1392)
 +#define HDA_CODEC_SIIXXXX	HDA_CODEC_CONSTRUCT(SII, 0xffff)
 +
 +/* Lucent/Agere */
 +#define AGERE_VENDORID	0x11c1
 +#define HDA_CODEC_AGEREXXXX	HDA_CODEC_CONSTRUCT(AGERE, 0xffff)
 +
 +/* Conexant */
  #define CONEXANT_VENDORID	0x14f1
 -#define HDA_CODEC_CXVENICE	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045)
 -#define HDA_CODEC_CXWAIKIKI	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047)
 +#define HDA_CODEC_CX20549	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045)
 +#define HDA_CODEC_CX20551	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047)
 +#define HDA_CODEC_CX20561	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051)
  #define HDA_CODEC_CXXXXX	HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff)
  
  /* VIA */
 @@ -592,8 +698,28 @@ static const struct {
  #define HDA_CODEC_VT1709_5	HDA_CODEC_CONSTRUCT(VIA, 0xe715)
  #define HDA_CODEC_VT1709_6	HDA_CODEC_CONSTRUCT(VIA, 0xe716)
  #define HDA_CODEC_VT1709_7	HDA_CODEC_CONSTRUCT(VIA, 0xe717)
 +#define HDA_CODEC_VT1708B_0	HDA_CODEC_CONSTRUCT(VIA, 0xe720)
 +#define HDA_CODEC_VT1708B_1	HDA_CODEC_CONSTRUCT(VIA, 0xe721)
 +#define HDA_CODEC_VT1708B_2	HDA_CODEC_CONSTRUCT(VIA, 0xe722)
 +#define HDA_CODEC_VT1708B_3	HDA_CODEC_CONSTRUCT(VIA, 0xe723)
 +#define HDA_CODEC_VT1708B_4	HDA_CODEC_CONSTRUCT(VIA, 0xe724)
 +#define HDA_CODEC_VT1708B_5	HDA_CODEC_CONSTRUCT(VIA, 0xe725)
 +#define HDA_CODEC_VT1708B_6	HDA_CODEC_CONSTRUCT(VIA, 0xe726)
 +#define HDA_CODEC_VT1708B_7	HDA_CODEC_CONSTRUCT(VIA, 0xe727)
  #define HDA_CODEC_VTXXXX	HDA_CODEC_CONSTRUCT(VIA, 0xffff)
  
 +/* ATI */
 +#define HDA_CODEC_ATIRS600_1	HDA_CODEC_CONSTRUCT(ATI, 0x793c)
 +#define HDA_CODEC_ATIRS600_2	HDA_CODEC_CONSTRUCT(ATI, 0x7919)
 +#define HDA_CODEC_ATIRS690	HDA_CODEC_CONSTRUCT(ATI, 0x791a)
 +#define HDA_CODEC_ATIR6XX	HDA_CODEC_CONSTRUCT(ATI, 0xaa01)
 +#define HDA_CODEC_ATIXXXX	HDA_CODEC_CONSTRUCT(ATI, 0xffff)
 +
 +/* NVIDIA */
 +#define HDA_CODEC_NVIDIAXXXX	HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff)
 +
 +/* INTEL */
 +#define HDA_CODEC_INTELXXXX	HDA_CODEC_CONSTRUCT(INTEL, 0xffff)
  
  /* Codecs */
  static const struct {
 @@ -602,8 +728,13 @@ static const struct {
  } hdac_codecs[] = {
  	{ HDA_CODEC_ALC260,    "Realtek ALC260" },
  	{ HDA_CODEC_ALC262,    "Realtek ALC262" },
 +	{ HDA_CODEC_ALC267,    "Realtek ALC267" },
  	{ HDA_CODEC_ALC268,    "Realtek ALC268" },
 +	{ HDA_CODEC_ALC269,    "Realtek ALC269" },
 +	{ HDA_CODEC_ALC272,    "Realtek ALC272" },
  	{ HDA_CODEC_ALC660,    "Realtek ALC660" },
 +	{ HDA_CODEC_ALC662,    "Realtek ALC662" },
 +	{ HDA_CODEC_ALC663,    "Realtek ALC663" },
  	{ HDA_CODEC_ALC861,    "Realtek ALC861" },
  	{ HDA_CODEC_ALC861VD,  "Realtek ALC861-VD" },
  	{ HDA_CODEC_ALC880,    "Realtek ALC880" },
 @@ -611,23 +742,77 @@ static const struct {
  	{ HDA_CODEC_ALC883,    "Realtek ALC883" },
  	{ HDA_CODEC_ALC885,    "Realtek ALC885" },
  	{ HDA_CODEC_ALC888,    "Realtek ALC888" },
 +	{ HDA_CODEC_ALC889,    "Realtek ALC889" },
 +	{ HDA_CODEC_AD1882,    "Analog Devices AD1882" },
 +	{ HDA_CODEC_AD1882A,   "Analog Devices AD1882A" },
 +	{ HDA_CODEC_AD1883,    "Analog Devices AD1883" },
 +	{ HDA_CODEC_AD1884,    "Analog Devices AD1884" },
 +	{ HDA_CODEC_AD1884A,   "Analog Devices AD1884A" },
  	{ HDA_CODEC_AD1981HD,  "Analog Devices AD1981HD" },
  	{ HDA_CODEC_AD1983,    "Analog Devices AD1983" },
  	{ HDA_CODEC_AD1984,    "Analog Devices AD1984" },
 +	{ HDA_CODEC_AD1984A,   "Analog Devices AD1984A" },
 +	{ HDA_CODEC_AD1984B,   "Analog Devices AD1984B" },
  	{ HDA_CODEC_AD1986A,   "Analog Devices AD1986A" },
 -	{ HDA_CODEC_AD1988,    "Analog Devices AD1988" },
 +	{ HDA_CODEC_AD1987,    "Analog Devices AD1987" },
 +	{ HDA_CODEC_AD1988,    "Analog Devices AD1988A" },
  	{ HDA_CODEC_AD1988B,   "Analog Devices AD1988B" },
 +	{ HDA_CODEC_AD1989B,   "Analog Devices AD1989B" },
  	{ HDA_CODEC_CMI9880,   "CMedia CMI9880" },
 +	{ HDA_CODEC_STAC9200D, "Sigmatel STAC9200D" },
 +	{ HDA_CODEC_STAC9204X, "Sigmatel STAC9204X" },
 +	{ HDA_CODEC_STAC9204D, "Sigmatel STAC9204D" },
 +	{ HDA_CODEC_STAC9205X, "Sigmatel STAC9205X" },
 +	{ HDA_CODEC_STAC9205D, "Sigmatel STAC9205D" },
 +	{ HDA_CODEC_STAC9220,  "Sigmatel STAC9220" },
 +	{ HDA_CODEC_STAC9220_A1, "Sigmatel STAC9220_A1" },
 +	{ HDA_CODEC_STAC9220_A2, "Sigmatel STAC9220_A2" },
  	{ HDA_CODEC_STAC9221,  "Sigmatel STAC9221" },
 +	{ HDA_CODEC_STAC9221_A2, "Sigmatel STAC9221_A2" },
  	{ HDA_CODEC_STAC9221D, "Sigmatel STAC9221D" },
 -	{ HDA_CODEC_STAC9220,  "Sigmatel STAC9220" },
  	{ HDA_CODEC_STAC922XD, "Sigmatel STAC9220D/9223D" },
 -	{ HDA_CODEC_STAC9227,  "Sigmatel STAC9227" },
 +	{ HDA_CODEC_STAC9227X, "Sigmatel STAC9227X" },
 +	{ HDA_CODEC_STAC9227D, "Sigmatel STAC9227D" },
 +	{ HDA_CODEC_STAC9228X, "Sigmatel STAC9228X" },
 +	{ HDA_CODEC_STAC9228D, "Sigmatel STAC9228D" },
 +	{ HDA_CODEC_STAC9229X, "Sigmatel STAC9229X" },
 +	{ HDA_CODEC_STAC9229D, "Sigmatel STAC9229D" },
 +	{ HDA_CODEC_STAC9230X, "Sigmatel STAC9230X" },
 +	{ HDA_CODEC_STAC9230D, "Sigmatel STAC9230D" },
 +	{ HDA_CODEC_STAC9250,  "Sigmatel STAC9250" },
 +	{ HDA_CODEC_STAC9251,  "Sigmatel STAC9251" },
 +	{ HDA_CODEC_STAC9271X, "Sigmatel STAC9271X" },
  	{ HDA_CODEC_STAC9271D, "Sigmatel STAC9271D" },
 -	{ HDA_CODEC_STAC9205,  "Sigmatel STAC9205" },
 -	{ HDA_CODEC_STAC9872AK,"Sigmatel STAC9872AK" },
 -	{ HDA_CODEC_CXVENICE,  "Conexant Venice" },
 -	{ HDA_CODEC_CXWAIKIKI, "Conexant Waikiki" },
 +	{ HDA_CODEC_STAC9272X, "Sigmatel STAC9272X" },
 +	{ HDA_CODEC_STAC9272D, "Sigmatel STAC9272D" },
 +	{ HDA_CODEC_STAC9273X, "Sigmatel STAC9273X" },
 +	{ HDA_CODEC_STAC9273D, "Sigmatel STAC9273D" },
 +	{ HDA_CODEC_STAC9274,  "Sigmatel STAC9274" },
 +	{ HDA_CODEC_STAC9274D, "Sigmatel STAC9274D" },
 +	{ HDA_CODEC_STAC9274X5NH, "Sigmatel STAC9274X5NH" },
 +	{ HDA_CODEC_STAC9274D5NH, "Sigmatel STAC9274D5NH" },
 +	{ HDA_CODEC_STAC9872AK, "Sigmatel STAC9872AK" },
 +	{ HDA_CODEC_IDT92HD005, "IDT 92HD005" },
 +	{ HDA_CODEC_IDT92HD005D, "IDT 92HD005D" },
 +	{ HDA_CODEC_IDT92HD206X, "IDT 92HD206X" },
 +	{ HDA_CODEC_IDT92HD206D, "IDT 92HD206D" },
 +	{ HDA_CODEC_IDT92HD700X, "IDT 92HD700X" },
 +	{ HDA_CODEC_IDT92HD700D, "IDT 92HD700D" },
 +	{ HDA_CODEC_IDT92HD71B5, "IDT 92HD71B5" },
 +	{ HDA_CODEC_IDT92HD71B7, "IDT 92HD71B7" },
 +	{ HDA_CODEC_IDT92HD71B8, "IDT 92HD71B8" },
 +	{ HDA_CODEC_IDT92HD73C1, "IDT 92HD73C1" },
 +	{ HDA_CODEC_IDT92HD73D1, "IDT 92HD73D1" },
 +	{ HDA_CODEC_IDT92HD73E1, "IDT 92HD73E1" },
 +	{ HDA_CODEC_IDT92HD75B3, "IDT 92HD75B3" },
 +	{ HDA_CODEC_IDT92HD75BX, "IDT 92HD75BX" },
 +	{ HDA_CODEC_IDT92HD81B1C, "IDT 92HD81B1C" },
 +	{ HDA_CODEC_IDT92HD81B1X, "IDT 92HD81B1X" },
 +	{ HDA_CODEC_IDT92HD83C1C, "IDT 92HD83C1C" },
 +	{ HDA_CODEC_IDT92HD83C1X, "IDT 92HD83C1X" },
 +	{ HDA_CODEC_CX20549,   "Conexant CX20549 (Venice)" },
 +	{ HDA_CODEC_CX20551,   "Conexant CX20551 (Waikiki)" },
 +	{ HDA_CODEC_CX20561,   "Conexant CX20561 (Hermosa)" },
  	{ HDA_CODEC_VT1708_8,  "VIA VT1708_8" },
  	{ HDA_CODEC_VT1708_9,  "VIA VT1708_9" },
  	{ HDA_CODEC_VT1708_A,  "VIA VT1708_A" },
 @@ -640,136 +825,41 @@ static const struct {
  	{ HDA_CODEC_VT1709_5,  "VIA VT1709_5" },
  	{ HDA_CODEC_VT1709_6,  "VIA VT1709_6" },
  	{ HDA_CODEC_VT1709_7,  "VIA VT1709_7" },
 +	{ HDA_CODEC_VT1708B_0, "VIA VT1708B_0" },
 +	{ HDA_CODEC_VT1708B_1, "VIA VT1708B_1" },
 +	{ HDA_CODEC_VT1708B_2, "VIA VT1708B_2" },
 +	{ HDA_CODEC_VT1708B_3, "VIA VT1708B_3" },
 +	{ HDA_CODEC_VT1708B_4, "VIA VT1708B_4" },
 +	{ HDA_CODEC_VT1708B_5, "VIA VT1708B_5" },
 +	{ HDA_CODEC_VT1708B_6, "VIA VT1708B_6" },
 +	{ HDA_CODEC_VT1708B_7, "VIA VT1708B_7" },
 +	{ HDA_CODEC_ATIRS600_1,"ATI RS600 HDMI" },
 +	{ HDA_CODEC_ATIRS600_2,"ATI RS600 HDMI" },
 +	{ HDA_CODEC_ATIRS690,  "ATI RS690/780 HDMI" },
 +	{ HDA_CODEC_ATIR6XX,   "ATI R6xx HDMI" },
 +	{ HDA_CODEC_SII1392,   "Silicon Image SiI1392 HDMI" },
  	/* Unknown codec */
  	{ HDA_CODEC_ALCXXXX,   "Realtek (Unknown)" },
  	{ HDA_CODEC_ADXXXX,    "Analog Devices (Unknown)" },
  	{ HDA_CODEC_CMIXXXX,   "CMedia (Unknown)" },
  	{ HDA_CODEC_STACXXXX,  "Sigmatel (Unknown)" },
 +	{ HDA_CODEC_SIIXXXX,   "Silicon Image (Unknown)" },
 +	{ HDA_CODEC_AGEREXXXX, "Lucent/Agere Systems (Unknown)" },
  	{ HDA_CODEC_CXXXXX,    "Conexant (Unknown)" },
  	{ HDA_CODEC_VTXXXX,    "VIA (Unknown)" },
 +	{ HDA_CODEC_ATIXXXX,   "ATI (Unknown)" },
 +	{ HDA_CODEC_NVIDIAXXXX,"NVidia (Unknown)" },
 +	{ HDA_CODEC_INTELXXXX, "Intel (Unknown)" },
 +	{ HDA_CODEC_IDTXXXX,   "IDT (Unknown)" },
  };
  #define HDAC_CODECS_LEN	(sizeof(hdac_codecs) / sizeof(hdac_codecs[0]))
  
 -enum {
 -	HDAC_HP_SWITCH_CTL,
 -	HDAC_HP_SWITCH_CTRL,
 -	HDAC_HP_SWITCH_DEBUG
 -};
 -
 -static const struct {
 -	uint32_t model;
 -	uint32_t id;
 -	int type;
 -	int inverted;
 -	int polling;
 -	int execsense;
 -	nid_t hpnid;
 -	nid_t spkrnid[8];
 -	nid_t eapdnid;
 -} hdac_hp_switch[] = {
 -	/* Specific OEM models */
 -	{ HP_V3000_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 17, { 16, -1 }, 16 },
 -	/* { HP_XW4300_SUBVENDOR, HDA_CODEC_ALC260, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 21, { 16, 17, -1 }, -1 } */
 -	/* { HP_3010_SUBVENDOR,  HDA_CODEC_ALC260, HDAC_HP_SWITCH_DEBUG,
 -	    0, 1, 0, 16, { 15, 18, 19, 20, 21, -1 }, -1 }, */
 -	{ HP_NX7400_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, 5 },
 -	{ HP_NX6310_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, 5 },
 -	{ HP_NX6325_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, 5 },
 -	/* { HP_DC7700_SUBVENDOR, HDA_CODEC_ALC262, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 21, { 22, 27, -1 }, -1 }, */
 -	{ TOSHIBA_U200_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, -1 },
 -	{ TOSHIBA_A135_SUBVENDOR, HDA_CODEC_ALC861VD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 27, { 20, -1 }, -1 },
 -	{ DELL_D820_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 13, { 14, -1 }, -1 },
 -	{ DELL_I1300_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 13, { 14, -1 }, -1 },
 -	{ DELL_OPLX745_SUBVENDOR, HDA_CODEC_AD1983, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, 7, -1 }, -1 },
 -	{ DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 10, { 13, -1 }, -1 },
 -	{ DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 10, { 13, -1 }, -1 },
 -	{ APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 21, { 20, 22, -1 }, -1 },
 -	{ APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 10, { 13, -1 }, -1 },
 -	{ LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, HDAC_HP_SWITCH_CTL,
 -	    1, 0, -1, 26, { 27, -1 }, -1 },
 -	{ LENOVO_3KN200_SUBVENDOR, HDA_CODEC_ALC861VD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 27, { 20, -1 }, -1 },
 -	/* { LENOVO_TCA55_SUBVENDOR, HDA_CODEC_AD1986A, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 26, { 27, 28, 29, 30, -1 }, -1 }, */
 -	{ LG_LW20_SUBVENDOR, HDA_CODEC_ALC880, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 27, { 20, -1 }, -1 },
 -	{ ACER_A5050_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ ACER_3681WXM_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ ACER_A4520_SUBVENDOR, HDA_CODEC_ALC268, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ ACER_A4710_SUBVENDOR, HDA_CODEC_ALC268, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ ACER_A4715_SUBVENDOR, HDA_CODEC_ALC268, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ UNIWILL_9080_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ MSI_MS1034_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 27, -1 }, -1 },
 -	{ MSI_MS034A_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 27, -1 }, -1 },
 -	{ FS_SI1848_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	{ FL_S7020D_SUBVENDOR, HDA_CODEC_ALC260, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 16, -1 }, -1 },
 -	{ FL_U1010_SUBVENDOR, HDA_CODEC_ALC262, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -	/*
 -	 * All models that at least come from the same vendor with
 -	 * simmilar codec.
 -	 */
 -	{ HP_ALL_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 17, { 16, -1 }, 16 },
 -	{ HP_ALL_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, 5 },
 -	{ TOSHIBA_ALL_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 6, { 5, -1 }, -1 },
 -	{ DELL_ALL_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
 -	    0, 0, -1, 13, { 14, -1 }, -1 },
 -#if 0
 -	{ LENOVO_ALL_SUBVENDOR, HDA_CODEC_AD1986A, HDAC_HP_SWITCH_CTL,
 -	    1, 0, -1, 26, { 27, -1 }, -1 },
 -	{ ACER_ALL_SUBVENDOR, HDA_CODEC_ALC883, HDAC_HP_SWITCH_CTL,
 -	    0, 0, -1, 20, { 21, -1 }, -1 },
 -#endif
 -};
 -#define HDAC_HP_SWITCH_LEN	\
 -		(sizeof(hdac_hp_switch) / sizeof(hdac_hp_switch[0]))
 -
 -static const struct {
 -	uint32_t model;
 -	uint32_t id;
 -	nid_t eapdnid;
 -	int hp_switch;
 -} hdac_eapd_switch[] = {
 -	{ HP_V3000_SUBVENDOR, HDA_CODEC_CXVENICE, 16, 1 },
 -	{ HP_NX7400_SUBVENDOR, HDA_CODEC_AD1981HD, 5, 1 },
 -	{ HP_NX6310_SUBVENDOR, HDA_CODEC_AD1981HD, 5, 1 },
 -};
 -#define HDAC_EAPD_SWITCH_LEN	\
 -		(sizeof(hdac_eapd_switch) / sizeof(hdac_eapd_switch[0]))
  
  /****************************************************************************
   * Function prototypes
   ****************************************************************************/
  static void	hdac_intr_handler(void *);
 -static int	hdac_reset(struct hdac_softc *);
 +static int	hdac_reset(struct hdac_softc *, int);
  static int	hdac_get_capabilities(struct hdac_softc *);
  static void	hdac_dma_cb(void *, bus_dma_segment_t *, int, int);
  static int	hdac_dma_alloc(struct hdac_softc *,
 @@ -783,10 +873,10 @@ static void	hdac_corb_init(struct hdac_s
  static void	hdac_rirb_init(struct hdac_softc *);
  static void	hdac_corb_start(struct hdac_softc *);
  static void	hdac_rirb_start(struct hdac_softc *);
 -static void	hdac_scan_codecs(struct hdac_softc *, int);
 -static int	hdac_probe_codec(struct hdac_codec *);
 -static struct	hdac_devinfo *hdac_probe_function(struct hdac_codec *, nid_t);
 -static void	hdac_add_child(struct hdac_softc *, struct hdac_devinfo *);
 +static void	hdac_scan_codecs(struct hdac_softc *);
 +static void	hdac_probe_codec(struct hdac_codec *);
 +static void	hdac_probe_function(struct hdac_codec *, nid_t);
 +static int	hdac_pcmchannel_setup(struct hdac_chan *);
  
  static void	hdac_attach2(void *);
  
 @@ -798,34 +888,37 @@ static void	hdac_command_send_internal(s
  static int	hdac_probe(device_t);
  static int	hdac_attach(device_t);
  static int	hdac_detach(device_t);
 +static int	hdac_suspend(device_t);
 +static int	hdac_resume(device_t);
  static void	hdac_widget_connection_select(struct hdac_widget *, uint8_t);
  static void	hdac_audio_ctl_amp_set(struct hdac_audio_ctl *,
  						uint32_t, int, int);
  static struct	hdac_audio_ctl *hdac_audio_ctl_amp_get(struct hdac_devinfo *,
 -							nid_t, int, int);
 +							nid_t, int, int, int);
  static void	hdac_audio_ctl_amp_set_internal(struct hdac_softc *,
  				nid_t, nid_t, int, int, int, int, int, int);
 -static int	hdac_audio_ctl_ossmixer_getnextdev(struct hdac_devinfo *);
  static struct	hdac_widget *hdac_widget_get(struct hdac_devinfo *, nid_t);
  
  static int	hdac_rirb_flush(struct hdac_softc *sc);
  static int	hdac_unsolq_flush(struct hdac_softc *sc);
  
 +static void	hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf);
 +
  #define hdac_command(a1, a2, a3)	\
  		hdac_command_sendone_internal(a1, a2, a3)
  
 -#define hdac_codec_id(d)						\
 -		((uint32_t)((d == NULL) ? 0x00000000 :			\
 -		((((uint32_t)(d)->vendor_id & 0x0000ffff) << 16) |	\
 -		((uint32_t)(d)->device_id & 0x0000ffff))))
 +#define hdac_codec_id(c)							\
 +		((uint32_t)((c == NULL) ? 0x00000000 :	\
 +		((((uint32_t)(c)->vendor_id & 0x0000ffff) << 16) |	\
 +		((uint32_t)(c)->device_id & 0x0000ffff))))
  
  static char *
 -hdac_codec_name(struct hdac_devinfo *devinfo)
 +hdac_codec_name(struct hdac_codec *codec)
  {
  	uint32_t id;
  	int i;
  
 -	id = hdac_codec_id(devinfo);
 +	id = hdac_codec_id(codec);
  
  	for (i = 0; i < HDAC_CODECS_LEN; i++) {
  		if (HDA_DEV_MATCH(hdac_codecs[i].id, id))
 @@ -836,20 +929,6 @@ hdac_codec_name(struct hdac_devinfo *dev
  }
  
  static char *
 -hdac_audio_ctl_ossmixer_mask2name(uint32_t devmask)
 -{
 -	static char *ossname[] = SOUND_DEVICE_NAMES;
 -	static char *unknown = "???";
 -	int i;
 -
 -	for (i = SOUND_MIXER_NRDEVICES - 1; i >= 0; i--) {
 -		if (devmask & (1 << i))
 -			return (ossname[i]);
 -	}
 -	return (unknown);
 -}
 -
 -static void
  hdac_audio_ctl_ossmixer_mask2allname(uint32_t mask, char *buf, size_t len)
  {
  	static char *ossname[] = SOUND_DEVICE_NAMES;
 @@ -864,6 +943,7 @@ hdac_audio_ctl_ossmixer_mask2allname(uin
  			first = 0;
  		}
  	}
 +	return (buf);
  }
  
  static struct hdac_audio_ctl *
 @@ -879,48 +959,46 @@ hdac_audio_ctl_each(struct hdac_devinfo 
  }
  
  static struct hdac_audio_ctl *
 -hdac_audio_ctl_amp_get(struct hdac_devinfo *devinfo, nid_t nid,
 +hdac_audio_ctl_amp_get(struct hdac_devinfo *devinfo, nid_t nid, int dir,
  						int index, int cnt)
  {
 -	struct hdac_audio_ctl *ctl, *retctl = NULL;
 -	int i, at, atindex, found = 0;
 +	struct hdac_audio_ctl *ctl;
 +	int i, found = 0;
  
  	if (devinfo == NULL || devinfo->function.audio.ctl == NULL)
  		return (NULL);
  
 -	at = cnt;
 -	if (at == 0)
 -		at = 1;
 -	else if (at < 0)
 -		at = -1;
 -	atindex = index;
 -	if (atindex < 0)
 -		atindex = -1;
 -
  	i = 0;
  	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
 -		if (ctl->enable == 0 || ctl->widget == NULL)
 +		if (ctl->enable == 0)
  			continue;
 -		if (!(ctl->widget->nid == nid && (atindex == -1 ||
 -		    ctl->index == atindex)))
 +		if (ctl->widget->nid != nid)
 +			continue;
 +		if (dir && ctl->ndir != dir)
 +			continue;
 +		if (index >= 0 && ctl->ndir == HDA_CTL_IN &&
 +		    ctl->dir == ctl->ndir && ctl->index != index)
  			continue;
  		found++;
 -		if (found == cnt)
 +		if (found == cnt || cnt <= 0)
  			return (ctl);
 -		retctl = ctl;
  	}
  
 -	return ((at == -1) ? retctl : NULL);
 +	return (NULL);
  }
  
 +/*
 + * Jack detection (Speaker/HP redirection) event handler.
 + */
  static void
  hdac_hp_switch_handler(struct hdac_devinfo *devinfo)
  {
 +	struct hdac_audio_as *as;
  	struct hdac_softc *sc;
  	struct hdac_widget *w;
  	struct hdac_audio_ctl *ctl;
 -	uint32_t val, id, res;
 -	int i = 0, j, timeout, forcemute;
 +	uint32_t val, res;
 +	int i, j;
  	nid_t cad;
  
  	if (devinfo == NULL || devinfo->codec == NULL ||
 @@ -929,84 +1007,47 @@ hdac_hp_switch_handler(struct hdac_devin
  
  	sc = devinfo->codec->sc;
  	cad = devinfo->codec->cad;
 -	id = hdac_codec_id(devinfo);
 -	for (i = 0; i < HDAC_HP_SWITCH_LEN; i++) {
 -		if (HDA_DEV_MATCH(hdac_hp_switch[i].model,
 -		    sc->pci_subvendor) &&
 -		    hdac_hp_switch[i].id == id)
 -			break;
 -	}
 -
 -	if (i >= HDAC_HP_SWITCH_LEN)
 -		return;
 -
 -	forcemute = 0;
 -	if (hdac_hp_switch[i].eapdnid != -1) {
 -		w = hdac_widget_get(devinfo, hdac_hp_switch[i].eapdnid);
 -		if (w != NULL && w->param.eapdbtl != HDAC_INVALID)
 -			forcemute = (w->param.eapdbtl &
 -			    HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD) ? 0 : 1;
 -	}
 -
 -	if (hdac_hp_switch[i].execsense != -1)
 -		hdac_command(sc,
 -		    HDA_CMD_SET_PIN_SENSE(cad, hdac_hp_switch[i].hpnid,
 -		    hdac_hp_switch[i].execsense), cad);
 +	as = devinfo->function.audio.as;
 +	for (i = 0; i < devinfo->function.audio.ascnt; i++) {
 +		if (as[i].hpredir < 0)
 +			continue;
 +	
 +		w = hdac_widget_get(devinfo, as[i].pins[15]);
 +		if (w == NULL || w->enable == 0 || w->type !=
 +		    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
 +			continue;
  
 -	timeout = 10000;
 -	do {
  		res = hdac_command(sc,
 -		    HDA_CMD_GET_PIN_SENSE(cad, hdac_hp_switch[i].hpnid),
 -		    cad);
 -		if (hdac_hp_switch[i].execsense == -1 || res != 0x7fffffff)
 -			break;
 -		DELAY(10);
 -	} while (--timeout != 0);
 +		    HDA_CMD_GET_PIN_SENSE(cad, as[i].pins[15]), cad);
  
 -	HDA_BOOTVERBOSE(
 -		device_printf(sc->dev,
 -		    "HDA_DEBUG: Pin sense: nid=%d timeout=%d res=0x%08x\n",
 -		    hdac_hp_switch[i].hpnid, timeout, res);
 -	);
 +		HDA_BOOTVERBOSE(
 +			device_printf(sc->dev,
 +			    "Pin sense: nid=%d res=0x%08x\n",
 +			    as[i].pins[15], res);
 +		);
  
 -	res = HDA_CMD_GET_PIN_SENSE_PRESENCE_DETECT(res);
 -	res ^= hdac_hp_switch[i].inverted;
 +		res = HDA_CMD_GET_PIN_SENSE_PRESENCE_DETECT(res);
 +		if (devinfo->function.audio.quirks & HDA_QUIRK_SENSEINV)
 +			res ^= 1;
  
 -	switch (hdac_hp_switch[i].type) {
 -	case HDAC_HP_SWITCH_CTL:
 +		/* (Un)Mute headphone pin. */
  		ctl = hdac_audio_ctl_amp_get(devinfo,
 -		    hdac_hp_switch[i].hpnid, 0, 1);
 -		if (ctl != NULL) {
 -			val = (res != 0 && forcemute == 0) ?
 -			    HDA_AMP_MUTE_NONE : HDA_AMP_MUTE_ALL;
 -			if (val != ctl->muted) {
 -				ctl->muted = val;
 +		    as[i].pins[15], HDA_CTL_IN, -1, 1);
 +		if (ctl != NULL && ctl->mute) {
 +			/* If pin has muter - use it. */
 +			val = (res != 0) ? 0 : 1;
 +			if (val != ctl->forcemute) {
 +				ctl->forcemute = val;
  				hdac_audio_ctl_amp_set(ctl,
 -				    HDA_AMP_MUTE_DEFAULT, ctl->left,
 -				    ctl->right);
 +				    HDA_AMP_MUTE_DEFAULT,
 +				    HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT);
  			}
 -		}
 -		for (j = 0; hdac_hp_switch[i].spkrnid[j] != -1; j++) {
 -			ctl = hdac_audio_ctl_amp_get(devinfo,
 -			    hdac_hp_switch[i].spkrnid[j], 0, 1);
 -			if (ctl == NULL)
 -				continue;
 -			val = (res != 0 || forcemute == 1) ?
 -			    HDA_AMP_MUTE_ALL : HDA_AMP_MUTE_NONE;
 -			if (val == ctl->muted)
 -				continue;
 -			ctl->muted = val;
 -			hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_DEFAULT,
 -			    ctl->left, ctl->right);
 -		}
 -		break;
 -	case HDAC_HP_SWITCH_CTRL:
 -		if (res != 0) {
 -			/* HP in */
 -			w = hdac_widget_get(devinfo, hdac_hp_switch[i].hpnid);
 +		} else {
 +			/* If there is no muter - disable pin output. */
 +			w = hdac_widget_get(devinfo, as[i].pins[15]);
  			if (w != NULL && w->type ==
  			    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) {
 -				if (forcemute == 0)
 +				if (res != 0)
  					val = w->wclass.pin.ctrl |
 
 *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: mav 
State-Changed-When: Wed Jan 7 17:11:02 UTC 2009 
State-Changed-Why:  
Merged to 7-STABLE. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117599 
>Unformatted:
