git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ALSA: usb-audio: Use rwsem for disconnect protection
[pandora-kernel.git]
/
sound
/
usb
/
mixer.c
diff --git
a/sound/usb/mixer.c
b/sound/usb/mixer.c
index
c2ef11c
..
298070e
100644
(file)
--- a/
sound/usb/mixer.c
+++ b/
sound/usb/mixer.c
@@
-292,7
+292,7
@@
static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v
err = snd_usb_autoresume(cval->mixer->chip);
if (err < 0)
return -EIO;
err = snd_usb_autoresume(cval->mixer->chip);
if (err < 0)
return -EIO;
-
mutex_lock(&chip->shutdown_mutex
);
+
down_read(&chip->shutdown_rwsem
);
while (timeout-- > 0) {
if (chip->shutdown)
break;
while (timeout-- > 0) {
if (chip->shutdown)
break;
@@
-310,7
+310,7
@@
static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v
err = -EINVAL;
out:
err = -EINVAL;
out:
-
mutex_unlock(&chip->shutdown_mutex
);
+
up_read(&chip->shutdown_rwsem
);
snd_usb_autosuspend(cval->mixer->chip);
return err;
}
snd_usb_autosuspend(cval->mixer->chip);
return err;
}
@@
-337,7
+337,7
@@
static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int v
if (ret)
goto error;
if (ret)
goto error;
-
mutex_lock(&chip->shutdown_mutex
);
+
down_read(&chip->shutdown_rwsem
);
if (chip->shutdown)
ret = -ENODEV;
else {
if (chip->shutdown)
ret = -ENODEV;
else {
@@
-346,7
+346,7
@@
static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int v
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
validx, idx, buf, size);
}
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
validx, idx, buf, size);
}
-
mutex_unlock(&chip->shutdown_mutex
);
+
up_read(&chip->shutdown_rwsem
);
snd_usb_autosuspend(chip);
if (ret < 0) {
snd_usb_autosuspend(chip);
if (ret < 0) {
@@
-453,7
+453,7
@@
int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval,
err = snd_usb_autoresume(chip);
if (err < 0)
return -EIO;
err = snd_usb_autoresume(chip);
if (err < 0)
return -EIO;
-
mutex_lock(&chip->shutdown_mutex
);
+
down_read(&chip->shutdown_rwsem
);
while (timeout-- > 0) {
if (chip->shutdown)
break;
while (timeout-- > 0) {
if (chip->shutdown)
break;
@@
-471,7
+471,7
@@
int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval,
err = -EINVAL;
out:
err = -EINVAL;
out:
-
mutex_unlock(&chip->shutdown_mutex
);
+
up_read(&chip->shutdown_rwsem
);
snd_usb_autosuspend(chip);
return err;
}
snd_usb_autosuspend(chip);
return err;
}