| @@ -1018,8 +1018,7 @@ static int buffer_prepare(struct videobuf_queue *q, · 1017 unmodified lines |
| 1018 | 1018 | struct videobuf_buffer *vb, |
| 1019 | 1019 | enum v4l2_field field) |
| 1020 | 1020 | { |
| 1021 | | − struct saa7134_fh *fh = q->priv_data; |
| 1022 | | − struct saa7134_dev *dev = fh->dev; |
| 1021 | + struct saa7134_dev *dev = q->priv_data; |
| 1023 | 1022 | struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); |
| 1024 | 1023 | unsigned int size; |
| 1025 | 1024 | int err; |
| @@ -1057,7 +1056,7 @@ static int buffer_prepare(struct videobuf_queue *q, · 31 unmodified lines |
| 1057 | 1056 | buf->vb.size = size; |
| 1058 | 1057 | buf->vb.field = field; |
| 1059 | 1058 | buf->fmt = dev->fmt; |
| 1060 | | − buf->pt = &fh->pt_cap; |
| 1059 | + buf->pt = &dev->pt_cap; |
| 1061 | 1060 | dev->video_q.curr = NULL; |
| 1062 | 1061 | |
| 1063 | 1062 | err = videobuf_iolock(q,&buf->vb,&dev->ovbuf); |
| @@ -1082,8 +1081,7 @@ static int buffer_prepare(struct videobuf_queue *q, · 18 unmodified lines |
| 1082 | 1081 | static int |
| 1083 | 1082 | buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size) |
| 1084 | 1083 | { |
| 1085 | | − struct saa7134_fh *fh = q->priv_data; |
| 1086 | | − struct saa7134_dev *dev = fh->dev; |
| 1084 | + struct saa7134_dev *dev = q->priv_data; |
| 1087 | 1085 | |
| 1088 | 1086 | *size = dev->fmt->depth * dev->width * dev->height >> 3; |
| 1089 | 1087 | if (0 == *count) |
| @@ -1094,10 +1092,10 @@ buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size) · 4 unmodified lines |
| 1094 | 1092 | |
| 1095 | 1093 | static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) |
| 1096 | 1094 | { |
| 1097 | | − struct saa7134_fh *fh = q->priv_data; |
| 1095 | + struct saa7134_dev *dev = q->priv_data; |
| 1098 | 1096 | struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); |
| 1099 | 1097 | |
| 1100 | | − saa7134_buffer_queue(fh->dev,&fh->dev->video_q,buf); |
| 1098 | + saa7134_buffer_queue(dev, &dev->video_q, buf); |
| 1101 | 1099 | } |
| 1102 | 1100 | |
| 1103 | 1101 | static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) |
| @@ -1293,14 +1291,15 @@ static struct videobuf_queue *saa7134_queue(struct file *file) · 189 unmodified lines |
| 1293 | 1291 | { |
| 1294 | 1292 | struct video_device *vdev = video_devdata(file); |
| 1295 | 1293 | struct saa7134_fh *fh = file->private_data; |
| 1294 | + struct saa7134_dev *dev = fh->dev; |
| 1296 | 1295 | struct videobuf_queue *q = NULL; |
| 1297 | 1296 | |
| 1298 | 1297 | switch (vdev->vfl_type) { |
| 1299 | 1298 | case VFL_TYPE_GRABBER: |
| 1300 | | − q = &fh->cap; |
| 1299 | + q = &dev->cap; |
| 1301 | 1300 | break; |
| 1302 | 1301 | case VFL_TYPE_VBI: |
| 1303 | | − q = &fh->vbi; |
| 1302 | + q = &dev->vbi; |
| 1304 | 1303 | break; |
| 1305 | 1304 | default: |
| 1306 | 1305 | BUG(); |
| @@ -1337,21 +1336,6 @@ static int video_open(struct file *file) · 30 unmodified lines |
| 1337 | 1336 | file->private_data = fh; |
| 1338 | 1337 | fh->dev = dev; |
| 1339 | 1338 | |
| 1340 | | − videobuf_queue_sg_init(&fh->cap, &video_qops, |
| 1341 | | − &dev->pci->dev, &dev->slock, |
| 1342 | | − V4L2_BUF_TYPE_VIDEO_CAPTURE, |
| 1343 | | − V4L2_FIELD_INTERLACED, |
| 1344 | | − sizeof(struct saa7134_buf), |
| 1345 | | − fh, NULL); |
| 1346 | | − videobuf_queue_sg_init(&fh->vbi, &saa7134_vbi_qops, |
| 1347 | | − &dev->pci->dev, &dev->slock, |
| 1348 | | − V4L2_BUF_TYPE_VBI_CAPTURE, |
| 1349 | | − V4L2_FIELD_SEQ_TB, |
| 1350 | | − sizeof(struct saa7134_buf), |
| 1351 | | − fh, NULL); |
| 1352 | | − saa7134_pgtable_alloc(dev->pci,&fh->pt_cap); |
| 1353 | | − saa7134_pgtable_alloc(dev->pci,&fh->pt_vbi); |
| 1354 | | − |
| 1355 | 1339 | if (vdev->vfl_type == VFL_TYPE_RADIO) { |
| 1356 | 1340 | /* switch to radio mode */ |
| 1357 | 1341 | saa7134_tvaudio_setinput(dev,&card(dev).radio); |
| @@ -1396,28 +1380,30 @@ video_poll(struct file *file, struct poll_table_struct *wait) · 38 unmodified lines |
| 1396 | 1380 | { |
| 1397 | 1381 | struct video_device *vdev = video_devdata(file); |
| 1398 | 1382 | struct saa7134_fh *fh = file->private_data; |
| 1383 | + struct saa7134_dev *dev = fh->dev; |
| 1399 | 1384 | struct videobuf_buffer *buf = NULL; |
| 1400 | 1385 | unsigned int rc = 0; |
| 1401 | 1386 | |
| 1402 | 1387 | if (vdev->vfl_type == VFL_TYPE_VBI) |
| 1403 | | − return videobuf_poll_stream(file, &fh->vbi, wait); |
| 1388 | + return videobuf_poll_stream(file, &dev->vbi, wait); |
| 1404 | 1389 | |
| 1405 | 1390 | if (res_check(fh,RESOURCE_VIDEO)) { |
| 1406 | | − mutex_lock(&fh->cap.vb_lock); |
| 1407 | | − if (!list_empty(&fh->cap.stream)) |
| 1408 | | − buf = list_entry(fh->cap.stream.next, struct videobuf_buffer, stream); |
| 1391 | + mutex_lock(&dev->cap.vb_lock); |
| 1392 | + if (!list_empty(&dev->cap.stream)) |
| 1393 | + buf = list_entry(dev->cap.stream.next, struct videobuf_buffer, stream); |
| 1409 | 1394 | } else { |
| 1410 | | − mutex_lock(&fh->cap.vb_lock); |
| 1411 | | − if (UNSET == fh->cap.read_off) { |
| 1395 | + mutex_lock(&dev->cap.vb_lock); |
| 1396 | + if (UNSET == dev->cap.read_off) { |
| 1412 | 1397 | /* need to capture a new frame */ |
| 1413 | 1398 | if (res_locked(fh->dev,RESOURCE_VIDEO)) |
| 1414 | 1399 | goto err; |
| 1415 | | − if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) |
| 1400 | + if (0 != dev->cap.ops->buf_prepare(&dev->cap, |
| 1401 | + dev->cap.read_buf, dev->cap.field)) |
| 1416 | 1402 | goto err; |
| 1417 | | − fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); |
| 1418 | | − fh->cap.read_off = 0; |
| 1403 | + dev->cap.ops->buf_queue(&dev->cap, dev->cap.read_buf); |
| 1404 | + dev->cap.read_off = 0; |
| 1419 | 1405 | } |
| 1420 | | − buf = fh->cap.read_buf; |
| 1406 | + buf = dev->cap.read_buf; |
| 1421 | 1407 | } |
| 1422 | 1408 | |
| 1423 | 1409 | if (!buf) |
| @@ -1427,11 +1413,11 @@ video_poll(struct file *file, struct poll_table_struct *wait) · 3 unmodified lines |
| 1427 | 1413 | if (buf->state == VIDEOBUF_DONE || |
| 1428 | 1414 | buf->state == VIDEOBUF_ERROR) |
| 1429 | 1415 | rc = POLLIN|POLLRDNORM; |
| 1430 | | − mutex_unlock(&fh->cap.vb_lock); |
| 1416 | + mutex_unlock(&dev->cap.vb_lock); |
| 1431 | 1417 | return rc; |
| 1432 | 1418 | |
| 1433 | 1419 | err: |
| 1434 | | − mutex_unlock(&fh->cap.vb_lock); |
| 1420 | + mutex_unlock(&dev->cap.vb_lock); |
| 1435 | 1421 | return POLLERR; |
| 1436 | 1422 | } |
| 1437 | 1423 | |
| @@ -1456,18 +1442,20 @@ static int video_release(struct file *file) · 18 unmodified lines |
| 1456 | 1442 | /* stop video capture */ |
| 1457 | 1443 | if (res_check(fh, RESOURCE_VIDEO)) { |
| 1458 | 1444 | pm_qos_remove_request(&dev->qos_request); |
| 1459 | | − videobuf_streamoff(&fh->cap); |
| 1445 | + videobuf_streamoff(&dev->cap); |
| 1460 | 1446 | res_free(dev,fh,RESOURCE_VIDEO); |
| 1447 | + videobuf_mmap_free(&dev->cap); |
| 1461 | 1448 | } |
| 1462 | | − if (fh->cap.read_buf) { |
| 1463 | | − buffer_release(&fh->cap,fh->cap.read_buf); |
| 1464 | | − kfree(fh->cap.read_buf); |
| 1449 | + if (dev->cap.read_buf) { |
| 1450 | + buffer_release(&dev->cap, dev->cap.read_buf); |
| 1451 | + kfree(dev->cap.read_buf); |
| 1465 | 1452 | } |
| 1466 | 1453 | |
| 1467 | 1454 | /* stop vbi capture */ |
| 1468 | 1455 | if (res_check(fh, RESOURCE_VBI)) { |
| 1469 | | − videobuf_stop(&fh->vbi); |
| 1456 | + videobuf_stop(&dev->vbi); |
| 1470 | 1457 | res_free(dev,fh,RESOURCE_VBI); |
| 1458 | + videobuf_mmap_free(&dev->vbi); |
| 1471 | 1459 | } |
| 1472 | 1460 | |
| 1473 | 1461 | /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/ |
| @@ -1480,12 +1468,6 @@ static int video_release(struct file *file) · 6 unmodified lines |
| 1480 | 1468 | if (vdev->vfl_type == VFL_TYPE_RADIO) |
| 1481 | 1469 | saa_call_all(dev, core, ioctl, SAA6588_CMD_CLOSE, &cmd); |
| 1482 | 1470 | |
| 1483 | | − /* free stuff */ |
| 1484 | | − videobuf_mmap_free(&fh->cap); |
| 1485 | | − videobuf_mmap_free(&fh->vbi); |
| 1486 | | − saa7134_pgtable_free(dev->pci,&fh->pt_cap); |
| 1487 | | − saa7134_pgtable_free(dev->pci,&fh->pt_vbi); |
| 1488 | | − |
| 1489 | 1471 | v4l2_fh_del(&fh->fh); |
| 1490 | 1472 | v4l2_fh_exit(&fh->fh); |
| 1491 | 1473 | file->private_data = NULL; |
| @@ -1560,7 +1542,7 @@ static int saa7134_g_fmt_vid_cap(struct file *file, void *priv, · 68 unmodified lines |
| 1560 | 1542 | |
| 1561 | 1543 | f->fmt.pix.width = dev->width; |
| 1562 | 1544 | f->fmt.pix.height = dev->height; |
| 1563 | | − f->fmt.pix.field = fh->cap.field; |
| 1545 | + f->fmt.pix.field = dev->cap.field; |
| 1564 | 1546 | f->fmt.pix.pixelformat = dev->fmt->fourcc; |
| 1565 | 1547 | f->fmt.pix.bytesperline = |
| 1566 | 1548 | (f->fmt.pix.width * dev->fmt->depth) >> 3; |
| @@ -1686,7 +1668,7 @@ static int saa7134_s_fmt_vid_cap(struct file *file, void *priv, · 119 unmodified lines |
| 1686 | 1668 | dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat); |
| 1687 | 1669 | dev->width = f->fmt.pix.width; |
| 1688 | 1670 | dev->height = f->fmt.pix.height; |
| 1689 | | − fh->cap.field = f->fmt.pix.field; |
| 1671 | + dev->cap.field = f->fmt.pix.field; |
| 1690 | 1672 | return 0; |
| 1691 | 1673 | } |
| 1692 | 1674 | |
| @@ -2489,9 +2471,31 @@ int saa7134_video_init1(struct saa7134_dev *dev) · 796 unmodified lines |
| 2489 | 2471 | if (saa7134_boards[dev->board].video_out) |
| 2490 | 2472 | saa7134_videoport_init(dev); |
| 2491 | 2473 | |
| 2474 | + videobuf_queue_sg_init(&dev->cap, &video_qops, |
| 2475 | + &dev->pci->dev, &dev->slock, |
| 2476 | + V4L2_BUF_TYPE_VIDEO_CAPTURE, |
| 2477 | + V4L2_FIELD_INTERLACED, |
| 2478 | + sizeof(struct saa7134_buf), |
| 2479 | + dev, NULL); |
| 2480 | + videobuf_queue_sg_init(&dev->vbi, &saa7134_vbi_qops, |
| 2481 | + &dev->pci->dev, &dev->slock, |
| 2482 | + V4L2_BUF_TYPE_VBI_CAPTURE, |
| 2483 | + V4L2_FIELD_SEQ_TB, |
| 2484 | + sizeof(struct saa7134_buf), |
| 2485 | + dev, NULL); |
| 2486 | + saa7134_pgtable_alloc(dev->pci, &dev->pt_cap); |
| 2487 | + saa7134_pgtable_alloc(dev->pci, &dev->pt_vbi); |
| 2488 | + |
| 2492 | 2489 | return 0; |
| 2493 | 2490 | } |
| 2494 | 2491 | |
| 2492 | +void saa7134_video_fini(struct saa7134_dev *dev) |
| 2493 | +{ |
| 2494 | + /* free stuff */ |
| 2495 | + saa7134_pgtable_free(dev->pci, &dev->pt_cap); |
| 2496 | + saa7134_pgtable_free(dev->pci, &dev->pt_vbi); |
| 2497 | +} |
| 2498 | + |
| 2495 | 2499 | int saa7134_videoport_init(struct saa7134_dev *dev) |
| 2496 | 2500 | { |
| 2497 | 2501 | /* enable video output */ |