Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1aa924e2
Commit
1aa924e2
authored
Feb 24, 2011
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fix/hda' into topic/hda
parents
786c51f9
ebbd224c
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
118 additions
and
30 deletions
+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
No files found.
sound/core/jack.c
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment