Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
8a746906
Commit
8a746906
authored
Dec 09, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/hda' into for-linus
parents
482e46d4
7aee6746
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
145 additions
and
11 deletions
+145
-11
Documentation/sound/alsa/HD-Audio-Models.txt
Documentation/sound/alsa/HD-Audio-Models.txt
+1
-0
Documentation/sound/alsa/HD-Audio.txt
Documentation/sound/alsa/HD-Audio.txt
+4
-2
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+5
-0
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+9
-8
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+126
-1
No files found.
Documentation/sound/alsa/HD-Audio-Models.txt
View file @
8a746906
...
...
@@ -126,6 +126,7 @@ ALC882/883/885/888/889
mb5 Macbook 5,1
mbp3 Macbook Pro rev3
imac24 iMac 24'' with jack detection
imac91 iMac 9,1
w2jc ASUS W2JC
3stack-2ch-dig 3-jack with SPDIF I/O (ALC883)
alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883)
...
...
Documentation/sound/alsa/HD-Audio.txt
View file @
8a746906
...
...
@@ -624,11 +624,13 @@ hda-verb. The program gives you an easy-to-use GUI stuff for showing
the widget information and adjusting the amp values, as well as the
proc-compatible output.
The hda-analyzer is a part of alsa.git repository in
alsa-project.org:
The hda-analyzer:
- http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer
is a part of alsa.git repository in alsa-project.org:
- git://git.alsa-project.org/alsa.git
Codecgraph
~~~~~~~~~~
...
...
sound/pci/hda/hda_intel.c
View file @
8a746906
...
...
@@ -2450,6 +2450,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
}
}
/* disable 64bit DMA address for Teradici */
/* it does not work with device 6549:1200 subsys e4a2:040b */
if
(
chip
->
driver_type
==
AZX_DRIVER_TERA
)
gcap
&=
~
ICH6_GCAP_64OK
;
/* allow 64bit DMA address if supported by H/W */
if
((
gcap
&
ICH6_GCAP_64OK
)
&&
!
pci_set_dma_mask
(
pci
,
DMA_BIT_MASK
(
64
)))
pci_set_consistent_dma_mask
(
pci
,
DMA_BIT_MASK
(
64
));
...
...
sound/pci/hda/patch_analog.c
View file @
8a746906
...
...
@@ -72,7 +72,8 @@ struct ad198x_spec {
hda_nid_t
private_dac_nids
[
AUTO_CFG_MAX_OUTS
];
unsigned
int
jack_present
:
1
;
unsigned
int
inv_jack_detect
:
1
;
unsigned
int
inv_jack_detect
:
1
;
/* inverted jack-detection */
unsigned
int
inv_eapd
:
1
;
/* inverted EAPD implementation */
#ifdef CONFIG_SND_HDA_POWER_SAVE
struct
hda_loopback_check
loopback
;
...
...
@@ -458,7 +459,7 @@ static struct hda_codec_ops ad198x_patch_ops = {
/*
* EAPD control
* the private value = nid
| (invert << 8)
* the private value = nid
*/
#define ad198x_eapd_info snd_ctl_boolean_mono_info
...
...
@@ -467,8 +468,7 @@ static int ad198x_eapd_get(struct snd_kcontrol *kcontrol,
{
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
ad198x_spec
*
spec
=
codec
->
spec
;
int
invert
=
(
kcontrol
->
private_value
>>
8
)
&
1
;
if
(
invert
)
if
(
spec
->
inv_eapd
)
ucontrol
->
value
.
integer
.
value
[
0
]
=
!
spec
->
cur_eapd
;
else
ucontrol
->
value
.
integer
.
value
[
0
]
=
spec
->
cur_eapd
;
...
...
@@ -480,11 +480,10 @@ static int ad198x_eapd_put(struct snd_kcontrol *kcontrol,
{
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
ad198x_spec
*
spec
=
codec
->
spec
;
int
invert
=
(
kcontrol
->
private_value
>>
8
)
&
1
;
hda_nid_t
nid
=
kcontrol
->
private_value
&
0xff
;
unsigned
int
eapd
;
eapd
=
!!
ucontrol
->
value
.
integer
.
value
[
0
];
if
(
invert
)
if
(
spec
->
inv_eapd
)
eapd
=
!
eapd
;
if
(
eapd
==
spec
->
cur_eapd
)
return
0
;
...
...
@@ -705,7 +704,7 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
.
info
=
ad198x_eapd_info
,
.
get
=
ad198x_eapd_get
,
.
put
=
ad198x_eapd_put
,
.
private_value
=
0x1b
|
(
1
<<
8
),
/* port-D, inversed
*/
.
private_value
=
0x1b
,
/* port-D
*/
},
{
}
/* end */
};
...
...
@@ -1074,6 +1073,7 @@ static int patch_ad1986a(struct hda_codec *codec)
spec
->
loopback
.
amplist
=
ad1986a_loopbacks
;
#endif
spec
->
vmaster_nid
=
0x1b
;
spec
->
inv_eapd
=
1
;
/* AD1986A has the inverted EAPD implementation */
codec
->
patch_ops
=
ad198x_patch_ops
;
...
...
@@ -2124,7 +2124,7 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = {
.
info
=
ad198x_eapd_info
,
.
get
=
ad198x_eapd_get
,
.
put
=
ad198x_eapd_put
,
.
private_value
=
0x12
|
(
1
<<
8
),
/* port-D, inversed
*/
.
private_value
=
0x12
,
/* port-D
*/
},
{
}
/* end */
...
...
@@ -3065,6 +3065,7 @@ static int patch_ad1988(struct hda_codec *codec)
spec
->
input_mux
=
&
ad1988_laptop_capture_source
;
spec
->
num_mixers
=
1
;
spec
->
mixers
[
0
]
=
ad1988_laptop_mixers
;
spec
->
inv_eapd
=
1
;
/* inverted EAPD */
spec
->
num_init_verbs
=
1
;
spec
->
init_verbs
[
0
]
=
ad1988_laptop_init_verbs
;
if
(
board_config
==
AD1988_LAPTOP_DIG
)
...
...
sound/pci/hda/patch_realtek.c
View file @
8a746906
...
...
@@ -208,6 +208,7 @@ enum {
ALC885_MBP3
,
ALC885_MB5
,
ALC885_IMAC24
,
ALC885_IMAC91
,
ALC883_3ST_2ch_DIG
,
ALC883_3ST_6ch_DIG
,
ALC883_3ST_6ch
,
...
...
@@ -2400,6 +2401,8 @@ static const char *alc_slave_sws[] = {
"Speaker Playback Switch"
,
"Mono Playback Switch"
,
"IEC958 Playback Switch"
,
"Line-Out Playback Switch"
,
"PCM Playback Switch"
,
NULL
,
};
...
...
@@ -7050,6 +7053,20 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = {
{
}
/* end */
};
static
struct
snd_kcontrol_new
alc885_imac91_mixer
[]
=
{
HDA_CODEC_VOLUME
(
"Line-Out Playback Volume"
,
0x0c
,
0x00
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"Line-Out Playback Switch"
,
0x0c
,
0x02
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Speaker Playback Switch"
,
0x14
,
0x00
,
HDA_OUTPUT
),
HDA_CODEC_VOLUME
(
"Speaker Playback Volume"
,
0x0d
,
0x00
,
HDA_OUTPUT
),
HDA_CODEC_VOLUME
(
"Line Playback Volume"
,
0x0b
,
0x02
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Line Playback Switch"
,
0x0b
,
0x02
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Mic Playback Volume"
,
0x0b
,
0x00
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Mic Playback Switch"
,
0x0b
,
0x00
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Mic Boost"
,
0x18
,
0x00
,
HDA_INPUT
),
{
}
/* end */
};
static
struct
snd_kcontrol_new
alc882_w2jc_mixer
[]
=
{
HDA_CODEC_VOLUME
(
"Front Playback Volume"
,
0x0c
,
0x0
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"Front Playback Switch"
,
0x0c
,
2
,
HDA_INPUT
),
...
...
@@ -7505,6 +7522,66 @@ static struct hda_verb alc885_mbp3_init_verbs[] = {
{
}
};
/* iMac 9,1 */
static
struct
hda_verb
alc885_imac91_init_verbs
[]
=
{
/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
{
0x0c
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_ZERO
},
{
0x0c
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x0c
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
1
)},
/* Rear mixer */
{
0x0d
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_ZERO
},
{
0x0d
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x0d
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
1
)},
/* HP Pin: output 0 (0x0c) */
{
0x14
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
},
{
0x14
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x14
,
AC_VERB_SET_CONNECT_SEL
,
0x00
},
{
0x14
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
ALC880_HP_EVENT
|
AC_USRSP_EN
},
/* Internal Speakers: output 0 (0x0d) */
{
0x15
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
},
{
0x15
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
{
0x15
,
AC_VERB_SET_CONNECT_SEL
,
0x00
},
/* Mic (rear) pin: input vref at 80% */
{
0x18
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
{
0x18
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
/* Front Mic pin: input vref at 80% */
{
0x19
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
{
0x19
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
/* Line In pin: use output 1 when in LineOut mode */
{
0x1a
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x1a
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
{
0x1a
,
AC_VERB_SET_CONNECT_SEL
,
0x01
},
/* FIXME: use matrix-type input source selection */
/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
{
0x24
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
0
)},
{
0x24
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
3
)},
{
0x24
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
2
)},
{
0x24
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
4
)},
/* Input mixer2 */
{
0x23
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
0
)},
{
0x23
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
3
)},
{
0x23
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
2
)},
{
0x23
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
4
)},
/* Input mixer3 */
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
0
)},
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
3
)},
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
2
)},
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
4
)},
/* ADC1: mute amp left and right */
{
0x07
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x07
,
AC_VERB_SET_CONNECT_SEL
,
0x00
},
/* ADC2: mute amp left and right */
{
0x08
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x08
,
AC_VERB_SET_CONNECT_SEL
,
0x00
},
/* ADC3: mute amp left and right */
{
0x09
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x09
,
AC_VERB_SET_CONNECT_SEL
,
0x00
},
{
}
};
/* iMac 24 mixer. */
static
struct
snd_kcontrol_new
alc885_imac24_mixer
[]
=
{
HDA_CODEC_VOLUME
(
"Master Playback Volume"
,
0x0c
,
0x00
,
HDA_OUTPUT
),
...
...
@@ -7551,6 +7628,26 @@ static void alc885_mbp3_setup(struct hda_codec *codec)
spec
->
autocfg
.
speaker_pins
[
0
]
=
0x14
;
}
static
void
alc885_imac91_automute
(
struct
hda_codec
*
codec
)
{
unsigned
int
present
;
present
=
snd_hda_codec_read
(
codec
,
0x14
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
)
&
0x80000000
;
snd_hda_codec_amp_stereo
(
codec
,
0x15
,
HDA_OUTPUT
,
0
,
HDA_AMP_MUTE
,
present
?
HDA_AMP_MUTE
:
0
);
snd_hda_codec_amp_stereo
(
codec
,
0x1a
,
HDA_OUTPUT
,
0
,
HDA_AMP_MUTE
,
present
?
HDA_AMP_MUTE
:
0
);
}
static
void
alc885_imac91_unsol_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
{
/* Headphone insertion or removal. */
if
((
res
>>
26
)
==
ALC880_HP_EVENT
)
alc885_imac91_automute
(
codec
);
}
static
struct
hda_verb
alc882_targa_verbs
[]
=
{
{
0x0c
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
0
)},
...
...
@@ -8718,6 +8815,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = {
[
ALC885_MB5
]
=
"mb5"
,
[
ALC885_MBP3
]
=
"mbp3"
,
[
ALC885_IMAC24
]
=
"imac24"
,
[
ALC885_IMAC91
]
=
"imac91"
,
[
ALC883_3ST_2ch_DIG
]
=
"3stack-2ch-dig"
,
[
ALC883_3ST_6ch_DIG
]
=
"3stack-6ch-dig"
,
[
ALC883_3ST_6ch
]
=
"3stack-6ch"
,
...
...
@@ -8891,6 +8989,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x106b
,
0x3600
,
"Macbook 3,1"
,
ALC889A_MB31
),
SND_PCI_QUIRK
(
0x106b
,
0x3800
,
"MacbookPro 4,1"
,
ALC885_MBP3
),
SND_PCI_QUIRK
(
0x106b
,
0x3e00
,
"iMac 24 Aluminum"
,
ALC885_IMAC24
),
SND_PCI_QUIRK
(
0x106b
,
0x4900
,
"iMac 9,1 Aluminum"
,
ALC885_IMAC91
),
SND_PCI_QUIRK
(
0x106b
,
0x3f00
,
"Macbook 5,1"
,
ALC885_MB5
),
/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
* so apparently no perfect solution yet
...
...
@@ -9002,6 +9101,20 @@ static struct alc_config_preset alc882_presets[] = {
.
setup
=
alc885_imac24_setup
,
.
init_hook
=
alc885_imac24_init_hook
,
},
[
ALC885_IMAC91
]
=
{
.
mixers
=
{
alc885_imac91_mixer
,
alc882_chmode_mixer
},
.
init_verbs
=
{
alc885_imac91_init_verbs
,
alc880_gpio1_init_verbs
},
.
num_dacs
=
ARRAY_SIZE
(
alc882_dac_nids
),
.
dac_nids
=
alc882_dac_nids
,
.
channel_mode
=
alc885_mbp_4ch_modes
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc885_mbp_4ch_modes
),
.
input_mux
=
&
alc882_capture_source
,
.
dig_out_nid
=
ALC882_DIGOUT_NID
,
.
dig_in_nid
=
ALC882_DIGIN_NID
,
.
unsol_event
=
alc885_imac91_unsol_event
,
.
init_hook
=
alc885_imac91_automute
,
},
[
ALC882_TARGA
]
=
{
.
mixers
=
{
alc882_targa_mixer
,
alc882_chmode_mixer
},
.
init_verbs
=
{
alc882_base_init_verbs
,
alc882_adc1_init_verbs
,
...
...
@@ -9908,10 +10021,12 @@ static int patch_alc882(struct hda_codec *codec)
spec
->
init_amp
=
ALC_INIT_DEFAULT
;
/* always initialize */
if
(
!
spec
->
adc_nids
&&
spec
->
input_mux
)
{
int
i
;
int
i
,
j
;
spec
->
num_adc_nids
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
alc882_adc_nids
);
i
++
)
{
const
struct
hda_input_mux
*
imux
=
spec
->
input_mux
;
hda_nid_t
cap
;
hda_nid_t
items
[
16
];
hda_nid_t
nid
=
alc882_adc_nids
[
i
];
unsigned
int
wcap
=
get_wcaps
(
codec
,
nid
);
/* get type */
...
...
@@ -9922,6 +10037,15 @@ static int patch_alc882(struct hda_codec *codec)
err
=
snd_hda_get_connections
(
codec
,
nid
,
&
cap
,
1
);
if
(
err
<
0
)
continue
;
err
=
snd_hda_get_connections
(
codec
,
cap
,
items
,
ARRAY_SIZE
(
items
));
if
(
err
<
0
)
continue
;
for
(
j
=
0
;
j
<
imux
->
num_items
;
j
++
)
if
(
imux
->
items
[
j
].
index
>=
err
)
break
;
if
(
j
<
imux
->
num_items
)
continue
;
spec
->
private_capsrc_nids
[
spec
->
num_adc_nids
]
=
cap
;
spec
->
num_adc_nids
++
;
}
...
...
@@ -16846,6 +16970,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
ALC662_3ST_6ch_DIG
),
SND_PCI_QUIRK_MASK
(
0x1854
,
0xf000
,
0x2000
,
"ASUS H13-200x"
,
ALC663_ASUS_H13
),
SND_PCI_QUIRK
(
0x8086
,
0xd604
,
"Intel mobo"
,
ALC662_3ST_2ch_DIG
),
{}
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment