Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
b37c0096
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
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看板
提交
b37c0096
编写于
11月 23, 2011
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fix/hda' into topic/hda
Conflicts: sound/pci/hda/patch_realtek.c
上级
8b940fc4
61071594
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
111 addition
and
60 deletion
+111
-60
sound/pci/cs5535audio/cs5535audio_pcm.c
sound/pci/cs5535audio/cs5535audio_pcm.c
+1
-1
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+3
-3
sound/pci/hda/hda_eld.c
sound/pci/hda/hda_eld.c
+19
-9
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cirrus.c
+36
-19
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_hdmi.c
+10
-6
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+23
-11
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+2
-0
sound/pci/lx6464es/lx_core.c
sound/pci/lx6464es/lx_core.c
+16
-7
sound/pci/lx6464es/lx_core.h
sound/pci/lx6464es/lx_core.h
+0
-3
sound/pci/rme9652/hdspm.c
sound/pci/rme9652/hdspm.c
+1
-1
未找到文件。
sound/pci/cs5535audio/cs5535audio_pcm.c
浏览文件 @
b37c0096
...
...
@@ -148,7 +148,7 @@ static int cs5535audio_build_dma_packets(struct cs5535audio *cs5535au,
struct
cs5535audio_dma_desc
*
desc
=
&
((
struct
cs5535audio_dma_desc
*
)
dma
->
desc_buf
.
area
)[
i
];
desc
->
addr
=
cpu_to_le32
(
addr
);
desc
->
size
=
cpu_to_le
32
(
period_bytes
);
desc
->
size
=
cpu_to_le
16
(
period_bytes
);
desc
->
ctlreserved
=
cpu_to_le16
(
PRD_EOP
);
desc_addr
+=
sizeof
(
struct
cs5535audio_dma_desc
);
addr
+=
period_bytes
;
...
...
sound/pci/hda/hda_codec.c
浏览文件 @
b37c0096
...
...
@@ -4046,9 +4046,9 @@ int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
/* Search for codec ID */
for
(
q
=
tbl
;
q
->
subvendor
;
q
++
)
{
unsigned
long
vendorid
=
(
q
->
subdevice
)
|
(
q
->
subvendor
<<
16
)
;
if
(
vendorid
==
codec
->
subsystem_
id
)
unsigned
int
mask
=
0xffff0000
|
q
->
subdevice_mask
;
unsigned
int
id
=
(
q
->
subdevice
|
(
q
->
subvendor
<<
16
))
&
mask
;
if
(
(
codec
->
subsystem_id
&
mask
)
==
id
)
break
;
}
...
...
sound/pci/hda/hda_eld.c
浏览文件 @
b37c0096
...
...
@@ -347,18 +347,28 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
for
(
i
=
0
;
i
<
size
;
i
++
)
{
unsigned
int
val
=
hdmi_get_eld_data
(
codec
,
nid
,
i
);
/*
* Graphics driver might be writing to ELD buffer right now.
* Just abort. The caller will repoll after a while.
*/
if
(
!
(
val
&
AC_ELDD_ELD_VALID
))
{
if
(
!
i
)
{
snd_printd
(
KERN_INFO
"HDMI: invalid ELD data
\n
"
);
ret
=
-
EINVAL
;
goto
error
;
}
snd_printd
(
KERN_INFO
"HDMI: invalid ELD data byte %d
\n
"
,
i
);
val
=
0
;
}
else
val
&=
AC_ELDD_ELD_DATA
;
ret
=
-
EINVAL
;
goto
error
;
}
val
&=
AC_ELDD_ELD_DATA
;
/*
* The first byte cannot be zero. This can happen on some DVI
* connections. Some Intel chips may also need some 250ms delay
* to return non-zero ELD data, even when the graphics driver
* correctly writes ELD content before setting ELD_valid bit.
*/
if
(
!
val
&&
!
i
)
{
snd_printdd
(
KERN_INFO
"HDMI: 0 ELD data
\n
"
);
ret
=
-
EINVAL
;
goto
error
;
}
buf
[
i
]
=
val
;
}
...
...
sound/pci/hda/patch_cirrus.c
浏览文件 @
b37c0096
...
...
@@ -58,6 +58,8 @@ struct cs_spec {
unsigned
int
gpio_mask
;
unsigned
int
gpio_dir
;
unsigned
int
gpio_data
;
unsigned
int
gpio_eapd_hp
;
/* EAPD GPIO bit for headphones */
unsigned
int
gpio_eapd_speaker
;
/* EAPD GPIO bit for speakers */
struct
hda_pcm
pcm_rec
[
2
];
/* PCM information */
...
...
@@ -76,6 +78,7 @@ enum {
CS420X_MBP53
,
CS420X_MBP55
,
CS420X_IMAC27
,
CS420X_APPLE
,
CS420X_AUTO
,
CS420X_MODELS
};
...
...
@@ -237,6 +240,15 @@ static int cs_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
return
snd_hda_multi_out_dig_cleanup
(
codec
,
&
spec
->
multiout
);
}
static
void
cs_update_input_select
(
struct
hda_codec
*
codec
)
{
struct
cs_spec
*
spec
=
codec
->
spec
;
if
(
spec
->
cur_adc
)
snd_hda_codec_write
(
codec
,
spec
->
cur_adc
,
0
,
AC_VERB_SET_CONNECT_SEL
,
spec
->
adc_idx
[
spec
->
cur_input
]);
}
/*
* Analog capture
*/
...
...
@@ -250,6 +262,7 @@ static int cs_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
spec
->
cur_adc
=
spec
->
adc_nid
[
spec
->
cur_input
];
spec
->
cur_adc_stream_tag
=
stream_tag
;
spec
->
cur_adc_format
=
format
;
cs_update_input_select
(
codec
);
snd_hda_codec_setup_stream
(
codec
,
spec
->
cur_adc
,
stream_tag
,
0
,
format
);
return
0
;
}
...
...
@@ -689,10 +702,8 @@ static int change_cur_input(struct hda_codec *codec, unsigned int idx,
spec
->
cur_adc_stream_tag
,
0
,
spec
->
cur_adc_format
);
}
snd_hda_codec_write
(
codec
,
spec
->
cur_adc
,
0
,
AC_VERB_SET_CONNECT_SEL
,
spec
->
adc_idx
[
idx
]);
spec
->
cur_input
=
idx
;
cs_update_input_select
(
codec
);
return
1
;
}
...
...
@@ -920,10 +931,9 @@ static void cs_automute(struct hda_codec *codec)
spdif_present
?
0
:
PIN_OUT
);
}
}
if
(
spec
->
board_config
==
CS420X_MBP53
||
spec
->
board_config
==
CS420X_MBP55
||
spec
->
board_config
==
CS420X_IMAC27
)
{
unsigned
int
gpio
=
hp_present
?
0x02
:
0x08
;
if
(
spec
->
gpio_eapd_hp
)
{
unsigned
int
gpio
=
hp_present
?
spec
->
gpio_eapd_hp
:
spec
->
gpio_eapd_speaker
;
snd_hda_codec_write
(
codec
,
0x01
,
0
,
AC_VERB_SET_GPIO_DATA
,
gpio
);
}
...
...
@@ -973,10 +983,7 @@ static void cs_automic(struct hda_codec *codec)
}
else
{
spec
->
cur_input
=
spec
->
last_input
;
}
snd_hda_codec_write_cache
(
codec
,
spec
->
cur_adc
,
0
,
AC_VERB_SET_CONNECT_SEL
,
spec
->
adc_idx
[
spec
->
cur_input
]);
cs_update_input_select
(
codec
);
}
else
{
if
(
present
)
change_cur_input
(
codec
,
spec
->
automic_idx
,
0
);
...
...
@@ -1073,9 +1080,7 @@ static void init_input(struct hda_codec *codec)
cs_automic
(
codec
);
else
{
spec
->
cur_adc
=
spec
->
adc_nid
[
spec
->
cur_input
];
snd_hda_codec_write
(
codec
,
spec
->
cur_adc
,
0
,
AC_VERB_SET_CONNECT_SEL
,
spec
->
adc_idx
[
spec
->
cur_input
]);
cs_update_input_select
(
codec
);
}
}
else
{
change_cur_input
(
codec
,
spec
->
cur_input
,
1
);
...
...
@@ -1273,6 +1278,7 @@ static const char * const cs420x_models[CS420X_MODELS] = {
[
CS420X_MBP53
]
=
"mbp53"
,
[
CS420X_MBP55
]
=
"mbp55"
,
[
CS420X_IMAC27
]
=
"imac27"
,
[
CS420X_IMAC27
]
=
"apple"
,
[
CS420X_AUTO
]
=
"auto"
,
};
...
...
@@ -1282,7 +1288,13 @@ static const struct snd_pci_quirk cs420x_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x10de
,
0x0d94
,
"MacBookAir 3,1(2)"
,
CS420X_MBP55
),
SND_PCI_QUIRK
(
0x10de
,
0xcb79
,
"MacBookPro 5,5"
,
CS420X_MBP55
),
SND_PCI_QUIRK
(
0x10de
,
0xcb89
,
"MacBookPro 7,1"
,
CS420X_MBP55
),
SND_PCI_QUIRK
(
0x8086
,
0x7270
,
"IMac 27 Inch"
,
CS420X_IMAC27
),
/* this conflicts with too many other models */
/*SND_PCI_QUIRK(0x8086, 0x7270, "IMac 27 Inch", CS420X_IMAC27),*/
{}
/* terminator */
};
static
const
struct
snd_pci_quirk
cs420x_codec_cfg_tbl
[]
=
{
SND_PCI_QUIRK_VENDOR
(
0x106b
,
"Apple"
,
CS420X_APPLE
),
{}
/* terminator */
};
...
...
@@ -1364,6 +1376,10 @@ static int patch_cs420x(struct hda_codec *codec)
spec
->
board_config
=
snd_hda_check_board_config
(
codec
,
CS420X_MODELS
,
cs420x_models
,
cs420x_cfg_tbl
);
if
(
spec
->
board_config
<
0
)
spec
->
board_config
=
snd_hda_check_board_codec_sid_config
(
codec
,
CS420X_MODELS
,
NULL
,
cs420x_codec_cfg_tbl
);
if
(
spec
->
board_config
>=
0
)
fix_pincfg
(
codec
,
spec
->
board_config
,
cs_pincfgs
);
...
...
@@ -1371,10 +1387,11 @@ static int patch_cs420x(struct hda_codec *codec)
case
CS420X_IMAC27
:
case
CS420X_MBP53
:
case
CS420X_MBP55
:
/* GPIO1 = headphones */
/* GPIO3 = speakers */
spec
->
gpio_mask
=
0x0a
;
spec
->
gpio_dir
=
0x0a
;
case
CS420X_APPLE
:
spec
->
gpio_eapd_hp
=
2
;
/* GPIO1 = headphones */
spec
->
gpio_eapd_speaker
=
8
;
/* GPIO3 = speakers */
spec
->
gpio_mask
=
spec
->
gpio_dir
=
spec
->
gpio_eapd_hp
|
spec
->
gpio_eapd_speaker
;
break
;
}
...
...
sound/pci/hda/patch_hdmi.c
浏览文件 @
b37c0096
...
...
@@ -69,6 +69,7 @@ struct hdmi_spec_per_pin {
struct
hda_codec
*
codec
;
struct
hdmi_eld
sink_eld
;
struct
delayed_work
work
;
int
repoll_count
;
};
struct
hdmi_spec
{
...
...
@@ -748,7 +749,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx,
* Unsolicited events
*/
static
void
hdmi_present_sense
(
struct
hdmi_spec_per_pin
*
per_pin
,
bool
retry
);
static
void
hdmi_present_sense
(
struct
hdmi_spec_per_pin
*
per_pin
,
int
repoll
);
static
void
hdmi_intrinsic_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
{
...
...
@@ -766,7 +767,7 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
if
(
pin_idx
<
0
)
return
;
hdmi_present_sense
(
&
spec
->
pins
[
pin_idx
],
true
);
hdmi_present_sense
(
&
spec
->
pins
[
pin_idx
],
1
);
}
static
void
hdmi_non_intrinsic_event
(
struct
hda_codec
*
codec
,
unsigned
int
res
)
...
...
@@ -960,7 +961,7 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
return
0
;
}
static
void
hdmi_present_sense
(
struct
hdmi_spec_per_pin
*
per_pin
,
bool
retry
)
static
void
hdmi_present_sense
(
struct
hdmi_spec_per_pin
*
per_pin
,
int
repoll
)
{
struct
hda_codec
*
codec
=
per_pin
->
codec
;
struct
hdmi_eld
*
eld
=
&
per_pin
->
sink_eld
;
...
...
@@ -989,7 +990,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, bool retry)
if
(
eld_valid
)
{
if
(
!
snd_hdmi_get_eld
(
eld
,
codec
,
pin_nid
))
snd_hdmi_show_eld
(
eld
);
else
if
(
re
try
)
{
else
if
(
re
poll
)
{
queue_delayed_work
(
codec
->
bus
->
workq
,
&
per_pin
->
work
,
msecs_to_jiffies
(
300
));
...
...
@@ -1004,7 +1005,10 @@ static void hdmi_repoll_eld(struct work_struct *work)
struct
hdmi_spec_per_pin
*
per_pin
=
container_of
(
to_delayed_work
(
work
),
struct
hdmi_spec_per_pin
,
work
);
hdmi_present_sense
(
per_pin
,
false
);
if
(
per_pin
->
repoll_count
++
>
6
)
per_pin
->
repoll_count
=
0
;
hdmi_present_sense
(
per_pin
,
per_pin
->
repoll_count
);
}
static
int
hdmi_add_pin
(
struct
hda_codec
*
codec
,
hda_nid_t
pin_nid
)
...
...
@@ -1235,7 +1239,7 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pin_idx)
if
(
err
<
0
)
return
err
;
hdmi_present_sense
(
per_pin
,
false
);
hdmi_present_sense
(
per_pin
,
0
);
return
0
;
}
...
...
sound/pci/hda/patch_realtek.c
浏览文件 @
b37c0096
...
...
@@ -278,6 +278,12 @@ static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
return
false
;
}
static
inline
hda_nid_t
get_capsrc
(
struct
alc_spec
*
spec
,
int
idx
)
{
return
spec
->
capsrc_nids
?
spec
->
capsrc_nids
[
idx
]
:
spec
->
adc_nids
[
idx
];
}
static
void
call_update_outputs
(
struct
hda_codec
*
codec
);
/* select the given imux item; either unmute exclusively or select the route */
...
...
@@ -319,8 +325,7 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx,
adc_idx
=
spec
->
dyn_adc_idx
[
idx
];
}
nid
=
spec
->
capsrc_nids
?
spec
->
capsrc_nids
[
adc_idx
]
:
spec
->
adc_nids
[
adc_idx
];
nid
=
get_capsrc
(
spec
,
adc_idx
);
/* no selection? */
num_conns
=
snd_hda_get_conn_list
(
codec
,
nid
,
NULL
);
...
...
@@ -1071,8 +1076,19 @@ static bool alc_rebuild_imux_for_auto_mic(struct hda_codec *codec)
spec
->
imux_pins
[
2
]
=
spec
->
dock_mic_pin
;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
strcpy
(
imux
->
items
[
i
].
label
,
texts
[
i
]);
if
(
spec
->
imux_pins
[
i
])
if
(
spec
->
imux_pins
[
i
])
{
hda_nid_t
pin
=
spec
->
imux_pins
[
i
];
int
c
;
for
(
c
=
0
;
c
<
spec
->
num_adc_nids
;
c
++
)
{
hda_nid_t
cap
=
get_capsrc
(
spec
,
c
);
int
idx
=
get_connection_index
(
codec
,
cap
,
pin
);
if
(
idx
>=
0
)
{
imux
->
items
[
i
].
index
=
idx
;
break
;
}
}
imux
->
num_items
=
i
+
1
;
}
}
spec
->
num_mux_defs
=
1
;
spec
->
input_mux
=
imux
;
...
...
@@ -1991,10 +2007,8 @@ static int alc_build_controls(struct hda_codec *codec)
if
(
!
kctl
)
kctl
=
snd_hda_find_mixer_ctl
(
codec
,
"Input Source"
);
for
(
i
=
0
;
kctl
&&
i
<
kctl
->
count
;
i
++
)
{
const
hda_nid_t
*
nids
=
spec
->
capsrc_nids
;
if
(
!
nids
)
nids
=
spec
->
adc_nids
;
err
=
snd_hda_add_nid
(
codec
,
kctl
,
i
,
nids
[
i
]);
err
=
snd_hda_add_nid
(
codec
,
kctl
,
i
,
get_capsrc
(
spec
,
i
));
if
(
err
<
0
)
return
err
;
}
...
...
@@ -2786,8 +2800,7 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec)
}
for
(
c
=
0
;
c
<
num_adcs
;
c
++
)
{
hda_nid_t
cap
=
spec
->
capsrc_nids
?
spec
->
capsrc_nids
[
c
]
:
spec
->
adc_nids
[
c
];
hda_nid_t
cap
=
get_capsrc
(
spec
,
c
);
idx
=
get_connection_index
(
codec
,
cap
,
pin
);
if
(
idx
>=
0
)
{
spec
->
imux_pins
[
imux
->
num_items
]
=
pin
;
...
...
@@ -3820,8 +3833,7 @@ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
if
(
!
pin
)
return
0
;
for
(
i
=
0
;
i
<
spec
->
num_adc_nids
;
i
++
)
{
hda_nid_t
cap
=
spec
->
capsrc_nids
?
spec
->
capsrc_nids
[
i
]
:
spec
->
adc_nids
[
i
];
hda_nid_t
cap
=
get_capsrc
(
spec
,
i
);
int
idx
;
idx
=
get_connection_index
(
codec
,
cap
,
pin
);
...
...
sound/pci/hda/patch_sigmatel.c
浏览文件 @
b37c0096
...
...
@@ -1641,6 +1641,8 @@ static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
"Alienware M17x"
,
STAC_ALIENWARE_M17X
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x043a
,
"Alienware M17x"
,
STAC_ALIENWARE_M17X
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0490
,
"Alienware M17x"
,
STAC_ALIENWARE_M17X
),
{}
/* terminator */
};
...
...
sound/pci/lx6464es/lx_core.c
浏览文件 @
b37c0096
...
...
@@ -78,10 +78,15 @@ unsigned long lx_dsp_reg_read(struct lx6464es *chip, int port)
return
ioread32
(
address
);
}
void
lx_dsp_reg_readbuf
(
struct
lx6464es
*
chip
,
int
port
,
u32
*
data
,
u32
len
)
static
void
lx_dsp_reg_readbuf
(
struct
lx6464es
*
chip
,
int
port
,
u32
*
data
,
u32
len
)
{
void
__iomem
*
address
=
lx_dsp_register
(
chip
,
port
);
memcpy_fromio
(
data
,
address
,
len
*
sizeof
(
u32
));
u32
__iomem
*
address
=
lx_dsp_register
(
chip
,
port
);
int
i
;
/* we cannot use memcpy_fromio */
for
(
i
=
0
;
i
!=
len
;
++
i
)
data
[
i
]
=
ioread32
(
address
+
i
);
}
...
...
@@ -91,11 +96,15 @@ void lx_dsp_reg_write(struct lx6464es *chip, int port, unsigned data)
iowrite32
(
data
,
address
);
}
void
lx_dsp_reg_writebuf
(
struct
lx6464es
*
chip
,
int
port
,
const
u32
*
data
,
u32
len
)
static
void
lx_dsp_reg_writebuf
(
struct
lx6464es
*
chip
,
int
port
,
const
u32
*
data
,
u32
len
)
{
void
__iomem
*
address
=
lx_dsp_register
(
chip
,
port
);
memcpy_toio
(
address
,
data
,
len
*
sizeof
(
u32
));
u32
__iomem
*
address
=
lx_dsp_register
(
chip
,
port
);
int
i
;
/* we cannot use memcpy_to */
for
(
i
=
0
;
i
!=
len
;
++
i
)
iowrite32
(
data
[
i
],
address
+
i
);
}
...
...
sound/pci/lx6464es/lx_core.h
浏览文件 @
b37c0096
...
...
@@ -72,10 +72,7 @@ enum {
};
unsigned
long
lx_dsp_reg_read
(
struct
lx6464es
*
chip
,
int
port
);
void
lx_dsp_reg_readbuf
(
struct
lx6464es
*
chip
,
int
port
,
u32
*
data
,
u32
len
);
void
lx_dsp_reg_write
(
struct
lx6464es
*
chip
,
int
port
,
unsigned
data
);
void
lx_dsp_reg_writebuf
(
struct
lx6464es
*
chip
,
int
port
,
const
u32
*
data
,
u32
len
);
/* plx register access */
enum
{
...
...
sound/pci/rme9652/hdspm.c
浏览文件 @
b37c0096
...
...
@@ -6518,7 +6518,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card,
hdspm
->
io_type
=
AES32
;
hdspm
->
card_name
=
"RME AES32"
;
hdspm
->
midiPorts
=
2
;
}
else
if
((
hdspm
->
firmware_rev
==
0xd
5
)
||
}
else
if
((
hdspm
->
firmware_rev
==
0xd
2
)
||
((
hdspm
->
firmware_rev
>=
0xc8
)
&&
(
hdspm
->
firmware_rev
<=
0xcf
)))
{
hdspm
->
io_type
=
MADI
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录