V4L/DVB (13071): radio-mr800: preserve radio state during suspend/resume
authorDavid Ellingsworth <david@identd.dyndns.org>
Wed, 23 Sep 2009 21:24:47 +0000 (18:24 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:40:11 +0000 (18:40 -0200)
Preserve radio state during suspend/resume.

Signed-off-by: David Ellingsworth <david@identd.dyndns.org>
Acked-by: Alexey Klimov <klimov.linux@gmail.com>
Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/radio/radio-mr800.c

index 9764eca2c498297dc4b634657c8ba120fd858954..ac2107378942cd20e49d6c0535395fd4f5f5e2b4 100644 (file)
@@ -574,9 +574,12 @@ static int usb_amradio_suspend(struct usb_interface *intf, pm_message_t message)
 
        mutex_lock(&radio->lock);
 
-       retval = amradio_set_mute(radio, AMRADIO_STOP);
-       if (retval < 0)
-               dev_warn(&intf->dev, "amradio_stop failed\n");
+       if (!radio->muted && radio->initialized) {
+               retval = amradio_set_mute(radio, AMRADIO_STOP);
+               if (retval < 0)
+                       dev_warn(&intf->dev, "amradio_stop failed\n");
+               radio->muted = 0;
+       }
 
        dev_info(&intf->dev, "going into suspend..\n");
 
@@ -592,10 +595,30 @@ static int usb_amradio_resume(struct usb_interface *intf)
 
        mutex_lock(&radio->lock);
 
-       retval = amradio_set_mute(radio, AMRADIO_START);
+       if (unlikely(!radio->initialized))
+               goto unlock;
+
+       if (radio->stereo)
+               retval = amradio_set_stereo(radio, WANT_STEREO);
+       else
+               retval = amradio_set_stereo(radio, WANT_MONO);
+
        if (retval < 0)
-               dev_warn(&intf->dev, "amradio_start failed\n");
+               amradio_dev_warn(&radio->videodev.dev, "set stereo failed\n");
 
+       retval = amradio_setfreq(radio, radio->curfreq);
+       if (retval < 0)
+               amradio_dev_warn(&radio->videodev.dev,
+                       "set frequency failed\n");
+
+       if (!radio->muted) {
+               retval = amradio_set_mute(radio, AMRADIO_START);
+               if (retval < 0)
+                       dev_warn(&radio->videodev.dev,
+                               "amradio_start failed\n");
+       }
+
+unlock:
        dev_info(&intf->dev, "coming out of suspend..\n");
 
        mutex_unlock(&radio->lock);