diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-06-23 07:40:07 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-08-09 18:48:32 -0400 |
commit | a2e10b5aee587442fd7831e1707cce32e3b2e414 (patch) | |
tree | 1675c4e71b7da28651d69db192386e7758323cd1 | |
parent | 0d0c1596b9d62eb44972b9210f80e38722a05465 (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.c | 38 |
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); |
79 | read_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 | ||
158 | open_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 | ||
188 | release_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)) { |