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
Kirill Smelkov
linux
Commits
6321bd63
Commit
6321bd63
authored
Jan 18, 2010
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fix/hda' into for-linus
parents
808c569f
eaa9b3a7
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
128 additions
and
27 deletions
+128
-27
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+83
-11
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+45
-16
No files found.
sound/pci/hda/patch_realtek.c
View file @
6321bd63
...
...
@@ -1230,6 +1230,8 @@ static void alc_init_auto_mic(struct hda_codec *codec)
return
;
/* invalid entry */
}
}
if
(
!
ext
||
!
fixed
)
return
;
if
(
!
(
get_wcaps
(
codec
,
ext
)
&
AC_WCAP_UNSOL_CAP
))
return
;
/* no unsol support */
snd_printdd
(
"realtek: Enable auto-mic switch on NID 0x%x/0x%x
\n
"
,
...
...
@@ -4812,6 +4814,49 @@ static void fixup_automic_adc(struct hda_codec *codec)
spec
->
auto_mic
=
0
;
/* disable auto-mic to be sure */
}
/* choose the ADC/MUX containing the input pin and initialize the setup */
static
void
fixup_single_adc
(
struct
hda_codec
*
codec
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
hda_nid_t
pin
;
int
i
;
/* search for the input pin; there must be only one */
for
(
i
=
0
;
i
<
AUTO_PIN_LAST
;
i
++
)
{
if
(
spec
->
autocfg
.
input_pins
[
i
])
{
pin
=
spec
->
autocfg
.
input_pins
[
i
];
break
;
}
}
if
(
!
pin
)
return
;
/* set the default connection to that pin */
for
(
i
=
0
;
i
<
spec
->
num_adc_nids
;
i
++
)
{
hda_nid_t
cap
=
spec
->
capsrc_nids
?
spec
->
capsrc_nids
[
i
]
:
spec
->
adc_nids
[
i
];
int
idx
;
idx
=
get_connection_index
(
codec
,
cap
,
pin
);
if
(
idx
<
0
)
continue
;
/* use only this ADC */
if
(
spec
->
capsrc_nids
)
spec
->
capsrc_nids
+=
i
;
spec
->
adc_nids
+=
i
;
spec
->
num_adc_nids
=
1
;
/* select or unmute this route */
if
(
get_wcaps_type
(
get_wcaps
(
codec
,
cap
))
==
AC_WID_AUD_MIX
)
{
snd_hda_codec_amp_stereo
(
codec
,
cap
,
HDA_INPUT
,
idx
,
HDA_AMP_MUTE
,
0
);
}
else
{
snd_hda_codec_write_cache
(
codec
,
cap
,
0
,
AC_VERB_SET_CONNECT_SEL
,
idx
);
}
return
;
}
}
static
void
set_capture_mixer
(
struct
hda_codec
*
codec
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
...
...
@@ -4824,14 +4869,15 @@ static void set_capture_mixer(struct hda_codec *codec)
alc_capture_mixer3
},
};
if
(
spec
->
num_adc_nids
>
0
&&
spec
->
num_adc_nids
<=
3
)
{
int
mux
;
if
(
spec
->
auto_mic
)
{
mux
=
0
;
int
mux
=
0
;
if
(
spec
->
auto_mic
)
fixup_automic_adc
(
codec
);
}
else
if
(
spec
->
input_mux
&&
spec
->
input_mux
->
num_items
>
1
)
mux
=
1
;
else
mux
=
0
;
else
if
(
spec
->
input_mux
)
{
if
(
spec
->
input_mux
->
num_items
>
1
)
mux
=
1
;
else
if
(
spec
->
input_mux
->
num_items
==
1
)
fixup_single_adc
(
codec
);
}
spec
->
cap_mixer
=
caps
[
mux
][
spec
->
num_adc_nids
-
1
];
}
}
...
...
@@ -7094,8 +7140,8 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = {
HDA_BIND_MUTE
(
"Surround Playback Switch"
,
0x0d
,
0x02
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"LFE Playback Volume"
,
0x0e
,
0x00
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"LFE Playback Switch"
,
0x0e
,
0x02
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"H
P
Playback Volume"
,
0x0f
,
0x00
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"H
P
Playback Switch"
,
0x0f
,
0x02
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"H
eadphone
Playback Volume"
,
0x0f
,
0x00
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"H
eadphone
Playback Switch"
,
0x0f
,
0x02
,
HDA_INPUT
),
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
,
0x01
,
HDA_INPUT
),
...
...
@@ -7496,6 +7542,7 @@ static struct hda_verb alc885_mb5_init_verbs[] = {
{
0x14
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
},
{
0x14
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x14
,
AC_VERB_SET_CONNECT_SEL
,
0x03
},
{
0x14
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
ALC880_HP_EVENT
|
AC_USRSP_EN
},
/* 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
},
...
...
@@ -7680,6 +7727,27 @@ static void alc885_mbp3_setup(struct hda_codec *codec)
spec
->
autocfg
.
speaker_pins
[
0
]
=
0x14
;
}
static
void
alc885_mb5_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
,
0x18
,
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_mb5_unsol_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
{
/* Headphone insertion or removal. */
if
((
res
>>
26
)
==
ALC880_HP_EVENT
)
alc885_mb5_automute
(
codec
);
}
static
void
alc885_imac91_automute
(
struct
hda_codec
*
codec
)
{
unsigned
int
present
;
...
...
@@ -9126,6 +9194,8 @@ static struct alc_config_preset alc882_presets[] = {
.
input_mux
=
&
mb5_capture_source
,
.
dig_out_nid
=
ALC882_DIGOUT_NID
,
.
dig_in_nid
=
ALC882_DIGIN_NID
,
.
unsol_event
=
alc885_mb5_unsol_event
,
.
init_hook
=
alc885_mb5_automute
,
},
[
ALC885_MACPRO
]
=
{
.
mixers
=
{
alc882_macpro_mixer
},
...
...
@@ -11179,7 +11249,7 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
}
#define alc262_auto_create_input_ctls \
alc88
0
_auto_create_input_ctls
alc88
2
_auto_create_input_ctls
/*
* generic initialization of ADC, input mixers and output mixers
...
...
@@ -14855,6 +14925,8 @@ static int patch_alc861(struct hda_codec *codec)
spec
->
stream_digital_playback
=
&
alc861_pcm_digital_playback
;
spec
->
stream_digital_capture
=
&
alc861_pcm_digital_capture
;
if
(
!
spec
->
cap_mixer
)
set_capture_mixer
(
codec
);
set_beep_amp
(
spec
,
0x23
,
0
,
HDA_OUTPUT
);
spec
->
vmaster_nid
=
0x03
;
...
...
@@ -17251,7 +17323,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x105b
,
0x0cd6
,
"Foxconn"
,
ALC662_ECS
),
SND_PCI_QUIRK
(
0x105b
,
0x0d47
,
"Foxconn 45CMX/45GMX/45CMX-K"
,
ALC662_3ST_6ch_DIG
),
SND_PCI_QUIRK
(
0x1179
,
0xff6e
,
"Toshiba NB20
0"
,
ALC663_ASUS_MODE4
),
SND_PCI_QUIRK
(
0x1179
,
0xff6e
,
"Toshiba NB20
x"
,
ALC662_AUTO
),
SND_PCI_QUIRK
(
0x144d
,
0xca00
,
"Samsung NC10"
,
ALC272_SAMSUNG_NC10
),
SND_PCI_QUIRK
(
0x1458
,
0xa002
,
"Gigabyte 945GCM-S2L"
,
ALC662_3ST_6ch_DIG
),
...
...
sound/pci/hda/patch_sigmatel.c
View file @
6321bd63
...
...
@@ -4730,6 +4730,26 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
}
}
static
int
hp_blike_system
(
u32
subsystem_id
);
static
void
set_hp_led_gpio
(
struct
hda_codec
*
codec
)
{
struct
sigmatel_spec
*
spec
=
codec
->
spec
;
switch
(
codec
->
vendor_id
)
{
case
0x111d7608
:
/* GPIO 0 */
spec
->
gpio_led
=
0x01
;
break
;
case
0x111d7600
:
case
0x111d7601
:
case
0x111d7602
:
case
0x111d7603
:
/* GPIO 3 */
spec
->
gpio_led
=
0x08
;
break
;
}
}
/*
* This method searches for the mute LED GPIO configuration
* provided as OEM string in SMBIOS. The format of that string
...
...
@@ -4741,6 +4761,14 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
*
* So, HP B-series like systems may have HP_Mute_LED_0 (current models)
* or HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
*
*
* The dv-series laptops don't seem to have the HP_Mute_LED* strings in
* SMBIOS - at least the ones I have seen do not have them - which include
* my own system (HP Pavilion dv6-1110ax) and my cousin's
* HP Pavilion dv9500t CTO.
* Need more information on whether it is true across the entire series.
* -- kunal
*/
static
int
find_mute_led_gpio
(
struct
hda_codec
*
codec
)
{
...
...
@@ -4751,28 +4779,27 @@ static int find_mute_led_gpio(struct hda_codec *codec)
while
((
dev
=
dmi_find_device
(
DMI_DEV_TYPE_OEM_STRING
,
NULL
,
dev
)))
{
if
(
sscanf
(
dev
->
name
,
"HP_Mute_LED_%d_%d"
,
&
spec
->
gpio_led_polarity
,
&
spec
->
gpio_led
)
==
2
)
{
&
spec
->
gpio_led_polarity
,
&
spec
->
gpio_led
)
==
2
)
{
spec
->
gpio_led
=
1
<<
spec
->
gpio_led
;
return
1
;
}
if
(
sscanf
(
dev
->
name
,
"HP_Mute_LED_%d"
,
&
spec
->
gpio_led_polarity
)
==
1
)
{
switch
(
codec
->
vendor_id
)
{
case
0x111d7608
:
/* GPIO 0 */
spec
->
gpio_led
=
0x01
;
return
1
;
case
0x111d7600
:
case
0x111d7601
:
case
0x111d7602
:
case
0x111d7603
:
/* GPIO 3 */
spec
->
gpio_led
=
0x08
;
return
1
;
}
&
spec
->
gpio_led_polarity
)
==
1
)
{
set_hp_led_gpio
(
codec
);
return
1
;
}
}
/*
* Fallback case - if we don't find the DMI strings,
* we statically set the GPIO - if not a B-series system.
*/
if
(
!
hp_blike_system
(
codec
->
subsystem_id
))
{
set_hp_led_gpio
(
codec
);
spec
->
gpio_led_polarity
=
1
;
return
1
;
}
}
return
0
;
}
...
...
@@ -5548,6 +5575,8 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
spec
->
num_dmuxes
=
ARRAY_SIZE
(
stac92hd71bxx_dmux_nids
);
spec
->
num_smuxes
=
stac92hd71bxx_connected_smuxes
(
codec
,
0x1e
);
snd_printdd
(
"Found board config: %d
\n
"
,
spec
->
board_config
);
switch
(
spec
->
board_config
)
{
case
STAC_HP_M4
:
/* enable internal microphone */
...
...
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