runtime->hw = snd_em28xx_hw_capture;
        if ((dev->alt == 0 || dev->audio_ifnum) && dev->adev.users == 0) {
+               int nonblock = !!(substream->f_flags & O_NONBLOCK);
+
+               if (nonblock) {
+                       if (!mutex_trylock(&dev->lock))
+                               return -EAGAIN;
+               } else
+                       mutex_lock(&dev->lock);
                if (dev->audio_ifnum)
                        dev->alt = 1;
                else
 
                /* Sets volume, mute, etc */
                dev->mute = 0;
-               mutex_lock(&dev->lock);
                ret = em28xx_audio_analog_set(dev);
                if (ret < 0)
                        goto err;
                               struct snd_ctl_elem_value *value)
 {
        struct em28xx *dev = snd_kcontrol_chip(kcontrol);
+       struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream;
        u16 val = (0x1f - (value->value.integer.value[0] & 0x1f)) |
                  (0x1f - (value->value.integer.value[1] & 0x1f)) << 8;
+       int nonblock = 0;
        int rc;
 
-       mutex_lock(&dev->lock);
+       if (substream)
+               nonblock = !!(substream->f_flags & O_NONBLOCK);
+       if (nonblock) {
+               if (!mutex_trylock(&dev->lock))
+                       return -EAGAIN;
+       } else
+               mutex_lock(&dev->lock);
        rc = em28xx_read_ac97(dev, kcontrol->private_value);
        if (rc < 0)
                goto err;
                               struct snd_ctl_elem_value *value)
 {
        struct em28xx *dev = snd_kcontrol_chip(kcontrol);
+       struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream;
+       int nonblock = 0;
        int val;
 
-       mutex_lock(&dev->lock);
+       if (substream)
+               nonblock = !!(substream->f_flags & O_NONBLOCK);
+       if (nonblock) {
+               if (!mutex_trylock(&dev->lock))
+                       return -EAGAIN;
+       } else
+               mutex_lock(&dev->lock);
        val = em28xx_read_ac97(dev, kcontrol->private_value);
        mutex_unlock(&dev->lock);
        if (val < 0)
 {
        struct em28xx *dev = snd_kcontrol_chip(kcontrol);
        u16 val = value->value.integer.value[0];
+       struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream;
+       int nonblock = 0;
        int rc;
 
-       mutex_lock(&dev->lock);
+       if (substream)
+               nonblock = !!(substream->f_flags & O_NONBLOCK);
+       if (nonblock) {
+               if (!mutex_trylock(&dev->lock))
+                       return -EAGAIN;
+       } else
+               mutex_lock(&dev->lock);
        rc = em28xx_read_ac97(dev, kcontrol->private_value);
        if (rc < 0)
                goto err;
                               struct snd_ctl_elem_value *value)
 {
        struct em28xx *dev = snd_kcontrol_chip(kcontrol);
+       struct snd_pcm_substream *substream = dev->adev.capture_pcm_substream;
+       int nonblock = 0;
        int val;
 
-       mutex_lock(&dev->lock);
+       if (substream)
+               nonblock = !!(substream->f_flags & O_NONBLOCK);
+       if (nonblock) {
+               if (!mutex_trylock(&dev->lock))
+                       return -EAGAIN;
+       } else
+               mutex_lock(&dev->lock);
        val = em28xx_read_ac97(dev, kcontrol->private_value);
        mutex_unlock(&dev->lock);
        if (val < 0)