aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-06-23 07:40:07 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-09 18:48:32 -0400
commita2e10b5aee587442fd7831e1707cce32e3b2e414 (patch)
tree1675c4e71b7da28651d69db192386e7758323cd1
parent0d0c1596b9d62eb44972b9210f80e38722a05465 (diff)
[media] wl128x: remove V4L2_FL_LOCK_ALL_FOPS
Add proper locking to the file operations, allowing for the removal of the V4L2_FL_LOCK_ALL_FOPS flag. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/radio/wl128x/fmdrv_v4l2.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c b/drivers/media/radio/wl128x/fmdrv_v4l2.c
index 49a11ec1f449..db2248ee9498 100644
--- a/drivers/media/radio/wl128x/fmdrv_v4l2.c
+++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c
@@ -56,23 +56,29 @@ static ssize_t fm_v4l2_fops_read(struct file *file, char __user * buf,
56 return -EIO; 56 return -EIO;
57 } 57 }
58 58
59 /* Turn on RDS mode , if it is disabled */ 59 if (mutex_lock_interruptible(&fmdev->mutex))
60 return -ERESTARTSYS;
61
62 /* Turn on RDS mode if it is disabled */
60 ret = fm_rx_get_rds_mode(fmdev, &rds_mode); 63 ret = fm_rx_get_rds_mode(fmdev, &rds_mode);
61 if (ret < 0) { 64 if (ret < 0) {
62 fmerr("Unable to read current rds mode\n"); 65 fmerr("Unable to read current rds mode\n");
63 return ret; 66 goto read_unlock;
64 } 67 }
65 68
66 if (rds_mode == FM_RDS_DISABLE) { 69 if (rds_mode == FM_RDS_DISABLE) {
67 ret = fmc_set_rds_mode(fmdev, FM_RDS_ENABLE); 70 ret = fmc_set_rds_mode(fmdev, FM_RDS_ENABLE);
68 if (ret < 0) { 71 if (ret < 0) {
69 fmerr("Failed to enable rds mode\n"); 72 fmerr("Failed to enable rds mode\n");
70 return ret; 73 goto read_unlock;
71 } 74 }
72 } 75 }
73 76
74 /* Copy RDS data from internal buffer to user buffer */ 77 /* Copy RDS data from internal buffer to user buffer */
75 return fmc_transfer_rds_from_internal_buff(fmdev, file, buf, count); 78 ret = fmc_transfer_rds_from_internal_buff(fmdev, file, buf, count);
79read_unlock:
80 mutex_unlock(&fmdev->mutex);
81 return ret;
76} 82}
77 83
78/* Write TX RDS data */ 84/* Write TX RDS data */
@@ -91,8 +97,11 @@ static ssize_t fm_v4l2_fops_write(struct file *file, const char __user * buf,
91 return -EFAULT; 97 return -EFAULT;
92 98
93 fmdev = video_drvdata(file); 99 fmdev = video_drvdata(file);
100 if (mutex_lock_interruptible(&fmdev->mutex))
101 return -ERESTARTSYS;
94 fm_tx_set_radio_text(fmdev, rds.text, rds.text_type); 102 fm_tx_set_radio_text(fmdev, rds.text, rds.text_type);
95 fm_tx_set_af(fmdev, rds.af_freq); 103 fm_tx_set_af(fmdev, rds.af_freq);
104 mutex_unlock(&fmdev->mutex);
96 105
97 return sizeof(rds); 106 return sizeof(rds);
98} 107}
@@ -103,7 +112,9 @@ static u32 fm_v4l2_fops_poll(struct file *file, struct poll_table_struct *pts)
103 struct fmdev *fmdev; 112 struct fmdev *fmdev;
104 113
105 fmdev = video_drvdata(file); 114 fmdev = video_drvdata(file);
115 mutex_lock(&fmdev->mutex);
106 ret = fmc_is_rds_data_available(fmdev, file, pts); 116 ret = fmc_is_rds_data_available(fmdev, file, pts);
117 mutex_unlock(&fmdev->mutex);
107 if (ret < 0) 118 if (ret < 0)
108 return POLLIN | POLLRDNORM; 119 return POLLIN | POLLRDNORM;
109 120
@@ -127,10 +138,12 @@ static int fm_v4l2_fops_open(struct file *file)
127 138
128 fmdev = video_drvdata(file); 139 fmdev = video_drvdata(file);
129 140
141 if (mutex_lock_interruptible(&fmdev->mutex))
142 return -ERESTARTSYS;
130 ret = fmc_prepare(fmdev); 143 ret = fmc_prepare(fmdev);
131 if (ret < 0) { 144 if (ret < 0) {
132 fmerr("Unable to prepare FM CORE\n"); 145 fmerr("Unable to prepare FM CORE\n");
133 return ret; 146 goto open_unlock;
134 } 147 }
135 148
136 fmdbg("Load FM RX firmware..\n"); 149 fmdbg("Load FM RX firmware..\n");
@@ -138,10 +151,12 @@ static int fm_v4l2_fops_open(struct file *file)
138 ret = fmc_set_mode(fmdev, FM_MODE_RX); 151 ret = fmc_set_mode(fmdev, FM_MODE_RX);
139 if (ret < 0) { 152 if (ret < 0) {
140 fmerr("Unable to load FM RX firmware\n"); 153 fmerr("Unable to load FM RX firmware\n");
141 return ret; 154 goto open_unlock;
142 } 155 }
143 radio_disconnected = 1; 156 radio_disconnected = 1;
144 157
158open_unlock:
159 mutex_unlock(&fmdev->mutex);
145 return ret; 160 return ret;
146} 161}
147 162
@@ -156,19 +171,22 @@ static int fm_v4l2_fops_release(struct file *file)
156 return 0; 171 return 0;
157 } 172 }
158 173
174 mutex_lock(&fmdev->mutex);
159 ret = fmc_set_mode(fmdev, FM_MODE_OFF); 175 ret = fmc_set_mode(fmdev, FM_MODE_OFF);
160 if (ret < 0) { 176 if (ret < 0) {
161 fmerr("Unable to turn off the chip\n"); 177 fmerr("Unable to turn off the chip\n");
162 return ret; 178 goto release_unlock;
163 } 179 }
164 180
165 ret = fmc_release(fmdev); 181 ret = fmc_release(fmdev);
166 if (ret < 0) { 182 if (ret < 0) {
167 fmerr("FM CORE release failed\n"); 183 fmerr("FM CORE release failed\n");
168 return ret; 184 goto release_unlock;
169 } 185 }
170 radio_disconnected = 0; 186 radio_disconnected = 0;
171 187
188release_unlock:
189 mutex_unlock(&fmdev->mutex);
172 return ret; 190 return ret;
173} 191}
174 192
@@ -520,10 +538,6 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr)
520 video_set_drvdata(gradio_dev, fmdev); 538 video_set_drvdata(gradio_dev, fmdev);
521 539
522 gradio_dev->lock = &fmdev->mutex; 540 gradio_dev->lock = &fmdev->mutex;
523 /* Locking in file operations other than ioctl should be done
524 by the driver, not the V4L2 core.
525 This driver needs auditing so that this flag can be removed. */
526 set_bit(V4L2_FL_LOCK_ALL_FOPS, &gradio_dev->flags);
527 541
528 /* Register with V4L2 subsystem as RADIO device */ 542 /* Register with V4L2 subsystem as RADIO device */
529 if (video_register_device(gradio_dev, VFL_TYPE_RADIO, radio_nr)) { 543 if (video_register_device(gradio_dev, VFL_TYPE_RADIO, radio_nr)) {