aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/pci/saa7134/saa7134-video.c
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2013-12-14 06:28:23 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-07 04:16:07 -0500
commit9db0fb182ea8a42c5bfd322b169d65728721fd71 (patch)
tree04fe9c9486e8dfb4227fe6e3951962fadd7f8620 /drivers/media/pci/saa7134/saa7134-video.c
parentdc18d1bea679c6b6bfdc570469160aec5c1d3689 (diff)
[media] saa7134: move the queue data from saa7134_fh to saa7134_dev
These fields are global, not per-filehandle. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/pci/saa7134/saa7134-video.c')
-rw-r--r--drivers/media/pci/saa7134/saa7134-video.c102
1 files changed, 53 insertions, 49 deletions
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
index fb60da85bc2c..8f73058f901e 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -1018,8 +1018,7 @@ static int buffer_prepare(struct videobuf_queue *q,
1018 struct videobuf_buffer *vb, 1018 struct videobuf_buffer *vb,
1019 enum v4l2_field field) 1019 enum v4l2_field field)
1020{ 1020{
1021 struct saa7134_fh *fh = q->priv_data; 1021 struct saa7134_dev *dev = q->priv_data;
1022 struct saa7134_dev *dev = fh->dev;
1023 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 1022 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
1024 unsigned int size; 1023 unsigned int size;
1025 int err; 1024 int err;
@@ -1057,7 +1056,7 @@ static int buffer_prepare(struct videobuf_queue *q,
1057 buf->vb.size = size; 1056 buf->vb.size = size;
1058 buf->vb.field = field; 1057 buf->vb.field = field;
1059 buf->fmt = dev->fmt; 1058 buf->fmt = dev->fmt;
1060 buf->pt = &fh->pt_cap; 1059 buf->pt = &dev->pt_cap;
1061 dev->video_q.curr = NULL; 1060 dev->video_q.curr = NULL;
1062 1061
1063 err = videobuf_iolock(q,&buf->vb,&dev->ovbuf); 1062 err = videobuf_iolock(q,&buf->vb,&dev->ovbuf);
@@ -1082,8 +1081,7 @@ static int buffer_prepare(struct videobuf_queue *q,
1082static int 1081static int
1083buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size) 1082buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1084{ 1083{
1085 struct saa7134_fh *fh = q->priv_data; 1084 struct saa7134_dev *dev = q->priv_data;
1086 struct saa7134_dev *dev = fh->dev;
1087 1085
1088 *size = dev->fmt->depth * dev->width * dev->height >> 3; 1086 *size = dev->fmt->depth * dev->width * dev->height >> 3;
1089 if (0 == *count) 1087 if (0 == *count)
@@ -1094,10 +1092,10 @@ buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1094 1092
1095static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) 1093static 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 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 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
1103static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) 1101static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
@@ -1293,14 +1291,15 @@ static struct videobuf_queue *saa7134_queue(struct file *file)
1293{ 1291{
1294 struct video_device *vdev = video_devdata(file); 1292 struct video_device *vdev = video_devdata(file);
1295 struct saa7134_fh *fh = file->private_data; 1293 struct saa7134_fh *fh = file->private_data;
1294 struct saa7134_dev *dev = fh->dev;
1296 struct videobuf_queue *q = NULL; 1295 struct videobuf_queue *q = NULL;
1297 1296
1298 switch (vdev->vfl_type) { 1297 switch (vdev->vfl_type) {
1299 case VFL_TYPE_GRABBER: 1298 case VFL_TYPE_GRABBER:
1300 q = &fh->cap; 1299 q = &dev->cap;
1301 break; 1300 break;
1302 case VFL_TYPE_VBI: 1301 case VFL_TYPE_VBI:
1303 q = &fh->vbi; 1302 q = &dev->vbi;
1304 break; 1303 break;
1305 default: 1304 default:
1306 BUG(); 1305 BUG();
@@ -1337,21 +1336,6 @@ static int video_open(struct file *file)
1337 file->private_data = fh; 1336 file->private_data = fh;
1338 fh->dev = dev; 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 if (vdev->vfl_type == VFL_TYPE_RADIO) { 1339 if (vdev->vfl_type == VFL_TYPE_RADIO) {
1356 /* switch to radio mode */ 1340 /* switch to radio mode */
1357 saa7134_tvaudio_setinput(dev,&card(dev).radio); 1341 saa7134_tvaudio_setinput(dev,&card(dev).radio);
@@ -1396,28 +1380,30 @@ video_poll(struct file *file, struct poll_table_struct *wait)
1396{ 1380{
1397 struct video_device *vdev = video_devdata(file); 1381 struct video_device *vdev = video_devdata(file);
1398 struct saa7134_fh *fh = file->private_data; 1382 struct saa7134_fh *fh = file->private_data;
1383 struct saa7134_dev *dev = fh->dev;
1399 struct videobuf_buffer *buf = NULL; 1384 struct videobuf_buffer *buf = NULL;
1400 unsigned int rc = 0; 1385 unsigned int rc = 0;
1401 1386
1402 if (vdev->vfl_type == VFL_TYPE_VBI) 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 if (res_check(fh,RESOURCE_VIDEO)) { 1390 if (res_check(fh,RESOURCE_VIDEO)) {
1406 mutex_lock(&fh->cap.vb_lock); 1391 mutex_lock(&dev->cap.vb_lock);
1407 if (!list_empty(&fh->cap.stream)) 1392 if (!list_empty(&dev->cap.stream))
1408 buf = list_entry(fh->cap.stream.next, struct videobuf_buffer, stream); 1393 buf = list_entry(dev->cap.stream.next, struct videobuf_buffer, stream);
1409 } else { 1394 } else {
1410 mutex_lock(&fh->cap.vb_lock); 1395 mutex_lock(&dev->cap.vb_lock);
1411 if (UNSET == fh->cap.read_off) { 1396 if (UNSET == dev->cap.read_off) {
1412 /* need to capture a new frame */ 1397 /* need to capture a new frame */
1413 if (res_locked(fh->dev,RESOURCE_VIDEO)) 1398 if (res_locked(fh->dev,RESOURCE_VIDEO))
1414 goto err; 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 goto err; 1402 goto err;
1417 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); 1403 dev->cap.ops->buf_queue(&dev->cap, dev->cap.read_buf);
1418 fh->cap.read_off = 0; 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 if (!buf) 1409 if (!buf)
@@ -1427,11 +1413,11 @@ video_poll(struct file *file, struct poll_table_struct *wait)
1427 if (buf->state == VIDEOBUF_DONE || 1413 if (buf->state == VIDEOBUF_DONE ||
1428 buf->state == VIDEOBUF_ERROR) 1414 buf->state == VIDEOBUF_ERROR)
1429 rc = POLLIN|POLLRDNORM; 1415 rc = POLLIN|POLLRDNORM;
1430 mutex_unlock(&fh->cap.vb_lock); 1416 mutex_unlock(&dev->cap.vb_lock);
1431 return rc; 1417 return rc;
1432 1418
1433err: 1419err:
1434 mutex_unlock(&fh->cap.vb_lock); 1420 mutex_unlock(&dev->cap.vb_lock);
1435 return POLLERR; 1421 return POLLERR;
1436} 1422}
1437 1423
@@ -1456,18 +1442,20 @@ static int video_release(struct file *file)
1456 /* stop video capture */ 1442 /* stop video capture */
1457 if (res_check(fh, RESOURCE_VIDEO)) { 1443 if (res_check(fh, RESOURCE_VIDEO)) {
1458 pm_qos_remove_request(&dev->qos_request); 1444 pm_qos_remove_request(&dev->qos_request);
1459 videobuf_streamoff(&fh->cap); 1445 videobuf_streamoff(&dev->cap);
1460 res_free(dev,fh,RESOURCE_VIDEO); 1446 res_free(dev,fh,RESOURCE_VIDEO);
1447 videobuf_mmap_free(&dev->cap);
1461 } 1448 }
1462 if (fh->cap.read_buf) { 1449 if (dev->cap.read_buf) {
1463 buffer_release(&fh->cap,fh->cap.read_buf); 1450 buffer_release(&dev->cap, dev->cap.read_buf);
1464 kfree(fh->cap.read_buf); 1451 kfree(dev->cap.read_buf);
1465 } 1452 }
1466 1453
1467 /* stop vbi capture */ 1454 /* stop vbi capture */
1468 if (res_check(fh, RESOURCE_VBI)) { 1455 if (res_check(fh, RESOURCE_VBI)) {
1469 videobuf_stop(&fh->vbi); 1456 videobuf_stop(&dev->vbi);
1470 res_free(dev,fh,RESOURCE_VBI); 1457 res_free(dev,fh,RESOURCE_VBI);
1458 videobuf_mmap_free(&dev->vbi);
1471 } 1459 }
1472 1460
1473 /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/ 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)
1480 if (vdev->vfl_type == VFL_TYPE_RADIO) 1468 if (vdev->vfl_type == VFL_TYPE_RADIO)
1481 saa_call_all(dev, core, ioctl, SAA6588_CMD_CLOSE, &cmd); 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 v4l2_fh_del(&fh->fh); 1471 v4l2_fh_del(&fh->fh);
1490 v4l2_fh_exit(&fh->fh); 1472 v4l2_fh_exit(&fh->fh);
1491 file->private_data = NULL; 1473 file->private_data = NULL;
@@ -1560,7 +1542,7 @@ static int saa7134_g_fmt_vid_cap(struct file *file, void *priv,
1560 1542
1561 f->fmt.pix.width = dev->width; 1543 f->fmt.pix.width = dev->width;
1562 f->fmt.pix.height = dev->height; 1544 f->fmt.pix.height = dev->height;
1563 f->fmt.pix.field = fh->cap.field; 1545 f->fmt.pix.field = dev->cap.field;
1564 f->fmt.pix.pixelformat = dev->fmt->fourcc; 1546 f->fmt.pix.pixelformat = dev->fmt->fourcc;
1565 f->fmt.pix.bytesperline = 1547 f->fmt.pix.bytesperline =
1566 (f->fmt.pix.width * dev->fmt->depth) >> 3; 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,
1686 dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat); 1668 dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1687 dev->width = f->fmt.pix.width; 1669 dev->width = f->fmt.pix.width;
1688 dev->height = f->fmt.pix.height; 1670 dev->height = f->fmt.pix.height;
1689 fh->cap.field = f->fmt.pix.field; 1671 dev->cap.field = f->fmt.pix.field;
1690 return 0; 1672 return 0;
1691} 1673}
1692 1674
@@ -2489,9 +2471,31 @@ int saa7134_video_init1(struct saa7134_dev *dev)
2489 if (saa7134_boards[dev->board].video_out) 2471 if (saa7134_boards[dev->board].video_out)
2490 saa7134_videoport_init(dev); 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 return 0; 2489 return 0;
2493} 2490}
2494 2491
2492void 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
2495int saa7134_videoport_init(struct saa7134_dev *dev) 2499int saa7134_videoport_init(struct saa7134_dev *dev)
2496{ 2500{
2497 /* enable video output */ 2501 /* enable video output */