diff options
author | David Ellingsworth <david@identd.dyndns.org> | 2009-09-23 23:13:50 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 21:40:11 +0100 |
commit | 502d50166cdef6cc8f63ab8c6ab35694ee39f608 (patch) | |
tree | 518abfae50bfe145e328f3b22a2a572e4b2dd074 | |
parent | V4L/DVB (13068): radio-mr800: remove device initialization from open/close (diff) | |
download | linux-502d50166cdef6cc8f63ab8c6ab35694ee39f608.tar.xz linux-502d50166cdef6cc8f63ab8c6ab35694ee39f608.zip |
V4L/DVB (13069): radio-mr800: ensure the radio is initialized to a consistent state
Ensure the radio is initialized to a consistent state.
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>
-rw-r--r-- | drivers/media/radio/radio-mr800.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c index 399032e8cc18..7db992d3b0db 100644 --- a/drivers/media/radio/radio-mr800.c +++ b/drivers/media/radio/radio-mr800.c @@ -85,6 +85,9 @@ MODULE_LICENSE("GPL"); #define amradio_dev_warn(dev, fmt, arg...) \ dev_warn(dev, MR800_DRIVER_NAME " - " fmt, ##arg) +#define amradio_dev_err(dev, fmt, arg...) \ + dev_err(dev, MR800_DRIVER_NAME " - " fmt, ##arg) + /* Probably USB_TIMEOUT should be modified in module parameter */ #define BUFFER_LENGTH 8 #define USB_TIMEOUT 500 @@ -137,6 +140,7 @@ struct amradio_device { int curfreq; int stereo; int muted; + int initialized; }; #define vdev_to_amradio(r) container_of(r, struct amradio_device, videodev) @@ -478,6 +482,31 @@ static int vidioc_s_input(struct file *filp, void *priv, unsigned int i) return 0; } +static int usb_amradio_init(struct amradio_device *radio) +{ + int retval; + + retval = amradio_set_mute(radio, AMRADIO_STOP); + if (retval < 0) { + amradio_dev_warn(&radio->videodev.dev, "amradio_stop failed\n"); + goto out_err; + } + + retval = amradio_set_stereo(radio, WANT_STEREO); + if (retval < 0) { + amradio_dev_warn(&radio->videodev.dev, "set stereo failed\n"); + goto out_err; + } + + radio->initialized = 1; + goto out; + +out_err: + amradio_dev_err(&radio->videodev.dev, "initialization failed\n"); +out: + return retval; +} + /* open device - amradio_start() and amradio_setfreq() */ static int usb_amradio_open(struct file *file) { @@ -493,6 +522,9 @@ static int usb_amradio_open(struct file *file) file->private_data = radio; + if (unlikely(!radio->initialized)) + retval = usb_amradio_init(radio); + unlock: mutex_unlock(&radio->lock); return retval; @@ -641,8 +673,6 @@ static int usb_amradio_probe(struct usb_interface *intf, radio->usbdev = interface_to_usbdev(intf); radio->curfreq = 95.16 * FREQ_MUL; - radio->stereo = -1; - radio->muted = 1; mutex_init(&radio->lock); |