Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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