diff options
| -rw-r--r-- | drivers/media/usb/em28xx/em28xx-audio.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c index f6fcee3d4fb9..f004680219e7 100644 --- a/drivers/media/usb/em28xx/em28xx-audio.c +++ b/drivers/media/usb/em28xx/em28xx-audio.c | |||
| @@ -258,6 +258,13 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) | |||
| 258 | 258 | ||
| 259 | runtime->hw = snd_em28xx_hw_capture; | 259 | runtime->hw = snd_em28xx_hw_capture; |
| 260 | if ((dev->alt == 0 || dev->audio_ifnum) && dev->adev.users == 0) { | 260 | if ((dev->alt == 0 || dev->audio_ifnum) && dev->adev.users == 0) { |
| 261 | int nonblock = !!(substream->f_flags & O_NONBLOCK); | ||
| 262 | |||
| 263 | if (nonblock) { | ||
| 264 | if (!mutex_trylock(&dev->lock)) | ||
| 265 | return -EAGAIN; | ||
| 266 | } else | ||
| 267 | mutex_lock(&dev->lock); | ||
| 261 | if (dev->audio_ifnum) | 268 | if (dev->audio_ifnum) |
| 262 | dev->alt = 1; | 269 | dev->alt = 1; |
| 263 | else | 270 | else |
| @@ -269,7 +276,6 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) | |||
| 269 | 276 | ||
| 270 | /* Sets volume, mute, etc */ | 277 | /* Sets volume, mute, etc */ |
| 271 | dev->mute = 0; | 278 | dev->mute = 0; |
| 272 | mutex_lock(&dev->lock); | ||
| 273 | ret = em28xx_audio_analog_set(dev); | 279 | ret = em28xx_audio_analog_set(dev); |
| 274 | if (ret < 0) | 280 | if (ret < 0) |
| 275 | goto err; | 281 | goto err; |
| @@ -441,11 +447,19 @@ static int em28xx_vol_put(struct snd_kcontrol *kcontrol, | |||
| 441 | struct snd_ctl_elem_value *value) | 447 | struct snd_ctl_elem_value *value) |
| 442 | { | 448 | { |
| 443 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); | 449 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); |
| 450 | struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream; | ||
| 444 | u16 val = (0x1f - (value->value.integer.value[0] & 0x1f)) | | 451 | u16 val = (0x1f - (value->value.integer.value[0] & 0x1f)) | |
| 445 | (0x1f - (value->value.integer.value[1] & 0x1f)) << 8; | 452 | (0x1f - (value->value.integer.value[1] & 0x1f)) << 8; |
| 453 | int nonblock = 0; | ||
| 446 | int rc; | 454 | int rc; |
| 447 | 455 | ||
| 448 | mutex_lock(&dev->lock); | 456 | if (substream) |
| 457 | nonblock = !!(substream->f_flags & O_NONBLOCK); | ||
| 458 | if (nonblock) { | ||
| 459 | if (!mutex_trylock(&dev->lock)) | ||
| 460 | return -EAGAIN; | ||
| 461 | } else | ||
| 462 | mutex_lock(&dev->lock); | ||
| 449 | rc = em28xx_read_ac97(dev, kcontrol->private_value); | 463 | rc = em28xx_read_ac97(dev, kcontrol->private_value); |
| 450 | if (rc < 0) | 464 | if (rc < 0) |
| 451 | goto err; | 465 | goto err; |
| @@ -470,9 +484,17 @@ static int em28xx_vol_get(struct snd_kcontrol *kcontrol, | |||
| 470 | struct snd_ctl_elem_value *value) | 484 | struct snd_ctl_elem_value *value) |
| 471 | { | 485 | { |
| 472 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); | 486 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); |
| 487 | struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream; | ||
| 488 | int nonblock = 0; | ||
| 473 | int val; | 489 | int val; |
| 474 | 490 | ||
| 475 | mutex_lock(&dev->lock); | 491 | if (substream) |
| 492 | nonblock = !!(substream->f_flags & O_NONBLOCK); | ||
| 493 | if (nonblock) { | ||
| 494 | if (!mutex_trylock(&dev->lock)) | ||
| 495 | return -EAGAIN; | ||
| 496 | } else | ||
| 497 | mutex_lock(&dev->lock); | ||
| 476 | val = em28xx_read_ac97(dev, kcontrol->private_value); | 498 | val = em28xx_read_ac97(dev, kcontrol->private_value); |
| 477 | mutex_unlock(&dev->lock); | 499 | mutex_unlock(&dev->lock); |
| 478 | if (val < 0) | 500 | if (val < 0) |
| @@ -494,9 +516,17 @@ static int em28xx_vol_put_mute(struct snd_kcontrol *kcontrol, | |||
| 494 | { | 516 | { |
| 495 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); | 517 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); |
| 496 | u16 val = value->value.integer.value[0]; | 518 | u16 val = value->value.integer.value[0]; |
| 519 | struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream; | ||
| 520 | int nonblock = 0; | ||
| 497 | int rc; | 521 | int rc; |
| 498 | 522 | ||
| 499 | mutex_lock(&dev->lock); | 523 | if (substream) |
| 524 | nonblock = !!(substream->f_flags & O_NONBLOCK); | ||
| 525 | if (nonblock) { | ||
| 526 | if (!mutex_trylock(&dev->lock)) | ||
| 527 | return -EAGAIN; | ||
| 528 | } else | ||
| 529 | mutex_lock(&dev->lock); | ||
| 500 | rc = em28xx_read_ac97(dev, kcontrol->private_value); | 530 | rc = em28xx_read_ac97(dev, kcontrol->private_value); |
| 501 | if (rc < 0) | 531 | if (rc < 0) |
| 502 | goto err; | 532 | goto err; |
| @@ -524,9 +554,17 @@ static int em28xx_vol_get_mute(struct snd_kcontrol *kcontrol, | |||
| 524 | struct snd_ctl_elem_value *value) | 554 | struct snd_ctl_elem_value *value) |
| 525 | { | 555 | { |
| 526 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); | 556 | struct em28xx *dev = snd_kcontrol_chip(kcontrol); |
| 557 | struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream; | ||
| 558 | int nonblock = 0; | ||
| 527 | int val; | 559 | int val; |
| 528 | 560 | ||
| 529 | mutex_lock(&dev->lock); | 561 | if (substream) |
| 562 | nonblock = !!(substream->f_flags & O_NONBLOCK); | ||
| 563 | if (nonblock) { | ||
| 564 | if (!mutex_trylock(&dev->lock)) | ||
| 565 | return -EAGAIN; | ||
| 566 | } else | ||
| 567 | mutex_lock(&dev->lock); | ||
| 530 | val = em28xx_read_ac97(dev, kcontrol->private_value); | 568 | val = em28xx_read_ac97(dev, kcontrol->private_value); |
| 531 | mutex_unlock(&dev->lock); | 569 | mutex_unlock(&dev->lock); |
| 532 | if (val < 0) | 570 | if (val < 0) |
