Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
f1cf9a66
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
f1cf9a66
编写于
3月 08, 2010
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/hda' into for-linus
上级
6679ee18
2abbf439
变更
9
展开全部
显示空白变更内容
内联
并排
Showing
9 changed file
with
1141 addition
and
904 deletion
+1141
-904
sound/pci/hda/Kconfig
sound/pci/hda/Kconfig
+1
-1
sound/pci/hda/Makefile
sound/pci/hda/Makefile
+2
-2
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+38
-31
sound/pci/hda/hda_eld.c
sound/pci/hda/hda_eld.c
+6
-0
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+7
-2
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_hdmi.c
+849
-0
sound/pci/hda/patch_intelhdmi.c
sound/pci/hda/patch_intelhdmi.c
+13
-808
sound/pci/hda/patch_nvhdmi.c
sound/pci/hda/patch_nvhdmi.c
+216
-59
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+9
-1
未找到文件。
sound/pci/hda/Kconfig
浏览文件 @
f1cf9a66
...
...
@@ -157,7 +157,7 @@ config SND_HDA_CODEC_INTELHDMI
config SND_HDA_ELD
def_bool y
depends on SND_HDA_CODEC_INTELHDMI
depends on SND_HDA_CODEC_INTELHDMI
|| SND_HDA_CODEC_NVHDMI
config SND_HDA_CODEC_CIRRUS
bool "Build Cirrus Logic codec support"
...
...
sound/pci/hda/Makefile
浏览文件 @
f1cf9a66
...
...
@@ -3,7 +3,7 @@ snd-hda-intel-objs := hda_intel.o
snd-hda-codec-y
:=
hda_codec.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_ELD) += hda_eld.o
snd-hda-codec-$(CONFIG_SND_HDA_ELD)
+=
hda_eld.o
snd-hda-codec-$(CONFIG_SND_HDA_HWDEP)
+=
hda_hwdep.o
snd-hda-codec-$(CONFIG_SND_HDA_INPUT_BEEP)
+=
hda_beep.o
...
...
@@ -18,7 +18,7 @@ snd-hda-codec-ca0110-objs := patch_ca0110.o
snd-hda-codec-conexant-objs
:=
patch_conexant.o
snd-hda-codec-via-objs
:=
patch_via.o
snd-hda-codec-nvhdmi-objs
:=
patch_nvhdmi.o
snd-hda-codec-intelhdmi-objs
:=
patch_intelhdmi.o
hda_eld.o
snd-hda-codec-intelhdmi-objs
:=
patch_intelhdmi.o
# common driver
obj-$(CONFIG_SND_HDA_INTEL)
:=
snd-hda-codec.o
...
...
sound/pci/hda/hda_codec.c
浏览文件 @
f1cf9a66
...
...
@@ -978,7 +978,8 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
*
* Returns 0 if successful, or a negative error code.
*/
int
/*__devinit*/
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
unsigned
int
codec_addr
,
int
/*__devinit*/
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
)
{
struct
hda_codec
*
codec
;
...
...
@@ -1186,7 +1187,7 @@ EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream);
*/
/* FIXME: more better hash key? */
#define HDA_HASH_KEY(nid,
dir,
idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24))
#define HDA_HASH_KEY(nid,
dir,
idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24))
#define HDA_HASH_PINCAP_KEY(nid) (u32)((nid) + (0x02 << 24))
#define HDA_HASH_PARPCM_KEY(nid) (u32)((nid) + (0x03 << 24))
#define HDA_HASH_PARSTR_KEY(nid) (u32)((nid) + (0x04 << 24))
...
...
@@ -1356,7 +1357,8 @@ u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid)
if
(
!
codec
->
no_trigger_sense
)
{
pincap
=
snd_hda_query_pin_caps
(
codec
,
nid
);
if
(
pincap
&
AC_PINCAP_TRIG_REQ
)
/* need trigger? */
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_SENSE
,
0
);
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_SENSE
,
0
);
}
return
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_PIN_SENSE
,
0
);
...
...
@@ -2439,27 +2441,27 @@ static struct snd_kcontrol_new dig_mixes[] = {
{
.
access
=
SNDRV_CTL_ELEM_ACCESS_READ
,
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
CON_MASK
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
CON_MASK
),
.
info
=
snd_hda_spdif_mask_info
,
.
get
=
snd_hda_spdif_cmask_get
,
},
{
.
access
=
SNDRV_CTL_ELEM_ACCESS_READ
,
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
PRO_MASK
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
PRO_MASK
),
.
info
=
snd_hda_spdif_mask_info
,
.
get
=
snd_hda_spdif_pmask_get
,
},
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
DEFAULT
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
DEFAULT
),
.
info
=
snd_hda_spdif_mask_info
,
.
get
=
snd_hda_spdif_default_get
,
.
put
=
snd_hda_spdif_default_put
,
},
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
SWITCH
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
SWITCH
),
.
info
=
snd_hda_spdif_out_switch_info
,
.
get
=
snd_hda_spdif_out_switch_get
,
.
put
=
snd_hda_spdif_out_switch_put
,
...
...
@@ -2610,7 +2612,7 @@ static int snd_hda_spdif_in_status_get(struct snd_kcontrol *kcontrol,
static
struct
snd_kcontrol_new
dig_in_ctls
[]
=
{
{
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
CAPTURE
,
SWITCH
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
CAPTURE
,
SWITCH
),
.
info
=
snd_hda_spdif_in_switch_info
,
.
get
=
snd_hda_spdif_in_switch_get
,
.
put
=
snd_hda_spdif_in_switch_put
,
...
...
@@ -2618,7 +2620,7 @@ static struct snd_kcontrol_new dig_in_ctls[] = {
{
.
access
=
SNDRV_CTL_ELEM_ACCESS_READ
,
.
iface
=
SNDRV_CTL_ELEM_IFACE_MIXER
,
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
CAPTURE
,
DEFAULT
),
.
name
=
SNDRV_CTL_NAME_IEC958
(
""
,
CAPTURE
,
DEFAULT
),
.
info
=
snd_hda_spdif_mask_info
,
.
get
=
snd_hda_spdif_in_status_get
,
},
...
...
@@ -2979,8 +2981,12 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate,
val
|=
channels
-
1
;
switch
(
snd_pcm_format_width
(
format
))
{
case
8
:
val
|=
0x00
;
break
;
case
16
:
val
|=
0x10
;
break
;
case
8
:
val
|=
0x00
;
break
;
case
16
:
val
|=
0x10
;
break
;
case
20
:
case
24
:
case
32
:
...
...
@@ -3298,7 +3304,8 @@ static int get_empty_pcm_device(struct hda_bus *bus, int type)
if
(
!
test_and_set_bit
(
audio_idx
[
type
][
i
],
bus
->
pcm_dev_bits
))
return
audio_idx
[
type
][
i
];
snd_printk
(
KERN_WARNING
"Too many %s devices
\n
"
,
snd_hda_pcm_type_name
[
type
]);
snd_printk
(
KERN_WARNING
"Too many %s devices
\n
"
,
snd_hda_pcm_type_name
[
type
]);
return
-
EAGAIN
;
}
...
...
@@ -4089,7 +4096,7 @@ static int is_in_nid_list(hda_nid_t nid, hda_nid_t *list)
/*
* Sort an associated group of pins according to their sequence numbers.
*/
static
void
sort_pins_by_sequence
(
hda_nid_t
*
pins
,
short
*
sequences
,
static
void
sort_pins_by_sequence
(
hda_nid_t
*
pins
,
short
*
sequences
,
int
num_pins
)
{
int
i
,
j
;
...
...
@@ -4186,9 +4193,9 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec,
case
AC_JACK_SPEAKER
:
seq
=
get_defcfg_sequence
(
def_conf
);
assoc
=
get_defcfg_association
(
def_conf
);
if
(
!
assoc
)
if
(
!
assoc
)
continue
;
if
(
!
assoc_speaker
)
if
(
!
assoc_speaker
)
assoc_speaker
=
assoc
;
else
if
(
assoc_speaker
!=
assoc
)
continue
;
...
...
sound/pci/hda/hda_eld.c
浏览文件 @
f1cf9a66
...
...
@@ -331,6 +331,7 @@ int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid)
return
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_HDMI_DIP_SIZE
,
AC_DIPSIZE_ELD_BUF
);
}
EXPORT_SYMBOL_HDA
(
snd_hdmi_get_eld_size
);
int
snd_hdmi_get_eld
(
struct
hdmi_eld
*
eld
,
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
...
...
@@ -366,6 +367,7 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
kfree
(
buf
);
return
ret
;
}
EXPORT_SYMBOL_HDA
(
snd_hdmi_get_eld
);
static
void
hdmi_show_short_audio_desc
(
struct
cea_sad
*
a
)
{
...
...
@@ -404,6 +406,7 @@ void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen)
}
buf
[
j
]
=
'\0'
;
/* necessary when j == 0 */
}
EXPORT_SYMBOL_HDA
(
snd_print_channel_allocation
);
void
snd_hdmi_show_eld
(
struct
hdmi_eld
*
e
)
{
...
...
@@ -422,6 +425,7 @@ void snd_hdmi_show_eld(struct hdmi_eld *e)
for
(
i
=
0
;
i
<
e
->
sad_count
;
i
++
)
hdmi_show_short_audio_desc
(
e
->
sad
+
i
);
}
EXPORT_SYMBOL_HDA
(
snd_hdmi_show_eld
);
#ifdef CONFIG_PROC_FS
...
...
@@ -580,6 +584,7 @@ int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld,
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_eld_proc_new
);
void
snd_hda_eld_proc_free
(
struct
hda_codec
*
codec
,
struct
hdmi_eld
*
eld
)
{
...
...
@@ -588,5 +593,6 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld)
eld
->
proc_entry
=
NULL
;
}
}
EXPORT_SYMBOL_HDA
(
snd_hda_eld_proc_free
);
#endif
/* CONFIG_PROC_FS */
sound/pci/hda/hda_intel.c
浏览文件 @
f1cf9a66
...
...
@@ -267,7 +267,8 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
#define RIRB_INT_MASK 0x05
/* STATESTS int mask: S3,SD2,SD1,SD0 */
#define AZX_MAX_CODECS 4
#define AZX_MAX_CODECS 8
#define AZX_DEFAULT_CODECS 4
#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
/* SD_CTL bits */
...
...
@@ -1367,6 +1368,7 @@ static void azx_bus_reset(struct hda_bus *bus)
/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
static
unsigned
int
azx_max_codecs
[
AZX_NUM_DRIVERS
]
__devinitdata
=
{
[
AZX_DRIVER_NVIDIA
]
=
8
,
[
AZX_DRIVER_TERA
]
=
1
,
};
...
...
@@ -1399,7 +1401,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
codecs
=
0
;
max_slots
=
azx_max_codecs
[
chip
->
driver_type
];
if
(
!
max_slots
)
max_slots
=
AZX_
MAX
_CODECS
;
max_slots
=
AZX_
DEFAULT
_CODECS
;
/* First try to probe all given codec slots */
for
(
c
=
0
;
c
<
max_slots
;
c
++
)
{
...
...
@@ -2263,10 +2265,12 @@ static int azx_dev_free(struct snd_device *device)
static
struct
snd_pci_quirk
position_fix_list
[]
__devinitdata
=
{
SND_PCI_QUIRK
(
0x1028
,
0x01cc
,
"Dell D820"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1028
,
0x01de
,
"Dell Precision 390"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1028
,
0x01f6
,
"Dell Latitude 131L"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x103c
,
0x306d
,
"HP dv3"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1106
,
0x3288
,
"ASUS M2V-MX SE"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x813d
,
"ASUS P5AD2"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1462
,
0x1002
,
"MSI Wind U115"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1565
,
0x820f
,
"Biostar Microtech"
,
POS_FIX_LPIB
),
{}
};
...
...
@@ -2354,6 +2358,7 @@ static void __devinit check_probe_mask(struct azx *chip, int dev)
static
struct
snd_pci_quirk
msi_black_list
[]
__devinitdata
=
{
SND_PCI_QUIRK
(
0x1043
,
0x81f2
,
"ASUS"
,
0
),
/* Athlon64 X2 + nvidia */
SND_PCI_QUIRK
(
0x1043
,
0x81f6
,
"ASUS"
,
0
),
/* nvidia */
SND_PCI_QUIRK
(
0x1849
,
0x0888
,
"ASRock"
,
0
),
/* Athlon64 X2 + nvidia */
{}
};
...
...
sound/pci/hda/patch_hdmi.c
0 → 100644
浏览文件 @
f1cf9a66
此差异已折叠。
点击以展开。
sound/pci/hda/patch_intelhdmi.c
浏览文件 @
f1cf9a66
此差异已折叠。
点击以展开。
sound/pci/hda/patch_nvhdmi.c
浏览文件 @
f1cf9a66
...
...
@@ -29,13 +29,23 @@
#include "hda_codec.h"
#include "hda_local.h"
#define MAX_HDMI_CVTS 1
#define MAX_HDMI_PINS 1
#include "patch_hdmi.c"
static
char
*
nvhdmi_pcm_names
[
MAX_HDMI_CVTS
]
=
{
"NVIDIA HDMI"
,
};
/* define below to restrict the supported rates and formats */
/* #define LIMITED_RATE_FMT_SUPPORT */
struct
nvhdmi_spec
{
struct
hda_multi_out
multiout
;
struct
hda_pcm
pcm_rec
;
enum
HDACodec
{
HDA_CODEC_NVIDIA_MCP7X
,
HDA_CODEC_NVIDIA_MCP89
,
HDA_CODEC_NVIDIA_GT21X
,
HDA_CODEC_INVALID
};
#define Nv_VERB_SET_Channel_Allocation 0xF79
...
...
@@ -43,15 +53,18 @@ struct nvhdmi_spec {
#define Nv_VERB_SET_Audio_Protection_On 0xF98
#define Nv_VERB_SET_Audio_Protection_Off 0xF99
#define Nv_Master_Convert_nid 0x04
#define Nv_Master_Pin_nid 0x05
#define nvhdmi_master_con_nid_7x 0x04
#define nvhdmi_master_pin_nid_7x 0x05
#define nvhdmi_master_con_nid_89 0x04
#define nvhdmi_master_pin_nid_89 0x05
static
hda_nid_t
nvhdmi_con
vert_nids
[
4
]
=
{
static
hda_nid_t
nvhdmi_con
_nids_7x
[
4
]
=
{
/*front, rear, clfe, rear_surr */
0x6
,
0x8
,
0xa
,
0xc
,
};
static
struct
hda_verb
nvhdmi_basic_init
[]
=
{
static
struct
hda_verb
nvhdmi_basic_init
_7x
[]
=
{
/* set audio protect on */
{
0x1
,
Nv_VERB_SET_Audio_Protection_On
,
0x1
},
/* enable digital output on pin widget */
...
...
@@ -84,22 +97,60 @@ static struct hda_verb nvhdmi_basic_init[] = {
*/
static
int
nvhdmi_build_controls
(
struct
hda_codec
*
codec
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
int
err
;
int
i
;
err
=
snd_hda_create_spdif_out_ctls
(
codec
,
spec
->
multiout
.
dig_out_nid
);
if
((
spec
->
codec_type
==
HDA_CODEC_NVIDIA_MCP89
)
||
(
spec
->
codec_type
==
HDA_CODEC_NVIDIA_GT21X
))
{
for
(
i
=
0
;
i
<
codec
->
num_pcms
;
i
++
)
{
err
=
snd_hda_create_spdif_out_ctls
(
codec
,
spec
->
cvt
[
i
]);
if
(
err
<
0
)
return
err
;
}
}
else
{
err
=
snd_hda_create_spdif_out_ctls
(
codec
,
spec
->
multiout
.
dig_out_nid
);
if
(
err
<
0
)
return
err
;
}
return
0
;
}
static
int
nvhdmi_init
(
struct
hda_codec
*
codec
)
{
snd_hda_sequence_write
(
codec
,
nvhdmi_basic_init
);
struct
hdmi_spec
*
spec
=
codec
->
spec
;
int
i
;
if
((
spec
->
codec_type
==
HDA_CODEC_NVIDIA_MCP89
)
||
(
spec
->
codec_type
==
HDA_CODEC_NVIDIA_GT21X
))
{
for
(
i
=
0
;
spec
->
pin
[
i
];
i
++
)
{
hdmi_enable_output
(
codec
,
spec
->
pin
[
i
]);
snd_hda_codec_write
(
codec
,
spec
->
pin
[
i
],
0
,
AC_VERB_SET_UNSOLICITED_ENABLE
,
AC_USRSP_EN
|
spec
->
pin
[
i
]);
}
}
else
{
snd_hda_sequence_write
(
codec
,
nvhdmi_basic_init_7x
);
}
return
0
;
}
static
void
nvhdmi_free
(
struct
hda_codec
*
codec
)
{
struct
hdmi_spec
*
spec
=
codec
->
spec
;
int
i
;
if
((
spec
->
codec_type
==
HDA_CODEC_NVIDIA_MCP89
)
||
(
spec
->
codec_type
==
HDA_CODEC_NVIDIA_GT21X
))
{
for
(
i
=
0
;
i
<
spec
->
num_pins
;
i
++
)
snd_hda_eld_proc_free
(
codec
,
&
spec
->
sink_eld
[
i
]);
}
kfree
(
spec
);
}
/*
* Digital out
*/
...
...
@@ -107,25 +158,25 @@ static int nvhdmi_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
struct
hda_codec
*
codec
,
struct
snd_pcm_substream
*
substream
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
return
snd_hda_multi_out_dig_open
(
codec
,
&
spec
->
multiout
);
}
static
int
nvhdmi_dig_playback_pcm_close_8ch
(
struct
hda_pcm_stream
*
hinfo
,
static
int
nvhdmi_dig_playback_pcm_close_8ch
_7x
(
struct
hda_pcm_stream
*
hinfo
,
struct
hda_codec
*
codec
,
struct
snd_pcm_substream
*
substream
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
int
i
;
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
snd_hda_codec_write
(
codec
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_CHANNEL_STREAMID
,
0
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
/* set the stream id */
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
0
,
snd_hda_codec_write
(
codec
,
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_CHANNEL_STREAMID
,
0
);
/* set the stream format */
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
0
,
snd_hda_codec_write
(
codec
,
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_STREAM_FORMAT
,
0
);
}
...
...
@@ -136,10 +187,25 @@ static int nvhdmi_dig_playback_pcm_close_2ch(struct hda_pcm_stream *hinfo,
struct
hda_codec
*
codec
,
struct
snd_pcm_substream
*
substream
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
return
snd_hda_multi_out_dig_close
(
codec
,
&
spec
->
multiout
);
}
static
int
nvhdmi_dig_playback_pcm_prepare_8ch_89
(
struct
hda_pcm_stream
*
hinfo
,
struct
hda_codec
*
codec
,
unsigned
int
stream_tag
,
unsigned
int
format
,
struct
snd_pcm_substream
*
substream
)
{
hdmi_set_channel_count
(
codec
,
hinfo
->
nid
,
substream
->
runtime
->
channels
);
hdmi_setup_audio_infoframe
(
codec
,
hinfo
->
nid
,
substream
);
hdmi_setup_stream
(
codec
,
hinfo
->
nid
,
stream_tag
,
format
);
return
0
;
}
static
int
nvhdmi_dig_playback_pcm_prepare_8ch
(
struct
hda_pcm_stream
*
hinfo
,
struct
hda_codec
*
codec
,
unsigned
int
stream_tag
,
...
...
@@ -181,29 +247,29 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo,
/* turn off SPDIF once; otherwise the IEC958 bits won't be updated */
if
(
codec
->
spdif_status_reset
&&
(
codec
->
spdif_ctls
&
AC_DIG1_ENABLE
))
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_DIGI_CONVERT_1
,
codec
->
spdif_ctls
&
~
AC_DIG1_ENABLE
&
0xff
);
/* set the stream id */
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
0
,
snd_hda_codec_write
(
codec
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_CHANNEL_STREAMID
,
(
stream_tag
<<
4
)
|
0x0
);
/* set the stream format */
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
0
,
snd_hda_codec_write
(
codec
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_STREAM_FORMAT
,
format
);
/* turn on again (if needed) */
/* enable and set the channel status audio/data flag */
if
(
codec
->
spdif_status_reset
&&
(
codec
->
spdif_ctls
&
AC_DIG1_ENABLE
))
{
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_DIGI_CONVERT_1
,
codec
->
spdif_ctls
&
0xff
);
snd_hda_codec_write
(
codec
,
Nv_Master_Convert_nid
,
nvhdmi_master_con_nid_7x
,
0
,
AC_VERB_SET_DIGI_CONVERT_2
,
dataDCC2
);
}
...
...
@@ -220,19 +286,19 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo,
if
(
codec
->
spdif_status_reset
&&
(
codec
->
spdif_ctls
&
AC_DIG1_ENABLE
))
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_DIGI_CONVERT_1
,
codec
->
spdif_ctls
&
~
AC_DIG1_ENABLE
&
0xff
);
/* set the stream id */
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_CHANNEL_STREAMID
,
(
stream_tag
<<
4
)
|
channel_id
);
/* set the stream format */
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_STREAM_FORMAT
,
format
);
...
...
@@ -241,12 +307,12 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo,
if
(
codec
->
spdif_status_reset
&&
(
codec
->
spdif_ctls
&
AC_DIG1_ENABLE
))
{
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_DIGI_CONVERT_1
,
codec
->
spdif_ctls
&
0xff
);
snd_hda_codec_write
(
codec
,
nvhdmi_con
vert_nids
[
i
],
nvhdmi_con
_nids_7x
[
i
],
0
,
AC_VERB_SET_DIGI_CONVERT_2
,
dataDCC2
);
}
...
...
@@ -261,28 +327,47 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo,
return
0
;
}
static
int
nvhdmi_playback_pcm_cleanup
(
struct
hda_pcm_stream
*
hinfo
,
struct
hda_codec
*
codec
,
struct
snd_pcm_substream
*
substream
)
{
return
0
;
}
static
int
nvhdmi_dig_playback_pcm_prepare_2ch
(
struct
hda_pcm_stream
*
hinfo
,
struct
hda_codec
*
codec
,
unsigned
int
stream_tag
,
unsigned
int
format
,
struct
snd_pcm_substream
*
substream
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
return
snd_hda_multi_out_dig_prepare
(
codec
,
&
spec
->
multiout
,
stream_tag
,
format
,
substream
);
}
static
struct
hda_pcm_stream
nvhdmi_pcm_digital_playback_8ch
=
{
static
struct
hda_pcm_stream
nvhdmi_pcm_digital_playback_8ch_89
=
{
.
substreams
=
1
,
.
channels_min
=
2
,
.
rates
=
SUPPORTED_RATES
,
.
maxbps
=
SUPPORTED_MAXBPS
,
.
formats
=
SUPPORTED_FORMATS
,
.
ops
=
{
.
prepare
=
nvhdmi_dig_playback_pcm_prepare_8ch_89
,
.
cleanup
=
nvhdmi_playback_pcm_cleanup
,
},
};
static
struct
hda_pcm_stream
nvhdmi_pcm_digital_playback_8ch_7x
=
{
.
substreams
=
1
,
.
channels_min
=
2
,
.
channels_max
=
8
,
.
nid
=
Nv_Master_Convert_nid
,
.
nid
=
nvhdmi_master_con_nid_7x
,
.
rates
=
SUPPORTED_RATES
,
.
maxbps
=
SUPPORTED_MAXBPS
,
.
formats
=
SUPPORTED_FORMATS
,
.
ops
=
{
.
open
=
nvhdmi_dig_playback_pcm_open
,
.
close
=
nvhdmi_dig_playback_pcm_close_8ch
,
.
close
=
nvhdmi_dig_playback_pcm_close_8ch
_7x
,
.
prepare
=
nvhdmi_dig_playback_pcm_prepare_8ch
},
};
...
...
@@ -291,7 +376,7 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_2ch = {
.
substreams
=
1
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
nid
=
Nv_Master_Convert_nid
,
.
nid
=
nvhdmi_master_con_nid_7x
,
.
rates
=
SUPPORTED_RATES
,
.
maxbps
=
SUPPORTED_MAXBPS
,
.
formats
=
SUPPORTED_FORMATS
,
...
...
@@ -302,10 +387,36 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_2ch = {
},
};
static
int
nvhdmi_build_pcms_8ch
(
struct
hda_codec
*
codec
)
static
int
nvhdmi_build_pcms_8ch
_89
(
struct
hda_codec
*
codec
)
{
struct
nvhdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_pcm
*
info
=
&
spec
->
pcm_rec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_pcm
*
info
=
spec
->
pcm_rec
;
int
i
;
codec
->
num_pcms
=
spec
->
num_cvts
;
codec
->
pcm_info
=
info
;
for
(
i
=
0
;
i
<
codec
->
num_pcms
;
i
++
,
info
++
)
{
unsigned
int
chans
;
chans
=
get_wcaps
(
codec
,
spec
->
cvt
[
i
]);
chans
=
get_wcaps_channels
(
chans
);
info
->
name
=
nvhdmi_pcm_names
[
i
];
info
->
pcm_type
=
HDA_PCM_TYPE_HDMI
;
info
->
stream
[
SNDRV_PCM_STREAM_PLAYBACK
]
=
nvhdmi_pcm_digital_playback_8ch_89
;
info
->
stream
[
SNDRV_PCM_STREAM_PLAYBACK
].
nid
=
spec
->
cvt
[
i
];
info
->
stream
[
SNDRV_PCM_STREAM_PLAYBACK
].
channels_max
=
chans
;
}
return
0
;
}
static
int
nvhdmi_build_pcms_8ch_7x
(
struct
hda_codec
*
codec
)
{
struct
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_pcm
*
info
=
spec
->
pcm_rec
;
codec
->
num_pcms
=
1
;
codec
->
pcm_info
=
info
;
...
...
@@ -313,15 +424,15 @@ static int nvhdmi_build_pcms_8ch(struct hda_codec *codec)
info
->
name
=
"NVIDIA HDMI"
;
info
->
pcm_type
=
HDA_PCM_TYPE_HDMI
;
info
->
stream
[
SNDRV_PCM_STREAM_PLAYBACK
]
=
nvhdmi_pcm_digital_playback_8ch
;
=
nvhdmi_pcm_digital_playback_8ch
_7x
;
return
0
;
}
static
int
nvhdmi_build_pcms_2ch
(
struct
hda_codec
*
codec
)
{
struct
nv
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_pcm
*
info
=
&
spec
->
pcm_rec
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_pcm
*
info
=
spec
->
pcm_rec
;
codec
->
num_pcms
=
1
;
codec
->
pcm_info
=
info
;
...
...
@@ -334,14 +445,17 @@ static int nvhdmi_build_pcms_2ch(struct hda_codec *codec)
return
0
;
}
static
void
nvhdmi_free
(
struct
hda_codec
*
codec
)
{
kfree
(
codec
->
spec
);
}
static
struct
hda_codec_ops
nvhdmi_patch_ops_8ch_89
=
{
.
build_controls
=
nvhdmi_build_controls
,
.
build_pcms
=
nvhdmi_build_pcms_8ch_89
,
.
init
=
nvhdmi_init
,
.
free
=
nvhdmi_free
,
.
unsol_event
=
hdmi_unsol_event
,
};
static
struct
hda_codec_ops
nvhdmi_patch_ops_8ch
=
{
static
struct
hda_codec_ops
nvhdmi_patch_ops_8ch
_7x
=
{
.
build_controls
=
nvhdmi_build_controls
,
.
build_pcms
=
nvhdmi_build_pcms_8ch
,
.
build_pcms
=
nvhdmi_build_pcms_8ch
_7x
,
.
init
=
nvhdmi_init
,
.
free
=
nvhdmi_free
,
};
...
...
@@ -353,9 +467,36 @@ static struct hda_codec_ops nvhdmi_patch_ops_2ch = {
.
free
=
nvhdmi_free
,
};
static
int
patch_nvhdmi_8ch
(
struct
hda_codec
*
codec
)
static
int
patch_nvhdmi_8ch_89
(
struct
hda_codec
*
codec
)
{
struct
hdmi_spec
*
spec
;
int
i
;
spec
=
kzalloc
(
sizeof
(
*
spec
),
GFP_KERNEL
);
if
(
spec
==
NULL
)
return
-
ENOMEM
;
codec
->
spec
=
spec
;
spec
->
codec_type
=
HDA_CODEC_NVIDIA_MCP89
;
if
(
hdmi_parse_codec
(
codec
)
<
0
)
{
codec
->
spec
=
NULL
;
kfree
(
spec
);
return
-
EINVAL
;
}
codec
->
patch_ops
=
nvhdmi_patch_ops_8ch_89
;
for
(
i
=
0
;
i
<
spec
->
num_pins
;
i
++
)
snd_hda_eld_proc_new
(
codec
,
&
spec
->
sink_eld
[
i
],
i
);
init_channel_allocations
();
return
0
;
}
static
int
patch_nvhdmi_8ch_7x
(
struct
hda_codec
*
codec
)
{
struct
nv
hdmi_spec
*
spec
;
struct
hdmi_spec
*
spec
;
spec
=
kzalloc
(
sizeof
(
*
spec
),
GFP_KERNEL
);
if
(
spec
==
NULL
)
...
...
@@ -365,16 +506,17 @@ static int patch_nvhdmi_8ch(struct hda_codec *codec)
spec
->
multiout
.
num_dacs
=
0
;
/* no analog */
spec
->
multiout
.
max_channels
=
8
;
spec
->
multiout
.
dig_out_nid
=
Nv_Master_Convert_nid
;
spec
->
multiout
.
dig_out_nid
=
nvhdmi_master_con_nid_7x
;
spec
->
codec_type
=
HDA_CODEC_NVIDIA_MCP7X
;
codec
->
patch_ops
=
nvhdmi_patch_ops_8ch
;
codec
->
patch_ops
=
nvhdmi_patch_ops_8ch
_7x
;
return
0
;
}
static
int
patch_nvhdmi_2ch
(
struct
hda_codec
*
codec
)
{
struct
nv
hdmi_spec
*
spec
;
struct
hdmi_spec
*
spec
;
spec
=
kzalloc
(
sizeof
(
*
spec
),
GFP_KERNEL
);
if
(
spec
==
NULL
)
...
...
@@ -384,7 +526,8 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec)
spec
->
multiout
.
num_dacs
=
0
;
/* no analog */
spec
->
multiout
.
max_channels
=
2
;
spec
->
multiout
.
dig_out_nid
=
Nv_Master_Convert_nid
;
spec
->
multiout
.
dig_out_nid
=
nvhdmi_master_con_nid_7x
;
spec
->
codec_type
=
HDA_CODEC_NVIDIA_MCP7X
;
codec
->
patch_ops
=
nvhdmi_patch_ops_2ch
;
...
...
@@ -395,13 +538,24 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec)
* patch entries
*/
static
struct
hda_codec_preset
snd_hda_preset_nvhdmi
[]
=
{
{
.
id
=
0x10de0002
,
.
name
=
"MCP78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch
},
{
.
id
=
0x10de0003
,
.
name
=
"MCP78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch
},
{
.
id
=
0x10de0005
,
.
name
=
"MCP78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch
},
{
.
id
=
0x10de0006
,
.
name
=
"MCP78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch
},
{
.
id
=
0x10de0007
,
.
name
=
"MCP7A HDMI"
,
.
patch
=
patch_nvhdmi_8ch
},
{
.
id
=
0x10de0067
,
.
name
=
"MCP67 HDMI"
,
.
patch
=
patch_nvhdmi_2ch
},
{
.
id
=
0x10de8001
,
.
name
=
"MCP73 HDMI"
,
.
patch
=
patch_nvhdmi_2ch
},
{
.
id
=
0x10de0002
,
.
name
=
"MCP77/78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_7x
},
{
.
id
=
0x10de0003
,
.
name
=
"MCP77/78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_7x
},
{
.
id
=
0x10de0005
,
.
name
=
"MCP77/78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_7x
},
{
.
id
=
0x10de0006
,
.
name
=
"MCP77/78 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_7x
},
{
.
id
=
0x10de0007
,
.
name
=
"MCP79/7A HDMI"
,
.
patch
=
patch_nvhdmi_8ch_7x
},
{
.
id
=
0x10de000c
,
.
name
=
"MCP89 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_89
},
{
.
id
=
0x10de000b
,
.
name
=
"GT21x HDMI"
,
.
patch
=
patch_nvhdmi_8ch_89
},
{
.
id
=
0x10de000d
,
.
name
=
"GT240 HDMI"
,
.
patch
=
patch_nvhdmi_8ch_89
},
{}
/* terminator */
};
...
...
@@ -412,9 +566,12 @@ MODULE_ALIAS("snd-hda-codec-id:10de0006");
MODULE_ALIAS
(
"snd-hda-codec-id:10de0007"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de0067"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de8001"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de000c"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de000b"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de000d"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"N
vidia
HDMI HD-audio codec"
);
MODULE_DESCRIPTION
(
"N
VIDIA
HDMI HD-audio codec"
);
static
struct
hda_codec_preset_list
nvhdmi_list
=
{
.
preset
=
snd_hda_preset_nvhdmi
,
...
...
sound/pci/hda/patch_realtek.c
浏览文件 @
f1cf9a66
...
...
@@ -4915,7 +4915,7 @@ static void fixup_automic_adc(struct hda_codec *codec)
static void fixup_single_adc(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
hda_nid_t pin;
hda_nid_t pin
= 0
;
int i;
/* search for the input pin; there must be only one */
...
...
@@ -13561,6 +13561,8 @@ static void alc269_lifebook_unsol_event(struct hda_codec *codec,
static void alc269_quanta_fl1_setup(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
spec->autocfg.hp_pins[0] = 0x15;
spec->autocfg.speaker_pins[0] = 0x14;
spec->ext_mic.pin = 0x18;
spec->ext_mic.mux_idx = 0;
spec->int_mic.pin = 0x19;
...
...
@@ -13656,6 +13658,8 @@ static void alc269_laptop_unsol_event(struct hda_codec *codec,
static void alc269_laptop_dmic_setup(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
spec->autocfg.hp_pins[0] = 0x15;
spec->autocfg.speaker_pins[0] = 0x14;
spec->ext_mic.pin = 0x18;
spec->ext_mic.mux_idx = 0;
spec->int_mic.pin = 0x12;
...
...
@@ -13666,6 +13670,8 @@ static void alc269_laptop_dmic_setup(struct hda_codec *codec)
static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
spec->autocfg.hp_pins[0] = 0x15;
spec->autocfg.speaker_pins[0] = 0x14;
spec->ext_mic.pin = 0x18;
spec->ext_mic.mux_idx = 0;
spec->int_mic.pin = 0x12;
...
...
@@ -13676,6 +13682,8 @@ static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
static void alc269_laptop_amic_setup(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
spec->autocfg.hp_pins[0] = 0x15;
spec->autocfg.speaker_pins[0] = 0x14;
spec->ext_mic.pin = 0x18;
spec->ext_mic.mux_idx = 0;
spec->int_mic.pin = 0x19;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录