diff options
author | Steve French <sfrench@us.ibm.com> | 2005-12-05 14:15:30 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2005-12-05 14:15:30 -0500 |
commit | c89a86bb96307019867d11874ef0b86adaa0598e (patch) | |
tree | c44c1a825e8a143a4c52bcb8692292aeb77fa64e /drivers/media/video/bttv-driver.c | |
parent | 07475ffba5800c53573180dd521273642adcd0e9 (diff) | |
parent | e4f5c82a92c2a546a16af1614114eec19120e40a (diff) |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'drivers/media/video/bttv-driver.c')
-rw-r--r-- | drivers/media/video/bttv-driver.c | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c index 709099f03bd2..3c58a2a68906 100644 --- a/drivers/media/video/bttv-driver.c +++ b/drivers/media/video/bttv-driver.c | |||
@@ -1720,7 +1720,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) | |||
1720 | memset(i,0,sizeof(*i)); | 1720 | memset(i,0,sizeof(*i)); |
1721 | i->index = n; | 1721 | i->index = n; |
1722 | i->type = V4L2_INPUT_TYPE_CAMERA; | 1722 | i->type = V4L2_INPUT_TYPE_CAMERA; |
1723 | i->audioset = 1; | 1723 | i->audioset = 0; |
1724 | if (i->index == bttv_tvcards[btv->c.type].tuner) { | 1724 | if (i->index == bttv_tvcards[btv->c.type].tuner) { |
1725 | sprintf(i->name, "Television"); | 1725 | sprintf(i->name, "Television"); |
1726 | i->type = V4L2_INPUT_TYPE_TUNER; | 1726 | i->type = V4L2_INPUT_TYPE_TUNER; |
@@ -1771,12 +1771,20 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) | |||
1771 | memset(t,0,sizeof(*t)); | 1771 | memset(t,0,sizeof(*t)); |
1772 | strcpy(t->name, "Television"); | 1772 | strcpy(t->name, "Television"); |
1773 | t->type = V4L2_TUNER_ANALOG_TV; | 1773 | t->type = V4L2_TUNER_ANALOG_TV; |
1774 | t->rangehigh = 0xffffffffUL; | ||
1775 | t->capability = V4L2_TUNER_CAP_NORM; | 1774 | t->capability = V4L2_TUNER_CAP_NORM; |
1776 | t->rxsubchans = V4L2_TUNER_SUB_MONO; | 1775 | t->rxsubchans = V4L2_TUNER_SUB_MONO; |
1777 | if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) | 1776 | if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) |
1778 | t->signal = 0xffff; | 1777 | t->signal = 0xffff; |
1779 | { | 1778 | { |
1779 | struct video_tuner tuner; | ||
1780 | |||
1781 | memset(&tuner, 0, sizeof (tuner)); | ||
1782 | tuner.rangehigh = 0xffffffffUL; | ||
1783 | bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner); | ||
1784 | t->rangelow = tuner.rangelow; | ||
1785 | t->rangehigh = tuner.rangehigh; | ||
1786 | } | ||
1787 | { | ||
1780 | /* Hmmm ... */ | 1788 | /* Hmmm ... */ |
1781 | struct video_audio va; | 1789 | struct video_audio va; |
1782 | memset(&va, 0, sizeof(struct video_audio)); | 1790 | memset(&va, 0, sizeof(struct video_audio)); |
@@ -1853,7 +1861,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) | |||
1853 | } | 1861 | } |
1854 | case VIDIOC_LOG_STATUS: | 1862 | case VIDIOC_LOG_STATUS: |
1855 | { | 1863 | { |
1856 | bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, 0); | 1864 | bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL); |
1857 | return 0; | 1865 | return 0; |
1858 | } | 1866 | } |
1859 | 1867 | ||
@@ -2029,19 +2037,33 @@ static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type) | |||
2029 | return 0; | 2037 | return 0; |
2030 | } | 2038 | } |
2031 | 2039 | ||
2040 | static void | ||
2041 | pix_format_set_size (struct v4l2_pix_format * f, | ||
2042 | const struct bttv_format * fmt, | ||
2043 | unsigned int width, | ||
2044 | unsigned int height) | ||
2045 | { | ||
2046 | f->width = width; | ||
2047 | f->height = height; | ||
2048 | |||
2049 | if (fmt->flags & FORMAT_FLAGS_PLANAR) { | ||
2050 | f->bytesperline = width; /* Y plane */ | ||
2051 | f->sizeimage = (width * height * fmt->depth) >> 3; | ||
2052 | } else { | ||
2053 | f->bytesperline = (width * fmt->depth) >> 3; | ||
2054 | f->sizeimage = height * f->bytesperline; | ||
2055 | } | ||
2056 | } | ||
2057 | |||
2032 | static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f) | 2058 | static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f) |
2033 | { | 2059 | { |
2034 | switch (f->type) { | 2060 | switch (f->type) { |
2035 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 2061 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
2036 | memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format)); | 2062 | memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format)); |
2037 | f->fmt.pix.width = fh->width; | 2063 | pix_format_set_size (&f->fmt.pix, fh->fmt, |
2038 | f->fmt.pix.height = fh->height; | 2064 | fh->width, fh->height); |
2039 | f->fmt.pix.field = fh->cap.field; | 2065 | f->fmt.pix.field = fh->cap.field; |
2040 | f->fmt.pix.pixelformat = fh->fmt->fourcc; | 2066 | f->fmt.pix.pixelformat = fh->fmt->fourcc; |
2041 | f->fmt.pix.bytesperline = | ||
2042 | (f->fmt.pix.width * fh->fmt->depth) >> 3; | ||
2043 | f->fmt.pix.sizeimage = | ||
2044 | f->fmt.pix.height * f->fmt.pix.bytesperline; | ||
2045 | return 0; | 2067 | return 0; |
2046 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 2068 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: |
2047 | memset(&f->fmt.win,0,sizeof(struct v4l2_window)); | 2069 | memset(&f->fmt.win,0,sizeof(struct v4l2_window)); |
@@ -2106,11 +2128,9 @@ static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv, | |||
2106 | f->fmt.pix.width = maxw; | 2128 | f->fmt.pix.width = maxw; |
2107 | if (f->fmt.pix.height > maxh) | 2129 | if (f->fmt.pix.height > maxh) |
2108 | f->fmt.pix.height = maxh; | 2130 | f->fmt.pix.height = maxh; |
2109 | f->fmt.pix.width &= ~0x03; | 2131 | pix_format_set_size (&f->fmt.pix, fmt, |
2110 | f->fmt.pix.bytesperline = | 2132 | f->fmt.pix.width & ~3, |
2111 | (f->fmt.pix.width * fmt->depth) >> 3; | 2133 | f->fmt.pix.height); |
2112 | f->fmt.pix.sizeimage = | ||
2113 | f->fmt.pix.height * f->fmt.pix.bytesperline; | ||
2114 | 2134 | ||
2115 | return 0; | 2135 | return 0; |
2116 | } | 2136 | } |
@@ -2278,6 +2298,15 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, | |||
2278 | retval = -EINVAL; | 2298 | retval = -EINVAL; |
2279 | goto fh_unlock_and_return; | 2299 | goto fh_unlock_and_return; |
2280 | } | 2300 | } |
2301 | if (fmt->flags & FORMAT_FLAGS_RAW) { | ||
2302 | /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL * | ||
2303 | RAW_LINES * 2. F1 is stored at offset 0, F2 | ||
2304 | at buffer size / 2. */ | ||
2305 | fh->width = RAW_BPL; | ||
2306 | fh->height = gbufsize / RAW_BPL; | ||
2307 | btv->init.width = RAW_BPL; | ||
2308 | btv->init.height = gbufsize / RAW_BPL; | ||
2309 | } | ||
2281 | fh->ovfmt = fmt; | 2310 | fh->ovfmt = fmt; |
2282 | fh->fmt = fmt; | 2311 | fh->fmt = fmt; |
2283 | btv->init.ovfmt = fmt; | 2312 | btv->init.ovfmt = fmt; |
@@ -2589,9 +2618,11 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, | |||
2589 | 2618 | ||
2590 | if (0 == v4l2) | 2619 | if (0 == v4l2) |
2591 | return -EINVAL; | 2620 | return -EINVAL; |
2592 | strcpy(cap->driver,"bttv"); | 2621 | memset(cap, 0, sizeof (*cap)); |
2593 | strlcpy(cap->card,btv->video_dev->name,sizeof(cap->card)); | 2622 | strlcpy(cap->driver, "bttv", sizeof (cap->driver)); |
2594 | sprintf(cap->bus_info,"PCI:%s",pci_name(btv->c.pci)); | 2623 | strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card)); |
2624 | snprintf(cap->bus_info, sizeof (cap->bus_info), | ||
2625 | "PCI:%s", pci_name(btv->c.pci)); | ||
2595 | cap->version = BTTV_VERSION_CODE; | 2626 | cap->version = BTTV_VERSION_CODE; |
2596 | cap->capabilities = | 2627 | cap->capabilities = |
2597 | V4L2_CAP_VIDEO_CAPTURE | | 2628 | V4L2_CAP_VIDEO_CAPTURE | |
@@ -2952,6 +2983,8 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait) | |||
2952 | fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR; | 2983 | fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR; |
2953 | field = videobuf_next_field(&fh->cap); | 2984 | field = videobuf_next_field(&fh->cap); |
2954 | if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) { | 2985 | if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) { |
2986 | kfree (fh->cap.read_buf); | ||
2987 | fh->cap.read_buf = NULL; | ||
2955 | up(&fh->cap.lock); | 2988 | up(&fh->cap.lock); |
2956 | return POLLERR; | 2989 | return POLLERR; |
2957 | } | 2990 | } |