diff options
Diffstat (limited to 'linux/drivers/media/common/saa7146_video.c')
-rw-r--r-- | linux/drivers/media/common/saa7146_video.c | 156 |
1 files changed, 78 insertions, 78 deletions
diff --git a/linux/drivers/media/common/saa7146_video.c b/linux/drivers/media/common/saa7146_video.c index 5b37c8f4f..397b01d1c 100644 --- a/linux/drivers/media/common/saa7146_video.c +++ b/linux/drivers/media/common/saa7146_video.c @@ -14,64 +14,64 @@ MODULE_PARM_DESC(max_memory, "maximum memory usage for capture buffers (default: /* format descriptions for capture and preview */ static struct saa7146_format formats[] = { { - .name = "RGB-8 (3-3-2)", + .name = "RGB-8 (3-3-2)", .pixelformat = V4L2_PIX_FMT_RGB332, - .trans = RGB08_COMPOSED, + .trans = RGB08_COMPOSED, .depth = 8, .flags = 0, }, { - .name = "RGB-16 (5/B-6/G-5/R)", + .name = "RGB-16 (5/B-6/G-5/R)", .pixelformat = V4L2_PIX_FMT_RGB565, - .trans = RGB16_COMPOSED, + .trans = RGB16_COMPOSED, .depth = 16, .flags = 0, }, { - .name = "RGB-24 (B-G-R)", + .name = "RGB-24 (B-G-R)", .pixelformat = V4L2_PIX_FMT_BGR24, - .trans = RGB24_COMPOSED, + .trans = RGB24_COMPOSED, .depth = 24, .flags = 0, }, { - .name = "RGB-32 (B-G-R)", + .name = "RGB-32 (B-G-R)", .pixelformat = V4L2_PIX_FMT_BGR32, - .trans = RGB32_COMPOSED, + .trans = RGB32_COMPOSED, .depth = 32, .flags = 0, }, { - .name = "RGB-32 (R-G-B)", + .name = "RGB-32 (R-G-B)", .pixelformat = V4L2_PIX_FMT_RGB32, - .trans = RGB32_COMPOSED, + .trans = RGB32_COMPOSED, .depth = 32, .flags = 0, .swap = 0x2, }, { - .name = "Greyscale-8", + .name = "Greyscale-8", .pixelformat = V4L2_PIX_FMT_GREY, - .trans = Y8, + .trans = Y8, .depth = 8, .flags = 0, }, { - .name = "YUV 4:2:2 planar (Y-Cb-Cr)", + .name = "YUV 4:2:2 planar (Y-Cb-Cr)", .pixelformat = V4L2_PIX_FMT_YUV422P, - .trans = YUV422_DECOMPOSED, + .trans = YUV422_DECOMPOSED, .depth = 16, .flags = FORMAT_BYTE_SWAP|FORMAT_IS_PLANAR, }, { - .name = "YVU 4:2:0 planar (Y-Cb-Cr)", + .name = "YVU 4:2:0 planar (Y-Cb-Cr)", .pixelformat = V4L2_PIX_FMT_YVU420, - .trans = YUV420_DECOMPOSED, + .trans = YUV420_DECOMPOSED, .depth = 12, .flags = FORMAT_BYTE_SWAP|FORMAT_IS_PLANAR, }, { - .name = "YUV 4:2:0 planar (Y-Cb-Cr)", + .name = "YUV 4:2:0 planar (Y-Cb-Cr)", .pixelformat = V4L2_PIX_FMT_YUV420, - .trans = YUV420_DECOMPOSED, + .trans = YUV420_DECOMPOSED, .depth = 12, .flags = FORMAT_IS_PLANAR, }, { - .name = "YUV 4:2:2 (U-Y-V-Y)", + .name = "YUV 4:2:2 (U-Y-V-Y)", .pixelformat = V4L2_PIX_FMT_UYVY, - .trans = YUV422_COMPOSED, + .trans = YUV422_COMPOSED, .depth = 16, .flags = 0, } @@ -80,19 +80,19 @@ static struct saa7146_format formats[] = { /* unfortunately, the saa7146 contains a bug which prevents it from doing on-the-fly byte swaps. due to this, it's impossible to provide additional *packed* formats, which are simply byte swapped (like V4L2_PIX_FMT_YUYV) ... 8-( */ - + static int NUM_FORMATS = sizeof(formats)/sizeof(struct saa7146_format); struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc) { int i, j = NUM_FORMATS; - + for (i = 0; i < j; i++) { if (formats[i].pixelformat == fourcc) { return formats+i; } } - + DEB_D(("unknown pixelformat:'%4.4s'\n",(char *)&fourcc)); return NULL; } @@ -182,7 +182,7 @@ static int try_fmt(struct saa7146_fh *fh, struct v4l2_format *f) struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; int err; - + switch (f->type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: { @@ -190,7 +190,7 @@ static int try_fmt(struct saa7146_fh *fh, struct v4l2_format *f) enum v4l2_field field; int maxw, maxh; int calc_bpl; - + DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n",dev,fh)); fmt = format_by_fourcc(dev,f->fmt.pix.pixelformat); @@ -201,7 +201,7 @@ static int try_fmt(struct saa7146_fh *fh, struct v4l2_format *f) field = f->fmt.pix.field; maxw = vv->standard->h_max_out; maxh = vv->standard->v_max_out; - + if (V4L2_FIELD_ANY == field) { field = (f->fmt.pix.height > maxh/2) ? V4L2_FIELD_INTERLACED @@ -237,10 +237,10 @@ static int try_fmt(struct saa7146_fh *fh, struct v4l2_format *f) if (f->fmt.pix.bytesperline < calc_bpl) f->fmt.pix.bytesperline = calc_bpl; - + if (f->fmt.pix.bytesperline > (2*PAGE_SIZE * fmt->depth)/8) /* arbitrary constraint */ f->fmt.pix.bytesperline = calc_bpl; - + f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * f->fmt.pix.height; DEB_D(("w:%d, h:%d, bytesperline:%d, sizeimage:%d\n",f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.bytesperline,f->fmt.pix.sizeimage)); @@ -280,7 +280,7 @@ int saa7146_start_preview(struct saa7146_fh *fh) } /* check if overlay is running */ - if (IS_OVERLAY_ACTIVE(fh) != 0) { + if (IS_OVERLAY_ACTIVE(fh) != 0) { if (vv->video_fh == fh) { DEB_D(("overlay is already active.\n")); return 0; @@ -299,14 +299,14 @@ int saa7146_start_preview(struct saa7146_fh *fh) saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); return -EBUSY; } - + vv->ov_data = &fh->ov; DEB_D(("%dx%d+%d+%d %s field=%s\n", fh->ov.win.w.width,fh->ov.win.w.height, fh->ov.win.w.left,fh->ov.win.w.top, vv->ov_fmt->name,v4l2_field_names[fh->ov.win.field])); - + if (0 != (ret = saa7146_enable_overlay(fh))) { DEB_D(("enabling overlay failed: %d\n",ret)); saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); @@ -331,9 +331,9 @@ int saa7146_stop_preview(struct saa7146_fh *fh) DEB_D(("streaming capture is active.\n")); return -EBUSY; } - + /* check if overlay is running at all */ - if ((vv->video_status & STATUS_OVERLAY) == 0) { + if ((vv->video_status & STATUS_OVERLAY) == 0) { DEB_D(("no active overlay.\n")); return 0; } @@ -359,7 +359,7 @@ static int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f) struct saa7146_vv *vv = dev->vv_data; int err; - + switch (f->type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n",dev,fh)); @@ -387,7 +387,7 @@ static int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f) up(&dev->lock); return -EFAULT; } - + /* fh->ov.fh is used to indicate that we have valid overlay informations, too */ fh->ov.fh = fh; @@ -454,7 +454,7 @@ static int NUM_CONTROLS = sizeof(controls)/sizeof(struct v4l2_queryctrl); static struct v4l2_queryctrl* ctrl_by_id(int id) { int i; - + for (i = 0; i < NUM_CONTROLS; i++) if (controls[i].id == id) return controls+i; @@ -515,7 +515,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) DEB_D(("unknown control %d\n",c->id)); return -EINVAL; } - + down(&dev->lock); switch (ctrl->type) { @@ -578,7 +578,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) } } up(&dev->lock); - + if (IS_OVERLAY_ACTIVE(fh) != 0) { saa7146_stop_preview(fh); saa7146_start_preview(fh); @@ -633,7 +633,7 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu return -1; } } - + ptr1 = pt1->cpu; ptr2 = pt2->cpu; ptr3 = pt3->cpu; @@ -649,14 +649,14 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu for(j=0;j<40;j++) { printk("ptr1 %d: 0x%08x\n",j,ptr1[j]); } -*/ +*/ /* if we have a user buffer, the first page may not be aligned to a page boundary. */ pt1->offset = buf->vb.dma.sglist->offset; pt2->offset = pt1->offset+o1; pt3->offset = pt1->offset+o2; - + /* create video-dma2 page table */ ptr1 = pt1->cpu; for(i = m1; i <= m2 ; i++, ptr2++) { @@ -675,7 +675,7 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu for(;i<1024;i++,ptr3++) { *ptr3 = fill; } - /* finally: finish up video-dma1 page table */ + /* finally: finish up video-dma1 page table */ ptr1 = pt1->cpu+m1; fill = pt1->cpu[m1]; for(i=m1;i<1024;i++,ptr1++) { @@ -694,7 +694,7 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu for(j=0;j<40;j++) { printk("ptr3 %d: 0x%08x\n",j,ptr3[j]); } -*/ +*/ } else { struct saa7146_pgtable *pt = &buf->pt[0]; return saa7146_pgtable_build_single(pci, pt, list, length); @@ -725,7 +725,7 @@ static int video_begin(struct saa7146_fh *fh) DEB_S(("already capturing in another open.\n")); return -EBUSY; } - + if ((vv->video_status & STATUS_OVERLAY) != 0) { DEB_S(("warning: suspending overlay video for streaming capture.\n")); vv->ov_suspend = vv->video_fh; @@ -735,7 +735,7 @@ static int video_begin(struct saa7146_fh *fh) return err; } } - + fmt = format_by_fourcc(dev,fh->video_fmt.pixelformat); /* we need to have a valid format set here */ BUG_ON(NULL == fmt); @@ -755,7 +755,7 @@ static int video_begin(struct saa7146_fh *fh) } return -EBUSY; } - + /* clear out beginning of streaming bit (rps register 0)*/ saa7146_write(dev, MC2, MASK_27 ); @@ -821,7 +821,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file) saa7146_start_preview(vv->ov_suspend); vv->ov_suspend = NULL; } - + return 0; } @@ -847,7 +847,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int if( cmd == dev->ext_vv_data->ioctls[ee].cmd ) break; } - + if( 0 != (dev->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) { DEB_D(("extension handles ioctl exclusive.\n")); result = dev->ext_vv_data->ioctl(fh, cmd, arg); @@ -860,7 +860,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int return result; } } - + /* fixme: add handle "after" case (is it still needed?) */ switch (fh->type) { @@ -880,13 +880,13 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int } switch (cmd) { - case VIDIOC_QUERYCAP: + case VIDIOC_QUERYCAP: { struct v4l2_capability *cap = arg; memset(cap,0,sizeof(*cap)); DEB_EE(("VIDIOC_QUERYCAP\n")); - + strcpy(cap->driver, "saa7146 v4l2"); strlcpy(cap->card, dev->ext->name, sizeof(cap->card)); sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name); @@ -894,7 +894,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY | - V4L2_CAP_READWRITE | + V4L2_CAP_READWRITE | V4L2_CAP_STREAMING; cap->capabilities |= dev->ext_vv_data->capabilities; return 0; @@ -915,7 +915,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int struct saa7146_format *fmt; DEB_EE(("VIDIOC_S_FBUF\n")); - + if(!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO)) return -EPERM; @@ -925,14 +925,14 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int if (NULL == fmt) { return -EINVAL; } - + /* planar formats are not allowed for overlay video, clipping and video dma would clash */ if (0 != (fmt->flags & FORMAT_IS_PLANAR)) { DEB_S(("planar pixelformat '%4.4s' not allowed for overlay\n",(char *)&fmt->pixelformat)); } /* check if overlay is running */ - if (IS_OVERLAY_ACTIVE(fh) != 0) { + if (IS_OVERLAY_ACTIVE(fh) != 0) { if (vv->video_fh != fh) { DEB_D(("refusing to change framebuffer informations while overlay is active in another open.\n")); return -EBUSY; @@ -971,7 +971,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int break; } default: - return -EINVAL; + return -EINVAL; } DEB_EE(("VIDIOC_ENUM_FMT: type:%d, index:%d\n",f->type,f->index)); @@ -987,12 +987,12 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int (c->id < V4L2_CID_PRIVATE_BASE || c->id >= V4L2_CID_PRIVATE_LASTP1)) return -EINVAL; - + ctrl = ctrl_by_id(c->id); if( NULL == ctrl ) { return -EINVAL; /* - c->flags = V4L2_CTRL_FLAG_DISABLED; + c->flags = V4L2_CTRL_FLAG_DISABLED; return 0; */ } @@ -1073,7 +1073,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int v4l2_std_id *id = arg; int found = 0; int i, err; - + DEB_EE(("VIDIOC_S_STD\n")); if ((vv->video_status & STATUS_CAPTURE) == STATUS_CAPTURE) { @@ -1091,7 +1091,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int } down(&dev->lock); - + for(i = 0; i < dev->ext_vv_data->num_stds; i++) if (*id & dev->ext_vv_data->stds[i].id) break; @@ -1173,7 +1173,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int case VIDIOC_STREAMON: { int *type = arg; DEB_D(("VIDIOC_STREAMON, type:%d\n",*type)); - + err = video_begin(fh); if( 0 != err) { return err; @@ -1223,9 +1223,9 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int int i; /* fixme: number of capture buffers and sizes for v4l apps */ - int gbuffers = 2; + int gbuffers = 2; int gbufsize = 768*576*4; - + DEB_D(("VIDIOCGMBUF \n")); q = &fh->video_q; @@ -1236,7 +1236,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int #else err = videobuf_mmap_setup(q,gbuffers,gbufsize, V4L2_MEMORY_MMAP); -#endif +#endif if (err < 0) { up(&q->lock); return err; @@ -1267,7 +1267,7 @@ static int buffer_activate (struct saa7146_dev *dev, buf->vb.state = STATE_ACTIVE; saa7146_set_capture(dev,buf,next); - + mod_timer(&vv->video_q.timeout, jiffies+BUFFER_TIMEOUT); return 0; } @@ -1302,7 +1302,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e DEB_D(("size mismatch.\n")); return -EINVAL; } - + DEB_CAP(("buffer_prepare [size=%dx%d,bytes=%d,fields=%s]\n", fh->video_fmt.width,fh->video_fmt.height,size,v4l2_field_names[fh->video_fmt.field])); if (buf->vb.width != fh->video_fmt.width || @@ -1317,7 +1317,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e if (STATE_NEEDS_INIT == buf->vb.state) { struct saa7146_format *sfmt; - + buf->vb.bytesperline = fh->video_fmt.bytesperline; buf->vb.width = fh->video_fmt.width; buf->vb.height = fh->video_fmt.height; @@ -1325,9 +1325,9 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e buf->vb.field = field; buf->fmt = &fh->video_fmt; buf->vb.field = fh->video_fmt.field; - + sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); - + if( 0 != IS_PLANAR(sfmt->trans)) { saa7146_pgtable_free(dev->pci, &buf->pt[0]); saa7146_pgtable_free(dev->pci, &buf->pt[1]); @@ -1340,7 +1340,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e saa7146_pgtable_free(dev->pci, &buf->pt[0]); saa7146_pgtable_alloc(dev->pci, &buf->pt[0]); } - + err = videobuf_iolock(dev->pci,&buf->vb, &vv->ov_fb); if (err) goto oops; @@ -1379,7 +1379,7 @@ static int buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned if( (*count * *size) > (max_memory*1048576) ) { *count = (max_memory*1048576) / *size; } - + DEB_CAP(("%d buffers, %d bytes each.\n",*count,*size)); return 0; @@ -1397,7 +1397,7 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; struct saa7146_buf *buf = (struct saa7146_buf *)vb; - + DEB_CAP(("vbuf:%p\n",vb)); saa7146_buffer_queue(fh->dev,&vv->video_q,buf); } @@ -1413,7 +1413,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) struct saa7146_fh *fh = file->private_data; struct saa7146_dev *dev = fh->dev; struct saa7146_buf *buf = (struct saa7146_buf *)vb; - + DEB_CAP(("vbuf:%p\n",vb)); saa7146_dma_free(dev,buf); } @@ -1480,13 +1480,13 @@ static void video_close(struct saa7146_dev *dev, struct file *file) struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data; struct saa7146_vv *vv = dev->vv_data; int err; - + if (IS_CAPTURE_ACTIVE(fh) != 0) { - err = video_end(fh, file); + err = video_end(fh, file); } else if (IS_OVERLAY_ACTIVE(fh) != 0) { err = saa7146_stop_preview(fh); } - + /* hmm, why is this function declared void? */ /* return err */ } @@ -1496,7 +1496,7 @@ static void video_irq_done(struct saa7146_dev *dev, unsigned long st) { struct saa7146_vv *vv = dev->vv_data; struct saa7146_dmaqueue *q = &vv->video_q; - + spin_lock(&dev->slock); DEB_CAP(("called.\n")); @@ -1515,7 +1515,7 @@ static ssize_t video_read(struct file *file, char __user *data, size_t count, lo struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; ssize_t ret = 0; - + DEB_EE(("called.\n")); if ((vv->video_status & STATUS_CAPTURE) != 0) { |