Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
b97bedcd
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
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看板
提交
b97bedcd
编写于
4月 21, 2009
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/hda-cache' into topic/hda
上级
85894077
586be3fc
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
90 addition
and
49 deletion
+90
-49
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+74
-40
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+1
-0
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+10
-9
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+5
-0
未找到文件。
sound/pci/hda/hda_codec.c
浏览文件 @
b97bedcd
...
...
@@ -175,14 +175,23 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
unsigned
int
verb
,
unsigned
int
parm
)
{
struct
hda_bus
*
bus
=
codec
->
bus
;
unsigned
int
res
;
unsigned
int
cmd
,
res
;
int
repeated
=
0
;
res
=
make_codec_cmd
(
codec
,
nid
,
direct
,
verb
,
parm
);
cmd
=
make_codec_cmd
(
codec
,
nid
,
direct
,
verb
,
parm
);
snd_hda_power_up
(
codec
);
mutex_lock
(
&
bus
->
cmd_mutex
);
if
(
!
bus
->
ops
.
command
(
bus
,
res
))
again:
if
(
!
bus
->
ops
.
command
(
bus
,
cmd
))
{
res
=
bus
->
ops
.
get_response
(
bus
);
else
if
(
res
==
-
1
&&
bus
->
rirb_error
)
{
if
(
repeated
++
<
1
)
{
snd_printd
(
KERN_WARNING
"hda_codec: "
"Trying verb 0x%08x again
\n
"
,
cmd
);
goto
again
;
}
}
}
else
res
=
(
unsigned
int
)
-
1
;
mutex_unlock
(
&
bus
->
cmd_mutex
);
snd_hda_power_down
(
codec
);
...
...
@@ -1056,6 +1065,8 @@ 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_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))
#define INFO_AMP_CAPS (1<<0)
#define INFO_AMP_VOL(ch) (1 << (1 + (ch)))
...
...
@@ -1146,19 +1157,32 @@ int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
}
EXPORT_SYMBOL_HDA
(
snd_hda_override_amp_caps
);
u32
snd_hda_query_pin_caps
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
static
unsigned
int
query_caps_hash
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
u32
key
,
unsigned
int
(
*
func
)(
struct
hda_codec
*
,
hda_nid_t
))
{
struct
hda_amp_info
*
info
;
info
=
get_alloc_amp_hash
(
codec
,
HDA_HASH_PINCAP_KEY
(
nid
)
);
info
=
get_alloc_amp_hash
(
codec
,
key
);
if
(
!
info
)
return
0
;
if
(
!
info
->
head
.
val
)
{
info
->
amp_caps
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_PIN_CAP
);
info
->
head
.
val
|=
INFO_AMP_CAPS
;
info
->
amp_caps
=
func
(
codec
,
nid
);
}
return
info
->
amp_caps
;
}
static
unsigned
int
read_pin_cap
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
return
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_PIN_CAP
);
}
u32
snd_hda_query_pin_caps
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
return
query_caps_hash
(
codec
,
nid
,
HDA_HASH_PINCAP_KEY
(
nid
),
read_pin_cap
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_query_pin_caps
);
/*
...
...
@@ -2547,6 +2571,41 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate,
}
EXPORT_SYMBOL_HDA
(
snd_hda_calc_stream_format
);
static
unsigned
int
get_pcm_param
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
unsigned
int
val
=
0
;
if
(
nid
!=
codec
->
afg
&&
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_FORMAT_OVRD
))
val
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_PCM
);
if
(
!
val
||
val
==
-
1
)
val
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_PCM
);
if
(
!
val
||
val
==
-
1
)
return
0
;
return
val
;
}
static
unsigned
int
query_pcm_param
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
return
query_caps_hash
(
codec
,
nid
,
HDA_HASH_PARPCM_KEY
(
nid
),
get_pcm_param
);
}
static
unsigned
int
get_stream_param
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
unsigned
int
streams
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_STREAM
);
if
(
!
streams
||
streams
==
-
1
)
streams
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_STREAM
);
if
(
!
streams
||
streams
==
-
1
)
return
0
;
return
streams
;
}
static
unsigned
int
query_stream_param
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
return
query_caps_hash
(
codec
,
nid
,
HDA_HASH_PARSTR_KEY
(
nid
),
get_stream_param
);
}
/**
* snd_hda_query_supported_pcm - query the supported PCM rates and formats
* @codec: the HDA codec
...
...
@@ -2565,15 +2624,8 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid,
{
unsigned
int
i
,
val
,
wcaps
;
val
=
0
;
wcaps
=
get_wcaps
(
codec
,
nid
);
if
(
nid
!=
codec
->
afg
&&
(
wcaps
&
AC_WCAP_FORMAT_OVRD
))
{
val
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_PCM
);
if
(
val
==
-
1
)
return
-
EIO
;
}
if
(
!
val
)
val
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_PCM
);
val
=
query_pcm_param
(
codec
,
nid
);
if
(
ratesp
)
{
u32
rates
=
0
;
...
...
@@ -2595,15 +2647,9 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid,
u64
formats
=
0
;
unsigned
int
streams
,
bps
;
streams
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_STREAM
);
if
(
streams
==
-
1
)
streams
=
query_stream_param
(
codec
,
nid
);
if
(
!
streams
)
return
-
EIO
;
if
(
!
streams
)
{
streams
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_STREAM
);
if
(
streams
==
-
1
)
return
-
EIO
;
}
bps
=
0
;
if
(
streams
&
AC_SUPFMT_PCM
)
{
...
...
@@ -2677,17 +2723,9 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid,
int
i
;
unsigned
int
val
=
0
,
rate
,
stream
;
if
(
nid
!=
codec
->
afg
&&
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_FORMAT_OVRD
))
{
val
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_PCM
);
if
(
val
==
-
1
)
return
0
;
}
if
(
!
val
)
{
val
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_PCM
);
if
(
val
==
-
1
)
return
0
;
}
val
=
query_pcm_param
(
codec
,
nid
);
if
(
!
val
)
return
0
;
rate
=
format
&
0xff00
;
for
(
i
=
0
;
i
<
AC_PAR_PCM_RATE_BITS
;
i
++
)
...
...
@@ -2699,12 +2737,8 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid,
if
(
i
>=
AC_PAR_PCM_RATE_BITS
)
return
0
;
stream
=
snd_hda_param_read
(
codec
,
nid
,
AC_PAR_STREAM
);
if
(
stream
==
-
1
)
return
0
;
if
(
!
stream
&&
nid
!=
codec
->
afg
)
stream
=
snd_hda_param_read
(
codec
,
codec
->
afg
,
AC_PAR_STREAM
);
if
(
!
stream
||
stream
==
-
1
)
stream
=
query_stream_param
(
codec
,
nid
);
if
(
!
stream
)
return
0
;
if
(
stream
&
AC_SUPFMT_PCM
)
{
...
...
sound/pci/hda/hda_codec.h
浏览文件 @
b97bedcd
...
...
@@ -623,6 +623,7 @@ struct hda_bus {
/* misc op flags */
unsigned
int
needs_damn_long_delay
:
1
;
unsigned
int
shutdown
:
1
;
/* being unloaded */
unsigned
int
rirb_error
:
1
;
/* error in codec communication */
};
/*
...
...
sound/pci/hda/hda_intel.c
浏览文件 @
b97bedcd
...
...
@@ -606,6 +606,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
}
if
(
!
chip
->
rirb
.
cmds
)
{
smp_rmb
();
bus
->
rirb_error
=
0
;
return
chip
->
rirb
.
res
;
/* the last value */
}
if
(
time_after
(
jiffies
,
timeout
))
...
...
@@ -625,8 +626,10 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
chip
->
irq
=
-
1
;
pci_disable_msi
(
chip
->
pci
);
chip
->
msi
=
0
;
if
(
azx_acquire_irq
(
chip
,
1
)
<
0
)
if
(
azx_acquire_irq
(
chip
,
1
)
<
0
)
{
bus
->
rirb_error
=
1
;
return
-
1
;
}
goto
again
;
}
...
...
@@ -646,14 +649,12 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
return
-
1
;
}
snd_printk
(
KERN_ERR
"hda_intel: azx_get_response timeout, "
"switching to single_cmd mode: last cmd=0x%08x
\n
"
,
chip
->
last_cmd
);
chip
->
rirb
.
rp
=
azx_readb
(
chip
,
RIRBWP
);
chip
->
rirb
.
cmds
=
0
;
/* switch to single_cmd mode */
chip
->
single_cmd
=
1
;
azx_free_cmd_io
(
chip
);
snd_printk
(
KERN_ERR
"hda_intel: azx_get_response timeout (ERROR): "
"last cmd=0x%08x
\n
"
,
chip
->
last_cmd
);
spin_lock_irq
(
&
chip
->
reg_lock
);
chip
->
rirb
.
cmds
=
0
;
/* reset the index */
bus
->
rirb_error
=
1
;
spin_unlock_irq
(
&
chip
->
reg_lock
);
return
-
1
;
}
...
...
sound/pci/hda/patch_realtek.c
浏览文件 @
b97bedcd
...
...
@@ -1024,6 +1024,9 @@ static void alc_subsystem_id(struct hda_codec *codec,
if (codec->vendor_id == 0x10ec0260)
nid = 0x17;
ass = snd_hda_codec_get_pincfg(codec, nid);
snd_printd("realtek: No valid SSID, "
"checking pincfg 0x%08x for NID 0x%x\n",
nid, ass);
if (!(ass & 1) && !(ass & 0x100000))
return;
if ((ass >> 30) != 1) /* no physical connection */
...
...
@@ -1038,6 +1041,8 @@ static void alc_subsystem_id(struct hda_codec *codec,
if (((ass >> 16) & 0xf) != tmp)
return;
do_sku:
snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
ass & 0xffff, codec->vendor_id);
/*
* 0 : override
* 1 : Swap Jack
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录