aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/ivtv/ivtv-vbi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-vbi.c')
-rw-r--r--drivers/media/video/ivtv/ivtv-vbi.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/drivers/media/video/ivtv/ivtv-vbi.c b/drivers/media/video/ivtv/ivtv-vbi.c
index 3ba46e07ea1f..a7282a91bd97 100644
--- a/drivers/media/video/ivtv/ivtv-vbi.c
+++ b/drivers/media/video/ivtv/ivtv-vbi.c
@@ -219,31 +219,23 @@ ssize_t ivtv_write_vbi(struct ivtv *itv, const char __user *ubuf, size_t count)
219 int found_cc = 0; 219 int found_cc = 0;
220 int cc_pos = itv->vbi.cc_pos; 220 int cc_pos = itv->vbi.cc_pos;
221 221
222 if (itv->vbi.service_set_out == 0)
223 return -EPERM;
224
225 while (count >= sizeof(struct v4l2_sliced_vbi_data)) { 222 while (count >= sizeof(struct v4l2_sliced_vbi_data)) {
226 switch (p->id) { 223 switch (p->id) {
227 case V4L2_SLICED_CAPTION_525: 224 case V4L2_SLICED_CAPTION_525:
228 if (p->id == V4L2_SLICED_CAPTION_525 && 225 if (p->line == 21) {
229 p->line == 21 && 226 found_cc = 1;
230 (itv->vbi.service_set_out & 227 if (p->field) {
231 V4L2_SLICED_CAPTION_525) == 0) { 228 cc[2] = p->data[0];
232 break; 229 cc[3] = p->data[1];
233 } 230 } else {
234 found_cc = 1; 231 cc[0] = p->data[0];
235 if (p->field) { 232 cc[1] = p->data[1];
236 cc[2] = p->data[0]; 233 }
237 cc[3] = p->data[1];
238 } else {
239 cc[0] = p->data[0];
240 cc[1] = p->data[1];
241 } 234 }
242 break; 235 break;
243 236
244 case V4L2_SLICED_VPS: 237 case V4L2_SLICED_VPS:
245 if (p->line == 16 && p->field == 0 && 238 if (p->line == 16 && p->field == 0) {
246 (itv->vbi.service_set_out & V4L2_SLICED_VPS)) {
247 itv->vbi.vps[0] = p->data[2]; 239 itv->vbi.vps[0] = p->data[2];
248 itv->vbi.vps[1] = p->data[8]; 240 itv->vbi.vps[1] = p->data[8];
249 itv->vbi.vps[2] = p->data[9]; 241 itv->vbi.vps[2] = p->data[9];
@@ -255,8 +247,7 @@ ssize_t ivtv_write_vbi(struct ivtv *itv, const char __user *ubuf, size_t count)
255 break; 247 break;
256 248
257 case V4L2_SLICED_WSS_625: 249 case V4L2_SLICED_WSS_625:
258 if (p->line == 23 && p->field == 0 && 250 if (p->line == 23 && p->field == 0) {
259 (itv->vbi.service_set_out & V4L2_SLICED_WSS_625)) {
260 /* No lock needed for WSS */ 251 /* No lock needed for WSS */
261 itv->vbi.wss = p->data[0] | (p->data[1] << 8); 252 itv->vbi.wss = p->data[0] | (p->data[1] << 8);
262 itv->vbi.wss_found = 1; 253 itv->vbi.wss_found = 1;