Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
d9bbb475
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d9bbb475
编写于
5月 13, 2012
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/hda' into topic/hda-switcheroo
上级
3e9e63db
8c7dd890
变更
21
展开全部
隐藏空白更改
内联
并排
Showing
21 changed file
with
1540 addition
and
1309 deletion
+1540
-1309
sound/pci/echoaudio/echoaudio_dsp.c
sound/pci/echoaudio/echoaudio_dsp.c
+1
-1
sound/pci/hda/Makefile
sound/pci/hda/Makefile
+1
-1
sound/pci/hda/hda_auto_parser.c
sound/pci/hda/hda_auto_parser.c
+760
-0
sound/pci/hda/hda_auto_parser.h
sound/pci/hda/hda_auto_parser.h
+160
-0
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+245
-704
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+3
-5
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+22
-4
sound/pci/hda/hda_jack.c
sound/pci/hda/hda_jack.c
+1
-0
sound/pci/hda/hda_jack.h
sound/pci/hda/hda_jack.h
+2
-0
sound/pci/hda/hda_local.h
sound/pci/hda/hda_local.h
+43
-79
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+8
-6
sound/pci/hda/patch_ca0110.c
sound/pci/hda/patch_ca0110.c
+4
-4
sound/pci/hda/patch_ca0132.c
sound/pci/hda/patch_ca0132.c
+4
-5
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cirrus.c
+10
-20
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_cmedia.c
+1
-0
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_conexant.c
+116
-70
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_hdmi.c
+2
-2
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+132
-333
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+12
-56
sound/pci/hda/patch_via.c
sound/pci/hda/patch_via.c
+12
-19
sound/pci/rme9652/hdsp.c
sound/pci/rme9652/hdsp.c
+1
-0
未找到文件。
sound/pci/echoaudio/echoaudio_dsp.c
浏览文件 @
d9bbb475
...
...
@@ -475,7 +475,7 @@ static int load_firmware(struct echoaudio *chip)
const
struct
firmware
*
fw
;
int
box_type
,
err
;
if
(
snd_BUG_ON
(
!
chip
->
dsp_code_to_load
||
!
chip
->
comm_page
))
if
(
snd_BUG_ON
(
!
chip
->
comm_page
))
return
-
EPERM
;
/* See if the ASIC is present and working - only if the DSP is already loaded */
...
...
sound/pci/hda/Makefile
浏览文件 @
d9bbb475
snd-hda-intel-objs
:=
hda_intel.o
snd-hda-codec-y
:=
hda_codec.o hda_jack.o
snd-hda-codec-y
:=
hda_codec.o hda_jack.o
hda_auto_parser.o
snd-hda-codec-$(CONFIG_SND_HDA_GENERIC)
+=
hda_generic.o
snd-hda-codec-$(CONFIG_PROC_FS)
+=
hda_proc.o
snd-hda-codec-$(CONFIG_SND_HDA_HWDEP)
+=
hda_hwdep.o
...
...
sound/pci/hda/hda_auto_parser.c
0 → 100644
浏览文件 @
d9bbb475
此差异已折叠。
点击以展开。
sound/pci/hda/hda_auto_parser.h
0 → 100644
浏览文件 @
d9bbb475
/*
* BIOS auto-parser helper functions for HD-audio
*
* Copyright (c) 2012 Takashi Iwai <tiwai@suse.de>
*
* This driver is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#ifndef __SOUND_HDA_AUTO_PARSER_H
#define __SOUND_HDA_AUTO_PARSER_H
/*
* Helper for automatic pin configuration
*/
enum
{
AUTO_PIN_MIC
,
AUTO_PIN_LINE_IN
,
AUTO_PIN_CD
,
AUTO_PIN_AUX
,
AUTO_PIN_LAST
};
enum
{
AUTO_PIN_LINE_OUT
,
AUTO_PIN_SPEAKER_OUT
,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct
auto_pin_cfg_item
{
hda_nid_t
pin
;
int
type
;
};
struct
auto_pin_cfg
;
const
char
*
hda_get_autocfg_input_label
(
struct
hda_codec
*
codec
,
const
struct
auto_pin_cfg
*
cfg
,
int
input
);
int
snd_hda_get_pin_label
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
struct
auto_pin_cfg
*
cfg
,
char
*
label
,
int
maxlen
,
int
*
indexp
);
enum
{
INPUT_PIN_ATTR_UNUSED
,
/* pin not connected */
INPUT_PIN_ATTR_INT
,
/* internal mic/line-in */
INPUT_PIN_ATTR_DOCK
,
/* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL
,
/* mic/line-in jack */
INPUT_PIN_ATTR_FRONT
,
/* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR
,
/* mic/line-in jack in rear */
};
int
snd_hda_get_input_pin_attr
(
unsigned
int
def_conf
);
struct
auto_pin_cfg
{
int
line_outs
;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t
line_out_pins
[
AUTO_CFG_MAX_OUTS
];
int
speaker_outs
;
hda_nid_t
speaker_pins
[
AUTO_CFG_MAX_OUTS
];
int
hp_outs
;
int
line_out_type
;
/* AUTO_PIN_XXX_OUT */
hda_nid_t
hp_pins
[
AUTO_CFG_MAX_OUTS
];
int
num_inputs
;
struct
auto_pin_cfg_item
inputs
[
AUTO_CFG_MAX_INS
];
int
dig_outs
;
hda_nid_t
dig_out_pins
[
2
];
hda_nid_t
dig_in_pin
;
hda_nid_t
mono_out_pin
;
int
dig_out_type
[
2
];
/* HDA_PCM_TYPE_XXX */
int
dig_in_type
;
/* HDA_PCM_TYPE_XXX */
};
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0)
/* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1)
/* don't take other outs as LO */
int
snd_hda_parse_pin_defcfg
(
struct
hda_codec
*
codec
,
struct
auto_pin_cfg
*
cfg
,
const
hda_nid_t
*
ignore_nids
,
unsigned
int
cond_flags
);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/*
*/
struct
hda_gen_spec
{
/* fix-up list */
int
fixup_id
;
const
struct
hda_fixup
*
fixup_list
;
const
char
*
fixup_name
;
/* additional init verbs */
struct
snd_array
verbs
;
};
/*
* Fix-up pin default configurations and add default verbs
*/
struct
hda_pintbl
{
hda_nid_t
nid
;
u32
val
;
};
struct
hda_model_fixup
{
const
int
id
;
const
char
*
name
;
};
struct
hda_fixup
{
int
type
;
bool
chained
;
int
chain_id
;
union
{
const
struct
hda_pintbl
*
pins
;
const
struct
hda_verb
*
verbs
;
void
(
*
func
)(
struct
hda_codec
*
codec
,
const
struct
hda_fixup
*
fix
,
int
action
);
}
v
;
};
/* fixup types */
enum
{
HDA_FIXUP_INVALID
,
HDA_FIXUP_PINS
,
HDA_FIXUP_VERBS
,
HDA_FIXUP_FUNC
,
};
/* fixup action definitions */
enum
{
HDA_FIXUP_ACT_PRE_PROBE
,
HDA_FIXUP_ACT_PROBE
,
HDA_FIXUP_ACT_INIT
,
HDA_FIXUP_ACT_BUILD
,
};
int
snd_hda_gen_add_verbs
(
struct
hda_gen_spec
*
spec
,
const
struct
hda_verb
*
list
);
void
snd_hda_gen_apply_verbs
(
struct
hda_codec
*
codec
);
void
snd_hda_apply_pincfgs
(
struct
hda_codec
*
codec
,
const
struct
hda_pintbl
*
cfg
);
void
snd_hda_apply_fixup
(
struct
hda_codec
*
codec
,
int
action
);
void
snd_hda_pick_fixup
(
struct
hda_codec
*
codec
,
const
struct
hda_model_fixup
*
models
,
const
struct
snd_pci_quirk
*
quirk
,
const
struct
hda_fixup
*
fixlist
);
#endif
/* __SOUND_HDA_AUTO_PARSER_H */
sound/pci/hda/hda_codec.c
浏览文件 @
d9bbb475
此差异已折叠。
点击以展开。
sound/pci/hda/hda_codec.h
浏览文件 @
d9bbb475
...
...
@@ -704,8 +704,6 @@ struct hda_codec_ops {
unsigned
int
power_state
);
#ifdef CONFIG_PM
int
(
*
suspend
)(
struct
hda_codec
*
codec
,
pm_message_t
state
);
int
(
*
post_suspend
)(
struct
hda_codec
*
codec
);
int
(
*
pre_resume
)(
struct
hda_codec
*
codec
);
int
(
*
resume
)(
struct
hda_codec
*
codec
);
#endif
#ifdef CONFIG_SND_HDA_POWER_SAVE
...
...
@@ -829,6 +827,7 @@ struct hda_codec {
struct
mutex
spdif_mutex
;
struct
mutex
control_mutex
;
struct
mutex
hash_mutex
;
struct
snd_array
spdif_out
;
unsigned
int
spdif_in_enable
;
/* SPDIF input enable? */
const
hda_nid_t
*
slave_dig_outs
;
/* optional digital out slave widgets */
...
...
@@ -861,12 +860,13 @@ struct hda_codec {
unsigned
int
no_jack_detect
:
1
;
/* Machine has no jack-detection */
#ifdef CONFIG_SND_HDA_POWER_SAVE
unsigned
int
power_on
:
1
;
/* current (global) power-state */
unsigned
int
power_transition
:
1
;
/* power-state in transition */
int
power_transition
;
/* power-state in transition */
int
power_count
;
/* current (global) power refcount */
struct
delayed_work
power_work
;
/* delayed task for powerdown */
unsigned
long
power_on_acct
;
unsigned
long
power_off_acct
;
unsigned
long
power_jiffies
;
spinlock_t
power_lock
;
#endif
/* codec-specific additional proc output */
...
...
@@ -1051,12 +1051,10 @@ const char *snd_hda_get_jack_location(u32 cfg);
#ifdef CONFIG_SND_HDA_POWER_SAVE
void
snd_hda_power_up
(
struct
hda_codec
*
codec
);
void
snd_hda_power_down
(
struct
hda_codec
*
codec
);
#define snd_hda_codec_needs_resume(codec) codec->power_count
void
snd_hda_update_power_acct
(
struct
hda_codec
*
codec
);
#else
static
inline
void
snd_hda_power_up
(
struct
hda_codec
*
codec
)
{}
static
inline
void
snd_hda_power_down
(
struct
hda_codec
*
codec
)
{}
#define snd_hda_codec_needs_resume(codec) 1
#endif
#ifdef CONFIG_SND_HDA_PATCH_LOADER
...
...
sound/pci/hda/hda_intel.c
浏览文件 @
d9bbb475
...
...
@@ -497,6 +497,7 @@ enum {
AZX_DRIVER_NVIDIA
,
AZX_DRIVER_TERA
,
AZX_DRIVER_CTX
,
AZX_DRIVER_CTHDA
,
AZX_DRIVER_GENERIC
,
AZX_NUM_DRIVERS
,
/* keep this as last entry */
};
...
...
@@ -518,6 +519,7 @@ enum {
#define AZX_DCAPS_OLD_SSYNC (1 << 20)
/* Old SSYNC reg for ICH */
#define AZX_DCAPS_BUFSIZE (1 << 21)
/* no buffer size alignment */
#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22)
/* buffer size alignment */
#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23)
/* BDLE in 4k boundary */
/* quirks for ATI SB / AMD Hudson */
#define AZX_DCAPS_PRESET_ATI_SB \
...
...
@@ -533,6 +535,9 @@ enum {
(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
AZX_DCAPS_ALIGN_BUFSIZE)
#define AZX_DCAPS_PRESET_CTHDA \
(AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
static
char
*
driver_short_names
[]
__devinitdata
=
{
[
AZX_DRIVER_ICH
]
=
"HDA Intel"
,
[
AZX_DRIVER_PCH
]
=
"HDA Intel PCH"
,
...
...
@@ -546,6 +551,7 @@ static char *driver_short_names[] __devinitdata = {
[
AZX_DRIVER_NVIDIA
]
=
"HDA NVidia"
,
[
AZX_DRIVER_TERA
]
=
"HDA Teradici"
,
[
AZX_DRIVER_CTX
]
=
"HDA Creative"
,
[
AZX_DRIVER_CTHDA
]
=
"HDA Creative"
,
[
AZX_DRIVER_GENERIC
]
=
"HD-Audio Generic"
,
};
...
...
@@ -1283,7 +1289,8 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
/*
* set up a BDL entry
*/
static
int
setup_bdle
(
struct
snd_pcm_substream
*
substream
,
static
int
setup_bdle
(
struct
azx
*
chip
,
struct
snd_pcm_substream
*
substream
,
struct
azx_dev
*
azx_dev
,
u32
**
bdlp
,
int
ofs
,
int
size
,
int
with_ioc
)
{
...
...
@@ -1302,6 +1309,12 @@ static int setup_bdle(struct snd_pcm_substream *substream,
bdl
[
1
]
=
cpu_to_le32
(
upper_32_bits
(
addr
));
/* program the size field of the BDL entry */
chunk
=
snd_pcm_sgbuf_get_chunk_size
(
substream
,
ofs
,
size
);
/* one BDLE cannot cross 4K boundary on CTHDA chips */
if
(
chip
->
driver_caps
&
AZX_DCAPS_4K_BDLE_BOUNDARY
)
{
u32
remain
=
0x1000
-
(
ofs
&
0xfff
);
if
(
chunk
>
remain
)
chunk
=
remain
;
}
bdl
[
2
]
=
cpu_to_le32
(
chunk
);
/* program the IOC to enable interrupt
* only when the whole fragment is processed
...
...
@@ -1354,7 +1367,7 @@ static int azx_setup_periods(struct azx *chip,
bdl_pos_adj
[
chip
->
dev_index
]);
pos_adj
=
0
;
}
else
{
ofs
=
setup_bdle
(
substream
,
azx_dev
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
pos_adj
,
!
substream
->
runtime
->
no_period_wakeup
);
if
(
ofs
<
0
)
...
...
@@ -1364,10 +1377,10 @@ static int azx_setup_periods(struct azx *chip,
pos_adj
=
0
;
for
(
i
=
0
;
i
<
periods
;
i
++
)
{
if
(
i
==
periods
-
1
&&
pos_adj
)
ofs
=
setup_bdle
(
substream
,
azx_dev
,
&
bdl
,
ofs
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
period_bytes
-
pos_adj
,
0
);
else
ofs
=
setup_bdle
(
substream
,
azx_dev
,
&
bdl
,
ofs
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
period_bytes
,
!
substream
->
runtime
->
no_period_wakeup
);
if
(
ofs
<
0
)
...
...
@@ -3116,6 +3129,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
.
driver_data
=
AZX_DRIVER_CTX
|
AZX_DCAPS_CTX_WORKAROUND
|
AZX_DCAPS_RIRB_PRE_DELAY
|
AZX_DCAPS_POSFIX_LPIB
},
#endif
/* CTHDA chips */
{
PCI_DEVICE
(
0x1102
,
0x0010
),
.
driver_data
=
AZX_DRIVER_CTHDA
|
AZX_DCAPS_PRESET_CTHDA
},
{
PCI_DEVICE
(
0x1102
,
0x0012
),
.
driver_data
=
AZX_DRIVER_CTHDA
|
AZX_DCAPS_PRESET_CTHDA
},
/* Vortex86MX */
{
PCI_DEVICE
(
0x17f3
,
0x3010
),
.
driver_data
=
AZX_DRIVER_GENERIC
},
/* VMware HDAudio */
...
...
sound/pci/hda/hda_jack.c
浏览文件 @
d9bbb475
...
...
@@ -17,6 +17,7 @@
#include <sound/jack.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
bool
is_jack_detectable
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
...
...
sound/pci/hda/hda_jack.h
浏览文件 @
d9bbb475
...
...
@@ -12,6 +12,8 @@
#ifndef __SOUND_HDA_JACK_H
#define __SOUND_HDA_JACK_H
struct
auto_pin_cfg
;
struct
hda_jack_tbl
{
hda_nid_t
nid
;
unsigned
char
action
;
/* event action (0 = none) */
...
...
sound/pci/hda/hda_local.h
浏览文件 @
d9bbb475
...
...
@@ -262,6 +262,8 @@ int snd_hda_input_mux_put(struct hda_codec *codec,
const
struct
hda_input_mux
*
imux
,
struct
snd_ctl_elem_value
*
ucontrol
,
hda_nid_t
nid
,
unsigned
int
*
cur_val
);
int
snd_hda_add_imux_item
(
struct
hda_input_mux
*
imux
,
const
char
*
label
,
int
index
,
int
*
type_index_ret
);
/*
* Channel mode helper
...
...
@@ -393,72 +395,7 @@ struct hda_bus_unsolicited {
struct
hda_bus
*
bus
;
};
/*
* Helper for automatic pin configuration
*/
enum
{
AUTO_PIN_MIC
,
AUTO_PIN_LINE_IN
,
AUTO_PIN_CD
,
AUTO_PIN_AUX
,
AUTO_PIN_LAST
};
enum
{
AUTO_PIN_LINE_OUT
,
AUTO_PIN_SPEAKER_OUT
,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct
auto_pin_cfg_item
{
hda_nid_t
pin
;
int
type
;
};
struct
auto_pin_cfg
;
const
char
*
hda_get_autocfg_input_label
(
struct
hda_codec
*
codec
,
const
struct
auto_pin_cfg
*
cfg
,
int
input
);
int
snd_hda_get_pin_label
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
struct
auto_pin_cfg
*
cfg
,
char
*
label
,
int
maxlen
,
int
*
indexp
);
int
snd_hda_add_imux_item
(
struct
hda_input_mux
*
imux
,
const
char
*
label
,
int
index
,
int
*
type_index_ret
);
enum
{
INPUT_PIN_ATTR_UNUSED
,
/* pin not connected */
INPUT_PIN_ATTR_INT
,
/* internal mic/line-in */
INPUT_PIN_ATTR_DOCK
,
/* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL
,
/* mic/line-in jack */
INPUT_PIN_ATTR_FRONT
,
/* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR
,
/* mic/line-in jack in rear */
};
int
snd_hda_get_input_pin_attr
(
unsigned
int
def_conf
);
struct
auto_pin_cfg
{
int
line_outs
;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t
line_out_pins
[
AUTO_CFG_MAX_OUTS
];
int
speaker_outs
;
hda_nid_t
speaker_pins
[
AUTO_CFG_MAX_OUTS
];
int
hp_outs
;
int
line_out_type
;
/* AUTO_PIN_XXX_OUT */
hda_nid_t
hp_pins
[
AUTO_CFG_MAX_OUTS
];
int
num_inputs
;
struct
auto_pin_cfg_item
inputs
[
AUTO_CFG_MAX_INS
];
int
dig_outs
;
hda_nid_t
dig_out_pins
[
2
];
hda_nid_t
dig_in_pin
;
hda_nid_t
mono_out_pin
;
int
dig_out_type
[
2
];
/* HDA_PCM_TYPE_XXX */
int
dig_in_type
;
/* HDA_PCM_TYPE_XXX */
};
/* helper macros to retrieve pin default-config values */
#define get_defcfg_connect(cfg) \
((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
#define get_defcfg_association(cfg) \
...
...
@@ -472,19 +409,6 @@ struct auto_pin_cfg {
#define get_defcfg_misc(cfg) \
((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT)
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0)
/* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1)
/* don't take other outs as LO */
int
snd_hda_parse_pin_defcfg
(
struct
hda_codec
*
codec
,
struct
auto_pin_cfg
*
cfg
,
const
hda_nid_t
*
ignore_nids
,
unsigned
int
cond_flags
);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/* amp values */
#define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
#define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8))
...
...
@@ -502,6 +426,46 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
#define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN)
#define PIN_HP_AMP (AC_PINCTL_HP_EN)
unsigned
int
snd_hda_get_default_vref
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
);
int
_snd_hda_set_pin_ctl
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
,
bool
cached
);
/**
* _snd_hda_set_pin_ctl - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* This function sets the pin-control value to the given pin, but
* filters out the invalid pin-control bits when the pin has no such
* capabilities. For example, when PIN_HP is passed but the pin has no
* HP-drive capability, the HP bit is omitted.
*
* The function doesn't check the input VREF capability bits, though.
* Use snd_hda_get_default_vref() to guess the right value.
* Also, this function is only for analog pins, not for HDMI pins.
*/
static
inline
int
snd_hda_set_pin_ctl
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
)
{
return
_snd_hda_set_pin_ctl
(
codec
,
pin
,
val
,
false
);
}
/**
* snd_hda_set_pin_ctl_cache - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* Just like snd_hda_set_pin_ctl() but write to cache as well.
*/
static
inline
int
snd_hda_set_pin_ctl_cache
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
)
{
return
_snd_hda_set_pin_ctl
(
codec
,
pin
,
val
,
true
);
}
/*
* get widget capabilities
*/
...
...
sound/pci/hda/patch_analog.c
浏览文件 @
d9bbb475
...
...
@@ -28,6 +28,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_beep.h"
#include "hda_jack.h"
...
...
@@ -1742,9 +1743,7 @@ static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
if
(
!
ad198x_eapd_put
(
kcontrol
,
ucontrol
))
return
0
;
/* change speaker pin appropriately */
snd_hda_codec_write
(
codec
,
0x05
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
spec
->
cur_eapd
?
PIN_OUT
:
0
);
snd_hda_set_pin_ctl
(
codec
,
0x05
,
spec
->
cur_eapd
?
PIN_OUT
:
0
);
/* toggle HP mute appropriately */
snd_hda_codec_amp_stereo
(
codec
,
0x06
,
HDA_OUTPUT
,
0
,
HDA_AMP_MUTE
,
...
...
@@ -3103,7 +3102,7 @@ static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
int
dac_idx
)
{
/* set as output */
snd_hda_
codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_type
);
snd_hda_
set_pin_ctl
(
codec
,
nid
,
pin_type
);
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
);
switch
(
nid
)
{
case
0x11
:
/* port-A - DAC 03 */
...
...
@@ -3157,6 +3156,7 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
for
(
i
=
0
;
i
<
cfg
->
num_inputs
;
i
++
)
{
hda_nid_t
nid
=
cfg
->
inputs
[
i
].
pin
;
int
type
=
cfg
->
inputs
[
i
].
type
;
int
val
;
switch
(
nid
)
{
case
0x15
:
/* port-C */
snd_hda_codec_write
(
codec
,
0x33
,
0
,
AC_VERB_SET_CONNECT_SEL
,
0x0
);
...
...
@@ -3165,8 +3165,10 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
snd_hda_codec_write
(
codec
,
0x34
,
0
,
AC_VERB_SET_CONNECT_SEL
,
0x0
);
break
;
}
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
type
==
AUTO_PIN_MIC
?
PIN_VREF80
:
PIN_IN
);
val
=
PIN_IN
;
if
(
type
==
AUTO_PIN_MIC
)
val
|=
snd_hda_get_default_vref
(
codec
,
nid
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
val
);
if
(
nid
!=
AD1988_PIN_CD_NID
)
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
);
...
...
sound/pci/hda/patch_ca0110.c
浏览文件 @
d9bbb475
...
...
@@ -26,6 +26,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
/*
*/
...
...
@@ -341,8 +342,7 @@ static int ca0110_build_pcms(struct hda_codec *codec)
static
void
init_output
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
dac
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_HP
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_OUT_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
@@ -356,8 +356,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static
void
init_input
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
adc
)
{
if
(
pin
)
{
snd_hda_
codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
);
snd_hda_
set_pin_ctl
(
codec
,
pin
,
PIN_IN
|
snd_hda_get_default_vref
(
codec
,
pin
)
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_IN_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
sound/pci/hda/patch_ca0132.c
浏览文件 @
d9bbb475
...
...
@@ -30,6 +30,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#define WIDGET_CHIP_CTRL 0x15
#define WIDGET_DSP_CTRL 0x16
...
...
@@ -239,8 +240,7 @@ enum get_set {
static
void
init_output
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
dac
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_HP
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_OUT_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
@@ -254,9 +254,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static
void
init_input
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
adc
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_IN
|
snd_hda_get_default_vref
(
codec
,
pin
));
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_IN_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
sound/pci/hda/patch_cirrus.c
浏览文件 @
d9bbb475
...
...
@@ -26,6 +26,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
#include <sound/tlv.h>
...
...
@@ -933,8 +934,7 @@ static void cs_automute(struct hda_codec *codec)
pin_ctl
=
0
;
nid
=
cfg
->
speaker_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_ctl
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
pin_ctl
);
}
if
(
spec
->
gpio_eapd_hp
)
{
unsigned
int
gpio
=
hp_present
?
...
...
@@ -948,16 +948,14 @@ static void cs_automute(struct hda_codec *codec)
/* mute HPs if spdif jack (SENSE_B) is present */
for
(
i
=
0
;
i
<
cfg
->
hp_outs
;
i
++
)
{
nid
=
cfg
->
hp_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
nid
,
(
spdif_present
&&
spec
->
sense_b
)
?
0
:
PIN_HP
);
}
/* SPDIF TX on/off */
if
(
cfg
->
dig_outs
)
{
nid
=
cfg
->
dig_out_pins
[
0
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
nid
,
spdif_present
?
PIN_OUT
:
0
);
}
...
...
@@ -1024,13 +1022,11 @@ static void init_output(struct hda_codec *codec)
/* set appropriate pin controls */
for
(
i
=
0
;
i
<
cfg
->
line_outs
;
i
++
)
snd_hda_codec_write
(
codec
,
cfg
->
line_out_pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
line_out_pins
[
i
],
PIN_OUT
);
/* HP */
for
(
i
=
0
;
i
<
cfg
->
hp_outs
;
i
++
)
{
hda_nid_t
nid
=
cfg
->
hp_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
PIN_HP
);
if
(
!
cfg
->
speaker_outs
)
continue
;
if
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_UNSOL_CAP
)
{
...
...
@@ -1041,8 +1037,7 @@ static void init_output(struct hda_codec *codec)
/* Speaker */
for
(
i
=
0
;
i
<
cfg
->
speaker_outs
;
i
++
)
snd_hda_codec_write
(
codec
,
cfg
->
speaker_pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
speaker_pins
[
i
],
PIN_OUT
);
/* SPDIF is enabled on presence detect for CS421x */
if
(
spec
->
hp_detect
||
spec
->
spdif_detect
)
...
...
@@ -1063,14 +1058,9 @@ static void init_input(struct hda_codec *codec)
continue
;
/* set appropriate pin control and mute first */
ctl
=
PIN_IN
;
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
{
unsigned
int
caps
=
snd_hda_query_pin_caps
(
codec
,
pin
);
caps
>>=
AC_PINCAP_VREF_SHIFT
;
if
(
caps
&
AC_PINCAP_VREF_80
)
ctl
=
PIN_VREF80
;
}
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
ctl
);
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
|=
snd_hda_get_default_vref
(
codec
,
pin
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
ctl
);
snd_hda_codec_write
(
codec
,
spec
->
adc_nid
[
i
],
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
spec
->
adc_idx
[
i
]));
...
...
sound/pci/hda/patch_cmedia.c
浏览文件 @
d9bbb475
...
...
@@ -29,6 +29,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#define NUM_PINS 11
...
...
sound/pci/hda/patch_conexant.c
浏览文件 @
d9bbb475
...
...
@@ -30,6 +30,7 @@
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_beep.h"
#include "hda_jack.h"
...
...
@@ -66,6 +67,7 @@ struct imux_info {
};
struct
conexant_spec
{
struct
hda_gen_spec
gen
;
const
struct
snd_kcontrol_new
*
mixers
[
5
];
int
num_mixers
;
...
...
@@ -141,6 +143,7 @@ struct conexant_spec {
unsigned
int
hp_laptop
:
1
;
unsigned
int
asus
:
1
;
unsigned
int
pin_eapd_ctrls
:
1
;
unsigned
int
fixup_stereo_dmic
:
1
;
unsigned
int
adc_switching
:
1
;
...
...
@@ -1601,17 +1604,13 @@ static void cxt5051_update_speaker(struct hda_codec *codec)
unsigned
int
pinctl
;
/* headphone pin */
pinctl
=
(
spec
->
hp_present
&&
spec
->
cur_eapd
)
?
PIN_HP
:
0
;
snd_hda_codec_write
(
codec
,
0x16
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x16
,
pinctl
);
/* speaker pin */
pinctl
=
(
!
spec
->
hp_present
&&
spec
->
cur_eapd
)
?
PIN_OUT
:
0
;
snd_hda_codec_write
(
codec
,
0x1a
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x1a
,
pinctl
);
/* on ideapad there is an additional speaker (subwoofer) to mute */
if
(
spec
->
ideapad
)
snd_hda_codec_write
(
codec
,
0x1b
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x1b
,
pinctl
);
}
/* turn on/off EAPD (+ mute HP) as a master switch */
...
...
@@ -1996,8 +1995,7 @@ static void cxt5066_update_speaker(struct hda_codec *codec)
/* Port A (HP) */
pinctl
=
(
hp_port_a_present
(
spec
)
&&
spec
->
cur_eapd
)
?
PIN_HP
:
0
;
snd_hda_codec_write
(
codec
,
0x19
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x19
,
pinctl
);
/* Port D (HP/LO) */
pinctl
=
spec
->
cur_eapd
?
spec
->
port_d_mode
:
0
;
...
...
@@ -2010,13 +2008,11 @@ static void cxt5066_update_speaker(struct hda_codec *codec)
if
(
!
hp_port_d_present
(
spec
))
pinctl
=
0
;
}
snd_hda_codec_write
(
codec
,
0x1c
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x1c
,
pinctl
);
/* CLASS_D AMP */
pinctl
=
(
!
spec
->
hp_present
&&
spec
->
cur_eapd
)
?
PIN_OUT
:
0
;
snd_hda_codec_write
(
codec
,
0x1f
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
snd_hda_set_pin_ctl
(
codec
,
0x1f
,
pinctl
);
}
/* turn on/off EAPD (+ mute HP) as a master switch */
...
...
@@ -2047,8 +2043,7 @@ static int cxt5066_set_olpc_dc_bias(struct hda_codec *codec)
/* Even though port F is the DC input, the bias is controlled on port B.
* we also leave that port as an active input (but unselected) in DC mode
* just in case that is necessary to make the bias setting take effect. */
return
snd_hda_codec_write_cache
(
codec
,
0x1a
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
return
snd_hda_set_pin_ctl_cache
(
codec
,
0x1a
,
cxt5066_olpc_dc_bias
.
items
[
spec
->
dc_input_bias
].
index
);
}
...
...
@@ -2081,14 +2076,14 @@ static void cxt5066_olpc_select_mic(struct hda_codec *codec)
}
/* disable DC (port F) */
snd_hda_
codec_write
(
codec
,
0x1e
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_
set_pin_ctl
(
codec
,
0x1e
,
0
);
/* external mic, port B */
snd_hda_
codec_write
(
codec
,
0x1a
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_
set_pin_ctl
(
codec
,
0x1a
,
spec
->
ext_mic_present
?
CXT5066_OLPC_EXT_MIC_BIAS
:
0
);
/* internal mic, port C */
snd_hda_
codec_write
(
codec
,
0x1b
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_
set_pin_ctl
(
codec
,
0x1b
,
spec
->
ext_mic_present
?
0
:
PIN_VREF80
);
}
...
...
@@ -3357,9 +3352,7 @@ static void do_automute(struct hda_codec *codec, int num_pins,
struct
conexant_spec
*
spec
=
codec
->
spec
;
int
i
;
for
(
i
=
0
;
i
<
num_pins
;
i
++
)
snd_hda_codec_write
(
codec
,
pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
on
?
PIN_OUT
:
0
);
snd_hda_set_pin_ctl
(
codec
,
pins
[
i
],
on
?
PIN_OUT
:
0
);
if
(
spec
->
pin_eapd_ctrls
)
cx_auto_turn_eapd
(
codec
,
num_pins
,
pins
,
on
);
}
...
...
@@ -3976,8 +3969,7 @@ static void cx_auto_init_output(struct hda_codec *codec)
if
(
snd_hda_query_pin_caps
(
codec
,
cfg
->
hp_pins
[
i
])
&
AC_PINCAP_HP_DRV
)
val
|=
AC_PINCTL_HP_EN
;
snd_hda_codec_write
(
codec
,
cfg
->
hp_pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
val
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
hp_pins
[
i
],
val
);
}
mute_outputs
(
codec
,
cfg
->
hp_outs
,
cfg
->
hp_pins
);
mute_outputs
(
codec
,
cfg
->
line_outs
,
cfg
->
line_out_pins
);
...
...
@@ -4030,13 +4022,11 @@ static void cx_auto_init_input(struct hda_codec *codec)
}
for
(
i
=
0
;
i
<
cfg
->
num_inputs
;
i
++
)
{
unsigned
int
type
;
hda_nid_t
pin
=
cfg
->
inputs
[
i
].
pin
;
unsigned
int
type
=
PIN_IN
;
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
type
=
PIN_VREF80
;
else
type
=
PIN_IN
;
snd_hda_codec_write
(
codec
,
cfg
->
inputs
[
i
].
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
type
);
type
|=
snd_hda_get_default_vref
(
codec
,
pin
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
type
);
}
if
(
spec
->
auto_mic
)
{
...
...
@@ -4063,11 +4053,9 @@ static void cx_auto_init_digital(struct hda_codec *codec)
struct
auto_pin_cfg
*
cfg
=
&
spec
->
autocfg
;
if
(
spec
->
multiout
.
dig_out_nid
)
snd_hda_codec_write
(
codec
,
cfg
->
dig_out_pins
[
0
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
dig_out_pins
[
0
],
PIN_OUT
);
if
(
spec
->
dig_in_nid
)
snd_hda_codec_write
(
codec
,
cfg
->
dig_in_pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
dig_in_pin
,
PIN_IN
);
}
static
int
cx_auto_init
(
struct
hda_codec
*
codec
)
...
...
@@ -4084,9 +4072,9 @@ static int cx_auto_init(struct hda_codec *codec)
static
int
cx_auto_add_volume_idx
(
struct
hda_codec
*
codec
,
const
char
*
basename
,
const
char
*
dir
,
int
cidx
,
hda_nid_t
nid
,
int
hda_dir
,
int
amp_idx
)
hda_nid_t
nid
,
int
hda_dir
,
int
amp_idx
,
int
chs
)
{
static
char
name
[
32
];
static
char
name
[
44
];
static
struct
snd_kcontrol_new
knew
[]
=
{
HDA_CODEC_VOLUME
(
name
,
0
,
0
,
0
),
HDA_CODEC_MUTE
(
name
,
0
,
0
,
0
),
...
...
@@ -4096,7 +4084,7 @@ static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
for
(
i
=
0
;
i
<
2
;
i
++
)
{
struct
snd_kcontrol
*
kctl
;
knew
[
i
].
private_value
=
HDA_COMPOSE_AMP_VAL
(
nid
,
3
,
amp_idx
,
knew
[
i
].
private_value
=
HDA_COMPOSE_AMP_VAL
(
nid
,
chs
,
amp_idx
,
hda_dir
);
knew
[
i
].
subdevice
=
HDA_SUBDEV_AMP_FLAG
;
knew
[
i
].
index
=
cidx
;
...
...
@@ -4115,7 +4103,7 @@ static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
}
#define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir) \
cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0)
cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0
, 3
)
#define cx_auto_add_pb_volume(codec, nid, str, idx) \
cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)
...
...
@@ -4185,6 +4173,36 @@ static int cx_auto_build_output_controls(struct hda_codec *codec)
return
0
;
}
/* Returns zero if this is a normal stereo channel, and non-zero if it should
be split in two independent channels.
dest_label must be at least 44 characters. */
static
int
cx_auto_get_rightch_label
(
struct
hda_codec
*
codec
,
const
char
*
label
,
char
*
dest_label
,
int
nid
)
{
struct
conexant_spec
*
spec
=
codec
->
spec
;
int
i
;
if
(
!
spec
->
fixup_stereo_dmic
)
return
0
;
for
(
i
=
0
;
i
<
AUTO_CFG_MAX_INS
;
i
++
)
{
int
def_conf
;
if
(
spec
->
autocfg
.
inputs
[
i
].
pin
!=
nid
)
continue
;
if
(
spec
->
autocfg
.
inputs
[
i
].
type
!=
AUTO_PIN_MIC
)
return
0
;
def_conf
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
if
(
snd_hda_get_input_pin_attr
(
def_conf
)
!=
INPUT_PIN_ATTR_INT
)
return
0
;
/* Finally found the inverted internal mic! */
snprintf
(
dest_label
,
44
,
"Inverted %s"
,
label
);
return
1
;
}
return
0
;
}
static
int
cx_auto_add_capture_volume
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
char
*
label
,
const
char
*
pfx
,
int
cidx
)
...
...
@@ -4193,14 +4211,25 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,
int
i
;
for
(
i
=
0
;
i
<
spec
->
num_adc_nids
;
i
++
)
{
char
rightch_label
[
44
];
hda_nid_t
adc_nid
=
spec
->
adc_nids
[
i
];
int
idx
=
get_input_connection
(
codec
,
adc_nid
,
nid
);
if
(
idx
<
0
)
continue
;
if
(
codec
->
single_adc_amp
)
idx
=
0
;
if
(
cx_auto_get_rightch_label
(
codec
,
label
,
rightch_label
,
nid
))
{
/* Make two independent kcontrols for left and right */
int
err
=
cx_auto_add_volume_idx
(
codec
,
label
,
pfx
,
cidx
,
adc_nid
,
HDA_INPUT
,
idx
,
1
);
if
(
err
<
0
)
return
err
;
return
cx_auto_add_volume_idx
(
codec
,
rightch_label
,
pfx
,
cidx
,
adc_nid
,
HDA_INPUT
,
idx
,
2
);
}
return
cx_auto_add_volume_idx
(
codec
,
label
,
pfx
,
cidx
,
adc_nid
,
HDA_INPUT
,
idx
);
cidx
,
adc_nid
,
HDA_INPUT
,
idx
,
3
);
}
return
0
;
}
...
...
@@ -4213,9 +4242,19 @@ static int cx_auto_add_boost_volume(struct hda_codec *codec, int idx,
int
i
,
con
;
nid
=
spec
->
imux_info
[
idx
].
pin
;
if
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_IN_AMP
)
if
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_IN_AMP
)
{
char
rightch_label
[
44
];
if
(
cx_auto_get_rightch_label
(
codec
,
label
,
rightch_label
,
nid
))
{
int
err
=
cx_auto_add_volume_idx
(
codec
,
label
,
" Boost"
,
cidx
,
nid
,
HDA_INPUT
,
0
,
1
);
if
(
err
<
0
)
return
err
;
return
cx_auto_add_volume_idx
(
codec
,
rightch_label
,
" Boost"
,
cidx
,
nid
,
HDA_INPUT
,
0
,
2
);
}
return
cx_auto_add_volume
(
codec
,
label
,
" Boost"
,
cidx
,
nid
,
HDA_INPUT
);
}
con
=
__select_input_connection
(
codec
,
spec
->
imux_info
[
idx
].
adc
,
nid
,
&
mux
,
false
,
0
);
if
(
con
<
0
)
...
...
@@ -4370,37 +4409,21 @@ static const struct hda_codec_ops cx_auto_patch_ops = {
/*
* pin fix-up
*/
struct
cxt_pincfg
{
hda_nid_t
nid
;
u32
val
;
};
static
void
apply_pincfg
(
struct
hda_codec
*
codec
,
const
struct
cxt_pincfg
*
cfg
)
{
for
(;
cfg
->
nid
;
cfg
++
)
snd_hda_codec_set_pincfg
(
codec
,
cfg
->
nid
,
cfg
->
val
);
}
static
void
apply_pin_fixup
(
struct
hda_codec
*
codec
,
const
struct
snd_pci_quirk
*
quirk
,
const
struct
cxt_pincfg
**
table
)
{
quirk
=
snd_pci_quirk_lookup
(
codec
->
bus
->
pci
,
quirk
);
if
(
quirk
)
{
snd_printdd
(
KERN_INFO
"hda_codec: applying pincfg for %s
\n
"
,
quirk
->
name
);
apply_pincfg
(
codec
,
table
[
quirk
->
value
]);
}
}
enum
{
CXT_PINCFG_LENOVO_X200
,
CXT_PINCFG_LENOVO_TP410
,
CXT_FIXUP_STEREO_DMIC
,
};
static
void
cxt_fixup_stereo_dmic
(
struct
hda_codec
*
codec
,
const
struct
hda_fixup
*
fix
,
int
action
)
{
struct
conexant_spec
*
spec
=
codec
->
spec
;
spec
->
fixup_stereo_dmic
=
1
;
}
/* ThinkPad X200 & co with cxt5051 */
static
const
struct
cxt_pincfg
cxt_pincfg_lenovo_x200
[]
=
{
static
const
struct
hda_pintbl
cxt_pincfg_lenovo_x200
[]
=
{
{
0x16
,
0x042140ff
},
/* HP (seq# overridden) */
{
0x17
,
0x21a11000
},
/* dock-mic */
{
0x19
,
0x2121103f
},
/* dock-HP */
...
...
@@ -4409,16 +4432,26 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {
};
/* ThinkPad 410/420/510/520, X201 & co with cxt5066 */
static
const
struct
cxt_pincfg
cxt_pincfg_lenovo_tp410
[]
=
{
static
const
struct
hda_pintbl
cxt_pincfg_lenovo_tp410
[]
=
{
{
0x19
,
0x042110ff
},
/* HP (seq# overridden) */
{
0x1a
,
0x21a190f0
},
/* dock-mic */
{
0x1c
,
0x212140ff
},
/* dock-HP */
{}
};
static
const
struct
cxt_pincfg
*
cxt_pincfg_tbl
[]
=
{
[
CXT_PINCFG_LENOVO_X200
]
=
cxt_pincfg_lenovo_x200
,
[
CXT_PINCFG_LENOVO_TP410
]
=
cxt_pincfg_lenovo_tp410
,
static
const
struct
hda_fixup
cxt_fixups
[]
=
{
[
CXT_PINCFG_LENOVO_X200
]
=
{
.
type
=
HDA_FIXUP_PINS
,
.
v
.
pins
=
cxt_pincfg_lenovo_x200
,
},
[
CXT_PINCFG_LENOVO_TP410
]
=
{
.
type
=
HDA_FIXUP_PINS
,
.
v
.
pins
=
cxt_pincfg_lenovo_tp410
,
},
[
CXT_FIXUP_STEREO_DMIC
]
=
{
.
type
=
HDA_FIXUP_FUNC
,
.
v
.
func
=
cxt_fixup_stereo_dmic
,
},
};
static
const
struct
snd_pci_quirk
cxt5051_fixups
[]
=
{
...
...
@@ -4432,6 +4465,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
SND_PCI_QUIRK
(
0x17aa
,
0x215f
,
"Lenovo T510"
,
CXT_PINCFG_LENOVO_TP410
),
SND_PCI_QUIRK
(
0x17aa
,
0x21ce
,
"Lenovo T420"
,
CXT_PINCFG_LENOVO_TP410
),
SND_PCI_QUIRK
(
0x17aa
,
0x21cf
,
"Lenovo T520"
,
CXT_PINCFG_LENOVO_TP410
),
SND_PCI_QUIRK
(
0x17aa
,
0x3975
,
"Lenovo U300s"
,
CXT_FIXUP_STEREO_DMIC
),
{}
};
...
...
@@ -4471,13 +4505,16 @@ static int patch_conexant_auto(struct hda_codec *codec)
case
0x14f15051
:
add_cx5051_fake_mutes
(
codec
);
codec
->
pin_amp_workaround
=
1
;
apply_pin_fixup
(
codec
,
cxt5051_fixups
,
cxt_pincfg_tbl
);
snd_hda_pick_fixup
(
codec
,
NULL
,
cxt5051_fixups
,
cxt_fixups
);
break
;
default:
codec
->
pin_amp_workaround
=
1
;
apply_pin_fixup
(
codec
,
cxt5066_fixups
,
cxt_pincfg_tbl
);
snd_hda_pick_fixup
(
codec
,
NULL
,
cxt5066_fixups
,
cxt_fixups
);
break
;
}
snd_hda_apply_fixup
(
codec
,
HDA_FIXUP_ACT_PRE_PROBE
);
/* Show mute-led control only on HP laptops
* This is a sort of white-list: on HP laptops, EAPD corresponds
* only to the mute-LED without actualy amp function. Meanwhile,
...
...
@@ -4556,6 +4593,12 @@ static const struct hda_codec_preset snd_hda_preset_conexant[] = {
.
patch
=
patch_conexant_auto
},
{
.
id
=
0x14f150b9
,
.
name
=
"CX20665"
,
.
patch
=
patch_conexant_auto
},
{
.
id
=
0x14f1510f
,
.
name
=
"CX20751/2"
,
.
patch
=
patch_conexant_auto
},
{
.
id
=
0x14f15110
,
.
name
=
"CX20751/2"
,
.
patch
=
patch_conexant_auto
},
{
.
id
=
0x14f15111
,
.
name
=
"CX20753/4"
,
.
patch
=
patch_conexant_auto
},
{}
/* terminator */
};
...
...
@@ -4576,6 +4619,9 @@ MODULE_ALIAS("snd-hda-codec-id:14f150ab");
MODULE_ALIAS
(
"snd-hda-codec-id:14f150ac"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f150b8"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f150b9"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f1510f"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15110"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15111"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Conexant HD-audio codec"
);
...
...
sound/pci/hda/patch_hdmi.c
浏览文件 @
d9bbb475
...
...
@@ -1592,10 +1592,10 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
unsigned
int
dataDCC2
,
channel_id
;
int
i
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_spdif_out
*
spdif
=
snd_hda_spdif_out_of_nid
(
codec
,
spec
->
cvts
[
0
].
cvt_nid
);
struct
hda_spdif_out
*
spdif
;
mutex_lock
(
&
codec
->
spdif_mutex
);
spdif
=
snd_hda_spdif_out_of_nid
(
codec
,
spec
->
cvts
[
0
].
cvt_nid
);
chs
=
substream
->
runtime
->
channels
;
...
...
sound/pci/hda/patch_realtek.c
浏览文件 @
d9bbb475
此差异已折叠。
点击以展开。
sound/pci/hda/patch_sigmatel.c
浏览文件 @
d9bbb475
...
...
@@ -36,6 +36,7 @@
#include <sound/tlv.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_beep.h"
#include "hda_jack.h"
...
...
@@ -681,8 +682,7 @@ static int stac_vrefout_set(struct hda_codec *codec,
pinctl
&=
~
AC_PINCTL_VREFEN
;
pinctl
|=
(
new_vref
&
AC_PINCTL_VREFEN
);
error
=
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pinctl
);
error
=
snd_hda_set_pin_ctl_cache
(
codec
,
nid
,
pinctl
);
if
(
error
<
0
)
return
error
;
...
...
@@ -706,8 +706,7 @@ static unsigned int stac92xx_vref_set(struct hda_codec *codec,
else
pincfg
|=
AC_PINCTL_IN_EN
;
error
=
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pincfg
);
error
=
snd_hda_set_pin_ctl_cache
(
codec
,
nid
,
pincfg
);
if
(
error
<
0
)
return
error
;
else
...
...
@@ -2505,27 +2504,10 @@ static int stac92xx_build_pcms(struct hda_codec *codec)
return
0
;
}
static
unsigned
int
stac92xx_get_default_vref
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
unsigned
int
pincap
=
snd_hda_query_pin_caps
(
codec
,
nid
);
pincap
=
(
pincap
&
AC_PINCAP_VREF
)
>>
AC_PINCAP_VREF_SHIFT
;
if
(
pincap
&
AC_PINCAP_VREF_100
)
return
AC_PINCTL_VREF_100
;
if
(
pincap
&
AC_PINCAP_VREF_80
)
return
AC_PINCTL_VREF_80
;
if
(
pincap
&
AC_PINCAP_VREF_50
)
return
AC_PINCTL_VREF_50
;
if
(
pincap
&
AC_PINCAP_VREF_GRD
)
return
AC_PINCTL_VREF_GRD
;
return
0
;
}
static
void
stac92xx_auto_set_pinctl
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
int
pin_type
)
{
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_type
);
snd_hda_set_pin_ctl_cache
(
codec
,
nid
,
pin_type
);
}
#define stac92xx_hp_switch_info snd_ctl_boolean_mono_info
...
...
@@ -2594,7 +2576,7 @@ static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol,
hda_nid_t
nid
=
kcontrol
->
private_value
;
unsigned
int
vref
=
stac92xx_vref_get
(
codec
,
nid
);
if
(
vref
==
s
tac92xx
_get_default_vref
(
codec
,
nid
))
if
(
vref
==
s
nd_hda
_get_default_vref
(
codec
,
nid
))
ucontrol
->
value
.
enumerated
.
item
[
0
]
=
0
;
else
if
(
vref
==
AC_PINCTL_VREF_GRD
)
ucontrol
->
value
.
enumerated
.
item
[
0
]
=
1
;
...
...
@@ -2613,7 +2595,7 @@ static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
hda_nid_t
nid
=
kcontrol
->
private_value
;
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
==
0
)
new_vref
=
s
tac92xx
_get_default_vref
(
codec
,
nid
);
new_vref
=
s
nd_hda
_get_default_vref
(
codec
,
nid
);
else
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
==
1
)
new_vref
=
AC_PINCTL_VREF_GRD
;
else
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
==
2
)
...
...
@@ -2679,7 +2661,7 @@ static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_
else
{
unsigned
int
pinctl
=
AC_PINCTL_IN_EN
;
if
(
io_idx
)
/* set VREF for mic */
pinctl
|=
s
tac92xx
_get_default_vref
(
codec
,
nid
);
pinctl
|=
s
nd_hda
_get_default_vref
(
codec
,
nid
);
stac92xx_auto_set_pinctl
(
codec
,
nid
,
pinctl
);
}
...
...
@@ -2847,7 +2829,7 @@ static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec,
char
name
[
22
];
if
(
snd_hda_get_input_pin_attr
(
def_conf
)
!=
INPUT_PIN_ATTR_INT
)
{
if
(
s
tac92xx
_get_default_vref
(
codec
,
nid
)
==
AC_PINCTL_VREF_GRD
if
(
s
nd_hda
_get_default_vref
(
codec
,
nid
)
==
AC_PINCTL_VREF_GRD
&&
nid
==
spec
->
line_switch
)
control
=
STAC_CTL_WIDGET_IO_SWITCH
;
else
if
(
snd_hda_query_pin_caps
(
codec
,
nid
)
...
...
@@ -4354,7 +4336,7 @@ static int stac92xx_init(struct hda_codec *codec)
unsigned
int
pinctl
,
conf
;
if
(
type
==
AUTO_PIN_MIC
)
{
/* for mic pins, force to initialize */
pinctl
=
s
tac92xx
_get_default_vref
(
codec
,
nid
);
pinctl
=
s
nd_hda
_get_default_vref
(
codec
,
nid
);
pinctl
|=
AC_PINCTL_IN_EN
;
stac92xx_auto_set_pinctl
(
codec
,
nid
,
pinctl
);
}
else
{
...
...
@@ -4460,8 +4442,7 @@ static void stac92xx_shutup_pins(struct hda_codec *codec)
struct
hda_pincfg
*
pin
=
snd_array_elem
(
&
codec
->
init_pins
,
i
);
def_conf
=
snd_hda_codec_get_pincfg
(
codec
,
pin
->
nid
);
if
(
get_defcfg_connect
(
def_conf
)
!=
AC_JACK_PORT_NONE
)
snd_hda_codec_write
(
codec
,
pin
->
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_set_pin_ctl
(
codec
,
pin
->
nid
,
0
);
}
}
...
...
@@ -4517,9 +4498,7 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
pin_ctl
|=
flag
;
if
(
old_ctl
!=
pin_ctl
)
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_ctl
);
snd_hda_set_pin_ctl_cache
(
codec
,
nid
,
pin_ctl
);
}
static
void
stac92xx_reset_pinctl
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
...
...
@@ -4528,9 +4507,7 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
unsigned
int
pin_ctl
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0x00
);
if
(
pin_ctl
&
flag
)
snd_hda_codec_write_cache
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_ctl
&
~
flag
);
snd_hda_set_pin_ctl_cache
(
codec
,
nid
,
pin_ctl
&
~
flag
);
}
static
inline
int
get_pin_presence
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
...
...
@@ -5009,20 +4986,6 @@ static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
return
0
;
}
static
int
stac92xx_pre_resume
(
struct
hda_codec
*
codec
)
{
struct
sigmatel_spec
*
spec
=
codec
->
spec
;
/* sync mute LED */
if
(
spec
->
vref_mute_led_nid
)
stac_vrefout_set
(
codec
,
spec
->
vref_mute_led_nid
,
spec
->
vref_led
);
else
if
(
spec
->
gpio_led
)
stac_gpio_set
(
codec
,
spec
->
gpio_mask
,
spec
->
gpio_dir
,
spec
->
gpio_data
);
return
0
;
}
static
void
stac92xx_set_power_state
(
struct
hda_codec
*
codec
,
hda_nid_t
fg
,
unsigned
int
power_state
)
{
...
...
@@ -5046,7 +5009,6 @@ static void stac92xx_set_power_state(struct hda_codec *codec, hda_nid_t fg,
#else
#define stac92xx_suspend NULL
#define stac92xx_resume NULL
#define stac92xx_pre_resume NULL
#define stac92xx_set_power_state NULL
#endif
/* CONFIG_PM */
...
...
@@ -5592,9 +5554,6 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
codec
->
patch_ops
.
set_power_state
=
stac92xx_set_power_state
;
}
#ifdef CONFIG_PM
codec
->
patch_ops
.
pre_resume
=
stac92xx_pre_resume
;
#endif
}
err
=
stac92xx_parse_auto_config
(
codec
);
...
...
@@ -5901,9 +5860,6 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
codec
->
patch_ops
.
set_power_state
=
stac92xx_set_power_state
;
}
#ifdef CONFIG_PM
codec
->
patch_ops
.
pre_resume
=
stac92xx_pre_resume
;
#endif
}
spec
->
multiout
.
dac_nids
=
spec
->
dac_nids
;
...
...
sound/pci/hda/patch_via.c
浏览文件 @
d9bbb475
...
...
@@ -54,6 +54,7 @@
#include <sound/asoundef.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
/* Pin Widget NID */
...
...
@@ -532,8 +533,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
{
if
(
!
pin
)
return
;
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_type
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
pin_type
);
if
(
snd_hda_query_pin_caps
(
codec
,
pin
)
&
AC_PINCAP_EAPD
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_EAPD_BTLENABLE
,
0x02
);
...
...
@@ -662,12 +662,12 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
hda_nid_t
nid
=
cfg
->
inputs
[
i
].
pin
;
if
(
spec
->
smart51_enabled
&&
is_smart51_pins
(
codec
,
nid
))
ctl
=
PIN_OUT
;
else
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
=
PIN_VREF50
;
else
else
{
ctl
=
PIN_IN
;
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
ctl
);
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
|=
snd_hda_get_default_vref
(
codec
,
nid
);
}
snd_hda_set_pin_ctl
(
codec
,
nid
,
ctl
);
}
/* init input-src */
...
...
@@ -1006,9 +1006,7 @@ static int via_smart51_put(struct snd_kcontrol *kcontrol,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
parm
&=
~
(
AC_PINCTL_IN_EN
|
AC_PINCTL_OUT_EN
);
parm
|=
out_in
;
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
parm
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
parm
);
if
(
out_in
==
AC_PINCTL_OUT_EN
)
{
mute_aa_path
(
codec
,
1
);
notify_aa_path_ctls
(
codec
);
...
...
@@ -1647,8 +1645,7 @@ static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
parm
&=
~
AC_PINCTL_OUT_EN
;
else
parm
|=
AC_PINCTL_OUT_EN
;
snd_hda_codec_write
(
codec
,
pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
parm
);
snd_hda_set_pin_ctl
(
codec
,
pins
[
i
],
parm
);
}
}
...
...
@@ -1709,8 +1706,7 @@ static void via_gpio_control(struct hda_codec *codec)
if
(
gpio_data
==
0x02
)
{
/* unmute line out */
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
PIN_OUT
);
if
(
vol_counter
&
0x20
)
{
/* decrease volume */
...
...
@@ -1728,9 +1724,7 @@ static void via_gpio_control(struct hda_codec *codec)
}
}
else
if
(
!
(
gpio_data
&
0x02
))
{
/* mute line out */
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
);
}
}
...
...
@@ -2757,8 +2751,7 @@ static void via_auto_init_dig_in(struct hda_codec *codec)
struct
via_spec
*
spec
=
codec
->
spec
;
if
(
!
spec
->
dig_in_nid
)
return
;
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
dig_in_pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
);
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
dig_in_pin
,
PIN_IN
);
}
/* initialize the unsolicited events */
...
...
sound/pci/rme9652/hdsp.c
浏览文件 @
d9bbb475
...
...
@@ -5170,6 +5170,7 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp)
strcpy
(
hw
->
name
,
"HDSP hwdep interface"
);
hw
->
ops
.
ioctl
=
snd_hdsp_hwdep_ioctl
;
hw
->
ops
.
ioctl_compat
=
snd_hdsp_hwdep_ioctl
;
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录