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
a6c56f61
Commit
a6c56f61
authored
Dec 21, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fix/hda' into for-linus
parents
55639353
de8853bc
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
391 additions
and
37 deletions
+391
-37
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_conexant.c
+37
-6
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+354
-31
No files found.
sound/pci/hda/patch_conexant.c
View file @
a6c56f61
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
#include "hda_codec.h"
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_local.h"
#include "hda_beep.h"
#define CXT_PIN_DIR_IN 0x00
#define CXT_PIN_DIR_IN 0x00
#define CXT_PIN_DIR_OUT 0x01
#define CXT_PIN_DIR_OUT 0x01
...
@@ -111,6 +112,7 @@ struct conexant_spec {
...
@@ -111,6 +112,7 @@ struct conexant_spec {
unsigned
int
dell_automute
;
unsigned
int
dell_automute
;
unsigned
int
port_d_mode
;
unsigned
int
port_d_mode
;
unsigned
char
ext_mic_bias
;
unsigned
char
ext_mic_bias
;
unsigned
int
dell_vostro
;
};
};
static
int
conexant_playback_pcm_open
(
struct
hda_pcm_stream
*
hinfo
,
static
int
conexant_playback_pcm_open
(
struct
hda_pcm_stream
*
hinfo
,
...
@@ -476,6 +478,7 @@ static void conexant_free(struct hda_codec *codec)
...
@@ -476,6 +478,7 @@ static void conexant_free(struct hda_codec *codec)
snd_array_free
(
&
spec
->
jacks
);
snd_array_free
(
&
spec
->
jacks
);
}
}
#endif
#endif
snd_hda_detach_beep_device
(
codec
);
kfree
(
codec
->
spec
);
kfree
(
codec
->
spec
);
}
}
...
@@ -2109,9 +2112,12 @@ static int cxt5066_mic_boost_mux_enum_get(struct snd_kcontrol *kcontrol,
...
@@ -2109,9 +2112,12 @@ static int cxt5066_mic_boost_mux_enum_get(struct snd_kcontrol *kcontrol,
{
{
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
int
val
;
int
val
;
hda_nid_t
nid
=
kcontrol
->
private_value
&
0xff
;
int
inout
=
(
kcontrol
->
private_value
&
0x100
)
?
AC_AMP_GET_INPUT
:
AC_AMP_GET_OUTPUT
;
val
=
snd_hda_codec_read
(
codec
,
0x17
,
0
,
val
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_AMP_GAIN_MUTE
,
AC_AMP_GET_OUTPUT
);
AC_VERB_GET_AMP_GAIN_MUTE
,
inout
);
ucontrol
->
value
.
enumerated
.
item
[
0
]
=
val
&
AC_AMP_GAIN
;
ucontrol
->
value
.
enumerated
.
item
[
0
]
=
val
&
AC_AMP_GAIN
;
return
0
;
return
0
;
...
@@ -2123,6 +2129,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
...
@@ -2123,6 +2129,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
hda_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
const
struct
hda_input_mux
*
imux
=
&
cxt5066_analog_mic_boost
;
const
struct
hda_input_mux
*
imux
=
&
cxt5066_analog_mic_boost
;
unsigned
int
idx
;
unsigned
int
idx
;
hda_nid_t
nid
=
kcontrol
->
private_value
&
0xff
;
int
inout
=
(
kcontrol
->
private_value
&
0x100
)
?
AC_AMP_SET_INPUT
:
AC_AMP_SET_OUTPUT
;
if
(
!
imux
->
num_items
)
if
(
!
imux
->
num_items
)
return
0
;
return
0
;
...
@@ -2130,9 +2139,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
...
@@ -2130,9 +2139,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
if
(
idx
>=
imux
->
num_items
)
if
(
idx
>=
imux
->
num_items
)
idx
=
imux
->
num_items
-
1
;
idx
=
imux
->
num_items
-
1
;
snd_hda_codec_write_cache
(
codec
,
0x17
,
0
,
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AC_AMP_SET_RIGHT
|
AC_AMP_SET_LEFT
|
AC_AMP_SET_OUTPUT
|
AC_AMP_SET_RIGHT
|
AC_AMP_SET_LEFT
|
inout
|
imux
->
items
[
idx
].
index
);
imux
->
items
[
idx
].
index
);
return
1
;
return
1
;
...
@@ -2201,10 +2210,11 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
...
@@ -2201,10 +2210,11 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
{
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
"
Analog
Mic Boost Capture Enum"
,
.
name
=
"
Ext
Mic Boost Capture Enum"
,
.
info
=
cxt5066_mic_boost_mux_enum_info
,
.
info
=
cxt5066_mic_boost_mux_enum_info
,
.
get
=
cxt5066_mic_boost_mux_enum_get
,
.
get
=
cxt5066_mic_boost_mux_enum_get
,
.
put
=
cxt5066_mic_boost_mux_enum_put
,
.
put
=
cxt5066_mic_boost_mux_enum_put
,
.
private_value
=
0x17
,
},
},
HDA_BIND_VOL
(
"Capture Volume"
,
&
cxt5066_bind_capture_vol_others
),
HDA_BIND_VOL
(
"Capture Volume"
,
&
cxt5066_bind_capture_vol_others
),
...
@@ -2212,6 +2222,19 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
...
@@ -2212,6 +2222,19 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
{}
{}
};
};
static
struct
snd_kcontrol_new
cxt5066_vostro_mixers
[]
=
{
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
"Int Mic Boost Capture Enum"
,
.
info
=
cxt5066_mic_boost_mux_enum_info
,
.
get
=
cxt5066_mic_boost_mux_enum_get
,
.
put
=
cxt5066_mic_boost_mux_enum_put
,
.
private_value
=
0x23
|
0x100
,
},
HDA_CODEC_VOLUME_MONO
(
"Beep Playback Volume"
,
0x13
,
1
,
0x0
,
HDA_OUTPUT
),
{}
};
static
struct
hda_verb
cxt5066_init_verbs
[]
=
{
static
struct
hda_verb
cxt5066_init_verbs
[]
=
{
{
0x1a
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
/* Port B */
{
0x1a
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
/* Port B */
{
0x1b
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
/* Port C */
{
0x1b
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
/* Port C */
...
@@ -2397,11 +2420,16 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = {
...
@@ -2397,11 +2420,16 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = {
/* initialize jack-sensing, too */
/* initialize jack-sensing, too */
static
int
cxt5066_init
(
struct
hda_codec
*
codec
)
static
int
cxt5066_init
(
struct
hda_codec
*
codec
)
{
{
struct
conexant_spec
*
spec
=
codec
->
spec
;
snd_printdd
(
"CXT5066: init
\n
"
);
snd_printdd
(
"CXT5066: init
\n
"
);
conexant_init
(
codec
);
conexant_init
(
codec
);
if
(
codec
->
patch_ops
.
unsol_event
)
{
if
(
codec
->
patch_ops
.
unsol_event
)
{
cxt5066_hp_automute
(
codec
);
cxt5066_hp_automute
(
codec
);
cxt5066_automic
(
codec
);
if
(
spec
->
dell_vostro
)
cxt5066_vostro_automic
(
codec
);
else
cxt5066_automic
(
codec
);
}
}
return
0
;
return
0
;
}
}
...
@@ -2500,7 +2528,10 @@ static int patch_cxt5066(struct hda_codec *codec)
...
@@ -2500,7 +2528,10 @@ static int patch_cxt5066(struct hda_codec *codec)
spec
->
init_verbs
[
0
]
=
cxt5066_init_verbs_vostro
;
spec
->
init_verbs
[
0
]
=
cxt5066_init_verbs_vostro
;
spec
->
mixers
[
spec
->
num_mixers
++
]
=
cxt5066_mixer_master_olpc
;
spec
->
mixers
[
spec
->
num_mixers
++
]
=
cxt5066_mixer_master_olpc
;
spec
->
mixers
[
spec
->
num_mixers
++
]
=
cxt5066_mixers
;
spec
->
mixers
[
spec
->
num_mixers
++
]
=
cxt5066_mixers
;
spec
->
mixers
[
spec
->
num_mixers
++
]
=
cxt5066_vostro_mixers
;
spec
->
port_d_mode
=
0
;
spec
->
port_d_mode
=
0
;
spec
->
dell_vostro
=
1
;
snd_hda_attach_beep_device
(
codec
,
0x13
);
/* no S/PDIF out */
/* no S/PDIF out */
spec
->
multiout
.
dig_out_nid
=
0
;
spec
->
multiout
.
dig_out_nid
=
0
;
...
...
sound/pci/hda/patch_realtek.c
View file @
a6c56f61
...
@@ -131,8 +131,8 @@ enum {
...
@@ -131,8 +131,8 @@ enum {
enum
{
enum
{
ALC269_BASIC
,
ALC269_BASIC
,
ALC269_QUANTA_FL1
,
ALC269_QUANTA_FL1
,
ALC269_ASUS_
EEEPC_P703
,
ALC269_ASUS_
AMIC
,
ALC269_ASUS_
EEEPC_P901
,
ALC269_ASUS_
DMIC
,
ALC269_FUJITSU
,
ALC269_FUJITSU
,
ALC269_LIFEBOOK
,
ALC269_LIFEBOOK
,
ALC269_AUTO
,
ALC269_AUTO
,
...
@@ -188,6 +188,8 @@ enum {
...
@@ -188,6 +188,8 @@ enum {
ALC663_ASUS_MODE4
,
ALC663_ASUS_MODE4
,
ALC663_ASUS_MODE5
,
ALC663_ASUS_MODE5
,
ALC663_ASUS_MODE6
,
ALC663_ASUS_MODE6
,
ALC663_ASUS_MODE7
,
ALC663_ASUS_MODE8
,
ALC272_DELL
,
ALC272_DELL
,
ALC272_DELL_ZM1
,
ALC272_DELL_ZM1
,
ALC272_SAMSUNG_NC10
,
ALC272_SAMSUNG_NC10
,
...
@@ -335,6 +337,9 @@ struct alc_spec {
...
@@ -335,6 +337,9 @@ struct alc_spec {
/* hooks */
/* hooks */
void
(
*
init_hook
)(
struct
hda_codec
*
codec
);
void
(
*
init_hook
)(
struct
hda_codec
*
codec
);
void
(
*
unsol_event
)(
struct
hda_codec
*
codec
,
unsigned
int
res
);
void
(
*
unsol_event
)(
struct
hda_codec
*
codec
,
unsigned
int
res
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
void
(
*
power_hook
)(
struct
hda_codec
*
codec
,
int
power
);
#endif
/* for pin sensing */
/* for pin sensing */
unsigned
int
sense_updated
:
1
;
unsigned
int
sense_updated
:
1
;
...
@@ -386,6 +391,7 @@ struct alc_config_preset {
...
@@ -386,6 +391,7 @@ struct alc_config_preset {
void
(
*
init_hook
)(
struct
hda_codec
*
);
void
(
*
init_hook
)(
struct
hda_codec
*
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
#ifdef CONFIG_SND_HDA_POWER_SAVE
struct
hda_amp_list
*
loopbacks
;
struct
hda_amp_list
*
loopbacks
;
void
(
*
power_hook
)(
struct
hda_codec
*
codec
,
int
power
);
#endif
#endif
};
};
...
@@ -898,6 +904,7 @@ static void setup_preset(struct hda_codec *codec,
...
@@ -898,6 +904,7 @@ static void setup_preset(struct hda_codec *codec,
spec
->
unsol_event
=
preset
->
unsol_event
;
spec
->
unsol_event
=
preset
->
unsol_event
;
spec
->
init_hook
=
preset
->
init_hook
;
spec
->
init_hook
=
preset
->
init_hook
;
#ifdef CONFIG_SND_HDA_POWER_SAVE
#ifdef CONFIG_SND_HDA_POWER_SAVE
spec
->
power_hook
=
preset
->
power_hook
;
spec
->
loopback
.
amplist
=
preset
->
loopbacks
;
spec
->
loopback
.
amplist
=
preset
->
loopbacks
;
#endif
#endif
...
@@ -1663,9 +1670,6 @@ static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
...
@@ -1663,9 +1670,6 @@ static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
/* some bit here disables the other DACs. Init=0x4900 */
/* some bit here disables the other DACs. Init=0x4900 */
{
0x20
,
AC_VERB_SET_COEF_INDEX
,
0x08
},
{
0x20
,
AC_VERB_SET_COEF_INDEX
,
0x08
},
{
0x20
,
AC_VERB_SET_PROC_COEF
,
0x0000
},
{
0x20
,
AC_VERB_SET_PROC_COEF
,
0x0000
},
/* Enable amplifiers */
{
0x14
,
AC_VERB_SET_EAPD_BTLENABLE
,
0x02
},
{
0x15
,
AC_VERB_SET_EAPD_BTLENABLE
,
0x02
},
/* DMIC fix
/* DMIC fix
* This laptop has a stereo digital microphone. The mics are only 1cm apart
* This laptop has a stereo digital microphone. The mics are only 1cm apart
* which makes the stereo useless. However, either the mic or the ALC889
* which makes the stereo useless. However, either the mic or the ALC889
...
@@ -1778,6 +1782,25 @@ static struct snd_kcontrol_new alc888_base_mixer[] = {
...
@@ -1778,6 +1782,25 @@ static struct snd_kcontrol_new alc888_base_mixer[] = {
{
}
/* end */
{
}
/* end */
};
};
static
struct
snd_kcontrol_new
alc889_acer_aspire_8930g_mixer
[]
=
{
HDA_CODEC_VOLUME
(
"Front Playback Volume"
,
0x0c
,
0x0
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"Front Playback Switch"
,
0x0c
,
2
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Surround Playback Volume"
,
0x0d
,
0x0
,
HDA_OUTPUT
),
HDA_BIND_MUTE
(
"Surround Playback Switch"
,
0x0d
,
2
,
HDA_INPUT
),
HDA_CODEC_VOLUME_MONO
(
"Center Playback Volume"
,
0x0e
,
1
,
0x0
,
HDA_OUTPUT
),
HDA_CODEC_VOLUME_MONO
(
"LFE Playback Volume"
,
0x0e
,
2
,
0x0
,
HDA_OUTPUT
),
HDA_BIND_MUTE_MONO
(
"Center Playback Switch"
,
0x0e
,
1
,
2
,
HDA_INPUT
),
HDA_BIND_MUTE_MONO
(
"LFE Playback Switch"
,
0x0e
,
2
,
2
,
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
,
0x0
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Mic Boost"
,
0x18
,
0
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Mic Playback Switch"
,
0x0b
,
0x0
,
HDA_INPUT
),
{
}
/* end */
};
static
void
alc888_acer_aspire_4930g_setup
(
struct
hda_codec
*
codec
)
static
void
alc888_acer_aspire_4930g_setup
(
struct
hda_codec
*
codec
)
{
{
struct
alc_spec
*
spec
=
codec
->
spec
;
struct
alc_spec
*
spec
=
codec
->
spec
;
...
@@ -1808,6 +1831,16 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
...
@@ -1808,6 +1831,16 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
spec
->
autocfg
.
speaker_pins
[
2
]
=
0x1b
;
spec
->
autocfg
.
speaker_pins
[
2
]
=
0x1b
;
}
}
#ifdef CONFIG_SND_HDA_POWER_SAVE
static
void
alc889_power_eapd
(
struct
hda_codec
*
codec
,
int
power
)
{
snd_hda_codec_write
(
codec
,
0x14
,
0
,
AC_VERB_SET_EAPD_BTLENABLE
,
power
?
2
:
0
);
snd_hda_codec_write
(
codec
,
0x15
,
0
,
AC_VERB_SET_EAPD_BTLENABLE
,
power
?
2
:
0
);
}
#endif
/*
/*
* ALC880 3-stack model
* ALC880 3-stack model
*
*
...
@@ -3601,12 +3634,29 @@ static void alc_free(struct hda_codec *codec)
...
@@ -3601,12 +3634,29 @@ static void alc_free(struct hda_codec *codec)
snd_hda_detach_beep_device
(
codec
);
snd_hda_detach_beep_device
(
codec
);
}
}
#ifdef CONFIG_SND_HDA_POWER_SAVE
static
int
alc_suspend
(
struct
hda_codec
*
codec
,
pm_message_t
state
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
if
(
spec
&&
spec
->
power_hook
)
spec
->
power_hook
(
codec
,
0
);
return
0
;
}
#endif
#ifdef SND_HDA_NEEDS_RESUME
#ifdef SND_HDA_NEEDS_RESUME
static
int
alc_resume
(
struct
hda_codec
*
codec
)
static
int
alc_resume
(
struct
hda_codec
*
codec
)
{
{
#ifdef CONFIG_SND_HDA_POWER_SAVE
struct
alc_spec
*
spec
=
codec
->
spec
;
#endif
codec
->
patch_ops
.
init
(
codec
);
codec
->
patch_ops
.
init
(
codec
);
snd_hda_codec_resume_amp
(
codec
);
snd_hda_codec_resume_amp
(
codec
);
snd_hda_codec_resume_cache
(
codec
);
snd_hda_codec_resume_cache
(
codec
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
if
(
spec
&&
spec
->
power_hook
)
spec
->
power_hook
(
codec
,
1
);
#endif
return
0
;
return
0
;
}
}
#endif
#endif
...
@@ -3623,6 +3673,7 @@ static struct hda_codec_ops alc_patch_ops = {
...
@@ -3623,6 +3673,7 @@ static struct hda_codec_ops alc_patch_ops = {
.
resume
=
alc_resume
,
.
resume
=
alc_resume
,
#endif
#endif
#ifdef CONFIG_SND_HDA_POWER_SAVE
#ifdef CONFIG_SND_HDA_POWER_SAVE
.
suspend
=
alc_suspend
,
.
check_power_status
=
alc_check_power_status
,
.
check_power_status
=
alc_check_power_status
,
#endif
#endif
};
};
...
@@ -8919,7 +8970,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
...
@@ -8919,7 +8970,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1462
,
0x040d
,
"MSI"
,
ALC883_TARGA_2ch_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x040d
,
"MSI"
,
ALC883_TARGA_2ch_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x0579
,
"MSI"
,
ALC883_TARGA_2ch_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x0579
,
"MSI"
,
ALC883_TARGA_2ch_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x28fb
,
"Targa T8"
,
ALC882_TARGA
),
/* MSI-1049 T8 */
SND_PCI_QUIRK
(
0x1462
,
0x28fb
,
"Targa T8"
,
ALC882_TARGA
),
/* MSI-1049 T8 */
SND_PCI_QUIRK
(
0x1462
,
0x2fb3
,
"MSI"
,
ALC88
3_TARGA_2ch_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x2fb3
,
"MSI"
,
ALC88
2_AUTO
),
SND_PCI_QUIRK
(
0x1462
,
0x6668
,
"MSI"
,
ALC882_6ST_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x6668
,
"MSI"
,
ALC882_6ST_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x3729
,
"MSI S420"
,
ALC883_TARGA_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x3729
,
"MSI S420"
,
ALC883_TARGA_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x3783
,
"NEC S970"
,
ALC883_TARGA_DIG
),
SND_PCI_QUIRK
(
0x1462
,
0x3783
,
"NEC S970"
,
ALC883_TARGA_DIG
),
...
@@ -9282,6 +9333,7 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9282,6 +9333,7 @@ static struct alc_config_preset alc882_presets[] = {
.
dac_nids
=
alc883_dac_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
capsrc_nids
=
alc883_capsrc_nids
,
.
dig_out_nid
=
ALC883_DIGOUT_NID
,
.
dig_out_nid
=
ALC883_DIGOUT_NID
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_3ST_2ch_modes
),
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_3ST_2ch_modes
),
.
channel_mode
=
alc883_3ST_2ch_modes
,
.
channel_mode
=
alc883_3ST_2ch_modes
,
...
@@ -9378,10 +9430,11 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9378,10 +9430,11 @@ static struct alc_config_preset alc882_presets[] = {
.
init_hook
=
alc_automute_amp
,
.
init_hook
=
alc_automute_amp
,
},
},
[
ALC888_ACER_ASPIRE_8930G
]
=
{
[
ALC888_ACER_ASPIRE_8930G
]
=
{
.
mixers
=
{
alc88
8_base
_mixer
,
.
mixers
=
{
alc88
9_acer_aspire_8930g
_mixer
,
alc883_chmode_mixer
},
alc883_chmode_mixer
},
.
init_verbs
=
{
alc883_init_verbs
,
alc880_gpio1_init_verbs
,
.
init_verbs
=
{
alc883_init_verbs
,
alc880_gpio1_init_verbs
,
alc889_acer_aspire_8930g_verbs
},
alc889_acer_aspire_8930g_verbs
,
alc889_eapd_verbs
},
.
num_dacs
=
ARRAY_SIZE
(
alc883_dac_nids
),
.
num_dacs
=
ARRAY_SIZE
(
alc883_dac_nids
),
.
dac_nids
=
alc883_dac_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
num_adc_nids
=
ARRAY_SIZE
(
alc889_adc_nids
),
.
num_adc_nids
=
ARRAY_SIZE
(
alc889_adc_nids
),
...
@@ -9398,6 +9451,9 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9398,6 +9451,9 @@ static struct alc_config_preset alc882_presets[] = {
.
unsol_event
=
alc_automute_amp_unsol_event
,
.
unsol_event
=
alc_automute_amp_unsol_event
,
.
setup
=
alc889_acer_aspire_8930g_setup
,
.
setup
=
alc889_acer_aspire_8930g_setup
,
.
init_hook
=
alc_automute_amp
,
.
init_hook
=
alc_automute_amp
,
#ifdef CONFIG_SND_HDA_POWER_SAVE
.
power_hook
=
alc889_power_eapd
,
#endif
},
},
[
ALC888_ACER_ASPIRE_7730G
]
=
{
[
ALC888_ACER_ASPIRE_7730G
]
=
{
.
mixers
=
{
alc883_3ST_6ch_mixer
,
.
mixers
=
{
alc883_3ST_6ch_mixer
,
...
@@ -9428,6 +9484,7 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9428,6 +9484,7 @@ static struct alc_config_preset alc882_presets[] = {
.
dac_nids
=
alc883_dac_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
capsrc_nids
=
alc883_capsrc_nids
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_sixstack_modes
),
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_sixstack_modes
),
.
channel_mode
=
alc883_sixstack_modes
,
.
channel_mode
=
alc883_sixstack_modes
,
.
input_mux
=
&
alc883_capture_source
,
.
input_mux
=
&
alc883_capture_source
,
...
@@ -9489,6 +9546,7 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9489,6 +9546,7 @@ static struct alc_config_preset alc882_presets[] = {
.
dac_nids
=
alc883_dac_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
adc_nids
=
alc883_adc_nids_alt
,
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids_alt
),
.
capsrc_nids
=
alc883_capsrc_nids
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_3ST_2ch_modes
),
.
num_channel_mode
=
ARRAY_SIZE
(
alc883_3ST_2ch_modes
),
.
channel_mode
=
alc883_3ST_2ch_modes
,
.
channel_mode
=
alc883_3ST_2ch_modes
,
.
input_mux
=
&
alc883_lenovo_101e_capture_source
,
.
input_mux
=
&
alc883_lenovo_101e_capture_source
,
...
@@ -9668,6 +9726,7 @@ static struct alc_config_preset alc882_presets[] = {
...
@@ -9668,6 +9726,7 @@ static struct alc_config_preset alc882_presets[] = {
alc880_gpio1_init_verbs
},
alc880_gpio1_init_verbs
},
.
adc_nids
=
alc883_adc_nids
,
.
adc_nids
=
alc883_adc_nids
,
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids
),
.
num_adc_nids
=
ARRAY_SIZE
(
alc883_adc_nids
),
.
capsrc_nids
=
alc883_capsrc_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
dac_nids
=
alc883_dac_nids
,
.
num_dacs
=
ARRAY_SIZE
(
alc883_dac_nids
),
.
num_dacs
=
ARRAY_SIZE
(
alc883_dac_nids
),
.
channel_mode
=
alc889A_mb31_6ch_modes
,
.
channel_mode
=
alc889A_mb31_6ch_modes
,
...
@@ -10678,6 +10737,13 @@ static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
...
@@ -10678,6 +10737,13 @@ static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
{}
{}
};
};
static
struct
hda_verb
alc262_lenovo_3000_init_verbs
[]
=
{
/* Front Mic pin: input vref at 50% */
{
0x19
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF50
},
{
0x19
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
{}
};
static
struct
hda_input_mux
alc262_fujitsu_capture_source
=
{
static
struct
hda_input_mux
alc262_fujitsu_capture_source
=
{
.
num_items
=
3
,
.
num_items
=
3
,
.
items
=
{
.
items
=
{
...
@@ -11720,7 +11786,8 @@ static struct alc_config_preset alc262_presets[] = {
...
@@ -11720,7 +11786,8 @@ static struct alc_config_preset alc262_presets[] = {
[
ALC262_LENOVO_3000
]
=
{
[
ALC262_LENOVO_3000
]
=
{
.
mixers
=
{
alc262_lenovo_3000_mixer
},
.
mixers
=
{
alc262_lenovo_3000_mixer
},
.
init_verbs
=
{
alc262_init_verbs
,
alc262_EAPD_verbs
,
.
init_verbs
=
{
alc262_init_verbs
,
alc262_EAPD_verbs
,
alc262_lenovo_3000_unsol_verbs
},
alc262_lenovo_3000_unsol_verbs
,
alc262_lenovo_3000_init_verbs
},
.
num_dacs
=
ARRAY_SIZE
(
alc262_dac_nids
),
.
num_dacs
=
ARRAY_SIZE
(
alc262_dac_nids
),
.
dac_nids
=
alc262_dac_nids
,
.
dac_nids
=
alc262_dac_nids
,
.
hp_nid
=
0x03
,
.
hp_nid
=
0x03
,
...
@@ -13232,10 +13299,12 @@ static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
...
@@ -13232,10 +13299,12 @@ static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
/* toggle speaker-output according to the hp-jack state */
/* toggle speaker-output according to the hp-jack state */
static
void
alc269_speaker_automute
(
struct
hda_codec
*
codec
)
static
void
alc269_speaker_automute
(
struct
hda_codec
*
codec
)
{
{
struct
alc_spec
*
spec
=
codec
->
spec
;
unsigned
int
nid
=
spec
->
autocfg
.
hp_pins
[
0
];
unsigned
int
present
;
unsigned
int
present
;
unsigned
char
bits
;
unsigned
char
bits
;
present
=
snd_hda_jack_detect
(
codec
,
0x15
);
present
=
snd_hda_jack_detect
(
codec
,
nid
);
bits
=
present
?
AMP_IN_MUTE
(
0
)
:
0
;
bits
=
present
?
AMP_IN_MUTE
(
0
)
:
0
;
snd_hda_codec_amp_stereo
(
codec
,
0x0c
,
HDA_INPUT
,
0
,
snd_hda_codec_amp_stereo
(
codec
,
0x0c
,
HDA_INPUT
,
0
,
AMP_IN_MUTE
(
0
),
bits
);
AMP_IN_MUTE
(
0
),
bits
);
...
@@ -13460,8 +13529,8 @@ static void alc269_auto_init(struct hda_codec *codec)
...
@@ -13460,8 +13529,8 @@ static void alc269_auto_init(struct hda_codec *codec)
static
const
char
*
alc269_models
[
ALC269_MODEL_LAST
]
=
{
static
const
char
*
alc269_models
[
ALC269_MODEL_LAST
]
=
{
[
ALC269_BASIC
]
=
"basic"
,
[
ALC269_BASIC
]
=
"basic"
,
[
ALC269_QUANTA_FL1
]
=
"quanta"
,
[
ALC269_QUANTA_FL1
]
=
"quanta"
,
[
ALC269_ASUS_
EEEPC_P703
]
=
"eeepc-p703
"
,
[
ALC269_ASUS_
AMIC
]
=
"asus-amic
"
,
[
ALC269_ASUS_
EEEPC_P901
]
=
"eeepc-p901
"
,
[
ALC269_ASUS_
DMIC
]
=
"asus-dmic
"
,
[
ALC269_FUJITSU
]
=
"fujitsu"
,
[
ALC269_FUJITSU
]
=
"fujitsu"
,
[
ALC269_LIFEBOOK
]
=
"lifebook"
,
[
ALC269_LIFEBOOK
]
=
"lifebook"
,
[
ALC269_AUTO
]
=
"auto"
,
[
ALC269_AUTO
]
=
"auto"
,
...
@@ -13470,18 +13539,41 @@ static const char *alc269_models[ALC269_MODEL_LAST] = {
...
@@ -13470,18 +13539,41 @@ static const char *alc269_models[ALC269_MODEL_LAST] = {
static
struct
snd_pci_quirk
alc269_cfg_tbl
[]
=
{
static
struct
snd_pci_quirk
alc269_cfg_tbl
[]
=
{
SND_PCI_QUIRK
(
0x17aa
,
0x3bf8
,
"Quanta FL1"
,
ALC269_QUANTA_FL1
),
SND_PCI_QUIRK
(
0x17aa
,
0x3bf8
,
"Quanta FL1"
,
ALC269_QUANTA_FL1
),
SND_PCI_QUIRK
(
0x1043
,
0x8330
,
"ASUS Eeepc P703 P900A"
,
SND_PCI_QUIRK
(
0x1043
,
0x8330
,
"ASUS Eeepc P703 P900A"
,
ALC269_ASUS_EEEPC_P703
),
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1883
,
"ASUS F81Se"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x1133
,
"ASUS UJ20ft"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x16a3
,
"ASUS F5Q"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x1273
,
"ASUS UL80JT"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1723
,
"ASUS P80"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x1283
,
"ASUS U53Jc"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1773
,
"ASUS U20A"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x12b3
,
"ASUS N82Jv"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1743
,
"ASUS U80"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x13a3
,
"ASUS UL30Vt"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1653
,
"ASUS U50"
,
ALC269_ASUS_EEEPC_P703
),
SND_PCI_QUIRK
(
0x1043
,
0x1373
,
"ASUS G73JX"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1383
,
"ASUS UJ30Jc"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x13d3
,
"ASUS N61JA"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1413
,
"ASUS UL50"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1443
,
"ASUS UL30"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1453
,
"ASUS M60Jv"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1483
,
"ASUS UL80"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x14f3
,
"ASUS F83Vf"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x14e3
,
"ASUS UL20"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1513
,
"ASUS UX30"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x15a3
,
"ASUS N60Jv"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x15b3
,
"ASUS N60Dp"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x15c3
,
"ASUS N70De"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x15e3
,
"ASUS F83T"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1643
,
"ASUS M60J"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1653
,
"ASUS U50"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1693
,
"ASUS F50N"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x16a3
,
"ASUS F5Q"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x16e3
,
"ASUS UX50"
,
ALC269_ASUS_DMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1723
,
"ASUS P80"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1743
,
"ASUS U80"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1773
,
"ASUS U20A"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x1883
,
"ASUS F81Se"
,
ALC269_ASUS_AMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x831a
,
"ASUS Eeepc P901"
,
SND_PCI_QUIRK
(
0x1043
,
0x831a
,
"ASUS Eeepc P901"
,
ALC269_ASUS_
EEEPC_P901
),
ALC269_ASUS_
DMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x834a
,
"ASUS Eeepc S101"
,
SND_PCI_QUIRK
(
0x1043
,
0x834a
,
"ASUS Eeepc S101"
,
ALC269_ASUS_EEEPC_P901
),
ALC269_ASUS_DMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x16e3
,
"ASUS UX50"
,
ALC269_ASUS_EEEPC_P901
),
SND_PCI_QUIRK
(
0x1043
,
0x8398
,
"ASUS P1005HA"
,
ALC269_ASUS_DMIC
),
SND_PCI_QUIRK
(
0x1043
,
0x83ce
,
"ASUS P1005HA"
,
ALC269_ASUS_DMIC
),
SND_PCI_QUIRK
(
0x1734
,
0x115d
,
"FSC Amilo"
,
ALC269_FUJITSU
),
SND_PCI_QUIRK
(
0x1734
,
0x115d
,
"FSC Amilo"
,
ALC269_FUJITSU
),
SND_PCI_QUIRK
(
0x10cf
,
0x1475
,
"Lifebook ICH9M-based"
,
ALC269_LIFEBOOK
),
SND_PCI_QUIRK
(
0x10cf
,
0x1475
,
"Lifebook ICH9M-based"
,
ALC269_LIFEBOOK
),
{}
{}
...
@@ -13511,7 +13603,7 @@ static struct alc_config_preset alc269_presets[] = {
...
@@ -13511,7 +13603,7 @@ static struct alc_config_preset alc269_presets[] = {
.
setup
=
alc269_quanta_fl1_setup
,
.
setup
=
alc269_quanta_fl1_setup
,
.
init_hook
=
alc269_quanta_fl1_init_hook
,
.
init_hook
=
alc269_quanta_fl1_init_hook
,
},
},
[
ALC269_ASUS_
EEEPC_P703
]
=
{
[
ALC269_ASUS_
AMIC
]
=
{
.
mixers
=
{
alc269_eeepc_mixer
},
.
mixers
=
{
alc269_eeepc_mixer
},
.
cap_mixer
=
alc269_epc_capture_mixer
,
.
cap_mixer
=
alc269_epc_capture_mixer
,
.
init_verbs
=
{
alc269_init_verbs
,
.
init_verbs
=
{
alc269_init_verbs
,
...
@@ -13525,7 +13617,7 @@ static struct alc_config_preset alc269_presets[] = {
...
@@ -13525,7 +13617,7 @@ static struct alc_config_preset alc269_presets[] = {
.
setup
=
alc269_eeepc_amic_setup
,
.
setup
=
alc269_eeepc_amic_setup
,
.
init_hook
=
alc269_eeepc_inithook
,
.
init_hook
=
alc269_eeepc_inithook
,
},
},
[
ALC269_ASUS_
EEEPC_P901
]
=
{
[
ALC269_ASUS_
DMIC
]
=
{
.
mixers
=
{
alc269_eeepc_mixer
},
.
mixers
=
{
alc269_eeepc_mixer
},
.
cap_mixer
=
alc269_epc_capture_mixer
,
.
cap_mixer
=
alc269_epc_capture_mixer
,
.
init_verbs
=
{
alc269_init_verbs
,
.
init_verbs
=
{
alc269_init_verbs
,
...
@@ -16160,6 +16252,52 @@ static struct snd_kcontrol_new alc663_g50v_mixer[] = {
...
@@ -16160,6 +16252,52 @@ static struct snd_kcontrol_new alc663_g50v_mixer[] = {
{
}
/* end */
{
}
/* end */
};
};
static
struct
hda_bind_ctls
alc663_asus_mode7_8_all_bind_switch
=
{
.
ops
=
&
snd_hda_bind_sw
,
.
values
=
{
HDA_COMPOSE_AMP_VAL
(
0x14
,
3
,
0
,
HDA_OUTPUT
),
HDA_COMPOSE_AMP_VAL
(
0x15
,
3
,
0
,
HDA_OUTPUT
),
HDA_COMPOSE_AMP_VAL
(
0x17
,
3
,
0
,
HDA_OUTPUT
),
HDA_COMPOSE_AMP_VAL
(
0x1b
,
3
,
0
,
HDA_OUTPUT
),
HDA_COMPOSE_AMP_VAL
(
0x21
,
3
,
0
,
HDA_OUTPUT
),
0
},
};
static
struct
hda_bind_ctls
alc663_asus_mode7_8_sp_bind_switch
=
{
.
ops
=
&
snd_hda_bind_sw
,
.
values
=
{
HDA_COMPOSE_AMP_VAL
(
0x14
,
3
,
0
,
HDA_OUTPUT
),
HDA_COMPOSE_AMP_VAL
(
0x17
,
3
,
0
,
HDA_OUTPUT
),
0
},
};
static
struct
snd_kcontrol_new
alc663_mode7_mixer
[]
=
{
HDA_BIND_SW
(
"Master Playback Switch"
,
&
alc663_asus_mode7_8_all_bind_switch
),
HDA_BIND_VOL
(
"Speaker Playback Volume"
,
&
alc663_asus_bind_master_vol
),
HDA_BIND_SW
(
"Speaker Playback Switch"
,
&
alc663_asus_mode7_8_sp_bind_switch
),
HDA_CODEC_MUTE
(
"Headphone1 Playback Switch"
,
0x1b
,
0x0
,
HDA_OUTPUT
),
HDA_CODEC_MUTE
(
"Headphone2 Playback Switch"
,
0x21
,
0x0
,
HDA_OUTPUT
),
HDA_CODEC_VOLUME
(
"IntMic Playback Volume"
,
0x0b
,
0x0
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"IntMic Playback Switch"
,
0x0b
,
0x0
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Mic Playback Volume"
,
0x0b
,
0x1
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Mic Playback Switch"
,
0x0b
,
0x1
,
HDA_INPUT
),
{
}
/* end */
};
static
struct
snd_kcontrol_new
alc663_mode8_mixer
[]
=
{
HDA_BIND_SW
(
"Master Playback Switch"
,
&
alc663_asus_mode7_8_all_bind_switch
),
HDA_BIND_VOL
(
"Speaker Playback Volume"
,
&
alc663_asus_bind_master_vol
),
HDA_BIND_SW
(
"Speaker Playback Switch"
,
&
alc663_asus_mode7_8_sp_bind_switch
),
HDA_CODEC_MUTE
(
"Headphone1 Playback Switch"
,
0x15
,
0x0
,
HDA_OUTPUT
),
HDA_CODEC_MUTE
(
"Headphone2 Playback Switch"
,
0x21
,
0x0
,
HDA_OUTPUT
),
HDA_CODEC_VOLUME
(
"Mic Playback Volume"
,
0x0b
,
0x0
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Mic Playback Switch"
,
0x0b
,
0x0
,
HDA_INPUT
),
{
}
/* end */
};
static
struct
snd_kcontrol_new
alc662_chmode_mixer
[]
=
{
static
struct
snd_kcontrol_new
alc662_chmode_mixer
[]
=
{
{
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
...
@@ -16447,6 +16585,45 @@ static struct hda_verb alc272_dell_init_verbs[] = {
...
@@ -16447,6 +16585,45 @@ static struct hda_verb alc272_dell_init_verbs[] = {
{}
{}
};
};
static
struct
hda_verb
alc663_mode7_init_verbs
[]
=
{
{
0x15
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x16
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x17
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
},
{
0x17
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x1b
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
},
{
0x1b
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x1b
,
AC_VERB_SET_CONNECT_SEL
,
0x01
},
{
0x21
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
},
{
0x21
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x21
,
AC_VERB_SET_CONNECT_SEL
,
0x01
},
/* Headphone */
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
9
)},
{
0x19
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_MIC_EVENT
},
{
0x1b
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_HP_EVENT
},
{
0x21
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_HP_EVENT
},
{}
};
static
struct
hda_verb
alc663_mode8_init_verbs
[]
=
{
{
0x12
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x15
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
},
{
0x15
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x15
,
AC_VERB_SET_CONNECT_SEL
,
0x01
},
{
0x16
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x17
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
},
{
0x17
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x1b
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
},
{
0x21
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
},
{
0x21
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
},
{
0x21
,
AC_VERB_SET_CONNECT_SEL
,
0x01
},
/* Headphone */
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x22
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
9
)},
{
0x15
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_HP_EVENT
},
{
0x18
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_MIC_EVENT
},
{
0x21
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
ALC880_HP_EVENT
},
{}
};
static
struct
snd_kcontrol_new
alc662_auto_capture_mixer
[]
=
{
static
struct
snd_kcontrol_new
alc662_auto_capture_mixer
[]
=
{
HDA_CODEC_VOLUME
(
"Capture Volume"
,
0x09
,
0x0
,
HDA_INPUT
),
HDA_CODEC_VOLUME
(
"Capture Volume"
,
0x09
,
0x0
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Capture Switch"
,
0x09
,
0x0
,
HDA_INPUT
),
HDA_CODEC_MUTE
(
"Capture Switch"
,
0x09
,
0x0
,
HDA_INPUT
),
...
@@ -16626,6 +16803,54 @@ static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
...
@@ -16626,6 +16803,54 @@ static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
}
}
}
}
static
void
alc663_two_hp_m7_speaker_automute
(
struct
hda_codec
*
codec
)
{
unsigned
int
present1
,
present2
;
present1
=
snd_hda_codec_read
(
codec
,
0x1b
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
)
&
AC_PINSENSE_PRESENCE
;
present2
=
snd_hda_codec_read
(
codec
,
0x21
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
)
&
AC_PINSENSE_PRESENCE
;
if
(
present1
||
present2
)
{
snd_hda_codec_write_cache
(
codec
,
0x14
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_codec_write_cache
(
codec
,
0x17
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
}
else
{
snd_hda_codec_write_cache
(
codec
,
0x14
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_codec_write_cache
(
codec
,
0x17
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
}
}
static
void
alc663_two_hp_m8_speaker_automute
(
struct
hda_codec
*
codec
)
{
unsigned
int
present1
,
present2
;
present1
=
snd_hda_codec_read
(
codec
,
0x21
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
)
&
AC_PINSENSE_PRESENCE
;
present2
=
snd_hda_codec_read
(
codec
,
0x15
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
)
&
AC_PINSENSE_PRESENCE
;
if
(
present1
||
present2
)
{
snd_hda_codec_write_cache
(
codec
,
0x14
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_codec_write_cache
(
codec
,
0x17
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
}
else
{
snd_hda_codec_write_cache
(
codec
,
0x14
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_codec_write_cache
(
codec
,
0x17
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
}
}
static
void
alc663_m51va_unsol_event
(
struct
hda_codec
*
codec
,
static
void
alc663_m51va_unsol_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
unsigned
int
res
)
{
{
...
@@ -16645,7 +16870,7 @@ static void alc663_m51va_setup(struct hda_codec *codec)
...
@@ -16645,7 +16870,7 @@ static void alc663_m51va_setup(struct hda_codec *codec)
spec
->
ext_mic
.
pin
=
0x18
;
spec
->
ext_mic
.
pin
=
0x18
;
spec
->
ext_mic
.
mux_idx
=
0
;
spec
->
ext_mic
.
mux_idx
=
0
;
spec
->
int_mic
.
pin
=
0x12
;
spec
->
int_mic
.
pin
=
0x12
;
spec
->
int_mic
.
mux_idx
=
1
;
spec
->
int_mic
.
mux_idx
=
9
;
spec
->
auto_mic
=
1
;
spec
->
auto_mic
=
1
;
}
}
...
@@ -16657,7 +16882,17 @@ static void alc663_m51va_inithook(struct hda_codec *codec)
...
@@ -16657,7 +16882,17 @@ static void alc663_m51va_inithook(struct hda_codec *codec)
/* ***************** Mode1 ******************************/
/* ***************** Mode1 ******************************/
#define alc663_mode1_unsol_event alc663_m51va_unsol_event
#define alc663_mode1_unsol_event alc663_m51va_unsol_event
#define alc663_mode1_setup alc663_m51va_setup
static
void
alc663_mode1_setup
(
struct
hda_codec
*
codec
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
spec
->
ext_mic
.
pin
=
0x18
;
spec
->
ext_mic
.
mux_idx
=
0
;
spec
->
int_mic
.
pin
=
0x19
;
spec
->
int_mic
.
mux_idx
=
1
;
spec
->
auto_mic
=
1
;
}
#define alc663_mode1_inithook alc663_m51va_inithook
#define alc663_mode1_inithook alc663_m51va_inithook
/* ***************** Mode2 ******************************/
/* ***************** Mode2 ******************************/
...
@@ -16674,7 +16909,7 @@ static void alc662_mode2_unsol_event(struct hda_codec *codec,
...
@@ -16674,7 +16909,7 @@ static void alc662_mode2_unsol_event(struct hda_codec *codec,
}
}
}
}
#define alc662_mode2_setup alc663_m
51va
_setup
#define alc662_mode2_setup alc663_m
ode1
_setup
static
void
alc662_mode2_inithook
(
struct
hda_codec
*
codec
)
static
void
alc662_mode2_inithook
(
struct
hda_codec
*
codec
)
{
{
...
@@ -16695,7 +16930,7 @@ static void alc663_mode3_unsol_event(struct hda_codec *codec,
...
@@ -16695,7 +16930,7 @@ static void alc663_mode3_unsol_event(struct hda_codec *codec,
}
}
}
}
#define alc663_mode3_setup alc663_m
51va
_setup
#define alc663_mode3_setup alc663_m
ode1
_setup
static
void
alc663_mode3_inithook
(
struct
hda_codec
*
codec
)
static
void
alc663_mode3_inithook
(
struct
hda_codec
*
codec
)
{
{
...
@@ -16716,7 +16951,7 @@ static void alc663_mode4_unsol_event(struct hda_codec *codec,
...
@@ -16716,7 +16951,7 @@ static void alc663_mode4_unsol_event(struct hda_codec *codec,
}
}
}
}
#define alc663_mode4_setup alc663_m
51va
_setup
#define alc663_mode4_setup alc663_m
ode1
_setup
static
void
alc663_mode4_inithook
(
struct
hda_codec
*
codec
)
static
void
alc663_mode4_inithook
(
struct
hda_codec
*
codec
)
{
{
...
@@ -16737,7 +16972,7 @@ static void alc663_mode5_unsol_event(struct hda_codec *codec,
...
@@ -16737,7 +16972,7 @@ static void alc663_mode5_unsol_event(struct hda_codec *codec,
}
}
}
}
#define alc663_mode5_setup alc663_m
51va
_setup
#define alc663_mode5_setup alc663_m
ode1
_setup
static
void
alc663_mode5_inithook
(
struct
hda_codec
*
codec
)
static
void
alc663_mode5_inithook
(
struct
hda_codec
*
codec
)
{
{
...
@@ -16758,7 +16993,7 @@ static void alc663_mode6_unsol_event(struct hda_codec *codec,
...
@@ -16758,7 +16993,7 @@ static void alc663_mode6_unsol_event(struct hda_codec *codec,
}
}
}
}
#define alc663_mode6_setup alc663_m
51va
_setup
#define alc663_mode6_setup alc663_m
ode1
_setup
static
void
alc663_mode6_inithook
(
struct
hda_codec
*
codec
)
static
void
alc663_mode6_inithook
(
struct
hda_codec
*
codec
)
{
{
...
@@ -16766,6 +17001,50 @@ static void alc663_mode6_inithook(struct hda_codec *codec)
...
@@ -16766,6 +17001,50 @@ static void alc663_mode6_inithook(struct hda_codec *codec)
alc_mic_automute
(
codec
);
alc_mic_automute
(
codec
);
}
}
/* ***************** Mode7 ******************************/
static
void
alc663_mode7_unsol_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
{
switch
(
res
>>
26
)
{
case
ALC880_HP_EVENT
:
alc663_two_hp_m7_speaker_automute
(
codec
);
break
;
case
ALC880_MIC_EVENT
:
alc_mic_automute
(
codec
);
break
;
}
}
#define alc663_mode7_setup alc663_mode1_setup
static
void
alc663_mode7_inithook
(
struct
hda_codec
*
codec
)
{
alc663_two_hp_m7_speaker_automute
(
codec
);
alc_mic_automute
(
codec
);
}
/* ***************** Mode8 ******************************/
static
void
alc663_mode8_unsol_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
{
switch
(
res
>>
26
)
{
case
ALC880_HP_EVENT
:
alc663_two_hp_m8_speaker_automute
(
codec
);
break
;
case
ALC880_MIC_EVENT
:
alc_mic_automute
(
codec
);
break
;
}
}
#define alc663_mode8_setup alc663_m51va_setup
static
void
alc663_mode8_inithook
(
struct
hda_codec
*
codec
)
{
alc663_two_hp_m8_speaker_automute
(
codec
);
alc_mic_automute
(
codec
);
}
static
void
alc663_g71v_hp_automute
(
struct
hda_codec
*
codec
)
static
void
alc663_g71v_hp_automute
(
struct
hda_codec
*
codec
)
{
{
unsigned
int
present
;
unsigned
int
present
;
...
@@ -16900,6 +17179,8 @@ static const char *alc662_models[ALC662_MODEL_LAST] = {
...
@@ -16900,6 +17179,8 @@ static const char *alc662_models[ALC662_MODEL_LAST] = {
[
ALC663_ASUS_MODE4
]
=
"asus-mode4"
,
[
ALC663_ASUS_MODE4
]
=
"asus-mode4"
,
[
ALC663_ASUS_MODE5
]
=
"asus-mode5"
,
[
ALC663_ASUS_MODE5
]
=
"asus-mode5"
,
[
ALC663_ASUS_MODE6
]
=
"asus-mode6"
,
[
ALC663_ASUS_MODE6
]
=
"asus-mode6"
,
[
ALC663_ASUS_MODE7
]
=
"asus-mode7"
,
[
ALC663_ASUS_MODE8
]
=
"asus-mode8"
,
[
ALC272_DELL
]
=
"dell"
,
[
ALC272_DELL
]
=
"dell"
,
[
ALC272_DELL_ZM1
]
=
"dell-zm1"
,
[
ALC272_DELL_ZM1
]
=
"dell-zm1"
,
[
ALC272_SAMSUNG_NC10
]
=
"samsung-nc10"
,
[
ALC272_SAMSUNG_NC10
]
=
"samsung-nc10"
,
...
@@ -16916,12 +17197,22 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
...
@@ -16916,12 +17197,22 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1043
,
0x11d3
,
"ASUS NB"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x11d3
,
"ASUS NB"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x11f3
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x11f3
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1203
,
"ASUS NB"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x1203
,
"ASUS NB"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x1303
,
"ASUS G60J"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x1333
,
"ASUS G60Jx"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x1339
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1339
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x13e3
,
"ASUS N71JA"
,
ALC663_ASUS_MODE7
),
SND_PCI_QUIRK
(
0x1043
,
0x1463
,
"ASUS N71"
,
ALC663_ASUS_MODE7
),
SND_PCI_QUIRK
(
0x1043
,
0x14d3
,
"ASUS G72"
,
ALC663_ASUS_MODE8
),
SND_PCI_QUIRK
(
0x1043
,
0x1563
,
"ASUS N90"
,
ALC663_ASUS_MODE3
),
SND_PCI_QUIRK
(
0x1043
,
0x15d3
,
"ASUS N50SF F50SF"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x16c3
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x16c3
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x16f3
,
"ASUS K40C K50C"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1733
,
"ASUS N81De"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x1753
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1753
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1763
,
"ASUS NB"
,
ALC663_ASUS_MODE6
),
SND_PCI_QUIRK
(
0x1043
,
0x1763
,
"ASUS NB"
,
ALC663_ASUS_MODE6
),
SND_PCI_QUIRK
(
0x1043
,
0x1765
,
"ASUS NB"
,
ALC663_ASUS_MODE6
),
SND_PCI_QUIRK
(
0x1043
,
0x1765
,
"ASUS NB"
,
ALC663_ASUS_MODE6
),
SND_PCI_QUIRK
(
0x1043
,
0x1783
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1783
,
"ASUS NB"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x1793
,
"ASUS F50GX"
,
ALC663_ASUS_MODE1
),
SND_PCI_QUIRK
(
0x1043
,
0x17b3
,
"ASUS F70SL"
,
ALC663_ASUS_MODE3
),
SND_PCI_QUIRK
(
0x1043
,
0x17b3
,
"ASUS F70SL"
,
ALC663_ASUS_MODE3
),
SND_PCI_QUIRK
(
0x1043
,
0x17c3
,
"ASUS UX20"
,
ALC663_ASUS_M51VA
),
SND_PCI_QUIRK
(
0x1043
,
0x17c3
,
"ASUS UX20"
,
ALC663_ASUS_M51VA
),
SND_PCI_QUIRK
(
0x1043
,
0x17f3
,
"ASUS X58LE"
,
ALC662_ASUS_MODE2
),
SND_PCI_QUIRK
(
0x1043
,
0x17f3
,
"ASUS X58LE"
,
ALC662_ASUS_MODE2
),
...
@@ -17205,6 +17496,36 @@ static struct alc_config_preset alc662_presets[] = {
...
@@ -17205,6 +17496,36 @@ static struct alc_config_preset alc662_presets[] = {
.
setup
=
alc663_mode6_setup
,
.
setup
=
alc663_mode6_setup
,
.
init_hook
=
alc663_mode6_inithook
,
.
init_hook
=
alc663_mode6_inithook
,
},
},
[
ALC663_ASUS_MODE7
]
=
{
.
mixers
=
{
alc663_mode7_mixer
},
.
cap_mixer
=
alc662_auto_capture_mixer
,
.
init_verbs
=
{
alc662_init_verbs
,
alc663_mode7_init_verbs
},
.
num_dacs
=
ARRAY_SIZE
(
alc662_dac_nids
),
.
hp_nid
=
0x03
,
.
dac_nids
=
alc662_dac_nids
,
.
dig_out_nid
=
ALC662_DIGOUT_NID
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc662_3ST_2ch_modes
),
.
channel_mode
=
alc662_3ST_2ch_modes
,
.
unsol_event
=
alc663_mode7_unsol_event
,
.
setup
=
alc663_mode7_setup
,
.
init_hook
=
alc663_mode7_inithook
,
},
[
ALC663_ASUS_MODE8
]
=
{
.
mixers
=
{
alc663_mode8_mixer
},
.
cap_mixer
=
alc662_auto_capture_mixer
,
.
init_verbs
=
{
alc662_init_verbs
,
alc663_mode8_init_verbs
},
.
num_dacs
=
ARRAY_SIZE
(
alc662_dac_nids
),
.
hp_nid
=
0x03
,
.
dac_nids
=
alc662_dac_nids
,
.
dig_out_nid
=
ALC662_DIGOUT_NID
,
.
num_channel_mode
=
ARRAY_SIZE
(
alc662_3ST_2ch_modes
),
.
channel_mode
=
alc662_3ST_2ch_modes
,
.
unsol_event
=
alc663_mode8_unsol_event
,
.
setup
=
alc663_mode8_setup
,
.
init_hook
=
alc663_mode8_inithook
,
},
[
ALC272_DELL
]
=
{
[
ALC272_DELL
]
=
{
.
mixers
=
{
alc663_m51va_mixer
},
.
mixers
=
{
alc663_m51va_mixer
},
.
cap_mixer
=
alc272_auto_capture_mixer
,
.
cap_mixer
=
alc272_auto_capture_mixer
,
...
@@ -17688,7 +18009,9 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = {
...
@@ -17688,7 +18009,9 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = {
{
.
id
=
0x10ec0267
,
.
name
=
"ALC267"
,
.
patch
=
patch_alc268
},
{
.
id
=
0x10ec0267
,
.
name
=
"ALC267"
,
.
patch
=
patch_alc268
},
{
.
id
=
0x10ec0268
,
.
name
=
"ALC268"
,
.
patch
=
patch_alc268
},
{
.
id
=
0x10ec0268
,
.
name
=
"ALC268"
,
.
patch
=
patch_alc268
},
{
.
id
=
0x10ec0269
,
.
name
=
"ALC269"
,
.
patch
=
patch_alc269
},
{
.
id
=
0x10ec0269
,
.
name
=
"ALC269"
,
.
patch
=
patch_alc269
},
{
.
id
=
0x10ec0270
,
.
name
=
"ALC270"
,
.
patch
=
patch_alc269
},
{
.
id
=
0x10ec0272
,
.
name
=
"ALC272"
,
.
patch
=
patch_alc662
},
{
.
id
=
0x10ec0272
,
.
name
=
"ALC272"
,
.
patch
=
patch_alc662
},
{
.
id
=
0x10ec0275
,
.
name
=
"ALC275"
,
.
patch
=
patch_alc269
},
{
.
id
=
0x10ec0861
,
.
rev
=
0x100340
,
.
name
=
"ALC660"
,
{
.
id
=
0x10ec0861
,
.
rev
=
0x100340
,
.
name
=
"ALC660"
,
.
patch
=
patch_alc861
},
.
patch
=
patch_alc861
},
{
.
id
=
0x10ec0660
,
.
name
=
"ALC660-VD"
,
.
patch
=
patch_alc861vd
},
{
.
id
=
0x10ec0660
,
.
name
=
"ALC660-VD"
,
.
patch
=
patch_alc861vd
},
...
...
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