]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/media/radio/radio-mr800.c
Merge branch 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ickle...
[linux-beck.git] / drivers / media / radio / radio-mr800.c
index 97967ad3cd1229164718d545bdb2f91b141e5b51..e6b2d085a449ae0a7ba4a424a70014e5a03b7112 100644 (file)
@@ -58,7 +58,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
 #include <linux/input.h>
 #include <linux/videodev2.h>
 #include <media/v4l2-device.h>
@@ -284,9 +283,13 @@ static void usb_amradio_disconnect(struct usb_interface *intf)
        struct amradio_device *radio = to_amradio_dev(usb_get_intfdata(intf));
 
        mutex_lock(&radio->lock);
+       /* increase the device node's refcount */
+       get_device(&radio->videodev.dev);
        v4l2_device_disconnect(&radio->v4l2_dev);
        video_unregister_device(&radio->videodev);
        mutex_unlock(&radio->lock);
+       /* decrease the device node's refcount, allowing it to be released */
+       put_device(&radio->videodev.dev);
 }
 
 /* vidioc_querycap - query device capabilities */
@@ -515,7 +518,8 @@ static int usb_amradio_close(struct file *file)
 {
        struct amradio_device *radio = file->private_data;
 
-       usb_autopm_put_interface(radio->intf);
+       if (video_is_registered(&radio->videodev))
+               usb_autopm_put_interface(radio->intf);
        return 0;
 }
 
@@ -524,10 +528,12 @@ static int usb_amradio_suspend(struct usb_interface *intf, pm_message_t message)
 {
        struct amradio_device *radio = to_amradio_dev(usb_get_intfdata(intf));
 
+       mutex_lock(&radio->lock);
        if (!radio->muted && radio->initialized) {
                amradio_set_mute(radio, AMRADIO_STOP);
                radio->muted = 0;
        }
+       mutex_unlock(&radio->lock);
 
        dev_info(&intf->dev, "going into suspend..\n");
        return 0;
@@ -538,8 +544,9 @@ static int usb_amradio_resume(struct usb_interface *intf)
 {
        struct amradio_device *radio = to_amradio_dev(usb_get_intfdata(intf));
 
+       mutex_lock(&radio->lock);
        if (unlikely(!radio->initialized))
-               return 0;
+               goto unlock;
 
        if (radio->stereo)
                amradio_set_stereo(radio, WANT_STEREO);
@@ -551,6 +558,9 @@ static int usb_amradio_resume(struct usb_interface *intf)
        if (!radio->muted)
                amradio_set_mute(radio, AMRADIO_START);
 
+unlock:
+       mutex_unlock(&radio->lock);
+
        dev_info(&intf->dev, "coming out of suspend..\n");
        return 0;
 }