Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
1aa924e2
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
1aa924e2
编写于
2月 24, 2011
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fix/hda' into topic/hda
上级
786c51f9
ebbd224c
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
118 addition
and
30 deletion
+118
-30
sound/core/jack.c
sound/core/jack.c
+1
-0
sound/pci/au88x0/au88x0_core.c
sound/pci/au88x0/au88x0_core.c
+11
-3
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+1
-0
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_conexant.c
+54
-14
sound/pci/hda/patch_via.c
sound/pci/hda/patch_via.c
+1
-1
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+22
-4
sound/soc/davinci/davinci-evm.c
sound/soc/davinci/davinci-evm.c
+15
-3
sound/soc/soc-core.c
sound/soc/soc-core.c
+1
-1
sound/usb/caiaq/audio.c
sound/usb/caiaq/audio.c
+1
-1
sound/usb/caiaq/midi.c
sound/usb/caiaq/midi.c
+1
-1
sound/usb/card.c
sound/usb/card.c
+4
-0
sound/usb/pcm.c
sound/usb/pcm.c
+5
-2
sound/usb/usbaudio.h
sound/usb/usbaudio.h
+1
-0
未找到文件。
sound/core/jack.c
浏览文件 @
1aa924e2
...
...
@@ -141,6 +141,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
fail_input:
input_free_device
(
jack
->
input_dev
);
kfree
(
jack
->
id
);
kfree
(
jack
);
return
err
;
}
...
...
sound/pci/au88x0/au88x0_core.c
浏览文件 @
1aa924e2
...
...
@@ -1252,11 +1252,19 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
static
int
inline
vortex_adbdma_getlinearpos
(
vortex_t
*
vortex
,
int
adbdma
)
{
stream_t
*
dma
=
&
vortex
->
dma_adb
[
adbdma
];
int
temp
;
int
temp
,
page
,
delta
;
temp
=
hwread
(
vortex
->
mmio
,
VORTEX_ADBDMA_STAT
+
(
adbdma
<<
2
));
temp
=
(
dma
->
period_virt
*
dma
->
period_bytes
)
+
(
temp
&
(
dma
->
period_bytes
-
1
));
return
temp
;
page
=
(
temp
&
ADB_SUBBUF_MASK
)
>>
ADB_SUBBUF_SHIFT
;
if
(
dma
->
nr_periods
>=
4
)
delta
=
(
page
-
dma
->
period_real
)
&
3
;
else
{
delta
=
(
page
-
dma
->
period_real
);
if
(
delta
<
0
)
delta
+=
dma
->
nr_periods
;
}
return
(
dma
->
period_virt
+
delta
)
*
dma
->
period_bytes
+
(
temp
&
(
dma
->
period_bytes
-
1
));
}
static
void
vortex_adbdma_startfifo
(
vortex_t
*
vortex
,
int
adbdma
)
...
...
sound/pci/hda/hda_intel.c
浏览文件 @
1aa924e2
...
...
@@ -2308,6 +2308,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
SND_PCI_QUIRK
(
0x1043
,
0x813d
,
"ASUS P5AD2"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81b3
,
"ASUS"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81e7
,
"ASUS M2V"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x8410
,
"ASUS"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x104d
,
0x9069
,
"Sony VPCS11V9E"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1106
,
0x3288
,
"ASUS M2V-MX SE"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1179
,
0xff10
,
"Toshiba A100-259"
,
POS_FIX_LPIB
),
...
...
sound/pci/hda/patch_conexant.c
浏览文件 @
1aa924e2
...
...
@@ -3114,6 +3114,8 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1028
,
0x0401
,
"Dell Vostro 1014"
,
CXT5066_DELL_VOSTRO
),
SND_PCI_QUIRK
(
0x1028
,
0x0402
,
"Dell Vostro"
,
CXT5066_DELL_VOSTRO
),
SND_PCI_QUIRK
(
0x1028
,
0x0408
,
"Dell Inspiron One 19T"
,
CXT5066_IDEAPAD
),
SND_PCI_QUIRK
(
0x1028
,
0x050f
,
"Dell Inspiron"
,
CXT5066_IDEAPAD
),
SND_PCI_QUIRK
(
0x1028
,
0x0510
,
"Dell Vostro"
,
CXT5066_IDEAPAD
),
SND_PCI_QUIRK
(
0x103c
,
0x360b
,
"HP G60"
,
CXT5066_HP_LAPTOP
),
SND_PCI_QUIRK
(
0x1043
,
0x13f3
,
"Asus A52J"
,
CXT5066_ASUS
),
SND_PCI_QUIRK
(
0x1043
,
0x1643
,
"Asus K52JU"
,
CXT5066_ASUS
),
...
...
@@ -3410,7 +3412,7 @@ static void cx_auto_parse_output(struct hda_codec *codec)
}
}
spec
->
multiout
.
dac_nids
=
spec
->
private_dac_nids
;
spec
->
multiout
.
max_channels
=
num
s
*
2
;
spec
->
multiout
.
max_channels
=
spec
->
multiout
.
num_dac
s
*
2
;
if
(
cfg
->
hp_outs
>
0
)
spec
->
auto_mute
=
1
;
...
...
@@ -3729,9 +3731,9 @@ static int cx_auto_init(struct hda_codec *codec)
return
0
;
}
static
int
cx_auto_add_volume
(
struct
hda_codec
*
codec
,
const
char
*
basename
,
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
)
hda_nid_t
nid
,
int
hda_dir
,
int
amp_idx
)
{
static
char
name
[
32
];
static
struct
snd_kcontrol_new
knew
[]
=
{
...
...
@@ -3743,7 +3745,8 @@ static int cx_auto_add_volume(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
,
0
,
hda_dir
);
knew
[
i
].
private_value
=
HDA_COMPOSE_AMP_VAL
(
nid
,
3
,
amp_idx
,
hda_dir
);
knew
[
i
].
subdevice
=
HDA_SUBDEV_AMP_FLAG
;
knew
[
i
].
index
=
cidx
;
snprintf
(
name
,
sizeof
(
name
),
"%s%s %s"
,
basename
,
dir
,
sfx
[
i
]);
...
...
@@ -3759,6 +3762,9 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
return
0
;
}
#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)
#define cx_auto_add_pb_volume(codec, nid, str, idx) \
cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)
...
...
@@ -3808,29 +3814,60 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
struct
conexant_spec
*
spec
=
codec
->
spec
;
struct
auto_pin_cfg
*
cfg
=
&
spec
->
autocfg
;
static
const
char
*
prev_label
;
int
i
,
err
,
cidx
;
int
i
,
err
,
cidx
,
conn_len
;
hda_nid_t
conn
[
HDA_MAX_CONNECTIONS
];
int
multi_adc_volume
=
0
;
/* If the ADC nid has several input volumes */
int
adc_nid
=
spec
->
adc_nids
[
0
];
conn_len
=
snd_hda_get_connections
(
codec
,
adc_nid
,
conn
,
HDA_MAX_CONNECTIONS
);
if
(
conn_len
<
0
)
return
conn_len
;
multi_adc_volume
=
cfg
->
num_inputs
>
1
&&
conn_len
>
1
;
if
(
!
multi_adc_volume
)
{
err
=
cx_auto_add_volume
(
codec
,
"Capture"
,
""
,
0
,
adc_nid
,
HDA_INPUT
);
if
(
err
<
0
)
return
err
;
}
err
=
cx_auto_add_volume
(
codec
,
"Capture"
,
""
,
0
,
spec
->
adc_nids
[
0
],
HDA_INPUT
);
if
(
err
<
0
)
return
err
;
prev_label
=
NULL
;
cidx
=
0
;
for
(
i
=
0
;
i
<
cfg
->
num_inputs
;
i
++
)
{
hda_nid_t
nid
=
cfg
->
inputs
[
i
].
pin
;
const
char
*
label
;
if
(
!
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_IN_AMP
))
int
j
;
int
pin_amp
=
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_IN_AMP
;
if
(
!
pin_amp
&&
!
multi_adc_volume
)
continue
;
label
=
hda_get_autocfg_input_label
(
codec
,
cfg
,
i
);
if
(
label
==
prev_label
)
cidx
++
;
else
cidx
=
0
;
prev_label
=
label
;
err
=
cx_auto_add_volume
(
codec
,
label
,
" Capture"
,
cidx
,
nid
,
HDA_INPUT
);
if
(
err
<
0
)
return
err
;
if
(
pin_amp
)
{
err
=
cx_auto_add_volume
(
codec
,
label
,
" Boost"
,
cidx
,
nid
,
HDA_INPUT
);
if
(
err
<
0
)
return
err
;
}
if
(
!
multi_adc_volume
)
continue
;
for
(
j
=
0
;
j
<
conn_len
;
j
++
)
{
if
(
conn
[
j
]
==
nid
)
{
err
=
cx_auto_add_volume_idx
(
codec
,
label
,
" Capture"
,
cidx
,
adc_nid
,
HDA_INPUT
,
j
);
if
(
err
<
0
)
return
err
;
break
;
}
}
}
return
0
;
}
...
...
@@ -3902,6 +3939,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = {
.
patch
=
patch_cxt5066
},
{
.
id
=
0x14f15069
,
.
name
=
"CX20585"
,
.
patch
=
patch_cxt5066
},
{
.
id
=
0x14f1506e
,
.
name
=
"CX20590"
,
.
patch
=
patch_cxt5066
},
{
.
id
=
0x14f15097
,
.
name
=
"CX20631"
,
.
patch
=
patch_conexant_auto
},
{
.
id
=
0x14f15098
,
.
name
=
"CX20632"
,
...
...
@@ -3928,6 +3967,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15066");
MODULE_ALIAS
(
"snd-hda-codec-id:14f15067"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15068"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15069"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f1506e"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15097"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15098"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f150a1"
);
...
...
sound/pci/hda/patch_via.c
浏览文件 @
1aa924e2
...
...
@@ -567,7 +567,7 @@ 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
(
spec
,
nid
))
ctl
=
PIN_OUT
;
else
if
(
i
==
AUTO_PIN_MIC
)
else
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
=
PIN_VREF50
;
else
ctl
=
PIN_IN
;
...
...
sound/soc/codecs/wm8994.c
浏览文件 @
1aa924e2
...
...
@@ -1287,9 +1287,9 @@ SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY
(
"AIF1CLK"
,
WM8994_AIF1_CLOCKING_1
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"AIF2CLK"
,
WM8994_AIF2_CLOCKING_1
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1L"
,
"AIF1 Capture"
,
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1L"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_4
,
9
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1R"
,
"AIF1 Capture"
,
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1R"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_4
,
8
,
0
),
SND_SOC_DAPM_AIF_IN_E
(
"AIF1DAC1L"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_5
,
9
,
0
,
wm8958_aif_ev
,
...
...
@@ -1298,9 +1298,9 @@ SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0,
WM8994_POWER_MANAGEMENT_5
,
8
,
0
,
wm8958_aif_ev
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC2L"
,
"AIF1 Capture"
,
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC2L"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_4
,
11
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC2R"
,
"AIF1 Capture"
,
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC2R"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_4
,
10
,
0
),
SND_SOC_DAPM_AIF_IN_E
(
"AIF1DAC2L"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_5
,
11
,
0
,
wm8958_aif_ev
,
...
...
@@ -1345,6 +1345,7 @@ SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0,
SND_SOC_DAPM_AIF_IN
(
"AIF1DACDAT"
,
"AIF1 Playback"
,
0
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_AIF_IN
(
"AIF2DACDAT"
,
"AIF2 Playback"
,
0
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADCDAT"
,
"AIF1 Capture"
,
0
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF2ADCDAT"
,
"AIF2 Capture"
,
0
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_MUX
(
"AIF1DAC Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
aif1dac_mux
),
...
...
@@ -1546,6 +1547,11 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"AIF2DAC2R Mixer"
,
"Left Sidetone Switch"
,
"Left Sidetone"
},
{
"AIF2DAC2R Mixer"
,
"Right Sidetone Switch"
,
"Right Sidetone"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF1ADC1L"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF1ADC1R"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF1ADC2L"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF1ADC2R"
},
{
"AIF2ADCDAT"
,
NULL
,
"AIF2ADC Mux"
},
/* AIF3 output */
...
...
@@ -1578,6 +1584,13 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"Right Headphone Mux"
,
"DAC"
,
"DAC1R"
},
};
static
const
struct
snd_soc_dapm_route
wm8994_revd_intercon
[]
=
{
{
"AIF1DACDAT"
,
NULL
,
"AIF2DACDAT"
},
{
"AIF2DACDAT"
,
NULL
,
"AIF1DACDAT"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF2ADCDAT"
},
{
"AIF2ADCDAT"
,
NULL
,
"AIF1ADCDAT"
},
};
static
const
struct
snd_soc_dapm_route
wm8994_intercon
[]
=
{
{
"AIF2DACL"
,
NULL
,
"AIF2DAC Mux"
},
{
"AIF2DACR"
,
NULL
,
"AIF2DAC Mux"
},
...
...
@@ -3129,6 +3142,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
case
WM8994
:
snd_soc_dapm_add_routes
(
dapm
,
wm8994_intercon
,
ARRAY_SIZE
(
wm8994_intercon
));
if
(
wm8994
->
revision
<
4
)
snd_soc_dapm_add_routes
(
dapm
,
wm8994_revd_intercon
,
ARRAY_SIZE
(
wm8994_revd_intercon
));
break
;
case
WM8958
:
snd_soc_dapm_add_routes
(
dapm
,
wm8958_intercon
,
...
...
sound/soc/davinci/davinci-evm.c
浏览文件 @
1aa924e2
...
...
@@ -218,7 +218,19 @@ static struct snd_soc_dai_link dm6467_evm_dai[] = {
.
ops
=
&
evm_spdif_ops
,
},
};
static
struct
snd_soc_dai_link
da8xx_evm_dai
=
{
static
struct
snd_soc_dai_link
da830_evm_dai
=
{
.
name
=
"TLV320AIC3X"
,
.
stream_name
=
"AIC3X"
,
.
cpu_dai_name
=
"davinci-mcasp.1"
,
.
codec_dai_name
=
"tlv320aic3x-hifi"
,
.
codec_name
=
"tlv320aic3x-codec.1-0018"
,
.
platform_name
=
"davinci-pcm-audio"
,
.
init
=
evm_aic3x_init
,
.
ops
=
&
evm_ops
,
};
static
struct
snd_soc_dai_link
da850_evm_dai
=
{
.
name
=
"TLV320AIC3X"
,
.
stream_name
=
"AIC3X"
,
.
cpu_dai_name
=
"davinci-mcasp.0"
,
...
...
@@ -259,13 +271,13 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = {
static
struct
snd_soc_card
da830_snd_soc_card
=
{
.
name
=
"DA830/OMAP-L137 EVM"
,
.
dai_link
=
&
da8
xx
_evm_dai
,
.
dai_link
=
&
da8
30
_evm_dai
,
.
num_links
=
1
,
};
static
struct
snd_soc_card
da850_snd_soc_card
=
{
.
name
=
"DA850/OMAP-L138 EVM"
,
.
dai_link
=
&
da8
xx
_evm_dai
,
.
dai_link
=
&
da8
50
_evm_dai
,
.
num_links
=
1
,
};
...
...
sound/soc/soc-core.c
浏览文件 @
1aa924e2
...
...
@@ -1449,6 +1449,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
rtd
=
&
card
->
rtd_aux
[
num
];
name
=
aux_dev
->
name
;
}
rtd
->
card
=
card
;
/* machine controls, routes and widgets are not prefixed */
temp
=
codec
->
name_prefix
;
...
...
@@ -1471,7 +1472,6 @@ static int soc_post_component_init(struct snd_soc_card *card,
/* register the rtd device */
rtd
->
codec
=
codec
;
rtd
->
card
=
card
;
rtd
->
dev
.
parent
=
card
->
dev
;
rtd
->
dev
.
release
=
rtd_release
;
rtd
->
dev
.
init_name
=
name
;
...
...
sound/usb/caiaq/audio.c
浏览文件 @
1aa924e2
...
...
@@ -785,7 +785,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
}
dev
->
pcm
->
private_data
=
dev
;
str
cpy
(
dev
->
pcm
->
name
,
dev
->
product_name
);
str
lcpy
(
dev
->
pcm
->
name
,
dev
->
product_name
,
sizeof
(
dev
->
pcm
->
name
)
);
memset
(
dev
->
sub_playback
,
0
,
sizeof
(
dev
->
sub_playback
));
memset
(
dev
->
sub_capture
,
0
,
sizeof
(
dev
->
sub_capture
));
...
...
sound/usb/caiaq/midi.c
浏览文件 @
1aa924e2
...
...
@@ -136,7 +136,7 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
if
(
ret
<
0
)
return
ret
;
str
cpy
(
rmidi
->
name
,
device
->
product_name
);
str
lcpy
(
rmidi
->
name
,
device
->
product_name
,
sizeof
(
rmidi
->
name
)
);
rmidi
->
info_flags
=
SNDRV_RAWMIDI_INFO_DUPLEX
;
rmidi
->
private_data
=
device
;
...
...
sound/usb/card.c
浏览文件 @
1aa924e2
...
...
@@ -323,6 +323,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
return
-
ENOMEM
;
}
mutex_init
(
&
chip
->
shutdown_mutex
);
chip
->
index
=
idx
;
chip
->
dev
=
dev
;
chip
->
card
=
card
;
...
...
@@ -531,6 +532,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
chip
=
ptr
;
card
=
chip
->
card
;
mutex_lock
(
&
register_mutex
);
mutex_lock
(
&
chip
->
shutdown_mutex
);
chip
->
shutdown
=
1
;
chip
->
num_interfaces
--
;
if
(
chip
->
num_interfaces
<=
0
)
{
...
...
@@ -548,9 +550,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
snd_usb_mixer_disconnect
(
p
);
}
usb_chip
[
chip
->
index
]
=
NULL
;
mutex_unlock
(
&
chip
->
shutdown_mutex
);
mutex_unlock
(
&
register_mutex
);
snd_card_free_when_closed
(
card
);
}
else
{
mutex_unlock
(
&
chip
->
shutdown_mutex
);
mutex_unlock
(
&
register_mutex
);
}
}
...
...
sound/usb/pcm.c
浏览文件 @
1aa924e2
...
...
@@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
}
if
(
changed
)
{
mutex_lock
(
&
subs
->
stream
->
chip
->
shutdown_mutex
);
/* format changed */
snd_usb_release_substream_urbs
(
subs
,
0
);
/* influenced: period_bytes, channels, rate, format, */
...
...
@@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
params_rate
(
hw_params
),
snd_pcm_format_physical_width
(
params_format
(
hw_params
))
*
params_channels
(
hw_params
));
mutex_unlock
(
&
subs
->
stream
->
chip
->
shutdown_mutex
);
}
return
ret
;
...
...
@@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
subs
->
cur_audiofmt
=
NULL
;
subs
->
cur_rate
=
0
;
subs
->
period_bytes
=
0
;
if
(
!
subs
->
stream
->
chip
->
shutdown
)
snd_usb_release_substream_urbs
(
subs
,
0
);
mutex_lock
(
&
subs
->
stream
->
chip
->
shutdown_mutex
);
snd_usb_release_substream_urbs
(
subs
,
0
);
mutex_unlock
(
&
subs
->
stream
->
chip
->
shutdown_mutex
);
return
snd_pcm_lib_free_vmalloc_buffer
(
substream
);
}
...
...
sound/usb/usbaudio.h
浏览文件 @
1aa924e2
...
...
@@ -36,6 +36,7 @@ struct snd_usb_audio {
struct
snd_card
*
card
;
u32
usb_id
;
int
shutdown
;
struct
mutex
shutdown_mutex
;
unsigned
int
txfr_quirk
:
1
;
/* Subframe boundaries on transfers */
int
num_interfaces
;
int
num_suspended_intf
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录