From miguel@anjos.strangled.net Sun Oct 28 11:47:57 2007 Return-Path: Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 89DC416A417 for ; 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 ; 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 ) 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 ) 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 Reply-To: Miguel Lopes Santos Ramos 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: 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: pcm0: pcm0: 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 * Copyright (c) 2006 Ariff Abdullah + * Copyright (c) 2008 Alexander Motin * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,6 +62,7 @@ * * Daniel Eischen * * * Maxime Guillaud * * * Ariff Abdullah * + * * Alexander Motin * * * * * * ....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: