diff options
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-video.c')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-video.c | 388 |
1 files changed, 216 insertions, 172 deletions
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index 76b841dd7ec0..043e1396857a 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -38,7 +38,7 @@ | |||
38 | 38 | ||
39 | /* ------------------------------------------------------------------ */ | 39 | /* ------------------------------------------------------------------ */ |
40 | 40 | ||
41 | static unsigned int video_debug = 0; | 41 | unsigned int video_debug; |
42 | static unsigned int gbuffers = 8; | 42 | static unsigned int gbuffers = 8; |
43 | static unsigned int noninterlaced = 0; | 43 | static unsigned int noninterlaced = 0; |
44 | static unsigned int gbufsize = 720*576*4; | 44 | static unsigned int gbufsize = 720*576*4; |
@@ -54,7 +54,7 @@ module_param_string(secam, secam, sizeof(secam), 0644); | |||
54 | MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc"); | 54 | MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc"); |
55 | 55 | ||
56 | 56 | ||
57 | #define dprintk(fmt, arg...) if (video_debug) \ | 57 | #define dprintk(fmt, arg...) if (video_debug&0x04) \ |
58 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 58 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
59 | 59 | ||
60 | /* ------------------------------------------------------------------ */ | 60 | /* ------------------------------------------------------------------ */ |
@@ -217,6 +217,12 @@ static struct saa7134_format formats[] = { | |||
217 | .vbi_v_start_1 = 273, \ | 217 | .vbi_v_start_1 = 273, \ |
218 | .src_timing = 7 | 218 | .src_timing = 7 |
219 | 219 | ||
220 | #define SAA7134_NORMS \ | ||
221 | V4L2_STD_PAL | V4L2_STD_PAL_N | \ | ||
222 | V4L2_STD_PAL_Nc | V4L2_STD_SECAM | \ | ||
223 | V4L2_STD_NTSC | V4L2_STD_PAL_M | \ | ||
224 | V4L2_STD_PAL_60 | ||
225 | |||
220 | static struct saa7134_tvnorm tvnorms[] = { | 226 | static struct saa7134_tvnorm tvnorms[] = { |
221 | { | 227 | { |
222 | .name = "PAL", /* autodetect */ | 228 | .name = "PAL", /* autodetect */ |
@@ -542,7 +548,6 @@ void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits) | |||
542 | 548 | ||
543 | static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm) | 549 | static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm) |
544 | { | 550 | { |
545 | |||
546 | dprintk("set tv norm = %s\n",norm->name); | 551 | dprintk("set tv norm = %s\n",norm->name); |
547 | dev->tvnorm = norm; | 552 | dev->tvnorm = norm; |
548 | 553 | ||
@@ -561,7 +566,6 @@ static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm) | |||
561 | dev->crop_current = dev->crop_defrect; | 566 | dev->crop_current = dev->crop_defrect; |
562 | 567 | ||
563 | saa7134_set_tvnorm_hw(dev); | 568 | saa7134_set_tvnorm_hw(dev); |
564 | |||
565 | } | 569 | } |
566 | 570 | ||
567 | static void video_mux(struct saa7134_dev *dev, int input) | 571 | static void video_mux(struct saa7134_dev *dev, int input) |
@@ -1177,11 +1181,18 @@ static int vidioc_s_ctrl(struct file *file, void *f, | |||
1177 | struct saa7134_dev *dev = fh->dev; | 1181 | struct saa7134_dev *dev = fh->dev; |
1178 | unsigned long flags; | 1182 | unsigned long flags; |
1179 | int restart_overlay = 0; | 1183 | int restart_overlay = 0; |
1184 | int err = -EINVAL; | ||
1185 | |||
1186 | err = v4l2_prio_check(&dev->prio, &fh->prio); | ||
1187 | if (0 != err) | ||
1188 | return err; | ||
1180 | 1189 | ||
1181 | mutex_lock(&dev->lock); | 1190 | mutex_lock(&dev->lock); |
1191 | |||
1182 | ctrl = ctrl_by_id(c->id); | 1192 | ctrl = ctrl_by_id(c->id); |
1183 | if (NULL == ctrl) | 1193 | if (NULL == ctrl) |
1184 | return -EINVAL; | 1194 | goto error; |
1195 | |||
1185 | dprintk("set_control name=%s val=%d\n",ctrl->name,c->value); | 1196 | dprintk("set_control name=%s val=%d\n",ctrl->name,c->value); |
1186 | switch (ctrl->type) { | 1197 | switch (ctrl->type) { |
1187 | case V4L2_CTRL_TYPE_BOOLEAN: | 1198 | case V4L2_CTRL_TYPE_BOOLEAN: |
@@ -1261,8 +1272,7 @@ static int vidioc_s_ctrl(struct file *file, void *f, | |||
1261 | break; | 1272 | break; |
1262 | } | 1273 | } |
1263 | default: | 1274 | default: |
1264 | mutex_unlock(&dev->lock); | 1275 | goto error; |
1265 | return -EINVAL; | ||
1266 | } | 1276 | } |
1267 | if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) { | 1277 | if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) { |
1268 | spin_lock_irqsave(&dev->slock,flags); | 1278 | spin_lock_irqsave(&dev->slock,flags); |
@@ -1270,8 +1280,11 @@ static int vidioc_s_ctrl(struct file *file, void *f, | |||
1270 | start_preview(dev,fh); | 1280 | start_preview(dev,fh); |
1271 | spin_unlock_irqrestore(&dev->slock,flags); | 1281 | spin_unlock_irqrestore(&dev->slock,flags); |
1272 | } | 1282 | } |
1283 | err = 0; | ||
1284 | |||
1285 | error: | ||
1273 | mutex_unlock(&dev->lock); | 1286 | mutex_unlock(&dev->lock); |
1274 | return 0; | 1287 | return err; |
1275 | } | 1288 | } |
1276 | 1289 | ||
1277 | /* ------------------------------------------------------------------ */ | 1290 | /* ------------------------------------------------------------------ */ |
@@ -1494,8 +1507,11 @@ static int video_mmap(struct file *file, struct vm_area_struct * vma) | |||
1494 | 1507 | ||
1495 | /* ------------------------------------------------------------------ */ | 1508 | /* ------------------------------------------------------------------ */ |
1496 | 1509 | ||
1497 | static void saa7134_vbi_fmt(struct saa7134_dev *dev, struct v4l2_format *f) | 1510 | static int vidioc_try_get_set_fmt_vbi(struct file *file, void *priv, |
1511 | struct v4l2_format *f) | ||
1498 | { | 1512 | { |
1513 | struct saa7134_fh *fh = priv; | ||
1514 | struct saa7134_dev *dev = fh->dev; | ||
1499 | struct saa7134_tvnorm *norm = dev->tvnorm; | 1515 | struct saa7134_tvnorm *norm = dev->tvnorm; |
1500 | 1516 | ||
1501 | f->fmt.vbi.sampling_rate = 6750000 * 4; | 1517 | f->fmt.vbi.sampling_rate = 6750000 * 4; |
@@ -1508,39 +1524,37 @@ static void saa7134_vbi_fmt(struct saa7134_dev *dev, struct v4l2_format *f) | |||
1508 | f->fmt.vbi.count[1] = f->fmt.vbi.count[0]; | 1524 | f->fmt.vbi.count[1] = f->fmt.vbi.count[0]; |
1509 | f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */ | 1525 | f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */ |
1510 | 1526 | ||
1527 | return 0; | ||
1511 | } | 1528 | } |
1512 | 1529 | ||
1513 | static int vidioc_g_fmt_cap(struct file *file, void *priv, | 1530 | static int vidioc_g_fmt_cap(struct file *file, void *priv, |
1514 | struct v4l2_format *f) | 1531 | struct v4l2_format *f) |
1515 | { | 1532 | { |
1516 | struct saa7134_fh *fh = priv; | 1533 | struct saa7134_fh *fh = priv; |
1517 | struct saa7134_dev *dev = fh->dev; | ||
1518 | 1534 | ||
1519 | switch (f->type) { | 1535 | f->fmt.pix.width = fh->width; |
1520 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 1536 | f->fmt.pix.height = fh->height; |
1521 | memset(&f->fmt.pix,0,sizeof(f->fmt.pix)); | 1537 | f->fmt.pix.field = fh->cap.field; |
1522 | f->fmt.pix.width = fh->width; | 1538 | f->fmt.pix.pixelformat = fh->fmt->fourcc; |
1523 | f->fmt.pix.height = fh->height; | 1539 | f->fmt.pix.bytesperline = |
1524 | f->fmt.pix.field = fh->cap.field; | 1540 | (f->fmt.pix.width * fh->fmt->depth) >> 3; |
1525 | f->fmt.pix.pixelformat = fh->fmt->fourcc; | 1541 | f->fmt.pix.sizeimage = |
1526 | f->fmt.pix.bytesperline = | 1542 | f->fmt.pix.height * f->fmt.pix.bytesperline; |
1527 | (f->fmt.pix.width * fh->fmt->depth) >> 3; | 1543 | return 0; |
1528 | f->fmt.pix.sizeimage = | 1544 | } |
1529 | f->fmt.pix.height * f->fmt.pix.bytesperline; | 1545 | |
1530 | return 0; | 1546 | static int vidioc_g_fmt_overlay(struct file *file, void *priv, |
1531 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 1547 | struct v4l2_format *f) |
1532 | if (saa7134_no_overlay > 0) { | 1548 | { |
1533 | printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); | 1549 | struct saa7134_fh *fh = priv; |
1534 | return -EINVAL; | 1550 | |
1535 | } | 1551 | if (saa7134_no_overlay > 0) { |
1536 | f->fmt.win = fh->win; | 1552 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); |
1537 | return 0; | ||
1538 | case V4L2_BUF_TYPE_VBI_CAPTURE: | ||
1539 | saa7134_vbi_fmt(dev,f); | ||
1540 | return 0; | ||
1541 | default: | ||
1542 | return -EINVAL; | 1553 | return -EINVAL; |
1543 | } | 1554 | } |
1555 | f->fmt.win = fh->win; | ||
1556 | |||
1557 | return 0; | ||
1544 | } | 1558 | } |
1545 | 1559 | ||
1546 | static int vidioc_try_fmt_cap(struct file *file, void *priv, | 1560 | static int vidioc_try_fmt_cap(struct file *file, void *priv, |
@@ -1548,126 +1562,122 @@ static int vidioc_try_fmt_cap(struct file *file, void *priv, | |||
1548 | { | 1562 | { |
1549 | struct saa7134_fh *fh = priv; | 1563 | struct saa7134_fh *fh = priv; |
1550 | struct saa7134_dev *dev = fh->dev; | 1564 | struct saa7134_dev *dev = fh->dev; |
1551 | int err; | 1565 | struct saa7134_format *fmt; |
1566 | enum v4l2_field field; | ||
1567 | unsigned int maxw, maxh; | ||
1552 | 1568 | ||
1553 | switch (f->type) { | 1569 | fmt = format_by_fourcc(f->fmt.pix.pixelformat); |
1554 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 1570 | if (NULL == fmt) |
1555 | { | 1571 | return -EINVAL; |
1556 | struct saa7134_format *fmt; | ||
1557 | enum v4l2_field field; | ||
1558 | unsigned int maxw, maxh; | ||
1559 | 1572 | ||
1560 | fmt = format_by_fourcc(f->fmt.pix.pixelformat); | 1573 | field = f->fmt.pix.field; |
1561 | if (NULL == fmt) | 1574 | maxw = min(dev->crop_current.width*4, dev->crop_bounds.width); |
1562 | return -EINVAL; | 1575 | maxh = min(dev->crop_current.height*4, dev->crop_bounds.height); |
1563 | 1576 | ||
1564 | field = f->fmt.pix.field; | 1577 | if (V4L2_FIELD_ANY == field) { |
1565 | maxw = min(dev->crop_current.width*4, dev->crop_bounds.width); | 1578 | field = (f->fmt.pix.height > maxh/2) |
1566 | maxh = min(dev->crop_current.height*4, dev->crop_bounds.height); | 1579 | ? V4L2_FIELD_INTERLACED |
1580 | : V4L2_FIELD_BOTTOM; | ||
1581 | } | ||
1582 | switch (field) { | ||
1583 | case V4L2_FIELD_TOP: | ||
1584 | case V4L2_FIELD_BOTTOM: | ||
1585 | maxh = maxh / 2; | ||
1586 | break; | ||
1587 | case V4L2_FIELD_INTERLACED: | ||
1588 | break; | ||
1589 | default: | ||
1590 | return -EINVAL; | ||
1591 | } | ||
1567 | 1592 | ||
1568 | if (V4L2_FIELD_ANY == field) { | 1593 | f->fmt.pix.field = field; |
1569 | field = (f->fmt.pix.height > maxh/2) | 1594 | if (f->fmt.pix.width < 48) |
1570 | ? V4L2_FIELD_INTERLACED | 1595 | f->fmt.pix.width = 48; |
1571 | : V4L2_FIELD_BOTTOM; | 1596 | if (f->fmt.pix.height < 32) |
1572 | } | 1597 | f->fmt.pix.height = 32; |
1573 | switch (field) { | 1598 | if (f->fmt.pix.width > maxw) |
1574 | case V4L2_FIELD_TOP: | 1599 | f->fmt.pix.width = maxw; |
1575 | case V4L2_FIELD_BOTTOM: | 1600 | if (f->fmt.pix.height > maxh) |
1576 | maxh = maxh / 2; | 1601 | f->fmt.pix.height = maxh; |
1577 | break; | 1602 | f->fmt.pix.width &= ~0x03; |
1578 | case V4L2_FIELD_INTERLACED: | 1603 | f->fmt.pix.bytesperline = |
1579 | break; | 1604 | (f->fmt.pix.width * fmt->depth) >> 3; |
1580 | default: | 1605 | f->fmt.pix.sizeimage = |
1581 | return -EINVAL; | 1606 | f->fmt.pix.height * f->fmt.pix.bytesperline; |
1582 | } | ||
1583 | 1607 | ||
1584 | f->fmt.pix.field = field; | 1608 | return 0; |
1585 | if (f->fmt.pix.width < 48) | 1609 | } |
1586 | f->fmt.pix.width = 48; | ||
1587 | if (f->fmt.pix.height < 32) | ||
1588 | f->fmt.pix.height = 32; | ||
1589 | if (f->fmt.pix.width > maxw) | ||
1590 | f->fmt.pix.width = maxw; | ||
1591 | if (f->fmt.pix.height > maxh) | ||
1592 | f->fmt.pix.height = maxh; | ||
1593 | f->fmt.pix.width &= ~0x03; | ||
1594 | f->fmt.pix.bytesperline = | ||
1595 | (f->fmt.pix.width * fmt->depth) >> 3; | ||
1596 | f->fmt.pix.sizeimage = | ||
1597 | f->fmt.pix.height * f->fmt.pix.bytesperline; | ||
1598 | 1610 | ||
1599 | return 0; | 1611 | static int vidioc_try_fmt_overlay(struct file *file, void *priv, |
1600 | } | 1612 | struct v4l2_format *f) |
1601 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 1613 | { |
1602 | if (saa7134_no_overlay > 0) { | 1614 | struct saa7134_fh *fh = priv; |
1603 | printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); | 1615 | struct saa7134_dev *dev = fh->dev; |
1604 | return -EINVAL; | 1616 | |
1605 | } | 1617 | if (saa7134_no_overlay > 0) { |
1606 | err = verify_preview(dev,&f->fmt.win); | 1618 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); |
1607 | if (0 != err) | ||
1608 | return err; | ||
1609 | return 0; | ||
1610 | case V4L2_BUF_TYPE_VBI_CAPTURE: | ||
1611 | saa7134_vbi_fmt(dev,f); | ||
1612 | return 0; | ||
1613 | default: | ||
1614 | return -EINVAL; | 1619 | return -EINVAL; |
1615 | } | 1620 | } |
1621 | |||
1622 | return verify_preview(dev, &f->fmt.win); | ||
1616 | } | 1623 | } |
1617 | 1624 | ||
1618 | static int vidioc_s_fmt_cap(struct file *file, void *priv, | 1625 | static int vidioc_s_fmt_cap(struct file *file, void *priv, |
1619 | struct v4l2_format *f) | 1626 | struct v4l2_format *f) |
1620 | { | 1627 | { |
1621 | struct saa7134_fh *fh = priv; | 1628 | struct saa7134_fh *fh = priv; |
1629 | int err; | ||
1630 | |||
1631 | err = vidioc_try_fmt_cap(file, priv, f); | ||
1632 | if (0 != err) | ||
1633 | return err; | ||
1634 | |||
1635 | fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); | ||
1636 | fh->width = f->fmt.pix.width; | ||
1637 | fh->height = f->fmt.pix.height; | ||
1638 | fh->cap.field = f->fmt.pix.field; | ||
1639 | return 0; | ||
1640 | } | ||
1641 | |||
1642 | static int vidioc_s_fmt_overlay(struct file *file, void *priv, | ||
1643 | struct v4l2_format *f) | ||
1644 | { | ||
1645 | struct saa7134_fh *fh = priv; | ||
1622 | struct saa7134_dev *dev = fh->dev; | 1646 | struct saa7134_dev *dev = fh->dev; |
1623 | unsigned long flags; | ||
1624 | int err; | 1647 | int err; |
1648 | unsigned int flags; | ||
1625 | 1649 | ||
1626 | switch (f->type) { | 1650 | if (saa7134_no_overlay > 0) { |
1627 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 1651 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); |
1628 | err = vidioc_try_fmt_cap(file, priv, f); | 1652 | return -EINVAL; |
1629 | if (0 != err) | 1653 | } |
1630 | return err; | 1654 | err = verify_preview(dev, &f->fmt.win); |
1631 | 1655 | if (0 != err) | |
1632 | fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); | 1656 | return err; |
1633 | fh->width = f->fmt.pix.width; | ||
1634 | fh->height = f->fmt.pix.height; | ||
1635 | fh->cap.field = f->fmt.pix.field; | ||
1636 | return 0; | ||
1637 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | ||
1638 | if (saa7134_no_overlay > 0) { | ||
1639 | printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); | ||
1640 | return -EINVAL; | ||
1641 | } | ||
1642 | err = verify_preview(dev,&f->fmt.win); | ||
1643 | if (0 != err) | ||
1644 | return err; | ||
1645 | |||
1646 | mutex_lock(&dev->lock); | ||
1647 | fh->win = f->fmt.win; | ||
1648 | fh->nclips = f->fmt.win.clipcount; | ||
1649 | if (fh->nclips > 8) | ||
1650 | fh->nclips = 8; | ||
1651 | if (copy_from_user(fh->clips,f->fmt.win.clips, | ||
1652 | sizeof(struct v4l2_clip)*fh->nclips)) { | ||
1653 | mutex_unlock(&dev->lock); | ||
1654 | return -EFAULT; | ||
1655 | } | ||
1656 | 1657 | ||
1657 | if (res_check(fh, RESOURCE_OVERLAY)) { | 1658 | mutex_lock(&dev->lock); |
1658 | spin_lock_irqsave(&dev->slock,flags); | 1659 | |
1659 | stop_preview(dev,fh); | 1660 | fh->win = f->fmt.win; |
1660 | start_preview(dev,fh); | 1661 | fh->nclips = f->fmt.win.clipcount; |
1661 | spin_unlock_irqrestore(&dev->slock,flags); | 1662 | |
1662 | } | 1663 | if (fh->nclips > 8) |
1664 | fh->nclips = 8; | ||
1665 | |||
1666 | if (copy_from_user(fh->clips, f->fmt.win.clips, | ||
1667 | sizeof(struct v4l2_clip)*fh->nclips)) { | ||
1663 | mutex_unlock(&dev->lock); | 1668 | mutex_unlock(&dev->lock); |
1664 | return 0; | 1669 | return -EFAULT; |
1665 | case V4L2_BUF_TYPE_VBI_CAPTURE: | ||
1666 | saa7134_vbi_fmt(dev,f); | ||
1667 | return 0; | ||
1668 | default: | ||
1669 | return -EINVAL; | ||
1670 | } | 1670 | } |
1671 | |||
1672 | if (res_check(fh, RESOURCE_OVERLAY)) { | ||
1673 | spin_lock_irqsave(&dev->slock, flags); | ||
1674 | stop_preview(dev, fh); | ||
1675 | start_preview(dev, fh); | ||
1676 | spin_unlock_irqrestore(&dev->slock, flags); | ||
1677 | } | ||
1678 | |||
1679 | mutex_unlock(&dev->lock); | ||
1680 | return 0; | ||
1671 | } | 1681 | } |
1672 | 1682 | ||
1673 | static int vidioc_queryctrl(struct file *file, void *priv, | 1683 | static int vidioc_queryctrl(struct file *file, void *priv, |
@@ -1715,8 +1725,7 @@ static int vidioc_enum_input(struct file *file, void *priv, | |||
1715 | if (0 != (v2 & 0x0e)) | 1725 | if (0 != (v2 & 0x0e)) |
1716 | i->status |= V4L2_IN_ST_MACROVISION; | 1726 | i->status |= V4L2_IN_ST_MACROVISION; |
1717 | } | 1727 | } |
1718 | for (n = 0; n < TVNORMS; n++) | 1728 | i->std = SAA7134_NORMS; |
1719 | i->std |= tvnorms[n].id; | ||
1720 | return 0; | 1729 | return 0; |
1721 | } | 1730 | } |
1722 | 1731 | ||
@@ -1733,6 +1742,11 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i) | |||
1733 | { | 1742 | { |
1734 | struct saa7134_fh *fh = priv; | 1743 | struct saa7134_fh *fh = priv; |
1735 | struct saa7134_dev *dev = fh->dev; | 1744 | struct saa7134_dev *dev = fh->dev; |
1745 | int err; | ||
1746 | |||
1747 | err = v4l2_prio_check(&dev->prio, &fh->prio); | ||
1748 | if (0 != err) | ||
1749 | return err; | ||
1736 | 1750 | ||
1737 | if (i < 0 || i >= SAA7134_INPUT_MAX) | 1751 | if (i < 0 || i >= SAA7134_INPUT_MAX) |
1738 | return -EINVAL; | 1752 | return -EINVAL; |
@@ -1752,7 +1766,6 @@ static int vidioc_querycap(struct file *file, void *priv, | |||
1752 | 1766 | ||
1753 | unsigned int tuner_type = dev->tuner_type; | 1767 | unsigned int tuner_type = dev->tuner_type; |
1754 | 1768 | ||
1755 | memset(cap, 0, sizeof(*cap)); | ||
1756 | strcpy(cap->driver, "saa7134"); | 1769 | strcpy(cap->driver, "saa7134"); |
1757 | strlcpy(cap->card, saa7134_boards[dev->board].name, | 1770 | strlcpy(cap->card, saa7134_boards[dev->board].name, |
1758 | sizeof(cap->card)); | 1771 | sizeof(cap->card)); |
@@ -1779,16 +1792,23 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id) | |||
1779 | unsigned long flags; | 1792 | unsigned long flags; |
1780 | unsigned int i; | 1793 | unsigned int i; |
1781 | v4l2_std_id fixup; | 1794 | v4l2_std_id fixup; |
1795 | int err; | ||
1796 | |||
1797 | err = v4l2_prio_check(&dev->prio, &fh->prio); | ||
1798 | if (0 != err) | ||
1799 | return err; | ||
1782 | 1800 | ||
1783 | for (i = 0; i < TVNORMS; i++) | 1801 | for (i = 0; i < TVNORMS; i++) |
1784 | if (*id == tvnorms[i].id) | 1802 | if (*id == tvnorms[i].id) |
1785 | break; | 1803 | break; |
1804 | |||
1786 | if (i == TVNORMS) | 1805 | if (i == TVNORMS) |
1787 | for (i = 0; i < TVNORMS; i++) | 1806 | for (i = 0; i < TVNORMS; i++) |
1788 | if (*id & tvnorms[i].id) | 1807 | if (*id & tvnorms[i].id) |
1789 | break; | 1808 | break; |
1790 | if (i == TVNORMS) | 1809 | if (i == TVNORMS) |
1791 | return -EINVAL; | 1810 | return -EINVAL; |
1811 | |||
1792 | if ((*id & V4L2_STD_SECAM) && (secam[0] != '-')) { | 1812 | if ((*id & V4L2_STD_SECAM) && (secam[0] != '-')) { |
1793 | if (secam[0] == 'L' || secam[0] == 'l') { | 1813 | if (secam[0] == 'L' || secam[0] == 'l') { |
1794 | if (secam[1] == 'C' || secam[1] == 'c') | 1814 | if (secam[1] == 'C' || secam[1] == 'c') |
@@ -1805,6 +1825,9 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id) | |||
1805 | if (fixup == tvnorms[i].id) | 1825 | if (fixup == tvnorms[i].id) |
1806 | break; | 1826 | break; |
1807 | } | 1827 | } |
1828 | |||
1829 | *id = tvnorms[i].id; | ||
1830 | |||
1808 | mutex_lock(&dev->lock); | 1831 | mutex_lock(&dev->lock); |
1809 | if (res_check(fh, RESOURCE_OVERLAY)) { | 1832 | if (res_check(fh, RESOURCE_OVERLAY)) { |
1810 | spin_lock_irqsave(&dev->slock, flags); | 1833 | spin_lock_irqsave(&dev->slock, flags); |
@@ -1818,6 +1841,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id) | |||
1818 | spin_unlock_irqrestore(&dev->slock, flags); | 1841 | spin_unlock_irqrestore(&dev->slock, flags); |
1819 | } else | 1842 | } else |
1820 | set_tvnorm(dev, &tvnorms[i]); | 1843 | set_tvnorm(dev, &tvnorms[i]); |
1844 | |||
1821 | saa7134_tvaudio_do_scan(dev); | 1845 | saa7134_tvaudio_do_scan(dev); |
1822 | mutex_unlock(&dev->lock); | 1846 | mutex_unlock(&dev->lock); |
1823 | return 0; | 1847 | return 0; |
@@ -1930,7 +1954,11 @@ static int vidioc_s_tuner(struct file *file, void *priv, | |||
1930 | { | 1954 | { |
1931 | struct saa7134_fh *fh = priv; | 1955 | struct saa7134_fh *fh = priv; |
1932 | struct saa7134_dev *dev = fh->dev; | 1956 | struct saa7134_dev *dev = fh->dev; |
1933 | int rx, mode; | 1957 | int rx, mode, err; |
1958 | |||
1959 | err = v4l2_prio_check(&dev->prio, &fh->prio); | ||
1960 | if (0 != err) | ||
1961 | return err; | ||
1934 | 1962 | ||
1935 | mode = dev->thread.mode; | 1963 | mode = dev->thread.mode; |
1936 | if (UNSET == mode) { | 1964 | if (UNSET == mode) { |
@@ -1939,6 +1967,7 @@ static int vidioc_s_tuner(struct file *file, void *priv, | |||
1939 | } | 1967 | } |
1940 | if (mode != t->audmode) | 1968 | if (mode != t->audmode) |
1941 | dev->thread.mode = t->audmode; | 1969 | dev->thread.mode = t->audmode; |
1970 | |||
1942 | return 0; | 1971 | return 0; |
1943 | } | 1972 | } |
1944 | 1973 | ||
@@ -1948,9 +1977,9 @@ static int vidioc_g_frequency(struct file *file, void *priv, | |||
1948 | struct saa7134_fh *fh = priv; | 1977 | struct saa7134_fh *fh = priv; |
1949 | struct saa7134_dev *dev = fh->dev; | 1978 | struct saa7134_dev *dev = fh->dev; |
1950 | 1979 | ||
1951 | memset(f, 0, sizeof(*f)); | ||
1952 | f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; | 1980 | f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; |
1953 | f->frequency = dev->ctl_freq; | 1981 | f->frequency = dev->ctl_freq; |
1982 | |||
1954 | return 0; | 1983 | return 0; |
1955 | } | 1984 | } |
1956 | 1985 | ||
@@ -1959,6 +1988,11 @@ static int vidioc_s_frequency(struct file *file, void *priv, | |||
1959 | { | 1988 | { |
1960 | struct saa7134_fh *fh = priv; | 1989 | struct saa7134_fh *fh = priv; |
1961 | struct saa7134_dev *dev = fh->dev; | 1990 | struct saa7134_dev *dev = fh->dev; |
1991 | int err; | ||
1992 | |||
1993 | err = v4l2_prio_check(&dev->prio, &fh->prio); | ||
1994 | if (0 != err) | ||
1995 | return err; | ||
1962 | 1996 | ||
1963 | if (0 != f->tuner) | 1997 | if (0 != f->tuner) |
1964 | return -EINVAL; | 1998 | return -EINVAL; |
@@ -1978,7 +2012,6 @@ static int vidioc_s_frequency(struct file *file, void *priv, | |||
1978 | 2012 | ||
1979 | static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a) | 2013 | static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a) |
1980 | { | 2014 | { |
1981 | memset(a, 0, sizeof(*a)); | ||
1982 | strcpy(a->name, "audio"); | 2015 | strcpy(a->name, "audio"); |
1983 | return 0; | 2016 | return 0; |
1984 | } | 2017 | } |
@@ -2009,42 +2042,45 @@ static int vidioc_s_priority(struct file *file, void *f, | |||
2009 | static int vidioc_enum_fmt_cap(struct file *file, void *priv, | 2042 | static int vidioc_enum_fmt_cap(struct file *file, void *priv, |
2010 | struct v4l2_fmtdesc *f) | 2043 | struct v4l2_fmtdesc *f) |
2011 | { | 2044 | { |
2012 | enum v4l2_buf_type type; | 2045 | if (f->index >= FORMATS) |
2013 | unsigned int index; | 2046 | return -EINVAL; |
2014 | 2047 | ||
2015 | index = f->index; | 2048 | strlcpy(f->description, formats[f->index].name, |
2016 | type = f->type; | 2049 | sizeof(f->description)); |
2017 | switch (type) { | ||
2018 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | ||
2019 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | ||
2020 | if (saa7134_no_overlay > 0) | ||
2021 | return -EINVAL; | ||
2022 | 2050 | ||
2023 | if (index >= FORMATS) | 2051 | f->pixelformat = formats[f->index].fourcc; |
2024 | return -EINVAL; | ||
2025 | 2052 | ||
2026 | if (f->type == V4L2_BUF_TYPE_VIDEO_OVERLAY && | 2053 | return 0; |
2027 | formats[index].planar) | 2054 | } |
2028 | return -EINVAL; | 2055 | |
2029 | memset(f, 0, sizeof(*f)); | 2056 | static int vidioc_enum_fmt_overlay(struct file *file, void *priv, |
2030 | f->index = index; | 2057 | struct v4l2_fmtdesc *f) |
2031 | f->type = type; | 2058 | { |
2032 | strlcpy(f->description, formats[index].name, | 2059 | if (saa7134_no_overlay > 0) { |
2033 | sizeof(f->description)); | 2060 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); |
2034 | f->pixelformat = formats[index].fourcc; | ||
2035 | break; | ||
2036 | case V4L2_BUF_TYPE_VBI_CAPTURE: | ||
2037 | if (0 != index) | ||
2038 | return -EINVAL; | ||
2039 | memset(f, 0, sizeof(*f)); | ||
2040 | f->index = index; | ||
2041 | f->type = type; | ||
2042 | f->pixelformat = V4L2_PIX_FMT_GREY; | ||
2043 | strcpy(f->description, "vbi data"); | ||
2044 | break; | ||
2045 | default: | ||
2046 | return -EINVAL; | 2061 | return -EINVAL; |
2047 | } | 2062 | } |
2063 | |||
2064 | if ((f->index >= FORMATS) || formats[f->index].planar) | ||
2065 | return -EINVAL; | ||
2066 | |||
2067 | strlcpy(f->description, formats[f->index].name, | ||
2068 | sizeof(f->description)); | ||
2069 | |||
2070 | f->pixelformat = formats[f->index].fourcc; | ||
2071 | |||
2072 | return 0; | ||
2073 | } | ||
2074 | |||
2075 | static int vidioc_enum_fmt_vbi(struct file *file, void *priv, | ||
2076 | struct v4l2_fmtdesc *f) | ||
2077 | { | ||
2078 | if (0 != f->index) | ||
2079 | return -EINVAL; | ||
2080 | |||
2081 | f->pixelformat = V4L2_PIX_FMT_GREY; | ||
2082 | strcpy(f->description, "vbi data"); | ||
2083 | |||
2048 | return 0; | 2084 | return 0; |
2049 | } | 2085 | } |
2050 | 2086 | ||
@@ -2180,7 +2216,6 @@ static int vidioc_streamoff(struct file *file, void *priv, | |||
2180 | static int vidioc_g_parm(struct file *file, void *fh, | 2216 | static int vidioc_g_parm(struct file *file, void *fh, |
2181 | struct v4l2_streamparm *parm) | 2217 | struct v4l2_streamparm *parm) |
2182 | { | 2218 | { |
2183 | memset(parm, 0, sizeof(*parm)); | ||
2184 | return 0; | 2219 | return 0; |
2185 | } | 2220 | } |
2186 | 2221 | ||
@@ -2190,7 +2225,6 @@ static int radio_querycap(struct file *file, void *priv, | |||
2190 | struct saa7134_fh *fh = file->private_data; | 2225 | struct saa7134_fh *fh = file->private_data; |
2191 | struct saa7134_dev *dev = fh->dev; | 2226 | struct saa7134_dev *dev = fh->dev; |
2192 | 2227 | ||
2193 | memset(cap, 0, sizeof(*cap)); | ||
2194 | strcpy(cap->driver, "saa7134"); | 2228 | strcpy(cap->driver, "saa7134"); |
2195 | strlcpy(cap->card, saa7134_boards[dev->board].name, sizeof(cap->card)); | 2229 | strlcpy(cap->card, saa7134_boards[dev->board].name, sizeof(cap->card)); |
2196 | sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci)); | 2230 | sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci)); |
@@ -2329,6 +2363,14 @@ struct video_device saa7134_video_template = | |||
2329 | .vidioc_g_fmt_cap = vidioc_g_fmt_cap, | 2363 | .vidioc_g_fmt_cap = vidioc_g_fmt_cap, |
2330 | .vidioc_try_fmt_cap = vidioc_try_fmt_cap, | 2364 | .vidioc_try_fmt_cap = vidioc_try_fmt_cap, |
2331 | .vidioc_s_fmt_cap = vidioc_s_fmt_cap, | 2365 | .vidioc_s_fmt_cap = vidioc_s_fmt_cap, |
2366 | .vidioc_enum_fmt_overlay = vidioc_enum_fmt_overlay, | ||
2367 | .vidioc_g_fmt_overlay = vidioc_g_fmt_overlay, | ||
2368 | .vidioc_try_fmt_overlay = vidioc_try_fmt_overlay, | ||
2369 | .vidioc_s_fmt_overlay = vidioc_s_fmt_overlay, | ||
2370 | .vidioc_enum_fmt_vbi = vidioc_enum_fmt_vbi, | ||
2371 | .vidioc_g_fmt_vbi = vidioc_try_get_set_fmt_vbi, | ||
2372 | .vidioc_try_fmt_vbi = vidioc_try_get_set_fmt_vbi, | ||
2373 | .vidioc_s_fmt_vbi = vidioc_try_get_set_fmt_vbi, | ||
2332 | .vidioc_g_audio = vidioc_g_audio, | 2374 | .vidioc_g_audio = vidioc_g_audio, |
2333 | .vidioc_s_audio = vidioc_s_audio, | 2375 | .vidioc_s_audio = vidioc_s_audio, |
2334 | .vidioc_cropcap = vidioc_cropcap, | 2376 | .vidioc_cropcap = vidioc_cropcap, |
@@ -2360,6 +2402,8 @@ struct video_device saa7134_video_template = | |||
2360 | .vidioc_g_parm = vidioc_g_parm, | 2402 | .vidioc_g_parm = vidioc_g_parm, |
2361 | .vidioc_g_frequency = vidioc_g_frequency, | 2403 | .vidioc_g_frequency = vidioc_g_frequency, |
2362 | .vidioc_s_frequency = vidioc_s_frequency, | 2404 | .vidioc_s_frequency = vidioc_s_frequency, |
2405 | .tvnorms = SAA7134_NORMS, | ||
2406 | .current_norm = V4L2_STD_PAL, | ||
2363 | }; | 2407 | }; |
2364 | 2408 | ||
2365 | struct video_device saa7134_vbi_template = | 2409 | struct video_device saa7134_vbi_template = |