All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC/RFT 06/10] radio-mr800: simplify locking in ioctl callbacks
@ 2009-09-12 14:49 David Ellingsworth
  0 siblings, 0 replies; only message in thread
From: David Ellingsworth @ 2009-09-12 14:49 UTC (permalink / raw)
  To: linux-media, klimov.linux

[-- Attachment #1: Type: text/plain, Size: 5618 bytes --]

 From c012b1ac39a225e003b190a12ae942e1dd6ea09b Mon Sep 17 00:00:00 2001
From: David Ellingsworth <david@identd.dyndns.org>
Date: Sat, 12 Sep 2009 01:07:13 -0400
Subject: [PATCH 06/10] mr800: simplify locking in ioctl callbacks

Signed-off-by: David Ellingsworth <david@identd.dyndns.org>
---
 drivers/media/radio/radio-mr800.c |  109 
++++++++++---------------------------
 1 files changed, 30 insertions(+), 79 deletions(-)

diff --git a/drivers/media/radio/radio-mr800.c 
b/drivers/media/radio/radio-mr800.c
index 7305c96..71d15ba 100644
--- a/drivers/media/radio/radio-mr800.c
+++ b/drivers/media/radio/radio-mr800.c
@@ -299,18 +299,8 @@ static int vidioc_g_tuner(struct file *file, void 
*priv,
     struct amradio_device *radio = file->private_data;
     int retval;
 
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
-
-    if (v->index > 0) {
-        retval = -EINVAL;
-        goto unlock;
-    }
+    if (v->index > 0)
+        return -EINVAL;
 
 /* TODO: Add function which look is signal stereo or not
  *     amradio_getstat(radio);
@@ -338,8 +328,6 @@ static int vidioc_g_tuner(struct file *file, void *priv,
     v->signal = 0xffff;     /* Can't get the signal strength, sad.. */
     v->afc = 0; /* Don't know what is this */
 
-unlock:
-    mutex_unlock(&radio->lock);
     return retval;
 }
 
@@ -348,20 +336,10 @@ static int vidioc_s_tuner(struct file *file, void 
*priv,
                 struct v4l2_tuner *v)
 {
     struct amradio_device *radio = file->private_data;
-    int retval;
-
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
+    int retval = -EINVAL;
 
-    if (v->index > 0) {
-        retval = -EINVAL;
-        goto unlock;
-    }
+    if (v->index > 0)
+        return -EINVAL;
 
     /* mono/stereo selector */
     switch (v->audmode) {
@@ -377,12 +355,8 @@ static int vidioc_s_tuner(struct file *file, void 
*priv,
             amradio_dev_warn(&radio->videodev.dev,
                 "set stereo failed\n");
         break;
-    default:
-        retval = -EINVAL;
     }
 
-unlock:
-    mutex_unlock(&radio->lock);
     return retval;
 }
 
@@ -391,15 +365,7 @@ static int vidioc_s_frequency(struct file *file, 
void *priv,
                 struct v4l2_frequency *f)
 {
     struct amradio_device *radio = file->private_data;
-    int retval;
-
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
+    int retval = 0;
 
     radio->curfreq = f->frequency;
 
@@ -408,8 +374,6 @@ static int vidioc_s_frequency(struct file *file, 
void *priv,
         amradio_dev_warn(&radio->videodev.dev,
             "set frequency failed\n");
 
-unlock:
-    mutex_unlock(&radio->lock);
     return retval;
 }
 
@@ -418,22 +382,11 @@ static int vidioc_g_frequency(struct file *file, 
void *priv,
                 struct v4l2_frequency *f)
 {
     struct amradio_device *radio = file->private_data;
-    int retval = 0;
-
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
 
     f->type = V4L2_TUNER_RADIO;
     f->frequency = radio->curfreq;
 
-unlock:
-    mutex_unlock(&radio->lock);
-    return retval;
+    return 0;
 }
 
 /* vidioc_queryctrl - enumerate control items */
@@ -453,26 +406,14 @@ static int vidioc_g_ctrl(struct file *file, void 
*priv,
                 struct v4l2_control *ctrl)
 {
     struct amradio_device *radio = file->private_data;
-    int retval = -EINVAL;
-
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
 
     switch (ctrl->id) {
     case V4L2_CID_AUDIO_MUTE:
         ctrl->value = radio->muted;
-        retval = 0;
-        break;
+        return 0;
     }
 
-unlock:
-    mutex_unlock(&radio->lock);
-    return retval;
+    return -EINVAL;
 }
 
 /* vidioc_s_ctrl - set the value of a control */
@@ -482,14 +423,6 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
     struct amradio_device *radio = file->private_data;
     int retval = -EINVAL;
 
-    mutex_lock(&radio->lock);
-
-    /* safety check */
-    if (radio->removed) {
-        retval = -EIO;
-        goto unlock;
-    }
-
     switch (ctrl->id) {
     case V4L2_CID_AUDIO_MUTE:
         if (ctrl->value) {
@@ -508,8 +441,6 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
         break;
     }
 
-unlock:
-    mutex_unlock(&radio->lock);
     return retval;
 }
 
@@ -616,6 +547,26 @@ unlock:
     return retval;
 }
 
+static long usb_amradio_ioctl(struct file *file, unsigned int cmd,
+                unsigned long arg)
+{
+    struct amradio_device *radio = file->private_data;
+    long retval = 0;
+
+    mutex_lock(&radio->lock);
+
+    if (radio->removed) {
+        retval = -EIO;
+        goto unlock;
+    }
+
+    retval = video_ioctl2(file, cmd, arg);
+
+unlock:
+    mutex_unlock(&radio->lock);
+    return retval;
+}
+
 /* Suspend device - stop device. Need to be checked and fixed */
 static int usb_amradio_suspend(struct usb_interface *intf, pm_message_t 
message)
 {
@@ -657,7 +608,7 @@ static const struct v4l2_file_operations 
usb_amradio_fops = {
     .owner        = THIS_MODULE,
     .open        = usb_amradio_open,
     .release    = usb_amradio_close,
-    .ioctl        = video_ioctl2,
+    .ioctl        = usb_amradio_ioctl,
 };
 
 static const struct v4l2_ioctl_ops usb_amradio_ioctl_ops = {
-- 
1.6.3.3


[-- Attachment #2: 0006-mr800-simplify-locking-in-ioctl-callbacks.patch --]
[-- Type: text/x-diff, Size: 5052 bytes --]

>From c012b1ac39a225e003b190a12ae942e1dd6ea09b Mon Sep 17 00:00:00 2001
From: David Ellingsworth <david@identd.dyndns.org>
Date: Sat, 12 Sep 2009 01:07:13 -0400
Subject: [PATCH 06/10] mr800: simplify locking in ioctl callbacks

Signed-off-by: David Ellingsworth <david@identd.dyndns.org>
---
 drivers/media/radio/radio-mr800.c |  109 ++++++++++---------------------------
 1 files changed, 30 insertions(+), 79 deletions(-)

diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c
index 7305c96..71d15ba 100644
--- a/drivers/media/radio/radio-mr800.c
+++ b/drivers/media/radio/radio-mr800.c
@@ -299,18 +299,8 @@ static int vidioc_g_tuner(struct file *file, void *priv,
 	struct amradio_device *radio = file->private_data;
 	int retval;
 
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
-
-	if (v->index > 0) {
-		retval = -EINVAL;
-		goto unlock;
-	}
+	if (v->index > 0)
+		return -EINVAL;
 
 /* TODO: Add function which look is signal stereo or not
  * 	amradio_getstat(radio);
@@ -338,8 +328,6 @@ static int vidioc_g_tuner(struct file *file, void *priv,
 	v->signal = 0xffff;     /* Can't get the signal strength, sad.. */
 	v->afc = 0; /* Don't know what is this */
 
-unlock:
-	mutex_unlock(&radio->lock);
 	return retval;
 }
 
@@ -348,20 +336,10 @@ static int vidioc_s_tuner(struct file *file, void *priv,
 				struct v4l2_tuner *v)
 {
 	struct amradio_device *radio = file->private_data;
-	int retval;
-
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
+	int retval = -EINVAL;
 
-	if (v->index > 0) {
-		retval = -EINVAL;
-		goto unlock;
-	}
+	if (v->index > 0)
+		return -EINVAL;
 
 	/* mono/stereo selector */
 	switch (v->audmode) {
@@ -377,12 +355,8 @@ static int vidioc_s_tuner(struct file *file, void *priv,
 			amradio_dev_warn(&radio->videodev.dev,
 				"set stereo failed\n");
 		break;
-	default:
-		retval = -EINVAL;
 	}
 
-unlock:
-	mutex_unlock(&radio->lock);
 	return retval;
 }
 
@@ -391,15 +365,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
 				struct v4l2_frequency *f)
 {
 	struct amradio_device *radio = file->private_data;
-	int retval;
-
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
+	int retval = 0;
 
 	radio->curfreq = f->frequency;
 
@@ -408,8 +374,6 @@ static int vidioc_s_frequency(struct file *file, void *priv,
 		amradio_dev_warn(&radio->videodev.dev,
 			"set frequency failed\n");
 
-unlock:
-	mutex_unlock(&radio->lock);
 	return retval;
 }
 
@@ -418,22 +382,11 @@ static int vidioc_g_frequency(struct file *file, void *priv,
 				struct v4l2_frequency *f)
 {
 	struct amradio_device *radio = file->private_data;
-	int retval = 0;
-
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
 
 	f->type = V4L2_TUNER_RADIO;
 	f->frequency = radio->curfreq;
 
-unlock:
-	mutex_unlock(&radio->lock);
-	return retval;
+	return 0;
 }
 
 /* vidioc_queryctrl - enumerate control items */
@@ -453,26 +406,14 @@ static int vidioc_g_ctrl(struct file *file, void *priv,
 				struct v4l2_control *ctrl)
 {
 	struct amradio_device *radio = file->private_data;
-	int retval = -EINVAL;
-
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
 
 	switch (ctrl->id) {
 	case V4L2_CID_AUDIO_MUTE:
 		ctrl->value = radio->muted;
-		retval = 0;
-		break;
+		return 0;
 	}
 
-unlock:
-	mutex_unlock(&radio->lock);
-	return retval;
+	return -EINVAL;
 }
 
 /* vidioc_s_ctrl - set the value of a control */
@@ -482,14 +423,6 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
 	struct amradio_device *radio = file->private_data;
 	int retval = -EINVAL;
 
-	mutex_lock(&radio->lock);
-
-	/* safety check */
-	if (radio->removed) {
-		retval = -EIO;
-		goto unlock;
-	}
-
 	switch (ctrl->id) {
 	case V4L2_CID_AUDIO_MUTE:
 		if (ctrl->value) {
@@ -508,8 +441,6 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
 		break;
 	}
 
-unlock:
-	mutex_unlock(&radio->lock);
 	return retval;
 }
 
@@ -616,6 +547,26 @@ unlock:
 	return retval;
 }
 
+static long usb_amradio_ioctl(struct file *file, unsigned int cmd,
+				unsigned long arg)
+{
+	struct amradio_device *radio = file->private_data;
+	long retval = 0;
+
+	mutex_lock(&radio->lock);
+
+	if (radio->removed) {
+		retval = -EIO;
+		goto unlock;
+	}
+
+	retval = video_ioctl2(file, cmd, arg);
+
+unlock:
+	mutex_unlock(&radio->lock);
+	return retval;
+}
+
 /* Suspend device - stop device. Need to be checked and fixed */
 static int usb_amradio_suspend(struct usb_interface *intf, pm_message_t message)
 {
@@ -657,7 +608,7 @@ static const struct v4l2_file_operations usb_amradio_fops = {
 	.owner		= THIS_MODULE,
 	.open		= usb_amradio_open,
 	.release	= usb_amradio_close,
-	.ioctl		= video_ioctl2,
+	.ioctl		= usb_amradio_ioctl,
 };
 
 static const struct v4l2_ioctl_ops usb_amradio_ioctl_ops = {
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-09-12 14:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-12 14:49 [RFC/RFT 06/10] radio-mr800: simplify locking in ioctl callbacks David Ellingsworth

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.